Seth Kenlon 发布的文章

通过这篇新的可下载指南开始探索容器技术的要领。

在电视剧 《 太空堡垒卡拉狄加 Battlestar Galactica 》中,这艘名副其实的巨型飞船其实并没有做什么。它是船员们坚定的庇护所,是战略和协调的中心联络点,也是资源管理的安全场所。而 卡布里安毒蛇号 Caprican Vipers 这种单人的独立太空船,出去对付邪恶的 赛昂人 Cylons 和其他太空中的危险。他们也从不只派一两艘毒蛇号出去。他们派了很多。这许许多多的冗余的飞船具有基本相同的能力和目的,但由于它们非常灵活和数量众多,它们总是能够处理每个星期都在威胁战星的任何问题。

如果你认为你感到这像是一个正在发展中的比喻,那么你是对的。现代的“云”大而无当,是分布在很远距离的大量基础设施的集合体。它具有强大的能力,但如果你将其视为普通计算机,就会浪费了它的大部分能力。当你想要处理来自数百万个输入源的大量数据时,把你的解决方案(无论它是采用应用、网站、数据库、服务器还是其他形式)打包起来,并发送该解决方案的微小镜像来处理数据集群,实际上是更有效的。当然,这些都是 “ 容器 container ”,它们是云的劳动力。它们是你发送来处理服务请求的小型解决方案工厂,并且由于你可以根据任何给定时间传入的请求生成所需要的数量,因此理论上它们是取之不尽的。

在家里使用容器

如果你没有大量的传入请求需要处理,你可能会想知道容器给你带来什么好处。不过,在个人电脑上使用容器确实有其用途。

容器作为虚拟环境

通过 Podman、LXC 和 Docker 等工具,你可以像以往运行虚拟机一样运行容器。不过,与虚拟机不同,容器没有因模拟固件和硬件而产生的开销。

你可以从公共仓库下载容器镜像,启动一个最小化的 Linux 环境,并将其作为命令或开发的测试场所。例如,假设你想试试你在 Slackware Linux 上构建的一个应用。首先,在仓库中搜索一个合适的镜像:

$ podman search slackware

然后选择一个镜像,作为你的容器的基础:

$ podman run -it --name slackware vbatts/slackware
sh-4.3# grep -i ^NAME\= /etc/os-release
NAME=Slackware

在工作中使用容器

当然,容器不只是个精简的虚拟机。它们可以是针对为非常具体的需求提供的特定解决方案。如果你不熟悉容器,那么新系统管理员最常见的入门仪式之一可能会有所帮助:启动你的第一个 Web 服务器,但是在容器中。

首先,获取一个镜像。你可以使用 podman search 命令来搜索你喜欢的发行版,或者直接搜索你喜欢的 httpd 服务器。当使用容器时,我倾向于信任我在裸机上使用的相同发行版。

当你你找到一个镜像作为你的容器的基础,你就可以运行你的镜像。然而,正如这个术语所暗示的,容器是封起来的,所以如果你只是启动一个容器,你将无法访问标准的 HTTP 端口。你可以使用 -p 选项将一个容器端口映射到一个标准的网络端口:

$ podman run -it -p 8080:80 docker.io/fedora/apache:latest

现在看看你本地主机上的 8080 端口:

$ curl localhost:8080
Apache

成功了。

了解更多

容器拥有比模仿虚拟机更多的潜力。你可以将它们分组在 “ pod ” 中,构建复杂应用的自动部署,启动冗余服务以满足高需求等等。如果你刚刚开始使用容器,你可以 下载我们最新的电子书 来学习该技术,甚至学习创建一个 “ pod ”,以便你可以运行 WordPress 和数据库。

下载我们最新的电子书

(LCTT 译注:容器环境中使用的 “Pod” 一词,我以前根据容器相关术语多用航海领域名词比喻来将其译做“吊舱”,但也有同学表示了不同意见。根据对 Kubernetes 文档,这个词来自对 鲸鱼荚 pod of whales 豌豆荚 pea pod 的比喻,所以我觉得采用“荚”的翻译比较合适。—— wxy)


via: https://opensource.com/article/22/5/containers-pods-101-ebook

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

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

在本教程中,你将学习如何在一个“吊舱”中运行两个容器来托管一个 WordPress 站点。

 title=

无论你是将其作为工作的一部分、未来的工作机会或者仅仅是出于对新技术的兴趣,容器对很多人,即使是经验丰富的系统管理员,可能是非常难以应付的。那么如何真正开始使用容器呢?从容器到 Kubernetes 的成长路径是什么?另外,为什么有不止一条路径?如你所料,最好的起点就是现在。

1、了解容器

略一回忆,容器的开端可以追溯到早期 BSD 及其特殊的 chroot 监狱,但让我们直接跳到发展中期讲起。

之前,Linux 内核引入了 “ 控制组 cgroup ”,允许你能够使用 “ 命名空间 namespace ” 来“标记”进程。当你将进程分组到一个命名空间时,这些进程的行为就像在命名空间之外的东西不存在一样,这就像你把这些进程放入某种容器中。当然,这种容器是虚拟的,它位于计算机内部,它和你操作系统的其余进程使用相同的内核、内存和 CPU,但你用容器包含了这些进程。

