分类 技术 下的文章

根据 JavaScript 框架的优点和主要特点对许多 JavaScript 框架进行细分。

 title=

大约十年前,JavaScript 社区开始见证一场 JavaScript 框架的激战。在本文中,我将介绍其中最著名的一些框架。值得注意的是,这些都是开源的 JavaScript 项目,这意味着你可以在 开源许可证 下自由地使用它们,甚至为它们的源代码和社区做出贡献。

不过,在开始之前,了解一些 JavaScript 开发者谈论框架时常用的术语,将对后续的内容大有裨益。

术语释义
文档对象模型(DOM)网站的树形结构表示,每一个节点都是代表网页一部分的对象。万维网联盟(W3C),是万维网的国际标准组织,维护着 DOM 的定义。
虚拟 DOM用户界面(UI)以“虚拟”或“理想”的方式保存在内存中,并通过 ReactDOM 等一些库与“真实” DOM 同步。要进一步探索,请阅读 ReactJS 的虚拟 DOM 和内部文档。
数据绑定一个编程概念,为访问网站上的数据提供一致的接口。Web 元素与 DOM 维护的元素的 属性 property 特性 attribute 相关联(LCTT 译注:根据 MDN 的解释,Javascript 的 属性 property 是对象的特征,通常描述与数据结构相关的特征; 特性 attribute 是指元素所有属性节点的一个实时集合)。例如,当需要在网页表单中填写密码时,数据绑定机制可以用密码验证逻辑检验,确保密码格式有效。

我们已经清楚了常用的术语,下面我们来探索一下开源的 JavaScript 框架有哪些。

框架简介许可证发布日期
ReactJS目前最流行的 JavaScript 框架,由 Facebook 创建MIT 许可证2013-5-24
AngularGoogle 创建的流行的 JavaScript 框架MIT 许可证2010-1-5
VueJS快速增长的 JavaScript 框架MIT 许可证2013-7-28
MeteorJS超乎于 JavaScript 框架的强大框架MIT 许可证2012-1-18
KnockoutJS开源的 MVVM( 模型-视图-视图模型 Model-View-ViewModel ) 框架MIT 许可证2010-7-5
EmberJS另一个开源的 MVVM 框架MIT 许可证2011-12-8
BackboneJS带有 RESTful JSON 和 模型-视图-主持人 Model-View-Presenter 模式的 JavaScript 框架MIT 许可证2010-9-30
Svelte不使用虚拟 DOM 的 JavaScript 开源框架MIT 许可证2016-11-20
AureliaJS现代 JavaScript 模块的集合MIT 许可证2018-2-14

为了说明情况,下面是每个框架的 NPM 包下载量的公开数据,感谢 npm trends

 title=

ReactJS

 title=

ReactJS 是由 Facebook 研发的,它虽然在 Angular 之后发布,但明显是当今 JavaScript 框架的领导者。React 引入了一个虚拟 DOM 的概念,这是一个抽象副本,开发者能在框架内仅使用他们想要的 ReactJS 功能,而无需重写整个项目。此外,React 项目活跃的开源社区无疑成为增长背后的主力军。下面是一些 React 的主要优势:

  • 合理的学习曲线 —— React 开发者可以轻松地创建 React 组件,而不需要重写整个 JavaScript 的代码。在 ReactJS 的 首页 查看它的优点以及它如何使编程更容易。
  • 高度优化的性能 —— React 的虚拟 DOM 的实现和其他功能提升了应用程序的渲染性能。请查看 ReactJS 的关于如何对其性能进行基准测试,并对应用性能进行衡量的相关 描述
  • 优秀的支持工具 —— ReduxThunkReselect 是构建良好、可调式代码的最佳工具。
  • 单向数据绑定 —— 模型使用 Reach 流,只从所有者流向子模块,这使得在代码中追踪因果关系更加简单。请在 ReactJS 的 数据绑定页 阅读更多相关资料。

谁在使用 ReactJS?Facebook 自从发明它,就大量使用 React 构建公司首页,据说 Instagram 完全基于 ReactJS 库。你可能会惊讶地发现,其他知名公司如 纽约时报Netflix可汗学院 也在他们的技术栈中使用了 ReactJS。

更令人惊讶的是 ReactJS 开发者的工作机会,正如在下面 Stackoverflow 所做的研究中看到的,嘿,你可以从事开源项目并获得报酬。这很酷!

 title=

