2020年3月

了解 Rust 的软件包管理器和构建工具。

Rust 是一种现代编程语言,可提供高性能、可靠性和生产力。几年来,它一直被 StackOverflow 调查评为最受欢迎的语言

除了是一种出色的编程语言之外,Rust 还具有一个称为 Cargo 的构建系统和软件包管理器。Cargo 处理许多任务,例如构建代码、下载库或依赖项等等。这两者捆绑在一起,因此在安装 Rust 时会得到 Cargo。

安装 Rust 和 Cargo

在开始之前,你需要安装 Rust 和 Cargo。Rust 项目提供了一个可下载的脚本来处理安装。要获取该脚本,请打开浏览器以访问 https://sh.rustup.rs 并保存该文件。阅读该脚本以确保你对它的具体行为有所了解,然后再运行它:

$ sh ./rustup.rs

你也可以参考这个安装 Rust 的网页以获取更多信息。

安装 Rust 和 Cargo 之后,你必须 获取 source env 文件中的配置:

$ source $HOME/.cargo/env

更好的办法是,将所需目录添加到 PATH 环境变量中:

export PATH=$PATH:~/.cargo/bin

如果你更喜欢使用软件包管理器(例如 Linux 上的 DNF 或 Apt),请在发行版本的存储库中查找 Rust 和 Cargo 软件包,并进行相应的安装。 例如:

$ dnf install rust cargo

安装并设置它们后,请验证你拥有的 Rust 和 Cargo 版本:

$ rustc --version
rustc 1.41.0 (5e1a79984 2020-01-27)
$ cargo --version
cargo 1.41.0 (626f0f40e 2019-12-03)

手动构建和运行 Rust

从在屏幕上打印“Hello, world!”的简单程序开始。打开你喜欢的文本编辑器,然后键入以下程序:

$ cat hello.rs
fn main() {
    println!("Hello, world!");
}

以扩展名 .rs 保存文件,以将其标识为 Rust 源代码文件。

使用 Rust 编译器 rustc 编译程序:

$ rustc hello.rs

编译后,你将拥有一个与源程序同名的二进制文件:

$ ls -l
total 2592
-rwxr-xr-x. 1 user group 2647944 Feb 13 14:14 hello
-rw-r--r--. 1 user group      45 Feb 13 14:14 hello.rs
$

执行程序以验证其是否按预期运行:

$ ./hello
Hello, world!

这些步骤对于较小的程序或任何你想快速测试的东西就足够了。但是,在进行涉及到多人的大型程序时,Cargo 是前进的最佳之路。

使用 Cargo 创建新包

Cargo 是 Rust 的构建系统和包管理器。它可以帮助开发人员下载和管理依赖项,并帮助创建 Rust 包。在 Rust 社区中,Rust 中的“包”通常被称为“crate”(板条箱),但是在本文中,这两个词是可以互换的。请参阅 Rust 社区提供的 Cargo FAQ 来区分。

如果你需要有关 Cargo 命令行实用程序的任何帮助,请使用 --help-h 命令行参数:

$ cargo –help

要创建一个新的包,请使用关键字 new,跟上包名称。在这个例子中,使用 hello_opensource 作为新的包名称。运行该命令后,你将看到一条消息,确认 Cargo 已创建具有给定名称的二进制包:

$ cargo new hello_opensource
     Created binary (application) `hello_opensource` package

运行 tree 命令以查看目录结构,它会报告已创建了一些文件和目录。首先,它创建一个带有包名称的目录,并且在该目录内有一个存放你的源代码文件的 src 目录:

$ tree .
.
└── hello_opensource
    ├── Cargo.toml
    └── src
        └── main.rs

2 directories, 2 files

Cargo 不仅可以创建包,它也创建了一个简单的 “Hello, world” 程序。打开 main.rs 文件看看:

$ cat hello_opensource/src/main.rs
fn main() {
    println!("Hello, world!");
}

下一个要处理的文件是 Cargo.toml,这是你的包的配置文件。它包含有关包的信息,例如其名称、版本、作者信息和 Rust 版本信息。

程序通常依赖于外部库或依赖项来运行,这使你可以编写应用程序来执行不知道如何编码或不想花时间编码的任务。你所有的依赖项都将在此文件中列出。此时,你的新程序还没有任何依赖关系。打开 Cargo.toml 文件并查看其内容:

$ cat hello_opensource/Cargo.toml
[package]
name = "hello_opensource"
version = "0.1.0"
authors = ["user <[email protected]>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

使用 Cargo 构建程序

到目前为止,一切都很顺利。现在你已经有了一个包,可构建一个二进制文件(也称为可执行文件)。在此之前,进入包目录:

$ cd hello_opensource/

你可以使用 Cargo 的 build 命令来构建包。注意消息说它正在“编译”你的程序:

$ cargo build
   Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
    Finished dev [unoptimized + debuginfo] target(s) in 0.38s

运行 build 命令后,检查项目目录发生了什么:

$ tree .
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    └── debug
        ├── build
        ├── deps
        │   ├── hello_opensource-147b8a0f466515dd
        │   └── hello_opensource-147b8a0f466515dd.d
        ├── examples
        ├── hello_opensource
        ├── hello_opensource.d
        └── incremental
            └── hello_opensource-3pouh4i8ttpvz
                ├── s-fkmhjmt8tj-x962ep-1hivstog8wvf
                │   ├── 1r37g6m45p8rx66m.o
                │   ├── 2469ykny0eqo592v.o
                │   ├── 2g5i2x8ie8zed30i.o
                │   ├── 2yrvd7azhgjog6zy.o
                │   ├── 3g9rrdr4hyk76jtd.o
                │   ├── dep-graph.bin
                │   ├── query-cache.bin
                │   ├── work-products.bin
                │   └── wqif2s56aj0qtct.o
                └── s-fkmhjmt8tj-x962ep.lock

9 directories, 17 files

哇!编译过程产生了许多中间文件。另外,你的二进制文件将以与软件包相同的名称保存在 ./target/debug 目录中。

使用 Cargo 运行你的应用程序

现在你的二进制文件已经构建好了,使用 Cargo 的 run 命令运行它。如预期的那样,它将在屏幕上打印 Hello, world!

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/hello_opensource`
Hello, world!

或者,你可以直接运行二进制文件,该文件位于:

$ ls -l ./target/debug/hello_opensource
-rwxr-xr-x. 2 root root 2655552 Feb 13 14:19 ./target/debug/hello_opensource

如预期的那样,它产生相同的结果:

$ ./target/debug/hello_opensource
Hello, world!

假设你需要重建包,并丢弃早期编译过程创建的所有二进制文件和中间文件。Cargo 提供了一个方便的clean 选项来删除所有中间文件,但源代码和其他必需文件除外:

$ cargo clean
$ tree .
.
├── Cargo.lock
├── Cargo.toml
└── src
    └── main.rs

1 directory, 3 files

对程序进行一些更改,然后再次运行以查看其工作方式。例如,下面这个较小的更改将 Opensource 添加到 Hello, world! 字符串中:

$ cat src/main.rs
fn main() {
    println!("Hello, Opensource world!");
}

现在,构建该程序并再次运行它。这次,你会在屏幕上看到 Hello, Opensource world!

$ cargo build
   Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
    Finished dev [unoptimized + debuginfo] target(s) in 0.39s

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/hello_opensource`
Hello, Opensource world!

使用 Cargo 添加依赖项

Cargo 允许你添加程序需要运行的依赖项。使用 Cargo 添加依赖项非常容易。每个 Rust 包都包含一个 Cargo.toml 文件,其中包含一个依赖关系列表(默认为空)。用你喜欢的文本编辑器打开该文件,找到 [dependencies] 部分,然后添加要包含在包中的库。例如,将 rand 库添加为依赖项:

$ cat Cargo.toml
[package]
name = "hello_opensource"
version = "0.1.0"
authors = ["test user <[email protected]>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rand = "0.3.14"

试试构建你的包,看看会发生什么。

$ cargo build
    Updating crates.io index
   Compiling libc v0.2.66
   Compiling rand v0.4.6
   Compiling rand v0.3.23
   Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
    Finished dev [unoptimized + debuginfo] target(s) in 4.48s

现在,Cargo 会联系 Crates.io(这是 Rust 用于存储 crate(或包)的中央仓库),并下载和编译 rand。但是,等等 —— libc 包是怎么回事?你没有要安装 libc 啊。是的,rand 包依赖于 libc 包;因此,Cargo 也会下载并编译 libc

库的新版本会不断涌现,而 Cargo 提供了一种使用 update 命令更新其所有依赖关系的简便方法:

cargo update

你还可以选择使用 -p 标志跟上包名称来更新特定的库:

cargo update -p rand

使用单个命令进行编译和运行

到目前为止,每当对程序进行更改时,都先使用了 build 之后是 run。有一个更简单的方法:你可以直接使用 run 命令,该命令会在内部进行编译并运行该程序。要查看其工作原理,请首先清理你的软件包目录:

$ cargo clean
$ tree .
.
├── Cargo.lock
├── Cargo.toml
└── src
    └── main.rs

1 directory, 3 files

现在执行 run。输出信息表明它已进行编译,然后运行了该程序,这意味着你不需要每次都显式地运行 build

$ cargo run
   Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
    Finished dev [unoptimized + debuginfo] target(s) in 0.41s
     Running `target/debug/hello_opensource`
Hello, world!

在开发过程中检查代码

在开发程序时,你经常会经历多次迭代。你需要确保你的程序没有编码错误并且可以正常编译。你不需要负担在每次编译时生成二进制文件的开销。Cargo 为你提供了一个 check 选项,该选项可以编译代码,但跳过了生成可执行文件的最后一步。首先在包目录中运行 cargo clean

$ tree .
.
├── Cargo.lock
├── Cargo.toml
└── src
    └── main.rs

1 directory, 3 files

现在运行 check 命令,查看对目录进行了哪些更改:

$ cargo check
    Checking hello_opensource v0.1.0 (/opensource/hello_opensource)
    Finished dev [unoptimized + debuginfo] target(s) in 0.18s

该输出显示,即使在编译过程中创建了中间文件,但没有创建最终的二进制文件或可执行文件。这样可以节省一些时间,如果该包包含了数千行代码,这非常重要:

$ tree .
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    └── debug
        ├── build
        ├── deps
        │   ├── hello_opensource-842d9a06b2b6a19b.d
        │   └── libhello_opensource-842d9a06b2b6a19b.rmeta
        ├── examples
        └── incremental
            └── hello_opensource-1m3f8arxhgo1u
                ├── s-fkmhw18fjk-542o8d-18nukzzq7hpxe
                │   ├── dep-graph.bin
                │   ├── query-cache.bin
                │   └── work-products.bin
                └── s-fkmhw18fjk-542o8d.lock

9 directories, 9 files

要查看你是否真的节省了时间,请对 buildcheck 命令进行计时并进行比较。首先,计时 build 命令:

$ time cargo build
   Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
    Finished dev [unoptimized + debuginfo] target(s) in 0.40s

real    0m0.416s
user    0m0.251s
sys     0m0.199s

在运行 check 命令之前清理目录:

$ cargo clean

计时 check 命令:

$ time cargo check
    Checking hello_opensource v0.1.0 (/opensource/hello_opensource)
    Finished dev [unoptimized + debuginfo] target(s) in 0.15s

real    0m0.166s
user    0m0.086s
sys     0m0.081s

显然,check 命令要快得多。

建立外部 Rust 包

到目前为止,你所做的这些都可以应用于你从互联网上获得的任何 Rust crate。你只需要下载或克隆存储库,移至包文件夹,然后运行 build 命令,就可以了:

git clone <github-like-url>
cd <package-folder>
cargo build

使用 Cargo 构建优化的 Rust 程序

到目前为止,你已经多次运行 build,但是你注意到它的输出了吗?不用担心,再次构建它并密切注意:

$ cargo build
   Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
    Finished dev [unoptimized + debuginfo] target(s) in 0.36s

看到了每次编译后的 [unoptimized + debuginfo] 文本了吗?这意味着 Cargo 生成的二进制文件包含大量调试信息,并且未针对执行进行优化。开发人员经常经历开发的多次迭代,并且需要此调试信息进行分析。同样,性能并不是开发软件时的近期目标。因此,对于现在而言是没问题的。

但是,一旦准备好发布软件,就不再需要这些调试信息。而是需要对其进行优化以获得最佳性能。在开发的最后阶段,可以将 --release 标志与 build 一起使用。仔细看,编译后,你应该会看到 [optimized] 文本:

$ cargo build --release
   Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
    Finished release [optimized] target(s) in 0.29s

如果愿意,你可以通过这种练习来了解运行优化软件与未优化软件时节省的时间。

使用 Cargo 创建库还是二进制文件

任何软件程序都可以粗略地分类为独立二进制文件或库。一个独立二进制文件也许即使是当做外部库使用的,自身也是可以运行的。但是,作为一个库,是可以被另一个独立二进制文件所利用的。到目前为止,你在本教程中构建的所有程序都是独立二进制文件,因为这是 Cargo 的默认设置。 要创建一个,请添加 --lib 选项:

$ cargo new --lib libhello
     Created library `libhello` package

这次,Cargo 不会创建 main.rs 文件,而是创建一个 lib.rs 文件。 你的库的代码应该是这样的:

$ tree .
.
└── libhello
    ├── Cargo.toml
    └── src
        └── lib.rs

2 directories, 2 files

Cargo 就是这样的,不要奇怪,它在你的新库文件中添加了一些代码。通过移至包目录并查看文件来查找添加的内容。默认情况下,Cargo 在库文件中放置一个测试函数。

使用 Cargo 运行测试

Rust 为单元测试和集成测试提供了一流的支持,而 Cargo 允许你执行以下任何测试:

$ cd libhello/

$ cat src/lib.rs
#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}

Cargo 有一个方便的 test 命令,可以运行代码中存在的任何测试。尝试默认运行 Cargo 在库代码中放入的测试:

$ cargo test
   Compiling libhello v0.1.0 (/opensource/libhello)
    Finished test [unoptimized + debuginfo] target(s) in 0.55s
     Running target/debug/deps/libhello-d52e35bb47939653

running 1 test
test tests::it_works ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests libhello

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

深入了解 Cargo 内部

你可能有兴趣了解在运行一个 Cargo 命令时它底下发生了什么。毕竟,在许多方面,Cargo 只是个封装器。要了解它在做什么,你可以将 -v 选项与任何 Cargo 命令一起使用,以将详细信息输出到屏幕。

这是使用 -v 选项运行 buildclean 的几个例子。

build 命令中,你可以看到这些给定的命令行选项触发了底层的 rustc(Rust 编译器):

$ cargo build -v
   Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
     Running `rustc --edition=2018 --crate-name hello_opensource src/main.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=147b8a0f466515dd -C extra-filename=-147b8a0f466515dd --out-dir /opensource/hello_opensource/target/debug/deps -C incremental=/opensource/hello_opensource/target/debug/incremental -L dependency=/opensource/hello_opensource/target/debug/deps`
    Finished dev [unoptimized + debuginfo] target(s) in 0.36s

clean 命令表明它只是删除了包含中间文件和二进制文件的目录:

$ cargo clean -v
    Removing /opensource/hello_opensource/target

不要让你的技能生锈

要扩展你的技能,请尝试使用 Rust 和 Cargo 编写并运行一个稍微复杂的程序。很简单就可以做到:例如,尝试列出当前目录中的所有文件(可以用 9 行代码完成),或者尝试自己回显输入。小型的实践应用程序可帮助你熟悉语法以及编写和测试代码的过程。

本文为刚起步的 Rust 程序员提供了大量信息,以使他们可以开始入门 Cargo。但是,当你开始处理更大、更复杂的程序时,你需要对 Cargo 有更深入的了解。当你准备好迎接更多内容时,请下载并阅读 Rust 团队编写的开源的《Cargo 手册》,看看你可以创造什么!


via: https://opensource.com/article/20/3/rust-cargo

作者:Gaurav Kamathe 选题:lujun9972 译者:wxy 校对:wxy

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

GIMP 是最流行的自由开源的图像编辑器,它也许是 Linux 上最好的 Adobe Photoshop 替代品

当你在 Ubuntu 或其他任何操作系统上安装了 GIMP 后,你会发现已经安装了一些用于基本图像编辑的画笔。如果你需要更具体的画笔,你可以随时在 GIMP 中添加新画笔。

怎么样?让我在这个快速教程中向你展示。

如何在 GIMP 中添加画笔

在 GIMP 中安装新画笔需要三个步骤:

  • 获取新画笔
  • 将其放入指定的文件夹中
  • 刷新 GIMP 中的画笔

步骤 1:下载新的 GIMP 画笔

第一步是获取新的 GIMP 画笔。你从哪里获取?当然是从互联网上。

你可以在 Google 或如 Duck Duck Go 这种隐私搜索引擎来搜索 “GIMP brushes”,并从网站下载一个你喜欢的。

GIMP 画笔通常以 .gbr 和 .gih 文件格式提供。.gbr 文件用于常规画笔,而 .gih 用于动画画笔。

你知道吗?

从 2.4 版本起,GIMP 使安装和使用 Photoshop 画笔(.abr 文件)非常简单。你只需将 Photoshop 画笔文件放在正确的文件夹中。

请记住,最新的 Photoshop 画笔可能无法完美地在 GIMP 中使用。

步骤 2:将新画笔复制到它的位置

获取画笔文件后,下一步是复制该文件并将其粘贴到 GIMP 配置目录中所在的文件夹。

在微软 Windows 上,你必须进入类似 C:\Documents and Settings\myusername.gimp-2.10\brushes 这样的文件夹。

我将展示 Linux 上的详细步骤,因为我们是一个专注于 Linux 的网站。

选择画笔文件后,在家目录中按下 Ctrl+h 查看 Linux 中的隐藏文件

Press Ctrl+H to see hidden files in the home directory

你应该进入 .config/GIMP/2.10/brushes 文件夹(如果你使用的是 GIMP 2.10)。如果使用其他版本,那么应在 .config/GIMP 下看到相应文件夹。

Adding New Brushes in GIMP

将画笔文件粘贴到此文件夹中。可选地,你可以通过再次按 Ctrl+h 来隐藏隐藏的文件。

步骤 3:刷新画笔(避免重启 GIMP)

GIMP 将在启动时自动加载画笔。如果已在运行,并且不想关闭它,你可以刷新画笔。

在 GIMP 的主菜单中找到 “Windows->Dockable Dialogues->Brushes”。

Refresh GIMP Brushes by going go to Windows-&gt;Dockable Dialogues-&gt; Brushes

在右侧栏的 Brushes 对话框中找到“refresh”图标。

Refresh GIMP Brushes

如果你的画笔没有出现,那么你可以试试重启 GIMP。

额外的技巧!

GIMP 中添加新画笔还能让你轻松给图片添加水印。只需将 logo 用作画笔,并点击一下就可添加到图片中。

我希望你喜欢这个快速 GIMP 技巧。敬请期待更多。


via: https://itsfoss.com/add-brushes-gimp/

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

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

谷歌字体和开放字体库中的免费 Web 字体已经改变了游戏规则,但仅在有限的范围内。

毫无疑问,近些年来互联网的面貌已经被开源字体所改变。早在 2010 年之前,你在 Web 浏览器上几乎只能看到微软制作的通常“Web 安全”的核心字体。但这一年(2010)正好是好几轮技术革新开始的见证之年: Web 开放字体格式 Web Open Font Format (WOFF)的引入为通过 HTTP 有效地传输字体文件提供了一个开放的标准,以及像谷歌字体 开放字体库 Open Font Library 这样的 Web 字体服务的推出,使得 Web 内容发布者可以在开源许可证之下免费使用海量的字体库。

这些事件对 Web 排版的积极影响再夸大都不过分。但是要将 Web 开放字体的成功与整个开源排版等同起来,并得到结论——挑战已经远离了我们,困难悉数被解决了——却很容易。然而事实并非如此,如果你很关注字体,那么好消息是你有好多机会参与到对这些字体的改进工作当中去。

对新手来说,至关重要的是必须要意识到谷歌字体和开放字体库提供了专用的服务(为网页提供字体),而没有为其他使用情况制定字体解决方案。这不是服务方面的缺点,这只是意味着我们必须去开发其它的解决方案。

需要解决的问题还非常多。可能最明显的例子就是给 Linux 桌面计算机的其他软件安装字体所遇到的尴尬情况。你可以通过任何一种服务下载任何一种 Web 字体,但是你得到的只是一个最普通的压缩包文件,里面有一些 TTF 或 OTF 二进制文件和一个普通文本文件的许可证。接下来会发生什么完完全全需要你去猜。

大部分用户很快学会了“正确”的步骤就是手动地复制这些字体二进制文件到他们硬盘里几个特殊文件夹里的某一个里。但是这样做只能使这个文件对操作系统可见。它并不能为用户体验带来什么提升。再强调一遍,这不是 Web 字体服务的缺陷,相反它佐证了对于关于服务到哪里停止和需要在其他方面做更多工作的观点。

在用户视角来说,一个巨大的提升可能就是在“只是下载”这个阶段,操作系统或者桌面环境变得更智能。系统或桌面环境不仅会把字体文件安装到正确的位置上,更重要的是,当用户选择要在一个项目中使用的字体时,它会自己添加用户所需要的重要的元数据。

这些附加信息包含的内容与它如何呈现给用户与另一个挑战有关:与其它操作系统相比,在 Linux 环境管理一个字体库显然不那么令人满意。字体管理器总是时不时的出现一下(例如 GTK+ 字体管理器,这是最近的一个例子),但是它们很少变得流行起来。我一直在思考一大堆这些软件让人失望的方面。一个核心的原因是它们把自己局限于只展示内嵌在二进制字体文件内的信息:基本字符集的覆盖、粗细/宽度和斜率的设定,内置的许可证和版权说明等等。

但是除了这些内嵌数据中的内容,在选择字体的过程中还涉及很多决策。严肃的字体用户,像信息设计者、杂志文章作者,或者书籍美工设计者,他们的字体选择是根据每一份文件的要求和需求做出的。这当然包含了许可证信息,但它还包含了更多,像关于设计师和厂商的信息、潮流风格的趋势,或者字体在使用中的细节。

举个例子,如果你的文档包含了英语和阿拉伯文,你多半想要拉丁文和阿拉伯文的字体由同时熟悉这两种 字母系统 script 的设计师所设计。否则,你将浪费一大堆时间来微调字体大小和行间距来使两种字母系统良好地结合在一起。你可能从经验中学到,某些设计师或字体厂商比其他人更善于多种字母系统设计。或许和你职业相关的是今天的时尚杂志几乎无一例外的采用 “Didone)”风格的字体,“Didone)”是指一种两百多年前最先被 Firmin DidotGiambattista Bodoni 设计出来的超高反差的字体风格。这种字体恰好就是现在的潮流。

