Moshe Zadka 发布的文章

控制你的提示符,让你需要的所有信息触手可及。

 title=

没有什么比我忘记在我的 Git 仓库中 git add 文件更让我恼火的了。我在本地测试,提交,然后推送,却发现在持续集成阶段失败了。更糟糕的是,我在 main 分支而不是特性分支上,并不小心推送到它。最好的情况是,因为分支保护而失败,我需要做一些操作才能把改动推送到一个分支。更糟糕的是,我没有正确配置分支保护,不小心直接推送到了 main 分支。

如果这些信息能在提示中直接获得,那不是很好吗?

在提示符中甚至还有更多有用的信息。虽然 Python 虚拟环境的名称在提示符中,但虚拟环境的 Python 版本却不在提示符中。

可以仔细地将 PS1 环境变量配置为所有相关的信息。这可能会变得很长,很烦人,而且调试起来并不简单。

这就是 Starship 被设计来解决的问题。

安装 Starship

Starship 的初始设置只需要两个步骤:安装并配置你的 shell。安装可以很简单:

$ curl -fsSL https://starship.rs/install.sh

阅读安装脚本,确保你理解它的作用,然后让它可执行并运行它:

$ chmod +x install.sh
$ ./install.sh

还有其他的安装方法,在其网站上有介绍。你可以在构建镜像的步骤中设置虚拟机或容器。

配置 Starship

下一步是配置你的 shell 来使用它。要一次性尝试,假设 shell 是 bash 或 zsh,请运行以下命令:

$ eval "$(starship init $(basename $SHELL))"

你的提示符立即改变:

localhost in myproject on  master
>

如果你喜欢你所看到的,把 eval "$(starship init $(basename $SHELL))" 添加到你的 shell 的 rc 文件中,使其永久化。

自定义 Starship

默认安装假定你可以安装“电脑迷字体”,例如 Fantasque Sans Mono。 特别是,你需要一种带有来自 Unicode 的“私有实现”部分的字形的字体。

这在控制终端时非常有效,但有时,终端的配置并不容易。例如,当使用一些浏览器内的 shell 抽象时,配置浏览器的字体可能是不太容易的。

该码位的最大用户是 Git 集成,它使用一个特殊的自定义符号来表示“分支”。禁用它可以通过使用文件 ~/.config/starship.toml 来配置 starship.rs。

禁用分支符号是通过配置 git_branch 部分的 format 变量完成的:

[git_branch]
format = "on [$branch]($style) "

starship.rs 的一个好处是,改变配置会立即生效。保存文件,按下回车,看看字体是否符合预期。

还可以配置提示符中不同部分的颜色。例如,如果 Python 部分的亮黄色在白色背景上有点难看,你可以配置为蓝色:

[python]
style = "blue bold"

许多语言都有配置支持,包括 Go、.NET 和 JavaScript。还支持显示命令的持续时间(只针对耗时超过阈值的命令)等。

控制提示符

控制你的提示符,让你需要的所有信息触手可及。安装 Starship,让它为你工作,并享受吧!


via: https://opensource.com/article/22/2/customize-prompt-starship

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

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

无论你是在家庭实验室里试验 Kubernetes,还是想成为一个成为 Kubernetes 的维护者,这里都有适合你的资源。

 title=

2021 年对于 Kubernetes 来说是令人兴奋的一年,这些文章证明了这一点。从有趣的界面到家庭实验室再到开发环境,看看我在 2021 年最喜欢的 K8s 文章。

如果你对基本原理感兴趣,这篇 介绍 Linux 上的容器 的文章从内到外阐明了 Linux 容器的工作原理。你是否想获取一些乐趣?安装 minikube 并开始使用 DOOM 游戏作为界面 来管理它。另一个选择是 kubectl,这是一个更传统的 Kubernetes 控制 CLI。

即使你只在你的 Linux 家庭实验室 上运行 Kubernetes,你也可以使用 Terraform 和 Helm 等工具来自动化日常操作。这创造了一个 更好地掌握 Terraform 的机会。

