2022年7月

一家中国公司发布了首款 RISC-V 笔记本电脑?

“RISC-V 国际”透露,一家名为“鉴释”的中国公司已经宣布了第一台面向开发者的 RISC-V 笔记本电脑,现已开放预订。据介绍,这个 “ROMA” 开发平台具有四核 RISC-V 处理器,高达 16GB 的内存,最大 256GB 的存储空间,并且可以运行大多数 RISC-V Linux 发行版。有趣的是,这家名为“鉴释”的公司原本是一家开发静态代码分析工具的公司,这个名为“ROMA”的新产品也无法在其中英文网站找到任何链接,只有一个孤儿 预定页,而预定页中提供一个表格,没有确定的价格或预期供应量的信息、甚至连概念图都没有,并且还提到了一些 Web3 和 NFT 的事情。

消息来源:Phoronix
老王点评:这真不是洋葱新闻?

谷歌推出“高级 API 安全”服务

谷歌宣布了“高级 API 安全”的预览版,这是一个新产品,将在谷歌云上推出,旨在检测与 API 有关的安全威胁。该服务可以识别 API 错误配置和检测恶意机器人。配置错误的 API 是造成 API 安全事件的主要原因之一。开发者们越来越依赖 API,但它们也越来越成为攻击的目标。根据一份 2018 年的报告,三分之二的组织正在向公众和合作伙伴暴露了不安全的 API。

消息来源:Tech Crunch
老王点评:一个配置不当的 API,造成的影响可能非常可怕,我想网络安全圈子对这个很有感受。

Linux Mint 21 不准备用 oomd

Linux Mint 21 正在努力争取在今年夏天发布,它是建立在 Ubuntu 22.04 LTS 之上的。但因 Ubuntu 22.04 在 systemd-oomd 上广受批评,Linux Mint 决定不用这个服务来“屠杀”用户的应用。Canonical 公司的开发人员一直在努力修复这个问题,随着最新提出的 SRU 可能会有所改善。

消息来源:Phoronix
老王点评:Mint 做了明智的选择。这根本不是 oomd 的策略问题,而是不经过用户同意,甚至用户没有反对的机会,就被杀了应用。

了解 Kubernetes 架构中不同组件是如何组合在一起的,这样你就可以更好地排查问题、维护一个健康的集群,以及优化工作流。

 title=

使用 Kubernetes 来编排容器,这种描述说起来简单,但理解它的实际含义以及如何实现它完全是另外一回事。如果你正在运行或管理 Kubernetes 集群,那么你就会知道 Kubernetes 由一台称为 “ 控制平面 control plane ” 的机器和许多其他 工作节点 worker node 机器组成。每种类型都有一个复杂但稳定的堆栈,这使编排成为可能,熟悉每个组件有助于理解它是如何工作的。

 title=