但是像 Didone、Didot 或 Bodoni 这些术语都不可能会出现在二进制文件的内置数据当中,你也不容易判断拉丁文和阿拉伯文是否相得益彰或其它关于字体的历史背景。这些信息有可能出现在补充的材料中,类似某种字形样本或字体文件中,如果这些东西存在的话。

字形样本 specimen 是一份设计好的文档(一般是 PDF),它展示了这种字体的使用情况,而且包括了背景信息。字形样本经常在挑选字体时充当市场营销和外观样例的双重角色。一份精心设计的样本展示了字体在实际应用中的情况和在自动生成的字符表中所不能体现的风格。字形样本文件也有可能包含了一些其他重要信息,比如怎样激活字体的 OpenType 特性、提供的数学表达式或古体字,或者它在支持的多种语言上的风格变化。在字体管理应用程序中向用户提供此类材料,对于帮助用户找到适合其项目需求的字体将大有帮助。

当然,如果我们希望一个字体管理软件能够处理文件和样本问题,我们也必须仔细观察一下各种发行版提供的字体包所随附的内容。Linux 的用户刚开始只有自动安装的那几种字体,并且发行版存储库提供的包是大部分用户除了下载通用的压缩包档案之外的唯一字体来源。这些包往往非常的“简陋”。商业字体总的来说都包含了样本、文档,还有其他的支持项目,然而开源字体往往没有这些配套文件。

