蚂蚁金服总监杨冰：金融科技公司为什么要拥抱开源？

# 蚂蚁金服总监杨冰：金融科技公司为什么要拥抱开源？

### 引言

最近，我听到了一个消息，蚂蚁金服将会开源 SOFA最核心的两个组件——**分布式事务框架和服务注册中心**。

熟悉中间件的朋友们都知道，这两个组件都是针对当前最火的微服务架构。其中，分布式事物框架是解决数据一致性问题的关键。服务注册中心则是服务治理的基础。在这两块开源后，**SOFA 将成为一套真正完备的分布式解决方案**。

作为开源人士，我对此消息深感兴趣，因此联系到了蚂蚁金服中间件团队的杨冰总监，就此消息向他求证。机缘凑巧之下，杨冰花费了宝贵的时间，和我深入讲述了 SOFA 开源的思考，以及近期的规划。

通过这次交谈，也让我看到了**一个成功的商业公司是如何拥抱开源、并将开源作为其根本战略来撬动技术红利，支持其急速发展的业务需求的**。

以下是正文，我将它分享出来以飨读者。

---

如今，开源已经成为主流，可以说，整个信息产业已经从过去的闭源模式转换为现今的开源模式。各种开源公司纷纷创新不同的开源模式，其中以 RedHat、Google、Facebook 等公司所取得的成绩最为耀眼。2018 年的时候，我曾经参与“开源社”主持的《[2018 中国开源年度报告](/article-10138-1.html)》的撰写工作，并建立了一个数学分析模型，以此来对中国的互联网公司的开源项目分析其活跃度和健康度。让我既感意外，也不意外的是，**阿里系的开源项目占据了活跃度排行榜前五的第一、第二和第四**；甚至在前五十个项目中，阿里系的开源项目占据了超过一半的份额！我不意外的是，业界一直对阿里在开源方面的动作和力度颇有感受；意外的是，这种力度还是超乎了我的想象。这其中包括阿里巴巴集团和蚂蚁金服等都贡献了相当可观的开源项目。

因此，这次遇到杨冰时，我就开源方面和他深入聊了几句，想了解一下**蚂蚁金服是如何思考开源和践行开源的，是如何将开源与公司的商业价值有机地结合起来的**。

### 缘何开源

作为一家商业公司，宣称自己开源，甚至也形式上开源一些代码，其实已经是很常见的事情了。但是，真正能将开源与公司的技术演进相融合，并能有效地助推公司业务发展的，却并不太多。这件事其实并没有那么简单——远非只是上传到 GitHub 那么简单。

根据业界的经验，在公司的技术产品开源方面，要将现有场景的代码开源，至少需要在已经运行稳定、结构清晰的现有代码基础上多付出 30% 的技术投入，对代码进行梳理、完善和通用化，才能做到初步的代码开源；而进一步要将这些开源代码维护下去，乃至于和公司业务线上的产品代码保持同步发展，多付出的技术成本还远远不止这些。作为一个互联网技术老兵，我对此深以为然。

那么，蚂蚁金服是如何说服公司决策层在尚未看到开源回报的前景下，同意付出这么多的额外代价来支持开源的呢？推动开源的力量是因何而来的？

“首先，**开源是个共赢的模式**，对于蚂蚁金服来说，开源可以扩大技术服务场景，为支付、金融等更多的客户提供服务，提升合作伙伴的效率。”杨冰说，“虽然，蚂蚁金服已经有很多的业务场景，也在很多场景下取得了超大规模的实践经验，但是，依然存在没有覆盖到的金融服务场景。而将技术开源出来，可以供更多的客户应用到其自身的场景下——这些场景有效的补充了蚂蚁金服的技术应用面，也为更完善的技术框架奠定了基础。因此，**我们选择将 SOFA 中间件框架逐步开源出来，在贡献给社区的同时，也期待社区、合作伙伴甚至客户，都能够一起参与共建，形成行业标准和最佳实践。**”

“其次，对金融服务来说，监管和自主可控的要求更多，”杨冰接着谈到，“客户也希望可以对其所采用的技术有更多的掌控。”开源是一种可以使客户和上下游产业共同参与和发展的可行模式。

“所以，其实并不是技术部门去说服公司决策层去开源，而是业务发展的自然选择，这也是一种合理的发展方向。”他总结道。这样的结果，其实是和当前流行的开源商业模式所暗合的。

“另外，如你所说，确实在开源时，我们做了很大的改造。以可扩展化的方式来层层构建 SOFA 框架的能力，保证 SOFA 的内部版本和开源的版本采用的是同一个内核。在开源时，剥离了特定业务的逻辑，而保持了公司内部的业务线上的代码和开源代码的核心是一致的。这样，只要公司的业务在持续发展，开源的代码就会一直维护和演进下去。所以 SOFA 的内部版本就是在开源版本之上扩展了内部逻辑和历史版本的兼容逻辑。开源版本的核心逻辑，内外是一致的，并在蚂蚁金服的生产环境中被广泛使用，同时会随着蚂蚁金服自身业务诉求的驱动不断的演进。”杨冰补充道，“但这是值得的，**在为开源代码做改进时，也是为公司自己的业务做改进，这是双赢且可持续发展的**。”

很多公司在初涉开源时，常常有疑虑，将核心技术开放出去，会不会导致竞争对手的技术提升，会不会造成更大的技术竞争压力？

“事实上，我们在最初准备开源时，也有讨论过这个方面。技术要被更多人用、更多场景用，才会有发展。而开放的技术才能带来团队的发展，因为技术是动态发展的，作为开源的一方，事实上在技术上是相对领先的。开源和掌握是两码事，掌握和用好又是两码事，所以，因开源而带来的竞争，其实是助推整个开源体系的发展的，是良性的、有益的。”杨冰说，“而从社区和行业现状看，大家都在开放，封闭的技术体系会逐渐落后。**只有开放才能求同存异，共同发展**。”

>
> **花絮**
>
>
> 我问蚂蚁金服的朋友，在你们开源中有什么有趣的“段子”吗？可以讲来听听。
>
>
> 我朋友过了几天后，给我发来了这样一段文字：
>
>
> “参与双十一的中间件团队的常态是什么呢？
>
>
> 当晚，团队的常态大概就是喝着茶等零点高峰，高峰期过了之后，当然就是参与买买买啦。
>
>
> 我们很多的一些事情的初始的想法都是来自于双十一当天的夜聊，似乎在经历了紧张的零点高峰之后，脑细胞特别活跃。
>
>
> 对于基础设施团队来说，双十一算是一次大考的结束，考完成绩出来了，我们就想琢磨一些有挑战的事情，于是我们会天马行空地聊一聊对于下一年在技术上需要去做的事情。而在 2017 年的双十一当天，SOFA 的几个同学就围在一起聊了 SOFA 能不能开源？为什么要开源？开源和商业化之间的关系？开源后要做哪些事情等等，这个算是 SOFA 开源的第一次内部讨论。
>
>
> 从这次内部讨论之后，经过了大约半年的准备时间，我们在 2018 年 4 月份正式宣布开源并一直在逐步开源的进程中。”
>
>
> 他说，这就是他们憋了半天想出来的“段子”，哈哈哈，这群可爱的技术人啊。
>
>
>

### SOFA 的演进和开源之路

SOFA 中间件框架是蚂蚁金服自主研发的金融级分布式中间件，包含了构建金融级云原生架构所需的各个组件，是一套分布式架构的完整的解决方案，也是在金融场景里锤炼出来的最佳实践。

*SOFA开源全景图，涵盖了微服务领域的各个方面，同时也积极和业界流行的开源组件结合，包括阿里巴巴集团开源的Nacos、Sentinel等，为用户提供更加广泛地选择。*

SOFA 作为一个演进了几年的框架，也一定程度上代表了蚂蚁金服的技术体系的演变，并且现在形成了开源核心、开放式（组件式）开源的模式。SOFA 从 2018 年开始开源，但是我比较好奇 SOFA 开源之前的发展旅程是怎样的。

杨冰说，“最早的时候，在蚂蚁金服还没有从淘宝分拆出来时，公司内使用过一个名为 Webx 的框架，但是随着业务的发展和技术的演讲，这套框架已经不太适应淘宝的需求。那个时候胡喜（现蚂蚁金服副 CTO）就重新创建了一个新的框架——SOFA 中间件框架。”

SOFA 中间件在蚂蚁内部经历了十年的发展和五代架构的演进，被广泛应用在包括支付、借贷、信用、基金、保险等全金融场景，支撑着蚂蚁平稳度过历次双十一、双十二、新春红包等大考，创造了 25.6 万笔每秒的交易记录，并还在不断刷新这个记录。

“SOFA 的版本迭代和公司的架构发展是密切相关的。比如说我们从 SOFA1 刚刚开始的时候，会做模块化的事情。到了 SOFA2 开始引入整个微服务的体系。到 SOFA3 我们希望能够在微服务体系下，能够把一些服务聚合在一起，组成一个链路出来，这就是我们说的合并部署。”

“随着每年的交易量的不断上升，让我们必须从单体架构转到服务化架构，然后演进到单元化架构、弹性架构。SOFA 大部分的功能升级都是伴随着整个公司的技术架构目标上的更大挑战进行的。”杨冰说，“我个人是经历了 SOFA1 到 SOFA2 开发过程，从 SOFA1 整体完成落地，到 SOFA2 引入了服务的架构。到了 SOFA3 我们把 Tomcat JBoss 那层替换掉，变成自研的应用服务器，解决了我们内部系统做类隔离、模块隔离以及合并部署的问题。”

### SOFA4：迈入开源

正如前面所谈到的，开源既有的代码是需要做许多繁重的工作的，所以， SOFA 直到发展到第四代才为开源做好了准备，并将开源作为 SOFA4 的核心目标。

“SOFA 发展了这么多年，是有非常重的历史包袱的，这也是我们为开源准备了非常长时间的原因。在从 SOFA3 到 SOFA4 的整个过程当中，在把整个 SOFA 做轻量化的过程当中，其实就是在为开源做准备。有一些公用的能力（和蚂蚁金服的整个架构或业务没有强相关的部分）我们都希望可以开源出来。我们**做开源这件事情不会把我们代码分为完全两套东西，然后两个分别演进，我们觉得这不是开源的正确做法**。”杨冰说，“另外，开源对我们整个团队的消耗是非常大的，我们希望用同一套代码来实现内部的兼容和外部的开源，我们会在开源的代码当中留一些比较好的扩展点，这也是对我们本身代码架构可扩展性的挑战，目前我们做到的程度就是这样的。”

SOFA 从 2018 年 4 月开始对外开源，得益于社区和开发者的认同，在经历了半年多的时间，SOFA 所有相关的开源代码，获得了**累计 10000+ 的 Star和 80 多个代码贡献者**。

在线上社区方面，SOFA 开源的站点（**https://www.sofastack.tech/**）也是在不断沉淀相关的文章和文档。

杨冰说，“原先我们觉得开源就是最好的，然而在 SOFA 演进的过程中，我们发现我们的场景足以构建出来比开源软件复杂度更高、能力更强的体系。我自己也在参与这个的过程当中收获了很多。这件事情也是从一个侧面反映了蚂蚁金服技术演进的历程。我们从最早的 IOE 架构，到部分采用开源软件，再到逐步开始全套自研。**在自研过程当中，拥抱部分开源软件，并且去做深度的创造，做一些自己的创新。整个过程其实是一条非常艰难的路**。”

杨冰说，“**我认为整个基础设施是应该走开源化道路的**，因为从 Linux 到 Kubernetes，已经被一次又一次地证明。越底层的基础代码，包括 SOFA 中间件这样的东西，看起来逻辑没有业务系统那么复杂，然而其实它考虑的一些细节、设计的优雅性、架构的健壮性其实是非常强的。而且，它一旦要去支撑那么多业务系统，整个工程的复杂度也是非常高的，很难用一家公司的程序员去搞定整个技术栈。SOFA 也是一样的，我们越来越发现这方面的一些趋势。我们靠一己之力去做是很难的，再加上我们既要对内支撑又要对外支持。现在明白了这样一个趋势，因此我觉得应该回馈社区，和社区共建才是比较好的一条路。以 Linux 为代表的疯狂发展，以及伴随着而来的商业化生态的繁荣，是一次又一次向世界证明，开源和商业化的结合是可以非常完美的。”

### SOFA5：拥抱 Service Mesh

从多年前的 SOA 架构，到现在的容器化、微服务的技术演变，我们可以看到虽然技术在逐步变化，但是其主体指导思想还是一脉相承的。蚂蚁金服在微服务方面已经走到了探索的前沿，那么，当前的 Service Mesh 技术在 SOFA 的发展过程中会起到什么作用？

“这两年我们在积极拥抱、布局 Mesh，在演进方向上，**我个人比较关注 Mesh 这个方向，因为我个人认为这是把基础设施沉淀到我们整个技术平台当中非常关键的一环**。这也是我们 SOFA5 的主要目标。”杨冰说，“随着容器技术的兴起，可以将以往的中间件组件拆分的更细、更灵动，而资源利用率和运维效率也得到了进一步的改善。”

近年来，随着 Kubernetes 确立了其在容器领域的统治地位，以及Serverless 模式等不可变基础设施的架构进一步成熟，可以将服务在上层进一步进行抽象，为现在大规模的容器化、微服务化奠定了坚实的基础。

也有一些业界的意见认为，Service Mesh 将会取代中间件。

杨冰认为，“蚂蚁金服已经在中间件方面探索的比较深远，规模也相当的大，为拿到业务红利做了很多优化，这些能力还是会存在，只是通过换了一种跟应用集成的方式，让 SDK 变得更轻。随着基础技术平台逐步走向云化，我们认为 ServiceMesh 将会是连接现在这个时代和云原生时代的桥梁，而且无论中间件还是很多基础技术组件都将走向 Serverless。Serverless 对开发者而言将是一种全新编程模型，对运维人员而言则是颠覆性的运维模式，甚至是一种 Opsless，我相信广义的 Serverless 模式会成为云原生时代的主角。”

Service Mesh 这个新兴领域是很大的一个热点。蚂蚁金服和社区一起共同发起了 **<http://www.servicemesher.com/>** 这样一个针对中国的Service Mesh 领域开发者的社群，有很多的志愿者，蚂蚁金服是其中之一。

在蚂蚁金服的Service Mesh领域，涉及两个开源项目SOFAMesh和SOFAMosn。这两个项目的定位是这样：

* **SOFAMesh 项目**：是蚂蚁金服 Service Mesh 的控制平面，分支自 Istio 项目。在Istio体系和框架内进行了功能补充、扩展、增强和改进，立足于探索并解决 Istio 生产落地，尤其是大规模落地中遇到的实际问题，在充分验证之后贡献回 Istio 上游。
* **SOFAMosn 项目**：蚂蚁金服新型的基础设施和中间件的底层网络通用解决方案，可以有多种产品形态。在蚂蚁金服 Service Mesh 中承担数据平面的角色，和 SOFAMesh 项目配合使用，兼容 Istio 体系。此外 SOFAMosn 还将用于 Ingress / API Gateway / Serverless Function Gateway 等场景。

目前蚂蚁金服开发团队已经和 Istio 开发团队建立联系，在 Istio 大规模落地方面进行合作和探索，相关实践和创新会在生产验证/代码稳定之后会贡献出来。

Service Mesh 是一个非常新的技术，Istio 也是一个新兴的项目，在生产落地上存在很多需要了解的细节和可能遇到的各种问题。而且有些需求是有共性的，如 RPC 协议的支持，旧有非微服务应用的支持, 现有应用升级 Istio 的平滑迁移等。

 “我们开源 SOFAMesh 和 SOFAMosn，一方面是希望可以将我们在 Service Mesh 和 Istio 落地的知识和经验分享出去看，另一方面希望通过开源共建的方式一起来将这个两个项目做的更完善。”杨冰说，“我们虽然现在开源出来的版本还不多，但是未来我们会把整个金融分布式云原生架构的领域补齐，一方面会把内部同领域产品更完整的开放出来，另一方面和每一个领域的社区实现都做到兼容和可互相集成。”

### NEXT：分布式事务以及服务注册中心开源

蚂蚁在 2007 年就开始在核心的业务中去使用自研的分布式事务框架去解决服务化以及数据库拆分后的数据一致性问题，经过 10 多年的演进，SOFA 的分布式事务框架得到了蚂蚁内部业务广泛地使用与锻炼，包括蚂蚁金服最核心的交易、支付、账务系统等，在期间，SOFA 分布式事务框架也演化出了针对不用的业务场景的使用模式，兼顾研发效率与性能。而阿里巴巴前几个月也开源了其分布式事务框架 Fescar，**蚂蚁金服和阿里巴巴将在分布式事务这个领域上强强联手，SOFA 的分布式事务框架将与 Fescar 合并，为业界提供更加优秀，更加全面的开源分布式事务解决方案**。

服务注册中心是微服务领域的重要组成部分，SOFA 的服务注册中心最早源自于淘宝的初版 ConfigServer，在支付宝/蚂蚁金服的业务发展驱动下，近十年间已经演进至第五代，具备无限水平扩展，高效的推送以及基于 AP 架构高可用能力，同时结合 SOFARPC 具备异地多活单元化架构支撑能力，SOFA 服务注册中心的开源将会极大丰富整个 SOFA 开源的生态体系，也为微服务领域带来一个全新的服务发现解决方案。

### 总结

纵观蚂蚁金服的 SOFA 中间件开源的历程，我们看到了**一个大型的商业公司是如何将开源核心模式和其商业模式紧密结合的；其走过的从采用专有软件、应用部分开源软件、演化自身的自研软件，到开源核心软件、全面拥抱开源世界的路径值得很多技术企业学习和思考**。

>
>
>
>
> “穿山甲专访”栏目是 Linux 中国社区推出的面向开源界、互联网技术圈的重要领军人物的系列采访，将为大家介绍中国开源领域中一些积极推动开源，谙熟开源思想的技术人，并辨析其思考、挖掘其动因，揭示其背后所发生的事情，为关注开源、有志于开源的企业和技术人标出一条路径。
>
>
> 取名为“穿山甲”寓意有二：取穿山甲挖掘、深入之意来象征技术进步和表征技术领袖的作用；穿山甲是珍稀保护动物，宣传公益。
>
>
>


在 Linux 上创建文件的 10 个方法

# 在 Linux 上创建文件的 10 个方法

<img src="content_image/album_201902_18_213642daqaqlc488z8kq45.jpg" alt="" title="">

