分类 技术 下的文章

在 Linux 命令行进行打印的内容比单单一个 lp 命令多得多,让我们来看一些可用选项。

Sherry

Linux 命令行打印很容易。你可以使用 lp 命令来请求打印,并使用 lpq 命令来查看队列中有哪些打印作业,但是当你要双面打印或使用纵向模式时,这些会变得有些复杂。你可能还需要做很多其他事情,例如打印多份文档副本或取消打印作业。让我们来看看一些选项,当你从命令行打印时,如何让你的打印输出看起来如你所愿。

显示打印机配置

要从命令行查看打印机设置,请使用 lpoptions 命令。 输出应如下所示:

$ lpoptions
copies=1 device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=1553023232 marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00 marker-levels=18,62,62,63 marker-names='Black\ Cartridge\ HP\ CC530A,Cyan\ Cartridge\ HP\ CC531A,Magenta\ Cartridge\ HP\ CC533A,Yellow\ Cartridge\ HP\ CC532A' marker-types=toner,toner,toner,toner number-up=1 printer-commands=none printer-info='HP Color LaserJet CP2025dn (F47468)' printer-is-accepting-jobs=true printer-is-shared=true printer-is-temporary=false printer-location printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7' printer-state=3 printer-state-change-time=1553023232 printer-state-reasons=none printer-type=167964 printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn sides=one-sided

如果将其空格转换为回车符,输出可能会更人性化,请注意列出了多少设置选项。

注意:在下面的输出中,一些行被重新链接,以使输出更具可读性。

$ lpoptions | tr " " '\n'
copies=1
device-uri=dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/
finishings=3
job-cancel-after=10800
job-hold-until=no-hold
job-priority=50
job-sheets=none,none
marker-change-time=1553023232
marker-colors=#000000,#00FFFF,#FF00FF,#FFFF00
marker-levels=18,62,62,63
marker-names='Black\ Cartridge\ HP\ CC530A,
Cyan\ Cartridge\ HP\ CC531A,
Magenta\ Cartridge\ HP\ CC533A,
Yellow\ Cartridge\ HP\ CC532A'
marker-types=toner,toner,toner,toner
number-up=1
printer-commands=none
printer-info='HP Color LaserJet CP2025dn (F47468)'
printer-is-accepting-jobs=true
printer-is-shared=true
printer-is-temporary=false
printer-location
printer-make-and-model='HP Color LaserJet cp2025dn pcl3, hpcups 3.18.7'
printer-state=3
printer-state-change-time=1553023232
printer-state-reasons=none
printer-type=167964
printer-uri-supported=ipp://localhost/printers/Color-LaserJet-CP2025dn
sides=one-sided

使用 -v 选项时,lpinfo 命令将列出驱动程序和相关信息:

$ lpinfo -v
network ipp
network https
network socket
network beh
direct hp
network lpd
file cups-brf:/
network ipps
network http
direct hpfax
network dnssd://HP%20Color%20LaserJet%20CP2025dn%20(F47468)._pdl-datastream._tcp.local/ <== printer
network socket://192.168.0.23 <== printer IP

lpoptions 命令将显示默认打印机的设置。使用 -p 选项指定其中一个可用打印机代号:

$ lpoptions -p LaserJet

lpstat -p 命令显示打印机的状态,而 lpstat -p -d 列出可用打印机列表。

$ lpstat -p -d
printer Color-LaserJet-CP2025dn is idle. enabled since Tue 19 Mar 2019 05:07:45 PM EDT
system default destination: Color-LaserJet-CP2025dn

非常有用的命令

要在默认打印机上打印文档,只需使用 lp 命令,后跟要打印的文件名即可。 如果文件名包含空格(在 Linux 系统上很少见),请将该名称放在引号中或开始输入文件名并按 Tab 键调用空格的转义标志(如下面的第二个示例所示)。

$ lp "never leave home angry"
$ lp never\ leave\ home\ angry

lpq 命令显示打印队列:

$ lpq
Color-LaserJet-CP2025dn is ready and printing
Rank Owner Job File(s) Total Size
active shs 234 agenda 2048 bytes

使用 -n 选项时,lp 命令可用来指定所需打印输出的份数:

$ lp -n 11 agenda

要取消打印作业,可以使用 cancellprm 命令。如果没来得及执行,则可能会看到以下信息:

$ cancel 229
cancel: cancel-job failed: Job #229 is already completed - can't cancel.

双面打印

要以双面模式打印,你可以在 lp 命令中使用 sides 选项,该选项不但表示了在纸张的正反面进行打印,还表示了从纸张的哪个边开始打印。这个设置代表了你期望以双面纵向文档的正常方式打印。

$ lp -o sides=two-sided-long-edge Notes.pdf

如果要所有文档以双面模式打印,则可以使用 lpoptions 命令更改 sides 设置以修改 lp 的设置。

$ lpoptions -o sides=two-sided-short-edge

要恢复为单面打印,可以使用如下命令:

$ lpoptions -o sides=one-sided

横向打印

要以横向模式打印,可以在 lp 命令中使用 landscape 选项。

$ lp -o landscape penguin.jpg

CUPS(Unix 通用打印系统)

Linux 系统上使用的打印系统是基于标准的开源打印系统,称为 CUPS,原意是 Unix 通用打印系统 Common Unix Printing System 。 它允许计算机充当打印服务器。


via: https://www.networkworld.com/article/3373502/printing-from-the-linux-command-line.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:stevenzdg988 校对:wxy

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

资源配额控制应用的 CPU 或内存使用情况,防止资源被过量使用或被抢占。

 title=

当 Kubernetes 集群运行过一段时间或者在被开发者大量使用后,Kubernetes 资源(例如 CPU 和内存)的控制的问题就会显现出来。而在大多情况下只有集群出问题后,我们才会意识到资源控制的重要性。

Kubernetes 部署过程如果没有能充分考虑到将来的扩展性,资源类问题将会非常常见,此类问题与集群的管理和部署团队的经验有关。

如果不加以合理控制,一个暴力的应用或者开发者可能影响到共享该集群的所有业务,大家因此会相互埋怨、指责并保护性地抢占资源。这对于集群管理和开发人员都是非常难以处理的场景。

在 Kubernetes 环境中控制应用的计算资源使用有多种方式。大部分情况下,我们可以使用“资源控制”和“限制范围”。注意存储管理不在我们讨论范围之内,存储管理可以通过 持久卷 Persistent Volume 件,以实现针对不同的存储控制需求。

资源配额是一种控制 Kubernetes 计算资源的方法。本文告诉你如何使用该功能来管理开发人员行为并控制应用的资源使用。

什么是资源配额

简而言之,资源配额 提供了限制每个命名空间资源消耗的约束条件,它们只能在命名空间级别上应用,这意味着它们可以应用于计算资源,并限制命名空间内的对象数量。

Kubernetes资源配额通过 ResourceQuota 对象来为每个命名空间设置资源配额,对以下对象类型的 CPU 和内存进行限制:

  • 吊舱 Pod
  • 服务 Service
  • 机密信息 Secret
  • 持久卷断言 Persistent Volume Claim (PVC)
  • 配置映射 ConfigMap

Kubernetes 通过 requestlimit 两个参数对 CPU 和内存进行限制(参考 LimitRange 文档)。前者表示容器最小被保证资源,后者表示容器最大可用资源。实际上最大可用资源还受限于其它容器的实际使用情况。

下一张图片解释了配额中 requestlimit 的区别:

 title=

下面我们就通过一个例子来说明如何设置资源配额来创建约束,将应用程序限制在某些资源上,它还展示了实现资源配额以获得对 Kubernetes 的控制的有用性。

准备环境

首先你需要一个 Kubernetes 环境。以下是我使用 Kubernetes 环境:

  • Minikube v1.14.2
  • Fedora 33 操作系统
  • 互联网接入