分发的预制容器仅包含运行它所包含的应用程序必须的内容。使用容器引擎,如 Podman、Docker 或 CRI-O,你可以运行一个容器化应用程序,而无需进行传统意义上的安装。容器引擎通常是跨平台的,因此即使容器运行在 Linux 上,你也可以在其他 Linux、MacOS 或 Windows 上启动容器。

更重要的是,当需求量很大时,你可以运行同一应用程序的多个容器。

现在你知道了什么是容器,下一步是运行一个容器。

2、运行一个容器

在运行容器之前,你应该有一个想要运行它的理由。你可以编一个,这有助于你对让容器创建过程感兴趣,这样你就会受到鼓舞,真正去使用你所运行的容器。毕竟,运行容器但不使用它提供的应用程序,只能证明你没有注意到任何故障,但使用容器证明它可以工作。

我推荐从 WordPress 开始,它是一个很流行的 Web 应用程序,容易使用,所以一旦容器运行起来,你就可以测试使用它。虽然你可以轻松地配置一个 WordPress 容器,但还是有很多配置选项可以引导你发现更多运行容器的方式(例如运行数据库容器)以及容器如何通信。

我使用 Podman,它是一个友好、方便且无守护进程的容器引擎。如果你没有安装 Podman,可以改用 Docker 命令。它们都是很棒的开源容器引擎,而且它们的语法是相同的(只需输入 docker 而不是 podman)。因为 Podman 没有守护进程,所以它需要更多的配置,但为了这种运行免 root、无守护进程的容器的能力是值得的。

如果你使用 Docker,可以跳到下面的 运行 WordPress 容器 小节,否则,打开终端安装并配置 Podman:

$ sudo dnf install podman

容器会产生许多进程,通常只有 root 用户有权创建数千个进程 ID。创建一个名为 /etc/subuid 的文件,定义一个适当的起始 UID 和大量合法的 PID,这样就可以为你添加一些额外的进程 ID:

seth:200000:165536

在名为 /etc/subgid 的文件中对你的组执行相同的操作。在这个例子中,我的主要组是 staff(对你来说可能是 users,或者和你的用户名一样,这取决于你的系统)。

staff:200000:165536

最后,确认你的用户可以管理很多命名空间:

$ sysctl --all --pattern user_namespaces
user.max_user_namespaces = 28633

如果你的用户无权管理超过 28,000 个命名空间,创建 /etc/sysctl.d/userns.conf 文件来增加数量并输入:

user.max_user_namespaces=28633

运行 WordPress 容器

现在,无论你使用的是 Podman 还是 Docker,你都可以从在线容器仓库中下载 WordPress 容器并运行它。你可以使用以下 Podman 命令完成所有这些操作:

$ podman run --name mypress \
    -p 8080:80 -d wordpress

给 Podman 一会时间来找到容器、从互联网下载它,然后启动。

在收到终端返回提示符后,启动 Web 浏览器,打开 localhost:8080。WordPress 正在运行,等待你进行设置。

 title=

不过,你很快就会遇到障碍,因为 WordPress 使用数据库来存储数据,因此你需要为其提供一个数据库。

在继续之前,停止并删除 WordPress 容器:

$ podman stop mypress
$ podman rm mypress

3、在吊舱中运行容器

正如名字所暗示的那样,容器在设计上是独立的。在容器中运行的应用程序不应该与在容器外的应用程序或基础设施进行交互。因此,当一个容器需要另一个容器才能运行时,一种解决方案是将这两个容器放在一个更大的容器中,称为 “ 吊舱 pod ”。吊舱确保其容器可以共享重要的命名空间以便相互通信。

创建一个新的吊舱,为它提供一个名称,以及希望能够访问的端口:

$ podman pod create \
    --name wp_pod \
    --publish 8080:80

确认吊舱存在:

$ podman pod list
POD ID        NAME     STATUS    INFRA ID      # OF CONTAINERS
100e138a29bd  wp_pod   Created   22ace92df3ef   1

将容器添加到吊舱

现在你已经为相互依赖的容器创建了一个吊舱,你可以通过指定一个运行的吊舱来启动每个容器。

首先,启动一个数据库容器。你可以创建自己的凭据,只要在 WordPress 连接到数据库时使用相同的凭据。

$ podman run --detach \
    --pod wp_pod \
    --restart=always \
    -e MYSQL_ROOT_PASSWORD="badpassword0" \
    -e MYSQL_DATABASE="wp_db" \
    -e MYSQL_USER="tux" \
    -e MYSQL_PASSWORD="badpassword1" \
    --name=wp_db mariadb

接下来,在同一个吊舱中启动 WordPress 容器:

$ podman run --detach \
    --restart=always --pod=wp_pod \
    -e WORDPRESS_DB_NAME="wp_db" \
    -e WORDPRESS_DB_USER="tux" \
    -e WORDPRESS_DB_PASSWORD="badpassword1" \
    -e WORDPRESS_DB_HOST="127.0.0.1" \
    --name mypress wordpress