也有一些优秀的开放字体提供了高质量的样本和文档(例如 SIL GentiumBungee 是两种差异明显但是都有效的方案),但是它们几乎不涉足下游的打包工作链。我们显然可以做的更好一些。

要在系统的字体交互方面提供更丰富的用户体验上面还存在一些技术问题。一方面,AppStream 的元数据标准定义了一些字体文件特有的参数,但是到现在为止,这些参数没有包含样本、设计师/厂商和其他相关细节的任何信息。另外一个例子,SPDX 软件包数据交换 Software Package Data Exchange )格式也没有包含太多用于分发字体的软件许可证(及许可证变体)。

最后,就像任何一个唱片爱好者都会告诉你的,一个不允许你编辑和完善你的 MP3 曲库中的 ID3 信息的音乐播放器很快就会变得令人失望(LCTT 译注:ID3 信息是 MP3 文件头部的元信息,用于存储歌曲信息)。你想要处理标签里的错误、想要添加注释和专辑封面之类的信息,本质上,这就是完善你的音乐库。同样,你可能也想要让你的本地字体库也保持在一个方便使用的状态。

但是改动字体文件的内置数据一直有所忌讳,因为字体往往是被内置或附加到其他文件里的。如果你随意改变了字体二进制文件中的字段,然后将其与你的演示文稿一起重新分发,那么下载这些演示文稿的任何人最终都会得到错误的元数据,但这个错误不是他们自己造成的。所以任何一个要改善字体管理体验的人都要想明白如何从策略上解决对内置或外置的字体元数据的重复修改。

