2021年10月

使用 Linux 或 FreeDOS 从一个 C 程序中生成彩色的 ASCII 艺术。

 title=

利用扩展 ASCII 字符集和它的绘画元素集合的全彩 ASCII 艺术在 DOS 上曾经相当流行。你可以在你的下一个 FreeDOS 程序中加入 ASCII 艺术,作为一个很酷的“欢迎”屏幕,或者作为一个提供了更多程序信息的彩色“退出”屏幕,来增加一点视觉上的乐趣。

但是,这种 ASCII 艺术的风格并不仅仅局限于 FreeDOS 程序。你可以在 Linux 终端模式的程序中使用同样的方法。虽然 Linux 使用 ncurses 来控制屏幕,而不是 DOS 的 conio,但相关的概念也适用于 Linux 程序。本文探讨了如何从 C 语言程序中生成彩色 ASCII 艺术。

ASCII 艺术文件

你可以使用各种工具来绘制你的 ASCII 艺术。在这个例子中,我使用了一个叫做 TheDraw 的老式 DOS 应用程序,但是你可以在 Linux 上找到现代的开源 ASCII 艺术程序,比如 Moebius(Apache 许可证)或者 PabloDraw(MIT 许可证)。只要你知道保存的数据是什么样子的,你使用什么工具并不重要。

下面是一个 ASCII 艺术文件样本的一部分,以 C 源代码保存。请注意,这个代码片段定义了几个值。IMAGEDATA_WIDTHIMAGEDATA_DEPTH 定义了屏幕上的列数和行数。在这里,它是一个 80x25 的 ASCII 艺术“图像”。IMAGEDATA_LENGTH 定义了 IMAGEDATA 数组中的条目数量。ASCII 艺术画面中的每个字符可以用两个字节的数据表示。要显示的字符和包含该字符的前景和背景颜色的颜色属性。对于一个 80x25 的屏幕,每个字符都与一个属性配对,该数组包含 4000 个条目(即 80*25*2=4000)。