(Nived Velayudhan, CC BY-SA 4.0

控制平面组件

Kubernetes 安装在一个称为“ 控制平面 control plane ”的机器上,它会运行 Kubernetes 守护进程,并在启动容器和 容器组 pod 时与之通信。下面介绍控制平面的各个组件。

etcd

etcd 是一种快速、分布式一致性键值存储器,用作 Kubernetes 对象数据的持久存储,如容器组、副本控制器、密钥和服务。etcd 是 Kubernetes 存储集群状态和元数据的唯一地方。唯一与 etcd 直连的组件是 Kubernetes API 服务器。其他所有组件都通过 API 服务器间接的从 etcd 读写数据。

etcd 还实现了一个监控功能,它提供了一个基于事件的接口,用于异步监控键的更改。一旦你更改了一个键,它的监控者就会收到通知。API 服务器组件严重依赖于此来获得通知,并将 etcd 变更至期望状态。

为什么 etcd 实例的数量应该是奇数?

你通常会运行三个、五个或七个 etcd 实例实现高可用(HA)环境,但这是为什么呢?因为 etcd 是分布式数据存储,可以水平扩展它,但你需要确保每个实例中的数据是一致的。因此,需要为系统当前状态达成共识,etcd 为此使用 RAFT 共识算法

RAFT 算法需要经过选举(或仲裁)集群才能进入下一个状态。如果你只有两个 etcd 实例并且他们其中一个失败的话,那么 etcd 集群无法转换到新的状态,因为不存在过半这个概念。如果你有三个 etcd 实例,一个实例可能会失败,但仍有 2 个实例可用于进行选举。

API 服务器

API 服务器是 Kubernetes 中唯一直接与 etcd 交互的组件。Kubernetes 中的其他所有组件都必须通过 API 服务器来处理集群状态,包括客户端(kubectl)。API 服务器具有以下功能:

  • 提供在 etcd 中存储对象的一致方式。
  • 执行验证对象,防止客户端存储配置不正确的对象(如果它们直接写入 etcd 数据存储,可能会发生这种情况)。
  • 提供 RESTful API 来创建、更新、修改或删除资源。
  • 提供 乐观并发锁,在发生更新时,其他客户端永远不会有机会重写对象。
  • 对客户端发送的请求进行身份验证和授权。它使用插件提取客户端的用户名、ID、所属组,并确定通过身份验证的用户是否可以对请求的资源执行请求的操作。
  • 如果请求试图创建、修改或删除资源,则负责 权限控制。例如,AlwaysPullImages、DefaultStorageClass 和 ResourceQuota。
  • 实现了一种监控机制(类似于 etcd),用户客户端监控更改。这允许调度器和控制器管理器等组件以松耦合的方式与 API 服务器交互。

控制器管理器

在 Kubernetes 中,控制器持续监控集群状态,然后根据需要进行或请求更改。每个控制器都尝试将当前集群状态变更至期望状态。控制器至少跟踪一种 Kubernetes 资源类型,这些对象均有一个字段来表示期望的状态。

控制器示例:

  • 副本管理器(管理 副本控制器 ReplicationController 资源的控制器)
  • 副本集 ReplicaSet 、守护进程集DaemonSet 和任务控制器
  • 部署控制器
  • 有状态负载控制器
  • 节点控制器
  • 服务控制器
  • 接入点控制器
  • 命名空间控制器
  • 持久卷 PersistentVolume 控制器

控制器通过监控机制来获得变更通知。它们监视 API 服务器对资源的变更,对每次更改执行操作,无论是新建对象还是更新或删除现有对象。大多数时候,这些操作包括创建其他资源或更新监控的资源本身。不过,由于使用监控并不能保证控制器不会错过任何事件,它们还会定期执行一系列操作,确保没有错过任何事件。

控制器管理器还执行生命周期功能。例如命名空间创建和生命周期、事件垃圾收集、已终止容器组垃圾收集、级联删除垃圾收集 和节点垃圾收集。有关更多信息,参考 云控制器管理器

调度器

调度器是一个将容器组分配给节点的控制平面进程。它会监视新创建没有分配节点的容器组。调度器会给每个发现的容器组分配运行它的最佳节点。

满足容器组调度要求的节点称为可调度节点。如果没有合适的节点,那么容器组会一直处于未调度状态,直到调度器可以安置它。一旦找到可调度节点,它就会运行一组函数来对节点进行评分,并选择得分最高的节点,然后它会告诉 API 服务器所选节点的信息。这个过程称为绑定。

节点的选择分为两步:

  1. 过滤所有节点的列表,获得可以调度容器组的节点列表(例如,PodFitsResources 过滤器检查候选节点是否有足够的可用资源来满足容器组的特定资源请求)。
  2. 对第一步得到的节点列表进行评分和排序,选择最佳节点。如果得分最高的有多个节点,循环过程可确保容器组会均匀地部署在所有节点上。

调度决策要考虑的因素包括:

  • 容器组是否请求硬件/软件资源?节点是否报告内存或磁盘压力情况?
  • 节点是否有与容器组规范中的节点选择器匹配的标签?
  • 如果容器组请求绑定到特定地主机端口,该端口是否可用?
  • 容器组是否容忍节点的污点?
  • 容器组是否指定节点亲和性或反亲和性规则?

调度器不会指示所选节点运行容器组。调度器所做的就是通过 API 服务器更新容器组定义。然后 API 服务器通过监控机制通知 kubelet 容器组已被调度,然后目标节点上的 kubelet 服务看到容器组被调度到它的节点,它创建并运行容器组。

工作节点组件

工作节点运行 kubelet 代理,这允许控制平面接纳它们来处理负载。与控制平面类似,工作节点使用几个不同的组件来实现这一点。 以下部分描述了工作节点组件。

Kubelet

Kubelet 是一个运行在集群中每个节点上的代理,负责在工作节点上运行的所有事情。它确保容器在吊舱中运行。

kubelet服务的主要功能有:

  • 通过在 API 服务器中创建节点资源来注册它正在运行的节点。
  • 持续监控 API 服务器上调度到节点的容器组。
  • 使用配置的容器运行时启动容器组的容器。
  • 持续监控正在运行的容器,并将其状态、事件和资源消耗报告给 API 服务器。
  • 运行容器存活探测,在探测失败时重启容器,当 API 服务器中删除容器组时终止(通知服务器容器组终止的消息)。

服务代理

服务代理(kube-proxy)在每个节点上运行,确保一个容器组可以与另一个容器组通讯,一个节点可以与另一个节点对话,一个容器可以与另一个容器对话。它负责监视 API 服务器对服务和容器组定义的更改,以保持整个网络配置是最新的。当一项服务得到多个容器组的支持时,代理会在这些容器组之间执行负载平衡。

kube-proxy 之所以叫代理,是因为它最初实际上是一个代理服务器,用于接受连接并将它们代理到容器组。当前的实现是使用 iptables 规则将数据包重定向到随机选择的后端容器组,而无需通过实际的代理服务器。

关于它工作原理的高级视图:

  • 当你创建一个服务时,会立即分配一个虚拟 IP 地址。
  • API 服务器会通知在工作节点上运行的 kube-proxy 代理有一个新服务。
  • 每个 kube-proxy 通过设置 iptables 规则使服务可寻址,确保截获每个服务 IP/端口对,并将目的地址修改为支持服务的一个容器组。
  • 监控 API 服务器对服务或其端点对象的更改。

容器运行时

容器运行时有两类:

  • 较低级别的容器运行时: 它们主要关注运行中的容器并为容器设置命名空间和 控制组 cgroup
  • 更高级别的容器运行时(容器引擎): 它们专注于格式、解包、管理、共享镜像以及为开发人员提供 API。

容器运行时负责:

  • 如果容器镜像本地不存在,则从镜像仓库中提取。
  • 将镜像解压到写时复制文件系统,所有容器层叠加创建一个合并的文件系统。
  • 准备一个容器挂载点。
  • 设置容器镜像的元数据,如覆盖命令、用户输入的入口命令,并设置 SECCOMP 规则,确保容器按预期运行。
  • 通知内核将进程、网络和文件系统等隔离分配给容器。
  • 通知内核分配一些资源限制,如 CPU 或内存限制。
  • 将系统调用(syscall)传递给内核启动容器。
  • 确保 SElinux/AppArmor 设置正确。

协同

系统级组件协同工作,确保 Kubernetes 集群的每个部分都能实现其目和执行其功能。当你深入编辑 YAML 文件 时,有时很难理解请求是如何在集群中通信的。现在你已经了解了各个部分是如何组合在一起的,你可以更好地理解 Kubernetes 内部发生了什么,这有助于诊断问题、维护健康的集群并优化你的工作流。


via: https://opensource.com/article/22/2/kubernetes-architecture

作者:Nived Velayudhan 选题:lujun9972 译者:MjSeven 校对:turbokernel

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

VLCLinux 和其他平台上最受欢迎的视频播放器之一。

它不仅仅是一个视频播放器。它提供了许多多媒体和网络相关的功能。你会惊讶地 了解 VLC 的能力

我将演示一个简单的 VLC 功能,即使用它下载 YouTube 视频。

是的。你可以在 VLC 中播放 YouTube 视频并下载它们。让我告诉你怎么做。(LCTT 校注:发布此文只探讨技术可行性。)

使用 VLC 媒体播放器下载 YouTube 视频

现在,有一些方法可以 下载 YouTube 视频。使用浏览器扩展或使用专门的网站或工具。

但是如果你不想使用任何额外的东西,已经安装的 VLC 播放器可以用于此目的。

**重要提示:**在从 YouTube 复制链接之前,请确保从 YouTube 播放器中选择所需的视频质量,因为我们将获得与复制链接时流式传输视频相同的质量。

步骤 1:获取所需视频的视频链接

你可以使用任何你喜欢的浏览器并从地址栏中复制视频链接。

copy youtube link

步骤 2:将复制的链接粘贴到网络流

网络流 Network Stream ”选项位于“ 媒体 Media ”菜单下,这是我们顶部菜单栏的第一个选项。你也可以使用快捷方式 CTRL + N 打开网络流 。

click on media and select network stream

现在,你只需粘贴复制的 YouTube 视频链接,然后单击播放按钮。我知道它只是在我们的 VLC 中播放视频,但还有一点额外的步骤可以让我们下载当前的流媒体视频。

paste video link

步骤 3:从编解码器信息中获取位置链接

在“ 编解码器信息 Codec Information ”下,我们会得到当前播放视频的位置链接。要打开编解码器信息,你可以使用快捷键 CTRL + J 或者你会在“ 工具 Tools ”菜单下找到编解码器信息选项。

click on tools and then codec information

它将带来有关当前流媒体视频的详细信息。但我们需要的是“ 位置 Location ”。你只需复制位置链接,我们的任务就完成了 90%。

copy location link

步骤 4:将位置链接粘贴到新选项卡

打开任何你喜欢的浏览器,并将复制的位置链接粘贴到新选项卡,它将开始在浏览器中播放该视频。

现在,右键单击播放视频,你将看到“将视频另存为”的选项。

click on save

它将打开文件管理器并询问你是否要在本地保存此视频。你还可以重命名该文件,默认情况下它将被命名为 “videoplayback.mp4”。

showing file in folder

结论

如果你有互联网连接问题,或者如果你想保存一些视频以供将来观看,下载 YouTube 视频是有意义的。

当然,我们不鼓励盗版。此方法仅用于合理使用,请确保视频的创建者已允许该视频进行合理使用,并确保在将其用于其他地方之前将其归属于视频的原始所有者。


via: https://itsfoss.com/download-youtube-videos-vlc/

作者:Community 选题:lkxed 译者:geekpi 校对:wxy

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

数年后 Ubuntu Unity 桌面起死回生

Ubuntu 的 Unity 桌面已经很久没有更新了,上一次它还是 Ubuntu 17.04 中出现的 Unity 7.5。Ubuntu 背后的 Canonical 公司随后放弃了对 Unity 的开发支持。但是一些喜欢它的开发者们建立了 UnityX 项目,从而今年我们见到了 Unity 7.6,它被搭载在非官方的 Ubuntu Unity 合成版中。当然,你也可以在普通的 Ubuntu 上安装它。这是另一个完全不像 Windows 的少数选项。

消息来源:The Register
老王点评:Unity 本身好不好,是不是更流行并不重要,重要的是,开源世界是自由的,你有随时再造一个轮子的自由。这很重要。

软件自由保护协会抨击 GitHub

软件自由保护协会(SFC)专注于保护自由和开源软件,说它已经停止使用微软的 GitHub 进行项目托管,并敦促其他软件开发者也这样做。他们在其网站上增加了一个放弃 GitHub 的说明,并督促自由和开源软件开发者们自愿切换到不同的代码托管服务。SFC 与 GitHub 的决裂最终是由 GitHub Copilot 导致的。他们说,GitHub 决定发布一个源自 FOSS 代码的营利性产品,这“太让人难以忍受了”。Copilot 的训练数据来自 GitHub 上的公共存储库中的代码,但是并没有说明这些代码所附带的软件许可证和版权持有人是什么。

消息来源:The Register
老王点评:确实,似乎 Copilot 有意无意的忽视了用来训练的代码的许可证问题,所以,你很可能在得到的建议中采用了各种许可证的代码,即便只是几行。这从跟本上打击了开源许可证的严肃性。

无视谷歌、Mozilla 反对,万维网联盟发布了 DID 规范

去中心化标识符(DID)规范描述了一种部署全球唯一标识符的方法,而无需一个中心化的机构作为验证实体。它们旨在使个人和组织能够使用他们信任的系统生成自己的标识符,这些新的标识符使实体能够通过使用数字签名等加密证明来证明对它们的控制。DID 的格式类似 did:方法:特定标识。但谷歌、Mozilla 提出了反对意见,DID 中的“方法”没有定义,所以没有办法评估 DID 将如何运作,也没有办法确定如何处理互操作。他们还担心依靠工作证明量的区块链来处理 DID 的道德问题。

消息来源:The Register
老王点评:虽然这很去中心化,但是我怀疑由中心化组织提出的去中心化规范,是否真的有用?

(LCTT 校注:作者原文已经大篇幅进行了修订更新,本文据之前的版本翻译。)

今天我在推特上发布了一些关于 OSI 模型如何与 TCP/IP 工作原理的实际表现不相符的观点,这让我思考——OSI 模型到底是什么?通过阅读推特上的一些回复发现,似乎至少存在三种不同的思考方式:

  1. TCP/IP 工作原理的字面描述
  2. 一个可以用来描述和比较很多不同的网络协议的抽象模型
  3. 对 1980 年代的一些计算机网络协议的字面描述,这些协议如今大多已不再使用

在这篇文章中,我不打算试图争辩以上哪一个才是“真正”的 OSI 模型——似乎不同的人以所有这些方式思考它。这不重要。

OSI 模型有七层

在我们讨论 OSI 模型的含义之前,让我们大致地讨论一下它是什么。它是一个抽象模型,用于描述网络如何在七个编号的层上工作:

  • 第一层:物理层
  • 第二层:数据链路层
  • 第三层:网络层
  • 第四层:传输层
  • 第五层:会话层
  • 第六层:表示层
  • 第七层:应用层

我不会再费时地去解释每一层的含义,网上有上千种解释可供查询。

OSI 模型:TCP/IP 工作原理的字面描述

首先,我想谈谈人们在实践中使用 OSI 模型的一种常见方式:作为对 TCP/IP 工作原理的字面描述。OSI 模型的某些层非常容易映射到 TCP/IP:

  • 第二层对应以太网
  • 第三层对应 IP
  • 第四层对应 TCP 或 UDP(或 ICMP 等)
  • 第七层对应 TCP 或 UDP 包内的任何内容(例如 DNS 查询)

这种映射对第二、三、四层很有意义——TCP 数据包有三个 标头 header 对应于这三个层(以太网标头、IP 标头和 TCP 标头)。

用数字来描述 TCP 数据包中的不同标头非常有用——如果你说“第二层”,很显然它位于第三层“下方”,因为二比三小。

“OSI 模型作为字面描述”的古怪之处在于,第五层和第六层并不真正对应于 TCP/IP 中的任何内容——我听说过很多关于第五层或第六层可能是什么的不同解释(你可以说第五层是 TLS 或其他东西!)但它们没有像第二、三、四层那样“每一层在 TCP 数据包中都有相应的标头”这样的明确对应关系。

此外,TCP/IP 的某些部分即使在第二层到第四层也不能很好地适应 OSI 模型——例如,哪一层是 ARP 数据包?ARP 数据包发送一些带有以太网标头的数据,这是否意味着它们是第三层?或是第二层?列出不同 OSI 层的维基百科文章将其归类为“第 2.5 层”,这并不令人满意。

因为 OSI 模型有时用于教授 TCP/IP,若搞不清楚它的哪些部分可以映射到 TCP/IP,而哪些部分不能,则会令人困惑。这才是真的问题。

OSI 模型:用于比较网络协议的一个抽象

我听说过的另一种关于 OSI 的思考方式是,它是一种抽象,可以用来在许多不同的网络协议之间进行类比。例如,如果你想了解蓝牙协议的工作原理,也许你可以使用 OSI 模型来帮助你——这是我在 这个网页 上找到的一张图表,显示了蓝牙协议如何适配 OSI 模型。

另一个例子是,这篇维基百科文章) 有一个 OSI 层列表,详细划分了哪些特定的网络协议对应于这些 OSI 层。

