2021年11月

Brave 是一个越来越 流行于 Linux 和其他操作系统的网页浏览器。对默认情况下阻止广告和跟踪的关注,以及对 Chrome 扩展的支持,使 Brave 成为 Linux 用户的热门选择。

在本教程中,你将学习如何在 Fedora Linux 上安装 Brave。你还将学习如何更新和删除它。

本教程已经在 Fedora 上进行了测试,但它也应该适用于基于 Red Hat 的其他发行版,如 CentOS、Alma Linux 和 Rocky Linux。

在 Fedora Linux 上安装 Brave 浏览器

你需要在这里用命令行的方式来安装 Brave。

作为先决条件,请确保 dnf-plugin-core 已经安装。

sudo dnf install dnf-plugins-core

下一步是将 Brave 仓库添加到你的系统中:

sudo dnf config-manager --add-repo https://brave-browser-rpm-release.s3.brave.com/x86_64/

你还应该导入并添加仓库密钥,这样你的系统就会信任来自这个新添加的仓库的软件包:

sudo rpm --import https://brave-browser-rpm-release.s3.brave.com/brave-core.asc

Adding Brave Browser repository in Fedora Linux

现在可以开始了。用这个命令安装 Brave:

sudo dnf install brave-browser

当被要求确认你的选择时按 Y。根据你的网速,这应该需要几秒钟或几分钟的时间。如果 DNF 的缓存最近没有更新,甚至可能需要更长时间。

Installing Brave Browser in Fedora

安装完成后,在系统菜单中寻找 Brave 并从那里启动。

Start Brave browser in Fedora Linux

在 Fedora Linux 上更新 Brave 浏览器

你已经为浏览器添加了一个仓库,并且导入了它的密钥。你的系统信任来自这个仓库的软件包。

因此,当有新的 Brave 浏览器发布并提供给这个仓库时,你会通过常规的系统升级得到它。

换句话说,你不需要做任何特别的事情。只要保持你的 Fedora 系统更新,如果有 Brave 的新版本,它应该会随着系统更新自动安装。

从 Fedora Linux 中删除 Brave 浏览器

Brave Browser in Fedora Linux

如果你因为某些原因不喜欢 Brave,你可以从你的系统中删除它。只需使用 dnf remove 命令:

sudo dnf remove brave-browser

当询问时按 Y

Removing Brave browser from Fedora Linux

你也可以选择禁用 brave-browser-rpm-release.s3.brave.com_x86_64_.repo 或者从 /etc/yum/repos.d 中完全删除这个文件,虽然这并不是必须的。

我希望这个快速提示对你有帮助。如果你有任何问题或建议,请让我知道。


via: https://itsfoss.com/install-brave-browser-fedora/

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

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

下次当你为控制台输出的格式而苦恼时,请参考这篇文章及其速查表。

我写文章主要是为了给自己写文档。我在编程时非常健忘,所以我经常会写下有用的代码片段、特殊的特性,以及我使用的编程语言中的常见错误。这篇文章完全切合我最初的想法,因为它涵盖了从 C++ 控制台格式化打印时的常见用例。

像往常一样,这篇文章带有大量的例子。除非另有说明,代码片段中显示的所有类型和类都是 std 命名空间的一部分。所以当你阅读这段代码时,你必须在类型和类的前面加上using namespace std;。当然,该示例代码也可以在 GitHub 上找到。

面向对象的流

如果你曾经用过 C++ 编程,你肯定使用过 cout。当你包含 <iostream> 时,ostream 类型的 cout 对象就进入了作用域。这篇文章的重点是 cout,它可以让你打印到控制台,但这里描述的一般格式化对所有 ostream 类型的流对象都有效。ostream 对象是 basic_ostream 的一个实例,其模板参数为 char 类型。头文件 <iosfwd><iostream> 的包含层次结构的一部分,包含了常见类型的前向声明。

basic_ostream 继承于 basic_ios,该类型又继承于 ios_base。在 cppreference.com 上你可以找到一个显示不同类之间关系的类图。

ios_base 类是所有 I/O 流类的基类。basic_ios 类是一个模板类,它对常见的字符类型进行了 模板特化 specialization ,称为 ios。因此,当你在标准 I/O 的上下文中读到 ios 时,它是 basic_ioschar 类型的模板特化。

格式化流

一般来说,基于 ostream 的流有三种格式化的方法。

  1. 使用 ios_base 提供的格式标志。
  2. 在头文件 <iomanip><ios> 中定义的流修改函数。
  3. 通过调用 << 操作符的 特定重载