如果你想在 Linux 机器上通过 Minikube 搭建 Kubernetes 测试环境,可以参考 Bryant Son 的《Minikube 入门》 一文。Window 或者 macOS 用户可以参考这篇文章

设置资源配额

这里我们仅展示 CPU 配额设置步骤,配置内存配额或两者的组合与之类似。

在生产环境中,CPU 是最需要被控制的资源,尤其是在多应用的场景下特别需要注意防止某些应用消耗太多 CPU 而影响到其它应用。

首先我们创建一个命名空间,在其中设置 CPU 配额:

$ kubectl create namespace quota-test
namespace/quota-test created

准备 cpu-quota.yaml 文件,内容如下:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: test-cpu-quota
spec:
  hard:
    requests.cpu: "100m"  
    limits.cpu: "200m"

应用 CPU 配额到 Kubernetes 集群:

$ kubectl apply -f cpu-qouta.yaml
resourcequota/test-cpu-quota created

使用 kubectl describe 检查配额配置情况:

$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name:         test-cpu-quota
Namespace:    quota-test
Resource      Used  Hard
--------      ----  ----
limits.cpu    0     200m
requests.cpu  0     100m

Used resources 列中显示了当前情况,该列值会随着 吊舱 Pod 的部署而变化。

下面是我们来验证限额管理的场景。我们将在同一命名空间下部署三个不同的吊舱,为它们配置以不同的资源限制如下:

  • PodA:第一个被实例化,使用 50% 可用 CPU 资源
  • PodB:第二个被实例化,使用其余 50% 可用 CPU 资源
  • PodC:没有可用 CPU 资源,因此不会被部署

部署吊舱

PodA:

$ kubectl create -n quota-test -f - << EOF
apiVersion: v1
kind: Pod
metadata:
  name: poda
spec:
  containers:
  - name: quota-test
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
    resources:
      requests:
        cpu: "50m"
      limits:
        cpu: "100m"
  restartPolicy: Never
EOF

部署 PodA 后,再次查看配额描述信息中的 Used CPU 信息:

$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name:         test-cpu-quota
Namespace:    quota-test
Resource      Used  Hard
--------      ----  ----
limits.cpu    100m  200m
requests.cpu  50m   100m

PodB:

$ kubectl create -n quota-test -f - << EOF
apiVersion: v1
kind: Pod
metadata:
  name: podb
spec:
  containers:
  - name: quota-test
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
    resources:
      requests:
        cpu: "50m"
      limits:
        cpu: "100m"
  restartPolicy: Never
EOF

再次查看 CPU 资源使用,此时 PodB 启动后 CPU 限制已经达到上限:

$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name:         test-cpu-quota
Namespace:    quota-test
Resource      Used  Hard
--------      ----  ----
limits.cpu    200m  200m
requests.cpu  100m  100m

PodC:

试着创建 PodC,此时 CPU 配额已经被 PodA 和 PodB 用尽:

$ kubectl create -n quota-test -f - << EOF
apiVersion: v1
kind: Pod
metadata:
  name: podc
spec:
  containers:
  - name: quota-test
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
    resources:
      requests:
        cpu: "5m"
      limits:
        cpu: "10m"
  restartPolicy: Never
EOF

正我们期望,第三个 Pod 无法被启动,配额限制了吊舱的创建:

Error from server (Forbidden): error when creating "STDIN": pods "podc" is forbidden: exceeded quota: test-cpu-quota, requested: limits.cpu=10m,requests.cpu=5m, used: limits.cpu=200m,requests.cpu=100m, limited: limits.cpu=200m,requests.cpu=100m

如我们的例子所示,定义合理的资源配额限制开发者行为对 Kubernetes 管理十分重要。

清理

删除刚才创建的命名空间 quota-test:

$ kubectl delete -n quota-test

规划资源配额

Kubernetes 中提供多种方式来控制资源的抢占和使用,合理的规划和配置配额、限制范围和其它原生参数对保持集群的稳定性十分必要。