OSI 模型:一些过时协议的字面描述

维基百科上的一些非常简短的研究表明,除了对这七层的抽象描述之外,OSI 模型还包含了 一组实现这些层的特定协议。显然,这发生在 70 年代和 80 年代的 协议战争 时期,OSI 模型失败了,TCP/IP 则取得了胜利。

这就解释了为什么 OSI 模型无法与 TCP/IP 很好地对应,因为如果当时“获胜”的是 OSI 协议,那么 OSI 模型 完全对应于互联网网络的实际工作方式。

结语

我写这篇文章的初衷是,当我最初学习 OSI 模型时,我发现它非常令人困惑(所有这些层是什么?它们是真实存在的吗?这是网络的实际工作原理吗?发生了什么?)我希望有人告诉我这个只使用 TCP/IP 网络协议的人,只需了解 OSI 模型第二、三、四和七层与 TCP/IP 的关系,然后忽略它的所有其他内容即可。所以我希望这篇文章对某些人能有所帮助!


via: https://jvns.ca/blog/2021/05/11/what-s-the-osi-model-/

作者:Julia Evans 选题:lujun9972 译者:hanszhao80 校对:wxy

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

在之前的一篇文章中,我介绍了使用 pandoc 将少量 Markdown 文件 批量转换 为 HTML 的过程。在那篇文章中,我创建了多个 HTML 文件,但 Pandoc 可以做的更多。它被称为文档转换的“瑞士军刀” —— 这是有充分理由的。很少有它做不到的事情。

