2023年5月

为你的终端安装最好的字体,以改善外观和可读性,并让你的终端体验变得有趣。

选择完美的字体对很多事情都至关重要,无论你是程序员、系统管理员,还是喜欢终端的 Linux 用户。

更改终端字体 可帮助你实现以下目标:

  • 美观的终端外观
  • 增强可读性
  • 减少眼睛疲劳

听起来不错。但是如何选择完美的字体呢?这里有成百上千种选择。

对于初学者,你可以选择 针对技术文档或编码优化的字体,因为它们具有良好的可读性。接下来,你可以筛选出 FOSS 项目(如果这对你很重要)并检查这些 字体是否可以在高分辨率显示器上很好地缩放(根据你的需求)。

不要担心,为了让你有一个良好的开端,我们选择了一些最适合编码的字体,提供良好的可读性,同时看起来也不错。

1、Cascadia

Cascadia font

Cascadia 是微软提供的一种字体,默认用于 最好的开源编辑器 之一 VSCode。

它包括编码连字支持,并提供三种变体:标准、等宽和支持嵌入式 PowerLine 符号的版本。

2、Fira Code

Fira Code font

Fira Code 是一种等宽字体,具有编码连字和 ASCII 支持。

它会定期进行微调以支持字母对和更好的标点符号输出。

3、Hack

Hack font in terminal

Hack 是另一种为源代码量身定制的等宽字体。

你可以获得 ASCII、PowerLine 支持以及粗体、斜体和粗斜体等常用样式

如果你注意到它的 GitHub 页面,它们为某些 Linux 发行版提供了改进字体渲染的说明。

4、Inconsolata

Insconsolata font

Inconsolata 是一种清晰的等宽字体,具有出色的可读性。它是谷歌字体系列之一。

对于 终端仿真器 和编码用途,该字体提供了几种有用的样式。

5、Iosevka

Iosevka font

Iosevka 是一种外观简洁的多功能开源字体,用于编写代码并在终端和技术文档中使用。

你可以从它的 GitHub 页面获取其他平台(包括 Linux)的安装说明。

6、JetBrains Mono

JetBrains mono

JetBrains Mono 是专为开发人员量身定制的自由开源字体。

顾名思义,它是流行的开发者工具 JetBrains 使用的默认字体。

7、Meslo NF

Meslo NF font

Meslo NF 是一种可以在终端中很好地支持 ASCII 和图标的字体。

作为 GitHub 上 Nerd Fonts 集的一部分,它提供了用于编码和终端的漂亮字体。你可以在它的 GitHub 发布页 的资源列表中找到该字体。

它在 Zsh、Fish 和其他 Shell 中看起来很棒。

8、Monoid

Monoid

Monoid 是另一种旨在用于编码的开源字体。有通常的连字支持和深色浅色变体,它应该是终端的不错选择。

9、Ubuntu Monospace

Ubuntu Monospace

我们都喜欢 Ubuntu 的默认字体 Ubuntu Monospace。它针对多种语言、高分辨率屏幕和良好的可读性进行了优化。

如果你已经使用 Ubuntu,则无需单独安装它。

10、SourceCode Pro

SourceCode Pro

Source Code Pro 很好地融合了一切需求。虽然它针对编码环境进行了优化,并由 Adobe 开发,但它也为终端提供了具体良好可读性和美观性。

如何安装这些字体?

你可以通过下载 TTF 或 OTF 文件轻松安装字体,然后双击它们以使用字体查看器打开它进行安装。

Double click on the ttf file to install it

要同时安装多种字体,你可以在主目录中新建一个 .fonts 文件夹,并将字体文件放在那里。你可以查看我们关于 安装新字体 的指南,了解更多详细信息。

更多自定义终端的方法

这里有一些自定义终端外观的 方法

还有一个有趣的 工具,可以根据你的桌面墙纸自动更改终端的配色方案。多么酷啊!

? 名单上你最喜欢的是什么?你使用什么终端字体?

(题图:MJ/e5ae0ee3-9ea2-4136-a000-8fe681480356)


via: https://itsfoss.com/fonts-linux-terminal/