现在启动你最喜欢的网络浏览器并打开 localhost:8080

这一次,设置会正常进行。WordPress 会连接到数据库,因为你在启动容器时传递了这些环境变量。

 title=

创建用户账户后,你可以登录查看 WordPress 仪表板。

 title=

下一步

你已经创建了两个容器,并在一个吊舱中运行了它们。你现在已经了解了如何在自己的服务器上运行容器及服务。如果你想迁移到云,容器非常适合你。使用像 Kubernetes 和 OpenShift 这样的工具,你可以自动化启动 集群上的容器和吊舱。如果你正在考虑采取下一步行动,阅读 Kevin Casey 的 3 个开始使用 Kubernetes 的方法,并尝试他提到的 Minikube 教程。


via: https://opensource.com/article/22/2/start-running-containers

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

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

如果你打算在今年探索 Rust,请下载我们的免费 Rust 速查表,以供快速参考基础知识。

 title=

Rust 是一门相对较新的编程语言,受到各个企业的 程序员的欢迎。尽管如此,它仍是一门建立在之前所有事物之上的语言。毕竟,Rust 不是一天做出来的,所以即便 Rust 中的一些概念看起来与你从 Python、Java、C++ 等编程语言学到的东西大不相同,但它们都是基于同一个基础,那就是你一直与之交互(无论你是否知道)的 CPU 和 NUMA( 非统一内存访问 Non Uniform Memory Access )架构,因此 Rust 中的一些新功能让人感觉有些熟悉。

现在,我的职业不是程序员。我没耐心但我又有点儿强迫症。当我需要完成某件事时,如果一门语言不能帮助我相对较快地获得想要的结果,那么我很少会受到鼓舞而使用它。Rust 试图平衡两个矛盾:现代计算机对安全和结构化代码的需求,和现代程序员对编码工作事半功倍的渴望。

安装 Rust

rust-lang.org 网站有丰富的的文档指导如何安装 Rust,但通常,它就像下载 sh.rustup.rs 脚本并运行它一样简单。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs
$ less sh.rustup.sh
$ sh ./sh.rustup.rs

没有类

Rust 没有类,也不使用 class 关键字。Rust 确实有 struct 数据类型,但它的作用是充当数据集合的一种模板。因此,你可以使用 结构体 struct ,而不是创建一个类来表示虚拟对象:

struct Penguin {
  genus: String,
  species: String,
  extinct: bool,
  classified: u64,
}

你可以像使用类一样使用它。例如,当定义完 Penguin 结构,你就可以创建它的实例,并与该实例进行交互:

struct Penguin {
  genus: String,
  species: String,
  extinct: bool,
  classified: u64,
}

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(),
    species: "R adeliæ".to_owned(), 
    extinct: false, 
    classified: 1841 };

  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
    println!("Sadly this penguin has been made extinct.");
  }
}

impl 数据类型与 struct 数据类型结合使用,你可以实现一个包含函数的结构体,并且可以添加继承和其他与类相似的特性。

函数

Rust 中的函数很像其他语言中的函数。每个函数都代表一组严谨的任务,你可以在需要时调用它们。主函数名必须是 main

fn 关键字声明函数,后跟函数名称和函数接受的所有参数。

fn foo() {
  let n = 8;
  println!("Eight is written as {}", n);
}

通过参数,将信息从一个函数传递到另一个函数。例如,我已经创建了一个 Penguin 类(结构),并且我有一个 Penguin 的实例为 p,将目标函数的参数指定为 Penguin 类型,就可把 p 的属性从一个函数传递到另一个函数。

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(), 
    species: "R adeliæ".to_owned(), 
    extinct: false, classified: 1841 };
  printer(p);
}

fn printer(p: Penguin) {
  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
    println!("Sadly this penguin has been made extinct.");
  }
}

变量

Rust 默认创建的为 不可变 immutable 变量。这意味着你创建的变量以后无法更改。这段代码虽然看起来没问题,但无法编译:

fn main() {
  let n = 6;
  let n = 5;
}

但你可以使用关键字 mut 声明一个 可变 mutable 变量,因此下面这段代码可以编译成功:

fn main() {
  let mut n = 6;
  println!("Value is {}", n);
  n = 5;
  println!("Value is {}", n);
}

编译

Rust 编译器,至少就其报错信息而言,是可用的最好的编译器之一。当你在 Rust 中出错时,编译器会真诚地告诉你做错了什么。实际上,仅通过从编译器错误消息中学习,我就了解了 Rust 的许多细微差别(就我理解到的 Rust 的任何细微差别而言)。即便有时错误消息太过于模糊,而不知所以然,互联网搜索几乎总能得到解释。

启动 Rust 程序的最简单方法是使用 cargo,它是 Rust 的包管理和构建系统。

$ mkdir myproject
$ cd myproject
$ cargo init 

以上命令为项目创建了基本的基础架构,最值得注意的是 src 子目录中的 main.rs 文件。打开此文件,把我为本文生成的示例代码粘贴进去:

struct Penguin {
  genus: String,
  species: String,
  extinct: bool,
  classified: u64,
}

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(), species: "R adeliæ".to_owned(), extinct: false, classified: 1841 };
  printer(p);
  foo();
}

fn printer(p: Penguin) {
  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
    println!("Sadly this penguin has been made extinct.");
  }
}

fn foo() {
  let mut n = 6;
  println!("Value is {}", n);
  n = 8;
  println!("Eight is written as {}", n);
}

使用 cargo build 命令进行编译:

$ cargo build

执行 target 子目录下的二进制程序,或者直接运行 cargo run 命令来运行你的项目:

$ cargo run
Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 6
Eight is written as 8

Crates

任何语言的大部分便利都来自于它的库或模块。在 Rust 中,进行分发和跟踪的库称为 “crate”(箱子)。crates.io 是一个很好的社区 crate 注册网站。

把一个 crate 添加到你的 Rust 项目,首先要在 Cargo.toml 文件中添加这个 crate。例如,要安装随机数函数,我使用名为 rand 的 crate,使用 * 作为通配符,以确保在编译时获得最新版本:

[package]
name = "myproject"
version = "0.1.0"
authors = ["Seth <[email protected]>"]
edition = "2022"

[dependencies]
rand = "*"

在 Rust 代码中使用它需要在最顶行使用 use 语句:

use rand::Rng;

以下是一些创建随机种子和随机范围的示例代码:

fn foo() {
  let mut rng = rand::thread_rng();
  let mut n = rng.gen_range(1..99);

  println!("Value is {}", n);
  n = rng.gen_range(1..99);
  println!("Value is {}", n);
}

你可以使用 cargo run 来运行它,它会检测代码是否被更改并触发一个新的构建。构建过程中下载名为 randcrete 和它依赖的所有 crate,编译代码,然后运行它:

$ cargo run
Updating crates.io index
Downloaded ppv-lite86 v0.2.16
Downloaded 1 crate (22.2 KB) in 1.40s
 Compiling libc v0.2.112
 Compiling cfg-if v1.0.0
 Compiling ppv-lite86 v0.2.16
 Compiling getrandom v0.2.3
 Compiling rand_core v0.6.3
 Compiling rand_chacha v0.3.1
 Compiling rand v0.8.4
 Compiling rustpenguin v0.1.0 (/home/sek/Demo/rustpenguin)
 Finished dev [unoptimized + debuginfo] target(s) in 13.97s
 Running `target/debug/rustpenguin`

Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 70
Value is 35

Rust 速查表

Rust 是一门令人非常愉快的语言。集成了在线注册网站、有用的编译器和几乎直观的语法,它给人的适当的现代感。

但请不要误会,Rust 仍是一门复杂的语言,它具有严格的数据类型、强作用域变量和许多内置方法。Rust 值得一看,如果你要探索它,那么你应该下载我们的免费 Rust 速查表,以便快速了解基础知识。越早开始,就越早了解 Rust。当然,你应该经常练习以避免生疏。

Rust 速查表

via: https://opensource.com/article/22/1/rust-cheat-sheet

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

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

开源并不仅仅指的是软件。开源是一种文化现象,自然也适合桌面游戏。

 title=

我喜欢优秀的游戏,尤其是桌游,因为桌游的很多特性都和开源相同。在现实生活中,当你和朋友围坐在桌旁一起玩卡牌游戏时,作为一个团队,你们可以一起决定小丑牌是不是万能的。还有,你们可以随意地决定当出了小丑牌后,手上有 Ace 牌的人的要不要舍弃 Ace 牌,或者出了方块皇后以后,每个人是不是都要把手上的牌传给右手边的人。换句话说,你们可以随心所欲地重新制定规则,因为游戏不过是参与者们一致认同的条件集合罢了。对我来说,更棒的是你可以发明自己的游戏,而不用破坏别人的游戏规则。有时候,我会作为一个业余爱好者来开发桌游。因为我喜欢把自己的爱好结合起来,所以我倾向于只使用开源和开放的文化资源来设计游戏。

首先,游戏有大致有两个关键特征,风格和机制,理解这一点非常重要。游戏风格指的是游戏的故事或者主题,游戏机制指的是游戏的规则和条件。这两者并不总是完全脱离的,举个例子,在设计一款以赛车为主题的游戏时,自然而然就会要求玩家迅速完成动作。然而,风格和机制通常是被分开对待的,所以我们完全可以为了好玩就去创造一款使用标准扑克牌,却以太空羊驼为主题的游戏。

开源美术

如果你去过现代艺术博物馆,你可能会发现自己站在一幅纯蓝色的画布前,无意中听到有人说起老话:“见鬼,这我也能做!”。但事实是,艺术是一项艰巨的工作。创作赏心悦目的艺术品需要付出大量的思考、时间、信心和技巧。这也意味着艺术是你在设计游戏时中最难采购的部分之一。

我有一些“技巧”来解决这个典型难题。

1、寻找同类素材