Pandoc 可以将 .docx、.odt、.html、.epub、LaTeX、DocBook 等格式互相转换,或者转换为其他格式,例如 JATS、TEI Simple、AsciiDoc 等。

是的,这意味着 Pandoc 可以将 .docx 文件转换为 .pdf 和 .html 文件,但你可能会想:“Word 也可以将文件导出为 .pdf 和 .html。为什么我需要 Pandoc 呢?”

嗯,本来呢,你这个说法也没错,但考虑到 Pandoc 可以转换这么多格式,它很可能成为你所有转换任务的首选工具。例如,我们中的许多人都知道 Markdown 编辑器 可以将其 Markdown 文件导出为 .html。而使用 Pandoc 文件也可以转换为许多其他格式。

我很少将 Markdown 导出为 HTML。我通常让 Pandoc 来做这件事。

使用 Pandoc 转换文件格式

本文中,我会将 Markdown 文件转换成几种不同的格式。我几乎所有的写作都使用 Markdown 语法,但我经常需要转换为另一种格式:学校作业通常需要的 .docx 格式;我创建的网页通常需要的 .html 格式;工作需要的 .epub 格式;传单和讲义需要的 .pdf 格式;甚至包括一个大学数字人文项目偶尔需要的 TEI Simple 格式。Pandoc 可以轻松处理所有这些格式,甚至更多。