所有这些方法都有其优点和缺点,通常取决于使用哪种方法的情况。下面显示的例子混合使用所有这些方法。

右对齐

默认情况下,cout 占用的空间与要打印的数据所需的空间一样大。为了使这种右对齐的输出生效,你必须定义一个行允许占用的最大宽度。我使用格式标志来达到这个目的。

右对齐输出的标志和宽度调整只适用于其后的行。

cout.setf(ios::right, ios::adjustfield);
cout.width(50);
cout << "This text is right justified" << endl;
cout << "This text is left justified again" << endl;

在上面的代码中,我使用 setf 配置了右对齐的输出。我建议你将位掩码 ios::adjustfield 应用于 setf,这将使位掩码指定的所有标志在实际的 ios::right 标志被设置之前被重置,以防止发生组合碰撞。

填充空白

当使用右对齐输出时,默认情况下,空的地方会用空白字符填充。你可以通过使用 setfill 指定填充字符来改变它:

cout << right << setfill('.') << setw(30) << 500 << " pcs" << endl;
cout << right << setfill('.') << setw(30) << 3000 << " pcs" << endl;
cout << right << setfill('.') << setw(30) << 24500 << " pcs" << endl;

代码输出如下:

...........................500 pcs
..........................3000 pcs
.........................24500 pcs

组合

想象一下,你的 C++ 程序记录了你的储藏室库存。不时地,你想打印一份当前库存的清单。要做到这一点,你可以使用以下格式。

下面的代码是左对齐和右对齐输出的组合,使用点作为填充字符,可以得到一个漂亮的列表:

cout << left << setfill('.') << setw(20) << "Flour" << right << setfill('.') << setw(20) << 0.7 << " kg" << endl;
cout << left << setfill('.') << setw(20) << "Honey" << right << setfill('.') << setw(20) << 2 << " Glasses" << endl;
cout << left << setfill('.') << setw(20) << "Noodles" << right << setfill('.') << setw(20) << 800 << " g" << endl;
cout << left << setfill('.') << setw(20) << "Beer" << right << setfill('.') << setw(20) << 20 << " Bottles" << endl;

输出:

Flour...............................0.70 kg
Honey..................................2 Glasses
Noodles..............................800 g
Beer..................................20 Bottles

打印数值

当然,基于流的输出也能让你输出各种变量类型。

布尔型

boolalpha 开关可以让你把布尔型的二进制解释转换为字符串:

cout << "Boolean output without using boolalpha: " << true << " / " << false << endl;
cout << "Boolean output using boolalpha: " << boolalpha << true << " / " << false << endl;

以上几行产生的输出结果如下:

Boolean output without using boolalpha: 1 / 0
Boolean output using boolalpha: true / false

地址

如果一个整数的值应该被看作是一个地址,那么只需要把它投到 void* 就可以了,以便调用正确的重载。下面是一个例子:

unsigned long someAddress = 0x0000ABCD;
cout << "Treat as unsigned long: " << someAddress << endl;
cout << "Treat as address: " << (void*)someAddress << endl;

该代码产生了以下输出:

Treat as unsigned long: 43981
Treat as address: 0000ABCD

该代码打印出了具有正确长度的地址。一个 32 位的可执行文件产生了上述输出。

整数

打印整数是很简单的。为了演示,我使用 setfsetiosflags 来指定数字的基数。应用流修改器 hex/oct 也有同样的效果。

int myInt = 123;

cout << "Decimal: " << myInt << endl;

cout.setf(ios::hex, ios::basefield);
cout << "Hexadecimal: " << myInt << endl;

cout << "Octal: " << resetiosflags(ios::basefield) <<  setiosflags(ios::oct) << myInt << endl;

注意: 默认情况下,没有指示所使用的基数,但你可以使用 showbase 添加一个。

Decimal: 123
Hexadecimal: 7b
Octal: 173

用零填充

0000003
0000035
0000357
0003579

你可以通过指定宽度和填充字符得到类似上述的输出:

cout << setfill('0') << setw(7) << 3 << endl;
cout << setfill('0') << setw(7) << 35 << endl;
cout << setfill('0') << setw(7) << 357 << endl;
cout << setfill('0') << setw(7) << 3579 << endl;

浮点值

如果我想打印浮点数值,我可以选择“固定”和“科学”格式。此外,我还可以指定精度:

double myFloat = 1234.123456789012345;
int defaultPrecision = cout.precision(); // == 2