作者:Ankush Das 选题:lkxed 译者:geekpi 校对:wxy

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

微软正在研究使 Linux 脚本更安全

在本周的 Linux 安全峰会上,systemd 的创建者 Lennart Poettering 发表了演讲,他在过去的一年中被微软雇佣,他和微软的其它工程师们正在努力提高 Linux 的安全性。微软的工程师发表的演讲介绍了他们如何在 Linux 系统上控制脚本执行的新方法。从新的 open() 标志到新的内核系统调用,他们正在努力让 Linux 系统管理员对未来在 Linux 系统上执行的脚本有更大的控制。

消息来源:Phoronix
老王点评:这有点讽刺,但事实就是这样。

观点:只有云计算供应商才能做好安全工作

有专家认为,“旧的论点认为,云计算的利润率最终会使企业内部的 IT 基础设施看起来是更便宜的选择,但却没有预见到一个时代,即安全变得如此困难,只有云计算供应商才能把它做好。”在安全问题上,云计算供应商有一个关键的优势:他们控制、编写和构建了大部分的软件和硬件堆栈。云计算供应商在网络安全方面拥有令人羡慕的记录,这要归功于谷歌之类的云计算供应商的持续补丁等严格的安全实践。

消息来源:eSecurity Planet
老王点评:虽然云计算供应商也动不动就出些大事故,但一般而言,云计算供应商的安全实践能力要超过普通的 IT 公司。

裁员时拥有开源和 Linux 技能比较安全

Linux 基金会的调查显示,虽然科技行业进行了几轮裁员,但“开源是与这些趋势反周期的”。事实上,更多的组织计划增加他们的技术人员水平而不是减少。对技术人才的需求仍然强劲,特别是在快速发展的领域,它们都严重依赖开源和 Linux 技术。Linux 基金会发现高级技术职位的裁员幅度最大,新的招聘主要集中在开发人员和 IT 经理。此外,Linux 基金会的研究显示,提高技能(91%)和认证(77%)比大学教育(58%)更重要。

消息来源:ZDNet
老王点评:也就是说,懂技术还是比较有保障一些。

Alpine Linux 3.18 发布,其内核版本升级至 6.1,同时更新了 GNOME 44。

Alpine Linux 是一款注重轻量化和安全性的发行版,最新版本 Alpine Linux 3.18.0 的发布标志着正式推出 v3.18 稳定版系列。该版本包含了许多令人兴奋的更新和改进,为用户带来了许多新功能、功能增强以及流行软件组件的最新版本。

此次 Alpine Linux 3.18 的一个重要亮点是引入了 Linux 内核 6.1,该版本自带初步的 Rust 支持和最新的 GPU 和 CPU 更新。此外,Alpine Linux 3.18.0 还通过验证模块的真实性和完整性来增强系统安全性。但需要注意的是,默认情况下模块验证并未强制执行,因此支持具有 AKMS 的第三方模块无缝运行。

Alpine Linux 3.18

除了升级的内核,Alpine Linux 3.18 还配备了 musl libc 1.2.4,在 DNS 解析器中包含了 TCP 回退功能。此功能增强了网络通信的鲁棒性,并确保在有挑战性的网络环境中实现可靠的 DNS 解析。

开发人员将会很高兴地发现,此版本还更新了流行编程语言的版本。包括 Python 3.11、Ruby 3.2、和 Node.js (current) 20.1,提供了强大的工具包,用于创建各种应用,这些语言版本的更新带来了各种性能改进、错误修复以及新功能,丰富了开发体验。

图形桌面环境 GNOME 在 Alpine Linux 3.18 中也得到了显著升级,升级到了 GNOME 44。此版本的 GNOME 引入了本地后台应用、“文件”应用中一直被期待的图像预览功能,以及其他一些更新,你可以在我详细的 功能概览页面 中了解。

Alpine Linux 3.18 中其他值得一提的更新还包括添加了 Go 1.20、KDE Plasma 5.27 和 Rust 1.69。这些的更新确保开发人员可访问最新的工具和框架,以创建前沿的应用。

