Seth Kenlon 发布的文章

想玩实体模型火车,却没有足够大的空间?试试 OpenTTD 中的虚拟火车吧。

 title=

我父亲一直很喜欢火车模型,我记得我小时候,曾看着他在圣诞树周围建了一整条轨道。当 乐高 火车套装发布时,因其便利性和固有可扩展性,我们转而投向了乐高火车的怀抱。多年来,我们热衷于建造和改装乐高火车及单轨轨道。我经常想象,未来我会有一个车库或地下室,专门用于微型景观和电动汽笛火车。强调一下,我沉迷于另一个爱好的可能性非常低,所以当发现 虚拟 模型铁路可以为我提供相同的满足感时,我很开心。我的虚拟爱好引擎是 OpenTTD,这是一款基于名为 Transport Tycoon Deluxe 的 90 年代老游戏的开源模拟游戏。

安装 OpenTTD

你可以在 openttd.org/downloads 下载适用于 Linux、macOS 和 Windows 的 OpenTTD。

如果你正使用 Debian Linux 或其衍生产品,甚至是在使用 Chromebook,你可以下载 .deb 包。使用 apt 命令安装它:

$ sudo apt install ./openttd*deb

如果你在使用其他 Linux 发行版,请下载通用安装程序,并使用 tar 命令解压缩包:

$ tar xvf openttd-x.yy.z-linux*.tar.xz

OpenTTD 已经在 Linux、macOS 和 Windows 的 Steam 中上架(Steam 是一个非开源的,但是很常见的跨平台游戏客户端)。

启动 OpenTTD

如果你安装了 OpenTTD,可以从应用程序菜单启动它。

如果你是下载了通用包,可以切换到游戏目录,使用本地的 openttd 命令启动游戏:

$ cd openttd*
$ ./openttd &

首次启动 OpenTTD 时,游戏会提示必须下载图像集,在 Steam 版中会自动安装,但在独立应用程序中需要单击一下鼠标。无论如何,因为 OpenTTD 是开源的,经过了很好的改进,所以在默认图像之外,你最终还会下载的还有很多其他图像。

下载图像集后,你会看到一个古色古香的小型界面。我觉得 640x480 的界面有点小,虽然旧图像界面确实更有年代感(那时计算能力还比较弱),但一些适配现代屏幕的轻度升级还是很好用的。因此,你的第一步操作就是点击“ 检查在线内容 Check online content ”按钮。

加载模组

内容下载 Content downloading ”界面是一个查看已通过审查的 OpenTTD 模组 mod 的窗口,可以提供个性化的改进图像界面、全新音乐、火车模型和地图名称。我使用了新西兰全套配置,所以对我来说,生成的所有城市都很熟悉,尽管 2020 年我转而开始使用“辐射 3”套装了。模组 非常多,可以使用右上角的搜索栏来缩小选择范围。

下面是一些个人认为必备的模组:

  • abase - 高分辨率图像。将近 300 MB,这可能是你玩此游戏需要的最大一次下载(游戏本身只有 50 MB)。
  • OpenSFX - 一个声音合集。让你能听到城市中的交通声、船运的喇叭声以及很棒的火车汽笛声。
  • Town names - 城镇名称。默认的城市名称很有趣,但我认为记一些本地化的名称更容易。
  • Trains - 火车模组。OpenTTD 有一组运行良好的默认火车模型,但如果你已经是一名火车观察员,那你可能会喜欢下载一些额外的火车模型。我使用的是 NZR 火车合集,但还有很多火车也是可用的,包括来自英国、美国、奥地利、比利时、捷克共和国的车,以及按字母表顺序排列的许多其他火车。
  • Beginner tutorial - 新手教程。是一个帮你学习游戏及界面的引导场景。

游戏引擎默认值

下载新素材后,你需要将它们设置为默认值。有两个设置的地方:游戏引擎默认值、游戏内脚本与素材。

 title=