除了技术角度之外,丰富的字体管理经验也是一项设计挑战。就像我在前面说的一样,有几种开放字体也带了良好的样本和精心编写的文档。但是更多的字体包这两者都没有,还有大量的更老的字体包已经没有人维护了。这很可能意味着大部分开放字体包想要获得样本和证明文件的唯一办法就是让社区去创建它们。

也许这是一个很高的要求。但是开源设计社区现在比以往任何时候都要庞大,它是整个自由开源软件运动中的一个高度活跃的组成部分。所以谁知道呢,也许明年这个时候会发现,在 Linux 桌面系统查找、下载和使用字体会变成一种完全不同的体验。

在这一连串关于现代 Linux 用户的文字设计上的挑战的思考中包含了打包、文档设计,甚至有可能需要在桌面环境加入不少新的软件部分。此外还有其他一系列的东西也需要考虑。其共通性就是在 Web 字体服务不可及的地方,事情就会变得更加困难。

从我的视角来看,最好的消息是现在比起以前有更多的人对这个话题感兴趣。我认为我们要感谢像谷歌字体和开放字体库这样的 Web 字体服务巨头让开放字体得到了更高的关注。


via: https://opensource.com/article/18/3/webfonts

作者:Nathan Willis 译者:Fisherman110 校对:wxy

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

