2023年5月

编程过程有时候就像一场与丧尸群之间的战斗。在这个系列文章中,我将带你了解怎样将 ZOMBIES 方法应用到实际工作中。

 title=

很久以前,在我还是一个萌新程序员的时候,我们曾经被分配一大批工作。我们每个人都被分配了一个编程任务,然后回到自己的小隔间里噼里啪啦地敲键盘。我记得团队里的成员在自己的小隔间里一呆就是几个小时,为打造无缺陷的程序而奋斗。当时流行的思想是:能一次性做得越多,能力越强。

对于我来说,能够长时间编写或者修改代码而不用中途停下来检验这些代码是否有效,就像荣誉勋章一样。那个时候我们都认为停下来检验代码是否工作是能力不足的表现,菜鸟才这么干。一个“真正的开发者”应该能一口气构建起整个程序,中途不用停下来检查任何东西!

然而事与愿违,当我停止在开发过程中测试自己的代码之后,来自现实的检验狠狠地打了我的脸。我的代码要么无法通过编译,要么构建失败,要么无法运行,或者不能按预期处理数据。我不得不在绝望中挣扎着解决这些烦人的问题。

避开丧尸群

如果你觉得旧的工作方式听起来很混乱,那是因为它确实是这样的。我们一次性处理所有的任务,在问题堆里左砍右杀,结果只是引出更多的问题。着就像是跟一大群丧尸间的战斗。

如今我们已经学会了避免一次性做太多的事情。在最初听到一些专家推崇避免大批量地开发的好处时,我觉得这很反直觉,但我已经从过去的犯错中吸取了教训。我使用被 James Grenning 称为 ZOMBIES 的方法来指导我的软件开发工作。

ZOMBIES 方法来救援!

ZOMBIES 表示以下首字母缩写:

  • Z – 最简场景(Zero)
  • O – 单元素场景(One)
  • M – 多元素场景(Many or more complex)
  • B – 边界行为(Boundary behaviors)
  • I – 接口定义(Interface definition)
  • E – 处理特殊行为(Exercise exceptional behavior)
  • S – 简单场景用简单的解决方案(Simple scenarios, simple solutions)

我将在本系列文章中对它们进行分析讲解。

最简场景

最简场景指可能出现的最简单的情况。

人们倾向于最开始的时候使用硬编码值,因为这是最简单的方式。通过在编码活动中使用硬编码值,可以快速构建出一个能即时反馈的解决方案。不需要几分钟,更不用几个小时,使用硬编码值让你能够马上与正在构建的系统进行交互。如果你喜欢这个交互,就朝这个方向继续做下去。如果你发现不喜欢这种交互,你可以很容易抛弃它,根本没有什么可损失。

本系列文章将以构建一个简易的购物系统的后端 API 为例进行介绍。该服务提供的 API 允许用户创建购物筐、向购物筐添加商品、从购物筐移除商品、计算商品总价。

首先,创建项目的基本结构(将购物程序的代码和测试代码分别放到 apptests 目录下)。我们的例子中使用开源的 xUnit 测试框架。

现在撸起你的袖子,在实践中了解最简场景吧!

[Fact]
public void NewlyCreatedBasketHas0Items() {    
    var expectedNoOfItems = 0;
    var actualNoOfItems = 1;
    Assert.Equal(expectedNoOfItems, actualNoOfItems);
}

这是一个伪测试,它测试的是硬编码值。新创建的购物筐是空的,所以购物筐中预期的商品数是 0。通过比较期望值和实际值是否相等,这个预期被表示成一个测试(或者称为断言)。

运行该测试,输出结果如下:

Starting test execution, please wait...

A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.57] tests.UnitTest1.NewlyCreatedBasketHas0Items [FAIL]
  X tests.UnitTest1.NewlyCreatedBasketHas0Items [4ms]
  Error Message:
   Assert.Equal() Failure
Expected: 0
Actual: 1
[...]

这个测试显然无法通过:期望商品数是 0,但是实际值被硬编码为了 1。

当然,你可以马上把硬编码的值从 1 改成 0,这样测试就能通过了:

[Fact]
public void NewlyCreatedBasketHas0Items() {
    var expectedNoOfItems = 0;
    var actualNoOfItems = 0;
    Assert.Equal(expectedNoOfItems, actualNoOfItems);
}

与预想的一样,运行测试,测试通过:

Starting test execution, please wait...

A total of 1 test files matched the specified pattern.

Test Run Successful.
Total tests: 1
     Passed: 1
 Total time: 1.0950 Seconds