你应该十分谨慎地控制计算资源的资源配额,特别是关键业务的生产应用环境。

在规划资源配额时,开发人员的参与很重要,需要他们预估并给出最合理的资源使用值。


via: https://opensource.com/article/20/12/kubernetes-resource-quotas

作者:Mike Calizo 选题:lujun9972 译者:larryzju 校对:wxy

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

这一标题可能看起来很粗略且吸睛。请允许我解释一下我在本教程中将要阐释的内容。假设你想下载一个压缩文件,将其解压缩,并从命令行中将文件从一个位置移动到另一个位置。根据上面的场景,我们可能需要至少三个 Linux 命令,一个用于下载文件,一个用于提取下载的文件,一个用于移动文件。如果你是中高级 Linux 用户,你可以通过一行命令或脚本在几秒钟/分钟内轻松完成这一任务。但是,如果你是一个不懂得太多 Linux 命令的菜鸟你可能就需要一些帮助了。

当然,谷歌的快速搜索可能会找到很多结果。或者,你可以使用 手册页。但是有些手册页实在很长,很全面,但缺少有用的示例。当你在特定的标志/选项上寻找特定的信息时,你可能需要向下检索相当长的时间。值得庆幸的是,有一些 好的手册页替代品,它们主要关注于实用的命令。一个很好的选择是 TLDR 手册。使用 TLDR 手册,我们可以通过实际示例快速轻松地学习一个 Linux 命令。要使用 TLDR 手册,我们需要 TLDR 客户端。有很多客户。今天我们就来了解一个这样的客户端,名为 “Tldr++”

Tldr++ 是一个快速和交互式的 Tldr 客户端,用 Go 编程语言编写。与其他 Tldr 客户端不同,它是完全交互式的。这意味着,你可以选择一个命令,读取所有示例,并立即运行任何命令,而不必在终端中重新键入或复制/粘贴每个命令。还是不明白?没有问题。请继续阅读,以便动态学习和实践 Linux 命令。

安装 Tldr++

安装 Tldr++ 非常简单。从 发布页面 下载 Tldr++ 最新版本。解压它并将 Tldr++ 二进制文件移动到你的 $PATH 中。

$ wget https://github.com/isacikgoz/tldr/releases/download/v0.5.0/tldr_0.5.0_linux_amd64.tar.gz
$ tar xzf tldr_0.5.0_linux_amd64.tar.gz
$ sudo mv tldr /usr/local/bin
$ sudo chmod +x /usr/local/bin/tldr

现在,运行 tldr 二进制代码将 TLDR 手册部署到本地系统中。

$ tldr

示例输出:

Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Compressing objects: 100% (6/6), done.
Total 18157 (delta 0), reused 3 (delta 0), pack-reused 18151
Successfully cloned into: /home/sk/.local/share/tldr

Tldr++ 可以在 AUR 中使用。如果你使用 Arch Linux 上,你可以使用任何 AUR 助手来安装它,例如 YaY。确保你已经从系统中删除了任何现有的 TLDR 客户端,并运行以下命令安装 Tldr++。

$ yay -S tldr++

或者,你也可以像下面描述的那样从源代码进行编译。因为 Tldr++ 是用 Go 语言编写的,所以请确保你 Linux 系统中已经安装了 Go 语言。如果还没有安装,请参考下面的指南。

在安装好 Go 语言之后, 运行以下的命令来安装 Tldr++。

$ go get -u github.com/isacikgoz/tldr

该命令在当前工作目录中下载 tldr 代码库中的内容并存储到 go 文件夹中。

现在,运行 tldr 二进制代码将 TLDR 手册部署到本地系统中。

$ go/bin/tldr

示例输出:

最后,将 tldr 二进制文件复制到你的路径中。

$ sudo mv tldr /usr/local/bin

现在是时候看一些例子了。

Tldr++ 用法