#define IMAGEDATA_WIDTH 80
#define IMAGEDATA_DEPTH 25
#define IMAGEDATA_LENGTH 4000
unsigned char IMAGEDATA [] = {
    '.', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,
    ' ', 0x08,  ' ', 0x08,  '.', 0x0F,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,
    ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  '.', 0x0F,
    ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,
    ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,

数组的其它部分依此类推。

为了在屏幕上显示这种 ASCII 艺术,你需要写一个小小的程序来读取数组并以正确的颜色打印每个字符。

设置一个颜色属性

这个 ASCII 艺术文件中的颜色属性在一个字节中定义了背景和前景的颜色,用十六进制的值表示,如 0x080x6E。十六进制是适合表达这样的颜色“对”的紧凑方式。

像 Linux 上的 ncurses 或 DOS 上的 conio 这样的字符模式系统 只能显示 16 种颜色。这就是十六种可能的文本颜色和八种背景颜色。用二进制计算十六个值(从 0 到 15)只需要四个二进制位。

1111 是二进制的 15

而且方便的是,十六进制可以用一个字符表示 0 到 15:0123456789ABCDEF。所以十六进制的值 F 是数字 15,或二进制的 1111

通过颜色对,你可以用一个八位的字节来编码背景和前景的颜色。这就是文本颜色的四个二进制位(十六进制中的 0 到 15 或 0 到 F)和背景颜色的三个二进制位(十六进制中的 0 到 7 或 0 到 E)。字节中剩余的二进制位在这里没有使用,所以我们可以忽略它。

为了将颜色对或属性转换成你的程序可以使用的颜色值,你需要 使用位掩码,只指定用于文字颜色或背景颜色的位。使用 FreeDOS 上的 OpenWatcom C 编译器,你可以编写这个函数,从颜色属性中适当地设置颜色。

void
textattr(int newattr)
{
  _settextcolor(newattr & 15);         /* 0000xxxx */
  _setbkcolor((newattr >> 4) & 7);     /* 0xxx0000 */
}

_settextcolor 函数只设置文本颜色,_setbkcolor 函数设置背景颜色。两者都定义在 graph.h 中。注意,由于颜色属性在一个字节值中包括了背景色和前景色,textattr 函数使用 &(二进制的“与”运算)来设置一个位掩码,只隔离了属性中的最后四个位。这就是颜色对存储前景颜色的值 0 到 15 的地方。

为了得到背景色,该函数首先执行了一个位移,将位“推”到右边。这就把“上”位放到了“下”位范围,所以任何像 0xxx0000 这样的位都变成了 00000xxx。我们可以用另一个的位掩码 7(二进制 0111)来挑选出背景颜色值。

显示 ASCII 艺术

IMAGEDATA 数组包含整个 ASCII 艺术屏幕和每个字符的颜色值。为了在屏幕上显示 ASCII 艺术,你的程序需要扫描该数组,设置颜色属性,然后一次在屏幕上显示一个字符。

让我们在屏幕的底部留出空间,以便向用户提供单独的信息或提示。也就是说,我不想显示一个 80 列 ASCII 屏幕的所有 25 行,而只想显示前 24 行。

  /* print one line less than the 80x25 that's in there:
     80 x 24 x 2 = 3840 */

  for (pos = 0; pos < 3840; pos += 2) {
...
  }

for 循环里面,我们需要设置颜色,然后打印字符。OpenWatcom C 编译器提供了一个函数 _outtext 来显示带有当前颜色值的文本。然而,这需要传递一个字符串,如果我们需要一个一个地处理每个字符,在一行中的每个字符需要不同颜色的情况下,效率就会很低。

相反,OpenWatcom 有一个类似的函数,叫做 _outmem,允许你指示要显示多少个字符。对于一次一个字符,我们可以在 IMAGEDATA 数组中提供一个字符值的指针,并告诉 _outtext 只显示一个字符。这将使用当前的颜色属性显示该字符,这就是我们需要的。

  for (pos = 0; pos < 3840; pos += 2) {
    ch = &IMAGEDATA[pos];              /* pointer assignment */
    attr = IMAGEDATA[pos + 1];
 
    textattr(attr);
    _outmem(ch, 1);
  }

这个更新的 for 循环通过向 IMAGEDATA 数组分配一个指针来设置字符 ch。接下来, 循环设置文本属性, 然后用 _outmem 显示字符.

整合起来

有了 textattr 函数和处理数组的 for 循环, 我们可以编写一个完整的程序来显示 ASCII 艺术文件的内容。对于这个例子,将 ASCII 艺术文件保存为 imgdata.inc,并用 #include 语句将其包含在源文件中。

#include <stdio.h>
#include <conio.h>
#include <graph.h>

#include "imgdata.inc"

void
textattr(int newattr)
{
  _settextcolor(newattr & 15);         /* 0000xxxx */
  _setbkcolor((newattr >> 4) & 7);     /* 0xxx0000 */
}

int
main()
{
  char *ch;
  int attr;
  int pos;

  if (_setvideomode(_TEXTC80) == 0) {
    fputs("Error setting video mode", stderr);
    return 1;
  }

  /* draw the array */

  _settextposition(1, 1);              /* top left */

  /* print one line less than the 80x25 that's in there:
     80 x 24 x 2 = 3840 */

  for (pos = 0; pos < 3840; pos += 2) {
    ch = &IMAGEDATA[pos];              /* pointer assignment */
    attr = IMAGEDATA[pos + 1];

    textattr(attr);
    _outmem(ch, 1);
  }

  /* done */

  _settextposition(25, 1);             /* bottom left */

  textattr(0x0f);
  _outtext("Press any key to quit");

  getch();

  textattr(0x00);
  return 0;
}

在 FreeDOS 上使用 OpenWatcom C 编译器编译该程序,你会得到一个显示这个节日信息的新程序。

ASCII艺术中的万圣节信息

万圣节快乐(Jim Hall, CC-BY-SA 4.0)

万圣节快乐,各位!


via: https://opensource.com/article/21/10/ascii-linux-halloween

作者:Jim Hall 选题:lujun9972 译者:wxy 校对:wxy

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

了解在 Linux 上安装 Rust 编程语言及其包管理器 Cargo 的各种方法。

自从 Mozilla 贡献了 Rust 语言之后,它就获得了更加突出和受欢迎的地位。口说无凭。Rust 将被使用在 Linux 内核中,它是继 C 语言之后的第二种编程语言。

许多开发人员也开始使用 Rust 语言制作很棒的基于命令行的工具。这些工具通常可以通过 Cargo 包管理器 获得。

这就是为什么在 Linux 中安装 Rust 支持对程序员和最终用户都很重要的原因。

官方 Rust 文档建议通过以下这种方式下载并执行安装程序脚本在 Linux 中安装 Rust:

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

这是可行的。但是,你的发行版可能已经打包了 Rust。使用你的发行版的 包管理器 也是一种选择。

让我向你介绍官方 Rust 方式和包管理器方式的 Rust 安装步骤。

方法1:使用官方方法在任意的 Linux 上安装 Rust

这种方法有几个优点:

  • 你可以获取最新的 Rust 和 Cargo 版本
  • Rust 仅仅是为当前的用户安装,并不是所有用户
  • 你并不需要 root 用户或者 sudo 权限就可以为自己安装 Rust

一些人不喜欢从互联网下载并 运行 shell 脚本,即使它来自官方。但是,由于它不需要 root 访问权限并且脚本来自官方,因此以这种方式安装它应该是安全的。

首先,确保你已经安装了 curl。如果没安装,使用你的发行版的包管理器安装它。你可以使用 apt 命令在 Ubuntu 和 Debian 上安装 Curl

sudo apt install curl

接下来,使用这条命令下载脚本并运行它:

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

它会询问你输入所需的安装类型。选择选项 1

脚本完成安装后,你需要获取配置文件的来源,以使更改应用于你的 shell。

应用文件:

source $HOME/.cargo/env

完成后,通过检查已安装的版本来验证 Rust 是否可用:

rustc --version

Verifying Rust installation

太酷了。如果 Rust 发布了新版本,你可以使用如下命令更新已安装的版本:

rustup update

在你看到其它安装方法之前,让我快速展示如何移除以这种方式安装的 Rust。

删除以官方方式安装的 Rust

在终端中,使用如下的命令从系统中移除 Rust:

rustup self uninstall

询问时按 Y,你将从系统中删除 Rust。

Removing Rust from Linux

官方方式安装已经完成。让我们看看如何使用 apt 命令在 Ubuntu 上安装 Rust。

方法2:使用 apt 命令在 Ubuntu 上安装 Rust

为什么要使用包管理器?

  • 它在整个系统范围内安装 Rust,可供系统上的所有用户使用
  • 它与其它系统更新一起集中更新(如果你的发行版添加了新版本的 Rust)

Ubuntu 中有两个主要的 Rust 包:

  • rustc:用于 Rust 编程语言的 Rust 编译器
  • cargo:Cargo 是 Rust 的包管理器,它会自动安装 rustc

作为一个普通用户,你将使用 Cargo 来安装基于 Rust 的应用程序。作为程序员,你需要 Cargo 来获取其它 Rust 包或创建自己的包。

由于 cargo 包含 rustc,所以我建议安装它,以便一次性安装所有必需的软件包。

sudo apt install cargo

系统会要求你输入账号密码。

当然,你可以自由使用 apt install rustc,只安装 Rust。这取决于你的选择。

你可以验证是否为你和所有其他用户安装了 Rust(如果你愿意):

很好。让我也快速展示卸载步骤。

使用 apt remove 移除 Rust

要移除 Rust,你可以先移除 Cargo,然后使用 autoremove 命令移除随它安装的依赖项。

sudo apt remove cargo

现在运行 autoremove

sudo apt autoremove

就是这样。你现在了解了在 Ubuntu 和其它 Linux 发行版上安装 Rust 的所有基本知识。随时欢迎提出问题和建议。


via: https://itsfoss.com/install-rust-cargo-ubuntu-linux/

作者:Abhishek Prakash 选题:lujun9972 译者:perfiffer 校对:wxy

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

中国主要网站仍然不支持 IPv6

对 Alexa 排名前 500 网站的 检查显示,支持 IPv6 的网站占 25%。而中国主要网站基本不支持 IPv6,如天猫、百度、搜狐、淘宝、京东、奇虎360、微博、新浪、新华网等等。全世界的 IPv6 普及度 正在逐渐增长,根据 Google IPv6 的统计 显示,IPv6 的普及度已经达到了 35%,但中国的 IPv6 的普及度仍然较低。

老王点评:现在电信运营商对 IPv6 的支持比较好,毕竟 IP 不太够用。但是各个网站对此则动力不足。

磁带仍占有数据备份的 4% 份额

虽然早在 2003 年 LiveVault 就宣称“磁带备份是上个世纪的事情”,但将近 20 年过去了,仍有 4% 的组织 使用磁带备份,15% 在使用 “硬盘+磁带” 的混合式备份方案,但云端备份的使用率已增长到 51% 。磁带备案难以退出市场的主要原因是:组织机构需要保留多年的历史备份,大企业的转型动作更是既困难又缓慢;磁带的成本其实相当划算;磁带备份具有物理隔离的特性。

老王点评:虽然磁带备份看起来很老旧了,但是也有现在云端备份所不具备的一些优势。

世界论文索引 General Index 上线

一位美国技术专家 发布 了一个包含 1 亿多篇期刊文章中单词和短语的索引 General Index——其中包括了许多付费论文。 索引于 10 月 7 日发布可免费使用,包含超过 3550 亿个单词及相应论文中的句子片段。此举是为了帮助科学家使用软件从已发表论文中收集见解,即使他们没有合法访问相关论文的权限。索引不包含论文全文,只包含最多五个单词的句子片段。早期访问过该索引的研究人员表示,这是帮助他们使用软件搜索文献的重大进展。

老王点评:这对于科研来说应该很有用。

我假设你对 Linux 很陌生。

你按照网上的一些教程,告诉你要安装某个程序或运行某个命令。可能是与服务器有关的东西。

但当你运行这个命令时,你遇到了这个错误:

E: Could not open lock file /var/lib/dpkg/lock-frontend – open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?

或者类似的错误:

dpkg: error: required read/write access to the dpkg database directory /var/lib/dpkg
E: Sub-process dpkg –set-selections returned an error code (2)
E: Executing dpkg failed. Are you root?

这两个错误都在问你同一个问题:你是 root 吗?而这就是这个问题的答案。成为 root。

成为 root 以避免这个错误

你如何 在 Ubuntu 或 Debian 中成为 root?你使用 sudo 命令。

是的,就是这样。无论你在运行什么命令,只要在它前面加上 sudo 即可。

sudo your_command

Running command with sudo

它将要求你输入你的用户账户密码。请记住,当你输入密码时,屏幕上不会显示任何东西,这也没关系。

你的系统没有任何问题。在大多数 Linux 系统中,输入密码时不会显示通常的星号或其他东西是一种“安全特性”。

只要输入密码,并在密码后按下回车键即可。如果密码输入正确,你现在应该可以运行该命令了。

你甚至可以使用这个方便的 Linux 命令行技巧,用 sudo 运行以前的命令:

sudo !!

这很简单,而且立即生效,除非你没有 sudo 权限。然后,你会看到一个不同的错误。

看到一个 “User is not in sudoer file” 的错误?

Some users cannot run commands with sudo

当你 安装 Ubuntu 时,你必须创建一个用户账户。这个用户被自动授予 sudo 权限,在需要时以 root 身份运行命令。

这发生在 Ubuntu 桌面上,而不是服务器上。大多数服务器发行版会有一个单独的 root 账户。如果你单独创建了一个普通账户,你就必须把这个用户添加到 sudoer 中,以便这个普通用户可以使用 sudo

在上面的截图中,我已经创建了这个额外的用户,但没有将其添加到 sudo 组中。这意味着这里的用户 prakash 没有使用 sudo 命令的权限,因此系统抱怨 “prakash is not in sudoers file”。

该事件在哪里报告?

错误的 sudo 尝试会被添加到系统日志中。它记录了用户名、虚拟终端号、运行命令的位置和运行的命令。

Incorrect sudo attempts are logged into the system

这些日志的位置在不同的发行版中有所不同。

通常,在 Ubuntu 中你可以在 journalctl 日志或 /var/log/auth.log 文件中找到它,在 Fedora 中可以在 /var/log/audit/audit.log 文件中找到它。

如果一个用户不在 sudoer 列表中,你能做什么?

当你不能用当前的用户账户使用 sudo 时,你能做什么?首先,验证该用户是否有 sudo 权限。如果没有,你可以有一些选择

  • 以 root 身份登录或切换 root 身份(如果你有 root 密码)。
  • 将该用户加入 sudoer 列表 (如果你有其他用户账户的管理或 sudo 权限)。
  • 如果你在多用户的 Linux 系统中,自己没有 root 或 sudo 权限,请你的系统管理员授予你的用户 sudo 权限或安装你想安装的应用。

这有帮助吗?

sudo 是一个非常全面的安全机制,它不仅仅是允许一个普通用户成为 root。它有助于对系统进行审计,了解哪个用户用 sudo 运行了哪个命令。它还可以被配置为只允许某个用户用 sudo 运行某些命令。

你不会在桌面 Linux 上看到如此细化的 sudo 配置,在桌面 Linux 上,它被预先配置为允许 sudo 组中的任何用户以 root 的身份运行任何命令。关于 sudo 的更多信息,请参见其他文章。

我希望在解决这个经典的初学者问题时,你能对 sudo 命令有一些初步的了解。如果你对这个主题有进一步的问题,请在评论区告诉我。


via: https://itsfoss.com/fixed-are-you-root-error/

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

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

微软 Edge 的 Linux 最终版本终于亮相了。对于涉足 Linux 的 Windows 用户来说,这似乎是一个值得考虑的选择。

早在 5 月,微软就启动了 Linux 版的 Edge 的公开测试

现在,就在正式宣布之前,其稳定版已经被推送到官方仓库。

注意:微软 Edge 不是一个开源的浏览器,但它基于开源的组件。我们报道这个是因为它可以用于 Linux。

微软 Edge 的 Linux 版本:有什么值得喜欢的?

微软 Edge 基于开源的 Chromium,这一点并不奇怪。所以,是的,它只是又一个 基于 Chromium 的 Linux 浏览器

然而,与谷歌 Chrome 浏览器相比,微软 Edge 提供了良好的用户体验和一些对 Windows 用户来说可能很方便的额外功能。

根据我在 Windows 10 上的经验,与谷歌 Chrome 浏览器相比,微软 Edge 似乎性能更好,但我还没有为此比较过任何基准。

那么,它对 Linux 是否有用?有什么理由让你去尝试吗?

当然,如果你不喜欢使用微软的服务,那就完全是另一回事了。但是,总的来说,微软 Edge 看起来是一个有前途的基于 Chromium 的浏览器,具有一些有用的功能。

一些可用于 Linux 的关键功能包括:

  • 睡眠标签(以节省资源)
  • 垂直标签
  • 收藏
  • 防止跟踪

虽然它在配置你的微软账户时也支持家庭安全选项,但并不是每项功能都适用于 Linux。

此外,我没有发现可以派上用场的 Linux 的“儿童模式”。

而且,如果你在使用 Linux 的同时还使用其他桌面平台,微软 Edge 可以是跨平台冒险的一个好选择。

但如果你只想在 Linux 上试用它,你可能想在作出决定之前将它与其他浏览器进行比较。

下载微软 Edge Linux 版

想知道 如何在 Linux 上安装微软 Edge 浏览器?尽管 微软 Edge 的官方网站 没有列出 Linux 版本,但你可以在他们的官方资源库中找到它。

DEB 和 RPM 两种软件包都是可用的。你可以使用下面的链接下载这些软件包:

Via: Sophos


via: https://news.itsfoss.com/microsoft-edge-stable-release/

作者:Ankush Das 选题:lujun9972 译者:wxy 校对:wxy

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

三年半后,X.Org 服务器重焕新生

X.Org 服务器的上一个版本 1.20 发布于 2018 年,三年半后,在新的维护者的努力下 发布 了新的版本 1.21 —— 哦不,现在流行飙版本号了,新版本号为 21.1.0。虽然 Wayland 有很多优势,但是 X.Org 服务器仍然被广泛使用,Wayland 对这些使用 X.Org 服务器的应用的兼容还不够好,而且 X.Org 服务器也有一些 Wayland 所没有的独特优势。去年,X.Org 服务器项目的长期维护者说它几乎被放弃了,它能复活要感谢新的维护者 Kanapickas,他在 7 月份站出来 接过了开发维护工作。有用户评价说,“不是所有的英雄都穿斗篷”。

老王点评:很多开源项目不是软件老了,而是维护软件的人老了啊。

国家鼓励金融部门拥抱自由和开源软件

据报道,该文件 “鼓励金融机构将开源技术应用作为提高核心技术自主可控能力的重要手段”,“积极参与开源生态建设,依法合规分享开源技术应用经验,共享开源技术研究成果”。并提出“金融机构应当遵循开源技术相关法律和许可要求,合规使用开源技术”。文件要求遵循安全可控、合规使用、问题导向和开放创新等原则,并着重指出金融机构要“在操作系统、数据库、中间件等基础软件领域和云计算、大数据、人工智能、区块链等新兴技术领域加快生态建设”。

老王点评:向来比较保守的金融部门能主动拥抱开源,可见开源已经成为了一种普遍共识。

微软放弃 Electron

在 Electron 上运行的 Teams 已经成为占用内存和降低计算机速度的代名词,微软甚至 专门解释 了为什么 Teams 占用这么多内存。最近,微软宣布,Teams 将转向他们自己的 Edge Webview2 渲染引擎,放弃 Electron 以寻求性能提升。据介绍,转型后,Teams 的内存消耗将减少 2 倍,它将被称为 Teams 2.0。有很多知名的应用程序都是由 Electron 驱动的,该框架可以帮助 Web 开发者将他们的 Web 应用转到桌面平台。但每个 Electron 应用程序的后台都有一个唯一的 Chrome OS 实例,运行两个以上的此类应用程序会耗尽主机的性能。

老王点评:Electron 开发的应用就和 Java 开发的桌面应用一样臃肿笨重。这种跨平台的代价不菲啊。