OpenTTD 菜单(Seth Kenlon, CC BY-SA 4.0

单击“ 游戏选项 Game Options ”按钮。 在游戏选项屏幕中,调整以下设置:

  • 屏幕分辨率 screen resolution 设置为你喜欢的界面尺寸。
  • 基础图像集 base graphics set 设置为 abase
  • 基础声音设置 base sounds set 设置为 OpenSFX

关闭游戏选项屏幕。你的改动会自动保存。

游戏选项

在主菜单界面,单击“ NewGRF 设置 NewGRF Settings ”按钮。

 title=

NewGRF 设置菜单(Seth Kenlon, CC BY-SA 4.0

未活动的模组显示在 NewGRF 设置窗口的下半部分。要激活一个未活动的模组,请选择它并单击左下角的“ 添加 Add ”按钮。选择要激活的模组后,再单击“ 应用 Apply ”按钮。

教程

如果你下载了“ 初学者教程 Beginner tutorial ”场景,可以通过它来学习 OpenTTD。开始教程请单击主菜单屏幕顶部附近的“ 播放场景 Play scenario ” 按钮,然后选择该教程并开始。

初学者教程有着游戏界面的完整浏览流程,全部完成需要花费一些时间。

快速开始

现在我们快速介绍一下,此处你要了解以下内容:车辆出自仓库,一切活动都需要时间表。记住这两条规则,你可以立即开始建造火车(以及道路、海港和机场)。

建造车站

要在两个城市之间建立一条简单的铁路线,请单击顶部图标栏中的铁路轨道图标。

 title=

新建图标栏——铁路选项(Seth Kenlon, CC BY-SA 4.0

铁路以车站开始和结束,所以我通常在预定线路的两端各放置一个车站。单击火车站图标(将鼠标悬停在其上方可查看其标签)。一个火车站要服务于一个地区,其作用范围必须与该地区尽量多地重叠。要查看车站的覆盖范围,请通过单击车站对话框底部的“ 开启 On ”按钮以启用 覆盖区域高亮 Coverage area highlight 功能。

 title=

车站覆盖信息窗口(Seth Kenlon, CC BY-SA 4.0

黑色网格表示覆盖范围,而白色网格显示车站的物理占据范围。当你将鼠标悬停在一个区域上时,车站的覆盖范围所需耗材会在弹出窗口中列出。从简单的开始,创建一个单轨 4 辆车的站台。在地图上的两个城市之间重复执行此操作两次。

 title=

创建车站菜单(Seth Kenlon, CC BY-SA 4.0

铺设铁轨

接下来,用铁轨连接车站。 OpenTTD 的等距视图需要一些时间来适应,但是在单击铁路图标并在地图上单击拖动之后,你就开始大概有所了解了。X-rail 图标提供了“自动轨道”模式,该模式会根据用户单击的方块位置对齐轨道。

铺设导轨时要细心。OpenTTD 是不可撤回的,所以一旦点击一个正方形,轨道就会被构造出来。你必须使用炸药图标来移除导轨。和现实生活中一样,没有撤消按钮。

火车车库

火车来自 车库 depot 。因此,要在铁路上添加火车,必须在沿线的某处添加一个车库。单击车库图标并在现有铁路附近放置。将车库连接到现有轨道,以确保你的火车可以从车库到达适当线路的(在此简单示例中,线路是唯一的)。

 title=

建造车库菜单(Seth Kenlon, CC BY-SA 4.0

模型火车

终于,你可以将虚拟模型火车添加到虚拟铁路中了。要创建火车,请单击车库。

单击站点窗口底部的“ 新建车辆 New Vehicle ”按钮,会列出可用的火车引擎和汽车。列表会部分取决于你从可下载内容中添加的模型。一般来说,发动机分为三种:蒸汽发动机、柴油发动机和电动发动机。游戏内时间从 1950 年开始,所以早期你只有蒸汽可选。随着时间推进,你会获得可用于升级的创新型新模型。

 title=

创建火车菜单(Seth Kenlon, CC BY-SA 4.0

现在创建一个简单的火车,其中包括一节引擎、一节客车和一节邮车。如果想添加其他类型的车厢,请单击站点以确认它们的可提供车型(由其覆盖区域决定)

创建火车时刻表

现在有了铁路和火车,还需要创建一个火车时刻表。时间表与车辆关联,因此无论何时添加新车,都要记得添加时间表,以让新车投入使用。

要为火车添加时刻表,请单击其车库列表中列车左侧的编号。这样可以打开火车视口,窗口右侧会有按钮。单击箭头图标即可查看该列车的时刻表。

 title=

创建时刻表菜单(Seth Kenlon, CC BY-SA 4.0

要创建时间表,请单击时间表窗口底部的“ 前往 Go To ”按钮,然后单击要设置成第一个目的地的车站。然后点击下一站。你可以在时间表中选择一个停靠点,浏览“ 满载 Full load ”和“ 卸载 Unload ”下拉菜单中的选项,以此调整装卸要求,并且可以在“ 无停靠 Non-stop ”下拉菜单中调整路线(如果开发了新路线)。选项有很多,随着城市发展和地图完善,你可能需要随时调整策略。

但是现在,单击火车视口底部的红色“ 已停止 Stopped ”按钮,让火车投入使用吧!

 title=

在役中的火车(Seth Kenlon, CC BY-SA 4.0

试试 OpenTTD 吧

OpenTTD 是一个模拟器,同时也是一个游戏,所以确实会有一些限制,比如你可能想要优化的预算和参数。例如,你可以单击一个城市、农场或工厂,了解其可接受的进出口类型。你可以通过单击 OpenTTD 窗口右下角的预算按钮来借钱。它不仅仅是一个虚拟的火车集合游戏。你还可以建造道路、机场、海港等。记得所有车辆都需要车库和时间表,你就在实现虚拟企业的路上成功了一半。

OpenTTD 有着活跃而热情的社区,以及详细的维基,并且有大量的资源和教程在线可用。下载游戏并试试吧!


via: https://opensource.com/article/21/9/model-trains-openttd

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

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

有了 anacron,我可以把脚本和 Ansible 剧本放到合适的地方,以完成各种琐碎的任务。

 title=

自动化是伟大的 IT 和 DevOps 理想,但根据我的经验,可能根本不存在什么不方便的东西。有很多次,我为某些任务想出了一个很好的解决方案,我甚至会编写脚本,但我没有让它真正实现自动化,因为在我工作的机器上不存在易于自动化的基础设施。

我最喜欢的简易自动化工具曾经是 cron 系统,它古老、可靠、面向用户,而且简单(除了一个我永远无法记住的调度语法之外)。然而,cron 的问题是,它假定一台电脑每天 24 小时都在工作。在错过了太多预定的备份之后,我发现了 anacron,一个基于时间戳而非预定时间的 cron 系统。如果你的电脑在通常情况下运行时处于关闭状态,anacron 会确保它在电脑重新开启时运行。创建一个作业只需要简单地把一个 shell 脚本放到三个目录中:cron.daycron.weekly 或者 cron.monthly (如果你想的话,你可以定义更多)。有了 anacron,我发现自己把脚本和 Ansible 剧本用在了各种琐碎的任务中,包括弹出到期和事件提醒。

这是一个现代问题的简单而明显的解决方案,但如果 anacron 没有安装在电脑上,那它对我就没有用。

用 Ansible 进行软件设置

任何时候我设置一台新的计算机,无论是笔记本电脑、工作站还是服务器,我都会安装 anacron。这很简单,但是 anacron 的安装只提供了 anacron 命令。它并没有设置 anacron 的用户环境。所以我创建了一个 Ansible 剧本来设置用户需要什么来使用 anacron 并安装 anacron 命令。

首先,标准的 Ansible 模板:

---
- hosts: localhost
  tasks:

用 Ansible 创建目录

接下来,我创建了用于 Anacron 的目录树。你可以把它看成是一种透明的 crontab。

    - name: create directory tree
      ansible.builtin.file:
        path: "{{ item }}"
        state: directory
      with_items:
        - '~/.local/etc/cron.daily'
        - '~/.local/etc/cron.weekly'
        - '~/.local/etc/cron.monthly'
        - '~/.var/spool/anacron'

这个语法可能看起来有点奇怪,但它实际上是一个循环。with_items: 指令定义了四个要创建的目录,Ansible 在 ansible.buildin.file: 指令中为每个目录迭代一次(目录名填充了 {{ item }} 变量)。与 Ansible 中的一切一样,如果目录已经存在,不会有错误或冲突。

用 Ansible 复制文件

ansible.buildin.copy 模块将文件从一个地方复制到另一个地方。为了让它工作,我需要创建一个叫做 anacrontab 的文件。它不是 Ansible 剧本,所以我把它放在我的 ~/Ansible/data 目录下,那里是我的剧本的支持文件。

  - name: copy anacrontab into place
   ansible.builtin.copy:
    src: ~/Ansible/data/anacrontab
    dest: ~/.local/etc/anacrontab
    mode: '0755'

我的 anacrontab 文件很简单,模仿了一些发行版默认安装在 /etc/anacron 中的文件:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
1  0  cron.day    run-parts $HOME/.local/etc/cron.daily/
7  0  cron.wek    run-parts $HOME/.local/etc/cron.weekly/
30 0  cron.mon    run-parts $HOME/.local/etc/cron.monthly/

登录时运行 anacron

大多数 Linux 发行版将 anacron 配置为从 /etc/anacron 读取作业。我主要是作为一个普通用户使用 anacron,所以我从我的登录账号 ~/.profile 启动 anacron。我不想让自己记住这些配置,所以我让 Ansible 来做。我使用 ansible.buildin.lineinfile 模块,它会在 ~/.profile 不存在时创建它,并插入 anacron 的启动行。

    - name: add local anacrontab to .profile
      ansible.builtin.lineinfile:
        path: ~/.profile
        regexp: '^/usr/sbin/anacron'
        line: '/usr/sbin/anacron -t ~/.local/etc/anacrontab'
        create: true

用 Ansible 安装 anacron

对于我的大多数系统来说,dnf 模块可以用来安装软件包,但我的工作站运行的是 Slackware(使用 slackpkg),有时不同的 Linux 发行版也会进入我的收藏。ansible.buildin.package 模块提供了一个安装软件包的通用接口,所以我把它用在这个剧本上。幸运的是,我还没有遇到一个名为 anacron 的仓库不是 anacron,所以现在,我不必考虑软件包名称的潜在差异。

这实际上是一个单独的剧本,因为软件包的安装需要权限升级,它由 becomes: true 指令提供。

- hosts: localhost
  become: true
  tasks:
    - name: install anacron
      ansible.builtin.package:
        name: anacron
        state: present

使用 anacron 和 Ansible 实现轻松自动化

为了用 Ansible 安装 anacron,我运行该剧本:

$ ansible-playbook ~/Ansible/setup-anacron.yaml

从此,我就可以编写 shell 脚本来执行一些琐碎但重复的任务,然后把它复制到 ~/.local/etc/cron.daily,让它每天自动运行一次(或者大约如此)。我还为诸如 清理下载文件夹 之类的任务编写了 Ansible 剧本。我把我的剧本放在 ~/Ansible 里,这是我保存 Ansible 剧本的地方,然后在 ~/.local/etc/cron.daily 里创建一个 shell 脚本来执行这个剧本。这很简单,不费吹灰之力,而且很快成为习惯。


via: https://opensource.com/article/21/9/ansible-anacron-automation

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

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

YAML 看起来很简单,为什么它这么难写呢?了解成功使用 YAML 的两个秘诀。

 title=

如果你曾经尝试过写 YAML,你可能一开始会对它看起来很容易感到高兴。乍一看,经常用于配置文件、Ansible 剧本和普通文件数据库的 YAML 看起来就像购物清单一样直观。然而,YAML 的结构中有很多细微的差别,它隐藏着一个危险的秘密:YAML 实际上是一种高度精确、结构化和令人惊讶的严格语言。好消息是,你只需要了解两件事就可以知道 YAML 的工作原理。

关于 YAML 的真相是,YAML 中只有两种数据结构: 序列 sequence 映射 mapping 。这是两个花哨的名字,你会发现它代表了你非常熟悉的概念。这篇文章解释了这两种结构,更重要的是,介绍了它们是如何协同工作,使 YAML 成为表示你所关心的数据的强大方式。

YAML 序列

YAML 序列是一个列表。在其最简单的形式中,每行有一个项目,每行以破折号和空格开始。

下面是一个例子:

---
- Linux
- BSD
- Illumos

不同的语言有不同的方式来表示这种数据。例如,在 Python 中,同一个列表可以写成 ['Linux', 'BSD', 'Illumos']。当你在现实生活中写一个列表时,例如在你去买菜之前,你写的可能近似于 YAML 序列。

YAML 映射

YAML 映射是一个关键术语与该术语的定义相结合。在其他语言中,映射被称为“键值对”或“词典”。

这里有一个例子:

---
Kernel: Linux
CPU: AMD
RAM: '16 GB'

不同的语言有不同的方式来表示这种数据。在 Python 中,例如,同样的数据可以写成 {"Kernel": "Linux", "CPU": "AMD", "RAM": "16 GB"}。在现实生活中,你可能会使用这种结构来计划,例如,与朋友的游戏之夜。一个朋友报名带零食,另一个报名带一副牌,另一个报名带一个棋盘游戏,等等。

组合序列和映射

你现在知道 YAML 的语法了。序列和映射是 YAML 中仅有的两种构件,你想在 YAML 中表示的任何东西都可以放在序列或映射中。

或者同时使用这二者!

是的,序列和映射可以被组合和嵌套,这就是 YAML 看起来很直观,但同时又感觉很复杂的原因之一。不过,只有四种可能的组合,一旦你学会如何看它们,YAML 就会觉得像它看起来一样简单。

序列的映射

当你想让一个键项有许多值时,你可以使用一个序列的映射。也就是说,你从一个映射(键)开始,但是给值一个列表:

---
Linux:
  - Fedora
  - Slackware
BSD:
  - FreeBSD
  - NetBSD

在这个示例代码中,Linux 是第一个键,它的值是一个序列,其中包含 FedoraSlackware。第二个键是 BSD,它的值是一个序列,包含 FreeBSDNetBSD

映射的映射

当你想让一个键项的值中既有键又有值时,你可以使用映射的映射。也就是说,你从一个映射(键)开始,但是给值另一个映射。

这可能有点欺骗性,但它揭示了 YAML 中使用特定术语的原因:因为你只不过是创建了一个映射的列表,并不意味着你创建了一个序列。这里是一个映射的映射:

---
Desktop:
  CPU: RISC-V
  RAM: '32 GB'
Laptop:
  CPU: AMD
  RAM: '16 GB'

对大多数人来说,这看起来像一个列表。而且从技术上讲,它是一个列表。但重要的是要认识到,它不是 YAML 序列。它是一个映射,其中包含映射。作为半个 YAML 专家,你可以从明显缺少破折号的地方看出区别。

在 Ansible 剧本的所有结构中,我发现这个结构最容易欺骗人。作为人类,我们喜欢列表,当我们看到一个数据结构 在字面上 是列表时,大多数人会把它当成 YAML 序列。但是在 YAML 中,虽然序列是列表,但是列表并不总是序列。

序列的序列

就像你可以嵌套映射一样,你可以将一个序列嵌套到一个序列中:

---
- [Linux, FreeBSD, Illumos]
- [YAML, XML, JSON]

这可能是我在 YAML 的实际使用中遇到的最不常见的数据结构,但有时你需要一个列表的列表。

映射的序列

你也可以创建一个包含映射的序列。对于人类排序数据的方式来说,这并不太常见,但对于计算机来说,这可能是一个重要的结构。

这里有一个例子:

---
-
  CPU: AMD
  RAM: '16 GB'
-
  CPU: Intel
  RAM: '16 GB'

对于 YAML,这可能是最不直观的语法。我发现它在 Python 中呈现时更清晰:

[{"CPU": "AMD", "RAM": "16 GB"}, {"CPU": "Intel", "RAM": "16 GB"}]

方括号代表一个列表结构,这个列表包含两个字典。每个字典都包含键值对。

构建更好的 YAML

现在你知道了 YAML 的两个组成部分,以及它们如何被组合起来以表示复杂的数据结构。问题是:你要用 YAML 构建什么?

和很多人一样,我也使用 YAML 来编写 Ansible 剧本。我还用它作为一种简单的配置格式、作为 D&D 的角色表、表示项目组织所需的目录结构,等等。只要你能适应序列和映射的概念,你会发现 YAML 是一种很容易编写、阅读和(如果有合适的库)解析的格式。

如果你发现自己经常使用 YAML,请下载我们的 YAML 速查表,以帮助你直观地了解基本数据结构及其组合,并帮助你记住一些额外的语法约定。通过一点点的练习,你会发现 YAML 真的和它看起来一样简单!


via: https://opensource.com/article/21/9/yaml-cheat-sheet

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

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

BusyBox 是一个开源(GPL)项目,提供了近 400 个常用命令的简单实现。

 title=

我们很容易认为 Linux 的命令是理所当然的。当你安装 Linux 时,它们与系统捆绑在一起,而我们常常不问为什么它们会在那里。一些基本的命令,如 cdkill 和 echo,并不总是独立的应用程序,而是实际上内置于你的 shell 中。其他如 lsmvcat 是核心工具包(通常是 GNU coreutils)的一部分。但在开源的世界里,总是有一些替代品,其中最有趣的是 BusyBox

Linux 中的 BusyBox 简介

BusyBox 是一个开源(GPL)项目,提供近 400 个常用命令的简单实现,包括 lsmvlnmkdirmorepsgzipbzip2targrep。它还包含了编程语言 awk、流编辑器 sed、文件系统检查工具 fsckrpmdpkg 软件包管理器,当然还有一个可以方便的访问所有这些命令的 shell(sh)。简而言之,它包含了所有 POSIX 系统需要的基本命令,以执行常见的系统维护任务以及许多用户和管理任务。

事实上,它甚至包含一个 init 命令,可以作为 PID 1 启动,以作为所有其它系统服务的父进程。换句话说,BusyBox 可以作为 systemd、OpenRC、sinit、init 和其他初始化系统的替代品。

BusyBox 非常小。作为一个可执行文件,它不到 1MB,所以它在 嵌入式边缘计算物联网 领域很受欢迎,因为这些场景的存储空间是很宝贵的。在容器和云计算的世界里,它作为精简的 Linux 容器镜像的基础镜像也很受欢迎。

极简主义

BusyBox 的部分魅力在于它的极简主义。它的所有命令都被编译到一个二进制文件里(busybox),它的手册只有 81 页(根据我对 man 送到 pr 管道的计算),但它涵盖了近 400 条命令。

作为一个例子的比较,这是 “原版” 的 useradd —help 的输出:

 -b, --base-dir BASE_DIR       base directory for home
 -c, --comment COMMENT         GECOS field of the new account
 -d, --home-dir HOME_DIR       home directory of the new account
 -D, --defaults                print or change the default config
 -e, --expiredate EXPIRE_DATE  expiration date of the new account
 -f, --inactive INACTIVE       password inactivity
 -g, --gid GROUP               name or ID of the primary group
 -G, --groups GROUPS           list of supplementary groups
 -h, --help                    display this help message and exit
 -k, --skel SKEL_DIR           alternative skeleton dir
 -K, --key KEY=VALUE           override /etc/login.defs
 -l, --no-log-init             do not add the user to the lastlog
 -m, --create-home             create the user's home directory
 -M, --no-create-home          do not create the user's home directory
 -N, --no-user-group           do not create a group with the user's name
 -o, --non-unique              allow users with non-unique UIDs
 -p, --password PASSWORD       encrypted password of the new account
 -r, --system                  create a system account
 -R, --root CHROOT_DIR         directory to chroot into
 -s, --shell SHELL             login shell of the new account
 -u, --uid UID                 user ID of the new account
 -U, --user-group              create a group with the same name as a user

而这是是同一命令的 BusyBox 版本:

 -h DIR    Home directory
 -g GECOS  GECOS field
 -s SHELL  Login shell
 -G GRP    Group
 -S            Create a system user
 -D            Don't assign a password
 -H            Don't create home directory
 -u UID    User id
 -k SKEL   Skeleton directory (/etc/skel)

这种差异是一种特性还是一种限制,取决于你是喜欢你的命令拥有 20 个选项还是 10 个选项。对于一些用户和某些用例来说,BusyBox 的极简主义刚刚满足所需。对于其他人来说,它是一个很好的最小化环境,可以作为一个后备工具,或者作为安装更强大的工具的基础,比如 BashZsh、GNU Awk 等等。

安装 BusyBox

在 Linux 上,你可以使用你的软件包管理器安装 BusyBox。例如,在 Fedora 及类似发行版:

$ sudo dnf install busybox

在 Debian 及其衍生版:

$ sudo apt install busybox

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

你可以将 BusyBox 设置为你的 shell,使用 chsh —shell 命令,然后再加上 BusyBox sh 应用程序的路径。我把 BusyBox 放在 /lib64 中,但它的位置取决于你的发行版的安装位置。

$ which busybox
/lib64/busybox/busybox
$ chsh --shell /lib64/busybox/sh

用 BusyBox 全盘替换所有常见的命令要复杂一些,因为大多数发行版都是“硬接线”,会在特定的软件包寻找特定的命令。换句话说,虽然技术上可以用 BusyBox 的 init 替换系统的 init,但你的软件包管理器可能会拒绝让你删除包含 init 的软件包,以免你担心删除会导致系统无法启动。有一些发行版是建立在 BusyBox 之上的,所以从新环境开始可能是体验 BusyBox 系统的最简单方法。

试试 BusyBox

你不必为了尝试 BusyBox 而将你的 shell 永久改为 BusyBox。你可以从你当前的 shell 中启动一个 BusyBox shell。

$ busybox sh
~ $

不过你的系统仍然有安装的非 BusyBox 版本的命令,所以要体验 BusyBox 的工具,你必须把命令作为参数发给 busybox 可执行文件:

~ $ busybox echo $0
sh
~ $ busybox ls --help
BusyBox vX.YY.Z (2021-08-25 07:31:48 NZST) multi-call binary.

Usage: ls [-1AaCxdLHRFplinshrSXvctu] [-w WIDTH] [FILE]...

List directory contents

 -1  One column output
 -a  Include entries that start with .
 -A  Like -a, but exclude . and ..
 -x  List by lines
[...]

为了获得“完整”的 BusyBox 体验,你可以为每个命令创建一个 busybox 的符号链接。这很容易,只要你使用 for 循环 就行:

$ mkdir bbx
$ for i in $(bbx --list); do \
    ln -s /path/to/busybox bbx/$i \
done

在你的 路径开头 添加这个符号链接目录,并启动 BusyBox:

$ PATH=$(pwd)/bbx:$PATH bbx/sh

用起来

BusyBox 是一个有趣的项目,也是一个可以实现 极简 计算的例子。无论你是把 BusyBox 作为 你唤醒的 古老的计算机 的轻量级环境,还是作为 嵌入式设备 的用户界面,抑或试用一个新的初始化系统,就算是为了好奇,让自己重新认识那些熟悉而又陌生的命令,都会很有意思。


via: https://opensource.com/article/21/8/what-busybox

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

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

试试这些开源视频会议服务之一。

 title=

我最近参加了 实用开源信息(POSI) 会议,它是在一个自由开源的视频会议平台上举行的。当我参加了一系列关于开源软件的实际用途的精彩讲座时,我意识到视频会议在过去几年里已经变得非常普遍。

如果说开源做了什么,那就是提供了选择,现在越来越多的工人有了远程工作的自由,在你的连接方式上有一个选择是非常有意义的。

有时,你需要一个全功能的视频会议应用,其中包括审核、演示模式和分组讨论室,而其他时候,你想做的只是给朋友打一个快速电话,以便看到对方的脸。

Jitsi

Jitsi 是一个简单、随意、但强大的视频通话平台。你可以自己托管它,也可以在 meet.jit.si 的公共实例上使用它。它有可定制的 URL,可以很容易地与你想见面的朋友分享链接、通话中的聊天、管理控制,和通话录音。它的开发非常活跃,每年都会测试和发布一大批新功能。它是 Opensource.com 用于我们每周会议的平台。

Signal

Signal 已经是一个流行的以安全为重点的聊天应用,最近它又增加了 团体视频通话 的功能。视频通话非常适合简单的会议,而且因为你只能与你的 Signal 联系人列表中的其他人见面,所以不用担心你的视频通话会议上有不速之客。当你尝试定位你应该参与开会的虚拟房间时,也没有来回的“电话标签”。这一切都发生在 Signal 中,因此无需猜测。

Signal 本身是非常直观的,视频功能非常适合其现有惯例。简而言之,只要你的联系人在使用 Signal,这就是一个不费力的视频通话平台。这是我用于个人联系的应用,我经常使用其视频通话功能与朋友和家人联系。

P2p.chat

P2p.chat 是这些中最简单的一个,无论是设计还是实现。通过 WebRTC 工作,p2p.chat 是一个 Web 应用,允许你直接连接到你正在呼叫的人,而不需要托管服务器。p2p.chat 的界面并不多,但这也是其吸引力的另一部分。没有管理控制或演示模式,因为 p2p.chat 在很大程度上是科幻片中承诺的“视频电话”:与远方的人进行轻松的人对人(或人们对人们)视频通话。

你可以使用自定义的 URL 来动态地创建一个会议空间,所以它们相对容易记忆(除了小的随机部分)和输入。我和不在 Signal 上的朋友使用 p2p.chat,它从未让我失望过。

BigBlueButton

如果你需要严格的管理控制和极端的灵活性,BigBlueButton 是你正在寻找的解决方案,它专为教室、会议和演讲而设计。有了 BigBlueButton,你可以让所有与会者静音,阻止和踢走一个与会者,创建分组讨论室,创建协作式白板,共享屏幕,进行演讲,以及记录会议。与会者可以“举起手”表示注意,并将他们的状态设定为非语言交流方式。它很容易使用,但它是一个严肃的平台,适用于重点和非常大的群体。我参加过一些使用 BigBlueButton 的技术会议,包括 实用开源信息(POSI)会议。

Wire

Wire 是寻找托管视频聊天和群件客户端的企业客户的绝佳选择。它是 AGPL 许可,这个开源项目可用于桌面和服务器、安卓和 iOS。它具有视频通话、发信和文件共享的功能,因此,即使是远程会议,基本上也有亲自开会的所有便利。你可以在有限的时间内免费试用 Wire,然后为你的公司购买一份支持合同。另外,你也可以自己托管它。

开源视频聊天

没有理由满足于由你可能不完全信任的公司托管的专有视频通话。今天可用的开源选项对于与你的职业和个人生活中的所有人保持联系是非常好的。下次你想和朋友见面时,不妨试试这些解决方案之一。


via: https://opensource.com/article/21/9/alternatives-zoom

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

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

流行的配置文件格式有若干种,每种都有其自身优势。从中找到最适合你的格式吧!

 title=

计算机上有数以千计的配置文件。你可能永远不会直接与其中的大部分文件打交道,但它们确实散落在你的 /etc 以及 ~/.config~/.local/usr 文件夹中。还有一些可能在 /var,甚至 /opt 文件夹中。如果无意中打开过或更改过它们,你就可能会有疑问:为什么有些配置文件看起来是某一种格式,而另一些则是看起来完全不同的格式?

存储配置是一项很灵活的任务,因为只要开发人员知道他们的代码是如何将数据存入文件的,他们就可以轻松编写代码来根据需要提取数据。然而,科技行业非常青睐有详细文档的标准化事物,因此多年来出现了几种比较普遍的格式用来简化配置任务。

为什么我们需要配置文件

配置文件对于现代计算来说很重要。它们使你能够自定义与应用程序交互的方式,或自定义应用程序与系统内其他程序的交互方式。有了配置文件,每当你启动某个应用程序时,它都会有“记忆”,记录了你喜欢如何去使用该程序。

配置文件的结构可以很简单,而且通常确实也很简单。例如,如果你要编写一个应用程序,程序唯一需要知道的是其用户的偏好名字,那么它的唯一配置文件就可以只包含一个词:用户名。就像下面这样:

Tux

但通常应用程序需要追踪的不仅仅是一条信息,因此配置文件通常会有一个键和一个值:

NAME='Tux'
SPECIES='Penguin'

即使没有编程经验,你也可以想象出代码如何解析这些数据。这里有两个简单的例子,一个使用 awk 命令,另一个使用 grep 命令。两个例子都是只关注包含 NAME “键”的行,并返回出现在等号 (=) 之后的“值”:

$ awk -F'=' '/NAME/ { print $2; }' myconfig.ini
'Tux'
$ grep NAME fake.txt | cut -d'=' -f2
'Tux'

同样的原则适用于任何编程语言和任何配置文件。只要你有统一的数据结构,就可以在需要的时候编写简单的代码来提取和解析它。

选择格式

为了保证普遍有效性,配置文件最重要的一点是它们是一致的和可预测的。你绝对不会想做这样的事:以保存用户首选项的名义,将信息随意存储到文件中,然后花好几天时间逆向工程,来找到最终出现在文件中的随机信息。

流行的配置文件格式有若干种,每种格式都有自己的优势。

INI

INI 文件采用了键值对的格式:

[example]
name=Tux
style=widgety,fidgety
enabled=1

这种简单的配置风格很直观,只要你别选择使用糟糕的键名(比如用 unampref 这样的神秘键名来代替 name)就好。这些键值对很容易解析和编辑。

除了键和值之外,INI 格式还可以分 section 。在下列示例代码中,[example][demo] 就是配置文件中的两个节:

[example]
name=Tux
style=widgety,fidgety
enabled=1

[demo]
name=Beastie
fullscreen=1

这几个配置语句解析起来有点复杂,因为有两个 name 键。想象一下,一个粗心的程序员在这个配置文件中查询 name,结果总是返回 Beastie,因为这是文件中对 name 的最后一个定义值。在解析这样的文件时,开发人员必须加倍小心地在各节中搜索键,这可能会很棘手,具体取决于用来解析该文件的语言。然而,它仍然是一种很流行的格式,大多数语言都会有一个现成的库来帮助程序员解析 INI 文件。

YAML

YAML 文件 是结构化列表,可以包含值或者键值对:

---
Example:
  Name: 'Tux'
  Style:
   - 'widgety'
    - 'fidgety'
  Enabled: 1

YAML 格式很流行,部分原因是它看起来很整洁。数据要放置到相对其上层数据的特定位置,除此之外没有太多其他语法。然而,对于某些人来说的这种特色,在其他人眼中可能就是一个问题。许多开发人员不愿使用 YAML,正是因为它很看重本质上 不存在 的东西。如果你在 YAML 中缩进错误,YAML 解析器可能会将你的文件视为无效文件,即使不视为无效,返回的数据也可能是错误的。

大多数语言都有 YAML 解析器,并且有很好的开源 YAML linters(验证语法的应用程序)来帮你确保 YAML 文件的完整性。

JSON

JSON 文件在技术上来说是 YAML 的子集,因此其数据结构是相同的,尽管其语法完全不同:

{
  "Example": {
    "Name": [
      "Tux"
    ],
    "Style": [
      "widgety",
      "fidgety"
    ],
    "Enabled": 1
  }
}

JSON 在 JavaScript 程序员中很流行,这并不奇怪,因为 JSON 全称为 JavaScript 对象符号 JavaScript Object Notation 。由于与 Web 开发密切相关,JSON 是 Web API 的常见输出格式。大多数编程语言都有解析 JSON 的库。

XML

XML 使用标签作为键,将配置值围绕起来:

<example>
  <name>Tux</name>
  <style priority="user">widgety</style>
  <style priority="fallback">fidgety</style>
  <enabled>1</enabled>
</example>

XML 经常被 Java 程序员使用,Java 有一套丰富的 XML 解析器。虽然 XML 以非常严格而著称,但同时也非常灵活。与有一系列特定标签的 HTML 不同,XML 中可以随意发明自己的标签。只要始终坚持相同的构建规则,并有一个良好的库来解析它,你就可以准确而轻松地提取数据。

有一些很好的开源 linter 可以帮你验证 XML 文件,并且大多数编程语言都提供用于解析 XML 的库。

二进制格式

Linux 以纯文本配置为傲。这样做的优点是可以使用 cat 等基本工具查看配置数据,甚至可以使用你 最喜欢的文本编辑器 来编辑配置。

但是,某些应用程序使用二进制格式配置,就意味着数据以某种非自然语言的格式进行编码。这些文件通常需要一个特殊的应用程序(通常是它们要配置的应用程序)来解释它们的数据。你无法查看这些文件,至少无法以任何有意义的方式查看,并且无法在其宿主应用程序之外编辑它们。选用二进制格式的一些原因如下:

  • 速度: 程序员可以使用自定义符号在二进制配置文件中的某些点注册特定的信息位。提取数据时不涉及搜索,因为所有内容都已标注了索引。
  • 大小: 文本文件可能会变大,如果选择压缩文本文件,实际上是在将其转换为二进制格式。二进制文件可以通过编码技巧变得更小(文本文件也是如此,但在某些时候,你的优化会使数据变得晦涩,以至于文件也成了二进制文件)。
  • 晦涩: 一些程序员甚至不希望人们查看他们的配置文件,因此将它们编码为二进制数据。这通常只会让用户感到沮丧,并不是使用二进制格式的好理由。

如果必须使用二进制格式进行配置,请使用已作为开放标准存在的格式,例如 NetCDF

找到有效的配置格式

配置格式帮助开发人员存储应用程序所需的数据,并帮助用户存储他们希望应用程序如何操作的偏好项。对于应该使用什么格式的问题,可能没有错误的答案,只要你觉得所使用的语言能很好地支持就可以。在开发应用程序时,查看可用格式,用一些样例数据建模,查看和评估你的编程语言提供的库和实用程序,然后选择你觉得最合适的一种格式吧。


via: https://opensource.com/article/21/6/what-config-files

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

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