Stackoverflow 的研究显示了对 ReactJS 开发者的巨大需求——来源:2017 年开发者招聘趋势——Stackoverflow 博客

ReactJS 的 GitHub 目前显示超过 13,000 次提交和 1,377 位贡献者。它是一个在 MIT 许可证下的开源项目。

 title=

Angular

 title=

就开发者数量来说,也许 React 是现在最领先的 JavaScript 框架,但是 Angular 紧随其后。事实上,开源开发者和初创公司更乐于选择 React,而较大的公司往往更喜欢 Angular(下面列出了一些例子)。主要原因是,虽然 Angular 可能更复杂,但它的统一性和一致性适用于大型项目。例如,在我整个职业生涯中一直研究 Angular 和 React,我观察到大公司通常认为 Angular 严格的结构是一种优势。下面是 Angular 的另外一些关键优势:

  • 精心设计的命令行工具 —— Angular 有一个优秀的命令行工具(CLI),可以轻松起步和使用 Angular 进行开发。ReactJS 提供命令行工具和其他工具,同时 Angular 有广泛的支持和出色的文档,你可以参见 这个页面
  • 单向数据绑定 —— 和 React 类似,单向数据绑定模型使框架受更少的不必要的副作用的影响。
  • 更好的 TypeScript 支持 —— Angular 与 TypeScript 有很好的一致性,它其实是 JavaScript 强制类型的拓展。它还可以转译为 JavaScript,强制类型是减少错误代码的绝佳选择。

像 YouTube、NetflixIBMWalmart 等知名网站,都已在其应用程序中采用了 Angular。我通过自学使用 Angular 来开始学习前端 JavaScript 开发。我参与了许多涉及 Angular 的个人和专业项目,但那是当时被称为 AngularJS 的 Angular 1.x。当 Google 决定将版本升级到 2.0 时,他们对框架进行了彻底的改造,然后变成了 Angular。新的 Angular 是对之前的 AngularJS 的彻底改造,这一举动带来了一部分新开发者也驱逐了一部分原有的开发者。

截止到撰写本文,Angular 的 GitHub 页面显示 17,781 次提交和 1,133 位贡献者。它也是一个遵循 MIT 许可证的开源项目,因此你可以自由地在你的项目或贡献中使用。

 title=

VueJS

 title=

VueJS 是一个非常有趣的框架。它是 JavaScript 框架领域的新来者,但是在过去几年里它的受欢迎程度显著增加。VueJS 由 尤雨溪 创建,他是曾参与过 Angular 项目的谷歌工程师。该框架现在变得如此受欢迎,以至于许多前端工程师更喜欢 VueJS 而不是其他 JavaScript 框架。下图描述了该框架随着时间的推移获得关注的速度。

 title=

这里有一些 VueJS 的主要优点:

  • 更容易地学习曲线 —— 与 Angular 或 React 相比,许多前端开发者都认为 VueJS 有更平滑的学习曲线。
  • 小体积 —— 与 Angular 或 React 相比,VueJS 相对轻巧。在 官方文档 中,它的大小据说只有约 30 KB;而 Angular 生成的项目超过 65 KB。
  • 简明的文档 —— VueJS 有全面清晰的文档。请自行查看它的 官方文档

VueJS 的 GitHub 显示该项目有 3,099 次提交和 239 位贡献者。

 title=

MeteorJS

 title=

MeteorJS 是一个自由开源的 同构框架,这意味着它和 NodeJS 一样,同时运行客户端和服务器的 JavaScript。Meteor 能够和任何其他流行的前端框架一起使用,如 Angular、React、Vue、Svelte 等。

Meteor 被高通、马自达和宜家等多家公司以及如 Dispatch 和 Rocket.Chat 等多个应用程序使用。您可以其在官方网站上查看更多案例

 title=

Meteor 的一些主要功能包括:

  • 在线数据 —— 服务器发送数据而不是 HTML,并由客户端渲染。在线数据主要是指 Meteor 在页面加载时通过一个 WebSocket 连接服务器,然后通过该链接传输所需要的数据。
  • 用 JavaScript 开发一切 —— 客户端、应用服务、网页和移动界面都可以用 JavaScript 设计。
  • 支持大多数主流框架 —— Angular、React 和 Vue 都可以与 Meteor 结合。因此,你仍然可以使用最喜欢的框架如 React 或 Angular,这并不防碍 Meteor 为你提供一些优秀的功能。