cout << "Default precision: " << myFloat << endl;
cout.precision(4);
cout << "Modified precision: " << myFloat << endl;
cout.setf(ios::scientific, ios::floatfield);
cout << "Modified precision & scientific format: " << myFloat << endl;
/* back to default */
cout.precision(defaultPrecision);
cout.setf(ios::fixed, ios::floatfield);
cout << "Default precision & fixed format:  " << myFloat << endl;

上面的代码产生以下输出:

Default precision: 1234.12
Modified precision: 1234.1235
Modified precision & scientific format: 1.2341e+03
Default precision & fixed format:  1234.12

时间和金钱

通过 put_money,你可以用正确的、与当地有关的格式来打印货币单位。这需要你的控制台能够输出 UTF-8 字符集。请注意,变量 specialOffering 以美分为单位存储货币价值。

long double specialOffering = 9995;

cout.imbue(locale("en_US.UTF-8"));
cout << showbase << put_money(specialOffering) << endl;
cout.imbue(locale("de_DE.UTF-8"));
cout << showbase << put_money(specialOffering) << endl;
cout.imbue(locale("ru_RU.UTF-8"));
cout  << showbase << put_money(specialOffering) << endl;

iosimbue 方法让你指定一个地区。通过命令 locale -a,你可以得到你系统中所有可用的地区标识符的列表。

$99.95
99,950€
99,950₽

(不知道出于什么原因,在我的系统上,它打印的欧元和卢布有三个小数位,对我来说看起来很奇怪,但这也许是官方的格式。)

同样的原则也适用于时间输出。函数 put_time 可以让你以相应的地区格式打印时间。此外,你可以指定时间对象的哪些部分被打印出来。

time_t now = time(nullptr);
tm localtm = *localtime(&now);


cout.imbue(locale("en_US.UTF-8"));
cout << "en_US : " << put_time(&localtm, "%c") << endl;
cout.imbue(locale("de_DE.UTF-8"));
cout << "de_DE : " << put_time(&localtm, "%c") << endl;
cout.imbue(locale("ru_RU.UTF-8"));
cout << "ru_RU : " << put_time(&localtm, "%c") << endl;

格式指定符 %c 会打印一个标准的日期和时间字符串:

en_US : Tue 02 Nov 2021 07:36:36 AM CET
de_DE : Di 02 Nov 2021 07:36:36 CET
ru_RU : Вт 02 ноя 2021 07:36:36

创建自定义的流修改器

你也可以创建你自己的流。下面的代码在应用于 ostream 对象时插入了一个预定义的字符串:

ostream& myManipulator(ostream& os) {
    string myStr = ">>>Here I am<<<";
    os << myStr;
    return os;
}

另一个例子: 如果你有重要的事情要说,就像互联网上的大多数人一样,你可以使用下面的代码在你的信息后面根据重要程度插入感叹号。重要程度被作为一个参数传递:

struct T_Importance {
     int levelOfSignificance;
};

T_Importance importance(int lvl){
    T_Importance x = {.levelOfSignificance = lvl };
    return x;
}

ostream& operator<<(ostream& __os, T_Importance t){

    for(int i = 0; i < t.levelOfSignificance; ++i){
        __os.put('!');
    }
    return __os;
}

这两个修饰符现在都可以简单地传递给 cout

cout << "My custom manipulator: " << myManipulator << endl;

cout << "I have something important to say" << importance(5) << endl;

产生以下输出:

My custom manipulator: >>>Here I am<<<

I have something important to say!!!!!

结语

下次你再纠结于控制台输出格式时,我希望你记得这篇文章及其 速查表

在 C++ 应用程序中,coutprintf 的新邻居。虽然使用 printf 仍然有效,但我可能总是喜欢使用 cout。特别是与定义在 <ios> 中的修改函数相结合,会产生漂亮的、可读的代码。


via: https://opensource.com/article/21/11/c-stdcout-cheat-sheet

作者:Stephan Avenwedde 选题:lujun9972 译者:wxy 校对:wxy

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

微软 Edge 最新内置购物功能激怒用户

微软 Edge 的测试版本最近增加了一项功能,在浏览器内内置了购物功能,还允许人们分期支付网上购物的费用。这引起了浏览器的 粉丝和用户的批评,他们认为微软 Edge 已经成为一个非常好的替代品,但正在变得臃肿,充满了购物功能,而不是提供一个纯粹的浏览体验。

老王点评:当 Edge 开始成功时,谁都想从其中挣到更多的钱,结果就被搞坏了。

86% 被攻击的谷歌云实例用于挖掘加密货币