多年来(或数十年),人们抱怨不使用Linux 的原因之一是它缺乏主流游戏。Linux 上的游戏在最近几年有了显著改进,特别是 Steam Proton 项目的引入使你可以在 Linux 上玩很多 Windows 专用的游戏

这也鼓励了一些以游戏为中心的 Linux发行版。以 Lakka 为例,你可以借助 Lakka Linux 将旧计算机变成复古的街机游戏机

另一个以游戏为中心的 Linux 发行版是 Draguer OS,我们今天将对其进行研究。

Drauger OS

根据该项目的网站,“Drauger OS 是 Linux 桌面游戏操作系统。它旨在为游戏玩家提供一个平台,使他们可以在不牺牲安全性的情况下获得出色的性能。此外,它旨在使任何人都可以轻松玩游戏,无论他们使用键盘和鼠标还是某种控制器。”

他们强调 Drauger OS 并非供日常使用。因此,大多数其他发行版附带的许多生产力工具都不在 Drauger OS 中。

Drauger OS 7.4.1

Drauger OS 基于 Ubuntu 之上。当前版本(7.4.1 Jiangshi)使用 “Liquorix 低延迟Linux 内核,这是一种预编译的 ZEN 内核,设计时考虑了延迟和吞吐量之间的平衡”。但是,这将在下一版本中更改。他们只有一个桌面环境可供选择,即一个修改版本的 Xfce

Drauger OS 开箱即用地安装了多个应用程序和工具,以改善游戏体验。这些包括:

它还具有一组与游戏无关的有趣工具。Drauger 安装器是 .deb 安装程序,是 Gdebi 的替代品。多软件库应用安装器(mrai)是“用于基于 Debian 的 Linux 操作系统的类似于 AUR-helper 的脚本”。Mrai 旨在与 apt、snap、flatpaks 配合使用,并且可以从 GitHub 安装应用程序。

有趣的是,Drauger OS 的名称是一个错误。开发负责人 Thomas Castleman(即 batcastle)曾打算为其发行版命名为 Draugr,但是却打错了名字。在 Drauger OS 播客的第 23 集中,Castleman 说会保留这个拼写错误的名称,因为要对其进行更正需要大量工作。根据 Wikipedia 的描述,Draugr 是“来自北欧神话中的不死生物”。

是的,你没看错。Drauger OS 是仅有的几个具有自己的播客的发行版之一。当被问到这个问题时,Castleman 告诉我:“无论他们的情况如何,我都希望确保我们的社区拥有最大的透明度。”多数情况下,播客是 Drauger OS 博客的音频版本,但有时他们会在没有时间撰写博客文章时使用它来发布公告。

Drauger OS 的未来

Drauger OS

Druager OS 背后的开发人员正在开发其下一个主要版本:7.5.1。此版本将基于 Ubuntu 19.10。将有三个主要变化。首先,将使用“我们内部构建的内核” 替换 Liquorix 内核。该内核将基于 Linux 内核 GitHub 存储库,“因此,它会变得越来越原汁原味”。