截止到目前,Meteor 的 GitHub 显示 22,804 次提交和 428 位贡献者。这对于开源项目来说相当多了。

 title=

EmberJS

 title=

EmberJS 是一个基于 模型-视图-视图模型(MVVM) 模式的开源 JavaScript 框架。如果你从来没有听说过 EmberJS,你肯定会惊讶于有多少公司在使用它。Apple Music、Square、Discourse、Groupon、LinkedIn、Twitch、Nordstorm 和 Chipotle 都将 EmberJS 作为公司的技术栈之一。你可以通过查询 EmberJS 的官方页面 来发掘所有使用 EmberJS 的应用和客户。

Ember 虽然和我们讨论过的其他框架有类似的好处,但这里有些独特的区别:

  • 约定优于配置 —— Ember 将命名约定标准化并自动生成结果代码。这种方法学习曲线有些陡峭,但可以确保程序员遵循最佳实践。
  • 成熟的模板机制 —— Ember 依赖于直接文本操作,直接构建 HTML 文档,而并不关心 DOM。

正如所期待的那样,作为一个被许多应用程序使用的框架,Ember 的 GitHub 页面显示该项目拥有 19,808 次提交和 785 位贡献者。这是一个巨大的数字!

 title=

KnockoutJS

 title=

KnockoutJS 是一个独立开源的 JavaScript 框架,采用 模板-视图-视图模型(MVVM) 模式与模板。尽管与 Angular、React 或 Vue 相比,听说过这个框架的人可能比较少,这个项目在开发者社区仍然相当活跃,并且有以下功能:

  • 声明式绑定 —— Knockout 的声明式绑定系统提供了一种简洁而强大的方式来将数据链接到 UI。绑定简单的数据属性或使用单向绑定很简单。请在 KnockoutJS 的官方文档页面 阅读更多相关信息。
  • 自动 UI 刷新。
  • 依赖跟踪模板。

Knockout 的 GitHub 页面显示约有 1,766 次提交和 81 位贡献者。与其他框架相比,这些数据并不重要,但是该项目仍然在积极维护中。

 title=

BackboneJS

 title=

BackboneJS 是一个具有 RESTful JSON 接口,基于 模型-视图-主持人 Model-View-Presenter (MVP)设计范式的轻量级 JavaScript 框架。

这个框架据说已经被 Airbnb、Hulu、SoundCloud 和 Trello 使用。你可以在 Backbone 的页面 找到上面所有这些案例来研究。

BackboneJS 的 GitHub 页面显示有 3,386 次提交和 289 位贡献者。

 title=

Svelte

 title=

Svelte 是一个开源的 JavaScript 框架,它生成操作 DOM 的代码,而不是包含框架引用。在构建时而非运行时将应用程序转换为 JavaScript 的过程,在某些情况下可能会带来轻微的性能提升。

Svelte 的 GitHub 页面显示,截止到本文撰写为止,该项目有 5,729 次提交和 296 位贡献者。

 title=

AureliaJS

 title=

最后我们介绍一下 Aurelia。Aurelia 是一个前端 JavaScript 框架,是一个现代 JavaScript 模块的集合。Aurelia 有以下有趣的功能:

  • 快速渲染 —— Aurelia 宣称比当今其他任何框架的渲染速度都快。
  • 单向数据流 —— Aurelia 使用一个基于观察的绑定系统,将数据从模型推送到视图。
  • 使用原生 JavaScript 架构 —— 可以用原生 JavaScript 构建网站的所有组件。

Aurelia 的 GitHub 页面显示,截止到撰写本文为止该项目有 788 次提交和 96 位贡献者。

 title=

这就是我在查看 JavaScript 框架世界时发现的新内容。我错过了其他有趣的框架吗?欢迎在评论区分享你的想法。


via: https://opensource.com/article/20/5/open-source-javascript-frameworks

作者:Bryant Son 选题:lujun9972 译者:stevending1st 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

age 是一个简单的、易于使用的工具,允许你用一个密码来加密和解密文件。

 title=