你也许会认为执行一个被强迫失败的测试完全没有意义,但是不管一个测试多么简单,确保它的可失败性是绝对有必要的。只有这样才能够保证如果在后续工作中不小心破坏了程序的处理逻辑时该测试能够给你相应的警告。

现在停止伪造数据,将硬编码的值替换成从 API 中获取的值。我们已经构造了一个能够可靠地失败的测试,它期望一个空的购物筐中有 0 个商品,现在是时候编写一些应用程序代码了。

就跟常见的软件建模活动一样,我们先从构造一个简单的接口开始。在 app 目录下新建文件 IShoppingAPI.cs(习惯上接口名一般以大写 I 开头)。在该接口中声明一个名为 NoOfItems() 的方法,它以 int 类型返回商品的数量。下面是接口的代码:

using System;

namespace app {    
    public interface IShoppingAPI {
        int NoOfItems();
    }
}

当然这个接口什么事也做不了,在你需要实现它。在 app 目录下创建另一个文件 ShoppingAPI。在其中将 ShoppingAPI 声明为一个实现了 IShoppingAPI 的公有类。在类中定义方法 NoOfItems 返回整数 1:

using System;

namespace app {
    public class ShoppingAPI : IShoppingAPI {
        public int NoOfItems() {
            return 1;
        }
    }
}

从上面代码中你发现自己又在通过返回硬编码值 1 的方式来伪造代码逻辑。现阶段这是一件好事,因为你需要保持一切超级无敌简单。现在还不是仔细构想如何实现购物筐的处理逻辑时候。这些工作后续再做!到目前为止,你只是通过构建最简场景来检验自己是否满意现在的设计。

为了确定这一点,将硬编码值换成这个 API 在运行中收到请求时应该返回的值。你需要通过 using app; 声明来告诉测试你使用的购物逻辑代码在哪里。

接下来,你需要 实例化 instantiate IShoppingAPI 接口:

IShoppingAPI shoppingAPI = new ShoppingAPI();

这个实例用来发送请求并接收返回的值。

现在,代码变成了这样:

using System;
using Xunit;
using app;

namespace tests {
    public class ShoppingAPITests {
        IShoppingAPI shoppingAPI = [new][3] ShoppingAPI();
 
        [Fact]        
        public void NewlyCreatedBasketHas0Items() {
            var expectedNoOfItems = 0;
            var actualNoOfItems = shoppingAPI.NoOfItems();
            Assert.Equal(expectedNoOfItems, actualNoOfItems);
        }
    }
}

显然执行这个测试的结果是失败,因为你硬编码了一个错误的返回值(期望值是 0,但是返回的是 1)。

同样的,你也可以通过将硬编码的值从 1 改成 0 来让测试通过,但是现在做这个是在浪费时间。现在设计的接口已经跟测试关联上了,你剩下的职责就是编写代码实现预期的行为逻辑。

在编写应用程序代码时,你得决定用来表示购物筐得数据结构。为了保持设计的简单,尽量选择 C# 中表示集合的最简单类型。第一个想到的就是 ArrayList。它非常适合目前的使用场景——可以保存不定个数的元素,并且易于遍历访问。

因为 ArrayListSystem.Collections 包的一部分,在你的代码中需要声明:

using System.Collections;

然后 basket 的声明就变成这样了:

ArrayList basket = new ArrayList();

最后将 NoOfItems() 中的因编码值换成实际的代码:

public int NoOfItems() {
    return basket.Count;
}

这次测试能够通过了,因为最初购物筐是空的,basket.Count 返回 0。

这也是你的第一个最简场景测试要做的事情。

更多案例

目前的课后作业是处理一个丧尸,也就是第 0 个丧尸。在下一篇文章中,我将带你了解单元素场景和多元素场景。不要错过哦!

(题图:MJ/7917bc47-5325-4c0f-a2dd-4e444f57a46c)


via: https://opensource.com/article/21/2/development-guide

作者:Alex Bunardzic 选题:lujun9972 译者:toknow-gh 校对:wxy

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

“特性和错误多到无法列出” 的新文件系统准备进入内核主线

Bcachefs 是一个写时复制(CoW)的文件系统,其源自于 Linux 内核的块缓存 Bcache。本周二,Bcachefs 的补丁集已正式递交审查,有望被纳入内核。开发者希望能提供类似 XFS/EXT4 的性能,以及类似 Btrfs 和 ZFS 的特性。其主要开发者表示 Bcachefs 的特性“多到无法列出”,而已知错误也是“多到无法列出”。目前 Bcachefs 的快照支持被认为已经稳定,纠删编码接近稳定,可扩展性过去一年有了显著改进。

消息来源:Phoronix
老王点评:作者这样提交他的补丁集会不会被 Linus 喷一脸啊~