现在有很多免费、开放的艺术作品,而且大部分质量上佳。问题在于,游戏通常需要不止一件作品。如果你正在设计一款纸牌游戏,你大概至少需要四到六个不同的元素(假设你的纸牌遵循塔罗牌风格),有可能还需要更多。如果你花足够多的时间在这上面,你可以在 OpenGameArt.orgFreeSVG.orgArtStation.comDeviantArt.com 等网站上找到 知识共享和公共领域 Creative Commons and Public Domain 的艺术作品。

如果你使用的网站没有专门搜索 知识共享 Creative Commons 的功能,输入以下文字到任何搜索引擎当中,"This work is licensed under a Creative Commons""本工作处于知识共享许可协议之下"(引号很重要,不要把它们漏了),并用搜索引擎要求的语法,以便将搜索限制到一个具体的站点当中(举个例子,site:deviantart.com)。

一旦你有了一个可供挑选素材的艺术库,那就去辨别这些作品的主题,并根据主题分类。两个不同的人拍摄的机器人的照片可能看起来一点都不像,但它们的主题都是机器人。如果提供给你足够多机器人相关的美术素材,你可以围绕机器人这个主题构建你的游戏风格。

2、委托创作知识共享艺术

你可以雇艺术家来为你定制艺术作品。我与使用开源绘画程序(如 Krita 和 Mypaint)的艺术家一起合作。同时,作为合同的一部分,我规定艺术作品必须在 知识共享署名-相同方式许可证 Creative Commons Attribution-ShareAlike (CC BY-SA)下授权。迄今为止,只有一位艺术家因为许可证的限制拒绝了我的提议,并且大多数人都很高兴自己的美术作品有可能有更大的生命力,而不仅仅是作为业余爱好者自己发行的游戏的一部分。

3、创作自己的艺术

就像现代艺术馆之旅展示的那样,艺术是一个非常灵活的词。我发现只要我给自己设定一个目标,也就是我需要为一款游戏创造多少纸牌或令牌,我便能够从 Linux 上的丰富图像创造工具中选择一种去创作。这并不需要什么高难度的东西。就像现代艺术一样,你可以用蓝色和黄色的条纹,或者红色和白色的圆点花纹,或者绿色和紫色的锯齿线来涂一张卡片,只要你能把它们画出来,那么除了你以外,其他人永远不会知道你暗地里把它们当做仙宫里的贵族和小姐。想想看,通过运用图形应用程序,描摹日常物品的照片,重组经典的扑克花色和塔罗牌主题等一系列方式,你可以创造出的简单作品吧。

版面设计

我用 Inkscape、Scribus 或者 GIMP 来进行版面设计,这取决与我有什么素材以及我追求的设计方式是什么。

对于卡牌,我发现简单的版面设计很容易实现,看上去也更好,纯色比渐变色更容易印刷,还有,直观的图像是最棒的。

 title=

(Seth Kenlon, CC BY-SA 4.0)

我在一个单独的 Inkscape 文件中为我最新的游戏做了版面设计,这个游戏只使用了来自 OpenGameArt.com 上三四个不同艺术家的九张图片。在有着更大的美工集,更好的卡牌多样性的游戏中,我会在游戏中的每一种卡片的文件中为它们设计版面。

在为你的游戏素材做任何版面设计之前,要先了解你的目标输出是什么。如果你打算在家里打印游戏,那就做一些计算,搞清楚默认的纸张大小(有些是 US Letter,或者是 A4)可以容纳多少卡牌、令牌或卡片。如果你使用 TheGameCrafter 之类的桌游打印机打印,请下载好模板文件。

 title=

(Seth Kenlon, CC BY-SA 4.0)

游戏机制

游戏机制是游戏中最重要的部分。它们使一款游戏成为游戏。开发游戏规则并不一定是一个正式的过程。你可以一时兴起地创造了一款游戏,可以拿一个现有的游戏重组它的规则,直到它和原来不同,可以修改一款你不喜欢的游戏,也可以将两款不同的游戏组合在一起。从简单容易的地方做起,拿索引卡,标准扑克牌,或塔罗牌去试着模拟你的想象中游戏是如何工作的。你可以自己尝试早期的游戏创意,但最终,让朋友来帮忙是找出意外故障和进行优化的好方法。

经常测试游戏。与不同类型的玩家一起玩游戏,并听取他们的反馈。你的游戏可能会激发许多玩家去创造新的规则和想法,因此要将关于 哪些搞砸了 的反馈与关于 哪些可以做修改 的反馈分开。你不一定要去真的实施这些反馈意见,只需迭代你的想法,但还是要仔细考虑错误报告。

一旦确定了你想要让你的规则如何运作,就把它们写下来,让它们 简短且容易解析。你定的规则不必说服玩家去玩这款游戏,不必向他们解释策略,你也不必允许玩家重新设置规则,只要告诉玩家为了让游戏玩起来,他们应该采取的步骤就可以了。

最重要的是,考虑一下,将你的规则开源。分享经验是游戏的一切,这其中也应该包括规则。知识共享或 开放游戏许可证 Open Gaming License 的规则集合允许其他玩家在你的作品上进行迭代、混合和构建。你永远不会知道,有人可能会因此想出一个你更喜欢的游戏变体!