生活中可以确定的几件事之一是,计算机会以奇怪而有趣的方式出错。用 Prometheus 和 Grafana 监控你的 Kubernetes 集群,看看它是如何出错的。使用 Grafana Tempo 的分布式跟踪来监控里面运行的应用。通过引入 Chaos Mesh 在 Kubernetes 中造成有意的混乱,来监控你监控的性能。

如果你正在开发在 Kubernetes 上运行的应用,Quarkus 可以帮助你开发和测试。使用 Java 的开发者 可以在 Kubernetes 上使用容器运行 应用。像 Tackle-DiVA 这样的工具有助于将应用移植到容器中。

像所有成功的开源项目一样,Kubernetes 的部分价值是一个强大的 生态系统。比如 KubeEdge 项目,它有助于将计算和数据更接近终端用户。在使用 Kubernetes 一段时间后,你甚至可能想 成为 Kubernetes 维护者。

有这么多有趣的 Kubernetes 内容可供学习,可能很难将它们全部看完。不过,对于系统管理员和开发人员来说,优秀的 Kubernetes 资源是必须的。请阅读这些精选的内容。


via: https://opensource.com/article/21/12/learn-kubernetes-2022

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

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

使用 argparse 模块为应用程序设置命令行选项。

 title=

有一些第三方库用于命令行解析,但标准库 argparse 与之相比也毫不逊色。

无需添加很多依赖,你就可以编写带有实用参数解析功能的漂亮命令行工具。

Python 中的参数解析

使用 argparse 解析命令行参数时,第一步是配置一个 ArgumentParser 对象。这通常在全局模块内完成,因为单单\_配置\_一个解析器没有副作用。

import argparse

PARSER = argparse.ArgumentParser()

ArgumentParser 中最重要的方法是 .add_argument(),它有几个变体。默认情况下,它会添加一个参数,并期望一个值。

PARSER.add_argument("--value")

查看实际效果,调用 .parse_args():

PARSER.parse_args(["--value", "some-value"])
Namespace(value='some-value')

也可以使用 = 语法:

PARSER.parse_args(["--value=some-value"])
Namespace(value='some-value')

为了缩短在命令行输入的命令,你还可以为选项指定一个短“别名”:

PARSER.add_argument("--thing", "-t")

可以传入短选项:

PARSER.parse_args("-t some-thing".split())
Namespace(value=None, thing='some-thing')

或者长选项:

PARSER.parse_args("--thing some-thing".split())
Namespace(value=None, thing='some-thing')

类型

有很多类型的参数可供你使用。除了默认类型,最流行的两个是布尔类型和计数器。布尔类型有一个默认为 True 的变体和一个默认为 False 的变体。

PARSER.add_argument("--active", action="store_true")
PARSER.add_argument("--no-dry-run", action="store_false", dest="dry_run")
PARSER.add_argument("--verbose", "-v", action="count")

除非显式传入 --active,否则 active 就是 False。dry-run 默认是 True,除非传入 --no-dry-run。无值的短选项可以并列。

传递所有参数会导致非默认状态:

PARSER.parse_args("--active --no-dry-run -vvvv".split())
Namespace(value=None, thing=None, active=True, dry_run=False, verbose=4)

默认值则比较单一:

PARSER.parse_args("".split())
Namespace(value=None, thing=None, active=False, dry_run=True, verbose=None)

子命令

经典的 Unix 命令秉承了“一次只做一件事,并做到极致”,但现代的趋势把“几个密切相关的操作”放在一起。

git、podman 和 kubectl 充分说明了这种范式的流行。argparse 库也可以做到:

MULTI_PARSER = argparse.ArgumentParser()
subparsers = MULTI_PARSER.add_subparsers()
get = subparsers.add_parser("get")
get.add_argument("--name")
get.set_defaults(command="get")
search = subparsers.add_parser("search")
search.add_argument("--query")
search.set_defaults(command="search")
MULTI_PARSER.parse_args("get --name awesome-name".split())
Namespace(name='awesome-name', command='get')
MULTI_PARSER.parse_args("search --query name~awesome".split())
Namespace(query='name~awesome', command='search')`

程序架构

使用 argparse 的一种方法是使用下面的结构:

## my_package/__main__.py
import argparse
import sys

from my_package import toplevel

parsed_arguments = toplevel.PARSER.parse_args(sys.argv[1:])
toplevel.main(parsed_arguments)
## my_package/toplevel.py

PARSER = argparse.ArgumentParser()
## .add_argument, etc.

def main(parsed_args):

    ...

    # do stuff with parsed_args

在这种情况下,使用 python -m my_package 运行。或者,你可以在包安装时使用 console\_scprits 入口点。

总结

argparse 模块是一个强大的命令行参数解析器,还有很多功能没能在这里介绍。它能实现你想象的一切。


via: https://opensource.com/article/21/8/python-argparse

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

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

Lima 可以帮助克服在 Mac 上运行容器的挑战。

 title=

在你的 Mac 上运行容器可能是一个挑战。毕竟,容器是基于 Linux 特有的技术,如控制组和命名空间。

幸运的是,macOS 拥有一个内置的 虚拟机监控程序 hypervisor ,允许在 Mac 上运行虚拟机(VM)。虚拟机监控程序是一个底层的内核功能,而不是一个面向用户的功能。

hyperkit 是一个可以使用 macOS 虚拟机监控程序运行虚拟机的 开源项目。hyperkit 被设计成一个“极简化”的虚拟机运行器。与 VirtualBox 不同,它没有花哨的 UI 功能来管理虚拟机。

你可以获取 hyperkit,这是一个运行容器管理器的极简 Linux 发行版,并将所有部分组合在一起。但这将有很多变动组件,且听起来像有很多工作。特别是如果你想通过使用 vpnkit (一个开源项目,用于创建感觉更像是主机网络一部分的虚拟机网络)使网络连接更加无缝。

Lima

当 lima 项目 已经解决了这些细节问题时,就没有理由再去做这些努力了。让 lima 运行的最简单方法之一是使用 Homebrew。你可以用这个命令安装 lima:

$ brew install lima

安装后,可能需要一些时间,就享受一些乐趣了。为了让 lima 知道你已经准备好了,你需要启动它。下面是命令:

$ limactl start

如果这是你第一次运行,你会被问到是否喜欢默认值,或者是否要改变其中的任何一项。默认值是非常安全的,但我喜欢生活在疯狂的一面。这就是为什么我跳进一个编辑器,从以下地方进行修改:

- location: "~"
  # CAUTION: `writable` SHOULD be false for the home directory.
  # Setting `writable` to true is possible but untested and dangerous.
  writable: false

变成:

 - location: "~"
  # I *also* like to live dangerously -- Austin Powers
  writable: true

正如评论中所说,这可能是危险的。可悲的是,许多现有的工作流程都依赖于挂载是可读写的。

默认情况下,lima 运行 containerd 来管理容器。containerd 管理器也是一个非常简洁的管理器。虽然使用一个包装的守护程序,如 dockerd,来增加这些漂亮的工效是很常见的,但也有另一种方法。

nerdctl 工具

nerdctl 工具是 Docker 客户端的直接替换,它将这些功能放在客户端,而不是服务器上。lima 工具允许无需在本地安装就可以直接从虚拟机内部运行 nerdctl。

做完这些后,可以运行一个容器了!这个容器将运行一个 HTTP 服务器。你可以在你的 Mac 上创建这些文件:

$ ls
index.html
$ cat index.html
hello

现在,挂载并转发端口:

$ lima nerdctl run --rm -it -p 8000:8000 -v $(pwd):/html --entrypoint bash python
root@9486145449ab:/#

在容器内,运行一个简单的 Web 服务器:

$ lima nerdctl run --rm -it -p 8000:8000 -v $(pwd):/html --entrypoint bash python
root@9486145449ab:/# cd /html/
root@9486145449ab:/html# python -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (<http://0.0.0.0:8000/>) ...

在另一个终端,你可以检查一切看起来都很好:

$ curl localhost:8000
hello

回到容器上,有一条记录 HTTP 客户端连接的日志信息:

10.4.0.1 - - [09/Sep/2021 14:59:08] "GET / HTTP/1.1" 200 -

一个文件是不够的,所以还要做些优化。 在服务器上执行 CTRL-C,并添加另一个文件:

^C
Keyboard interrupt received, exiting.
root@9486145449ab:/html# echo goodbye &gt; foo.html
root@9486145449ab:/html# python -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

检查你是否能看到新的文件:

$ curl localhost:8000/foo.html
goodbye

总结

总结一下,安装 lima 需要一些时间,但完成后,你可以做以下事情:

  • 运行容器。
  • 将你的主目录中的任意子目录挂载到容器中。
  • 编辑这些目录中的文件。
  • 运行网络服务器,在 Mac 程序看来,它们是在 localhost 上运行的。

这些都是通过 lima nerdctl 实现的。


via: https://opensource.com/article/21/9/run-containers-mac-lima

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

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

了解 watch 命令如何让你知道任务已完成或命令已执行。

 title=

有很多时候,你需要等待一些事情的完成,比如:

  • 一个文件的下载。
  • 创建或解压一个 tar 文件。
  • 一个 Ansible 作业。

其中一些进程有进度指示,但有时进程是通过一层抽象运行的,衡量进度的唯一方法是通过其副作用。其中一些可能是:

  • 一个正在下载的文件不断增长。
  • 一个从 tarball 中提取的目录被文件填满了。
  • Ansible 作业构建了一个容器。

你可以用这样的命令查询所有这些:

$ ls -l downloaded-file
$ find . | wc -l
$ podman ps
$ docker ps

但是反复运行这些命令,即使是利用 Bash 历史 和向上箭头的便利,也是很乏味的。

另一种方法是写一个小的 Bash 脚本来为你自动执行这些命令:

while :
do
 docker ps
 sleep 2
done

但这样的脚本写起来也会很繁琐。你可以写一个小的通用脚本,并将其打包,这样它就可以一直被你使用。幸运的是,其他开源的开发者已经有了这样的经验和做法。

那就是 watch 这个命令。

安装 watch

watch 命令是 procps-ng 包的一部分,所以如果你是在 Linux 上,你已经安装了它。

在 macOS 上,使用 MacPorts 或 Homebrew 安装 watch。在 Windows 上,使用 Chocolatey。

使用 watch

watch 命令定期运行一个命令并显示其输出。它有一些文本终端的特性,所以只有最新的输出才会出现在屏幕上。

最简单的用法是:watch <command>。

例如,在 docker ps 命令前加上 watch,就可以这样操作:

$ watch docker ps

用 watch 命令,以及一些创造性的 Unix 命令行技巧,可以生成临时的仪表盘。例如,要计算审计事件:

$ watch 'grep audit: /var/log/kern.log |wc -l'

在最后一个例子中,如果有一个可视化的指示,表明审计事件的数量发生了变化,这可能是有用的。如果变化是预期的,但你想让一些东西看起来“不同”,watch --differences 就很好用。它可以高亮显示与上次运行的任何差异。如果你在多个文件中搜索,这一点尤其有效,所以你可以很容易地看到哪个文件发生了变化。

如果没有预期的变化,你可以使用 watch --differences=permanent 要求它们被“永久”高亮显示,以便知道哪些变化需要调查。这通常是更有用的。

控制频率

最后,有时该命令可能是资源密集型的,不应运行得太频繁。-n 参数控制频率。watch 默认使用 2 秒间隔,但是 watch -n 10 可能适合于资源密集型的情况,比如在子目录的任何文件中搜索一个模式:

$ watch -n 10 'find . -type f | xargs grep suspicious-pattern'

用 watch 观察一个命令

watch 命令对于许多临时性的系统管理任务非常有用,在这些任务中,你需要在没有进度条的情况下等待一些耗时的步骤,然后再进入下一个步骤。尽管这种情况并不理想,但 watch 可以使情况稍微好转。它让你有时间为工作做回顾性笔记!"。下载 备忘录,让有用的语法和选项触手可及。。


via: https://opensource.com/article/21/9/linux-watch-command

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

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

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

 title=

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

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

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

安装

在 Linux 上,你可以用你的包管理器(如 apt 或 dnf)来安装 qpdf 和 poppler-utils。比如在 Fedora 上:

$ sudo dnf install qpdf poppler-utils

在 macOS 上,使用 MacPorts 或 Homebrew。在 Windows 上,使用 Chocolatey。

qpdf

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

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

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

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

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

合并文件比较微妙:

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

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

poppler-utils

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