SSD 厂商称 2028 年硬盘将停止销售

一位 Pure Storage 的高管预测,由于电力成本和可用性,以及 NAND 闪存的每 TB 价格下降,2028 年后将不再出售硬盘驱动器。他认为,主要原因不是固态硬盘的成本下降和 DFM 低于磁盘的成本,尽管这也是一个因素。他说,“最终触发因素是电力。……我认为英国的电力最近已经上涨了近 5 倍。……当它们上升时,它们很少甚至永远不会下降”。当然,硬盘厂商是完全不同的看法,比如 2021 年,希捷就表示,SSD 肯定不会杀死 HDD。

消息来源:Blocks & Files
老王点评:大家现在是买硬盘多还是买固态盘多呢?

Rust 代码将首次出现在 Windows 11 Insider 预览版

根据 Azure CTO 的说法,最近的 Windows 11 Insider 预览版是第一个包含 Rust 的版本。之前,我们 报道 过,微软宣布“正在操作系统上使用 Rust 和其他结构”,而且这不仅仅是 Windows 内核。微软也正在将 Rust 引入其 Pluton 安全处理器。

消息来源:Thurrott
老王点评:看起来 Windows 要抢在 Linux 之前正式在内核中使用 Rust 了?

在本文中,我们将向你展示如何在 RHEL、Rocky Linux 或 AlmaLinux 上安装和配置 FreeIPA 客户端。

为了演示,我们在 RHEL 系统上集成了 FreeIPA 服务器,使用 FreeIPA 进行集中认证。

FreeIPA 服务器是一个开源的身份管理解决方案,为 Linux 系统提供集中的身份验证、授权和帐户信息。

先决条件

  • 已预装 RHEL 9/8 或 Rocky Linux 9/8 或 AlmaLinux 9/8
  • 具有 sudo 权限的普通用户
  • RHEL 系统的有效订阅。
  • 互联网连接

事不宜迟,让我们深入了解 FreeIPA 客户端安装和配置步骤,

1、在 FreeIPA 服务器上创建一个用户

登录到 FreeIPA 服务器并创建一个用户以进行集中身份验证,这里我使用以下命令使用创建了一个用户 opsadm

$ sudo kinit admin
$ sudo ipa user-add opsadm --first=Ops --last=Admin --password
Password:
Enter Password again to verify:
-------------------
Added user "opsadm"
-------------------
  User login: opsadm
  First name: Ops
  Last name: Admin
  Full name: Ops Admin
  Display name: Ops Admin
  Initials: OA
  Home directory: /home/opsadm
  GECOS: Ops Admin
  Login shell: /bin/bash
  Principal name: [email protected]
  Principal alias: [email protected]
  User password expiration: 20230502010113Z
  Email address: [email protected]
  UID: 464600004
  GID: 464600004
  Password: True
  Member of groups: ipausers
  Kerberos keys available: True
$

2、为 RHEL、Rocky Linux 或 AlmaLinux 添加 DNS 记录

下一步是为我们想要与 FreeIPA 服务器集成以集中身份验证的机器添加 DNS 记录。在 FreeIPA 服务器上,运行以下命令:

$ sudo ipa dnsrecord-add linuxtechi.lan rhel.linuxtechi.lan --a-rec 192.168.1.2

注意:在上述命令中替换为你自己的 IP 地址和主机名。

现在登录到 RHEL 客户端并在 /etc/hosts 文件中添加以下条目:

192.168.1.102 ipa.linuxtechi.lan ipa
192.168.1.2   rhel.linuxtechi.lan rhel

保存并退出文件。

3、在 RHEL、RockyLinux 和 AlmaLinux 上安装和配置 FreeIPA 客户端

FreeIPA 客户端及其依赖项在默认软件包仓库(AppStream 和 BaseOS)中可用,因此要安装 FreeIPA 客户端,请运行:

$ sudo dnf install freeipa-client -y

安装完成后,配置 FreeIPA 客户端,运行以下命令:

$ sudo ipa-client-install --hostname=`hostname -f` --mkhomedir --server=ipa.linuxtechi.lan --domain linuxtechi.lan  --realm LINUXTECHI.LAN

根据你的设置替换 FreeIPA 服务器的主机名、域名和领域。

输出:

完美,上面的输出确认 freeipa-client 命令已成功执行。要测试 FreeIPA 客户端集成,请从当前用户注销并尝试以我们在 IPA 服务器上创建的 opsadm 用户身份登录。

4、测试 FreeIPA 客户端

试着在你刚刚配置了 FreeIPA 客户端的 RHEL 系统上使用 opsadm 用户通过 SSH 登录。