开源游戏

开源不仅仅指的是软件。开源是一种文化现象,自然也适合桌面游戏。花几个晚上的时间来尝试制作游戏。如果你是新手,那就从一些简单的开始,比如下面的这个空白卡牌游戏:

  1. 找来一些朋友。
  2. 给每个人几张空白的索引卡,告诉他们在每张卡片上写一条规则。规则可以是任何东西(“如果你穿着红色衣服,你就赢了”或“第一个站起来的人赢”等等)。
  3. 在你自己的索引卡片上,写上 “和”、“但是”、“但是不要”、“而且不要”、“除了”,以及其他的条件短语。
  4. 洗牌并将牌发给所有玩家。
  5. 每个玩家轮到的时候出一张牌。
  6. 最终目标是获胜,但是玩家可以通过出 “和”、“但是”、“或者” 卡片来修改决定胜负的条件。

这是一个有趣的聚会游戏,同时是一份很好的介绍,告诉你如何像游戏设计者一样思考,它帮助你认识到什么适合作为游戏机制,什么不适合。

还有,当然的,这是开源的。

(题图片由 MorningbirdPhotoPixabay 上发布 )


via: https://opensource.com/article/21/12/open-source-card-game

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

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

Gwenview 是一个优秀的照片编辑器,适合业余摄影师在 Linux KDE 桌面上使用。

 title=

一张好的照片可以蕴含很多信息。表面上它表达了你所看到的,但它也讲述了你所经历的。细微之处也能说明很多问题:你在拍照时选择的角度、取景中隐约可见的的东西有多大,以及,相比之下,那些有意识选择忽略的部分。

照片通常并不意味着记录真实发生的事情,相反,它们会成为你(摄影师)如何看待发生的事情的洞察力。

这就是照片编辑如此普遍的原因之一。当你把照片发布到你的在线图片库或社交网络时,你不应该发布一张不能准确表达照片所包含的感受的照片。但同样的道理,你也不应该成为一个专业的照片合成师,而只是为了剪掉在最后时刻将头伸进你的家庭快照的路人。如果你使用的是 KDE,你可以使用 Gwenview 这种休闲照片编辑器。

在 Linux 上安装 Gwenview

如果你正在运行 KDE Plasma 桌面,你可能已经安装了 Gwenview。如果你没有安装,或者你正在使用一个不同的桌面,而你想尝试 Gwenview,那么你可以用你的软件包管理器安装它。

我建议同时安装 Gwenview 和 Kipi 插件集,它可以将 Gwenview 与几个在线照片服务连接起来,这样你就可以轻松上传照片。在 Fedora、Mageia 和类似发行版上:

$ sudo dnf install gwenview kipi-plugins

在 Debian、Elementary 和类似版本上:

$ sudo apt install gwenview kipi-plugins

使用 Gwenview

Gwenview 通常有两种启动方式。你可以在 Dolphin 中点击图片文件,并选择在 Gwenview 中打开它;或者你可以启动 Gwenview,并在文件夹中寻找照片,Gwenview 或多或少可以充当你的文件管理器。第一种方法是直接的方法,很适合快速方便地预览图片文件。第二种方法是当你浏览大量照片,不确定哪一个版本的照片是“正确的”时,你可能会使用。

无论你如何启动 Gwenview,界面和功能都是一样的:右边有一个工作区,左边有一个面板。

 title=