谷歌最新发布的 报告显示,这些被攻击利用的实例中,48% 的用户账户密码是薄弱或没有密码,或没有 API 认证,26% 是由于云实例中第三方软件的漏洞而发生的,只有 4% 是由于泄漏的凭证,如发布到 GitHub 的密钥。而且,在 58% 的情况下攻击是由脚本进行的,不需要人工干预,不安全的实例可以在短短 30 分钟内被扫描到成为攻击目标。

老王点评:如果你没有谨慎处置你的安全,就是为攻击者买单了。

为在 Chrome 中禁止第三方 Cookie,谷歌向监管部门妥协

谷歌去年年初宣布,未来两年内将逐步淘汰 Chrome 浏览器对第三方 Cookie 的支持,然后计划推广其“隐私沙箱”技术。但这招致了广告发布商和广告技术公司的激励反对,称谷歌的“隐私沙箱”将限制他们收集网络用户信息的能力,从而影响他们提供更具价值广告的能力,而谷歌则可以利用该优势强化其竞争地位。英国反垄断部门认为谷歌保护用户隐私的努力,不能以减少竞争为代价。谷歌近日再次向英国反垄断部门 做出承诺,以解决一些剩余的担忧,并澄清其可以使用的数据的内部限制。谷歌表示,将确保“隐私沙箱”的开发方式适用于整个生态系统。如果这些承诺被接受,也将适用于全球其他地区。

老王点评:大家都在争抢用户的隐私,然而作为隐私的主人却对此没有发言权。

Discord 是一个流行的消息收发应用,可用于文字和语音信息传递。

它是一些社区的福音,可以帮助他们扩大项目,接触更多的人,并维持一个粉丝和关注者的社区。而 Discord 最初是为游戏玩家设计的,这很令人惊讶。

Discord 可用于各种平台,包括 Linux。在本教程中,我将引导你完成在 Fedora 中安装 Discord 的步骤。

  • 使用 DNF 和 RPM Fusion 仓库安装 Discord
  • 通过 Flatpak 安装Discord

Flatpak 软件包是沙盒的,因此需要更多的磁盘空间和时间来启动。然而,他们会相当快地更新到新的版本。

无论你想使用 Flatpak 还是 DNF,选择权在你手上。我将向你展示这两种方法。

非 FOSS 警报!

Discord 并不是开源的。但由于他们提供了一个 Linux 客户端,而且许多 Linux 用户都依赖它,所以我们会在这里介绍它。

方法 1:通过 RPM Fusion 仓库安装 Discord

Discord 可以通过添加非自由的 RPM Fusion 仓库来安装,这是大多数 Fedora 用户的首选方法,因为更新很容易,而且应用的启动速度比 Flatpak 版本快。

打开终端,使用下面的命令来添加 RPM-fusion 非自由仓库:

sudo dnf install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

完成后,更新仓库列表(应该不需要,但只是为了它):

sudo dnf update

然后通过 dnf 命令安装 Discord,像这样:

sudo dnf install discord

Installing Discord using DNF

如果被要求导入 GPG 密钥,只要按 Y 就可以授权了。

Authorize GPG key

这就完成了!现在你可以从应用菜单中启动 Discord。你的登录页面将看起来像这样:

Launch Discord application

通过 DNF 删除 Discord

如果你不想再使用 Discord,你可以从你的系统中删除它。要做到这一点,在终端运行以下命令:

sudo dnf remove discord

这真的很简单,不是吗?还有一种简单的安装 Discord 的方法,那就是使用 Flatpak 软件包。

方法 2:通过 Flatpak 安装 Discord

Discord 可以使用 Flatpak 轻松安装,因为它在 Fedora 中是默认可用的。

首先,你需要在 Fedora 中启用 Flatpak 仓库:

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

接下来,通过这个命令安装 Discord:

flatpak install discord

Install Discord via Flatpak

如果你想删除 Discord,那么只需运行:

flatpak remove discord

这就超级简单了。如果你在 Fedora Linux 上安装 Discord 需要任何帮助,请告诉我。


via: https://itsfoss.com/install-discord-fedora/

作者:Pranav Krishna 选题:lujun9972 译者:geekpi 校对:wxy

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

Endless OS 4.0 是一个长期支持版本,带有大量必要的改进,默认的应用程序以 Flatpak 包的形式提供。

Endless OS 是一个基于 Debian 的 Linux 发行版,重点捆绑提供几个重要的应用程序和资源,以帮助充分利用你的计算机,而不需要互联网连接。(LCTT 译注:因此,在互联网的“终点”之外也可使用。)

它主要是为教育和不能经常访问互联网的用户定制的。而如果你连接到互联网,也有一些工具可以帮助你浏览网页并与朋友/家人保持联系。