首先,你需要 安装 pandoc。此外,要创建 .pdf 文件,还需要 LaTeX。我最喜欢的套件是 TeX Live

注意:如果你想在安装前试用 pandoc,这里有一个在线试用页面:http://pandoc.org/try/

安装 pandoc 和 texlive

Ubuntu 和其他 Debian 发行版的用户可以在终端中输入以下命令:

sudo apt-get update
sudo apt-get install pandoc texlive

请注意第二行,你将一次性安装 pandoctexliveapt-get 命令 支持你这样做。不过,我建议你先去喝杯咖啡,因为这可能需要几分钟的时间。

开始转换

安装完成 pandoctexlive 后,你就可以尝试用它们来完成一些工作了!

该项目的示例文档将是一篇文章,该文章于 1894 年 12 月首次发表在《北美评论》上,标题为“如何击退火车劫匪”。我将使用的 Markdown 文件是前一段时间创建的,该文章的一个恢复项目的一部分(LCTT 译注:这是篇一百多年前发表的文章,这是一个数字化“恢复”项目)。

我把这篇文章保存为 how_to_repel_train_robbers.md,它位于我的 Documents 目录下,名为 samples 的子目录中。它在 Ghostwriter 中看起来是这样的:

在 Ghostwriter 中查看原始的 Markdown 文件