(Seth Kenlon CC BY-SA 4.0, Photo courtesy Andrea De Santis

在左边的面板下面,有三个标签:

  • 文件夹 Folders :显示你电脑上的文件夹的树状视图,以便你可以浏览你的文件,寻找更多的照片。
  • 信息 Information :提供关于你目前正在查看的照片的元数据。
  • 操作 Operations :允许你对当前的照片进行小的修改,如在横向和纵向之间旋转、调整大小和裁剪等。

Gwenview 能理解文件系统,所以你可以按键盘上的箭头,查看文件夹中的上一张或下一张照片。

要离开单张照片视图并查看一个文件夹中的所有图片,请点击顶部工具栏中的“ 浏览 Browse ”按钮。

 title=

(Seth Kenlon,CC BY-SA 4.0

你也可以同时拥有两种视图。点击 Gwenview 底部的“ 缩略图栏 Thumbnail Bar ”按钮,可以以电影胶片的形式看到当前文件夹中的其他图片,而当前选择的照片则在主面板中。

 title=

(Seth Kenlon,CC BY-SA 4.0

用 Gwenview 编辑照片

数码照片是很常见的,因此在网上发布或与朋友分享之前,需要对照片进行细微的调整也是同样常见。有非常好的应用可以编辑照片,事实上,其中最好的一个是另一个 KDE 应用,叫做 Krita(你可以在我的 给摄影者的 Krita 文章中阅读我如何使用它来处理照片),但是小的调整不应该需要艺术学位。这正是 Gwenview 所确保的:用一个休闲但功能强大的应用进行简单而快速的照片调整,并与你的 Plasma 桌面的其他部分整合。

我们大多数人对照片进行的最常见的调整是:

  • 旋转:当你的相机没有提供正确的元数据让你的电脑知道一张照片是要以横向还是纵向观看时,你可以手动修复它。
  • 镜像:许多笔记本电脑或面部摄像头模仿镜子,这很有用,因为这是我们习惯于看到自己的方式。但是,它会使文字逆转。镜像功能可以从右到左翻转图像。
  • 翻转:在数码相机和笔记本电脑上不太常见,但在手机上,无论你怎么拿手机,使用倒置设备拍照的现象在屏幕翻转的手机中并不少见。翻转功能可将图像旋转 180 度。
  • 调整大小:数字图像现在通常具有超高清尺寸,有时这比你需要的要多得多。如果你通过电子邮件发送照片或将其发布在你想要优化加载时间的网页上,你可以将尺寸(和相应的文件大小)缩小到更小的尺寸。
  • 裁剪:你有一张很棒的自己的照片,但不小心偶然发现了一个你认为不合适的人。用裁剪工具剪掉你不想要的所有东西。
  • 红眼:当你的视网膜将相机的闪光灯反射回相机时,会得到红眼效果。Gwenview 可以通过在可调节区域中对红色通道进行去饱和和变暗来减少这种情况。

所有这些工具都在“ 操作 Operations ”侧面板或“ 编辑 Edit ”菜单中可用。这些操作具有破坏性,因此在你进行更改后,单击“ 另存为 Save As ”以保存图像的 副本

 title=

(Seth Kenlon,CC BY-SA 4.0,照片由 Elise Wilcox 提供)

分享照片

当你准备好分享照片时,单击顶部工具栏中的“ 分享 Share ”按钮,或转到“ 插件 Plugins ”菜单并选择“ 导出 Export ”。Gwenview 与 Kipi 插件集成在一起,可以在 NextcloudPiwigo、普通旧电子邮件以及 Google Drive、Flickr、Dropbox 等服务共享照片。

Linux 上的照片编辑要点

Gwenview 拥有桌面照片管理器的所有必需功能。如果你需要的不仅仅是基本功能,你可以在 Krita 或 Digikam 中打开一张照片,并根据需要进行重大修改。对于其他一切,从浏览、排名、标记和小调整,Gwenview 都很方便。


via: https://opensource.com/article/22/2/crop-resize-photos-gwenview-kde

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

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

了解如何在 Linux 上使用 dnf 命令安装软件包,然后下载我们的速查表,让正确的命令触手可及。

 title=

在计算机系统上安装应用程序非常简单:就是将档案(如 .zip 文件)中的文件复制到目标计算机上,放在操作系统预期放应用程序的位置。因为我们中的许多人习惯于使用花哨的安装“向导”来帮助我们在计算机上安装软件,所以这个过程似乎在技术上应该比实际更复杂。

然而,复杂的是,是什么构成了一个程序?用户认为的单个应用程序实际上包含了分散在操作系统中的软件库的各种依赖代码(例如:Linux 上的 .so 文件、Windows 上的 .dll 文件和 macOS 上的 .dylib 文件)。

为了让用户不必担心这些程序代码之间的复杂的互相依赖关系, Linux 使用 包管理系统 package management system 来跟踪哪些应用程序需要哪些库,哪些库或应用程序有安全或功能更新,以及每个软件会附带安装哪些额外的数据文件。包管理器本质上是一个安装向导。它们易于使用,提供了图形界面和基于终端的界面,让你的生活更轻松。你越了解你的发行版的包管理器,你的生活就会越轻松。

在 Linux 上安装应用程序

如果你在使用 Linux 桌面时,偶尔想要安装一个应用程序,那么你可能正在寻找 GNOME “软件”,它是一个桌面应用程序浏览器。

 title=

它会按你的预期工作:点击它的界面,直到你找到一个看起来有用的应用程序,然后单击 “安装” 按钮。

或者,你可以在 GNOME “软件” 中打开从网络下载的 .rpm.flatpakref 软件包,以便它进行安装。

但如果你更倾向于使用命令行,请继续阅读。

用 dnf 搜索软件

在安装应用程序之前,你可能需要确认它是否存在于你的发行版的服务器上。通常,使用 dnf 搜索应用程序的通用名称就足够了。例如,假设你最近阅读了 一篇关于 Cockpit 的文章,并决定尝试一下。你可以搜索 cockpit 验证该发行版是否包含它:

$ dnf search cockpit
 Last metadata expiration check: 0:01:46 ago on Tue 18 May 2021 19:18:15 NZST.
 ==== Name Exactly Matched: cockpit ====
 cockpit.x86_64 : Web Console for Linux servers

==== Name & Summary Matched: cockpit ==
 cockpit-bridge.x86_64 : Cockpit bridge server-side component
 cockpit-composer.noarch : Composer GUI for use with Cockpit
 [...]

有一个精确的匹配。上面列出的匹配的软件包名为 cockpit.x86_64,但名称中的 .x86_64 部分仅表示它兼容该 CPU 架构。默认情况下,你的系统会安装适配当前 CPU 架构的软件包,因此你可以忽略该扩展名。所以你确认你要查找的软件包确实简称为 cockpit

现在你可以放心地使用 dnf install 安装它。 此步骤需要管理员权限:

$ sudo dnf install cockpit

一般来说,这就是典型的 dnf 工作流:搜索并安装。

然而,有时 dnf search 的结果并不清晰,或者你想要关于一个软件包的更多信息,而不仅仅是它的通用名称。有一些相关的 dnf 子命令,具体取决于你想要的信息。

软件包的元数据

如果你觉得你的搜索已 接近 想要的结果,但还不确定,查看软件包的元数据通常会有所帮助,例如项目的网址和描述。要获取此信息,请使用顾名思义的 dnf info 命令:

$ dnf info terminator
Available Packages
Name         : terminator
Version      : 1.92
Release      : 2.el8
Architecture : noarch
Size         : 526 k
Source       : terminator-1.92-2.el8.src.rpm
Repository   : epel
Summary      : Store and run multiple GNOME terminals in one window
URL          : https://github.com/gnome-terminator
License      : GPLv2
Description  : Multiple GNOME terminals in one window.  This is a project to produce
             : an efficient way of filling a large area of screen space with
             : terminals. This is done by splitting the window into a resizeable
             : grid of terminals. As such, you can  produce a very flexible
             : arrangements of terminals for different tasks.

这个信息告诉你可用软件包的版本、在你系统中注册的哪一个存储库提供了它、该项目的网站以及详细的功能描述。

哪个软件包提供的这个文件?

软件包名称并不总是与你要查找的内容相匹配。例如,假设你正在阅读的文档告诉你必须安装名为 qmake-qt5 的东西:

$ dnf search qmake-qt5
No matches found.

dnf 数据库非常广泛,因此你不要局限于搜索完全匹配的内容。你可以使用 dnf provides 命令来了解你正在寻找的东西是否作为某个更大的软件包的一部分而提供:

$ dnf provides qmake-qt5
qt5-qtbase-devel-5.12.5-8.el8.i686 : Development files for qt5-qtbase
Repo        : appstream
Matched from:
Filename    : /usr/bin/qmake-qt5

qt5-qtbase-devel-5.15.2-3.el8.x86_64 : Development files for qt5-qtbase
Repo        : appstream
Matched from:
Filename    : /usr/bin/qmake-qt5

可以确认应用程序 qmake-qt5 是名为 qt5-qtbase-devel 的软件包的一部分。它还告诉你,该应用程序会安装到 /usr/bin,因此你知道了安装后它的确切位置。

软件包中包含哪些文件?

有时我发现自己会从完全不同的角度来对待 dnf。有时,我已经确认我的系统上安装了一个应用程序;我只是不知道我是怎么得到它的。还有一些时候,我知道我安装了一个特定的软件包,但我不清楚这个软件包到底在我的系统上安装了什么。

如果你需要对包的 有效负载 payload 进行 “ 逆向工程 reverse engineer ”,可以使用 dnf repoquery 命令和 --list 选项。这将查看存储库中有关软件包的元数据,并列出该软件包提供的所有文件:

$ dnf repoquery --list qt5-qtbase-devel
/usr/bin/fixqt4headers.pl
/usr/bin/moc-qt5
/usr/bin/qdbuscpp2xml-qt5
/usr/bin/qdbusxml2cpp-qt5
/usr/bin/qlalr
/usr/bin/qmake-qt5
/usr/bin/qvkgen
/usr/bin/rcc-qt5
[...]

这些列表可能很长,使用 less 或你喜欢的分页命令配合管道操作会有所帮助。

移除应用程序

如果你决定系统中不再需要某个应用程序,可以使用 dnf remove 卸载它,该软件包本身安装的文件以及不再需要的任何依赖项都会被移除:

$ dnf remove bigapp

有时,你发现随着一个应用程序一起安装的依赖项对后来安装的其他应用程序也有用。如果两个包需要相同的依赖项,dnf remove 不会 删除依赖项。在安装和卸载大量应用程序之后,孤儿软件包散落各处的现象并不少见。大约每年我都要执行一次 dnf autoremove 来清除所有未使用的软件包:

$ dnf autoremove

这不是必需的,但这是一个让我的电脑感觉更好的大扫除步骤。

了解 dnf

你对包管理器的工作方式了解得越多,在必要时安装和查询应用程序就越容易。即便你不是 dnf 的重度使用者,当你发现自己与基于 RPM 的发行版交互时,了解它也会很有用。

告别 yum 后,我最喜欢的包管理器之一是 dnf 命令。虽然我不喜欢它的所有子命令,但我发现它是目前最健壮的 包管理系统 package management system 之一。 下载我们的 dnf 速查表 习惯该命令,不要害怕尝试一些新技巧。一旦熟悉了它,你可能会发现很难使用其他任何东西替代它。

dnf 速查表

via: https://opensource.com/article/21/6/dnf-linux

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

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