输入不带任何选项的 tldr 命令,以字母顺序显示所有命令示例。

使用 向上/向下箭头 来浏览命令,键入任何字母来搜索或键入命令名称来查看相应命令的示例。 ? 以浏览更多消息,按 Ctrl+c 返回/退出。

要显示特定命令的示例命令,例如 apt,可以这样做:

$ tldr apt

从列表中选择任意示例命令并按回车键。在选定的命令前会看到一个 * 符号。例如,我选择第一个命令即 sudo apt update。现在,它会问你是否继续。如果命令正确,只需键入 y 继续,并输入 sudo 密码运行所选命令。

看到了吗?你不需要在终端中复制/粘贴或键入实际的命令。只需从列表中选择它,并极速运行!

Tldr 手册中有数百个 Linux 命令示例。你可以每天选择一个或两个命令,并彻底学习它们。每天坚持这样的练习,尽可能多的掌握。

使用 Tldr++ 动态学习和实践 Linux 命令

现在回到我在第一段中提到的场景。你需要下载一个文件,将其解压缩并将其移动到不同的位置,并使其可执行。让我们看看如何使用 Tldr++ 客户端进行交互。

第一步 – 从网上下载文件

要使用命令行下载文件,我们主要使用 curlwget 命令。让我使用 wget 下载文件。要打开 wget 命令的 TLDR 页面,只需执行以下命令:

$ tldr wget

下面是 wget 命令的示例。

你可以使用 向上/向下箭头 来浏览命令列表。一旦你选择了你所选择的命令,按回车键。这里我选择了第一个命令。

现在,输入路径来下载文件。

然后将要求你确认该命令是否正确。如果命令正确,只需键入 yesy 就可以开始下载文件。

我们已经下载了文件。让我们继续解压这个文件。

第二步 – 解压已下载的文件

我们下载了 tar.gz 文件。所以我将打开 TLDR 手册的 tar 页面。

$ tldr tar

你将看到示例命令列表。浏览这些示例,找出哪个命令适合提取 tar.gz(gzip 格式)文件,按回车键。在我们的例子中,它是第三个命令。

现在,系统将提示你输入 tar.gz 文件的路径。只需输入路径并按回车键。Tldr++ 支持智能文件提示。这意味着它会在你键入时自动补全文件名。只需按 TAB 键自动完成。

如果将文件下载到其他位置,只需键入完整路径,例如 /home/sk/Downloads/tldr_0.5.0_linux_amd64.tar.gz

输入要解压的文件的路径后,按回车键,然后输入 y 进行确认。

第三步 – 将文件从一个目录移动到另一个目录

我们解压了文件。现在我们需要将文件移动到另一个位置。为了将文件从一个位置移动到另一个位置,我们使用 mv 命令。所以,让我们打开 TLDR 手册的 mv 命令。

$ tldr mv

选择正确的命令将文件从一个位置移动到另一个位置。在我们的例子中,第一个命令可以工作,所以让我们选中它。

输入要移动的文件路径,并输入目标路径并按回车键。

附注: 输入 y!yes! 来以 sudo 权限运行命令。