我想创建此文件的 .docx、.pdf 和 .html 版本。

第一次转换

首先,我将制作一个 .pdf 副本,因为我在安装 LaTeX 包时遇到了些麻烦。

~/Documents/samples/ 目录中,我输入以下,以创建一个 .pdf 文件:

pandoc -o htrtr.pdf how_to_repel_train_robbers.md

上述命令将基于 how_to_repel_train_robbers.md 文件,创建一个名为 htrtr.pdf 的文件。我使用 htrtr 作为名称的原因是:嗯,它比 how_to_repel_train_robbers 短。htrtr 其实是长标题中的单词首字母排列。

这是 .pdf 文件制作完成后的一个截图:

在 Ocular 中查看的转换后的 PDF 文件

第二次转换

接下来,我想创建一个 .docx 文件。该命令与我用来创建 .pdf 的命令几乎相同,它是:

pandoc -o htrtr.docx how_to_repel_train_robbers.md

很快,一个 .docx 文件就创建好了。这是它在 Libre Writer 中的样子:

在 Libre Writer 中查看转换后的 DOCX 文件

第三次转换

我可能会想在网上发布这个,所以再多一个支持网页的格式也不错。我将使用以下命令创建一个 .html 文件:

pandoc -o htrtr.html how_to_repel_train_robbers.md