我们都知道，在 Linux 上，包括设备在内的一切都是文件。Linux 管理员每天应该会多次执行文件创建活动（可能是 20 次，50 次，甚至是更多，这依赖于他们的环境）。如果你想 [在Linux上创建一个特定大小的文件](https://www.2daygeek.com/create-a-file-in-specific-certain-size-linux/)，查看前面的这个链接。

高效创建一个文件是非常重要的能力。为什么我说高效？如果你了解一些高效进行你当前活动的方式，你就可以事半功倍。这将会节省你很多的时间。你可以把这些有用的时间用到到其他重要的事情上。

我下面将会介绍多个在 Linux 上创建文件的方法。我建议你选择几个简单高效的来辅助你的工作。你不必安装下列的任何一个命令，因为它们已经作为 Linux 核心工具的一部分安装到你的系统上了。

创建文件可以通过以下六个方式来完成。

* `>`：标准重定向符允许我们创建一个 0KB 的空文件。
* `touch`：如果文件不存在的话，`touch` 命令将会创建一个 0KB 的空文件。
* `echo`：通过一个参数显示文本的某行。
* `printf`：用于显示在终端给定的文本。
* `cat`：它串联并打印文件到标准输出。
* `vi`/`vim`：Vim 是一个向上兼容 Vi 的文本编辑器。它常用于编辑各种类型的纯文本。
* `nano`：是一个简小且用户友好的编辑器。它复制了 `pico` 的外观和优点，但它是自由软件。
* `head`：用于打印一个文件开头的一部分。
* `tail`：用于打印一个文件的最后一部分。
* `truncate`：用于缩小或者扩展文件的尺寸到指定大小。

### 在 Linux 上使用重定向符（>）创建一个文件

标准重定向符允许我们创建一个 0KB 的空文件。它通常用于重定向一个命令的输出到一个新文件中。在没有命令的情况下使用重定向符号时，它会创建一个文件。

但是它不允许你在创建文件时向其中输入任何文本。然而它对于不是很勤劳的管理员是非常简单有用的。只需要输入重定向符后面跟着你想要的文件名。

```
$ > daygeek.txt
```

使用 `ls` 命令查看刚刚创建的文件。

```
$ ls -lh daygeek.txt
-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:00 daygeek.txt
```

### 在 Linux 上使用 touch 命令创建一个文件

`touch` 命令常用于将每个文件的访问和修改时间更新为当前时间。

如果指定的文件名不存在，将会创建一个新的文件。`touch` 不允许我们在创建文件的同时向其中输入一些文本。它默认创建一个 0KB 的空文件。

```
$ touch daygeek1.txt
```

使用 `ls` 命令查看刚刚创建的文件。

```
$ ls -lh daygeek1.txt
-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:02 daygeek1.txt
```

### 在 Linux 上使用 echo 命令创建一个文件

`echo` 内置于大多数的操作系统中。它常用于脚本、批处理文件，以及作为插入文本的单个命令的一部分。

它允许你在创建一个文件时就向其中输入一些文本。当然也允许你在之后向其中输入一些文本。

```
$ echo "2daygeek.com is a best Linux blog to learn Linux" > daygeek2.txt
```

使用 `ls` 命令查看刚刚创建的文件。

```
$ ls -lh daygeek2.txt
-rw-rw-r-- 1 daygeek daygeek 49 Feb 4 02:04 daygeek2.txt
```

可以使用 `cat` 命令查看文件的内容。

```
$ cat daygeek2.txt
2daygeek.com is a best Linux blog to learn Linux
```

你可以使用两个重定向符 (`>>`) 添加其他内容到同一个文件。

```
$ echo "It's FIVE years old blog" >> daygeek2.txt
```

你可以使用 `cat` 命令查看添加的内容。

```
$ cat daygeek2.txt
2daygeek.com is a best Linux blog to learn Linux
It's FIVE years old blog
```

### 在 Linux 上使用 printf 命令创建一个新的文件

`printf` 命令也可以以类似 `echo` 的方式执行。

`printf` 命令常用来显示在终端窗口给出的字符串。`printf` 可以有格式说明符、转义序列或普通字符。

```
$ printf "2daygeek.com is a best Linux blog to learn Linux\n" > daygeek3.txt
```

使用 `ls` 命令查看刚刚创建的文件。

```
$ ls -lh daygeek3.txt
-rw-rw-r-- 1 daygeek daygeek 48 Feb 4 02:12 daygeek3.txt
```

使用 `cat` 命令查看文件的内容。

```
$ cat daygeek3.txt
2daygeek.com is a best Linux blog to learn Linux
```

你可以使用两个重定向符 (`>>`) 添加其他的内容到同一个文件中去。

```
$ printf "It's FIVE years old blog\n" >> daygeek3.txt
```

你可以使用 `cat` 命令查看这个文件中添加的内容。

```
$ cat daygeek3.txt
2daygeek.com is a best Linux blog to learn Linux
It's FIVE years old blog
```

### 在 Linux 中使用 cat 创建一个文件

`cat` 表示<ruby> 串联 <rt>  concatenate </rt></ruby>。在 Linux 经常用于读取一个文件中的数据。

`cat` 是在类 Unix 系统中最常使用的命令之一。它提供了三个与文本文件相关的功能：显示一个文件的内容、组合多个文件的内容到一个输出以及创建一个新的文件。（LCTT 译注：如果 `cat` 命令后如果不带任何文件的话，下面的命令在回车后也不会立刻结束，回车后的操作可以按 `Ctrl-C` 或 `Ctrl-D` 来结束。）

```
$ cat > daygeek4.txt
2daygeek.com is a best Linux blog to learn Linux
It's FIVE years old blog
```

使用 `ls` 命令查看创建的文件。

```
$ ls -lh daygeek4.txt
-rw-rw-r-- 1 daygeek daygeek 74 Feb 4 02:18 daygeek4.txt
```

使用 `cat` 命令查看文件的内容。

```
$ cat daygeek4.txt
2daygeek.com is a best Linux blog to learn Linux
It's FIVE years old blog
```

如果你想向同一个文件中添加其他内容，使用两个连接的重定向符（`>>`）。

```
$ cat >> daygeek4.txt
This website is maintained by Magesh M, It's licensed under CC BY-NC 4.0.
```

你可以使用 `cat` 命令查看添加的内容。

```
$ cat daygeek4.txt
2daygeek.com is a best Linux blog to learn Linux
It's FIVE years old blog
This website is maintained by Magesh M, It's licensed under CC BY-NC 4.0.
```

### 在 Linux 上使用 vi/vim 命令创建一个文件

`vim` 是一个向上兼容 `vi` 的文本编辑器。它通常用来编辑所有种类的纯文本。在编辑程序时特别有用。

`vim` 中有很多功能可以用于编辑单个文件。

```
$ vi daygeek5.txt

2daygeek.com is a best Linux blog to learn Linux
It's FIVE years old blog
```

使用 `ls` 查看刚才创建的文件。

```
$ ls -lh daygeek5.txt
-rw-rw-r-- 1 daygeek daygeek 75 Feb 4 02:23 daygeek5.txt
```

使用 `cat` 命令查看文件的内容。

```
$ cat daygeek5.txt
2daygeek.com is a best Linux blog to learn Linux
It's FIVE years old blog
```

### 在 Linux 上使用 nano 命令创建一个文件

`nano` 是一个编辑器，它是一个自由版本的 `pico` 克隆。`nano` 是一个小且用户友好的编辑器。它复制了 `pico` 的外观及优点，并且是一个自由软件，它添加了 `pico` 缺乏的一系列特性，像是打开多个文件、逐行滚动、撤销/重做、语法高亮、行号等等。

```
$ nano daygeek6.txt

2daygeek.com is a best Linux blog to learn Linux
It's FIVE years old blog
This website is maintained by Magesh M, It's licensed under CC BY-NC 4.0.
```

使用 `ls` 命令查看创建的文件。

```
$ ls -lh daygeek6.txt
-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:26 daygeek6.txt
```

使用 `cat` 命令来查看一个文件的内容。

```
$ cat daygeek6.txt
2daygeek.com is a best Linux blog to learn Linux
It's FIVE years old blog
This website is maintained by Magesh M, It's licensed under CC BY-NC 4.0.
```

### 在 Linux 上使用 head 命令创建一个文件

`head` 命令通常用于输出一个文件开头的一部分。它默认会打印一个文件的开头 10 行到标准输出。如果有多个文件，则每个文件前都会有一个标题，用来表示文件名。

```
$ head -c 0K /dev/zero > daygeek7.txt
```

使用 `ls` 命令查看创建的文件。

```
$ ls -lh daygeek7.txt
-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:30 daygeek7.txt
```

### 在 Linux 上使用 tail 创建一个文件

`tail` 命令通常用来输出一个文件最后的一部分。它默认会打印每个文件的最后 10 行到标准输出。如果有多个文件，则每个文件前都会有一个标题，用来表示文件名。

```
$ tail -c 0K /dev/zero > daygeek8.txt
```

使用 `ls` 命令查看创建的文件。

```
$ ls -lh daygeek8.txt
-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:31 daygeek8.txt
```

### 在 Linux 上使用 truncate 命令创建一个文件

`truncate` 命令通常用作将一个文件的尺寸缩小或者扩展为某个指定的尺寸。

```
$ truncate -s 0K daygeek9.txt
```

使用 `ls` 命令检查创建的文件。

```
$ ls -lh daygeek9.txt
-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:37 daygeek9.txt
```

在这篇文章中，我使用这十个命令分别创建了下面的这十个文件。

```
$ ls -lh daygeek*
-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:02 daygeek1.txt
-rw-rw-r-- 1 daygeek daygeek 74 Feb 4 02:07 daygeek2.txt
-rw-rw-r-- 1 daygeek daygeek 74 Feb 4 02:15 daygeek3.txt
-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:20 daygeek4.txt
-rw-rw-r-- 1 daygeek daygeek 75 Feb 4 02:23 daygeek5.txt
-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:26 daygeek6.txt
-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:32 daygeek7.txt
-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:32 daygeek8.txt
-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:38 daygeek9.txt
-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:00 daygeek.txt
```

---

via: <https://www.2daygeek.com/linux-command-to-create-a-file/>

作者：[Vinoth Kumar](https://www.2daygeek.com/author/vinoth/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[dianbanjiu](https://github.com/dianbanjiu) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 VirtualBox 上安装 Kali Linux 的最安全快捷的方式

# 在 VirtualBox 上安装 Kali Linux 的最安全快捷的方式

>
> 本教程将向你展示如何以最快的方式在运行于 Windows 和 Linux 上的 VirtualBox 上安装 Kali Linux。
>
>
>

[Kali Linux](https://www.kali.org/) 是最好的[黑客](https://itsfoss.com/linux-hacking-penetration-testing/) 和安全爱好者的 Linux 发行版之一。

由于它涉及像黑客这样的敏感话题，它就像一把双刃剑。我们过去在一篇详细的 [Kali Linux 点评](/article-10198-1.html)中对此进行了讨论，所以我不会再次赘述。

虽然你可以通过替换现有的操作系统来安装 Kali Linux，但通过虚拟机使用它将是一个更好、更安全的选择。

使用 Virtual Box，你可以将 Kali Linux 当做 Windows / Linux 系统中的常规应用程序一样，几乎就和在系统中运行 VLC 或游戏一样简单。

在虚拟机中使用 Kali Linux 也是安全的。无论你在 Kali Linux 中做什么都不会影响你的“宿主机系统”（即你原来的 Windows 或 Linux 操作系统）。你的实际操作系统将不会受到影响，宿主机系统中的数据将是安全的。

### 如何在 VirtualBox 上安装 Kali Linux

我将在这里使用 [VirtualBox](https://www.virtualbox.org/)。它是一个很棒的开源虚拟化解决方案，适用于任何人（无论是专业或个人用途）。它可以免费使用。

在本教程中，我们将特指 Kali Linux 的安装，但你几乎可以安装任何其他已有 ISO 文件的操作系统或预先构建好的虚拟机存储文件。

**注意：**这些相同的步骤适用于运行在 Windows / Linux 上的 VirtualBox。

正如我已经提到的，你可以安装 Windows 或 Linux 作为宿主机。但是，在本文中，我安装了 Windows 10（不要讨厌我！），我会尝试在 VirtualBox 中逐步安装 Kali Linux。

而且，最好的是，即使你碰巧使用 Linux 发行版作为主要操作系统，相同的步骤也完全适用！

想知道怎么样做吗？让我们来看看…

### 在 VirtualBox 上安装 Kali Linux 的逐步指导

我们将使用专为 VirtualBox 制作的定制 Kali Linux 镜像。当然，你还可以下载 Kali Linux 的 ISO 文件并创建一个新的虚拟机，但是为什么在你有一个简单的替代方案时还要这样做呢？

#### 1、下载并安装 VirtualBox

你需要做的第一件事是从 Oracle 官方网站下载并安装 VirtualBox。

* [下载 VirtualBox](https://www.virtualbox.org/wiki/Downloads)

下载了安装程序后，只需双击它即可安装 VirtualBox。在 Ubuntu / Fedora Linux 上安装 VirtualBox 也是一样的。

#### 2、下载就绪的 Kali Linux 虚拟镜像

VirtualBox 成功安装后，前往 [Offensive Security 的下载页面](https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download/) 下载用于 VirtualBox 的虚拟机镜像。如果你改变主意想使用 [VMware](https://itsfoss.com/install-vmware-player-ubuntu-1310/)，也有用于它的。

如你所见，文件大小远远超过 3 GB，你应该使用 torrent 方式或使用 [下载管理器](https://itsfoss.com/4-best-download-managers-for-linux/) 下载它。

#### 3、在 VirtualBox 上安装 Kali Linux

一旦安装了 VirtualBox 并下载了 Kali Linux 镜像，你只需将其导入 VirtualBox 即可使其正常工作。

以下是如何导入 Kali Linux 的 VirtualBox 镜像：

**步骤 1**：启动 VirtualBox。你会注意到有一个 “Import” 按钮，点击它。

*点击 “Import” 按钮*

**步骤 2**：接着，浏览找到你刚刚下载的文件并选择它导入（如你在下图所见）。文件名应该以 “kali linux” 开头，并以 “.ova” 扩展名结束。

*导入 Kali Linux 镜像*

选择好之后，点击 “Next” 进行处理。

**步骤 3**：现在，你将看到要导入的这个虚拟机的设置。你可以自定义它们，这是你的自由。如果你想使用默认设置，也没关系。

你需要选择具有足够存储空间的路径。我永远不会在 Windows 上推荐使用 C：驱动器。

*以 VDI 方式导入硬盘驱动器*

这里，VDI 方式的硬盘驱动器是指通过分配其存储空间设置来实际挂载该硬盘驱动器。

完成设置后，点击 “Import” 并等待一段时间。

**步骤 4**：你现在将看到这个虚拟机已经列出了。所以，只需点击 “Start” 即可启动它。

你最初可能会因 USB 端口 2.0 控制器支持而出现错误，你可以将其禁用以解决此问题，或者只需按照屏幕上的说明安装其他软件包进行修复即可。现在就完成了！

*运行于 VirtualBox 中的 Kali Linux*

我希望本指南可以帮助你在 VirtualBox 上轻松安装 Kali Linux。当然，Kali Linux 有很多有用的工具可用于渗透测试 —— 祝你好运！

**提示**：Kali Linux 和 Ubuntu 都是基于 Debian 的。如果你在使用 Kali Linux 时遇到任何问题或错误，可以按照互联网上针对 Ubuntu 或 Debian 的教程进行操作。

### 赠品：免费的 Kali Linux 指南手册

如果你刚刚开始使用 Kali Linux，那么了解如何使用 Kali Linux 是一个好主意。

Kali Linux 背后的公司 Offensive Security 已经创建了一本指南，介绍了 Linux 的基础知识，Kali Linux 的基础知识、配置和设置。它还有一些关于渗透测试和安全工具的章节。

基本上，它拥有你开始使用 Kali Linux 时所需知道的一切。最棒的是这本书可以免费下载。

* [免费下载 Kali Linux 揭秘](https://kali.training/downloads/Kali-Linux-Revealed-1st-edition.pdf)

如果你遇到问题或想分享在 VirtualBox 上运行 Kali Linux 的经验，请在下面的评论中告诉我们。

---

via: <https://itsfoss.com/install-kali-linux-virtualbox>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


计算机实验室之树莓派：课程 7 屏幕02

# 计算机实验室之树莓派：课程 7 屏幕02

屏幕02 课程在屏幕01 的基础上构建，它教你如何绘制线和一个生成伪随机数的小特性。假设你已经有了 [课程 6：屏幕01](/article-10540-1.html) 的操作系统代码，我们将以它为基础来构建。

### 1、点

现在，我们的屏幕已经正常工作了，现在开始去创建一个更实用的图像，是水到渠成的事。如果我们能够绘制出更实用的图形那就更好了。如果我们能够在屏幕上的两点之间绘制一条线，那我们就能够组合这些线绘制出更复杂的图形了。

我们将尝试用汇编代码去实现它，但在开始时，我们确实需要使用一些其它的函数去辅助。我们需要一个这样的函数，我将调用 `SetPixel` 去修改指定像素的颜色，而在寄存器 `r0` 和 `r1` 中提供输入。如果我们写出的代码可以在任意内存中而不仅仅是屏幕上绘制图形，这将在以后非常有用，因此，我们首先需要一些控制真实绘制位置的方法。我认为实现上述目标的最好方法是，能够有一个内存片段用于保存将要绘制的图形。我应该最终得到的是一个存储地址，它通常指向到自上次的帧缓存结构上。我们将一直在我们的代码中使用这个绘制方法。这样，如果我们想在我们的操作系统的另一部分绘制一个不同的图像，我们就可以生成一个不同结构的地址值，而使用的是完全相同的代码。为简单起见，我们将使用另一个数据片段去控制我们绘制的颜色。

>
> 为了绘制出更复杂的图形，一些方法使用一个着色函数而不是一个颜色去绘制。每个点都能够调用着色函数来确定在那里用什么颜色去绘制。
>
>
>

复制下列代码到一个名为 `drawing.s` 的新文件中。

```
.section .data
.align 1
foreColour:
.hword 0xFFFF

.align 2
graphicsAddress:
.int 0

.section .text
.globl SetForeColour
SetForeColour:
cmp r0,#0x10000
movhs pc,lr
ldr r1,=foreColour
strh r0,[r1]
mov pc,lr

.globl SetGraphicsAddress
SetGraphicsAddress:
ldr r1,=graphicsAddress
str r0,[r1]
mov pc,lr
```

这段代码就是我上面所说的一对函数以及它们的数据。我们将在 `main.s` 中使用它们，在绘制图像之前去控制在何处绘制什么内容。

我们的下一个任务是去实现一个 `SetPixel` 方法。它需要带两个参数，像素的 x 和 y 轴，并且它应该要使用 `graphicsAddress` 和 `foreColour`，我们只定义精确控制在哪里绘制什么图像即可。如果你认为你能立即实现这些，那么去动手实现吧，如果不能，按照我们提供的步骤，按示例去实现它。

>
> 构建一个通用方法，比如 `SetPixel`，我们将在它之上构建另一个方法是一个很好的想法。但我们必须要确保这个方法很快，因为我们要经常使用它。
>
>
>

1. 加载 `graphicsAddress`。
2. 检查像素的 x 和 y 轴是否小于宽度和高度。
3. 计算要写入的像素地址（提示：`frameBufferAddress +（x + y * 宽度）* 像素大小`）
4. 加载 `foreColour`。
5. 保存到地址。

上述步骤实现如下：

1、加载 `graphicsAddress`。

```
.globl DrawPixel
DrawPixel:
px .req r0
py .req r1
addr .req r2
ldr addr,=graphicsAddress
ldr addr,[addr]
```

2、记住，宽度和高度被各自保存在帧缓冲偏移量的 0 和 4 处。如有必要可以参考 `frameBuffer.s`。

```
height .req r3
ldr height,[addr,#4]
sub height,#1
cmp py,height
movhi pc,lr
.unreq height

width .req r3
ldr width,[addr,#0]
sub width,#1
cmp px,width
movhi pc,lr
```

3、确实，这段代码是专用于高色值帧缓存的，因为我使用一个逻辑左移操作去计算地址。你可能希望去编写一个不需要专用的高色值帧缓冲的函数版本，记得去更新 `SetForeColour` 的代码。它实现起来可能更复杂一些。

```
ldr addr,[addr,#32]
add width,#1
mla px,py,width,px
.unreq width
.unreq py
add addr, px,lsl #1
.unreq px
```

>
> `mla dst,reg1,reg2,reg3` 将寄存器 `reg1` 和 `reg2` 中的值相乘，然后将结果与寄存器 `reg3` 中的值相加，并将结果的低 32 位保存到 `dst` 中。
>
>
>

4、这是专用于高色值的。

```
fore .req r3
ldr fore,=foreColour
ldrh fore,[fore]
```

5、这是专用于高色值的。

```
strh fore,[addr]
.unreq fore
.unreq addr
mov pc,lr
```

### 2、线

问题是，线的绘制并不是你所想像的那么简单。到目前为止，你必须认识到，编写一个操作系统时，几乎所有的事情都必须我们自己去做，绘制线条也不例外。我建议你们花点时间想想如何在任意两点之间绘制一条线。

我估计大多数的策略可能是去计算线的梯度，并沿着它来绘制。这看上去似乎很完美，但它事实上是个很糟糕的主意。主要问题是它涉及到除法，我们知道在汇编中，做除法很不容易，并且还要始终记录小数，这也很困难。事实上，在这里，有一个叫布鲁塞姆的算法，它非常适合汇编代码，因为它只使用加法、减法和位移运算。

>
> 在我们日常编程中，我们对像除法这样的运算通常懒得去优化。但是操作系统不同，它必须高效，因此我们要始终专注于如何让事情做的尽可能更好。
>
>
>

>
> 我们从定义一个简单的直线绘制算法开始，代码如下：
>
>
>
> ```
> /* 我们希望从 (x0,y0) 到 (x1,y1) 去绘制一条线，只使用一个函数 setPixel(x,y)，它的功能是在给定的 (x,y) 上绘制一个点。 */
>
> if x1 > x0 then
>
> set deltax to x1 - x0
> set stepx to +1
>
> otherwise
>
> set deltax to x0 - x1
> set stepx to -1
>
> end if
>
> if y1 > y0 then
>
> set deltay to y1 - y0
> set stepy to +1
>
> otherwise
>
> set deltay to y0 - y1
> set stepy to -1
>
> end if
>
> if deltax > deltay then
>
> set error to 0
> until x0 = x1 + stepx
>
> setPixel(x0, y0)
> set error to error + deltax ÷ deltay
> if error ≥ 0.5 then
>
> set y0 to y0 + stepy
> set error to error - 1
>
> end if
> set x0 to x0 + stepx
>
> repeat
>
> otherwise
>
> end if
> ```
>
> 这个算法用来表示你可能想像到的那些东西。变量 `error` 用来记录你离实线的距离。沿着 x 轴每走一步，这个 `error` 的值都会增加，而沿着 y 轴每走一步，这个 `error` 值就会减 1 个单位。`error` 是用于测量距离 y 轴的距离。
>
>
> 虽然这个算法是有效的，但它存在一个重要的问题，很明显，我们使用了小数去保存 `error`，并且也使用了除法。所以，一个立即要做的优化将是去改变 `error` 的单位。这里并不需要用特定的单位去保存它，只要我们每次使用它时都按相同数量去伸缩即可。所以，我们可以重写这个算法，通过在所有涉及 `error` 的等式上都简单地乘以 `deltay`，从面让它简化。下面只展示主要的循环：
>
>
>
> ```
> set error to 0 × deltay
> until x0 = x1 + stepx
>
> setPixel(x0, y0)
> set error to error + deltax ÷ deltay × deltay
> if error ≥ 0.5 × deltay then
>
> set y0 to y0 + stepy
> set error to error - 1 × deltay
>
> end if
> set x0 to x0 + stepx
>
> repeat
> ```
>
> 它将简化为：
>
>
>
> ```
> cset error to 0
> until x0 = x1 + stepx
>
> setPixel(x0, y0)
> set error to error + deltax
> if error × 2 ≥ deltay then
>
> set y0 to y0 + stepy
> set error to error - deltay
>
> end if
> set x0 to x0 + stepx
>
> repeat
> ```
>
> 突然，我们有了一个更好的算法。现在，我们看一下如何完全去除所需要的除法运算。最好保留唯一的被 2 相乘的乘法运算，我们知道它可以通过左移 1 位来实现！现在，这是非常接近布鲁塞姆算法的，但还可以进一步优化它。现在，我们有一个 `if` 语句，它将导致产生两个代码块，其中一个用于 x 差异较大的线，另一个用于 y 差异较大的线。对于这两种类型的线，如果审查代码能够将它们转换成一个单语句，还是很值得去做的。
>
>
> 困难之处在于，在第一种情况下，`error` 是与 y 一起变化，而第二种情况下 `error` 是与 x 一起变化。解决方案是在一个变量中同时记录它们，使用负的 `error` 去表示 x 中的一个 `error`，而用正的 `error` 表示它是 y 中的。
>
>
>
> ```
> set error to deltax - deltay
> until x0 = x1 + stepx or y0 = y1 + stepy
>
> setPixel(x0, y0)
> if error × 2 > -deltay then
>
> set x0 to x0 + stepx
> set error to error - deltay
>
> end if
> if error × 2 < deltax then
>
> set y0 to y0 + stepy
> set error to error + deltax
>
> end if
>
> repeat
> ```
>
> 你可能需要一些时间来搞明白它。在每一步中，我们都认为它正确地在 x 和 y 中移动。我们通过检查来做到这一点，如果我们在 x 或 y 轴上移动，`error` 的数量会变低，那么我们就继续这样移动。
>
>
>

>
> 布鲁塞姆算法是在 1962 年由 Jack Elton Bresenham 开发，当时他 24 岁，正在攻读博士学位。
>
>
>

用于画线的布鲁塞姆算法可以通过以下的伪代码来描述。以下伪代码是文本，它只是看起来有点像是计算机指令而已，但它却能让程序员实实在在地理解算法，而不是为机器可读。

```
/* 我们希望从 (x0,y0) 到 (x1,y1) 去绘制一条线，只使用一个函数 setPixel(x,y)，它的功能是在给定的 (x,y) 上绘制一个点。 */

if x1 > x0 then
    set deltax to x1 - x0
    set stepx to +1
otherwise
    set deltax to x0 - x1
    set stepx to -1
end if

set error to deltax - deltay
until x0 = x1 + stepx or y0 = y1 + stepy
    setPixel(x0, y0)
    if error × 2 ≥ -deltay then
        set x0 to x0 + stepx
        set error to error - deltay
    end if
    if error × 2 ≤ deltax then
        set y0 to y0 + stepy
        set error to error + deltax
    end if
repeat
```

与我们目前所使用的编号列表不同，这个算法的表示方式更常用。看看你能否自己实现它。我在下面提供了我的实现作为参考。

```
.globl DrawLine
DrawLine:
push {r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
x0 .req r9
x1 .req r10
y0 .req r11
y1 .req r12

mov x0,r0
mov x1,r2
mov y0,r1
mov y1,r3

dx .req r4
dyn .req r5  /* 注意，我们只使用 -deltay，因此为了速度，我保存它的负值。（因此命名为 dyn）*/
sx .req r6
sy .req r7
err .req r8

cmp x0,x1
subgt dx,x0,x1
movgt sx,#-1
suble dx,x1,x0
movle sx,#1

cmp y0,y1
subgt dyn,y1,y0
movgt sy,#-1
suble dyn,y0,y1
movle sy,#1

add err,dx,dyn
add x1,sx
add y1,sy

pixelLoop$:

    teq x0,x1
    teqne y0,y1
    popeq {r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}

    mov r0,x0
    mov r1,y0
    bl DrawPixel

    cmp dyn, err,lsl #1
    addle err,dyn
    addle x0,sx

    cmp dx, err,lsl #1
    addge err,dx
    addge y0,sy

    b pixelLoop$

.unreq x0
.unreq x1
.unreq y0
.unreq y1
.unreq dx
.unreq dyn
.unreq sx
.unreq sy
.unreq err
```

### 3、随机性

到目前，我们可以绘制线条了。虽然我们可以使用它来绘制图片及诸如此类的东西（你可以随意去做！），我想应该借此机会引入计算机中随机性的概念。我将这样去做，选择一对随机的坐标，然后从上一对坐标用渐变色绘制一条线到那个点。我这样做纯粹是认为它看起来很漂亮。

那么，总结一下，我们如何才能产生随机数呢？不幸的是，我们并没有产生随机数的一些设备（这种设备很罕见）。因此只能利用我们目前所学过的操作，需要我们以某种方式来发明“随机数”。你很快就会意识到这是不可能的。各种操作总是给出定义好的结果，用相同的寄存器运行相同的指令序列总是给出相同的答案。而我们要做的是推导出一个伪随机序列。这意味着数字在外人看来是随机的，但实际上它是完全确定的。因此，我们需要一个生成随机数的公式。其中有人可能会想到很垃圾的数学运算，比如：4x 2! / 64，而事实上它产生的是一个低质量的随机数。在这个示例中，如果 x 是 0，那么答案将是 0。看起来很愚蠢，我们需要非常谨慎地选择一个能够产生高质量随机数的方程式。

>
> 硬件随机数生成器很少用在安全中，因为可预测的随机数序列可能影响某些加密的安全。
>
>
>

我将要教给你的方法叫“二次同余发生器”。这是一个非常好的选择，因为它能够在 5 个指令中实现，并且能够产生一个从 0 到 232-1 之间的看似很随机的数字序列。

不幸的是，对为什么使用如此少的指令能够产生如此长的序列的原因的研究，已经远超出了本课程的教学范围。但我还是鼓励有兴趣的人去研究它。它的全部核心所在就是下面的二次方程，其中 `xn` 是产生的第 `n` 个随机数。

>
> 这类讨论经常寻求一个问题，那就是我们所谓的随机数到底是什么？通常从统计学的角度来说的随机性是：一组没有明显模式或属性能够概括它的数的序列。
>
>
>

这个方程受到以下的限制：

1. a 是偶数
2. b = a + 1 mod 4
3. c 是奇数

如果你之前没有见到过 `mod` 运算，我来解释一下，它的意思是被它后面的数相除之后的余数。比如 `b = a + 1 mod 4` 的意思是 `b` 是 `a + 1` 除以 `4` 的余数，因此，如果 `a` 是 12，那么 `b` 将是 `1`，因为 `a + 1` 是 13，而 `13` 除以 4 的结果是 3 余 1。

复制下列代码到名为 `random.s` 的文件中。

```
.globl Random
Random:
xnm .req r0
a .req r1

mov a,#0xef00
mul a,xnm
mul a,xnm
add a,xnm
.unreq xnm
add r0,a,#73

.unreq a
mov pc,lr
```

这是随机函数的一个实现，使用一个在寄存器 `r0` 中最后生成的值作为输入，而接下来的数字则是输出。在我的案例中，我使用 a = EF00 16，b = 1, c = 73。这个选择是随意的，但是需要满足上述的限制。你可以使用任何数字代替它们，只要符合上述的规则就行。

### 4、Pi-casso

OK，现在我们有了所有我们需要的函数，我们来试用一下它们。获取帧缓冲信息的地址之后，按如下的要求修改 `main`：

1. 使用包含了帧缓冲信息地址的寄存器 `r0` 调用 `SetGraphicsAddress`。
2. 设置四个寄存器为 0。一个将是最后的随机数，一个将是颜色，一个将是最后的 x 坐标，而最后一个将是最后的 y 坐标。
3. 调用 `random` 去产生下一个 x 坐标，使用最后一个随机数作为输入。
4. 调用 `random` 再次去生成下一个 y 坐标，使用你生成的 x 坐标作为输入。
5. 更新最后的随机数为 y 坐标。
6. 使用 `colour` 值调用 `SetForeColour`，接着增加 `colour` 值。如果它大于 FFFF~16~，确保它返回为 0。
7. 我们生成的 x 和 y 坐标将介于 0 到 FFFFFFFF 16。通过将它们逻辑右移 22 位，将它们转换为介于 0 到 1023 10 之间的数。
8. 检查 y 坐标是否在屏幕上。验证 y 坐标是否介于 0 到 767 10 之间。如果不在这个区间，返回到第 3 步。
9. 从最后的 x 坐标和 y 坐标到当前的 x 坐标和 y 坐标之间绘制一条线。
10. 更新最后的 x 和 y 坐标去为当前的坐标。
11. 返回到第 3 步。

一如既往，你可以在下载页面上找到这个解决方案。

在你完成之后，在树莓派上做测试。你应该会看到一系列颜色递增的随机线条以非常快的速度出现在屏幕上。它一直持续下去。如果你的代码不能正常工作，请查看我们的排错页面。

如果一切顺利，恭喜你！我们现在已经学习了有意义的图形和随机数。我鼓励你去使用它绘制线条，因为它能够用于渲染你想要的任何东西，你可以去探索更复杂的图案了。它们中的大多数都可以由线条生成，但这需要更好的策略？如果你愿意写一个画线程序，尝试使用 `SetPixel` 函数。如果不是去设置像素值而是一点点地增加它，会发生什么情况？你可以用它产生什么样的图案？在下一节课 [课程 8：屏幕 03](https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/screen03.html) 中，我们将学习绘制文本的宝贵技能。

---

via: <https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/screen02.html>

作者：[Alex Chadwick](https://www.cl.cam.ac.uk) 选题：[lujun9972](https://github.com/lujun9972) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 中安装并使用 PuTTY

能否说说，Linux版本下，如何把诸多配置保存，并且导入其他的Linux版本计算机呢？<br />
至少，Windows可以导出注册表~

来自山东威海的 Microsoft Edge 18.19041|Windows 10 用户

# 在 Linux 中安装并使用 PuTTY

PuTTY 是一个自由开源且支持包括 SSH、Telnet 和 Rlogin 在内的多种协议的 GUI 客户端。一般来说，Windows 管理员们会把 PuTTY 当成 SSH 或 Telnet 客户端来在本地 Windows 系统和远程 Linux 服务器之间建立连接。不过，PuTTY 可不是 Windows 的独占软件。它在 Linux 用户之中也是很流行的。本篇文章将会告诉你如何在 Linux 中安装并使用 PuTTY。

### 在 Linux 中安装 PuTTY

PuTTY 已经包含在了许多 Linux 发行版的官方源中。举个例子，在 Arch Linux 中，我们可以通过这个命令安装 PuTTY：

```
$ sudo pacman -S putty
```

在 Debian、Ubuntu 或是 Linux Mint 中安装它：

```
$ sudo apt install putty
```

### 使用 PuTTY 访问远程 Linux 服务器

在安装完 PuTTY 之后，你可以在菜单或启动器中打开它。如果你想用终端打开它，也是可以的：

```
$ putty
```

PuTTY 的默认界面长这个样子：

如你所见，许多选项都配上了说明。在左侧面板中，你可以配置许多项目，比如：

1. 修改 PuTTY 登录会话选项；
2. 修改终端模拟器控制选项，控制各个按键的功能；
3. 控制终端响铃的声音；
4. 启用/禁用终端的高级功能；
5. 设定 PuTTY 窗口大小；
6. 控制命令回滚长度（默认是 2000 行）；
7. 修改 PuTTY 窗口或光标的外观；
8. 调整窗口边缘；
9. 调整字体；
10. 保存登录信息；
11. 设置代理；
12. 修改各协议的控制选项；
13. 以及更多。

所有选项基本都有注释，相信你理解起来不难。

### 使用 PuTTY 访问远程 Linux 服务器

请在左侧面板点击 “Session” 选项卡，输入远程主机名（或 IP 地址）。然后，请选择连接类型（比如 Telnet、Rlogin 以及 SSH 等）。根据你选择的连接类型，PuTTY 会自动选择对应连接类型的默认端口号（比如 SSH 是 22、Telnet 是 23），如果你修改了默认端口号，别忘了手动把它输入到 “Port” 里。在这里，我用 SSH 连接到远程主机。在输入所有信息后，请点击 “Open”。

如果这是你首次连接到这个远程主机，PuTTY 会显示一个安全警告，问你是否信任你连接到的远程主机。点击 “Accept” 即可将远程主机的密钥加入 PuTTY 的缓存当中：

接下来，输入远程主机的用户名和密码。然后你就成功地连接上远程主机啦。

#### 使用密钥验证访问远程主机

一些 Linux 管理员可能在服务器上配置了密钥认证。举个例子，在用 PuTTY 访问 AMS 实例的时候，你需要指定密钥文件的位置。PuTTY 可以使用它自己的格式（`.ppk` 文件）来进行公钥验证。

首先输入主机名或 IP。之后，在 “Category” 选项卡中，展开 “Connection”，再展开 “SSH”，然后选择 “Auth”，之后便可选择 `.ppk` 密钥文件了。

点击 “Accept” 来关闭安全提示。然后，输入远程主机的密码（如果密钥被密码保护）来建立连接。

#### 保存 PuTTY 会话

有些时候，你可能需要多次连接到同一个远程主机，你可以保存这些会话并在之后不输入信息访问他们。

请输入主机名（或 IP 地址），并提供一个会话名称，然后点击 “Save”。如果你有密钥文件，请确保你在点击 “Save” 按钮之前指定它们。

现在，你可以通过选择 “Saved sessions”，然后点击 “Load”，再点击 “Open” 来启动连接。

#### 使用 PuTTY 安全复制客户端（pscp）来将文件传输到远程主机中

通常来说，Linux 用户和管理员会使用 `scp` 这个命令行工具来从本地往远程主机传输文件。不过 PuTTY 给我们提供了一个叫做 <ruby> PuTTY 安全复制客户端 <rt>  PuTTY Secure Copy Client </rt></ruby>（简写为 `pscp`）的工具来干这个事情。如果你的本地主机运行的是 Windows，你可能需要这个工具。PSCP 在 Windows 和 Linux 下都是可用的。

使用这个命令来将 `file.txt` 从本地的 Arch Linux 拷贝到远程的 Ubuntu 上：

```
pscp -i test.ppk file.txt sk@192.168.225.22:/home/sk/
```

让我们来分析这个命令：

* `-i test.ppk`：访问远程主机所用的密钥文件；
* `file.txt`：要拷贝到远程主机的文件；
* `sk@192.168.225.22`：远程主机的用户名与 IP；
* `/home/sk/`：目标路径。

要拷贝一个目录，请使用 `-r`（<ruby> 递归 <rt>  Recursive </rt></ruby>）参数：

```
 pscp -i test.ppk -r dir/ sk@192.168.225.22:/home/sk/
```

要使用 `pscp` 传输文件，请执行以下命令：

```
pscp -i test.ppk c:\documents\file.txt.txt sk@192.168.225.22:/home/sk/
```

你现在应该了解了 PuTTY 是什么，知道了如何安装它和如何使用它。同时，你也学习到了如何使用 `pscp` 程序在本地和远程主机上传输文件。

以上便是所有了，希望这篇文章对你有帮助。

干杯！

---

via: <https://www.ostechnix.com/how-to-install-and-use-putty-on-linux/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zhs852](https://github.com/zhs852) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


5 个面向新手的 Linux 发行版

Summary: 5 个可使用新用户有如归家般感觉的发行版。

我想问一下驱动怎么下载？是用的通用驱动吗？

自从用了Arch之后我觉得manjor是挺好的，比elementary好，功能多，不算太复杂。就是操作方式稍微和ubuntu类不太一样

没有fedora都是差评

全部基于Ubuntu

人生苦短，我用manjaro

5 个可使用新用户有如归家般感觉的发行版。

# 5 个面向新手的 Linux 发行版

>
> 5 个可使用新用户有如归家般感觉的发行版。
>
>
>

从最初的 Linux 到现在，Linux 已经发展了很长一段路。但是，无论你曾经多少次听说过现在使用 Linux 有多容易，仍然会有表示怀疑的人。而要真的承担得其这份声明，桌面必须足够简单，以便不熟悉 Linux 的人也能够使用它。事实上大量的桌面发行版使这成为了现实。

### 无需 Linux 知识

将这个清单误解为又一个“最佳用户友好型 Linux 发行版”的清单可能很简单。但这不是我们要在这里看到的。这二者之间有什么不同？就我的目的而言，定义的界限是 Linux 是否真正起到了使用的作用。换句话说，你是否可以将这个桌面操作系统放在一个用户面前，并让他们应用自如而无需懂得 Linux 知识呢？

不管你相信与否，有些发行版就能做到。这里我将介绍给你 5 个这样的发行版。这些或许你全都听说过。它们或许不是你所选择的发行版，但可以向你保证它们无需过多关注，而是将用户放在眼前的。

我们来看看选中的几个。

### Elementary OS

[Elementary OS](https://elementary.io/) 的理念主要围绕人们如何实际使用他们的桌面。开发人员和设计人员不遗余力地创建尽可能简单的桌面。在这个过程中，他们致力于去 Linux 化的 Linux。这并不是说他们已经从这个等式中删除了 Linux。不，恰恰相反，他们所做的就是创建一个与你所发现的一样的中立的操作系统。Elementary OS 是如此流畅，以确保一切都完美合理。从单个 Dock 到每个人都清晰明了的应用程序菜单，这是一个桌面，而不用提醒用户说，“你正在使用 Linux！” 事实上，其布局本身就让人联想到 Mac，但附加了一个简单的应用程序菜单（图 1）。

*图 1：Elementary OS Juno 应用菜单*

将 Elementary OS 放在此列表中的另一个重要原因是它不像其他桌面发行版那样灵活。当然，有些用户会对此不以为然，但是如果桌面没有向用户扔出各种花哨的定制诱惑，那么就会形成一个非常熟悉的环境：一个既不需要也不允许大量修修补补的环境。操作系统在让新用户熟悉该平台这一方面还有很长的路要走。

与任何现代 Linux 桌面发行版一样，Elementary OS 包括了应用商店，称为 AppCenter，用户可以在其中安装所需的所有应用程序，而无需触及命令行。

### 深度操作系统

[深度操作系统](https://www.deepin.org/)不仅得到了市场上最漂亮的台式机之一的赞誉，它也像任何桌面操作系统一样容易上手。其桌面界面非常简单，对于毫无 Linux 经验的用户来说，它的上手速度非常快。事实上，你很难找到无法立即上手使用 Deepin 桌面的用户。而这里唯一可能的障碍可能是其侧边栏控制中心（图 2）。

*图 2：Deepin 的侧边栏控制编码*

但即使是侧边栏控制面板，也像市场上的任何其他配置工具一样直观。任何使用过移动设备的人对于这种布局都很熟悉。至于打开应用程序，Deepin 的启动器采用了 macOS Launchpad 的方式。此按钮位于桌面底座上通常最右侧的位置，因此用户立即就可以会意，知道它可能类似于标准的“开始”菜单。

与 Elementary OS（以及市场上大多数 Linux 发行版）类似，深度操作系统也包含一个应用程序商店（简称为“商店”），可以轻松安装大量应用程序。

### Ubuntu

你知道肯定有它。[Ubuntu](https://www.ubuntu.com/) 通常在大多数用户友好的 Linux 列表中占据首位。因为它是少数几个不需要懂得 Linux 就能使用的桌面之一。但在采用 GNOME（和 Unity 谢幕）之前，情况并非如此。因为 Unity 经常需要进行一些调整才能达到一点 Linux 知识都不需要的程度（图 3）。现在 Ubuntu 已经采用了 GNOME，并将其调整到甚至不需要懂得 GNOME 的程度，这个桌面使得对 Linux 的简单性和可用性的要求不再是迫切问题。

*图 3：Ubuntu 18.04 桌面可使用马上熟悉起来*

与 Elementary OS 不同，Ubuntu 对用户毫无阻碍。因此，任何想从桌面上获得更多信息的人都可以拥有它。但是，其开箱即用的体验对于任何类型的用户都是足够的。任何一个让用户不知道他们触手可及的力量有多少的桌面，肯定不如 Ubuntu。

### Linux Mint

我需要首先声明，我从来都不是 [Linux Mint](https://linuxmint.com/) 的忠实粉丝。但这并不是说我不尊重开发者的工作，而更多的是一种审美观点。我更喜欢现代化的桌面环境。但是，旧式的学校计算机桌面的隐喻（可以在默认的 Cinnamon 桌面中找到）可以让几乎每个人使用它的人都格外熟悉。Linux Mint 使用任务栏、开始按钮、系统托盘和桌面图标（图 4），提供了一个需要零学习曲线的界面。事实上，一些用户最初可能会被愚弄，以为他们正在使用 Windows 7 的克隆版。甚至是它的更新警告图标也会让用户感到非常熟悉。

*图 4：Linux Mint 的 Cinnamon 桌面非常像 Windows 7*

因为 Linux Mint 受益于其所基于的 Ubuntu，它不仅会让你马上熟悉起来，而且具有很高的可用性。无论你是否对底层平台有所了解，用户都会立即感受到宾至如归的感觉。

### Ubuntu Budgie

我们的列表将以这样一个发行版做结：它也能让用户忘记他们正在使用 Linux，并且使用常用工具变得简单、美观。使 Ubuntu 融合 Budgie 桌面可以构成一个令人印象深刻的易用发行版。虽然其桌面布局（图 5）可能不太一样，但毫无疑问，适应这个环境并不需要浪费时间。实际上，除了 Dock 默认居于桌面的左侧，[Ubuntu Budgie](https://ubuntubudgie.org/) 确实看起来像 Elementary OS。

*图 5：Budgie 桌面既漂亮又简单*

Ubuntu Budgie 中的系统托盘/通知区域提供了一些不太多见的功能，比如：快速访问 Caffeine（一种保持桌面清醒的工具）、快速笔记工具（用于记录简单笔记）、Night Lite 开关、原地下拉菜单（用于快速访问文件夹），当然还有 Raven 小程序/通知侧边栏（与深度操作系统中的控制中心侧边栏类似，但不太优雅）。Budgie 还包括一个应用程序菜单（左上角），用户可以访问所有已安装的应用程序。打开一个应用程序，该图标将出现在 Dock 中。右键单击该应用程序图标，然后选择“保留在 Dock”以便更快地访问。

Ubuntu Budgie 的一切都很直观，所以几乎没有学习曲线。这种发行版既优雅又易于使用，不能再好了。

### 选择一个吧

至此介绍了 5 个 Linux 发行版，它们各自以自己的方式提供了让任何用户都马上熟悉的桌面体验。虽然这些可能不是你对顶级发行版的选择，但对于那些不熟悉 Linux 的用户来说，却不能否定它们的价值。

---

via: <https://www.linux.com/blog/learn/2019/2/top-5-linux-distributions-new-users>

作者：[Jack Wallen](https://www.linux.com/users/jlwallen) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


COPR 仓库中 4 个很酷的新软件（2019.2）

# COPR 仓库中 4 个很酷的新软件（2019.2）

COPR 是个人软件仓库[集合](https://copr.fedorainfracloud.org/)，它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准。或者它可能不符合其他 Fedora 标准，尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不被 Fedora 基础设施不支持或没有被该项目所签名。但是，这是一种尝试新的或实验性的软件的一种巧妙的方式。

这是 COPR 中一组新的有趣项目。

### CryFS

[CryFS](https://www.cryfs.org/) 是一个加密文件系统。它设计与云存储一同使用，主要是 Dropbox，尽管它也可以与其他存储提供商一起使用。CryFS 不仅加密文件系统中的文件，还会加密元数据、文件大小和目录结构。

#### 安装说明

仓库目前为 Fedora 28 和 29 以及 EPEL 7 提供 CryFS。要安装 CryFS，请使用以下命令：

```
sudo dnf copr enable fcsm/cryfs
sudo dnf install cryfs
```

### Cheat

[Cheat](https://github.com/chrisallenlane/cheat) 是一个用于在命令行中查看各种备忘录的工具，用来提醒仅偶尔使用的程序的使用方法。对于许多 Linux 程序，`cheat` 提供了来自手册页的精简后的信息，主要关注最常用的示例。除了内置的备忘录，`cheat` 允许你编辑现有的备忘录或从头开始创建新的备忘录。

#### 安装说明

仓库目前为 Fedora 28、29 和 Rawhide 以及 EPEL 7 提供 `cheat`。要安装 `cheat`，请使用以下命令：

```
sudo dnf copr enable tkorbar/cheat
sudo dnf install cheat
```

### Setconf

[setconf](https://setconf.roboticoverlords.org/) 是一个简单的程序，作为 `sed` 的替代方案，用于对配置文件进行更改。`setconf` 唯一能做的就是找到指定文件中的密钥并更改其值。`setconf` 仅提供很少的选项来更改其行为 - 例如，取消更改行的注释。

#### 安装说明

仓库目前为 Fedora 27、28 和 29 提供 `setconf`。要安装 `setconf`，请使用以下命令：

```
sudo dnf copr enable jamacku/setconf
sudo dnf install setconf
```

### Reddit 终端查看器

[Reddit 终端查看器](https://github.com/michael-lazar/rtv)，或称为 `rtv`，提供了从终端浏览 Reddit 的界面。它提供了 Reddit 的基本功能，因此你可以登录到你的帐户，查看 subreddits、评论、点赞和发现新主题。但是，rtv 目前不支持 Reddit 标签。

#### 安装说明

该仓库目前为 Fedora 29 和 Rawhide 提供 Reddit Terminal Viewer。要安装 Reddit Terminal Viewer，请使用以下命令：

```
sudo dnf copr enable tc01/rtv
sudo dnf install rtv
```

---

via: <https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-february-2019/>

作者：[Dominik Turecek](https://fedoramagazine.org) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


用 AWK 喝咖啡

Summary: 用一个简单的 AWK 程序跟踪你的同事喝咖啡的欠款。

nice

用一个简单的 AWK 程序跟踪你的同事喝咖啡的欠款。

# 用 AWK 喝咖啡

>
> 用一个简单的 AWK 程序跟踪你的同事喝咖啡的欠款。
>
>
>

<img src="content_image/album_201902_20_173818jzbjddeoobtgz5fj.jpg" alt="" title="">

以下基于一个真实的故事，虽然一些名字和细节有所改变。

>
> 很久以前，在一个遥远的地方，有一间~~庙~~（划掉）办公室。由于各种原因，这个办公室没有购买速溶咖啡。所以那个办公室的一些人聚在一起决定建立“咖啡角”。
>
>
> 咖啡角的一名成员会购买一些速溶咖啡，而其他成员会付给他钱。有人喝咖啡比其他人多，所以增加了“半成员”的级别：半成员每周允许喝的咖啡限量，并可以支付其它成员支付的一半。
>
>
>

管理这事非常操心。而我刚读过《Unix 编程环境》这本书，想练习一下我的 [AWK](https://en.wikipedia.org/wiki/AWK) 编程技能，所以我自告奋勇创建了一个系统。

第 1 步：我用一个数据库来记录成员及其应支付给咖啡角的欠款。我是以 AWK 便于处理的格式记录的，其中字段用冒号分隔：

```
member:john:1:22
member:jane:0.5:33
member:pratyush:0.5:17
member:jing:1:27
```

上面的第一个字段标识了这是哪一种行（`member`）。第二个字段是成员的名字（即他们的电子邮件用户名，但没有 @ ）。下一个字段是其成员级别（成员 = 1，或半会员 = 0.5）。最后一个字段是他们欠咖啡角的钱。正数表示他们欠咖啡角钱，负数表示咖啡角欠他们。

第 2 步：我记录了咖啡角的收入和支出：

```
payment:jane:33
payment:pratyush:17
bought:john:60
payback:john:50
```

Jane 付款 $33，Pratyush 付款 $17，John 买了价值 $60 的咖啡，而咖啡角还款给 John $50。

第 3 步：我准备写一些代码，用来处理成员和付款，并生成记录了新欠账的更新的成员文件。

```
#!/usr/bin/env --split-string=awk -F: -f
```

释伴行（`＃!`）需要做一些调整，我使用 `env` 命令来允许从释伴行传递多个参数：具体来说，AWK 的 `-F` 命令行参数会告诉它字段分隔符是什么。

AWK 程序就是一个规则序列（也可以包含函数定义，但是对于这个咖啡角应用来说不需要）

第一条规则读取该成员文件。当我运行该命令时，我总是首先给它的是成员文件，然后是付款文件。它使用 AWK 关联数组来在 `members` 数组中记录成员级别，以及在 `debt` 数组中记录当前欠账。

```
$1 == "member" {
   members[$2]=$3
   debt[$2]=$4
   total_members += $3
}
```

第二条规则在记录付款（`payment`）时减少欠账。

```
$1 == "payment" {
   debt[$2] -= $3
}
```

还款（`payback`）则相反：它增加欠账。这可以优雅地支持意外地给了某人太多钱的情况。

```
$1 == "payback" {
   debt[$2] += $3
}
```

最复杂的部分出现在有人购买（`bought`）速溶咖啡供咖啡角使用时。它被视为付款（`payment`），并且该人的债务减少了适当的金额。接下来，它计算每个会员的费用。它根据成员的级别对所有成员进行迭代并增加欠款

```
$1 == "bought" {
   debt[$2] -= $3
   per_member = $3/total_members
   for (x in members) {
       debt[x] += per_member * members[x]
   }
}
```

`END` 模式很特殊：当 AWK 没有更多的数据要处理时，它会一次性执行。此时，它会使用更新的欠款数生成新的成员文件。

```
END {
   for (x in members) {
       printf "%s:%s:%s\n", x, members[x], debt[x]
   }
}
```

再配合一个遍历成员文件，并向人们发送提醒电子邮件以支付他们的会费（积极清账）的脚本，这个系统管理咖啡角相当一段时间。

---

via: <https://opensource.com/article/19/2/drinking-coffee-awk>

作者：[Moshe Zadka](https://opensource.com/users/moshez) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


极客漫画：AI 会抢走我们的工作吗？

坦白说，会打字、会做 PPT、会编程的AI我也想要

我感觉现在考虑AI会抢“人类”饭碗有点儿过早了！谁知道未来人类还会被分配什么工作呢？

机器人就算再牛逼，也会被人监管，也会被人类制定的规则所限制

老实说就人类产品设计的规则随随便便就出bug了，机器找到一个漏洞不就绕过监管了么？

AI会内卷?

AI会内卷?

AI会内卷?

AI会内卷?

为什么都不更新了啊

这个问题的尽头就是：以后ai做什么都行，还要人类干什么昵？

AI会内卷？

AI会内卷？

问内卷的那个，不然GAN网络在干嘛？

# 极客漫画：AI 会抢走我们的工作吗？

<img src="content_image/album_201902_20_213915jm0slklkzttyskbs.png" alt="" title="">

你不觉得现在的 AI 越来越厉害了么？会不会担心有一天你会失业？瞧瞧，很多工厂都用机器人换下了流水线上的工人们。你觉得你是一个白领，是一个会打字、会做 PPT、会编程的白领。别做梦了，电脑蓝领们，这些事情 AI 干的比你好多了。（还好，这篇漫画 Google 翻译的没有我翻译的好……）

---

via: <http://turnoff.us/geek/will-ai-take-our-jobs/>

作者：[Daniel Stori](http://turnoff.us/about/) 译者 & 点评：[wxy](https://github.com/wxy) 校对 & 合成：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


开始使用 Go For It 吧，一个灵活的待办事项列表程序

# 开始使用 Go For It 吧，一个灵活的待办事项列表程序

>
> Go For It，是我们开源工具系列中的第十个工具，它将使你在 2019 年更高效，它在 Todo.txt 系统的基础上构建，以帮助你完成更多工作。
>
>
>

每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心，渴望开启新的一年，当然，“抛弃旧的，拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件，但事实上并不用这样。

这是我挑选出的 19 个新的（或者对你而言新的）开源工具中的第 10 个工具来帮助你在 2019 年更有效率。

### Go For It

有时，人们要高效率需要的不是一个花哨的看板或一组笔记，而是一个简单、直接的待办事项清单。像“将项目添加到列表中，在完成后检查”一样基本的东西。为此，[纯文本 Todo.txt 系统](http://todotxt.org/)可能是最容易使用的系统之一，几乎所有系统都支持它。

[Go For It](http://manuel-kehl.de/projects/go-for-it/) 是一个简单易用的 Todo.txt 图形界面。如果你已经在使用 Todo.txt，它可以与现有文件一起使用，如果还没有，那么可以同时创建待办事项和完成事项。它允许拖放任务排序，允许用户按照他们想要执行的顺序组织待办事项。它还支持 [Todo.txt 格式指南](https://github.com/todotxt/todo.txt)中所述的优先级、项目和上下文。而且，只需单击任务列表中的项目或者上下文就可通过它们过滤任务。

一开始，Go For It 可能看起来与任何其他 Todo.txt 程序相同，但外观可能是骗人的。将 Go For It 与其他程序真正区分开的功能是它包含一个内置的[番茄工作法](https://en.wikipedia.org/wiki/Pomodoro_Technique)计时器。选择要完成的任务，切换到“计时器”选项卡，然后单击“启动”。任务完成后，只需单击“完成”，它将自动重置计时器并选择列表中的下一个任务。你可以暂停并重新启动计时器，也可以单击“跳过”跳转到下一个任务（或中断）。在当前任务剩余 60 秒时，它会发出警告。任务的默认时间设置为 25 分钟，中断的默认时间设置为 5 分钟。你可以在“设置”页面中调整，同时还能调整 Todo.txt 和 done.txt 文件的目录的位置。

Go For It 的第三个选项卡是“已完成”，允许你查看已完成的任务并在需要时将其清除。能够看到你已经完成的可能是非常激励的，也是一种了解你在更长的过程中进度的好方法。

它还有 Todo.txt 的所有其他优点。Go For It 的列表可以被其他使用相同格式的程序访问，包括 [Todo.txt 的原始命令行工具](https://github.com/todotxt/todo.txt-cli)和任何已安装的[附加组件](https://github.com/todotxt/todo.txt-cli/wiki/Todo.sh-Add-on-Directory)。

Go For It 旨在成为一个简单的工具来帮助管理你的待办事项列表并完成这些项目。如果你已经使用过 Todo.txt，那么 Go For It 是你的工具箱的绝佳补充，如果你还没有，这是一个尝试最简单、最灵活系统之一的好机会。

---

via: <https://opensource.com/article/19/1/productivity-tool-go-for-it>

作者：[Kevin Sonney](https://opensource.com/users/ksonney "Kevin Sonney") 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


论系统管理员的傲慢与偏见

Summary: 说实话，我原本对在 Linux 上安装 PuTTY 也持可有可无的态度。但是，看着看着，我就有点看不下去了。

~/.ssh/config 不就都能解决了 ... 真的搞不懂 ...

1、这些好处都可以用 ssh_config(5) 做到<br />
2、生产服务器设置终端样式不应该在生产服务器的 profile(5) 里面调吗？本地调的话临时换个机器连不就又没提醒了吗？ “有时有提醒” 比 “从来没有提醒” 更危险，参考自动驾驶和为什么不要 alias rm='rm -i'

首先，OpenSSH 并不是“古典”，PuTTY 也不能代表“新时代”，两者均于 1999 年发行初版，OpenSSH 至今仍在活跃的开发中，而 PuTTY 的上一次稳定版发布远在 2017 年 7 月。文中所说的这些，ssh_config 都可以做到，作为已经开发了 20 年的老牌软件，自然都有这些功能，为什么不打开 man 页面，自己看看呢。

其次，使用 OpenSSH 并非“万般皆下品惟有终端高”，而是因为 OpenSSH 符合 KISS 原则，我可以按我的需要配置，并与我常用的工具结合在一起使用，至少对于我来说，命令行选项比图形界面的一大堆选项框更加清晰明了。相反，又有多少

人会去在终端下用 w3m 等浏览器呢？我之所以用 OpenSSH，只是因为它好用。

最后，为什么总有人认为用终端就要“每次敲长长的命令行”？为什么不试试执行历史命令？试试 alias ？试试脚本？“将眼睛从黑窗口挪开看一眼”之后，再挪入另一个黑窗口，究竟意义何在？说到底，一个不能公正地看待终端与图形界面的优缺点的人，不能谦虚地保持学习和理性的思维的人，你觉得你适合做编辑工作么？

又可以开放评论了？

我想说 Putty 还是算了吧，windows 有好用的 xshell，Linux 上用自带的 Terminal 就行。还有如果是 ssh 完全可以使用秘钥的方式进行远程访问。但是有总比没有好，所以 Putty 永远是个备胎甚至都算不上备胎。

我是个Linux菜鸟，目前使用树莓派在自己家里做了个24小时服务器运行php。

日常使用Windows7系统，装了个openssh在命令行用ssh

只需要按Win+R,就可以弹出运行框，再按一下回车就可以打开命令行，连接树莓派，实在是想不到PuTTY 有什么优势。

PuTTY 只在直接连接com口时用吧？

Linux的图形界面就是垃圾，反映迟钝、布局宽松，一万个用不惯。

一个不能公正地看待包括 Windows（及 WSL）、Unix、 Linux 等不同系统的优缺点的人，不能谦虚地保持学习和理性的思维的人，我看评论区大多是这样的人。

来自湖北武汉武汉大学测绘学院的 Mobile Safari 12.0|iOS 12.1 用户

一个老练的系统管理员肯定用不上putty这种软件，但是新手特别是已经在Win下熟练使用putty的Linux新手就不一样了。看到有这样的软件还是很有用的。最起码，是一个过渡的工具，需不需要深入学习ssh设置，那是以后的事情。人家就喜欢用，怎么了？？？

作者写的东西，是给有需要的人看的。你用不上，不看就可以了，不点这个链接就可以了，有什么好喷的。

你用不上的东西，并不代表没有存在的意义。认识不到这一点，不是技术水平的原因，而是心智水平的问题。

windows 有好用的 xshell，问题是你们买了么？？？ OpenSSH的好处也只有熟练之后

存在即是合理，所有人都要怀着赤子之心，别人讨论的东西你可能用不上，但是请您不要去抨击，除非本身的错误。我们不缺乏键盘侠，我们缺乏的是拥有赤子之心的人

又一个无脑喷，不了解就不要随便乱写，ok？

我自己开发了一个ssh的终端小工具，可以记录不同的ip，并且为不同的ip设置别名，可以通过别名快速登陆，简单实用，欢迎试用 ：https://github.com/jupengfei-github/Quich-SSH

支持作者，有简单方便的东西，我为什么要用命令行？

Linux丽尼克斯系统上有些软件就是少，比如php环境。

我是一个玩了10多年Linux的新手。最近再折腾深度系统的php环境，可怜的我折腾了大半年也没搞舒坦。以下是我的折腾经过。

Deepin15.9如何搭建php+mysql的web服务器环境？

关于Deepin应用商店里的XAMPP的折腾。应用商店里的宝塔永远是莫名其妙的失败，宝塔安装不了，我记得还有个wdCP控制面板，按照官网的命令也是失败，所以只好把希望寄托在XAMPP上了。

一，在深度应用里下载安装好XAMPP。

二，赋于权限

... ...

由于太长，已经在论坛

来自223.104.63.172的 Opera Mobile 48.1|Android 8.1 用户

看来我的评论太长，被截断了。

# 论系统管理员的傲慢与偏见

<img src="content_image/album_201902_21_104636ek3gx6n3ptqnn3rr.png" alt="" title="">

之前我们发过一篇《[如何在 Ubuntu 和其他 Linux 发行版上安装 Putty](/article-10373-1.html)》，有一些人对此不以为然，说实话，我原本对在 Linux 上安装 PuTTY 也持可有可无的态度。前两天，我们又发了一篇《[在 Linux 中安装并使用 PuTTY](/article-10552-1.html)》，比上一篇更详细的介绍了在 Linux 上安装使用 PuTTY 的经验。

不出所料，又引来了一些人评论，我本来对此也是哈哈一笑，各人都有各人的看法嘛。但是，看着看着，我就有点看不下去了。

这些人在说什么呢？他们是这样说的：

* 为什么不直接用命令行呢？
* 多此一举
* PuTTY 能做的 Linux 终端都能做，感觉没啥用
* X 疼操作
* 有个疑问：Linux 为什么要装 PuTTY？
* 典型的南辕北辙，画蛇添足，无聊的蛋疼
* 是 OpenSSH 不好用了还是 OpenSSH 不够骚了
* 存粹搞着玩
* ？？？？？？？？
* 我 tm 好想 at 疑惑大赏

更多我就不一一列出来了，以上也不指名道姓了，上述言论归该发言者所有。

在一开始，我就轻轻的回复一句：“**为什么不能在 Linux 桌面里面有个 ssh 连接管理器呢？**”也有同学说“**经常用 Linux 桌面访问多机 SSH 的朋友知道这篇文章的好。**”、“**几乎是最简洁轻便的 ssh 工具了（其实还支持 telnet 和串口等）**”，但是这些很快被淹没在种种无脑的评论当中。

我低估了这些应该是懂一些 Linux 系统管理的人傲慢，也没想到会有这么多的偏见！

是的，我们以前只在 Windows 上见过 PuTTY，而且，我还曾经在偶尔需要 SSH 连接时临时下载使用过 PuTTY，虽然不如 SecureCRT，但是也够用了——谁让之前 Windows 没有内置的 ssh 命令行呢。

是的，我对 PuTTY 还有过一个不好的偏见，因为之前有些坏人给 PuTTY 加壳，[放了木马](/article-293-1.html)，一些警惕心不够的人因此而中招——虽然这事完全不赖 PuTTY。

难道系统管理员们都是“万般皆下品惟有终端高”吗？作为技术人员，在一个日新月异的时代，无论是作为继承了古典“黑客”传统的 IT 人，还是处于一个一日不学即落后的行业，为什么要故步自封？为什么不能将眼睛从黑窗口挪开看一眼呢？

那么，我来说说，使用 PuTTY 有什么好处！

* 如果你要管理若干服务器呢，难道用 txt 记录 IP 吗？
* 如果想为重要的生产服务器设置不同的终端样式提醒你千万小心呢？
* 如果你要同时管理 Solaris 和 Linux 呢，需要调整键盘映射呢？要知道 Sun Solaris 的删除键和 PC 键盘不同。
* 如果想为不同用户采用不同的验证方案呢？比如 root 采用密钥验证，而普通用户采用 otp 加密码验证。
* 如果你不想每次敲长长的命令行，指定端口号、指定用户名、指定另外的密钥位置呢？
* ……

这些，够不够你放下傲慢来看一看呢？说到底，一个不能公正地看待包括 Windows（及 WSL）、Unix、 Linux 等不同系统的优缺点的人，不能谦虚地保持学习和理性的思维的人，你觉得你适合做技术工作么？

戒骄戒躁，放下傲慢。


3 个 Linux 上的 SSH 图形界面工具

Summary: 了解一下这三个用于 Linux 上的 SSH 图形界面工具。

了解一下这三个用于 Linux 上的 SSH 图形界面工具。

# 3 个 Linux 上的 SSH 图形界面工具

>
> 了解一下这三个用于 Linux 上的 SSH 图形界面工具。
>
>
>

在你担任 Linux 管理员的职业生涯中，你会使用 Secure Shell（SSH）远程连接到 Linux 服务器或桌面。可能你曾经在某些情况下，会同时 SSH 连接到多个 Linux 服务器。实际上，SSH 可能是 Linux 工具箱中最常用的工具之一。因此，你应该尽可能提高体验效率。对于许多管理员来说，没有什么比命令行更有效了。但是，有些用户更喜欢使用 GUI 工具，尤其是在从台式机连接到远程并在服务器上工作时。

如果你碰巧喜欢好的图形界面工具，你肯定很乐于了解一些 Linux 上优秀的 SSH 图形界面工具。让我们来看看这三个工具，看看它们中的一个（或多个）是否完全符合你的需求。

我将在 [Elementary OS](https://elementary.io/) 上演示这些工具，但它们都可用于大多数主要发行版。

### PuTTY

已经有一些经验的人都知道 [PuTTY](https://www.chiark.greenend.org.uk/%7Esgtatham/putty/latest.html)。实际上，从 Windows 环境通过 SSH 连接到 Linux 服务器时，PuTTY 是事实上的标准工具。但 PuTTY 不仅适用于 Windows。事实上，通过标准软件库，PuTTY 也可以安装在 Linux 上。 PuTTY 的功能列表包括：

* 保存会话。
* 通过 IP 或主机名连接。
* 使用替代的 SSH 端口。
* 定义连接类型。
* 日志。
* 设置键盘、响铃、外观、连接等等。
* 配置本地和远程隧道。
* 支持代理。
* 支持 X11 隧道。

PuTTY 图形工具主要是一种保存 SSH 会话的方法，因此可以更轻松地管理所有需要不断远程进出的各种 Linux 服务器和桌面。一旦连接成功，PuTTY 就会建立一个到 Linux 服务器的连接窗口，你将可以在其中工作。此时，你可能会有疑问，为什么不在终端窗口工作呢？对于一些人来说，保存会话的便利确实使 PuTTY 值得使用。

在 Linux 上安装 PuTTY 很简单。例如，你可以在基于 Debian 的发行版上运行命令：

```
sudo apt-get install -y putty
```

安装后，你可以从桌面菜单运行 PuTTY 图形工具或运行命令 `putty`。在 PuTTY “Configuration” 窗口（图 1）中，在 “HostName (or IP address) ” 部分键入主机名或 IP 地址，配置 “Port”（如果不是默认值 22），从 “Connection type”中选择 SSH，然后单击“Open”。

*图 1：PuTTY 连接配置窗口*

建立连接后，系统将提示你输入远程服务器上的用户凭据（图2）。

*图 2：使用 PuTTY 登录到远程服务器*

要保存会话（以便你不必始终键入远程服务器信息），请填写主机名（或 IP 地址）、配置端口和连接类型，然后（在单击 “Open” 之前），在 “Saved Sessions” 部分的顶部文本区域中键入名称，然后单击 “Save”。这将保存会话的配置。若要连接到已保存的会话，请从 “Saved Sessions” 窗口中选择它，单击 “Load”，然后单击 “Open”。系统会提示你输入远程服务器上的远程凭据。

### EasySSH

虽然 [EasySSH](https://github.com/muriloventuroso/easyssh) 没有提供 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 连接。

*图 3：在 EasySSH 中添加连接很简单*

添加连接后，它将显示在主窗口的左侧导航中（图 4）。

*图 4：EasySSH 主窗口*

要在 EasySSH 连接到远程服务器，请从左侧导航栏中选择它，然后单击 “Connect” 按钮（图 5）。

*图 5：用 EasySSH 连接到远程服务器*

对于 EasySSH 的一个警告是你必须将用户名和密码保存在连接配置中（否则连接将失败）。这意味着任何有权访问运行 EasySSH 的桌面的人都可以在不知道密码的情况下远程访问你的服务器。因此，你必须始终记住在你离开时锁定桌面屏幕（并确保使用强密码）。否则服务器容易受到意外登录的影响。

### Terminator

（LCTT 译注：这个选择不符合本文主题，本节删节）

### termius

（LCTT 译注：本节是根据网友推荐补充的）

termius 是一个商业版的 SSH、Telnet 和 Mosh 客户端，不是开源软件。支持包括 [Linux](https://www.termius.com/linux)、Windows、Mac、iOS 和安卓在内的各种操作系统。对于单一设备是免费的，支持多设备的白金账号需要按月付费。

### 很少（但值得）的选择

Linux 上没有很多可用的 SSH 图形界面工具。为什么？因为大多数管理员更喜欢简单地打开终端窗口并使用标准命令行工具来远程访问其服务器。但是，如果你需要图形界面工具，则有两个可靠选项，可以更轻松地登录多台计算机。虽然对于那些寻找 SSH 图形界面工具的人来说只有不多的几个选择，但那些可用的工具当然值得你花时间。尝试其中一个，亲眼看看。

---

via: <https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux>

作者：[Jack Wallen](https://www.linux.com/users/jlwallen) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


PowerTOP：在 Linux 上监视电量使用和改善笔记本电池寿命

Summary: 你可以使用 PowerTOP 工具来查看没有接入电源线时电量都用在了何处。

你可以使用 PowerTOP 工具来查看没有接入电源线时电量都用在了何处。

# PowerTOP：在 Linux 上监视电量使用和改善笔记本电池寿命

<img src="content_image/album_201902_21_235257ef1eepe6rkv6qxjf.jpg" alt="" title="">

我们都知道，现在几乎都从 PC 机换到了笔记本电脑了。但是使用笔记本有个问题，我们希望电池耐用，我们可以使用到每一点电量。所以，我们需要知道电量都去哪里了，是不是浪费了。

你可以使用 PowerTOP 工具来查看没有接入电源线时电量都用在了何处。你需要在终端中使用超级用户权限来运行 PowerTOP 工具。它可以访问该电池硬件并测量电量使用情况。

### 什么是 PowerTOP

PowerTOP 是一个 Linux 工具，用于诊断电量消耗和电源管理的问题。

它是由 Intel 开发的，可以在内核、用户空间和硬件中启用各种节电模式。

除了作为一个一个诊断工具之外，PowerTop 还有一个交互模式，可以让你实验 Linux 发行版没有启用的各种电源管理设置。

它也能监控进程，并展示其中哪个正在使用 CPU，以及从休眠状态页将其唤醒，也可以找出电量消耗特别高的应用程序。

### 如何安装 PowerTOP

PowerTOP 软件包在大多数发行版的软件库中可用，使用发行版的 [包管理器](https://www.2daygeek.com/category/package-management/) 安装即可。

对于 Fedora 系统，使用 `dnf` 命令 来安装 PowerTOP。

```
$ sudo dnf install powertop
```

对于 Debian/Ubuntu 系统，使用 `apt-get` 命令 或 `apt` 命令 来安装 PowerTOP。

```
$ sudo apt install powertop
```

对于基于 Arch Linux 的系统，使用 `pacman` 命令 来安装 PowerTOP。

```
$ sudo pacman -S powertop
```

对于 RHEL/CentOS 系统，使用 `yum` 命令 来安装 PowerTOP。

```
$ sudo yum install powertop
```

对于 openSUSE Leap 系统，使用 `zypper` 命令 来安装 PowerTOP。

```
$ sudo zypper install powertop
```

### 如何使用 PowerTOP

PowerTOP 需要超级用户权限，所以在 Linux 系统中以 root 身份运行 PowerTOP 工具。

默认情况下其显示 “概览” 页，在这里我们可以看到所有设备的电量消耗情况，也可以看到系统的唤醒秒数。

```
$ sudo powertop

PowerTOP v2.9     Overview   Idle stats   Frequency stats   Device stats   Tunables

The battery reports a discharge rate of 12.6 W
The power consumed was 259 J
The estimated remaining time is 1 hours, 52 minutes

Summary: 1692.9 wakeups/second,  0.0 GPU ops/seconds, 0.0 VFS ops/sec and 54.9% CPU use

                Usage       Events/s    Category       Description
              9.3 ms/s     529.4        Timer          tick_sched_timer
            378.5 ms/s     139.8        Process        [PID 2991] /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 8314 -prefMapSize 173895 -schedulerPrefs 00
              7.5 ms/s     141.7        Timer          hrtimer_wakeup
              3.3 ms/s     102.7        Process        [PID 1527] /usr/lib/firefox/firefox --new-window
             11.6 ms/s      69.1        Process        [PID 1568] /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 173895 -schedulerPrefs 0001,
              6.2 ms/s      59.0        Process        [PID 1496] /usr/lib/firefox/firefox --new-window
              2.1 ms/s      59.6        Process        [PID 2466] /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 5814 -prefMapSize 173895 -schedulerPrefs 00
              1.8 ms/s      52.3        Process        [PID 2052] /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 5814 -prefMapSize 173895 -schedulerPrefs 00
              1.8 ms/s      50.8        Process        [PID 3034] /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 8314 -prefMapSize 173895 -schedulerPrefs 00
              3.6 ms/s      48.4        Process        [PID 3009] /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 8314 -prefMapSize 173895 -schedulerPrefs 00
              7.5 ms/s      46.2        Process        [PID 2996] /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 8314 -prefMapSize 173895 -schedulerPrefs 00
             25.2 ms/s      33.6        Process        [PID 1528] /usr/lib/firefox/firefox --new-window
              5.7 ms/s      32.2        Interrupt      [7] sched(softirq)
              2.1 ms/s      32.2        Process        [PID 1811] /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 5814 -prefMapSize 173895 -schedulerPrefs 00
             19.7 ms/s      25.0        Process        [PID 1794] /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 5814 -prefMapSize 173895 -schedulerPrefs 00
              1.9 ms/s      31.5        Process        [PID 1596] /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 173895 -schedulerPrefs 0001,
              3.1 ms/s      29.9        Process        [PID 1535] /usr/lib/firefox/firefox --new-window
              7.1 ms/s      28.2        Process        [PID 1488] /usr/lib/firefox/firefox --new-window
              1.8 ms/s      29.5        Process        [PID 1762] /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 5814 -prefMapSize 173895 -schedulerPrefs 00
              8.8 ms/s      23.3        Process        [PID 1121] /usr/bin/gnome-shell
              1.2 ms/s      21.8        Process        [PID 1657] /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 920 -prefMapSize 173895 -schedulerPrefs 000
             13.3 ms/s      13.9        Process        [PID 1746] /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 5814 -prefMapSize 173895 -schedulerPrefs 00
              2.7 ms/s      11.1        Process        [PID 3410] /usr/lib/gnome-terminal-server
              3.8 ms/s      10.8        Process        [PID 1057] /usr/lib/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty
              3.1 ms/s       9.8        Process        [PID 1629] /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 920 -prefMapSize 173895 -schedulerPrefs 000
              0.9 ms/s       6.7        Interrupt      [136] xhci_hcd
            278.0 us/s       6.4        Process        [PID 414] [irq/141-iwlwifi]
            128.7 us/s       5.7        Process        [PID 1] /sbin/init
            118.5 us/s       5.2        Process        [PID 10] [rcu_preempt]
             49.0 us/s       4.7        Interrupt      [0] HI_SOFTIRQ
            459.3 us/s       3.1        Interrupt      [142] i915
              2.1 ms/s       2.3        Process        [PID 3451] powertop
              8.4 us/s       2.7        kWork          intel_atomic_helper_free_state_
              1.2 ms/s       1.8        kWork          intel_atomic_commit_work
            374.2 us/s       2.1        Interrupt      [9] acpi
             42.1 us/s       1.8        kWork          intel_atomic_cleanup_work
              3.5 ms/s      0.25        kWork          delayed_fput
            238.0 us/s       1.5        Process        [PID 907] /usr/lib/upowerd
             17.7 us/s       1.5        Timer          intel_uncore_fw_release_timer
             26.4 us/s       1.4        Process        [PID 576] [i915/signal:0]
             19.8 us/s       1.3        Timer          watchdog_timer_fn
              1.1 ms/s      0.00        Process        [PID 206] [kworker/7:2]
              2.4 ms/s      0.00        Interrupt      [1] timer(softirq)
             13.4 us/s       0.9        Process        [PID 9] [ksoftirqd/0]

 Exit |  /  Navigate |
```

PowerTOP 的输出类似如上截屏，在你的机器上由于硬件不同会稍有不同。它的显示有很多页，你可以使用 `Tab` 和 `Shift+Tab` 在它们之间切换。

### 空闲状态页

它会显示处理器的各种信息。

```
PowerTOP v2.9     Overview   Idle stats   Frequency stats   Device stats   Tunables

          Package   |             Core    |            CPU 0       CPU 4
                    |                     | C0 active   6.7%        7.2%
                    |                     | POLL        0.0%    0.1 ms  0.0%    0.1 ms
                    |                     | C1E         1.2%    0.2 ms  1.6%    0.3 ms
C2 (pc2)    7.5%    |                     |
C3 (pc3)   25.2%    | C3 (cc3)    0.7%    | C3          0.5%    0.2 ms  0.6%    0.1 ms
C6 (pc6)    0.0%    | C6 (cc6)    7.1%    | C6          6.6%    0.5 ms  6.3%    0.5 ms
C7 (pc7)    0.0%    | C7 (cc7)   59.8%    | C7s         0.0%    0.0 ms  0.0%    0.0 ms
C8 (pc8)    0.0%    |                     | C8         33.9%    1.6 ms 32.3%    1.5 ms
C9 (pc9)    0.0%    |                     | C9          2.1%    3.4 ms  0.7%    2.8 ms
C10 (pc10)  0.0%    |                     | C10        39.5%    4.7 ms 41.4%    4.7 ms

                    |             Core    |            CPU 1       CPU 5
                    |                     | C0 active   8.3%        7.2%
                    |                     | POLL        0.0%    0.0 ms  0.0%    0.1 ms
                    |                     | C1E         1.3%    0.2 ms  1.4%    0.3 ms
                    |                     |
                    | C3 (cc3)    0.5%    | C3          0.5%    0.2 ms  0.4%    0.2 ms
                    | C6 (cc6)    6.0%    | C6          5.3%    0.5 ms  4.7%    0.5 ms
                    | C7 (cc7)   59.3%    | C7s         0.0%    0.8 ms  0.0%    1.0 ms
                    |                     | C8         27.2%    1.5 ms 23.8%    1.4 ms
                    |                     | C9          1.6%    3.0 ms  0.5%    3.0 ms
                    |                     | C10        44.5%    4.7 ms 52.2%    4.6 ms

                    |             Core    |            CPU 2       CPU 6
                    |                     | C0 active  11.2%        8.4%
                    |                     | POLL        0.0%    0.0 ms  0.0%    0.0 ms
                    |                     | C1E         1.4%    0.4 ms  1.3%    0.3 ms
                    |                     |
                    | C3 (cc3)    0.3%    | C3          0.2%    0.1 ms  0.4%    0.2 ms
                    | C6 (cc6)    4.0%    | C6          3.7%    0.5 ms  4.3%    0.5 ms
                    | C7 (cc7)   54.2%    | C7s         0.0%    0.0 ms  0.0%    1.0 ms
                    |                     | C8         20.0%    1.5 ms 20.7%    1.4 ms
                    |                     | C9          1.0%    3.4 ms  0.4%    3.8 ms
                    |                     | C10        48.8%    4.6 ms 52.3%    5.0 ms

                    |             Core    |            CPU 3       CPU 7
                    |                     | C0 active   8.8%        8.1%
                    |                     | POLL        0.0%    0.1 ms  0.0%    0.0 ms
                    |                     | C1E         1.2%    0.2 ms  1.2%    0.2 ms
                    |                     |
                    | C3 (cc3)    0.6%    | C3          0.6%    0.2 ms  0.4%    0.2 ms
                    | C6 (cc6)    7.0%    | C6          7.5%    0.5 ms  4.4%    0.5 ms
                    | C7 (cc7)   56.8%    | C7s         0.0%    0.0 ms  0.0%    0.9 ms
                    |                     | C8         29.4%    1.4 ms 23.8%    1.4 ms
                    |                     | C9          1.1%    2.7 ms  0.7%    3.9 ms
                    |                     | C10        41.0%    4.0 ms 50.0%    4.8 ms

 Exit |  /  Navigate |
```

### 频率状态页

它会显示 CPU 的主频。

```
PowerTOP v2.9     Overview   Idle stats   Frequency stats   Device stats   Tunables

            Package |             Core    |            CPU 0       CPU 4
                    |                     | Average      930 MHz    1101 MHz
Idle                | Idle                | Idle

                    |             Core    |            CPU 1       CPU 5
                    |                     | Average     1063 MHz     979 MHz
                    | Idle                | Idle

                    |             Core    |            CPU 2       CPU 6
                    |                     | Average      976 MHz     942 MHz
                    | Idle                | Idle

                    |             Core    |            CPU 3       CPU 7
                    |                     | Average      924 MHz     957 MHz
                    | Idle                | Idle

```

### 设备状态页

它仅针对设备显示其电量使用信息。

```
PowerTOP v2.9     Overview   Idle stats   Frequency stats   Device stats   Tunables

The battery reports a discharge rate of 13.8 W
The power consumed was 280 J

              Usage     Device name
             46.7%        CPU misc
             46.7%        DRAM
             46.7%        CPU core
             19.0%        Display backlight
              0.0%        Audio codec hwC0D0: Realtek
              0.0%        USB device: Lenovo EasyCamera (160709000341)
            100.0%        PCI Device: Intel Corporation HD Graphics 530
            100.0%        Radio device: iwlwifi
            100.0%        PCI Device: O2 Micro, Inc. SD/MMC Card Reader Controller
            100.0%        PCI Device: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
            100.0%        USB device: Lenovo Wireless Optical Mouse N100
            100.0%        PCI Device: Intel Corporation Wireless 8260
            100.0%        PCI Device: Intel Corporation HM170/QM170 Chipset SATA Controller [AHCI Mode]
            100.0%        Radio device: btusb
            100.0%        PCI Device: Intel Corporation 100 Series/C230 Series Chipset Family PCI Express Root Port #4
            100.0%        USB device: xHCI Host Controller
            100.0%        PCI Device: Intel Corporation 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller
            100.0%        PCI Device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
            100.0%        PCI Device: Intel Corporation 100 Series/C230 Series Chipset Family PCI Express Root Port #3
            100.0%        PCI Device: Samsung Electronics Co Ltd NVMe SSD Controller SM951/PM951
            100.0%        PCI Device: Intel Corporation 100 Series/C230 Series Chipset Family PCI Express Root Port #2
            100.0%        PCI Device: Intel Corporation 100 Series/C230 Series Chipset Family PCI Express Root Port #9
            100.0%        PCI Device: Intel Corporation 100 Series/C230 Series Chipset Family SMBus
             26.1 pkts/s  Network interface: wlp8s0 (iwlwifi)
              0.0%        USB device: usb-device-8087-0a2b
              0.0%        runtime-reg-dummy
              0.0%        Audio codec hwC0D2: Intel
              0.0 pkts/s  Network interface: enp9s0 (r8168)
              0.0%        PCI Device: Intel Corporation 100 Series/C230 Series Chipset Family Power Management Controller
              0.0%        PCI Device: Intel Corporation HM170 Chipset LPC/eSPI Controller
              0.0%        PCI Device: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x16)
              0.0%        PCI Device: Intel Corporation 100 Series/C230 Series Chipset Family MEI Controller #1
              0.0%        PCI Device: NVIDIA Corporation GM107M [GeForce GTX 960M]
              0.0%        I2C Adapter (i2c-8): nvkm-0000:01:00.0-bus-0005
              0.0%        runtime-PNP0C14:00
              0.0%        PCI Device: Intel Corporation 100 Series/C230 Series Chipset Family HD Audio Controller
              0.0%        runtime-PNP0C0C:00
              0.0%        USB device: xHCI Host Controller
              0.0%        runtime-ACPI000C:00
              0.0%        runtime-regulatory.0
              0.0%        runtime-PNP0C14:01
              0.0%        runtime-vesa-framebuffer.0
              0.0%        runtime-coretemp.0
              0.0%        runtime-alarmtimer

 Exit |  /  Navigate |
```

### 可调整状态页

这个页面是个重要区域，可以为你的笔记本电池优化提供建议。

```
PowerTOP v2.9     Overview   Idle stats   Frequency stats   Device stats   Tunables

>> Bad           Enable SATA link power management for host2
   Bad           Enable SATA link power management for host3
   Bad           Enable SATA link power management for host0
   Bad           Enable SATA link power management for host1
   Bad           VM writeback timeout
   Bad           Autosuspend for USB device Lenovo Wireless Optical Mouse N100 [1-2]
   Good          Bluetooth device interface status
   Good          Enable Audio codec power management
   Good          NMI watchdog should be turned off
   Good          Runtime PM for I2C Adapter i2c-7 (nvkm-0000:01:00.0-bus-0002)
   Good          Autosuspend for unknown USB device 1-11 (8087:0a2b)
   Good          Runtime PM for I2C Adapter i2c-3 (i915 gmbus dpd)
   Good          Autosuspend for USB device Lenovo EasyCamera [160709000341]
   Good          Runtime PM for I2C Adapter i2c-1 (i915 gmbus dpc)
   Good          Runtime PM for I2C Adapter i2c-12 (nvkm-0000:01:00.0-bus-0009)
   Good          Autosuspend for USB device xHCI Host Controller [usb1]
   Good          Runtime PM for I2C Adapter i2c-13 (nvkm-0000:01:00.0-aux-000a)
   Good          Runtime PM for I2C Adapter i2c-2 (i915 gmbus dpb)
   Good          Runtime PM for I2C Adapter i2c-8 (nvkm-0000:01:00.0-bus-0005)
   Good          Runtime PM for I2C Adapter i2c-15 (nvkm-0000:01:00.0-aux-000c)
   Good          Runtime PM for I2C Adapter i2c-16 (nvkm-0000:01:00.0-aux-000d)
   Good          Runtime PM for I2C Adapter i2c-5 (nvkm-0000:01:00.0-bus-0000)
   Good          Runtime PM for I2C Adapter i2c-0 (SMBus I801 adapter at 6040)
   Good          Runtime PM for I2C Adapter i2c-11 (nvkm-0000:01:00.0-bus-0008)
   Good          Runtime PM for I2C Adapter i2c-14 (nvkm-0000:01:00.0-aux-000b)
   Good          Autosuspend for USB device xHCI Host Controller [usb2]
   Good          Runtime PM for I2C Adapter i2c-9 (nvkm-0000:01:00.0-bus-0006)
   Good          Runtime PM for I2C Adapter i2c-10 (nvkm-0000:01:00.0-bus-0007)
   Good          Runtime PM for I2C Adapter i2c-6 (nvkm-0000:01:00.0-bus-0001)
   Good          Runtime PM for PCI Device Intel Corporation 100 Series/C230 Series Chipset Family HD Audio Controller
   Good          Runtime PM for PCI Device Intel Corporation 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller
   Good          Runtime PM for PCI Device Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers
   Good          Runtime PM for PCI Device Intel Corporation 100 Series/C230 Series Chipset Family PCI Express Root Port #9
   Good          Runtime PM for PCI Device Intel Corporation HD Graphics 530
   Good          Runtime PM for PCI Device Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
   Good          Runtime PM for PCI Device Intel Corporation 100 Series/C230 Series Chipset Family PCI Express Root Port #3
   Good          Runtime PM for PCI Device O2 Micro, Inc. SD/MMC Card Reader Controller
   Good          Runtime PM for PCI Device Intel Corporation HM170 Chipset LPC/eSPI Controller
   Good          Runtime PM for PCI Device Intel Corporation 100 Series/C230 Series Chipset Family MEI Controller #1
   Good          Runtime PM for PCI Device Samsung Electronics Co Ltd NVMe SSD Controller SM951/PM951
   Good          Runtime PM for PCI Device Intel Corporation HM170/QM170 Chipset SATA Controller [AHCI Mode]
   Good          Runtime PM for PCI Device Intel Corporation 100 Series/C230 Series Chipset Family Power Management Controller
   Good          Runtime PM for PCI Device Intel Corporation 100 Series/C230 Series Chipset Family PCI Express Root Port #2
   Good          Runtime PM for PCI Device Intel Corporation Wireless 8260
   Good          Runtime PM for PCI Device Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x16)
   Good          Runtime PM for PCI Device Intel Corporation 100 Series/C230 Series Chipset Family PCI Express Root Port #4
   Good          Runtime PM for PCI Device Intel Corporation 100 Series/C230 Series Chipset Family SMBus
   Good          Runtime PM for PCI Device NVIDIA Corporation GM107M [GeForce GTX 960M]

  Exit |  Toggle tunable |  Window refresh
```

### 如何生成 PowerTop 的 HTML 报告

运行如下命令生成 PowerTop 的 HTML 报告。

```
$ sudo powertop --html=powertop.html
modprobe cpufreq_stats failedLoaded 100 prior measurements
Cannot load from file /var/cache/powertop/saved_parameters.powertop
File will be loaded after taking minimum number of measurement(s) with battery only
RAPL device for cpu 0
RAPL Using PowerCap Sysfs : Domain Mask f
RAPL device for cpu 0
RAPL Using PowerCap Sysfs : Domain Mask f
Devfreq not enabled
glob returned GLOB_ABORTED
Cannot load from file /var/cache/powertop/saved_parameters.powertop
File will be loaded after taking minimum number of measurement(s) with battery only
Preparing to take measurements
To show power estimates do 182 measurement(s) connected to battery only
Taking 1 measurement(s) for a duration of 20 second(s) each.
PowerTOP outputing using base filename powertop.html
```

打开 `file:///home/daygeek/powertop.html` 文件以访问生成的 PowerTOP 的 HTML 报告。

<img src="content_image/album_201902_21_235344kts8h8bkk7gt8cgg.jpg" alt="" title="">

### 自动调整模式

这个功能可以将所有可调整选项从 BAD 设置为 GOOD，这可以提升 Linux 中的笔记本电池寿命。

```
$ sudo powertop --auto-tune
modprobe cpufreq_stats failedLoaded 210 prior measurements
Cannot load from file /var/cache/powertop/saved_parameters.powertop
File will be loaded after taking minimum number of measurement(s) with battery only
RAPL device for cpu 0
RAPL Using PowerCap Sysfs : Domain Mask f
RAPL device for cpu 0
RAPL Using PowerCap Sysfs : Domain Mask f
Devfreq not enabled
glob returned GLOB_ABORTED
Cannot load from file /var/cache/powertop/saved_parameters.powertop
File will be loaded after taking minimum number of measurement(s) with battery only
To show power estimates do 72 measurement(s) connected to battery only
Leaving PowerTOP
```

---

via: <https://www.2daygeek.com/powertop-monitors-laptop-battery-usage-linux/>

作者：[Vinoth Kumar](https://www.2daygeek.com/author/vinoth/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


开始使用 LogicalDOC 吧，一个开源文档管理系统

# 开始使用 LogicalDOC 吧，一个开源文档管理系统

>
> 使用 LogicalDOC 更好地跟踪文档版本，这是我们开源工具系列中的第 12 个工具，它将使你在 2019 年更高效。
>
>
>

每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心，渴望开启新的一年，当然，“抛弃旧的，拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件，但事实上并不用这样。

这是我挑选出的 19 个新的（或者对你而言新的）开源工具中的第 12 个工具来帮助你在 2019 年更有效率。

### LogicalDOC

高效部分表现在能够在你需要时找到你所需的东西。我们都看到过塞满名称类似的文件的目录，这是每次更改文档时为了跟踪所有版本而重命名这些文件而导致的。例如，我的妻子是一名作家，她在将文档发送给审稿人之前，她经常使用新名称保存文档修订版。

程序员对此一个自然的解决方案是 Git 或者其他版本控制器，但这个不适用于文档作者，因为用于代码的系统通常不能很好地兼容商业文本编辑器使用的格式。之前有人说，“改变格式就行”，[这不是适合每个人的选择](http://www.antipope.org/charlie/blog-static/2013/10/why-microsoft-word-must-die.html)。同样，许多版本控制工具对于非技术人员来说并不是非常友好。在大型组织中，有一些工具可以解决此问题，但它们还需要大型组织的资源来运行、管理和支持它们。

[LogicalDOC CE](https://www.logicaldoc.com/download-logicaldoc-community) 是为解决此问题而编写的开源文档管理系统。它允许用户签入、签出、查看版本、搜索和锁定文档，并保留版本历史记录，类似于程序员使用的版本控制工具。

LogicalDOC 可在 Linux、MacOS 和 Windows 上[安装](https://docs.logicaldoc.com/en/installation)，使用基于 Java 的安装程序。在安装时，系统将提示你提供数据库存储位置，并提供只在本地文件存储的选项。你将获得访问服务器的 URL 和默认用户名和密码，以及保存用于自动安装脚本选项。

登录后，LogicalDOC 的默认页面会列出你已标记、签出的文档以及有关它们的最新说明。切换到“文档”选项卡将显示你有权访问的文件。你可以在界面中选择文件或使用拖放来上传文档。如果你上传 ZIP 文件，LogicalDOC 会解压它，并将其中的文件添加到仓库中。

右键单击文件将显示一个菜单选项，包括检出文件、锁定文件以防止更改，以及执行大量其他操作。签出文件会将其下载到本地计算机以便编辑。在重新签入之前，其他任何人都无法修改签出的文件。当重新签入文件时（使用相同的菜单），用户可以向版本添加标签，并且需要备注对其执行的操作。

查看早期版本只需在“版本”页面下载就行。对于某些第三方服务，它还有导入和导出选项，内置 [Dropbox](https://dropbox.com) 支持。

文档管理不仅仅是能够负担得起昂贵解决方案的大公司才能有的。LogicalDOC 可帮助你追踪文档的版本历史，并为难以管理的文档提供了安全的仓库。

---

via: <https://opensource.com/article/19/1/productivity-tool-logicaldoc>

作者：[Kevin Sonney](https://opensource.com/users/ksonney "Kevin Sonney") 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何列出 Ubuntu 和 Debian 上已安装的软件包

# 如何列出 Ubuntu 和 Debian 上已安装的软件包

当你安装了 [Ubuntu 并想好好用一用](https://itsfoss.com/getting-started-with-ubuntu/)。但在将来某个时候，你肯定会遇到忘记曾经安装了那些软件包。

这个是完全正常。没有人要求你把系统里所有已安装的软件包都记住。但是问题是，如何才能知道已经安装了哪些软件包？如何查看安装过的软件包呢？

### 列出 Ubuntu 和 Debian 上已安装的软件包

如果你经常用 [apt 命令](https://itsfoss.com/apt-command-guide/)，你可能觉得会有个命令像 `apt` 一样可以列出已安装的软件包。不算全错。

[apt-get 命令](https://itsfoss.com/apt-get-linux-guide/) 没有类似列出已安装软件包的简单的选项，但是 `apt` 有一个这样的命令：

```
apt list --installed
```

这个会显示使用 `apt` 命令安装的所有的软件包。同时也会包含由于依赖而被安装的软件包。也就是说不仅会包含你曾经安装的程序，而且会包含大量库文件和间接安装的软件包。

*用 atp 命令列出显示已安装的软件包*

由于列出出来的已安装的软件包太多，用 `grep` 过滤特定的软件包是一个比较好的办法。

```
apt list --installed | grep program_name
```

如上命令也可以检索出使用 .deb 软件包文件安装的软件。是不是很酷？

如果你阅读过 [apt 与 apt-get 对比](https://itsfoss.com/apt-vs-apt-get-difference/)的文章，你可能已经知道 `apt` 和 `apt-get` 命令都是基于 [dpkg](https://wiki.debian.org/dpkg)。也就是说用 `dpkg` 命令可以列出 Debian 系统的所有已经安装的软件包。

```
dpkg-query -l
```

你可以用 `grep` 命令检索指定的软件包。

!

*用 dpkg 命令列出显示已经安装的软件包*

现在你可以搞定列出 Debian 的软件包管理器安装的应用了。那 Snap 和 Flatpak 这个两种应用呢？如何列出它们？因为它们不能被 `apt` 和 `dpkg` 访问。

显示系统里所有已经安装的 [Snap 软件包](https://itsfoss.com/use-snap-packages-ubuntu-16-04/)，可以这个命令：

```
snap list
```

Snap 可以用绿色勾号标出哪个应用来自经过认证的发布者。

*列出已经安装的 Snap 软件包*

显示系统里所有已安装的 [Flatpak 软件包](https://itsfoss.com/flatpak-guide/)，可以用这个命令：

```
flatpak list
```

让我来个汇总：

用 `apt` 命令显示已安装软件包：

```
apt list –installed
```

用 `dpkg` 命令显示已安装软件包:

```
dpkg-query -l
```

列出系统里 Snap 已安装软件包:

```
snap list
```

列出系统里 Flatpak 已安装软件包:

```
flatpak list
```

### 显示最近安装的软件包

现在你已经看过以字母顺序列出的已经安装软件包了。如何显示最近已经安装的软件包?

幸运的是，Linux 系统保存了所有发生事件的日志。你可以参考最近安装软件包的日志。

有两个方法可以来做。用 `dpkg` 命令的日志或者 `apt` 命令的日志。

你仅仅需要用 `grep` 命令过滤已经安装的软件包日志。

```
grep " install " /var/log/dpkg.log
```

这会显示所有的软件安装包，其中包括最近安装的过程中所依赖的软件包。

```
2019-02-12 12:41:42 install ubuntu-make:all 16.11.1ubuntu1
2019-02-13 21:03:02 install xdg-desktop-portal:amd64 0.11-1
2019-02-13 21:03:02 install libostree-1-1:amd64 2018.8-0ubuntu0.1
2019-02-13 21:03:02 install flatpak:amd64 1.0.6-0ubuntu0.1
2019-02-13 21:03:02 install xdg-desktop-portal-gtk:amd64 0.11-1
2019-02-14 11:49:10 install qml-module-qtquick-window2:amd64 5.9.5-0ubuntu1.1
2019-02-14 11:49:10 install qml-module-qtquick2:amd64 5.9.5-0ubuntu1.1
2019-02-14 11:49:10 install qml-module-qtgraphicaleffects:amd64 5.9.5-0ubuntu1
```

你也可以查看 `apt` 历史命令日志。这个仅会显示用 `apt` 命令安装的的程序。但不会显示被依赖安装的软件包，详细的日志在日志里可以看到。有时你只是想看看对吧？

```
grep " install " /var/log/apt/history.log
```

具体的显示如下：

```
Commandline: apt install pinta
Commandline: apt install pinta
Commandline: apt install tmux
Commandline: apt install terminator
Commandline: apt install moreutils
Commandline: apt install ubuntu-make
Commandline: apt install flatpak
Commandline: apt install cool-retro-term
Commandline: apt install ubuntu-software
```

*显示最近已安装的软件包*

`apt` 的历史日志非常有用。因为他显示了什么时候执行了 `apt` 命令，哪个用户执行的命令以及安装的软件包名。

### 小技巧：在软件中心显示已安装的程序包名

如果你觉得终端和命令行交互不友好，还有一个方法可以查看系统的程序名。

可以打开软件中心，然后点击已安装标签。你可以看到系统上已经安装的程序包名

*在软件中心显示已安装的软件包*

这个不会显示库和其他命令行的东西，有可能你也不想看到它们，因为你的大量交互都是在 GUI。此外，你也可以用 Synaptic 软件包管理器。

### 结束语

我希望这个简易的教程可以帮你查看 Ubuntu 和基于 Debian 的发行版的已安装软件包。

如果你对本文有什么问题或建议，请在下面留言。

---

via: <https://itsfoss.com/list-installed-packages-ubuntu>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[guevaraya](https://github.com/guevaraya) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


5 个好用的开发者 Vim 插件

Summary: 通过这 5 个插件扩展 Vim 功能来提升你的编码效率。

通过这 5 个插件扩展 Vim 功能来提升你的编码效率。

# 5 个好用的开发者 Vim 插件

>
> 通过这 5 个插件扩展 Vim 功能来提升你的编码效率。
>
>
>

<img src="content_image/album_201902_23_111135wos7r6mssyzrtoxl.jpg" alt="" title="">

我用 Vim 已经超过 20 年了，两年前我决定把它作为我的首要文本编辑器。我用 Vim 来编写代码、配置文件、博客文章及其它任意可以用纯文本表达的东西。Vim 有很多超级棒的功能，一旦你适合了它，你的工作会变得非常高效。

在日常编辑工作中，我更倾向于使用 Vim 稳定的原生功能，但开源社区对 Vim 开发了大量的插件，可以扩展 Vim 的功能、改进你的工作流程和提升工作效率。

以下列举 5 个非常好用的可以用于编写任意编程语言的插件。

### 1、Auto Pairs

[Auto Pairs](https://www.vim.org/scripts/script.php?script_id=3599) 插件可以帮助你插入和删除成对的文字，如花括号、圆括号或引号。这在编写代码时非常有用，因为很多编程语言都有成对标记的语法，就像圆括号用于函数调用，或引号用于字符串定义。

Auto Pairs 最基本的功能是在你输入一个左括号时会自动补全对应的另一半括号。比如，你输入了一个 `[`，它会自动帮你补充另一半 `]`。相反，如果你用退格键删除开头的一半括号，Auto Pairs 会删除另一半。

如果你设置了自动缩进，当你按下回车键时 Auto Pairs 会在恰当的缩进位置补全另一半括号，这比你找到放置另一半的位置并选择一个正确的括号要省劲多了。

例如下面这段代码：

```
package main

import "fmt"

func main() {
    x := true
    items := []string{"tv", "pc", "tablet"}

    if x {
        for _, i := range items
    }
}
```

在 `items` 后面输入一个左花括号按下回车会产生下面的结果：

```
package main

import "fmt"

func main() {
    x := true
    items := []string{"tv", "pc", "tablet"}

    if x {
        for _, i := range items  {
            | (cursor here)
        }
    }
}
```

Auto Pairs 提供了大量其它选项（你可以在 [GitHub](https://github.com/jiangmiao/auto-pairs) 上找到），但最基本的功能已经很让人省时间了。

### 2、NERD Commenter

[NERD Commenter](https://github.com/scrooloose/nerdcommenter) 插件给 Vim 增加了代码注释的功能，类似在 <ruby> IDE <rt>  integrated development environment </rt></ruby> 中注释功能。有了这个插件，你可以一键注释单行或多行代码。

NERD Commenter 可以与标准的 Vim [filetype](http://vim.wikia.com/wiki/Filetype.vim) 插件配合，所以它能理解一些编程语言并使用合适的方式来注释代码。

最易上手的方法是按 `Leader+Space` 组合键来切换注释当前行。Vim 默认的 Leader 键是 `\`。

在<ruby> 可视化模式 <rt>  Visual mode </rt></ruby>中，你可以选择多行一并注释。NERD Commenter 也可以按计数注释，所以你可以加个数量 n 来注释 n 行。

还有个有用的特性 “Sexy Comment” 可以用 `Leader+cs` 来触发，它的块注释风格更漂亮一些。例如下面这段代码：

```
package main

import "fmt"

func main() {
    x := true
    items := []string{"tv", "pc", "tablet"}

    if x {
        for _, i := range items {
            fmt.Println(i)
        }
    }
}
```

选择 `main` 函数中的所有行然后按下 `Leader+cs` 会出来以下注释效果：

```
package main

import "fmt"

func main() {
/*
 *    x := true
 *    items := []string{"tv", "pc", "tablet"}
 *
 *    if x {
 *        for _, i := range items {
 *            fmt.Println(i)
 *        }
 *    }
 */
}
```

因为这些行都是在一个块中注释的，你可以用 `Leader+Space` 组合键一次去掉这里所有的注释。

NERD Commenter 是任何使用 Vim 写代码的开发者都必装的插件。

### 3、VIM Surround

[Vim Surround](https://www.vim.org/scripts/script.php?script_id=1697) 插件可以帮你“环绕”现有文本插入成对的符号（如括号或双引号）或标签（如 HTML 或 XML 标签）。它和 Auto Pairs 有点儿类似，但是用于处理已有文本，在编辑文本时更有用。

比如你有以下一个句子：

```
"Vim plugins are awesome !"
```

当你的光标处于引起来的句中任何位置时，你可以用 `ds"` 组合键删除句子两端的双引号。

```
Vim plugins are awesome !
```

你也可以用 `cs"'` 把双端的双引号换成单引号：

```
'Vim plugins are awesome !'
```

或者再用 `cs'[` 替换成中括号：

```
[ Vim plugins are awesome ! ]
```

它对编辑 HTML 或 XML 文本中的<ruby> 标签 <rt>  tag </rt></ruby>尤其在行。假如你有以下一行 HTML 代码：

```
<p>Vim plugins are awesome !</p>
```

当光标在 “awesome” 这个单词的任何位置时，你可以按 `ysiw<em>` 直接给它加上着重标签（`<em>`）：

```
<p>Vim plugins are <em>awesome</em> !</p>
```

注意它聪明地加上了 `</em>` 闭合标签。

Vim Surround 也可以用 `ySS` 缩进文本并加上标签。比如你有以下文本：

```
<p>Vim plugins are <em>awesome</em> !</p>
```

你可以用 `ySS<div class="normal">` 加上 `div` 标签，注意生成的段落是自动缩进的。

```
<div class="normal">
        <p>Vim plugins are <em>awesome</em> !</p>
</div>
```

Vim Surround 有很多其它选项，你可以参照 [GitHub](https://github.com/tpope/vim-surround) 上的说明尝试它们。

### 4、Vim Gitgutter

[Vim Gitgutter](https://github.com/airblade/vim-gitgutter) 插件对使用 Git 作为版本控制工具的人来说非常有用。它会在 Vim 的行号列旁显示 `git diff` 的差异标记。假设你有如下已提交过的代码：

```
  1 package main
  2
  3 import "fmt"
  4
  5 func main() {
  6     x := true
  7     items := []string{"tv", "pc", "tablet"}
  8
  9     if x {
 10         for _, i := range items {
 11             fmt.Println(i)
 12         }
 13     }
 14 }
```

当你做出一些修改后，Vim Gitgutter 会显示如下标记：

```
    1 package main
    2
    3 import "fmt"
    4
_   5 func main() {
    6     items := []string{"tv", "pc", "tablet"}
    7
~   8     if len(items) > 0 {
    9         for _, i := range items {
   10             fmt.Println(i)
+  11             fmt.Println("------")
   12         }
   13     }
   14 }
```

`_` 标记表示在第 5 行和第 6 行之间删除了一行。`~` 表示第 8 行有修改，`+` 表示新增了第 11 行。

另外，Vim Gitgutter 允许你用 `[c` 和 `]c` 在多个有修改的块之间跳转，甚至可以用 `Leader+hs` 来暂存某个变更集。

这个插件提供了对变更的即时视觉反馈，如果你用 Git 的话，有了它简直是如虎添翼。

### 5、VIM Fugitive

[Vim Fugitive](https://www.vim.org/scripts/script.php?script_id=2975) 是另一个将 Git 工作流集成到 Vim 中的超棒插件。它对 Git 做了一些封装，可以让你在 Vim 里直接执行 Git 命令并将结果集成在 Vim 界面里。这个插件有超多的特性，更多信息请访问它的 [GitHub](https://github.com/tpope/vim-fugitive) 项目页面。

这里有一个使用 Vim Fugitive 的基础 Git 工作流示例。设想我们已经对下面的 Go 代码做出修改，你可以用 `:Gblame` 调用 `git blame` 来查看每行最后的提交信息：

```
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│    1 package main
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│    2
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│    3 import "fmt"
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│    4
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│_   5 func main() {
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│    6     items := []string{"tv", "pc", "tablet"}
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│    7
00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│~   8     if len(items) > 0 {
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│    9         for _, i := range items {
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│   10             fmt.Println(i)
00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│+  11             fmt.Println("------")
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│   12         }
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│   13     }
e9949066 (Ricardo Gerardi   2018-12-05 18:17:19 -0500)│   14 }
```

可以看到第 8 行和第 11 行显示还未提交。用 `:Gstatus` 命令检查仓库当前的状态：

```
  1 # On branch master
  2 # Your branch is up to date with 'origin/master'.
  3 #
  4 # Changes not staged for commit:
  5 #   (use "git add <file>..." to update what will be committed)
  6 #   (use "git checkout -- <file>..." to discard changes in working directory)
  7 #
  8 #       modified:   vim-5plugins/examples/test1.go
  9 #
 10 no changes added to commit (use "git add" and/or "git commit -a")
--------------------------------------------------------------------------------------------------------
    1 package main
    2
    3 import "fmt"
    4
_   5 func main() {
    6     items := []string{"tv", "pc", "tablet"}
    7
~   8     if len(items) > 0 {
    9         for _, i := range items {
   10             fmt.Println(i)
+  11             fmt.Println("------")
   12         }
   13     }
   14 }
```

Vim Fugitive 在分割的窗口里显示 `git status` 的输出结果。你可以在该行按下 `-` 键用该文件的名字暂存这个文件的提交，再按一次 `-` 可以取消暂存。这个信息会随着你的操作自动更新：

```
  1 # On branch master
  2 # Your branch is up to date with 'origin/master'.
  3 #
  4 # Changes to be committed:
  5 #   (use "git reset HEAD <file>..." to unstage)
  6 #
  7 #       modified:   vim-5plugins/examples/test1.go
  8 #
--------------------------------------------------------------------------------------------------------
    1 package main
    2
    3 import "fmt"
    4
_   5 func main() {
    6     items := []string{"tv", "pc", "tablet"}
    7
~   8     if len(items) > 0 {
    9         for _, i := range items {
   10             fmt.Println(i)
+  11             fmt.Println("------")
   12         }
   13     }
   14 }
```

现在你可以用 `:Gcommit` 来提交修改了。Vim Fugitive 会打开另一个分割窗口让你输入提交信息：

```
  1 vim-5plugins: Updated test1.go example file
  2 # Please enter the commit message for your changes. Lines starting
  3 # with '#' will be ignored, and an empty message aborts the commit.
  4 #
  5 # On branch master
  6 # Your branch is up to date with 'origin/master'.
  7 #
  8 # Changes to be committed:
  9 #       modified:   vim-5plugins/examples/test1.go
 10 #
```

按 `:wq` 保存文件完成提交：

```
[master c3bf80f] vim-5plugins: Updated test1.go example file
 1 file changed, 2 insertions(+), 2 deletions(-)
Press ENTER or type command to continue
```

然后你可以再用 `:Gstatus` 检查结果并用 `:Gpush` 把新的提交推送到远程。

```
  1 # On branch master
  2 # Your branch is ahead of 'origin/master' by 1 commit.
  3 #   (use "git push" to publish your local commits)
  4 #
  5 nothing to commit, working tree clean
```

Vim Fugitive 的 GitHub 项目主页有很多屏幕录像展示了它的更多功能和工作流，如果你喜欢它并想多学一些，快去看看吧。

### 接下来？

这些 Vim 插件都是程序开发者的神器！还有另外两类开发者常用的插件：自动完成插件和语法检查插件。它些大都是和具体的编程语言相关的，以后我会在一些文章中介绍它们。

你在写代码时是否用到一些其它 Vim 插件？请在评论区留言分享。

---

via: <https://opensource.com/article/19/1/vim-plugins-developers>

作者：[Ricardo Gerardi](https://opensource.com/users/rgerardi) 选题：[lujun9972](https://github.com/lujun9972) 译者：[pityonline](https://github.com/pityonline) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Emacs 中使用 Magit 管理 Git 项目

# 如何在 Emacs 中使用 Magit 管理 Git 项目

>
> Emacs 的 Magit 扩展插件使得使用 Git 进行版本控制变得简单起来。
>
>
>

[Git](https://git-scm.com) 是一个很棒的用于项目管理的 [版本控制](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control) 工具，就是新人学习起来太难。Git 的命令行工具很难用，你不仅需要熟悉它的标志和选项，还需要知道什么环境下使用它们。这使人望而生畏，因此不少人只会非常有限的几个用法。

好在，现今大多数的集成开发环境 (IDE) 都包含了 Git 扩展，大大地简化了使用使用的难度。Emacs 中就有这么一款 Git 扩展名叫 [Magit](https://magit.vc)。

Magit 项目成立有差不多 10 年了，它将自己定义为 “一件 Emacs 内的 Git 瓷器”。也就是说，它是一个操作界面，每个操作都能一键完成。本文会带你领略一下 Magit 的操作界面并告诉你如何使用它来管理 Git 项目。

若你还没有做，请在开始本教程之前先 [安装 Emacs](https://www.gnu.org/software/emacs/download.html)，再 [安装 Magit](https://magit.vc/manual/magit/Installing-from-Melpa.html#Installing-from-Melpa)。

### Magit 的界面

首先用 Emacs 的 [Dired 模式](https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired-Enter.html#Dired-Enter) 访问一个项目的目录。比如我所有的 Emacs 配置存储在 `~/.emacs.d/` 目录中，就是用 Git 来进行管理的。

若你在命令行下工作，则你需要输入 `git status` 来查看项目的当前状态。Magit 也有类似的功能：`magit-status`。你可以通过 `M-x magit-status` （快捷方式是 `Alt+x magit-status` ）来调用该功能。结果看起来像下面这样：

Magit 显示的信息比 `git status` 命令的要多得多。它分别列出了未追踪文件列表、未暂存文件列表以及已暂存文件列表。它还列出了<ruby> 储藏 <rt>  stash </rt></ruby>列表以及最近几次的提交 —— 所有这些信息都在一个窗口中展示。

如果你想查看修改了哪些内容，按下 `Tab` 键。比如，我移动光标到未暂存的文件 `custom_functions.org` 上，然后按下 `Tab` 键，Magit 会显示修改了哪些内容：

这跟运行命令 `git diff custom_functions.org` 类似。储藏文件更简单。只需要移动光标到文件上然后按下 `s` 键。该文件就会迅速移动到已储藏文件列表中：

要<ruby> 反储藏 <rt>  unstage </rt></ruby>某个文件，使用 `u` 键。按下 `s` 和 `u` 键要比在命令行输入 `git add -u <file>` 和 `git reset HEAD <file>` 快的多也更有趣的多。

### 提交更改

在同一个 Magit 窗口中，按下 `c` 键会显示一个提交窗口，其中提供了许多标志，比如 `--all` 用来暂存所有文件或者 `--signoff` 来往提交信息中添加签名行。

将光标移动到想要启用签名标志的行，然后按下回车。`--signoff` 文本会变成高亮，这说明该标志已经被启用。

再次按下 `c` 键会显示一个窗口供你输入提交信息。

最后，使用 `C-c C-c`(按键 `Ctrl+cc` 的缩写形式) 来提交更改。

### 推送更改

更改提交后，提交行将会显示在 `Recent commits` 区域中显示。

将光标放到该提交处然后按下 `p` 来推送该变更。

若你想感受一下使用 Magit 的感觉，我已经在 YouTube 上传了一段 [演示](https://youtu.be/Vvw75Pqp7Mc)。本文只涉及到 Magit 的一点皮毛。它有许多超酷的功能可以帮你使用 Git 分支、变基等功能。你可以在 Magit 的主页上找到 [文档、支持，以及更多](https://magit.vc/) 的链接。

---

via: <https://opensource.com/article/19/1/how-use-magit>

作者：[Sachin Patil](https://opensource.com/users/psachin) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lujun9972](https://github.com/lujun9972) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


书评：《Linux 基础》

鸟哥的私房菜第四版

鸟哥的私房菜第四版

私房菜好

来自四川成都的 Chrome Mobile 57.0|Android 7.0 用户

# 书评：《Linux 基础》

介绍 Linux 的基础知识以及它的工作原理的书很多，今天，我们将会点评这样一本书。这次讨论的主题为 Oliver Pelz 所写的 《<ruby>   Linux 基础  <rt>  Fundamentals of Linux </rt></ruby>》，由 [PacktPub](https://www.packtpub.com/) 出版。

[Oliver Pelz](http://www.oliverpelz.de/index.html) 是一位拥有超过十年软件开发经验的开发者和系统管理员，拥有生物信息学学位证书。

### 《Linux 基础》

正如可以从书名中猜到那样，《Linux 基础》的目标是为读者打下一个从了解 Linux 到学习 Linux 命令行的坚实基础。这本书一共有两百多页，因此它专注于教给用户日常任务和解决经常遇到的问题。本书是为想要成为 Linux 管理员的读者而写的。

第一章首先概述了虚拟化。本书作者指导了读者如何在 [VirtualBox](https://www.virtualbox.org/) 中创建 [CentOS](https://centos.org/) 实例。如何克隆实例，如何使用快照。并且同时你也会学习到如何通过 SSH 命令连接到虚拟机。

第二章介绍了 Linux 命令行的基础知识，包括 shell 通配符，shell 展开，如何使用包含空格和特殊字符的文件名称。如何来获取命令手册的帮助页面。如何使用 `sed`、`awk` 这两个命令。如何浏览 Linux 的文件系统。

第三章更深入的介绍了 Linux 文件系统。你将了解如何在 Linux 中文件是如何链接的，以及如何搜索它们。你还将获得用户、组，以及文件权限的大概了解。由于本章的重点介绍了如何与文件进行交互。因此还将会介绍如何从命令行中读取文本文件，以及初步了解如何使用 vim 编辑器。

第四章重点介绍了如何使用命令行。以及涵盖的重要命令。如 `cat`、`sort`、`awk`、`tee`、`tar`、`rsync`、`nmap`、`htop` 等。你还将会了解到进程，以及它们如何彼此通讯。这一章还介绍了 Bash shell 脚本编程。

第五章同时也是本书的最后一章，将会介绍 Linux 和其他高级命令，以及网络的概念。本书的作者讨论了 Linux 是如何处理网络，并提供使用多个虚拟机的示例。同时还将会介绍如何安装新的程序，如何设置防火墙。

### 关于这本书的思考

Linux 的基础知识只有五章和少少的 200 来页可能看起来有些短，但是也涵盖了相当多的信息。同时也将会获得如何使用命令行所需要的知识的一切。

使用本书的时候，需要注意一件事情，即，本书专注于对命令行的关注，没有任何关于如何使用图形化的用户界面的任何教程。这是因为在 Linux 中有太多不同的桌面环境，以及很多的类似的系统应用，因此很难编写一本可以涵盖所有变种的书。此外，还有部分原因还因为本书的面向的用户群体为潜在的 Linux 管理员。

当我看到作者使用 Centos 教授 Linux 的时候有点惊讶。我原本以为他会使用更为常见的 Linux 的发行版本，例如 Ubuntu、Debian 或者 Fedora。原因在于 Centos 是为服务器设计的发行版本。随着时间的推移变化很小，能够为 Linux 的基础知识打下一个非常坚实的基础。

我自己使用 Linux 已经操作五年了。我大部分时间都在使用桌面版本的 Linux。我有些时候会使用命令行操作。但我并没有花太多的时间在那里。我使用鼠标完成了本书中涉及到的很多操作。现在呢。我同时也知道了如何通过终端做到同样的事情。这种方式不会改变我完成任务的方式，但是会有助于自己理解幕后发生的事情。

如果你刚刚使用 Linux，或者计划使用。我不会推荐你阅读这本书。这可能有点绝对化。但是如何你已经花了一些时间在 Linux 上。或者可以快速掌握某种技术语言。那么这本书很适合你。

如果你认为本书适合你的学习需求。你可以从以下链接获取到该书：

* [下载《Linux 基础》](https://www.packtpub.com/networking-and-servers/fundamentals-linux)

我们将在未来几个月内尝试点评更多 Linux 书籍，敬请关注我们。

你最喜欢的关于 Linux 的入门书籍是什么？请在下面的评论中告诉我们。

如果你发现这篇文章很有趣，请花一点时间在社交媒体、Hacker News或 [Reddit](http://reddit.com/r/linuxusersgroup) 上分享。

---

via: <https://itsfoss.com/fundamentals-of-linux-book-review>

作者：[John Paul](https://itsfoss.com/author/john/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[mySoul8012](https://github.com/mySoul8012) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


量子计算会打破现有的安全体系吗？

Summary: 你会希望某黑客假冒你的银行吗？

cool

Dakanwang [Opera Mobile 50.2|Android 8.1]

你会希望某黑客假冒你的银行吗？

# 量子计算会打破现有的安全体系吗？

>
> 你会希望<ruby>   某黑客  <rt>  J. Random Hacker </rt></ruby>假冒你的银行吗？
>
>
>

近年来，<ruby> 量子计算机 <rt>  quantum computer </rt></ruby>已经出现在大众的视野当中。量子计算机被认为是第六类计算机，这六类计算机包括：

1. <ruby> 人力 <rt>  Humans </rt></ruby>：在人造的计算工具出现之前，人类只能使用人力去进行计算。而承担计算工作的人，只能被称为“计算者”。
2. <ruby> 模拟计算工具 <rt>  Mechanical analogue </rt></ruby>：由人类制造的一些模拟计算过程的小工具，例如<ruby>   安提凯希拉装置  <rt>  Antikythera mechanism </rt></ruby>、<ruby> 星盘 <rt>  astrolabe </rt></ruby>、<ruby> 计算尺 <rt>  slide rule </rt></ruby>等等。
3. <ruby> 机械工具 <rt>  Mechanical digital </rt></ruby>：在这一个类别中包括了运用到离散数学但未使用电子技术进行计算的工具，例如<ruby> 算盘 <rt>  abacus </rt></ruby>、Charles Babbage 的<ruby> 差分机 <rt>  Difference Engine </rt></ruby>等等。
4. <ruby> 电子模拟计算工具 <rt>  Electronic analogue </rt></ruby>：这一个类别的计算机多数用于军事方面的用途，例如炸弹瞄准器、枪炮瞄准装置等等。
5. <ruby> 电子计算机 <rt>  Electronic digital </rt></ruby>：我在这里会稍微冒险一点，我觉得 Colossus 是第一台电子计算机，   1  ：这一类几乎包含现代所有的电子设备，从移动电话到超级计算机，都在这个类别当中。
6. <ruby> 量子计算机 <rt>  Quantum computer </rt></ruby>：即将进入我们的生活，而且与之前的几类完全不同。

### 什么是量子计算？

<ruby> 量子计算 <rt>  Quantum computing </rt></ruby>的概念来源于<ruby> 量子力学 <rt>  quantum mechanics </rt></ruby>，使用的计算方式和我们平常使用的普通计算非常不同。如果想要深入理解，建议从参考[维基百科上的定义](https://en.wikipedia.org/wiki/Quantum_computing)开始。对我们来说，最重要的是理解这一点：量子计算机使用<ruby> 量子位 <rt>  qubit </rt></ruby>进行计算。在这样的前提下，对于很多数学算法和运算操作，量子计算机的计算速度会比普通计算机要快得多。

这里的“快得多”是按数量级来说的“快得多”。在某些情况下，一个计算任务如果由普通计算机来执行，可能要耗费几年或者几十年才能完成，但如果由量子计算机来执行，就只需要几秒钟。这样的速度甚至令人感到可怕。因为量子计算机会非常擅长信息的加密解密计算，即使在没有密钥的情况下，也能快速完成繁重的计算任务。

这意味着，如果拥有足够强大的量子计算机，那么你的所有信息都会被一览无遗，任何被加密的数据都可以被正确解密出来，甚至伪造数字签名也会成为可能。这确实是一个严重的问题。谁也不想被某个黑客冒充成自己在用的银行，更不希望自己在区块链上的交易被篡改得面目全非。

### 好消息

尽管上面的提到的问题非常可怕，但也不需要太担心。

首先，如果要实现上面提到的能力，一台可以操作大量量子位的量子计算机是必不可少的，而这个硬件上的要求就是一个很高的门槛。   2  目前普遍认为，规模大得足以有效破解经典加密算法的量子计算机在最近几年还不可能出现。

其次，除了攻击现有的加密算法需要大量的量子位以外，还需要很多量子位来保证容错性。

还有，尽管确实有一些理论上的模型阐述了量子计算机如何对一些现有的算法作出攻击，但是要让这样的理论模型实际运作起来的难度会比我们   3  想象中大得多。事实上，有一些攻击手段也是未被完全确认是可行的，又或者这些攻击手段还需要继续耗费很多年的改进才能到达如斯恐怖的程度。

最后，还有很多专业人士正在研究能够防御量子计算的算法（这样的算法也被称为“<ruby> 后量子算法 <rt>  post-quantum algorithms </rt></ruby>”）。如果这些防御算法经过测试以后投入使用，我们就可以使用这些算法进行加密，来对抗量子计算了。

总而言之，很多专家都认为，我们现有的加密方式在未来 5 年甚至未来 10 年内都是安全的，不需要过分担心。

### 也有坏消息

但我们也并不是高枕无忧了，以下两个问题就值得我们关注：

1. 人们在设计应用系统的时候仍然没有对量子计算作出太多的考量。如果设计的系统可能会使用 10 年以上，又或者数据加密和签名的时间跨度在 10 年以上，那么就必须考虑量子计算在未来会不会对系统造成不利的影响。
2. 新出现的防御量子计算的算法可能会是专有的。也就是说，如果基于这些防御量子计算的算法来设计系统，那么在系统落地的时候，可能会需要为此付费。尽管我是支持开源的，尤其是[开源密码学](https://opensource.com/article/17/10/many-eyes)，但我最担心的就是无法开源这方面的内容。而且最糟糕的是，在建立新的协议标准时（不管是事实标准还是通过标准组织建立的标准），无论是故意的，还是无意忽略，或者是没有好的开源替代品，他们都很可能使用专有算法而排除使用开源算法。

### 我们要怎样做？

幸运的是，针对上述两个问题，我们还是有应对措施的。首先，在整个系统的设计阶段，就需要考虑到它是否会受到量子计算的影响，并作出相应的规划。当然了，不需要现在就立即采取行动，因为当前的技术水平也没法实现有效的方案，但至少也要[在加密方面保持敏捷性](https://aliceevebob.com/2017/04/04/disbelieving-the-many-eyes-hypothesis/)，以便在任何需要的时候为你的协议和系统更换更有效的加密算法。   4

其次是参与开源运动。尽可能鼓励密码学方面的有识之士团结起来，支持开放标准，并投入对非专有的防御量子计算的算法研究当中去。这一点也算是当务之急，因为号召更多的人重视起来并加入研究，比研究本身更为重要。

本文首发于《[Alice, Eve, and Bob](https://aliceevebob.com/2019/01/08/will-quantum-computing-break-security/)》，并在作者同意下重新发表。

---

1. 我认为把它称为第一台电子可编程计算机是公平的。我知道有早期的非可编程的，也有些人声称是 ENIAC，但我没有足够的空间或精力在这里争论这件事。 [↩](#fnref1)
2. 如果量子物理学家说很难，那么在我看来，就很难。 [↩](#fnref2)
3. 而且我假设我们都不是量子物理学家或数学家。 [↩](#fnref3)
4. 而且不仅仅是出于量子计算的原因：我们现有的一些经典算法很可能会陷入其他非量子攻击，例如新的数学方法。 [↩](#fnref4)

---

via: <https://opensource.com/article/19/1/will-quantum-computing-break-security>

作者：[Mike Bursell](https://opensource.com/users/mikecamel) 选题：[lujun9972](https://github.com/lujun9972) 译者：[HankChow](https://github.com/HankChow) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


开始使用 gPodder 吧，一个开源播客客户端

都是半成品，一年半载之后就用不了了。

都是半成品，一年半载之后就用不了了。

# 开始使用 gPodder 吧，一个开源播客客户端

>
> 使用 gPodder 将你的播客同步到你的设备上，gPodder 是我们开源工具系列中的第 17 个工具，它将在 2019 年提高你的工作效率。
>
>
>

每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心，渴望开启新的一年，当然，“抛弃旧的，拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件，但事实上并不用这样。

这是我挑选出的 19 个新的（或者对你而言新的）开源工具中的第 17 个工具来帮助你在 2019 年更有效率。

### gPodder

我喜欢播客。哎呀，我非常喜欢它们，因此我录制了其中的三个（你可以在[我的个人资料](https://opensource.com/users/ksonney)中找到它们的链接）。我从播客那里学到了很多东西，并在我工作时在后台播放它们。但是，如何在多台桌面和移动设备之间保持同步可能会有一些挑战。

[gPodder](https://gpodder.github.io/) 是一个简单的跨平台播客下载器、播放器和同步工具。它支持 RSS feed、[FeedBurner](https://feedburner.google.com/)、[YouTube](https://youtube.com) 和 [SoundCloud](https://soundcloud.com/)，它还有一个开源的同步服务，你可以根据需要运行它。gPodder 不直接播放播客。相反，它会使用你选择的音频或视频播放器。

安装 gPodder 非常简单。安装程序适用于 Windows 和 MacOS，同时也有用于主要的 Linux 发行版的软件包。如果你的发行版中没有它，你可以直接从 Git 下载运行。通过 “Add Podcasts via URL” 菜单，你可以输入播客的 RSS 源 URL 或其他服务的 “特殊” URL。gPodder 将获取节目列表并显示一个对话框，你可以在其中选择要下载的节目或在列表上标记旧节目。

它一个更好的功能是，如果 URL 已经在你的剪贴板中，gPodder 会自动将它放入播放 URL 中，这样你就可以很容易地将新的播客添加到列表中。如果你已有播客 feed 的 OPML 文件，那么可以上传并导入它。还有一个发现选项，让你可搜索 [gPodder.net](http://gpodder.net) 上的播客，这是由编写和维护 gPodder 的人员提供的自由及开源的播客的列表网站。

[mygpo](https://github.com/gpodder/mygpo) 服务器在设备之间同步播客。gPodder 默认使用 [gPodder.net](http://gPodder.net) 的服务器，但是如果你想要运行自己的服务器，那么可以在配置文件中更改它（请注意，你需要直接修改配置文件）。同步能让你在桌面和移动设备之间保持列表一致。如果你在多个设备上收听播客（例如，我在我的工作电脑、家用电脑和手机上收听），这会非常有用，因为这意味着无论你身在何处，你都拥有最近的播客和节目列表而无需一次又一次地设置。

单击播客节目将显示与其关联的文本，单击“播放”将启动设备的默认音频或视频播放器。如果要使用默认之外的其他播放器，可以在 gPodder 的配置设置中更改此设置。

通过 gPodder，你可以轻松查找、下载和收听播客，在设备之间同步这些播客，在易于使用的界面中访问许多其他功能。

---

via: <https://opensource.com/article/19/1/productivity-tool-gpodder>

作者：[Kevin Sonney](https://opensource.com/users/ksonney "Kevin Sonney") 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出