正如你在上面的截图中看到的,我将名为 `tldr的文件移动到/usr/local/bin/

要了解更多细节,请参考项目最后给出的 GitHub 页面。

总结

别误会,毫无疑问 手册页 是伟大的!但是,正如我已经说过的,许多手册页都很全面,缺少有用的示例。我不可能记住带有复杂标志的冗长的所有命令。有时,我花了很多时间在手册页上,却还是一窍不通。Tldr 手册帮助我在几分钟内找到了我需要的东西。而且,我们偶尔会使用一些命令,然后就会完全忘记它们。另一方面,Tldr 手册实际上在使用那些使用率很低的命令时很有帮助。Tldr++ 客户端通过智能的用户交互使这个任务变得更容易。试试吧,在下面的评论区告诉我们你对这个工具的看法。

(LCTT 译注:我们也开发了一个 TLDR 客户端,是基于微信小程序的,大家在微信中搜索“Linux”小程序即可找到。虽然微信小程序版的 TLDR 客户端不能像这个客户端一样实际运行 Linux,但是它是中文的,而且中文翻译是由使用者来贡献和修正的。顺便说一句,全部一千多个命令已经翻译完毕,感谢我们的贡献者们! )

以上,更多的好的分享将会陆续推出,请继续保持关注!

祝好!


via: https://www.ostechnix.com/search-study-and-practice-linux-commands-on-the-fly/

作者:SK 选题:lujun9972 译者:qfzy1233 校对:wxy

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

快速解释如何在 Python 中调整图像大小,同时保持相同的长宽比。

 title=

我喜欢 Python,而且我已经学了一段时间了。前段时间,我写了一个 Python 脚本,在这个脚本中,我需要调整一堆图片的大小,同时保持长宽比(比例)不变。于是我四处寻找,发现了 Pillow,这是一个 Python 图像库,也是一个叫做 PIL 的旧库的“友好复刻”。

要安装 Pillow,请使用 Python 的 pip 模块:

$ python3 -m pip install Pillow

按宽度缩放

这是一个使用 Pillow 模块来调整图片大小的基本脚本:

from PIL import Image

basewidth = 300
img = Image.open('fullsized_image.jpg')
wpercent = (basewidth / float(img.size[0]))
hsize = int((float(img.size[1]) * float(wpercent)))
img = img.resize((basewidth, hsize), Image.ANTIALIAS)
img.save('resized_image.jpg')

这几行 Python 代码使用 Pillow 将一张图片 (fullsized_image.jpg) 调整为 300 像素的宽度,宽度在变量 basewidth 中设置,高度则与新的宽度成比例。比例高度的计算方法是:确定 300 像素占原宽度 (img.size[0]) 的百分比,然后将原高度(img.size[1]) 乘以该百分比。所得的高度值保存在变量 hsize 中。

如果你需要不同的图片宽度,你可以将 basewidth 改为任何其他数字。另外,请注意,因为我想保留全尺寸的图片 (fullsized_image.jpg),因此我将调整后的图片以一个不同的名称 resized_image.jpg 保存。当然,你不必这么做。如果你想,你可以使用相同的文件名将调整后的图片覆盖全尺寸的图片。

按高度缩放

如果高度是固定的,而宽度是按比例变化的,那也基本差不多,你只需要把东西换一下:

from PIL import Image

baseheight = 560
img = Image.open('fullsized_image.jpg')
hpercent = (baseheight / float(img.size[1]))
wsize = int((float(img.size[0]) * float(hpercent)))
img = img.resize((wsize, baseheight), Image.ANTIALIAS)
img.save('resized_image.jpg')

注意 basewidth 现在换成了 baseheight,因为高度是固定的。在第三行中,我们在计算高度百分比,所以我们需要 img.size[1] 而不是 img.size[0]size 属性是一个元组,包含宽度和高度,单位是像素,size[0] 指的是第一个元组元素,也就是宽度,size[1] 是第二个元素,也就是高度。第 4 行也有这样的切换,size[0] 代表宽度,size[1] 代表高度。


via: https://opensource.com/life/15/2/resize-images-python

作者:Dayo Ntwari 选题:lujun9972 译者:geekpi 校对:wxy

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

通过编写一个简单的游戏来认识 Lua,它是一种动态类型的、轻量级的、高效的、可嵌入的脚本语言。

 title=

如果你是 Bash、Python 或 Ruby 等脚本语言的爱好者,你可能会发现 Lua 很有趣。Lua 是一种动态类型的、轻量级的、高效的、可嵌入的脚本语言,它有与 C 语言的 API 接口。它通过基于寄存器的虚拟机解释字节码来运行,它可以用于过程式编程、函数式编程和数据驱动编程等编程方式。它甚至可以通过巧妙地使用数组(即“ table ”)来模拟类,以用于面向对象的编程。

感受一门语言的好方法是通过编写一个你已经熟悉的简单应用。最近,一些作者已经演示了如何使用他们最喜欢的语言来创建一个“猜数字”游戏。Lua 是我最喜欢的语言之一,所以这是我的 Lua 版猜数字游戏。

安装 Lua

如果你是在 Linux 上,你可以从你的发行版仓库中安装 Lua。在 macOS 上,你可以从 MacPortsHomebrew 安装 Lua。在 Windows 上,你可以从 Chocolatey 安装 Lua。

安装 Lua 后,打开你最喜欢的文本编辑器,可以准备编写了。

Lua 代码

首先,你必须设置一个伪随机数生成器,这样你的玩家就有一些不可预知的东西来尝试猜测。这是一个两个步骤的过程:首先,你根据当前的时间生成一个随机种子,然后在 1 到 100 的范围内选择一个数字:

math.randomseed(os.time())
number = math.random(1,100)

接下来,创建一个 Lua 所谓的 table 来表示你的玩家。表就像一个 Bash 中的数组或 Java 中的 ArrayList。你可以创建一个表,然后分配与该表相关的子变量。在这段代码中,player 是表,而 player.guess 是表中的一个条目:

player = {}
player.guess = 0

处于调试的需求,可以输出这个秘密数字。这对游戏并不合适,但对测试很有帮助。Lua 中的注释是在前面放双破折号:

print(number) --debug

接下来,设置一个 while 循环,当分配给 player.guess 的值不等于代码开始时建立的随机的 number 时,循环将永远运行。目前,player.guess 被设置为 0,所以它不等于 number。Lua 的不等式数学运算符是 ~=,诚然这很独特,但过一段时间你就会习惯。

在这个无限循环的过程中,首先游戏会打印一个提示,让玩家明白游戏的内容。

接下来,Lua 会暂停,等待玩家输入猜测的数。Lua 使用 io.read 函数从文件和标准输入 (stdin) 中读取数据。你可以将 io.read 的结果分配到一个变量中,这个变量是在 player 表中动态创建的。处理玩家输入的问题是,即使它是一个数字,它也是作为一个字符串读取的。你可以使用 tonumber() 函数将这个输入转换为整数类型,将结果赋值回初始为 0player.guess 变量:

while ( player.guess ~= number ) do
  print("Guess a number between 1 and 100")
  player.answer = io.read()
  player.guess = tonumber(player.answer)

现在 player.guess 包含了一个新的值,它将与 if 语句中的随机数进行比较。Lua 使用关键字 ifelseifelse,并用关键字 end 来结束该语句:

  if ( player.guess > number ) then
    print("Too high")
  elseif ( player.guess < number) then
    print("Too low")
  else
    print("That's right!")
    os.exit()
  end
end

最后,函数 os.exit() 在成功后关闭应用,关键字 end 使用了两次:一次是结束 if 语句,另一次是结束 while 循环。

运行应用

在终端上运行游戏:

$ lua ./guess.lua
96
Guess a number between 1 and 100
1
Too low
Guess a number between 1 and 100
99
Too high
Guess a number between 1 and 100
96
That's right!

就是这样!

直观且一致

从这段代码中可以看出,Lua 是非常一致且相当直观的。它的表机制是一种令人耳目一新的数据关联方式,它的语法也是简约而高效的。Lua 代码中几乎没有浪费的行,事实上,这个例子中至少有两行可以进一步优化,但我想把数据转换作为它的步骤来演示(也许你可以找到我所指的两行,并对它们进行重构)。

Lua 非常易于使用,它的文档阅读起来很愉快,主要是因为它的内容实在是不多。你会在短时间内学会核心语言,然后你就可以自由地探索 LuaRocks,发现别人贡献的各种很棒的库。“Lua” 在葡萄牙语中的意思是“月亮”,所以今晚可以尝试一下。


via: https://opensource.com/article/20/12/lua-guess-number-game

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

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

以下是我如何通过很多微妙复杂的方式来保持终端的简单和我的点文件的安全。

 title=

我要向大家坦白。我成为 Mac 用户已经有 10 多年了。起初,鉴于我强大的 Linux 背景,我觉得有点惭愧,但 Mac 给了我一个类似 Unix 的 Shell 和一个伟大的窗口管理器。因为这段历史,我有一个合二为一的功能,它运行在 macOS 上,但又为 Linux 用户所熟悉。没有理由它不能移植到 Linux 上(而且它已经移植了!)。

在 Mac 上使用 iTerm2

很长时间以来,我首选的终端是基本的内置 Term.app,但我最近改用了 iTerm2,因为它有更好的自定义和配置文件支持。对我来说,它的一个主要优点是可以轻松地在 Mac 之间移植配置。对于日常使用,我更喜欢 Solarized Dark 主题;但对于演示文稿,我有一个单独的配置文件,可以放大文本,并使用色彩更鲜艳的纯黑色背景。

要使 iTerm2 可用,我首先要做的是配置 Ctrl+LeftCtrl+Right 箭头,使其尊重经典的终端行为,即跳转到单词边界的开始和结束。要做到这一点,请导航到 “Preferences > Profiles > Your Profile > Keys” 并输入以下内容:

  • 键盘快捷键:^←
  • 行动:发送 Escape 序列
  • Esc+:b

然后是另一个:

  • 键盘快捷键:^→
  • 行动:发送 Escape 序列
  • Esc+:f

了解更多关于 iTerm2 的内容,享受自定义体验。

一个简单的命令提示符

我是那种无聊的终端提示符用户。我不想在其中包含 Git 目录或退出代码,我也只用单行提示符。我唯一使用的花哨组件是 kubectx ,它包括当前的 Kubernetes 上下文。作为一位 OpenShift Dedicated 的站点可靠性工程师(SRE),我必须在运行命令时有相应的上下文,而 kubectx 让我在打字时很容易知道自己在哪里。所以,我的 Bash PS1 就是无聊的 username@host cwd $,免除了 Kubernetes 上下文前缀。(LCTT 译注:如果想将 Kubernetes 上下文和名字空间显示在 PS1,可以看看 kube-ps1。)

毫无疑问,与我见过的一些花哨的终端相比,我是偏向于极简的。有些人喜欢透明背景,有些人则喜欢他们的提示符上有很多信息 —— 从时间到退出代码以及其他一切。我觉得这些在我的终端上会让人分心,所以我很喜欢远离的那些设置。

精美复杂的点文件

与我的极简主义终端相比,很容易看出我在哪里投入了最大的努力:部署我的点文件,包括我的 .bash_profile 和我的整体 Mac 设置。

我使用通过 GitHub 托管的 一系列 Makefile 来管理我的 Mac 设置。这将会拉取我的点文件专用部署机制,它也在 GitHub 上。你要问为什么要围绕安全做这些工具?IT 专业人士和业余爱好者都需要一种强大的方式来将安全的数据片段放在新系统上。也许你想要你的 SSH 配置是隐藏的,或者你通过第三方系统部署凭证。我发现把我的安全数据和其他一切数据放在一起是很有用的,我用 Ansible Vault 解决了这个问题。我所有的机密信息都存储在 Git 中,用 Ansible Vault 加密。解密是用 Makefile 处理的。

无论是第一次安装还是更新现有的点文件,我(当然)都必须有 Ansible Vault,为了避免到处安装,我把它放在一个用 Docker 运行的容器里,这样我就到处都安装好了。我把解密口令放到一个文件中, run make,然后用 make clean 清理一切。你可以通过探索这些点文件来了解更多)。

我想说的是,这种管理方案可能过于夸张,而有些人喜欢复杂的终端提示。所以,也许在权衡之下,一切都会变得平衡。


via: https://opensource.com/article/20/6/iterm2-mac

作者:Lisa Seelye 选题:lujun9972 译者:wxy 校对:wxy

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