文件的保护和敏感文档的安全加密是用户长期以来关心的问题。即使越来越多的数据被存放在网站和云服务上,并由具有越来越安全和高强度密码的用户账户来保护,但我们能够在自己的文件系统中存储敏感数据仍有很大的价值,特别是我们能够快速和容易地加密这些数据时。

age 能帮你这样做。它是一个小型且易于使用的工具,允许你用一个密码加密一个文件,并根据需要解密。

安装 age

age 可以从众多 Linux 软件库中 安装

在 Fedora 上安装它:

$ sudo dnf install age -y

在 macOS 上,使用 MacPortsHomebrew 来安装。在 Windows 上,使用 Chocolatey 来安装。

用 age 加密和解密文件

age 可以用公钥或用户自定义密码来加密和解密文件。

在 age 中使用公钥

首先,生成一个公钥并写入 key.txt 文件:

$ age-keygen -o key.txt
Public key: age16frc22wz6z206hslrjzuv2tnsuw32rk80pnrku07fh7hrmxhudawase896m9

使用公钥加密

要用你的公钥加密一个文件:

$ touch mypasswds.txt | age -r \
    ageage16frc22wz6z206hslrjzuv2tnsuw32rk80pnrku07fh7hrmxhudawase896m9 \
    > mypass.tar.gz.age

在这个例子中,我使用生成的公钥加密文件 mypasswds.txt,保存在名为 mypass.tar.gz.age 的加密文件中。

用公钥解密

如需解密加密文件,使用 age 命令和 --decrypt 选项:

$ age --decrypt -i key.txt -o mypass.tar.gz mypass.tar.gz.age

在这个例子中,age 使用存储在 key.text 中的密钥,并解密了我在上一步创建的加密文件。

使用密码加密

不使用公钥的情况下对文件进行加密被称为对称加密。它允许用户设置密码来加密和解密一个文件。要做到这一点:

$ age --passphrase --output mypasswd-encrypted.txt mypasswd.txt
Enter passphrase (leave empty to autogenerate a secure one): 
Confirm passphrase:

在这个例子中,age 提示你输入一个密码,它将通过这个密码对输入文件 mypasswd.txt 进行加密,并生成加密文件 mypasswd-encrypted.txt

使用密码解密

如需将用密码加密的文件解密,可以使用 age 命令和 --decrypt 选项:

$ age --decrypt --output passwd-decrypt.txt mypasswd-encrypted.txt

在这个例子中,age 提示你输入密码,只要你提供的密码与加密时设置的密码一致,age 随后将 mypasswd-encrypted.txt 加密文件的内容解密为 passwd-decrypt.txt

不要丢失你的密钥

无论你是使用密码加密还是公钥加密,你都\_不能\_丢失加密数据的凭证。根据设计,如果没有用于加密的密钥,通过 age 加密的文件是不能被解密的。所以,请备份你的公钥,并记住这些密码!

轻松实现加密

age 是一个真正强大的工具。我喜欢把我的敏感文件,特别是税务记录和其他档案数据,加密到 .tz 文件中,以便以后访问。age 是用户友好的,使其非常容易随时加密。


via: https://opensource.com/article/21/7/linux-age

作者:Sumantro Mukherjee 选题:lujun9972 译者:geekpi 校对:turbokernel

本文由 LCTT 原创编译,Linux中国 荣誉推出

从 Rust 标准库学习一些有用的关键字。

 title=

我使用 Rust 已经有几个月了,写的东西比我预期的要多——尽管随着我的学习,我改进了所写的代码,并完成了一些超出我最初意图的更复杂的任务,相当多的东西已经被扔掉了。

我仍然喜欢它,并认为谈论一些在 Rust 中反复出现的重要关键字可能会有好处。我会提供我个人对它们的作用的总结:为什么你需要考虑如何使用它们,以及任何其他有用的东西,特别是对于刚接触 Rust 的新手或来自另一种语言的人(如 Java;请阅读我的文章 为什么作为一个 Java 程序员的我喜欢学习 Rust)。