他们最新发布的 Endless OS 4.0 是一个长期支持的版本,带有一些改进。让我们简单了解一下。

Endless OS 4.0 的新内容

澄清一下,这是一个 LTS 版本,将被维护若干年(具体不清楚),即使是在 Endless OS 5.0 版本发布之后,它也会得到更新。

除了 LTS 的好处之外,其他变化还包括:

改进的应用程序网格导航

来源:Endlessos.org

在以前的版本中,列出的应用程序散落在多个页面之间。由于这个原因,用户可能不会注意到它们。

因此,在 Endless OS 4.0 中,增加了额外的箭头和图标,以突出多页面和应用程序网格的存在。你应该看到,如果你在桌面上切换页面,可以探索到更多的应用程序。

快速切换用户

在一个用户已经登录时,你现在有两种不同的方式来快速切换到另一个用户。

来源:Endlessos.org

传统上,你可以在用户菜单中找到它(和注销选项一起)。或者,你也可以使用新的多用户图标从锁屏上直接切换。

来源:Endlessos.org

新的默认墙纸

每当有重大的版本升级时,新的墙纸总是让人耳目一新。

如果你想在任何其他系统中尝试它们,你可以在 Unsplash 上找到列出的这些壁纸。

免驱动打印

你不再需要依靠讨厌的打印机驱动程序来检测连接的打印设备。有了 Endless OS 4.0,任何在本地网络中支持 互联网打印协议(IPP)的设备都可以自动检测并连接。

当你升级时,会删除任何已配置的打印机。然而,如果需要的话,你可以手动将它们添加回来。

其他改进措施

除了基本的变化之外,你还会发现更新的图形驱动、升级的 Linux 内核等等。其中一些包括:

  • Linux 内核 5.11
  • NVIDIA 驱动程序 460.91.03
  • 支持 8GB 版树莓派 4B
  • 一些默认的应用程序,如 Rythmbox,以 Flatpak 软件包的方式安装

你还会注意到,作为升级的一部分,移除了一些功能。关于全部细节,你可以参考 官方发布说明


via: https://news.itsfoss.com/endless-os-4-0-lts/

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

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

容器化软件包不是 Linux 应用的未来

应用开发者正在 逐渐转向容器化软件包,如 FlatpakSnapAppImageDockerSteam,这种打包格式运用容器技术将所需要的运行时库直接封装在应用内。但这导致占用非常多的磁盘空间和内存,启动时间也更慢。比如计算器应用 KCalc 的 AppImage 软件包高达 152 MB,Flatpak 软件包则需要下载 900 MB,而事实上 KCalc 应用本身只有 4.4 MB,其余都是系统上已安装了的冗余库。启动一个计算器应用你每次需要等待 7 秒钟。

老王点评:将所有依赖打包到一起,在特定用例下是必要的,但是如果推而广之,共享库的优良实践就荡然无存了。

Alpine Linux 砍掉 MIPS64 支持

在 Docker 基础镜像中广泛使用的 Alpine Linux 发布了 3.15 版本,支持最新的 5.15 LTS Linux 内核,但在此版本中放弃了对 MIPS64 架构的支持。发布公告 中说,“这个架构已经失效了,MIPS64 构建器已经消失了。我们没有办法再构建任何软件包,我们也不能再修复任何安全问题,所以让 MIPS64 正式退役是很谨慎的决定。”MIPS64 属于 RISC 架构,它的设计者 MIPS 公司几经周折。随后,它作为同属于 RISC 架构的 RISC-V 的一种开源替代方案来推广,但最终在今年早些时候被放弃,转而支持基于 RISC-V 本身的架构。

老王点评:随着 MIPS 被放弃,它所构建起来的生态也逐一崩塌。

英国出台法律禁止智能设备提供容易猜测的默认密码

英国政府在《产品安全和电信基础设施法案》中 增加了新的规定,禁止在智能设备上预装容易猜测的默认密码。所有的产品现在都需要独特的密码。对于违反此规定的厂商,它将有权对公司处以最高 1000 万英镑或其全球营业额 4% 的罚款,以及对持续违规行为每天处以最高 2 万英镑的罚款。其范围包括一系列设备,从智能手机、路由器、安全摄像机、游戏机、家庭扬声器和联网的白色家电和玩具。但不包括车辆、智能仪表和医疗设备。台式电脑和笔记本电脑也不在其管辖范围内。

老王点评:确实,有相当多的设备出于省心都采用的默认密码,这给被僵尸网络和入侵带来很大便利。