同样,创建它的命令与前两次转换非常相似。这是该 .html 文件在浏览器中的样子:

在 Firefox 中查看的转换后的 HTML 文件

注意到什么了吗?

让我们再看看之前的命令。它们是:

pandoc -o htrtr.pdf how_to_repel_train_robbers.md
pandoc -o htrtr.docx how_to_repel_train_robbers.md
pandoc -o htrtr.html how_to_repel_train_robbers.md

这三个命令唯一不同的是 htrtr 后的扩展名。这提示你 pandoc 会依赖于你提供的输出文件扩展名(来决定目标转换格式)。

总结

Pandoc 可以做的远不止这里完成的三个小转换。如果你选择使用一个首选格式编写文件,但时不时又需要将文件转换为另一种格式,pandoc 很大概率都能为你完成。

现在,既然你已经学会了,你会用它做什么呢?你会把它自动化吗?如果你有一个网站,想供读者下载文章怎么办?你可以修改这些小命令,把它们编写成一个脚本,你的读者可以决定他们想要哪种格式。你可以提供 .docx、.pdf、.odt、.epub 或更多格式。你的读者只需要选择一种格式,然后对应的转换脚本就会执行,最后,你的读者下载他们想要的文件。这是完全可以做到的。


via: https://itsfoss.com/pandoc-convert-file/

作者:Bill Dyer 选题:lujun9972 译者:lkxed 校对:wxy

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