Alpine Linux 3.18 还通过 tiny-cloud 引入了实验性的无人值守安装支持。该功能允许自动化且精简的部署,使系统管理员能够更轻松地在多台机器上设置和配置 Alpine Linux。tiny-cloud 功能为云和虚拟化环境中的高效和可扩展的部署打开了新的可能性。

此外,Alpine Linux 3.18 在软件包大小方面做出了显著优化。所有 ppc64le、x86 和x86\_64 的软件包都与 DT\_RELR 链接,从而减小了已编译二进制文件的大小。此优化有助于节省存储空间,并有助于更快的软件包安装和低资源消耗。

为了进一步优化安装过程,Alpine Linux 3.18 现在提供了单独的 Python 预编译文件(pyc)软件包。这意味着用户可以选择仅安装必要的组件,通过排除 pyc 文件节省宝贵的磁盘空间。

你可以从下面的页面下载 Alpine Linux 3.18:

下载 Alpine Linux 3.18

来源:变更日志

(题图:MJ/228bb6eb-6247-439a-b41c-9a44dff8ad55)


via: https://debugpointnews.com/alpine-linux-3-18/

作者:arindam 选题:lkxed 译者:ChatGPT 校对:wxy

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

上一篇 关于 Rust 编程语言的文章中,我们提到了变量、常量和 遮蔽 shadowing

现在来讲解数据类型是再自然不过的了。

数据类型是什么?

将这个词汇展开些单词的顺序改变一下你就会得到答案了;“数据类型” -> “数据的类型”。

计算机使用 01 来存储数据,但是为了让数据在读取时有意义,我们使用数据类型来表示这些 01 的含义。

Rust 有两种数据类型:

  • 标量数据类型:只能存储单个值的类型。
  • 复合数据类型:可以存储多个值,甚至是不同类型的值。

在本文中,我将讲解标量数据类型。我将在下一篇文章中讲解第二类数据类型。

接下来是 Rust 中四种主要标量数据类型的简要概述:

  • 整型:存储整数。有每种特定情况下使用的子类型。
  • 浮点数:存储带有小数部分的数字。有两种基于大小的子类型。
  • 字符:使用 UTF-8 编码存储单个字符。(是的,你可以在字符中存储表情符号*。)
  • 布尔值: 存储 truefalse。(给那些无法就 0true 还是 0false 达成一致的开发者。)

整型

在编程语言中,整型指的是一个整数。Rust 中的整型要么是有符号的,要么是无符号的。无符号整型只能存储 0 和正数,而有符号整型可以存储负数、0 和正数。

? 一个有符号整型的范围从 -(2<sup> n-1</sup>) 开始,以 (2<sup> n-1</sup>)-1 结束。同样,无符号整型的范围从 0 开始,以 (2<sup> n</sup>)-1 结束。

这是根据符号和长度可用的整型:

Rust 中的整型数据类型

正如你所见,Rust 有 8、16、32、64 甚至 128 位的有符号和无符号整型!

使用 *size 的整型根据计算机的架构而变化。在 8 位微控制器上,它是 *8,在 32 位的旧计算机上,它是 *32,在现代 64 位系统上,它是 *64

使用 *size 是为了存储与内存(这与裸机相关)有关的数据,比如指针、偏移量等。

? 当你没有显式地指定整型的子类型时,Rust 编译器会默认推断为 i32。显然,如果值比 i32 能存储的值大或小,Rust 编译器会礼貌地报错并要求你手动指定类型。

Rust 不仅允许你以十进制形式存储整数,还允许你以二进制、八进制和十六进制形式存储整数。

为了更好的可读性,你可以使用下划线 _ 来代替逗号来书写/读取大数。

fn main() {
    let bin_value = 0b100_0101; // 使用前缀“0b”表示二进制
    let oct_value = 0o105; // 使用前缀“0o”表示八进制
    let hex_value = 0x45; // 使用前缀“0x”表示十六进制
    let dec_value = 1_00_00_000; // 和写一克若(1,00,00,000)一样

    println!("二进制值: {bin_value}");
    println!("八进制值: {oct_value}");
    println!("十六进制值: {hex_value}");
    println!("十进制值: {dec_value}");
}