新版本的第二个主要变化将是为其桌面提供新布局。根据用户的反馈,他们决定将其更改为看起来更类似于 GNOME 的样子。

第三,他们放弃了 SystemBack 作为其备份工具和安装程序。相反,他们从头开始编写了新的安装程序

开发团队也正在研究 Drauger OS 的 ARM 版本。他们希望在 2022 年的某个时候发布它。

系统要求

Drauger OS 系统要求非常适中。请记住,Drauger OS 仅在 64 位系统上运行。

最低系统要求

  • CPU:双核、1.8GHz、64 位处理器
  • RAM:1 GB
  • 储存空间:16 GB
  • 图形处理器:集成
  • 屏幕分辨率:60Hz 时为 1024×768
  • 外部端口:1 个用于显示的端口(HDMI/DisplayPort/VGA/DVI),2 个用于安装 USB 驱动器和键盘的 USB 端口(鼠标可选,但建议使用)

推荐系统要求

  • CPU:四核、2.2Ghz、64 位处理器
  • RAM:4 GB
  • 储存空间:128 GB
  • 图形处理器:NVIDIA GTX 1050、AMD RX 460 或同等显卡
  • 屏幕分辨率:60Hz 时为 1080p
  • 外部端口:1 个用于显示的端口(HDMI/DisplayPort/VGA/DVI),3 个用于安装 USB 驱动器、键盘和鼠标的 USB 端口,1 个音频输出端口

如何为Drauger OS提供帮助

如果你有兴趣,可以通过多种方法来帮助 Drauger OS。他们一直在寻找财政支持以保持发展。

如果你想贡献代码,他们正在寻找具有 BASH、C++ 和 Python 经验的人员。他们所有的代码都在 GitHub 上。你也可以在社交媒体上联系他们。

结语

Drauger OS 只是这类项目之一。我还见过其他面向游戏的发行版,但 Drauger OS 在专注于游戏方面一心一意。由于我更喜欢休闲游戏,因此该发行版对我个人而言并不具有吸引力。但是,我可以看到它如何吸引游戏爱好者使用 Linux。祝他们在以后的发行中好运。

你对这个仅限于游戏的发行版有何想法?你最喜欢的 Linux 游戏解决方案是什么?请在下面的评论中告诉我们。


via: https://itsfoss.com/drauger-os/

作者:John Paul 选题:lujun9972 译者:wxy 校对:wxy

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

即使你的操作系统是闭源的,你仍然可以使用这个流行的开源文本编辑器。

GNU Emacs 是一个专为各种程序员设计的流行的文本编辑器。因为它是在 Unix 上开发的,并在 Linux(macOS 中也有)上得到了广泛使用,所以人们有时没有意识到它也可用于微软 Windows 上。你也无需成为有经验的或专职的程序员即可使用 Emacs。只需单击几下就可以下载并安装 Emacs,本文向你展示了如何进行。

你可以手动安装 Windows,也可以使用包管理器安装,例如 Chocolatey

7-zip

如果还没在 Windows 中安装 7-zip,那么就先安装它。7-zip 是一个开源的归档程序,能够创建和解压 ZIP、7z、TAR、XZ、BZIP2 和 GZIP(以及更多)文件。对于 Windows 用户来说,这是一个宝贵的工具。

安装 7-zip 后,在 Windows 资源管理器中浏览文件时,右键单击菜单中就有新的 7-zip 归档选项。

Powershell 和 Chocolatey

要在 Windows 上使用 Chocolatey 安装 GNU Emacs :

PS> choco install emacs-full

安装后,在 Powershell 中启动 Emacs:

PS> emacs

 title=

下载适用于 Windows 的 GNU Emacs

要在 Windows 上手动安装 GNU Emacs,你必须下载 Emacs

 title=

它会打开连接到离你最近的服务器,并展示所有可用的 Emacs 版本。找到发行版本号最高的目录,然后单击进入。Windows 有许多不同的 Emacs 构建,但是最通用的版本只是被命名为 emacs-VERSION-ARCHITECTURE.zipVERSION 取决于你要下载的版本,而 ARCHITECTURE 取决于你使用的是 32 位还是 64 位计算机。大多数现代计算机都是 64 位的,但是如果你有疑问,可以下载 32 位版本,它可在两者上运行。

如果要下载 64 位计算机的 Emacs v26,你应该点击 emacs-26.2-x86_64.zip 的链接。有较小的下载包(例如 “no-deps” 等),但是你必须熟悉如何从源码构建 Emacs,知道它需要哪些库以及你的计算机上已经拥有哪些库。通常,获取较大版本的 Emacs 最容易,因为它包含了在计算机上运行所需的一切。

解压 Emacs

接下来,解压下载的 ZIP 文件。要解压缩,请右键单击 Emacs ZIP 文件,然后从 7-zip 子菜单中选择 “Extract to Emacs-VERSION”。这是一个很大的压缩包,因此解压可能需要一段时间,但是完成后,你将拥有一个新目录,其中包含与 Emacs 一起分发的所有文件。例如,在此例中,下载了 emacs-26.2-x86_64.zip,因此解压后的目录为 emacs-26.2-x86_64