事不宜迟,让我们开始吧。获取更多信息的好地方总是 Rust 官方文档 —— 你可能想从 std 标准库开始。

  1. const – 你可以用 const 来声明常量,而且你应该这样做。虽然这不是造火箭,但请一定要用 const ,如果你要在不同的模块中使用常量,那请创建一个 lib.rs 文件(Rust 默认的),你可以把所有的常量放在一个命名良好的模块中。我曾经在不同模块的不同文件中发生过 const 变量名(和值)的冲突,仅仅是因为我太懒了,除了在不同文件中剪切和粘贴之外,我本可以通过创建一个共享模块来节省大量的工作。
  2. let – 你并不 总是 需要用 let 语句声明一个变量,但当你这样做时你的代码会更加清晰。此外,如果可以,请一定要添加变量类型。Rust 会尽最大努力猜测它应该是什么类型的变量,但它不一定总能在运行时做到这一点(在这种情况下,编译器 Cargo 会提示你),它甚至可能做不到你期望的那样。在后一种情况下,对于 Cargo 来说,抱怨你所赋值的函数(例如)与声明不一致,总比 Rust 试图帮助你做错事,而你却不得不在其他地方花费大量时间来进行调试要简单。
  3. matchmatch 对我来说是新鲜事物,我喜欢使用它。它与其他编程语言中的 switch 没有什么不同,但在 Rust 中被广泛使用。它使代码更清晰易读,如果你做了一些愚蠢的事情(例如错过一些可能的情况),Cargo 会很好地提示你。我一般的经验法则是,在管理不同的选项或进行分支时,如果可以使用 match,那就请一定要使用它。
  4. mut – 在声明一个变量时,如果它的值在声明后会发生变化,那么你需要声明它是可变的(LCTT 译注:Rust 中变量默认是不可变的)。常见的错误是在某个变量 没有 变化的情况下声明它是可变的,这时编译器会警告你。如果你收到了 Cargo 的警告,说一个可变的变量没有被改变,而你认为它被 改变 了,那么你可能要检查该变量的范围,并确保你使用的是正确的那个。
  5. return – 实际上我很少使用 return,它用于从函数中返回一个值,但是如果你只是在函数的最后一行提供值(或提供返回值的函数),通常会变得更简单,能更清晰地阅读。警告:在很多情况下,你 忘记省略这一行末尾的分号(;),如果你这样做,编译器会不高兴的。
  6. unsafe – 如其意:如果你想做一些不能保证 Rust 内存安全的事情,那么你就需要使用这个关键字。我绝对无意在现在或将来的任何时候宣布我的任何 Rust 代码不安全;Rust 如此友好的原因之一是它阻止了这种黑客行为。如果你真的需要这样做,再想想,再想想,然后重新设计代码。除非你是一个非常低级的系统程序员,否则要 避免 使用 unsafe
  7. use – 当你想使用另一个 crate 中的东西时,例如结构体、变量、函数等,那么你需要在你要使用它的代码的代码块的开头声明它。另一个常见的错误是,你这样做了,但没有在 Cargo.toml 文件中添加该 crate (最好有一个最小版本号)。

我知道,这不是我写过的最复杂的文章,但这是我在开始学习 Rust 时会欣赏的那种文章。我计划在关键函数和其他 Rust 必知知识方面编写类似的文章:如果你有任何要求,请告诉我!


本文最初发表于 Alice, Eve, and Bob 经作者许可转载。


via: https://opensource.com/article/20/10/keywords-rust

作者:Mike Bursell 选题:lujun9972 译者:mcfd 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在最小化服务器安装中,设置互联网或网络是非常容易的。在本指南中,我们将解释如何在 CentOS、RHEL、Rocky Linux 最小安装中设置互联网或网络。

当你刚刚完成任何服务器发行版的最小化安装时,你没有任何图形界面或桌面环境可以用于设置你的网络或互联网。因此,当你只能使用终端时,了解如何设置联网是很重要的。NetworkManager 以及 systemd 服务为完成这项工作提供了必要的工具。以下是具体使用方法。

在 CentOS、RHEL、Rocky Linux 最小化安装中设置互联网

完成安装后,启动服务器终端。理想情况下,你应该会看到提示符。使用 root 或 admin 账户登录。

然后,首先尝试使用 nmcli 检查网络接口的状态和细节。nmcli 是一个控制 NetworkManager 服务的命令行工具。使用以下命令进行检查。

nmcli device status

这将显示设备名称、状态等。

nmcli device status

运行工具 nmtui 来配置网络接口。nmtui 是 NetworkManager 工具的一部分,它为你提供了一个漂亮的用户界面来配置网络。这是 NetworkManager-tui 包的一部分,当你完成最小服务器的安装时它应该默认安装。