我使用二进制、八进制和十六进制分别将十进制数 69 存储在变量 bin_valueoct_valuehex_value 中。在变量 dec_value 中,我存储了数字 1 克若 1 Crore (一千万),并且使用了下划线替代逗号,这是印度的书写系统。对于那些更熟悉国际计数系统的人来说,你可以将其写成 10_000_000

在编译并运行这个二进制文件后,我得到了如下输出:

二进制值: 69
八进制值: 69
十六进制值: 69
十进制值: 10000000

浮点数

浮点数是一种存储带有小数部分的数字的数据类型。

与 Rust 中的整型不同,浮点数只有两种子类型:

  • f32: 单精度浮点数类型
  • f64: 双精度浮点数类型

和 Rust 中的整型一样,当 Rust 推断一个变量的类型时,如果它看起来像一个浮点数,那么它就会被赋予 f64 类型。这是因为 f64 类型比 f32 类型有更高的精度,并且在大多数计算操作中几乎和 f32 类型一样快。请注意,浮点数据类型(f32f64)都是有符号

? Rust 编程语言按照 IEEE 754 二进制浮点数表示与算术标准存储浮点数。
fn main() {
    let pi: f32 = 3.1400; // f32
    let golden_ratio = 1.610000; // f64
    let five = 5.00; // 小数点表示它必须被推断为浮点数
    let six: f64 = 6.; // 尽管类型说明被显式的添加了,小数点也是**必须**的

    println!("pi: {pi}");
    println!("黄金比例: {golden_ratio}");
    println!("五: {five}");
    println!("六: {six}");
}

仔细看第 5 行。尽管我已经为变量 six 指定了类型,但我必须至少加上一个小数点。小数点之后有什么就由你决定了。

程序的输出是相当可预测的... 吗?

pi: 3.14
黄金比例: 1.61
五: 5
六: 6

在上面的输出中,你可能已经注意到,当显示变量 pigolden_ratiofive 中存储的值时,我在变量声明时在结尾增加的零已经消失了。

就算这些零没有被 移除,它们也会在通过 println 宏输出值时被省略。所以,不,Rust 没有篡改你的变量值。

字符

你可以在一个变量中存储一个字符,类型是 char。像 80 年代的传统编程语言一样,你可以存储一个 ASCII 字符。但是 Rust 还扩展了字符类型,以存储一个有效的 UTF-8 字符。这意味着你可以在一个字符中存储一个表情符号 ?

? 一些表情符号实际上是两个已有表情符号的组合。一个很好的例子是“燃烧的心”表情符号:❤️‍?。这个表情符号是通过使用 零宽度连接器 来组合两个表情符号构成的:❤️ + ? = ❤️‍?

Rust 的字符类型无法存储这样的表情符号。

fn main() {
    let a = 'a';
    let p: char = 'p'; // 带有显性类型说明
    let crab = '?';

    println!("Oh look, {} {}! :{}", a, crab, p);
}

正如你所见,我已经将 ASCII 字符 'a' 和 'p' 存储在变量 ap 中。我还在变量 crab 中存储了一个有效的 UTF-8 字符,即螃蟹表情符号。然后我打印了存储在每个变量中的字符。

这是输出:

Oh look, a ?! :p

布尔值

在 Rust 中,布尔值类型只存储两个可能的值之一:truefalse。如果你想显性指定类型,请使用 bool

fn main() {
    let val_t: bool = true;
    let val_f = false;

    println!("val_t: {val_t}");
    println!("val_f: {val_f}");
}

编译并执行上述代码后,结果如下:

val_t: true
val_f: false

额外内容:显性类型转换

在上一篇讲述 Rust 编程语言中的变量的文章中,我展示了一个非常基础的 温度转换程序。在那里,我提到 Rust 不允许隐式类型转换。

但这不代表 Rust 也不允许 显性 类型转换 ; )

要进行显性类型转换,使用 as 关键字,后面跟着要转换的数据类型。

这是一个示例程序:

fn main() {
    let a = 3 as f64; // f64
    let b = 3.14159265359 as i32; // i32

    println!("a: {a}");
    println!("b: {b}");
}

在第二行,我没有使用 3.0,而是在 3 后面写上 as f64,以表示我希望编译器将 3(一个整数)转换为 64 位浮点数的类型转换。第三行也是一样。但是这里,类型转换是有损的。这意味着小数部分 完全消失。它不是存储为 3.14159265359,而是存储为简单的 3

程序的输出可以验证这一点:

a: 3
b: 3

总结

本文介绍了 Rust 中的原始/标量数据类型。主要有四种这样的数据类型:整型、浮点数、字符和布尔值。

整型用于存储整数,它们有几种子类型,基于它们是有符号还是无符号以及长度。浮点数用于存储带有小数的数字,根据长度有两种子类型。字符数据类型用于存储单个有效的 UTF-8 编码字符。最后,布尔值用于存储 truefalse 值。

在下一章中,我将讨论数组和元组等复合数据类型。敬请关注。

(题图:MJ/c0c49e15-cc9d-4eef-8e52-2f0d62294965)


via: https://itsfoss.com/rust-data-types/

作者:Pratham Patel 选题:lkxed 译者:Cubik65536 校对:wxy

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

修复一个零日漏洞要多久,有时候需要一年

之前我们 报道 过,安全研究人员发现了第一个可以绕过安全启动保护的真实世界的恶意软件,它被称之为 BlackLotus,允许在你的电脑开始加载 Windows 及其许多安全保护之前执行恶意代码。微软本周发布了一个补丁,以修复该漏洞。但是这个补丁安装后至少几个月内会被默认禁用。部分原因是它最终会使当前的 Windows 启动介质无法启动,该修复需要对 Windows 启动管理器进行修改,一旦启用就无法逆转。此外,一旦启用修复程序,你的电脑将不再能够从不包括修复程序的旧的可启动介质上启动。由于不想让任何用户的系统突然无法启动,微软准备用一年的时间来分几个阶段来完成修复。

消息来源:Ars Technica
老王点评:这或许是最复杂的修复方案了,我想微软在想出解决这个漏洞的解决方案时都已经麻了。

数百万安卓设备出厂预装了恶意固件

趋势科技的研究人员在亚洲黑帽会议上警告说,全球数以百万计的安卓设备在出厂前就已经预先感染了恶意固件,他们证实至少涉及到 10 家供应商。这些硬件主要是廉价的安卓移动设备,尽管智能手表、电视和其他东西也被卷入其中。由于固件分销商之间的竞争变得如此激烈,以至于最终供应商无法为其产品收费。但当然没有免费的东西,固件开始带有一些恶意插件。这些恶意软件会将设备变成代理,用来窃取和出售短信,接管社交媒体和在线消息账户,并通过广告和点击欺诈作为赚钱的机会。

消息来源:The Register
老王点评:在这里,并不能用“免费或便宜的东西要付出其它的代价”的理由来开脱,因为这是在用户并不知情的情况下进行的违法行为。

微软希望 Firefox 将必应作为其默认搜索引擎

Firefox 与谷歌的合同将于今年到期,届时 Mozilla 可以续约或转用其他搜索引擎。微软非常希望能在 Firefox 中取代谷歌的位置。虽然这并不能保证它真的有助于提高必应的使用率。毕竟,不想使用必应的 Firefox 用户可以直接转到其他搜索引擎,雅虎几年前就发现了这一点,但微软认为这种交易有潜力。此外,苹果的 Safari 浏览器是苹果设备上的主要网络浏览器,它与谷歌的合同将于明年到期。或许微软也该考虑一下。

消息来源:Android Police
老王点评:不过我觉得微软与其花钱在浏览器的默认搜索引擎上,不如花钱让必应的人工智能更好一些。

你已经学会了创建文件和目录。现在是时候学习如何在命令行中删除文件和文件夹了。

在终端基础系列的前几章中,你学习了 创建新文件目录(文件夹)。

现在让我们看看如何在 Linux 终端中删除文件和文件夹。

删除文件