$ ssh opsadm@<IPAddress-RHEL>

当我们第一次登录系统时,由于密码过期政策,它会提示你设置新密码。

修改密码后,再次尝试登录。这次你应该可以登录了。

很好,上面的输出确认我们可以使用 opsadm 用户登录。这确认 FreeIPA 客户端安装和配置成功。

以上就是这篇文章的全部内容,希望你发现它提供了丰富的信息,请在下面的评论部分中发表你的疑问和反馈。

(题图:MJ/583ee400-3bad-4036-a725-f9d2078d69ab)


via: https://www.linuxtechi.com/install-freeipa-client-on-rhel-rockylinux-almalinux/

作者:Pradeep Kumar 选题:lkxed 译者:geekpi 校对:wxy

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

受益于最新的 Ubuntu 发行版,赛昉科技的 RISC-V 开发板 VisionFive 2 的体验得以提高。

自树莓派和 Arduino 等问世以来,单板计算机(SBC)因其相对紧凑的体积和各种不同的处理能力水平,而受到越来越多创客和爱好者的青睐。

现在,Canonical 宣布,在世界上第一款具备 GPU 的高性能 RISC-V SBC 赛昉 VisionFive 2 上,已经可以运行 Ubuntu

让我们深入了解更多细节。

最新消息: 在 Canonical 公司 最近的一份声明 中,该公司公布了与 赛昉科技 合作的最新结果,这是一家专注于 RISC-V 软件和硬件 的中国高科技公司。

由此产生的结果是,其最新旗舰产品赛昉 VisionFive 2 可以运行 Ubuntu。这是一款由 RISC-V 驱动的 SBC,可实现强大的功能,而且还配备了一块 GPU,以支持 3D 任务。

赛昉 VisionFive 2

这将为 RISC-V SBC 计算打开新的渠道,用户可以在各种项目中实施它。

此外,由于有了 Ubuntu,即使是在企业使用情况下,也可以在大规模部署它。

对技术细节感兴趣吗?

VisionFive 2 由一颗 赛昉 JH7110 64 位 SoC 驱动,其中包含一颗 RISC-V RV64GC 处理器,最高可达 1.5 GHz 时钟速度。

你可以选择 2GB/4GB/8GB 内存变种。其具有一个用于存储的 TransFlash 卡槽,同时可以支持 HDMI 2.0MIPI-DSI 视频输出。

你可以在 此处 深入了解规格。

Canonical 的这项举措应该能够让更多的 SBC 爱好者轻松地切换到 Ubuntu,特别是在拥有如此强大的 RISC-V 驱动的 SBC 的情况下。

想要试一试吗?

你可以前往 Ubuntu 官方网站,获取专为 VisionFive 2 优化过 Ubuntu 23.04 预装镜像。

Ubuntu for RISC-V

? 看起来,我们可能需要将赛昉 VisionFive 2 添加到我们的 树莓派替代方案 列表中。你觉得怎样?

(题图:MJ/b9ad4ba4-d330-40ad-9502-8df6787c0d0e)


via: https://news.itsfoss.com/ubuntu-riscv-visionfive-2/

作者:Sourav Rudra 选题:lkxed 译者:ChatGPT 校对:wxy

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

Roblox 不但不支持 Linux,还屏蔽了 Wine

多人游戏 Roblox 没有 Linux 原生版本,但之前可以通过 Wine 在 Linux 上运行。不过其最新的反作弊软件专门屏蔽了 Wine 应用,以至于其在 Linux 上无法运行。该公司的员工在其官方论坛上对此表示,他们很多人想要支持 Linux,但支持 Linux 的成本太昂贵,Linux 桌面至今还不是一个已经证明了自己的游戏平台。而使用 Wine 用户运行它的用户太少,以至于留下让作弊者利用的口子就更不值得了。

消息来源:Gaming on Linux
老王点评:所以,微乎其微的 Linux 玩家就被彻底鄙视了。顺便说一句,Roblox 的服务器已经从 Windows 迁移到了 Linux。

谷歌宣布其下一代大语言模型 PaLM 2

在今天的谷歌 I/O 大会上,谷歌宣布了其下一代大语言模型 PaLM 2。谷歌称,PaLM 2 具有改进的多语言、推理和编码能力:它在 100 多种语言文本上进行了更多的训练,可以理解、生成和翻译细微差别的文本;其广泛数据集包括科学论文和包含数学表达的网页,改进了逻辑、常识推理和数学方面的能力;它还在大量公开可用的源代码数据集上进行了预训练,擅长 Python 和 JavaScript 等流行的编程语言。PaLM 2 有四种大小,这使得它很容易部署到各种使用案例中。谷歌还宣布了超过 25 种由 PaLM 2 支持的新产品和功能,同时将 Bard 扩展到了新的语言。