启动 Emacs

在 Emacs 目录中,找到 bin 目录。此文件夹存储随 Emacs 一起分发的所有二进制可执行文件(EXE 文件)。双击 emacs.exe 文件启动应用。

 title=

你可以在桌面上创建 emacs.exe 的快捷方式,以便于访问。

学习 Emacs

Emacs 并不像传闻那样难用。它具有自己的传统和惯例,但是当你其中输入文本时,你可以像在记事本或者网站的文本框中那样使用它。

重要的区别是在你编辑输入的文本时。

但是,学习的唯一方法是开始使用它,因此,使 Emacs 成为完成简单任务的首选文本编辑器。当你通常打开记事本、Word 或 Evernote 或其他工具来做快速笔记或临时记录时,请启动 Emacs。

Emacs 以基于终端的应用而闻名,但它显然有 GUI,因此请像使用其他程序一样经常使用它的 GUI。从菜单而不是使用键盘复制、剪切和粘贴(paste)(或用 Emacs 的术语 “yank”),然后从菜单或工具栏打开和保存文件。从头开始,并根据应用本身来学习它,而不是根据你以往对其他编辑器的经验就认为它应该是怎样。

感谢 Matthias Pfuetzner 和 Stephen Smoogen。


via: https://opensource.com/article/20/3/emacs-windows

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

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

快速了解一个方便的日志库,来帮助你掌握这个重要的编程概念。

logzero 库使日志记录就像打印语句一样容易,是简单性的杰出代表。我不确定 logzero 的名称是否要与 pygame-zero、GPIO Zero 和 guizero 这样的 “zero 样板库”契合,但是肯定属于该类别。它是一个 Python 库,可以使日志记录变得简单明了。

你可以使用它基本的记录到标准输出的日志记录,就像你可以使用 print 来获得信息和调试一样,学习它的更高级日志记录(例如记录到文件)的学习曲线也很平滑。

首先,使用 pip 安装 logzero:

$ sudo pip3 install logzero

在 Python 文件中,导入 logger 并尝试以下一个或所有日志实例:

from logzero import logger

logger.debug("hello")
logger.info("info")
logger.warning("warning")
logger.error("error")

输出以易于阅读的方式自动着色:

 title=

因此现在不要再使用 print 来了解发生了什么,而应使用有相关日志级别的日志器。

在 Python 中将日志写入文件

如果你阅读至此,并会在你写代码时做一点改变,这对我就足够了。如果你要了解更多,请继续阅读!

写到标准输出对于测试新程序不错,但是仅当你登录到运行脚本的计算机时才有用。在很多时候,你需要远程执行代码并在事后查看错误。这种情况下,记录到文件很有帮助。让我们尝试一下:

from logzero import logger, logfile

logfile('/home/pi/test.log')

现在,你的日志条目将记录到文件 test.log 中。记住确保脚本有权限写入该文件及其目录结构。

你也可以指定更多选项:

logfile('/home/pi/test.log', maxBytes=1e6, backupCount=3)

现在,当提供给 test.log 文件的数据达到 1MB(10 6 字节)时,它将通过 test.log.1test.log.2 等文件轮替写入。这种行为可以避免系统打开和关闭大量 I/O 密集的日志文件,以至于系统无法打开和关闭。更专业一点,你或许还要记录到 /var/log。假设你使用的是 Linux,那么创建一个目录并将用户设为所有者,以便可以写入该目录:

$ sudo mkdir /var/log/test
$ sudo chown pi /var/log/test

然后在你的 Python 代码中,更改 logfile 路径:

logfile('/var/log/test/test.log', maxBytes=1e6, backupCount=3)

当要在 logfile 中捕获异常时,可以使用 logging.exception

try:
    c = a / b
except Exception as e:
    logger.exception(e)

这将输出(在 b 为零的情况下):

[E 190422 23:41:59 test:9] division by zero
     Traceback (most recent call last):
       File "test.py", line 7, in
         c = a / b
     ZeroDivisionError: division by zero

你会得到日志,还有完整回溯。另外,你可以使用 logging.error 并隐藏回溯:

try:
    c = a / b
except Exception as e:
    logger.error(f"{e.__class__.__name__}: {e}")

现在,将产生更简洁的结果:

[E 190423 00:04:16 test:9] ZeroDivisionError: division by zero

 title=

你可以在 logzero.readthedocs.io 中阅读更多选项。

logzero 为教育而生

对于新手程序员来说,日志记录可能是一个具有挑战性的概念。大多数框架依赖于流控制和大量变量操作来生成有意义的日志,但是 logzero 不同。由于它的语法类似于 print 语句,因此它在教育上很成功,因为它无需解释其他概念。在你的下个项目中试试它。

此文章最初发布在我的博客上,经许可重新发布。


via: https://opensource.com/article/20/2/logzero-python

作者:Ben Nuttall 选题:lujun9972 译者:geekpi 校对:wxy

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