要删除文件,你可以按以下方式使用 rm 命令:

rm filename_or_path

如果文件已成功删除,你将看不到任何输出。

这是一个示例,其中我删除了一个名为 new_file 的文件。当我列出目录内容时,你可以看到 new_file 不再存在。

Removing files in Linux terminal

你还可以在同一命令中删除多个文件:

rm file1 file2 file3

让我展示一个在单条命令中删除两个文件的示例。

Deleting multiple files in single rm command

?️练习文件删除

让我们练习一下刚刚学到的东西。创建一个名为 practice_delete 的目录并切换到该目录:

mkdir practice_delete && cd practice_delete

现在创建一些空文件:

touch file1 file2 file3

删除 file3:

rm file3

现在,让我们做一些额外的事情。运行此命令并更改 file2 的权限:

chmod u-w file1 file2

现在尝试删除 file2

rm file2

你是否看到消息 “remove write protected file”? 那是因为你从这个文件中删除了写权限(用于修改)。

你可以Y 或回车键确认删除或按 N 拒绝删除。

如果你不想看到这条消息并仍然删除它,你可以使用强制删除选项 -f。通过删除 file1 试试:

rm -f file1

以下是上述所有示例的重放:

Deleting files in Linux terminal

? Linux 命令行中没有垃圾桶。一旦文件被删除,你就无法像在图形文件管理器中那样撤消将其从垃圾箱中取回的操作。因此,删除文件时要格外小心。

小心删除

缺少垃圾桶使删除成为一种永久性的工作。这就是为什么你应该注意要删除的文件的原因。

有一个带 -i 选项的交互模式。有了这个,你会被要求确认删除。

rm -i filename

当你根据特定模式删除多个文件时,这很有用。

这是一个示例,其中我以交互方式删除名称中匹配 file_ 模式的所有文件。我删除了一些并在交互模式下保留了一些。

Deleting files in interactive mode

? 我建议切换到文件所在的目录,然后删除它们。这有助于减少由文件路径中的拼写错误引起的任何可能性。

删除目录

在 Linux 中有专门的 rmdir 命令来删除目录。

rmdir dir_name

但是,它只能删除空目录。如果目录中有任何文件或子目录,rmdir 命令将抛出错误。

$ rmdir dir2
rmdir: failed to remove 'dir2': Directory not empty

这使得它在大多数情况下用处不大。

那么,如何删除非空文件夹呢? 好吧,使用与之前删除文件相同的 rm 命令。

是的,相同的 rm 命令,但带有递归选项 -r

rm -r dir_name

?️练习文件夹删除

让我们练习你学到的东西。

如果你还没有,请切换到 practice_delete 文件夹。现在,创建两个目录 dir1dir2

mkdir dir1 dir2

dir2 中创建一个文件:

touch dir2/file

现在尝试使用 rmdir 命令删除目录:

rmdir dir1
rmdir dir2

由于 dir2 不为空,rmdir 命令将失败。相反,使用带有递归选项的 rm 命令:

rm -r dir2

以下是上述所有命令示例的重放:

Deleting folders in Linux

? 交互式删除模式在使用 rm 命令的递归选项删除目录时更有帮助:
rm-ri dir_name

因此,你学会了使用 Linux 命令删除文件和文件夹。是时候多练习了。

测试你的知识

准备一个如下所示的目录树:

.
├── dir1
│   ├── file1
│   ├── file2
│   └── file3
├── dir2
├── dir3
└── file

基本上,你在当前目录(practice_delete)中创建一个名为 file 的文件和三个目录 dir1dir2dir3。然后在 dir1 中创建文件 file1file2file3

现在执行以下操作:

  • 删除 file2
  • 切换到 dir3 并强制删除上层目录中名为 file 的文件。
  • 删除 dir1 的所有内容,但不删除目录本身。
  • 列出 dir 的内容。

一切进展顺利。你已经学习了一些基本知识,例如切换目录、检查目录内容、创建和删除文件和目录。在下一章中,你将学习如何在终端中复制文件和文件夹。敬请关注!


via: https://itsfoss.com/delete-files-folders-linux/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

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