消息来源:谷歌
老王点评:究竟好不好,相信很快就会有人用它和 GPT-4 做比较了。

Meta 开源多感官人工智能模型

Meta 公司宣布了一个新的开源人工智能模型 ImageBind ,将多种数据流联系在一起,包括文本、音频、视觉数据、红外图像和运动读数。该模型目前只是一个研究项目,还没有直接的消费级或实际应用,但它指出了生成性人工智能系统的未来,可以创造沉浸式多感官体验。像 DALL-E、Midjourney 这样的人工智能图像生成器可以将文本与图像关联起来,从而生成图像。而 ImageBind 可以给人工智能更多的感官,从而产出更丰富的可能用例。

消息来源:The Verge
老王点评:坚定支持开源的 Meta AI,总之是先掀了桌子再说。

Ubuntu MATE 23.04 “Lunar Lobster” 已发布,让我们来了解一下这个以 MATE 桌面为特色的官方 Ubuntu 版本。

代号 “ 月球龙虾 Lunar Lobster ” 的 Ubuntu MATE 23.04 已于 2023 年 4 月 20 日发布。最新版本的 Ubuntu MATE 23.04 是 2023 年的第一个短期版本,将获得为期 9 个月的支持,直至 2024 年 1月。它是具有超轻量级 MATE 桌面的官方 Ubuntu 版本,它包含一些增强功能,对于那些想要 GNOME 的传统桌面外观的人来说值得考虑。

Ubuntu MATE 23.04 桌面

Ubuntu MATE 23.04:最佳功能

Ubuntu MATE 23.04 与它的前身 Ubuntu MATE 22.10 看起来可能没有太大区别,但也包含了一些明显的变化。

MATE 桌面和 Ayatana 指示器跳跃了一些版本,修复了一系列小错误,而 AI 生成的壁纸为桌面增添了一丝优雅。

此版本具有 MATE Desktop 1.26.1(但是,我没有在测试安装中看到这个次要版本),它带来了自 1.26 主要版本以来的一些更新。

也许你注意到的主要区别是 Flatpak 安装,它在 Ubuntu MATE 22.10 之前默认安装。从这个版本开始,Flatpak 不再默认安装,但如果你想使用它,你仍然可以安装它。我们在这里有一个专门的指南,介绍 如何安装 Flatpak。或者,你可以使用以下命令安装它:

sudo apt install flatpakflatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakreporeboot

在 Ubuntu MATE 22.10 中已经是默认安装的 PipeWire,已在 Ubuntu 中更新修订包。此外,此版本中包含的 LibreOffice 7.5 具有改进的 Writer 书签模块、Calc 电子表格中的新数字格式、Impress 中的新表格设计样式等等。默认网络浏览器是 Firefox 112 (Snap)。

默认文件管理器 Caja 已更新至 1.26.1,它是唯一获得小更新的应用。其余的仍然是他们以前的版本,如下所示:

  • Caja 文件管理器 1.26.1
  • 磁盘使用分析器 1.26.0
  • MATE 终端 1.26.0
  • Eye of MATE 1.26.0
  • MATE Tweak 工具 1.26.0

Caja 文件管理器 1.26.1

最新的 Ubuntu “Lunar Lobster” 版本用新的 基于 Flutter 的安装程序 替换了 Ubuntu 23.04 中的默认安装程序。但是 Ubuntu MATE 仍然使用旧的 Ubiquity 安装程序,以便为其用户群保持简单明了。

在核心方面,Ubuntu MATE 23.04 默认包含的 Linux 内核 6.2 改进了对 GPU、CPU、端口和 Rust 更新的支持。它增强了操作系统的性能和稳定性,确保为用户提供流畅可靠的体验。

遵循传统,Ubuntu MATE 有一些 AI 生成的“龙虾”主题壁纸,在桌面上看起来很棒!

Ubuntu MATE 23.04 中 AI 生成的壁纸之一

总的来说,Ubuntu MATE 23.04 是一个小更新,给用户带来的改进很少。它的简单性和用户友好性使其成为那些喜欢旧式 GNOME 桌面外观和感觉的人的不二之选。

你可以从 此页面 下载 Ubuntu MATE 23.04。

(题图:MJ/b8450f09-cc50-48a6-9799-234975e18625)


via: https://www.debugpoint.com/ubuntu-mate-23-04/

作者:Arindam 选题:lkxed 译者:geekpi 校对:wxy

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