nmtui

nmtui 窗口中点击编辑一个连接。

nmtui – Select options

选择网口名称:

Select Interface to Edit

在编辑连接窗口,为 IPv4 和 IPv6 选择自动。并选择自动连接。完成后按 “OK”。

nmtui – Edit Connection

通过使用如下 systemd systemctl 命令,重新启动 NetworkManager 服务。

systemctl restart NetworkManager

如果一切顺利,在 CentOS、RHEL、Rocky Linux 服务器的最小化安装中你应该可以连接到网络和互联网了,前提是你的网络有互联网连接。你可以用 ping 来验证它是否正常。

setup internet minimal server – CentOS Rocky Linux RHEL

额外技巧:在最小化服务器中设置静态 IP

当你把网络配置设置为自动,当你连接到互联网时,网口会动态地分配 IP。在某些情况下,当你建立一个局域网 (LAN) 时,你可能想给你的网口分配静态 IP。这超级简单。

打开你的网络的网络配置脚本。根据你的设备修改高亮部分:

vi /etc/sysconfig/network-scripts/ifcfg-ens3

在上面的文件中,用 IPADDR 属性添加你想要的 IP 地址。保存该文件。

IPADDR=192.168.0.55

/etc/sysconfig/network 中为你的网络添加网关:

NETWORKING=yes
HOSTNAME=debugpoint
GATEWAY=10.1.1.1

/etc/resolv.confresolv.conf 中添加任意公共 DNS 服务器:

nameserver 8.8.8.8
nameserver 8.8.4.4

并重新启动网络服务:

systemctl restart NetworkManager

这样就完成了静态 IP 的设置。你也可以使用 ip addr 命令检查详细的 IP 信息。

我希望这个指南能帮助你在你的最小化服务器中设置网络、互联网和静态 IP。如果你有任何问题,请在评论区告诉我。


via: https://www.debugpoint.com/2021/06/setup-internet-minimal-install-server/

作者:Arindam 选题:lujun9972 译者:geekpi 校对:turbokernel

本文由 LCTT 原创编译,Linux中国 荣誉推出

在命令行上创建符合特定规范的密码。

 title=

大多数网站或应用都要求用户创建带有安全密码的账户,以便他们能够迎合用户体验。虽然这有利于网站开发者,但肯定不会让用户的生活更轻松。

有时,创建密码的规则是如此严格,以至于难以生成一个强壮且合规的组合。如果有一个工具可以生成符合网站或应用程序要求的任何规则的安全密码,那就容易多了。

这就是 pwgen 的用武之地。根据它的 手册页:“pwgen 生成的密码是为了让人容易记住,同时又尽可能的安全。” 它返回符合你所提供的规则的多个密码选项,这样你就可以选择一个你喜欢的(而且可能更容易记住)。

安装 pwgen

在 Linux 上,你可以通过包管理器安装 pwgen。例如,在 Fedora 上:

$ sudo dnf install pwgen

在 macOS 上,可以使用 MacPortsHomebrew。在 Windows 上,可以使用 Chocolatey

使用 pwgen 生成密码

有几种方式可以通过向 pwgen 传递参数来生成密码,这取决于你所需的参数。这里有一些例子。更多的参数选项请查阅手册页。

如果你需要一个安全的、难以记忆的特定长度的密码,请运行 pwgen --secure(或简写 -s),后面跟上你所需的密码长度:

$ pwgen -s 25
pnFBg9jB8AlKL3feOuS2ZwMGb xlmDRoaLssduXTdGV6jkQhUGY O3IUB3CH7ry2kD4ZrSoODzWez
dENuvhkF3mmeb4FfXd4VPU2dE EMCi1sHFKHUVmbVajXWleFBzD 4UXJIu3JztVzYz6qJktBB3KCv
AF9WM7hmG89cpTlg8PksI7jsL LSSaT7DD4IT8DUgRAgY8Zt06m Nths10uT0bIMGsPuE0XEHDxsj
6YjLRbg3VnGnrzkoQCmrneLmm Tam1Mftac5RxrZPoXJtXx1Qdy BPqePJW4LdTtFnuZOepKEj0o0
Ss8veqqf95zusqYPsfE7mLb93 4KuZdReO5lhKff7Xv1en1Hefs is7hjLnDrVCUJ7Hh6zYUzfppn
UXOfENPRJYWiroIWEt5IgAwdJ t8i4hM4cDuL8pN1rpFKHnx7yw Wr7gyuyU2br7aCbiH5M5ogvc6
evk90lUmK2rOUWGgnqmznn0a9 Lflyc9svJfaBRRMin24j0P9ec hIzyJIwCpklDjgOb5PrMkyPCI
bhYcaV7GXfUiCMZ1kvMnlmKLx v4EJew54u6s4ZCirOTAWjfPQ2 IdemhbOHOm4Qo70WGibaNTOpO
j6XkmdB3LBfqZf5mbL3GndliG PpZbeXfWOFCpNARyXt1FWPAb8 OLQS2HFuqkiSg56sdxNsg5vaJ
1g666HxJPQ6l2L0RlaDEMoi50 1t6au7VuTN9HVPpiVmd1Gurli 46OAWypvwtZZUdBEfaHSunjpw
0LiRj9dbtMuI4cbDES8O4gYRq 2HPiaq5AANvVT32fWqNIruu3R 3lT5B107WoUbHsELkKUjnEEih
gLmYUTp0XZJWvIVbA5rFvBT54 LEm6QVeTMinc056DC9c4V55cV ipV45Ewj704365byKhY8zn766

运行 pwgen -symbols(或简写 -y),再加上所需的密码长度,生成包含特殊字符的密码:

$ pwgen -y 25
Osh0chahxe0won9aech4ese?v pemoh2ohm9aim;iu4Eiy"ah0y Taiqu;o2aeSh+o4aedoagait3
Vei;phoh5owai5jui+t|ei3ot teu!w7mahxoh0Po7ohph8Iez6 quie#phooCeu2lohm5shaPaer
eTh5AechaexieToh9ez5eeZ;e nuloh1ico0Nool:eG<aiv`ah, Heeghuo8ahzii1Iep~ie_ch7p
oe6Xee6uchei7Oroothail~iL ahjie!Chee.W4wah[wuu]phoo ees7ieb!i[ibahhei1xoz2Woh
Atei9ooLu7lo~sh>aig@ae9No OVahh2OhNgahtu8iethaR@i7o ouFai8ahP@eil4Ieh5le5ipu5
eeT4tahW0ieng9fe?i5auM3ie seet0ohc4aiJei]koiGha2zu% iuh@oh4eix0Vuphi?o,hei9me
loh0Aeph=eix(ohghe6chee3z ahgh2eifiew8dahG_aeph8woo oe!B4iasaeHo`ungie3taekoh
cei!c<ung&u,shee6eir7Eigo va6phou8ooYuoquohghi-n6Qu eeph4ni\chi2shohg3Die1hia
uCagha8Toos2bahLai7phuph` Zue2thieng9ohhoo~shoh6ese Aet7Lio1ailee^qu4hiech5ie
dee]kuwu9OhTh3shoi2eijoGe daethahH6ahV3eekoo9aep$an aehiiMaquieHee9moh`l_oh4l
aec#ii6Chophu3aigh*ai#le4 looleihoog:uo4Su"thiediec eeTh{o7Eechah7eeJ2uCeish!
oi3jaiphoof$aiy;ieriexeiP Thozool3aipi|cahfu0Ha~e1e az/u8iel2Jaeph2vooshai9Wi

运行 pwgen --capitalize(或缩写 -c),后面跟上密码长度,生成包含大写字母的密码:

$ pwgen -c 25
pheipichusheta6ieJ4xai4ai seiLeiciev7ijoy5Uez7Iepee Foobeisheec7ooGahbicholo6
shenahsheevigh3pha1Ie5aev taiTheitahne3oong4joegh9d ooshieV0ooGhaelabuyahsh7t
ieniech0Uajeh8nieYaak0foh dohm5Pee3jeeshahm1eipei0a aemoob8Lequeesho8ahreiwee
keineeCh5ieZejafitith6Osh Tahn3nohl6iewaimee6oofied Aed2Woh7nae5ohgh2toh1ieph
le4agheeb0bieth0Ui7ielais Iunoo4lev1aiG4NohfoTh3ro5 iLai7eiQuohXosh8ooyiev6wu
eezib2zoh2ohsh0cooSahluK6 baekiew8bo5oeMouthi7taCee iep6Puungae0uushogah4rohw
chohm5leogae2zeiph1OL0uK2 oosieCaishievahvig3Iaphai ii9AemieYeepe1ahciSei8ees
ie3aighaiy9TaX6bae8soKe6t sooDaivi4mia8Eireech8ope9 moi9uk3bauv0ahY4to0aedie7
que8seHu4shu7Veib6noe7dai shuyuj9aiphoip2Ier4oole1u Thoaziebah1Ieph2Veec0Ohm8
auqua4Kaitie9sei6quoh7chi jeewaituH3Ohsaisahp0viequ ueh1quaibidoh6Bae6ri0Mee2
lae3aiJaiNgoh7yieghozev7o Di2vohfahr7uo7ohSh0voh5sh Jeurahxiedeiyoom3aechaS7d
thung2pheiy2tooBeenuN8ia3 foh0oge1athei0oowieZen0ai iexei0io1vohsieThuCoy5ogi
tohHe3uu2eXieheeQuoh7eit8 aiMieCeizeivu1ooch8aih0sh Riojei2yoah0AiWeiRoMieQu0

让它变得简单

由于人脑更倾向于选择模式,所以强壮的随机密码难以生成。通过使用 pwgen,你可以轻松生成密码。借助于优秀的 开源密码管理器,你可以完全从易于使用但难以猜测的密码中获益。


via: https://opensource.com/article/21/7/generate-passwords-pwgen

作者:Sumantro Mukherjee 选题:lujun9972 译者:geekpi 校对:turbokernel

本文由 LCTT 原创编译,Linux中国 荣誉推出

使用 qpdf 和 poppler-utils 来分割、修改和合并 PDF 文件。

 title=

你收到的许多文件都是 PDF 格式的。有时这些 PDF 需要进行处理。例如,可能需要删除或添加页面,或者你可能需要签署或修改一个特定的页面。

不管是好是坏,这就是我们所处的现实。

有一些花哨的图形用户界面工具可以让你编辑 PDF,但我一直对命令行感到最舒服。在这个任务的许多命令行工具中,当我想修改一个 PDF 时,我使用的是 qpdfpoppler-utils

安装

在 Linux 上,你可以用你的包管理器(如 aptdnf)来安装 qpdfpoppler-utils。比如在 Fedora 上:

$ sudo dnf install qpdf poppler-utils

在 macOS 上,使用 MacPortsHomebrew。在 Windows 上,使用 Chocolatey

qpdf

qpdf 命令可以做很多事情,但我主要用它来:

  1. 将一个 PDF 分割成不同的页面
  2. 将多个 PDF 文件合并成一个文件

要将一个 PDF 分割成不同的页面:

qpdf --split-pages original.pdf split.pdf

这就会生成像 split-01.pdfsplit-02.pdf 这样的文件。每个文件都是一个单页的 PDF 文件。

合并文件比较微妙:

qpdf --empty concatenated.pdf --pages split-*.pdf --

这就是 qpdf 默认的做法。--empty 选项告诉 qpdf 从一个空文件开始。结尾处的两个破折号(--)表示没有更多的文件需要处理。这是一个参数反映内部模型的例子,而不是人们使用它的目的,但至少它能运行并产生有效的 PDF!

poppler-utils

这个软件包包含几个工具,但我用得最多的是 pdftoppm,它把 PDF 文件转换为可移植的像素图(ppm)文件。我通常在用 qpdf 分割页面后使用它,并需要将特定页面转换为我可以修改的图像。ppm 格式并不为人所知,但重要的是大多数图像处理方法,包括 ImageMagickPillow 等,都可以使用它。这些工具中的大多数也可以将文件保存为 PDF。

工作流程

我通常的工作流程是:

  • 使用 qpdf 将 PDF 分割成若干页。
  • 使用 poppler-utils 将需要修改的页面转换为图像。
  • 根据需要修改图像,并将其保存为 PDF。
  • 使用 qpdf 将各页合并成一个 PDF。

其他工具

有许多很好的开源命令来处理 PDF,无论你是 缩小它们从文本文件创建它们转换文档,还是尽量 完全避免它们。你最喜欢的开源 PDF 工具是什么?请在评论中分享它们。


via: https://opensource.com/article/21/7/qpdf-command-line

作者:Moshe Zadka 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出