硬核观察 #1061 华为有望克服美国禁令重返 5G 手机市场

Summary:
? 华为有望克服美国禁令重返 5G 手机市场
? 谷歌应用商店将允许在应用和游戏中使用 NFT
? 迪士尼和 Netflix 等反对 FTC 简化取消订阅流程的提议
»
»

华为死快点

# 硬核观察 #1061 华为有望克服美国禁令重返 5G 手机市场

### 华为有望克服美国禁令重返 5G 手机市场

三家覆盖中国智能手机行业的第三方技术研究公司告诉路透社，华为应该能够利用自身在半导体设计工具方面的进步，以及中芯国际的芯片制造，在中国国内采购 5G 芯片。关于半导体设计工具，我们几个月前在 [#951](/article-15661-1.html) 报道过，华为称已开发出自己的 14 纳米芯片设计套件。华为曾一度与苹果和三星争夺全球最大手机制造商的地位，直到 2019 年开始的一轮美国限制措施，切断了其获得生产最先进机型所必需的芯片制造工具的渠道。

>
> **[消息来源：路透社](https://www.reuters.com/technology/chinas-huawei-poised-overcome-us-ban-with-return-5g-phones-research-firms-2023-07-12/)**
>
>
>

>
> 老王点评：终于见到光明了，终究还是得自给自足才行。
>
>
>

### 谷歌应用商店将允许在应用和游戏中使用 NFT

谷歌今天宣布了一项重大的政策调整，允许开发者将 NFT 等数字资产纳入其商店中的应用和游戏。谷歌称，这将允许合作伙伴重新想象 “用户拥有内容的传统游戏”，并 “通过独特的 NFT 奖励提高用户忠诚度”。决定提供购买、出售或赚取代币化资产能力的公司将被要求明确说明应用程序中存在基于区块链的元素。

>
> **[消息来源：Coindesk](https://www.coindesk.com/web3/2023/07/12/google-play-changes-policy-on-tokenized-digital-assets-allowing-nfts-in-apps-and-games/)**
>
>
>

>
> 老王点评：似乎 NFT 热潮已经过去一段时间了，连元宇宙都没什么人提了。偏偏在这个时候，谷歌打开了大门。不太理解背后发生了什么。
>
>
>

### 迪士尼和 Netflix 等反对 FTC 简化取消订阅流程的提议

如今各种服务都在努力吸引用户订阅，但如果你想终止某个服务的订阅就不是那么容易了。美国联邦贸易委员会（FTC）宣布了被称为 “点击取消” 的提议，要求企业让取消服务和订阅一样简单。企业不能够让用户在网上订阅服务，但取消的操作却要通过电话来完成。也不能对于服务设定不取消就默认续订，而是企业需要每年提醒用户。包括迪士尼、派拉蒙、华纳兄弟、Netflix、索尼、环球影业等公司在内的行业组织对 FTC 的提议提出反对意见，认为拟议的法规过于模糊，会导致营销人员过度披露信息。它们甚至认为该提议会违反美国宪法第一修正案，侵犯其成员的“言论自由权”。

>
> **[消息来源：Business Insider](https://www.businessinsider.com/hollywood-streamers-oppose-ftc-proposal-regulation-click-to-cancel-subscription-2023-7)**
>
>
>

>
> 老王点评：这种上船容易下船难的做法，早就该管管了。为啥我就一直不喜欢订阅服务——虽然我最近增加了不少订阅服务，我甚至觉得有必要用个应用来专门管理订阅服务。
>
>
>


Linux 桌面的十个最佳光标主题

Summary: 一个用于各种 Linux 桌面的最佳光标主题的混合列表。

花哨

其实很多系统自带的 DMZ 主题就挺不错的（一般含在 dmz-cursor-theme 包之中），有黑、白两套主题。Pop 主题也不错（在 pop-icon-theme 包之中），在 DMZ Black 的基础上做了一些微调。另外，如果厌倦了箭头形状的指针主题，也可以试一试 bloom 主题（在 deepin-icon-theme 包之中），是独特的三角形指针，富有个性而不失简洁。

一个用于各种 Linux 桌面的最佳光标主题的混合列表。

# Linux 桌面的十个最佳光标主题

>
> 一个用于各种 Linux 桌面的最佳光标主题的混合列表。
>
>
>

在 [定制 Linux 桌面](https://www.debugpoint.com/category/themes) 时，我们经常忽视光标主题。一个经过深思熟虑选择的光标主题可以提升你的 Linux 桌面，增添个性化的风格并提升整体美感。从简约而精致的设计到奇妙而有趣的动画，这里是十个适合每个人的最佳光标主题。

### 如何在 Linux 桌面下载和安装光标主题

对于下面列出的所有主题，在相应页面上找到下载链接。下载压缩文件并解压缩。然后，将顶层的主题文件夹复制到 Linux 发行版中的 `~/.icons` 或 `/usr/share/icons` 目录中。然后按照下面的步骤进行相应桌面的设置。

#### Xfce

从应用菜单中选择 “<ruby> 设置 <rt>  Settings </rt></ruby> > <ruby> 设置管理 <rt>  Settings manager </rt></ruby> > <ruby> 鼠标和触摸板 <rt>  Mouse and Touchpad </rt></ruby>”。然后转到 “<ruby> 主题 <rt>  Themes </rt></ruby>” 选项卡并选择相应的光标主题。你还可以选择光标大小。

#### KDE Plasma

从 KDE 应用菜单打开 “<ruby> 系统设置 <rt>  System Settings </rt></ruby>”。然后选择 “<ruby> 工作空间主题 <rt>  Workspace theme </rt></ruby> > <ruby> 光标 <rt>  Cursors </rt></ruby>”。选择主题并点击 “<ruby> 应用 <rt>  Apply </rt></ruby>”。

#### GNOME

对于 GNOME 桌面，请安装 GNOME “<ruby> 调整 <rt>  Tweaks </rt></ruby>” 工具。你可以在基于 Debian 的系统上使用以下命令进行安装。

```
sudo apt install gnome-tweak-tool

```

安装后，你可以打开 GNOME 调整工具并选择 “<ruby> 外观 <rt>  Appearance </rt></ruby>”。然后从下拉菜单中选择光标。

### Linux 的最佳光标主题

#### Bibata

Bibata 是一套备受赞誉的光标主题，已成为寻求个性化体验的用户的最爱。这个主题因其独特的圆角外观和各种颜色选项而最近变得流行起来。

这个多功能主题有各种变体，包括 Bibata Original Amber 和 Bibata Modern Amber，分别具有带有黄色调的尖锐或圆角边缘。同样，Bibata Original Classic 和 Bibata Modern Classic 提供带有尖锐或圆角边缘的黑色光标。而 Bibata Original Ice 和 Bibata Modern Ice 提供带有尖锐或圆角边缘的白色光标。

你可以从下面的页面下载这个主题。

>
> **[下载 Bibata 光标（Ice）](https://www.gnome-look.org/p/1197198/)**
>
>
>

#### Phinger

Phinger 光标以其复杂的设计和精心的工程而闻名，是最复杂和“过度设计”的光标主题之一。它与 GNOME、MATE 和 Xfce 桌面环境兼容，并为不同 Linux 发行版的用户提供了多功能选项。该主题拥有黑白两种变体，确保简约而精致的光标体验。

你可以从下面的页面下载它，并按照上面给出的说明进行安装。

>
> **[下载 Phinger 光标](https://github.com/phisch/phinger-cursors)**
>
>
>

#### Comix

Comix 光标是个早期的光标主题，为你的 Linux 桌面注入了令人愉悦的漫画风格。这个 X11 鼠标主题包含 12 个独特的光标主题，每个主题都设计成在提升桌面工作流程的同时唤起一种活泼有趣的氛围。

Comix 光标提供了六种颜色选择（黑色、蓝色、绿色、橙色、红色和白色），为用户提供了一系列选择，以适应他们的个人风格和桌面美学。Comix 主题中的每个光标都具有微妙的阴影效果，为其注入活力和深度。这种动态元素增强了光标的视觉吸引力，并为桌面工作流程增添了一种动感。

你可以从下面的页面下载这个光标主题。

>
> **[下载 Comix 光标](https://www.gnome-look.org/p/999996)**
>
>
>

#### McMojave

McMojave 光标从 macOS 获得灵感，是一个 x-cursor 主题，它基于流行的 capitaine-cursors 主题。这个主题旨在重新创建在 macOS 中找到的熟悉的光标样式，让 Linux 用户在他们的桌面上享受一丝 Mac 的体验。

（LCTT 译注：x-cursor 是一种标准，用于描述和命名光标主题的文件格式和规范。x-cursor 主题通常用于 Linux 操作系统中的桌面环境，如 GNOME、KDE 和 Xfce。）

尽管 McMojave 光标旨在重现 macOS 的光标体验，但它也为喜欢添加个人特色的用户提供了自定义选项。用户可以根据自己的喜好进行调整和修改，从而在 Linux 上实现个性化的光标体验。

你可以从下面的页面下载 McMojave 光标。

>
> **[下载 McMojave 光标](https://github.com/vinceliuice/McMojave-cursors)**
>
>
>

#### Layan

Layan 光标是一个 x-cursor 主题，灵感来自受欢迎的 Layan GTK 主题，并融入了成熟的 capitaine-cursors 的元素。这个独特的光标主题给 Linux 桌面体验增添了一丝时髦感。

与传统的箭头形状光标不同，Layan 光标采用了独特的椭圆形状设计。这种非传统的形状为整体光标体验增添了一种活泼和时髦的元素，使它与更传统的主题有所区别。

你可以使用下面的链接进行下载。

>
> **[下载 Layan 光标](https://www.gnome-look.org/p/1365214/)**
>
>
>

#### Material

Material 光标是 Linux 用户长期以来的最爱，提供了一个视觉上吸引人的光标主题，得到了无数忠实用户的认可。该光标主题有三种颜色变体，即 Material（蓝灰）、Dark 和 Light，以及从 24 像素到 64 像素的多种尺寸选项，适应了各种偏好和桌面环境。

成千上万的人每天都依赖于这个光标主题，展示了它持久的吸引力和可靠性。

凭借其三种颜色变体、多样的尺寸选项和广泛的采用，这个光标主题旨在提升你 Linux 桌面的美学，提供令人愉悦和沉浸式的光标体验。

你可以使用下面的链接下载这个光标主题。

>
> **[下载 Material 光标](https://www.gnome-look.org/p/1346778/)**
>
>
>

#### Oreo

Oreo 光标以其丰富多彩的材质设计和迷人的动画为你的 Linux 桌面增添了令人愉悦的元素。这些光标旨在为你的光标体验增添一丝奇趣和个性。

Oreo 光标的独特之处在于其迷人的动画效果。这些动画光标注入了一种活泼和生动的元素，使你与桌面的交互感觉更具吸引力和愉悦感。

此外，这个主题通过提供自定义颜色生成器更进一步。用户可以使用配置文件创建自己的光标颜色方案，为光标设计带来无限的可能性和个性化。

你可以使用下面的链接下载这个主题。

>
> **[下载 Oreo 光标](https://www.gnome-look.org/p/1360254/)**
>
>
>

#### Bibata Rainbow

Bibata Rainbow 光标扩展自受欢迎的 Bibata 光标主题，引入了半动画的彩虹颜色，增强了你的 Linux 桌面体验。这些光标是使用 clickgen 精心制作，并用 puppeteer 渲染的，确保高质量的视觉效果和平滑的动画。

Bibata Rainbow 中的每个光标包含大约 23 个帧，即使在 HiDPI（高像素密度）环境下，也能实现平滑的动画效果。这确保了具有高分辨率显示屏的用户可以享受无缝和视觉上令人愉悦的光标体验。

你可以使用下面的链接下载 Bibata Rainbow 光标主题。

>
> **[下载 Bibata Rainbow 光标](https://www.gnome-look.org/p/1445634/)**
>
>
>

#### Miniature

Miniature 光标是从一个同名 Windows 光标主题移植的，它提供了一种以小尺寸为特点的独特光标体验。顾名思义，这些光标被设计成紧凑型，可能非常适合各种用途。该主题整体采用清晰的白色，并提供了一个扁平设计和一个带有微妙阴影效果的变体。

你可以从下面的链接下载这个光标主题。

>
> **[下载 Miniature 光标](https://github.com/nxll/miniature)**
>
>
>

#### Capitaine

Capitaine 光标是一个 x-cursor 主题，灵感来自 macOS，基于 KDE Breeze 图标包，提供了一种视觉上协调的光标体验。这个光标主题旨在与 La Capitaine 图标包完美配合，为你的 Linux 桌面创建一个统一的视觉风格。

Capitaine 光标提供了白色和黑色两种变体，让用户可以根据自己的桌面环境或个人偏好选择最合适的颜色。无论你喜欢浅色还是深色光标，Capitaine 光标都能满足你的需求。

你可以使用下面的链接下载这个主题。

>
> **[下载 Capitaine 光标](https://github.com/keeferrourke/capitaine-cursors)**
>
>
>

### 结论

在本文中，我们介绍了一些令人着迷的 Linux 光标主题，展示了一系列受欢迎的选择，可以改变你与桌面的交互方式。我希望你能找适合你 Linux 桌面上喜爱的主题或图标包的完美光标。

以上所有的光标主题都在最新的发行版和桌面版本中进行了测试。你可以尝试它们！

图片来源：各个主题作者。

*（题图：MJ/35aaca9e-9ff3-49f2-b311-20e7fcfb5c9d）*

---

via: <https://www.debugpoint.com/best-cursor-themes/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed/) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


构建成功的开源项目的重要建议

Summary: 使用这些步骤来为你的第一个或接下来的项目打下坚实的基础。

长知识了

使用这些步骤来为你的第一个或接下来的项目打下坚实的基础。

# 构建成功的开源项目的重要建议

>
> 使用这些步骤来为你的第一个或接下来的项目打下坚实的基础。
>
>
>

[开源](https://opensource.com/resources/what-open-source) 是一个蓬勃发展且有益的生态系统，它通过分散模式和社区贡献开发的软件，公开解决社区和行业问题。

随着这个生态系统的爆炸式发展，许多开发者想要参与并且构建新的开源项目。问题是：如何成功实现这一目标呢？

这篇文章将会揭秘开源项目的生命周期与结构。给你一个对开源项目内部运作的概述，并根据我个人的经验，向你展示如何构建一个成功和可持续发展的项目。

### 对开源的简单概述

<ruby>   开源促进会  <rt>  Open Source Initiative </rt></ruby>（OSI）提供了对“<ruby> 开源 <rt>  Open Source </rt></ruby>”的正式、详细的定义，但是维基百科提供了一个很好的总结：

>
> 开源软件是指根据许可证发布的计算机软件，版权持有人授予用户使用、研究、更改和向任何人、为了任何目的分发软件和它的源代码的权利。
>
>
>

开源软件通常在网络上有公开的代码，它由多人合作或一人开发。这就需要与来自不同地区、不同文化和不同技术背景的人合作，而且往往是远程合作。

### 开源项目的构成

就像人类的身体，一个开源项目由多个结构组成，这些结构构成了整个系统。我认为它们是两个分支：人员（微观）和文档（宏观）。

#### 分支一：人员

通常，一个开源项目包括以下人群：

* 创建者：创建项目的人
* 维护者：积极管理整个项目的人
* 贡献者：为项目做贡献的人（像你一样的人！）
* 用户：使用这个项目的人，包括开发者和非技术客户
* 工作组：将贡献者分成特定领域的小组，专注于围绕特定主题领域（如文档、指引、测试、DevOps、代码审查、性能、研究等）的集合。
* 赞助人：为项目提供资金支持的人

当你准备构建一个新项目时，你需要考虑以上列表中的每一个群组。你对他们每个人有什么计划？

* 对于维护者，请确定任用维护者的标准。通常，积极的贡献者就是最适合的维护者。
* 对于用户和贡献者，你需要准备可靠的文档、引导流程和他们使用你的项目取得成功所需的一切。
* 对于工作组，请确定你是否需要它们，以及你的项目将来如何有逻辑地拆分。
* 最后，对于赞助人，你必须提供足够的数据和有关你项目的信息，以便他们选择赞助你。

你不必在你项目的起始阶段解决上面所有问题。然而，在早期阶段思考它们是很明智的，这样你就能打下正确的基础，确保未来的扩建项目能够站稳脚跟并取得成功。

#### 分支二：文档

开源项目通常包括下列文档，通常为纯文本或 markdown 格式：

* 许可证（`License`）： 这份法律文件解释了如何以及在何种程度上可以自由使用、修改和共享本项目。OSI 网站上有 OSI 认可的许可证列表。如果没有明确的许可证，你的项目在法律上就不是开源的！
* 行为准则：该文件概述了任何决定以任何方式参与项目的人的规则、规范、可接受做法和责任（包括当有人违反任何规则时会发生什么）。[贡献者公约](https://www.contributor-covenant.org/version/2/1/code_of_conduct) 是一个很好的示例，它是开源的（采用知识共享许可协议）。
* 自述文件（`README`）：这个文件向新用户介绍你的项目。在很多 Git 托管网站上，比如 GitLab、GitHub 和 Codeberg，自述文件会显示在仓库的初始文件列表下。这里通常会提供文档，以及其他必要文档的链接。
* 文档（`Documentation`）：这是一个包含所有本项目文件资源的文件或目录，包括指南、API 参考、教程等。
* 贡献指南（`Contributing`）：包含一份说明如何为项目做出贡献的文件，包括安装指南、配置等。
* 安全（`Security`）：包括一个解释如何提交漏洞报告或安全问题的文件。

此外，一个项目通常有用于议题、支持和协作的网页。

大致包括：

* 议题或错误报告：用户可以报告错误的地方。该页面还为开发人员提供了一个地方，让他们可以分配自己的任务来修复一个或多个错误。
* 拉取或合并请求：提供功能增强建议和错误解决方案的地方。这些补丁可以由任何人创建，由维护者审核，然后合并到项目代码中。
* 讨论：维护者、贡献者和用户讨论开源项目的地方。它可以是一个专门的网站，也可以是协作编码网站中的一个论坛。

大多数项目还通过在线聊天的形式为社区成员之间的对话和互动提供交流渠道。

### 许可证

[许可证](https://opensource.com/tags/licensing) 也许是创建开源项前需要考虑的最简单但也是最重要的标准。许可证定义了允许使用、修改和共享项目源代码和其他组件的条款和条件。

许可证包含大量的法律术语，很多人并不完全理解。我使用 [choosealicense.com](https://choosealicense.com)，它可以帮助你根据你的目标社区、你从使用你的代码的人那里获得补丁的愿望，或者你允许别人使用你的代码而不分享他们对你的代码所做的改进来选择许可证。

这为何时使用 MIT 许可或 GNU GPLv3 许可提供了指导。它还建议为社区做出贡献的人们使用该社区所偏好的许可证。该图表还指出，还有更多许可证可供选择。网站 [choosealicense.com](http://choosealicense.com) 有一个基于文本的版本，可以链接到更详细的信息。

### 创建一个开源项目的 13 个阶段

现在是关键问题：如何开始开源软件项目？

以下是我所认为的开源项目的各个阶段。

1. 集思广益，撰写提纲，妥善记录。
2. 开始根据你的想法进行开发。这通常包括确定要使用的正确工具和技术栈、编写一些代码、对代码进行版本控制、调试、喝点咖啡、在 StackOverflow 上闲逛、使用其他开源项目、睡觉、构建一些东西来解决确定的问题 —— 或者只是为了好玩！
3. 在本地测试项目，根据需要编写一些单元测试和集成测试，根据需要设置 [CI/CD 管道](https://opensource.com/article/19/9/intro-building-cicd-pipelines-jenkins)，创建一个暂存分支（在合并到主分支之前测试代码的测试分支），并完成部署项目所需的其他工作。
4. 编写 [良好有效的文档](https://slides.com/bolajiayodeji/effective-oss-docs)。这应该包括你的项目是做什么的，为什么它是有用的，如何开始使用它（使用、安装、配置、贡献），以及人们在哪里可以得到支持。
5. 确保记录所有你希望使用的代码约定。使用诸如 <ruby> 代码检查工具 <rt>  Linter </rt></ruby>、代码格式化工具、Git 钩子和 <ruby> 注释规范化工具 <rt>  Commitizen </rt></ruby> 命令行工具等工具来执行这些约定。
6. 选择合适的许可证并创建自述文件。
7. 在互联网上发布项目（可能最初是一个私有的资源库，在这一步将其公开）。
8. 建立发布和记录更新日志的流程（你可以使用 Changesets 等工具）。
9. 向全世界推广项目！你可以在社交媒体上发帖、创办新闻简讯、私下与朋友分享、进行产品发布、现场直播或其他任何你知道的传统营销策略。
10. 使用任何可用的融资平台寻求资金支持，如 Open Collective、GitHub Sponsors、Patreon、Buy me a Coffee、LiberaPay 等。当你在这些平台上创建账户时，请在项目文档和网站中添加相关链接。
11. 围绕你的项目建立一个社区。
12. 在必要时，考虑引入工作组，将项目管理分成合理的部分。
13. 不断实施新理念，维持项目背后的资源和人员。

随着项目的进展，对项目的不同部分进行评估非常重要。这将为你提供可用于评估和未来发展战略的数据。

### 现在开始一个项目吧！

我希望这篇文章能帮助你推进你一直在考虑的项目。

你可以将其用作指南，并在构建你的一流开源软件项目时填补我遗漏的任何空白。

*（题图：MJ/a22b4011-9b1e-41e6-a73f-bdeac4858007）*

---

via: <https://opensource.com/article/22/9/build-open-source-project>

作者：[Bolaji Ayodeji](https://opensource.com/users/bolajiayodeji) 选题：[lkxed](https://github.com/lkxed) 译者：[wcjjdlhws](https://github.com/wcjjdlhws) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary:
? AlmaLinux 不再追求与 RHEL 的 1:1 兼容性
? 好莱坞想要永远免费得到龙套演员的人工智能复制品
? 2027 年欧盟销售的智能手机电池需要可更换
»
»

太好啦～<br />
手机模块化有戏啦

# 硬核观察 #1062 AlmaLinux 不再追求与 RHEL 的 1:1 兼容性

### AlmaLinux 不再追求与 RHEL 的 1:1 兼容性

随着红帽对 RHEL 源代码库的限制访问，虽然 Rocky Linux 已经表示 [找到](/article-15956-1.html) 了继续发布 1:1 克隆品的解决方案，但 AlmaLinux “决定放弃与 RHEL 1:1（兼容）的目标”。退而求其次，AlmaLinux 将在可能的范围内与 RHEL 保持一致并兼容应用二进制接口（ABI），这样在 RHEL 上运行的软件也可以在 AlmaLinux 上运行。对于典型的用户，这将意味着你在使用 AlmaLinux 时几乎不会有什么变化。最大的变化是，AlmaLinux 将不再与红帽保持 “问题级的兼容性”，现在可以接受红帽发布周期之外的问题修复。虽然这意味着一些 AlmaLinux 的用户可能会遇到 RHEL 中没有的问题，但 AlmaLinux 也可能会接受尚未被 RHEL 接受的补丁。

>
> **[消息来源：Almalinux](https://almalinux.org/blog/future-of-almalinux/)**
>
>
>

>
> 老王点评：这就是红帽的目的吧？最终这些精确克隆品的结果可能都这样吧。但是我很怀疑红帽以后还会给建立 ABI 兼容也制造“没必要提供的”麻烦。
>
>
>

### 好莱坞想要永远免费得到龙套演员的人工智能复制品

好莱坞的演员们将要举行一场罢工，主要的原因是好莱坞电影公司的一项以“保护演员的数字肖像权”为名义的人工智能提案。在该提案中，那些经常出现在背景中的龙套演员会被一次性扫描，而电影公司将拥有他们的扫描件、形象、肖像，并且能在他们想要的任何项目中永远使用，无需同意，无需补偿。使用生成式人工智能一直是双方谈判的主要症结之一。组织罢工的演员工会表示，“如果我们现在不站得高一点，我们都会有麻烦，我们都会面临被机器取代的危险。”

>
> **[消息来源：The Verge](https://www.theverge.com/2023/7/13/23794224/sag-aftra-actors-strike-ai-image-rights)**
>
>
>

>
> 老王点评：别说是龙套，就是主角和配角，将来都会全是 AI 制品，早晚而已。
>
>
>

### 2027 年欧盟销售的智能手机电池需要可更换

6 月中旬，欧洲议会投票通过新立法，要求智能手机等消费设备的电池必须易于拆卸和更换。本周，欧洲理事会正式同意了这项新法规。任何想要在欧盟销售手机的制造商必须确保这些手机在 2027 年之前拥有可更换电池。

>
> **[消息来源：Android Authority](https://www.androidauthority.com/phones-with-replaceable-batteries-2027-3345155/)**
>
>
>

>
> 老王点评：自从智能手机开始流行，不知道为什么大家就接受了电池不可更换的做法。现在，欧洲带了一个好头。
>
>
>

### 回音

* Bcachefs 在进入 Linux 6.5 受阻后，计划两个月 [再次尝试](https://www.phoronix.com/news/Bcachefs-Plans-For-Linux-6.6) 进入 Linux 6.6。


Bash 基础知识系列 #3：传递参数和接受用户输入

# Bash 基础知识系列 #3：传递参数和接受用户输入

>
> 在 Bash 基础系列的这一章中，学习如何向 Bash 脚本传递参数并使它们具有交互性。
>
>
>

来让 Bash 脚本有参数吧 ?

你可以通过向 Bash 脚本传递变量来使其更加有用和更具交互性。

让我通过示例详细向你展示这一点。

### 将参数传递给 Shell 脚本

当你运行 Shell 脚本时，你可以按以下方式向其中添加其他变量：

```
./my_script.sh var1 var2

```

在脚本内部，你可以使用 `$1` 作为第一个参数，`$2` 作为第二个参数，依此类推。

>
> ? `$0` 是一个特殊变量，保存正在执行的脚本的名称。
>
>
>

让我们通过一个实际的例子来看看。切换到保存练习 Bash 脚本的目录。

```
mkdir -p bash_scripts && cd bash_scripts

```

现在，创建一个名为 `arguments.sh` （我想不出更好的名称）的新 Shell 脚本，并向其中添加以下行：

```
#!/bin/bash

echo "Script name is: $0"
echo "First argument is: $1"
echo "Second argument is: $2"

```

保存文件并使其可执行。现在像往常一样运行脚本，但这次向其中添加任意两个字符串。你将看到屏幕上打印的详细信息。

>
> ? 参数由空格（空格、制表符）分隔。如果参数中有空格，请使用（英文）双引号将其引起来，否则它将被视为单独的参数。
>
>
>

>
> ? Bash 脚本最多支持 255 个参数。但对于参数 10 及以上，你必须使用花括号 `${10}`、`${11}`...`${n}`。
>
>
>

正如你所看到的，`$0` 代表脚本名称，而其余参数存储在编号变量中。你还可以在脚本中使用一些其他特殊变量。

| 特殊变量 | 变量描述 |
| --- | --- |
| `$0` | 脚本名称 |
| `$1`、`$2`、……`$9` | 脚本参数 |
| `${n}` | 脚本参数从 10 到 255 |
| `$#` | 参数数量 |
| `$@` | 所有参数 |
| `$$` | 当前 Shell 的进程 ID |
| `$!` | 最后执行的命令的进程 ID |
| `$?` | 最后执行命令的退出状态 |

>
> ?♀ 修改上面的脚本以显示参数数量。
>
>
>

#### 如果参数数量不匹配怎么办？

在上面的示例中，你为 Bash 脚本提供了两个参数并在脚本中使用了它们。

但是，如果你只提供一个参数或三个参数怎么办？

让我们实际做一下吧。

正如你在上面所看到的，当你提供的参数超出预期时，结果仍然是一样的。不使用其他参数，因此不会产生问题。

但是，当你提供的参数少于预期时，脚本将显示空白。如果脚本的一部分依赖于缺少的参数，这可能会出现问题。

### 接受用户输入并制作交互式 Bash 脚本

你还可以创建提示用户通过键盘提供输入的 Bash 脚本。这使你的脚本具有交互性。

`read` 命令提供了此功能。你可以这样使用它：

```
echo "Enter something"
read var

```

上面的 `echo` 命令不是必需的，但最终用户不会知道他们必须提供输入。然后用户在按回车键之前输入的所有内容都存储在 `var` 变量中。

你还可以显示提示消息并在单行中获取值，如下所示：

```
read -p "Enter something? " var

```

让我们看看它的实际效果。创建一个新的 `interactive.sh` Shell 脚本，内容如下：

```
#!/bin/bash

echo "What is your name, stranger?"
read name
read -p "What's your full name, $name? " full_name
echo "Welcome, $full_name"

```

在上面的示例中，我使用 `name` 变量来获取名称。然后我在提示中使用 `name` 变量，并在 `full_name` 变量中获取用户输入。我使用了两种使用 `read` 命令的方法。

现在，如果你授予执行权限，然后运行此脚本，你会注意到该脚本显示 `What is your name, stranger?`，然后等待你从键盘输入内容。你提供输入，然后它会显示 `What's your full name` 消息，并再次等待输入。

以下是供你参考的示例输出：

### ? 练习时间

是时候练习你所学到的东西了。尝试为以下场景编写简单的 Bash 脚本。

**练习 1**：编写一个带有三个参数的脚本。你必须使脚本以相反的顺序显示参数。

预期输出：

```
abhishek@itsfoss:~/bash_scripts$ ./reverse.sh ubuntu fedora arch
Arguments in reverse order:
arch fedora ubuntu

```

**练习 2**：编写一个脚本，显示传递给它的参数数量。

提示：使用特殊变量 `$#`。

预期输出：

```
abhishek@itsfoss:~/bash_scripts$ ./arguments.sh one and two and three
Total number of arguments: 5

```

**练习 3**：编写一个脚本，将文件名作为参数并显示其行号。

提示：使用 `wc` 命令来计算行号。

你可以在社区中讨论你的解决方案。

很好！ 现在你可以（传递）参数了 ? 在下一章中，你将学习在 Bash 中执行基本数学运算。

*（题图：MJ/5a75aa2f-1cb1-4009-a4e6-683cf61bc892）*

---

via: <https://itsfoss.com/bash-pass-arguments/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


10 分钟让你了解 Linux ABI

# 10 分钟让你了解 Linux ABI

>
> 熟悉 ABI 的概念、ABI 稳定性的重要性以及 Linux 稳定 ABI 中包含的内容。
>
>
>

>
> LCTT 译注：昨天，AlmaLinux 称将 [放弃](/article-16000-1.html) 对 RHEL 的 1:1 兼容性，但将保持对 RHEL 的 ABI 兼容，以便在 RHEL 上运行的软件可以无缝地运行在 AlmaLinux 上。可能有的同学对 ABI 的概念还不是很清楚，因此翻译此文供大家了解。
>
>
>

许多 Linux 爱好者都熟悉 Linus Torvalds 的 [著名告诫](https://lkml.org/lkml/2018/12/22/232)：“我们不破坏用户空间”，但可能并非每个听到这句话的人都清楚其含义。

这个“第一规则”提醒开发人员关于应用程序的二进制接口（ABI）的稳定性，该接口用于应用程序与内核之间的通信和配置。接下来的内容旨在使读者熟悉 ABI 的概念，阐述为什么 ABI 的稳定性很重要，并讨论 Linux 稳定 ABI 中包含了哪些内容。Linux 的持续增长和演进需要对 ABI 进行变更，其中一些变更引起了争议。

### 什么是 ABI？

ABI 表示 <ruby> 应用程序二进制接口 <rt>  Applications Binary Interface </rt></ruby>。理解 ABI 概念的一种方式是考虑它与其他概念的区别。对于许多开发人员来说，<ruby> 应用程序编程接口 <rt>  Applications Programming Interface </rt></ruby>（API）更为熟悉。通常，库的头文件和文档被认为是其 API，以及还有像 [HTML5](https://www.w3.org/TR/2014/REC-html5-20141028/) 这样的标准文档。调用库或交换字符串格式数据的程序必须遵守 API 中所描述的约定，否则可能得到意外的结果。

ABI 类似于 API，因为它们规定了命令的解释和二进制数据的交换方式。对于 C 程序，ABI 通常包括函数的返回类型和参数列表、结构体的布局，以及枚举类型的含义、顺序和范围。截至 2022 年，Linux 内核仍然几乎完全是 C 程序，因此必须遵守这些规范。

“[内核系统调用接口](https://www.kernel.org/doc/html/v6.0/admin-guide/abi-stable.html#the-kernel-syscall-interface)” 的描述可以在《[Linux 手册第 2 节](https://www.man7.org/linux/man-pages/dir_section_2.html)》中找到，并包括了可从中间件应用程序调用的类似 `mount` 和 `sync` 的 C 版本函数。这些函数的二进制布局是 Linux ABI 的第一个重要组成部分。对于问题 “Linux 的稳定 ABI 包括哪些内容？”，许多用户和开发人员的回答是 “sysfs（`/sys`）和 procfs（`/proc`）的内容”。而实际上，[官方 Linux ABI 文档](https://www.kernel.org/doc/html/v6.0/admin-guide/abi.html) 确实主要集中在这些 [虚拟文件系统](https://opensource.com/article/19/3/virtual-filesystems-linux) 上。

前面着重介绍了 Linux ABI 在程序中的应用方式，但未涵盖同等重要的人为因素。正如下图所示，ABI 的功能需要内核社区、C 编译器（如 [GCC](https://gcc.gnu.org/) 或 [clang](https://clang.llvm.org/get_started.html)）、创建用户空间 C 库（通常是 [glibc](https://www.gnu.org/software/libc/)）的开发人员，以及按照 [可执行与链接格式（ELF）](https://www.man7.org/linux/man-pages/man5/elf.5.html) 布局的二进制应用程序之间的合作努力。

### 为什么我们关注 ABI？

来自 Torvalds 本人的 Linux ABI 的稳定性保证，使得 Linux 发行版和个人用户能够独立更新内核，而不受操作系统的影响。

如果 Linux 没有稳定的 ABI，那么每次内核需要修补以解决安全问题时，操作系统的大部分甚至全部内容都需要重新安装。显然，二进制接口的稳定性是 Linux 的可用性和广泛采用的重要因素之一。

如上图所示，内核（在 `linux-libc-dev` 中）和 Glibc（在 `libc6-dev` 中）都提供了定义文件权限的位掩码。显然，这两个定义集必须一致！`apt` 软件包管理器会识别软件包提供每个文件。Glibc ABI 的潜在不稳定部分位于 `bits/` 目录中。

在大部分情况下，Linux ABI 的稳定性保证运作良好。按照 <ruby>   康韦定律  <rt>  Conway's Law </rt></ruby>，在开发过程中出现的烦人技术问题往往是由于不同软件开发社区之间的误解或分歧所致，而这些社区都为 Linux 做出了贡献。不同社区之间的接口可以通过 Linux 包管理器的元数据轻松地进行想象，如上图所示。

### Y2038：一个 ABI 破坏的例子

通过考虑当前正在进行的、[缓慢发生](https://www.phoronix.com/news/MTc2Mjg) 的 “Y2038” ABI 破坏的例子，可以更好地理解 Linux ABI。在 2038 年 1 月，32 位时间计数器将回滚到全零，就像较旧车辆的里程表一样。2038 年 1 月听起来还很遥远，但可以肯定的是，如今销售的许多物联网设备仍将处于运行状态。像今年安装的 [智能电表](https://www.lfenergy.org/projects/super-advanced-meter-sam/) 和 [智能停车系统](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7506899/) 这样的普通产品可能采用的是 32 位处理器架构，而且也可能不支持软件更新。

Linux 内核已经在内部转向使用 64 位的 `time_t` 不透明数据类型来表示更晚的时间点。这意味着像 `time()` 这样的系统调用在 64 位系统上已经变更了它们的函数签名。这些努力的艰难程度可以在内核头文件中（例如 [time\_types.h](https://github.com/torvalds/linux/blob/master/include/uapi/linux/time_types.h)）清楚地看到，在那里放着新的和 `_old` 版本的数据结构。

Glibc 项目也 [支持 64 位时间](https://www.phoronix.com/scan.php?page=news_item&px=Glibc-More-Y2038-Work)，那么就大功告成了，对吗？不幸的是，根据 [Debian 邮件列表中的讨论](https://groups.google.com/g/linux.debian.ports.arm/c/_KBFSz4YRZs) 来看，情况并非如此。发行版面临难以选择的问题，要么为 32 位系统提供所有二进制软件包的两个版本，要么为安装介质提供两个版本。在后一种情况下，32 位时间的用户将不得不重新编译其应用程序并重新安装。正如往常一样，专有应用程序才是一个真正的头疼问题。

### Linux 稳定 ABI 里到底包括什么内容？

理解稳定 ABI 有些微妙。需要考虑的是，尽管大部分 sysfs 是稳定 ABI，但调试接口肯定是不稳定的，因为它们将内核内部暴露给用户空间。Linus Torvalds 曾表示，“不要破坏用户空间”，通常情况下，他是指保护那些 “只想它能工作” 的普通用户，而不是系统程序员和内核工程师，后者应该能够阅读内核文档和源代码，以了解不同版本之间发生了什么变化。下图展示了这个区别。

普通用户不太可能与 Linux ABI 的不稳定部分进行交互，但系统程序员可能无意中这样做。除了 `/sys/kernel/debug` 以外，sysfs（`/sys`）和 procfs（`/proc`）的所有部分都是稳定的。

那么其他对用户空间可见的二进制接口如何呢，包括 `/dev` 中的设备文件、内核日志文件（可通过 `dmesg` 命令读取）、文件系统元数据或在内核的 “命令行” 中提供的 “引导参数”（在引导加载程序如 GRUB 或 u-boot 中可见）呢？当然，“这要视情况而定”。

### 挂载旧文件系统

除了 Linux 系统在引导过程中出现挂起之外，文件系统无法挂载是最令人失望的事情。如果文件系统位于付费客户的固态硬盘上，那么问题确实十分严重。当内核升级时，一个能够在旧内核版本下挂载的 Linux 文件系统应该仍然能够挂载，对吗？实际上，“这要视情况而定”。

在 2020 年，一位受到伤害的 Linux 开发人员在内核的邮件列表上 [抱怨道](https://lwn.net/ml/linux-kernel/20201006050306.GA8098@localhost/)：

>
> 内核已经接受这个作为一个有效的可挂载文件系统格式，没有任何错误或任何类型的警告，而且已经这样稳定地工作了多年……我一直普遍地以为，挂载现有的根文件系统属于内核<->用户空间或内核<->现有系统边界的范围，由内核接受并被现有用户空间成功使用的内容所定义，升级内核应该与现有用户空间和系统兼容。
>
>
>

但是有一个问题：这些无法挂载的文件系统是使用一种依赖于内核定义，但并未被内核使用的标志的专有工具创建的。该标志未出现在 Linux 的 API 头文件或 procfs/sysfs 中，而是一种 [实现细节](https://en.wikipedia.org/wiki/Encapsulation_(computer_programming))。因此，在用户空间代码中解释该标志意味着依赖于“[未定义行为](https://en.wikipedia.org/wiki/Undefined_behavior)”，这是个几乎会让每个软件开发人员都感到战栗的短语。当内核社区改进其内部测试并开始进行新的一致性检查时，“[man 2 mount](https://www.man7.org/linux/man-pages/man2/mount.2.html)” 系统调用突然开始拒绝具有专有格式的文件系统。由于该格式的创建者明确是一位软件开发人员，因此他未能得到内核文件系统维护者的同情。

### 线程化内核的 dmesg 日志

`/dev` 目录中的文件格式是否保证稳定或不稳定？[dmesg 命令](https://www.man7.org/linux/man-pages/man1/dmesg.1.html) 会从文件 `/dev/kmsg` 中读取内容。2018 年，一位开发人员 [为 dmesg 输出实现了线程化](https://lkml.org/lkml/2018/11/24/180)，使内核能够“在打印一系列 `printk()` 消息到控制台时，不会被中断和/或被其他线程的并发 `printk()` 干扰”。听起来很棒！通过在 `/dev/kmsg` 输出的每一行添加线程 ID，实现了线程化。密切关注的读者将意识到这个改动改变了 `/dev/kmsg` 的 ABI，这意味着解析该文件的应用程序也需要进行相应的修改。由于许多发行版没有编译启用新功能的内核，大多数使用 `/bin/dmesg` 的用户可能没有注意到这件事，但这个改动破坏了 [GDB 调试器](https://sourceware.org/gdb/current/onlinedocs/gdb/) 读取内核日志的能力。

确实，敏锐的读者会认为 GDB 的用户运气不佳，因为调试器是开发人员工具。实际上并非如此，因为需要更新以支持新的 `/dev/kmsg` 格式的代码位于内核自己的 Git 源代码库的 “树内” 部分。对于一个正常的项目来说，单个代码库内的程序无法协同工作就是一个明显的错误，因此已经合并了一份 [使 GDB 能够与线程化的 /dev/kmsg 一起工作的补丁](https://lore.kernel.org/all/20191011142500.2339-1-joel.colledge@linbit.com/)。

### 那么 BPF 程序呢？

[BPF](https://opensource.com/article/19/8/introduction-bpftrace) 是一种强大的工具，可以在运行的内核中监控甚至实时进行配置。BPF 最初的目的是通过允许系统管理员即时从命令行修改数据包过滤器，从而支持实时网络配置。[Alexei Starovoitov 和其他人极大地扩展了 BPF](https://lwn.net/Articles/740157/)，使其能够跟踪任意内核函数。跟踪明显是开发人员的领域，而不是普通用户，因此它显然不受任何 ABI 保证的约束（尽管 [bpf() 系统调用](https://www.man7.org/linux/man-pages/man2/bpf.2.html) 具有与其他系统调用相同的稳定性承诺）。另一方面，创建新功能的 BPF 程序为“[取代内核模块成为扩展内核的事实标准手段](https://lwn.net/Articles/909095/)”提供了可能性。内核模块使设备、文件系统、加密、网络等工作正常，因此明显是“只希望它工作”的普通用户所依赖的设施。问题是，与大多数开源内核模块不同，BPF 程序传统上不在内核源代码中。

2022 年春季，[一个提案](https://lwn.net/ml/ksummit-discuss/CAO-hwJJxCteD_BHZTeqQ1f7gWOHoj+05qP8bmFsRYVfMc_3FxQ@mail.gmail.com/) 成为了焦点，该提案提议使用微型 BPF 程序而不是设备驱动程序补丁，对广泛的人机接口设备（如鼠标和键盘）提供支持。

随后进行了一场激烈的讨论，但这个问题显然在 [Torvalds 在开源峰会上的评论](https://lwn.net/ml/ksummit-discuss/20220621110514.6ef174d0@rorschach.local.home/) 中得到解决：

>
> 他指出，如果你破坏了“普通（非内核开发人员）用户使用的真实用户空间工具”，那么你需要修复它，无论是否使用了 eBPF。
>
>
>

一致意见似乎正在形成，即希望其 BPF 程序在内核更新后仍能正常工作的开发人员 [将需要将其提交到内核源代码库中一个尚未指定的位置](https://lwn.net/ml/ksummit-discuss/20220616125128.68151432@gandalf.local.home/)。敬请关注后继发展，以了解内核社区对于 BPF 和 ABI 稳定性将采取什么样的政策。

### 结论

内核的 ABI 稳定性保证适用于 procfs、sysfs 和系统调用接口，但也存在重要的例外情况。当内核变更破坏了“树内”代码或用户空间应用程序时，通常会迅速回滚有问题的补丁。对于依赖内核实现细节的专有代码，尽管这些细节可以从用户空间访问，但它并没有受到保护，并且在出现问题时得到的同情有限。当像 Y2038 这样的问题无法避免 ABI 破坏时，会以尽可能慎重和系统化的方式进行过渡。而像 BPF 程序这样的新功能提出了关于 ABI 稳定性边界的尚未解答的问题。

### 致谢

感谢 [Akkana Peck](https://shallowsky.com/blog/)、[Sarah R. Newman](https://www.socallinuxexpo.org/scale/19x/presentations/live-patching-down-trenches-view) 和 [Luke S. Crawford](https://www.amazon.com/Book-Xen-Practical-System-Administrator/dp/1593271867) 对早期版本材料的有益评论。

*（题图：MJ/da788385-ca24-4be5-bc27-ad7e7ef75973）*

---

via: <https://opensource.com/article/22/12/linux-abi>

作者：[Alison Chaiken](https://opensource.com/users/chaiken) 选题：[lkxed](https://github.com/lkxed) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1063 互联网档案馆要求 GitHub 下架 DRM 去除工具

Summary:
? 互联网档案馆要求 GitHub 下架 DRM 去除工具
? Meta 公司将发布 LLaMA 的商业版本
? GTK 对 macOS 将降到“尽力而为”的状态
»
»

# 硬核观察 #1063 互联网档案馆要求 GitHub 下架 DRM 去除工具

### 互联网档案馆要求 GitHub 下架 DRM 去除工具

互联网档案馆向 GitHub 发出移除请求，要求移除一个名为 DeGouRou 的工具。这是一个专门用于规避行业标准图书馆 TPM 的工具，可以允许读者保存他们借阅的图书的无 DRM 副本。互联网档案馆和其他图书馆使用这些 TPM 允许读者借阅加密图书，阅读加密图书，并归还加密图书。值得注意的是，互联网档案馆并“没有得到版权所有者的授权”提交这份移除通知。GitHub 满足了它的要求，但随后该软件代码出现在了更多地方。

>
> **[消息来源：Torrent Freak](https://torrentfreak.com/internet-archive-targets-book-drm-removal-tool-with-dmca-takedown-230714/)**
>
>
>

>
> 老王点评：嗯，被出版商们揪着不放的互联网档案馆，抽出手来打击一下盗版工具。
>
>
>

### Meta 公司将发布 LLaMA 的商业版本

LLaMA 是 Meta 开源的大型语言模型（LLM），于今年 2 月公开发布，并提供给研究人员和学者使用，它有 70 亿、130 亿、330 亿和 650 亿等不同参数规模。开源的 LLaMA 中并没有包括其所使用的权重数据，但很快这些权重数据被“意外”泄露，并迅速引爆了一系列基于它的开源创新。尽管开源人工智能模型已经存在，但 Meta 的 LLaMA 商业化仍是重要的一步，因为它比市场上现有的许多开源 LLM 都要大，而且它来自全球最大的科技公司之一。

>
> **[消息来源：ZDNet](https://www.zdnet.com/article/meta-to-release-open-source-commercial-ai-model-to-compete-with-openai-and-google/)**
>
>
>

>
> 老王点评：先开源培养生态，然后再基于此推出商业版本，这是一步好棋。
>
>
>

### GTK 对 macOS 的支持将降到“尽力而为”的状态

GNOME 的开发者们正在考虑是否退役 macOS 上的 GLib 和 GTK 持续集成（CI）构建工具。除了 CI 硬件老化之外，CI 维护者对 macOS 也没有太多经验，而 GTK/GLib 开发者对 macOS 开发也不是特别感兴趣或熟悉。如果没有志愿者站出来处理 macOS 特定的回归问题，macOS CI 生成器可能会被逐步淘汰，反过来 GTK/GLib macOS 支持会降到“尽力而为”的状态，并依靠下游打包者和消费者来测试更改。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/GTK-macOS-Back-Seat)**
>
>
>

>
> 老王点评：毕竟苹果公司不感兴趣，用户也寥寥无几，开发者自然也没有足够的动力和支持来进行。不过，还是有几个可以在 macOS 上运行的不错的 GNOME 软件的。
>
>
>


Terminator：适用于 Linux 专业人员的平铺终端仿真器

Summary: 你可能已经看到一些同事或 UP 主们在一个终端窗口中运行多个终端会话。

你可能已经看到一些同事或 UP 主们在一个终端窗口中运行多个终端会话。

# Terminator：适用于 Linux 专业人员的平铺终端仿真器

>
> 你可能已经看到一些同事或 UP 主们在一个终端窗口中运行多个终端会话。
>
>
>

一些专业的 Linux 用户会使用 `screen` 或 [tmux 命令](https://linuxhandbook.com/tmux/) 来分割多个窗格。这些命令可以在任何终端应用程序中使用，但需要较大的学习曲线。

如果你想要在同一应用窗口中拥有多个终端会话而不涉及 `tmux` 或 [screen 命令](https://linuxhandbook.com/screen-command/) 的复杂性，“终结者” 是你的好帮手。

不，我指的不是那个“终结者”。是这个 ?

你的系统上安装的 [终端仿真器](https://itsfoss.com/linux-terminal-emulators/) 可能具有多标签支持。而 Terminator 支持多个可调整大小的终端面板。

它模拟了类似平铺窗口管理器的功能，并将终端面板平铺在单个窗口中。

在本文中，我将向你展示如何在 Ubuntu 和其他 Linux 发行版中安装和使用 Terminator。

但在此之前，让我们快速了解一下 Terminator 提供的功能。

### Terminator 可在同一窗口中提供多个终端会话

[Terminator](https://github.com/gnome-terminator/terminator) 是一个基于 GNOME 终端的 GTK 应用程序，使用了 VTE3（GTK3 虚拟终端仿真器小部件）。

作为一个基于 GNOME 终端的应用程序，它与 GNOME 桌面环境相关联，因此有一些依赖性。

然而，即使有 GNOME 的依赖性，我发现该应用程序相对轻巧。可能在其他桌面环境中使用它不会成为问题。

从外表上看，Terminator 可能与其他终端仿真器相似。但是，Terminator 具有无限可能性，我将在后面的章节中向你展示它们。

#### 功能特点

让我总结一下 Terminator 的一些主要功能：

* 平铺布局的终端
* 支持多个标签页
* 拖拽终端面板（出色的鼠标支持）
* 类似于平铺窗口管理器的键盘快捷键
* 可以保存布局和配置文件，以便快速启动
* 通过插件可扩展功能

### 安装 Terminator

安装 Terminator 就像安装其它软件包一样简单，因为它在你能想到的所有主流发行版的官方软件源中都可用。

为了方便起见，我在下面列出了一些主要发行版的命令。

对于基于 Ubuntu 和 Debian 的发行版，请执行以下命令安装 Terminator：

```
sudo apt install terminator

```

对于基于 Fedora 和红帽的发行版，请使用以下命令：

```
sudo dnf install terminator

```

对于基于 Arch 和 Manjaro 的发行版，请执行以下命令更新并安装 Terminator：

```
sudo pacman -Syu terminator

```

注意：某些长期支持版本的发行版软件源中可能没有最新版本的 Terminator。

你还可以使用发行版提供的图形包管理器来安装 Terminator。但是，通过图形界面安装终端仿真器是无趣的。

### 使用 Terminator

当你启动 Terminator 时，默认窗口看起来就像一个简单的终端窗口。但是，经过一些耐心，它可以在一个窗口内像平铺窗口管理器一样工作。

Terminator 允许你使用鼠标通过水平和垂直分割来创建新的面板。

然而，使用键盘快捷键会更快。你需要一些时间来适应这些键，但最终你会掌握它们的。

在这里，我在第一个面板中打开了 [htop](https://itsfoss.com/use-htop/)，如下图所示。

要在右侧创建一个新的终端面板，只需按下 `Ctrl + Shift + e` 快捷键。其次，我在右侧面板中使用了 [neofetch](https://itsfoss.com/using-neofetch/)，如下图所示。

最后，我使用 `Ctrl + Shift + o` 快捷键在带有 `neofetch` 的面板下方创建了另一个面板，并在此处启动了 `cmatrix`。这是其中一个无用但 [有趣的 Linux 命令](https://itsfoss.com/funny-linux-commands/)。

上面是在本指导中完成的操作的最终屏幕截图。现在你明白我为什么说 Terminator 在一个窗口中创建了类似平铺窗口管理器的环境了吧。

如果你需要在不安装平铺窗口管理器的情况下打开多个终端，这种平铺功能将非常方便。Terminator 也支持标签页，但我认为平铺功能是该应用程序的特点。

Terminator 是少数几个配有出色文档的应用程序之一。如果你需要更多信息，请参阅其 [文档](https://gnome-terminator.readthedocs.io/en/latest/)。

### 结论

我相信所有终端仿真器都支持标签页界面。但是，当你需要同时关注多个会话时，必须在标签之间切换并不方便。

Terminator 可能不像 [Blackbox](https://itsfoss.com/blackbox-terminal/) 或 [GNOME Console](https://itsfoss.com/gnome-console/) 那样好看。但它拥有老练的 Linux 用户喜爱的功能。

它提供的功能可能并不是每个 Linux 用户都需要或想要的。我将把决定权交给你，你来决定它是否值得你投入时间。

*（题图：MJ/0b403aa1-810a-4f9f-9e52-1d42d8fe2b6a）*

---

via: <https://itsfoss.com/terminator/>

作者：[Anuj Sharma](https://itsfoss.com/author/anuj/) 选题：[lkxed](https://github.com/lkxed) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1064 CentOS 项目发出一篇奇怪的博文

Summary:
? CentOS 项目发出一篇奇怪的博文
? 利用微软证书签发的恶意驱动多达数千个
? 印度开发商解雇 90% 的技术支持团队，将工作外包给人工智能
»
»

国内前几年就开始用机器人客服了，虽然不是人工智能，无论是电话还是在线支持或售后，很多人甚至不知道自己在跟机器人对话。

来自广东汕头的 Chrome Mobile 108.0|Android 12 用户

最烦AI客服了，最后都是死等人工，真的烦

可能他们的这个人工智能客服真的比较智能。

# 硬核观察 #1064 CentOS 项目发出一篇奇怪的博文

### CentOS 项目发出一篇奇怪的博文

最近，在红帽限制其 RHEL 源代码的访问之后，整个社区围绕这件事发生了很多事情。周五，CentOS 项目董事会发出了一篇模糊不清的简短博文，文中称，“发展社区并让人们更容易做出贡献是成功的关键因素。我们对与 CentOS 项目合作的兴趣感到兴奋。”并说他们今年以来一直在制定一套指导方针，“以帮助定义 CentOS 及其交付成果的成功含义”，还表达了对新贡献者的欢迎。除了这篇模糊不清的博文外，未见到进一步的明确信息。

>
> **[消息来源：CentOS](https://blog.centos.org/2023/07/open-to-all/)**
>
>
>

>
> 老王点评：CentOS 项目还活着？要不是这篇博文，我以为他们已经不存在了呢。这算是对社区的抗议的反击吗？
>
>
>

### 利用微软证书签发的恶意驱动多达数千个

微软本周早些时候警告称，Windows 硬件开发者计划认证的一些驱动程序正在被恶意利用。为了应对恶意驱动程序的威胁，从 Windows Vista 64 位开始，微软开始要求内核模式驱动程序使用经过验证的证书颁发机构颁发的证书进行数字签名。不过，也有例外情况，使用过期证书或 2015 年 7 月 29 日之前签发的证书签署的驱动程序，也被认为是合法的驱动。已经有多种利用这一漏洞的开源工具出现。思科称，他们观察到多个威胁行为者利用这一政策漏洞部署了数千个恶意签名驱动程序。作为回应，微软阻止了所有这些证书。

>
> **[消息来源：E-Security Planet](https://www.esecurityplanet.com/threats/malicious-microsoft-drivers/)**
>
>
>

>
> 老王点评：为了照顾临时性的特例，而开的一个“后门”，终究会引来更多麻烦。
>
>
>

### 印度开发商解雇 90% 的技术支持团队，将工作外包给人工智能

一家印度软件开发商初创公司难以负担其客户支持团队的费用，于是将其外包给一个人工智能聊天机器人，后者显然更高效、更便宜。他们反映，改用机器人服务后，首次响应时间从 1 分 44 秒降至 0 秒。解决时间也急剧下降，从人工服务时的 2 小时 13 分钟下降到人工智能服务时的 3 分 12 秒。总体客户支持成本下降了约 85%。

>
> **[消息来源：The Register](https://www.theregister.com/2023/07/13/dukaan_ai_support_replacement/)**
>
>
>

>
> 老王点评：尽管印度一直被视为廉价 IT 人才的来源，也是很多公司的全球客户支持中心，但是看起来，人工智能更便宜、更好用。
>
>
>


Bash 基础知识系列 #4：算术运算

Summary: 在本系列的第四章，学习在 Bash 中使用基本数学运算。

在本系列的第四章，学习在 Bash 中使用基本数学运算。

# Bash 基础知识系列 #4：算术运算

>
> 在本系列的第四章，学习在 Bash 中使用基本数学运算。
>
>
>

你可以使用 Bash 脚本做很多事情。对变量执行简单的算术运算就是其中之一。

Bash shell 中算术运算的语法如下：

```
$((arithmetic_operation))

```

假设你必须计算两个变量的总和。你这样做：

```
sum=$(($num1 + $num2))

```

`(())` 内空格的使用没有限制。你可以使用 `$(( $num1+ $num2))`、`$(( $num1+ $num2 ))` 或者 `$(( $num1+ $num2 ))`。它们都一样。

在通过示例详细讨论之前，我先分享一下它支持的算术运算符。

### Bash 中的基本算术运算符

以下是 Bash shell 中算术运算符的列表。

| 运算符 | 描述 |
| --- | --- |
| `+` | 加法 |
| `-` | 减法 |
| `*` | 乘法 |
| `/` | 整数除法（不带小数） |
| `%` | 模除法（仅余数） |
| `**` | 求幂（a 的 b 次方） |

>
> ? Bash 不支持浮点数（小数）。你必须使用其他命令（例如 `bc`）来处理它们。
>
>
>

### Bash 中的加法和减法

让我们通过编写一个脚本来看看它，该脚本从用户那里获取两个数字，然后打印它们的总和和减法。

```
#!/bin/bash

read -p "Enter first number: " num1
read -p "Enter second number: " num2

sum=$(($num1+$num2))
sub=$(($num1-$num2))
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"

```

我相信你熟悉上一章中使用 `read` 命令来 [在 Bash 中接受用户输入](https://itsfoss.com/bash-pass-arguments/)。

你应该关注这两行：

```
sum=$(($num1+$num2))
sub=$(($num1-$num2))

```

将此脚本保存为 `sum.sh` 并运行它。给它一些输入并检查结果。

### Bash 中的乘法

现在让我们转向乘法。

这是一个将公里转换为米的示例脚本（这给美国读者带来了麻烦 ?）。作为参考，1 公里等于 1000 米。

```
#!/bin/bash

read -p "Enter distance in kilometers: " km
meters=$(($km*1000))

echo "$km KM equals to $meters meters"

```

将脚本保存为 `multi.sh`，赋予其执行权限并运行它。这是一个示例输出：

看起来不错，不是吗？ 让我们继续进行除法。

### Bash 脚本中的除法

让我们用一个非常简单的脚本来看看除法：

```
#!/bin/bash

num1=50
num2=5

result=$(($num1/$num2))

echo "The result is $result"

```

你很容易猜到结果：

```
The result is 10

```

没关系。但是让我们更改数字并尝试将 50 除以 6。结果如下：

```
The result is 8

```

**但这不正确。** 正确答案应该是 8.33333。

这是因为 Bash 默认情况下只处理整数。你需要额外的命令行工具来处理浮点（小数）。

最流行的工具是 [bc](https://www.gnu.org/software/bc/manual/html_mono/bc.html)，它是一种处理数学运算的非常强大的计算器语言。不过，你现在不需要关注细节。

你必须通过管道将算术运算“回显”给 `bc`：

```
echo "$num1/$num2" | bc -l

```

于是，将之前的脚本修改为：

```
#!/bin/bash

num1=50
num2=6

result=$(echo "$num1/$num2" | bc -l)

echo "The result is $result"

```

现在你得到结果：

```
The result is 8.33333333333333333333

```

请注意 `result=$(echo "$num1/$num2" | bc -l)`，它现在使用你在 [本系列第 2 章](https://itsfoss.com/bash-use-variables/) 中看到的命令替换。

`-l` 选项加载标准数学库。默认情况下，`bc` 最多保留 20 位小数。你可以通过以下方式将比例更改为较小的位数：

```
result=$(echo "scale=3; $num1/$num2" | bc -l)

```

让我们看看 Bash 中浮点的更多示例。

### 在 Bash 脚本中处理浮点

让我们修改 `sum.sh` 脚本来处理浮点。

```
#!/bin/bash

read -p "Enter first number: " num1
read -p "Enter second number: " num2

sum=$( echo "$num1+$num2" | bc -l)
sub=$( echo "scale=2; $num1-$num2" | bc -l)
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"

```

现在尝试运行它，看看是否可以正确处理浮点：

### ?? 练习时间

是时候一起做一些数学和 Bash 练习了。

**练习 1**：创建一个脚本，接受以 GB 为单位的输入并以 MB 和 KB 为单位输出其等效值。

**练习 2**：编写一个带有两个参数并以指数格式输出结果的脚本。因此，如果输入 2 和 3，输出将为 8，即 2 的 3 次方。

**提示**：使用幂运算符 `**`。

**练习 3**：编写一个将摄氏度转换为华氏度的脚本。

**提示**：使用公式 F = C x (9/5) + 32。你必须在此处使用 `bc` 命令。

你可以在社区中讨论练习及其方案。

在下一章中，你将 [了解 Bash 中的数组](https://itsfoss.com/bash-arrays/)。敬请关注。

*（题图：MJ/8a9dfb90-99a4-4203-bc44-d805d09bc16f）*

---

via: <https://itsfoss.com/bash-arithmetic-operation/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


7 个最佳的开源基于 Web 的电子邮件客户端

Summary: 无论是企业还是个人，自托管的开源 Web 邮件服务始终是值得考虑的选项。

看标题还以为是真的客户端

来自广东广州的 Chrome Mobile 108.0|Android 12 用户

webmail 就是基于 Web 的邮件客户端啊。

我的意思是这个标题不太合适，可能会让读者以为是“标题党”，我以为是通用的邮件客户端，而本文讲的是可以自建的开源Web邮件前端。最终用户一般不会直接使用，它们都是邮件服务商提供的。

无论是企业还是个人，自托管的开源 Web 邮件服务始终是值得考虑的选项。

# 7 个最佳的开源基于 Web 的电子邮件客户端

电子邮件服务将会一直存在，即便去中心化技术会接管互联网。

然而，随着大型科技公司试图控制新兴技术的方方面面，你如何掌控自己的电子邮件服务呢？

无论是企业还是个人，自托管的开源 Web 邮件服务始终是值得考虑的选项。你自己的服务器、你自己的数字基础架构，上面搭上你自己的电子邮件服务平台。这样，你就无需依赖供应商或第三方来管理你的电子邮件服务。你可以按照自己的方式办事。

### 为什么应该自托管电子邮件服务？

自托管一个可用作基于 Web 的电子邮件客户端或与电子邮件应用程序同步的服务，这不是点击一下就完成的过程。

那么，为什么要这么费事呢？难道你不能使用一些诸如 [Proton Mail](https://itsfoss.com/recommends/protonmail) 和 Tutanota 之类的 [注重隐私的最佳电子邮件服务](https://itsfoss.com/secure-private-email-services/) 吗？

当然可以。

但是对于企业来说，自托管 Web 邮件的一些优势包括：

* 用户可以完全掌控电子邮件数据。
* 你可以自己构建符合电子邮件服务要求的基础设施。
* 它为个人、小型企业和企业提供了可扩展性。
* 你可以创建无限数量的电子邮件帐户和邮件别名。
* 用户可以轻松应用高级过滤器和其他保护机制，无需付费订阅。

在这里，我列出了一些你可以选择的最佳选项。

### 1、Roundcube

主要亮点：

* 适合桌面使用
* 持续维护
* 大多数服务器托管提供商都提供
* 可自定义的用户界面
* PGP 加密

Roundcube 是一款流行的基于 PHP 的 Webmail 软件，提供简单的用户界面和所有基本功能。

大多数服务器托管提供商都已预安装它。你只需为你的域名配置它或创建电子邮件帐户即可开始使用。

你还可以在自己的服务器上安装并自定义它。

>
> **[Roundcube](https://roundcube.net)**
>
>
>

### 2、Cypht

主要亮点：

* 轻量级
* 模块化

Cypht 是一种不错的 Webmail 解决方案，提供多个电子邮件帐户的综合视图。

它采用了模块化的方法，可以轻松通过插件为你的体验添加功能。

与其他解决方案不同，你还可以使用它添加 RSS 订阅，将其用作新闻阅读器。

>
> **[Cypht](https://cypht.org/index.html)**
>
>
>

### 3、Squirrelmail

主要亮点：

* 轻量级
* 稳定
* 支持 PGP 加密插件

Squirrelmail 是一款经典的基于 PHP 的、支持 IMAP 和 SMTP 协议的 Webmail 软件。它功能不算多，但如果你需要一个轻量级和稳定的 Webmail 软件来托管，它能满足基本需求。

尽管外观简单，但它已经存在很长时间，并具备一些功能，如通讯录、文件夹操作和 MIME 支持。

大多数 Web 托管提供商都已经预装了 Squirrelmail。

>
> **[Squirrelmail](https://www.squirrelmail.org/)**
>
>
>

### 4、Rainloop

主要亮点：

* 无需数据库
* 简单用户界面
* 轻量级

Rainloop 是一款简单的电子邮件解决方案，支持 IMAP 和 SMTP 协议。

它还支持 OpenPGP 加密。与其他一些解决方案不同，它不需要数据库。直接访问邮件服务器，无需在 Web 服务器上存储任何内容。

由于支持插件，你可以扩展某些功能。

>
> **[Rainloop](https://www.rainloop.net)**
>
>
>

### 5、Horde

主要亮点：

* 预装于 Web 托管提供商
* 简单而功能丰富

Horde 是一款开源的群件 Webmail 软件，预装于各种 Web 服务器托管提供商。它支持 IMAP。

我通常使用 Horde 来访问我的域名下的 Webmail，从未让我失望过。它提供了简单而高效的用户界面和许多基本功能。

与其他软件类似，它基于 PHP 框架，开发人员可以轻松使用。

>
> **[Horde](https://www.horde.org)**
>
>
>

### 6、SOGo

主要亮点：

* Material Design 用户界面
* 支持 Outlook
* 提供在线演示

SOGo 是一款现代化的开源解决方案，采用了谷歌的 Material Design 用户界面和其电子邮件服务器。

它包括支持日历和通讯录，并提供友好的基于 AJAX 的 Web 界面。

你还可以获得对微软 Outlook 和 ActiveSync 的支持，这使你可以无缝同步电子邮件、联系人、事件和任务。你可以通过在线演示进行尝试。如果令人满意，你可以下载它到你的服务器上使用。

在其 [GitHub 页面](https://github.com/Alinto/sogo/) 可以了解更多信息。

>
> **[SOGo](https://www.sogo.nu)**
>
>
>

### 7、Afterlogic WebMail Lite

主要亮点：

* 可提供企业支持选项
* 支持社交登录
* OpenPGP 加密

Afterlogic WebMail Lite 是一个有趣的开源 Webmail，支持插件。

它还支持使用外部服务进行身份验证。例如，你可以使用谷歌帐户登录到你的电子邮件帐户。

虽然开源版本提供了所有功能和 OpenPGP 加密支持，但你也可以用于商业使用。

此外，你还可以选择专业版本以获得技术支持、优先修复、个人日历、移动版本和添加多个 IMAP 帐户的功能。

>
> **[Afterlogic WebMail Lite](https://afterlogic.org/webmail-lite)**
>
>
>

### 值得提及

有几个正在积极开发的开源项目可以供你尝试。

当然，我们不建议将它们用于商业或个人用途。你可以尝试它们，看看是否想以某种方式为它们的发展做出贡献。

我想提及几个此类邮件服务项目。

#### Mailpile

虽然它应该在上面的列表中占据一席之地，但是在用 Python 3 重写完成之前，[Mailpile](https://www.mailpile.is) 的开发已经停止。

Mailpile 是一款快速且现代化的开源 Webmail，具备加密和隐私功能。

#### Cuttlefish

[Cuttlefish](https://cuttlefish.io) 是一个自由开源的交易性电子邮件服务。它旨在成为 [SendGrid](https://sendgrid.com) 等专有服务的替代品。

它目前还处于早期开发阶段。

#### Pinbox

Pinbox 是一个自托管的 Webmail 解决方案，灵感来自于谷歌收件箱。

[Pinbox](https://github.com/msp301/pinbox) 是一个正在进行中的工作，需要一些先决条件才能正常工作。

### 总结

Squirrelmail、Horde 和 Roundcube 仍然是最流行的选项之一，你可以在大多数托管提供商处轻松访问它们。

当然，这些选项并不总是外观时尚或具备像谷歌工作空间甚至 Zoho 那样的功能，但你足够进行基本的电子邮件工作。

*（题图：MJ/603715d8-4562-4d7b-96f5-99ba76ad5a1b）*

---

via: <https://itsfoss.com/open-source-web-based-email-clients/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lkxed](https://github.com/lkxed) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1065 开源硬件公司正在向封闭转变

Summary:
? 开源硬件公司正在向封闭转变
? 人工智能检测器认为《美国宪法》是由人工智能编写的
? 出现用于网络犯罪的人工智能 WormGPT
»
»

试想一下，如果人工智能学会了自动编写病毒并发布，那就太可怕了

# 硬核观察 #1065 开源硬件公司正在向封闭转变

### 开源硬件公司正在向封闭转变

在过去 15 年里，创新型电子公司设计并发布了数以千计的开源硬件设计，创造了一个蓬勃发展的产业。他们还集体创作并签署了《开源硬件定义》，为这些产品给出了明确的定义和标准。然而，最近一些开源硬件公司要么封闭源代码，要么推迟发布源代码，要么要求签订 NDA 才能获得“开源”的硬件及其软件。去年悄悄完成 3200 万美元融资的开源硬件公司 Arduino 修改了自己的开源承诺，删除了 “所有 Arduino 板都是完全开源的，……软件也是开源的……” 的话语。SparkFun 采用了闭源固件，需要 NDA 才能查看其代码，并申请撤销其销售的一款产品的开源硬件认证。开源 3D 打印公司 Prusa 以开源名义销售的产品，由于担忧“克隆品”而一直没有发布相应的源代码，并指责中国制造商利用其设计和源代码制造专有的闭源产品，还对从他们的开源代码中获取的设计和算法申请专利。

>
> **[消息来源：Adafruit](https://blog.adafruit.com/2023/07/12/when-open-becomes-opaque-the-changing-face-of-open-source-hardware-companies/)**
>
>
>

>
> 老王点评：无论是开源软件，还是开源硬件，资本一旦涉入，开源的味道就会变化。很多靠开源起家的公司，最后背离开源，或许无奈，或许是主动选择。开源的理念，可能他们自己也不一定真心相信。
>
>
>

### 人工智能检测器认为《美国宪法》是由人工智能编写的

尽管依靠人工智能工具来检测人工智能生成的作文很有诱惑力，但迄今为止的证据表明，这些工具并不可靠。由于存在假阳性，GPTZero、ZeroGPT 和 OpenAI 自己的文本分类器等人工智能写作检测器无法检测由 ChatGPT 等大型语言模型组成的文本。如果你将美国最重要的法律文件《美国宪法》输入这种检测工具中，它会告诉你该文件几乎肯定是由人工智能撰写的。同样的情况也发生在《圣经》选段中。

>
> **[消息来源：Ars Technica](https://arstechnica.com/information-technology/2023/07/why-ai-detectors-think-the-us-constitution-was-written-by-ai/)**
>
>
>

>
> 老王点评：简单来说，这些人工智能的模型就是基于这些成例的文本训练而成的，自然无法区别这些事实上由人撰写的文件，而认为这些文本和人工智能生成的非常相近。这篇来源详细介绍了更多细节，感兴趣的话可以看看。
>
>
>

### 出现用于网络犯罪的人工智能 WormGPT

以 OpenAI 聊天机器人 ChatGPT 为代表的生成式 AI 能生成类似人类的文本，网络罪犯可利用它自动创建高度可信的钓鱼邮件，对收件人高度定制，增加攻击的成功率。网络罪犯甚至创建了专门用于恶意目的的工具 WormGPT。WormGPT 是基于 2021 年开发的大模型 GPTJ，它的功能包括无限字符支持、聊天记忆保留和代码格式化等。开发者声称 WormGPT 使用了恶意程序相关的数据进行训练。

>
> **[消息来源：Slash Next](https://slashnext.com/blog/wormgpt-the-generative-ai-tool-cybercriminals-are-using-to-launch-business-email-compromise-attacks/)**
>
>
>

>
> 老王点评：要是什么地方对新技术的利用最积极，那要数这些可以用来牟利的非法领域了。
>
>
>


如何在 C 语言中安全地读取用户输入

Summary: getline() 提供了一种更灵活的方法，可以在不破坏系统的情况下将用户数据读入程序。

# 如何在 C 语言中安全地读取用户输入

<img src="content_image/album_202307_18_104358pr5ergummii3f3le.jpg" alt="" title="">

>
> `getline()` 提供了一种更灵活的方法，可以在不破坏系统的情况下将用户数据读入程序。
>
>
>

在 C 语言中读取字符串是一件非常危险的事情。当读取用户输入时，程序员可能会尝试使用 C 标准库中的 `gets` 函数。它的用法非常简单：

```
char *gets(char *string);

```

`gets()` 从标准输入读取数据，然后将结果存储在一个字符串变量中。它会返回一个指向字符串的指针，如果没有读取到内容，返回 `NULL` 值。

举一个简单的例子，我们可能会问用户一个问题，然后将结果读入字符串中：

```
#include <stdio.h>
#include <string.h>

int main()
{
  char city[10]; // 例如 "Chicago"

  // 这种方法很糟糕 .. 不要使用 gets

  puts("Where do you live?");
  gets(city);

  printf("<%s> is length %ld\n", city, strlen(city));

  return 0;
}

```

输入一个相对较短的值就可以：

```
Where do you live?
Chicago
<Chicago> is length 7

```

然而，`gets()` 函数非常简单，它会天真地读取数据，直到它认为用户完成为止。但是它不会检查字符串是否足够容纳用户的输入。输入一个非常长的值会导致 `gets()` 存储的数据超出字符串变量长度，从而导致覆盖其他部分内存。

```
Where do you live?
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
<Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch> is length 58
Segmentation fault (core dumped)

```

最好的情况是，覆盖部分只会破坏程序。最坏的情况是，这会引入一个严重的安全漏洞，恶意用户可以通过你的程序将任意数据插入计算机的内存中。

这就是为什么在程序中使用 `gets()` 函数是危险的。使用 `gets()`，你无法控制程序尝试从用户读取多少数据，这通常会导致缓冲区溢出。

### 安全的方法

`fgets()` 函数历来是安全读取字符串的推荐方法。此版本的 `gets()` 提供了一个安全检查，通过仅读取作为函数参数传递的特定数量的字符：

```
char *fgets(char *string, int size, FILE *stream);

```

`fgets()` 函数会从文件指针读取数据，然后将数据存储到字符串变量中，但最多只能达到 `size` 指定的长度。我们可以更新示例程序来测试这一点，使用 `fgets()` 而不是 `gets()`：

```
#include <stdio.h>
#include <string.h>

int main()
{
    char city[10]; // 例如 "Chicago"

    puts("Where do you live?");

    // fgets 虽好但是并不完美
    fgets(city, 10, stdin);

    printf("<%s> is length %ld\n", city, strlen(city));

    return 0;
}

```

如果编译运行，你可以在提示符后输入任意长的城市名称。但是，程序只会读取 `size` = 10 数据存储到字符串变量中。因为 C 语言在字符串末尾会添加一个空（`\0`）字符，这意味着 `fgets()` 只会读取 9 个字符到字符串中。

```
Where do you live?
Minneapolis
<Minneapol> is length 9

```

虽然这肯定比 `fgets()` 读取用户输入更安全，但代价是如果用户输入过长，它会“切断”用户输入。

### 新的安全方法

更灵活的解决方案是，如果用户输入的数据比变量可能容纳的数据多，则允许字符串读取函数为字符串分配更多内存。根据需要调整字符串变量大小，确保程序始终有足够的空间来存储用户输入。

`getline()` 函数正是这样。它从输入流读取输入，例如键盘或文件，然后将数据存储在字符串变量中。但与 `fgets()` 和 `gets()` 不同，`getline()` 使用 `realloc()` 调整字符串大小，确保有足够的内存来存储完整输入。

```
ssize_t getline(char **pstring, size_t *size, FILE *stream);

```

`getline()` 实际上是一个名为 `getdelim()` 的类似函数的装饰器，它会读取数据一直到特殊分隔符停止。本例中，`getline()` 使用换行符（`\n`）作为分隔符，因为当从键盘或文件读取用户输入时，数据行由换行符分隔。

结果证明这是一种更安全的方法读取任意数据，一次一行。要使用 `getline()`，首先定义一个字符串指针并将其设置为 `NULL` ，表示还没有预留内存，再定义一个 `size_t` 类型的“字符串大小” 的变量，并给它一个零值。当你调用 `getline()` 时，你需要传入字符串和字符串大小变量的指针，以及从何处读取数据。对于示例程序，我们可以从标准输入中读取：

```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  char *string = NULL;
  size_t size = 0;
  ssize_t chars_read;

  // 使用 getline 读取长字符串

  puts("Enter a really long string:");

  chars_read = getline(&string, &size, stdin);
  printf("getline returned %ld\n", chars_read);

  // 检查错误

  if (chars_read < 0) {
    puts("couldn't read the input");
    free(string);
    return 1;
  }

  // 打印字符串

  printf("<%s> is length %ld\n", string, strlen(string));

  // 释放字符串使用的内存

  free(string);

  return 0;
}

```

使用 `getline()` 读取数据时，它将根据需要自动为字符串变量重新分配内存。当函数读取一行的所有数据时，它通过指针更新字符串的大小，并返回读取的字符数，包括分隔符。

```
Enter a really long string:
Supercalifragilisticexpialidocious
getline returned 35
<Supercalifragilisticexpialidocious
> is length 35

```

注意，字符串包含分隔符。对于 `getline()`，分隔符是换行符，这就是为什么输出中有换行符的原因。 如果你不想在字符串值中使用分隔符，可以使用另一个函数将字符串中的分隔符更改为空字符。

通过 `getline()`，程序员可以安全地避免 C 编程的一个常见陷阱：你永远无法知道用户可能会输入哪些数据。这就是为什么使用 `gets()` 不安全，而 `fgets()` 又太笨拙的原因。相反，`getline()` 提供了一种更灵活的方法，可以在不破坏系统的情况下将用户数据读入程序。

*（题图：MJ/4b23132f-8916-42ae-b2da-06fd2812bea8）*

---

via: <https://opensource.com/article/22/5/safely-read-user-input-getline>

作者：[Jim Hall](https://opensource.com/users/jim-hall) 选题：[lkxed](https://github.com/lkxed) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


20 个恐怖传说：在技术上犯过的最糟糕错误

# 20 个恐怖传说：在技术上犯过的最糟糕错误

>
> 一些系统管理员、网页设计师、工程师和程序员分享了他们在命令行上经历的最可怕的经历。
>
>
>

每个开发人员内心最害怕的事情是什么？在你的代码开始运行前的宁静时刻，什么最让你感到恐怖？你见过或写过最可怕的代码是什么？

### 错误的权限

我负责一台服务器，然后我通过 FTP 上传了一些东西。显示了一些奇怪的东西，所以我想权限可能需要改变一下。

不用说，我愚蠢地关闭了读取权限并使网站瘫痪了。（当没有人能访问时，网站就没啥用了。）

我花了几个小时才修复好。这是很多年前我在一个机构担任唯一的网页开发人员时的事情。

— [Miriam Goldman](https://opensource.com/users/miriamgoldman)

### 混乱的 HTML

我曾经因 WordPress 的默认主题有可用的更新而使一个客户的网站瘫痪，这个客户当时是《华尔街日报》畅销书榜上的一位作者。

他的开发人员在主题中硬编码了 HTML，而不是创建一个子主题。而我运行了更新操作。

那个年代，人们不容易实现每晚备份，所以我花了几个小时打电话给托管提供商。像分阶段发布、子主题、每晚备份或手动备份这样的东西现在都很常见，还有自动更新和手动回滚的能力。但在那个时代并不常见。

— [Courtney Robertson](https://opensource.com/users/courtneyrdev)

### 密钥不再秘密

我想我们中的许多人在公共代码中看到过密钥。或者另一个经典案例：我的一个朋友从开发服务器向 10 万个用户发送电子邮件。

— [John E. Picozzi](https://opensource.com/users/johnpicozzi)

### Unix 混乱

这是一个 Unix 的故事。今天在 [Linux](https://opensource.com/tags/linux) 中已经修复了这个问题。

在我要向管理层进行一个重要的新组件演示的前一天，我需要更新我的代码（这是在 [Git](https://opensource.com/downloads/cheat-sheet-git) 存在之前的年代）。我进入我的主目录，找到项目目录，然后删掉了一切。不幸的是，在那个版本的 Unix 中，该命令会跟随符号链接进行删除，并且我有一个链接指向代码的最新版本（并不是所有代码都在源代码系统中，因为它还处于测试阶段）。

好在一天后，大楼里出现了网络问题，因此演示推迟了一天，我们设法恢复了代码。那是三十多年前的事情。即使现在我也不知道网络问题是巧合，还是我们的系统管理员试图帮助我们（如果是这样，那确实奏效了！）

— [Josh Salomon](https://opensource.com/users/joshs)

### 命令式编程

看到 CSS 文件中到处都是 `!important;` 而不是正确使用特异性。

我曾经不得不覆盖和定制一个 WordPress 主题几乎所有的 CSS，因为该网站的所有者坚持不换一个更接近他想要的设计的新主题。

那个主题开发者最后一次更新是在 2018 年，但网站至今仍在使用。

— [Christi Nickerson](http://cnickerson.com)

### 错误引用

在我以前的职位上，我的前任在代码注释中引用了 Journey 的《Any Way You Want It》歌词错误。

— [Ben Cotton](https://opensource.com/users/bcotton)

### Algol68 的幽灵

在上世纪 60 年代末到 70 年代初，Algol68 的复杂性使许多有影响力的人望而却步，包括 Niklaus Wirth 在内。我记得当时最常见的抱怨之一是：“谁能为这样一个复杂的怪物写一个编译器呢？” 但是事实上，许多人都开发过。此外，许多在 [Algol68](https://opensource.com/article/20/12/learn-algol-68) 中发展出来的或至少以形式化的概念出现在后来的其他语言中，尤其是在 C 语言和 Bourne shell 中（感谢 Steve Bourne）。

Algol68 的一些概念并没有经过很好的演化。例如，处理“书”和“章节”等的 I/O 概念在今天有些奇怪。像将字符集等问题留给实现本身处理似乎相当过时。

但是其中一些概念在今天仍然极为重要，例如产生值的表达式、强类型化（Algol68 中称为“模式”的类型）、[堆内存和垃圾回收](https://opensource.com/article/22/6/garbage-collection-java-virtual-machine)、运算符的定义和重载等等。

有好的地方，也有不好的地方。

Algol68 是一门值得学习的语言，即使只是为了了解现代计算中的许多想法的来源以及在路上丢失了多少。

— [Chris Hermansen](https://opensource.com/users/clhermansen)

### 密码暴露

我为一个新的支持客户进行技术审计时，发现之前的开发人员将密码以明文形式存储在整个主题中，并使用了糟糕的方式连接到远程数据库。他们的 composer 文件也异常庞大。每次我尝试在本地运行网站时，需要花费五分钟的时间。过时的依赖项、我无法访问的仓库，问题还有很多。

— [Miriam Goldman](https://opensource.com/users/miriamgoldman)

### 迷宫般的代码

我见过的最可怕的代码是一段 PDP-11 汇编语言，位于一个名为 RSTS 的操作系统的内核中，今天已经没有人记得它了。当时源代码记录在胶片上，我跟随这段代码路径经过几个转折，试图弄清楚正在发生的事情。然后，我遇到了这条指令：

```
MOV R5,PC

```

我举起双手尖叫了起来。真的，我尖叫了。办公室里的人以为我撞到头了，或者心脏病发作了。

那个年代，内存是宝贵的，`MOV` 指令使用的内存比 `BR`（即“分支”）指令稍微少一点。将寄存器 5 的内容复制到程序计数器实际上是一个廉价的无条件跳转，跳转到寄存器 5 中存储的地址。但是，我不知道寄存器 5 中存储了什么，也不知道如何找到它。

时至今日，将近 40 年过去了，我仍然想知道是谁写出这样的代码，以及如何调试它。

— [Greg Scott](https://opensource.com/users/greg-scott)

### 差一个

我在自动化行业工作，其中的可编程逻辑控制器（PLC）使用一些相当奇怪的语言进行编程。

让我印象深刻的一个例子是，在 [ST](https://en.wikipedia.org/wiki/Structured_text) 语言中，你可以定义数组从索引 1 开始。这意味着第一个元素在位置 1 而不是 0。每当我看到这个时，我都会抓狂。

— [Stephan Avenwedde](https://opensource.com/users/hansic99)

### 分歧

有一次在一个从测试环境到生产环境的发布期间，我让 MongoDB 实例停机了 40 分钟。我们的测试环境与生产环境有所分歧。只是一个数据库配置的差异，没什么太激动人心的东西。但这是一个很好的教训，要确保你的测试和生产环境保持同步！

— [Em Nouveau](https://opensource.com/users/nouveau)

### 神秘的低语

这是一个仍在运行且正常的项目，但我已经修改了代码以隐藏源代码。

```
for(int c =0; y < yyy && c < ccc; y++, c++){// some code here}

```

乍看起来，它似乎是一个无害的循环。但也许你会问为什么有两个变量、两个停止条件以及两个增量。然后你会意识到只有一个初始化器，第二个变量（`y`）在这个循环之前在不同的代码块中被初始化。

当我意识到这一点时，我花了大约一个小时的时间来理解为什么代码是这样编写的，以及它应该如何工作。显然，代码中没有 `c` 的注释，并且变量名是无意义的（代码中被称为 `c`，`y` 有一个稍微具有意义的名称，但不足以解释它的意义，即使是今天我也不知道它的作用）。

— [Josh Salomon](https://opensource.com/users/joshs)

### 关键数据

大约在 1980 年，我在大学毕业后得到了我的第一份工作。我是印第安那州一所工程学院的计算中心副主管。这是一个两人 IT 部门的辅助职位。我在 PDP-11/40 上处理行政计算，使用 RK05 可移动的“披萨碟”磁盘驱动器（每个驱动器容量为 2.5 MB）。每个行政办公室都有一个驱动器，而我工作的一部分就是每周进行磁盘对磁盘的备份。但是那个夏天我很忙，连续四周没有备份过注册办公室的数据。然后我意识到了风险，所以我确保开始进行每月的磁盘到磁带备份。

我从 11/40 上卸载了注册办公室的磁盘驱动器，然后装在了带有一台 9 磁道磁带驱动器的 11/70 上，并开始进行备份。几分钟后，我听到磁盘驱动器里传来一阵刮擦的声音。是的，磁头撞上了磁盘。在短短几分钟内，我摧毁了所有注册办公室的数据，以及最新的备份 —— 一个四周前的 9 磁道磁带。

当我不得不面对注册办公室主任，并告诉他我已经摧毁了他所有的数据时，那一刻真的很尴尬。

如今，我告诉新的 IT 人员，只有在你摧毁了某人的关键数据，而且无法恢复时，你才算是专业人士。永远记住你胃里的那种感觉。

— [Greg Scott](https://opensource.com/users/greg-scott)

### 愤怒的暴民

一个客户篡改了 WordPress 核心代码以添加后续在常规更新中发布的功能，但他们却不明白为什么在每次尝试更新 LearnDash 时网站都会崩溃。（他们也不喜欢我们的报告指出了他们糟糕的开发实践。）于是他们赶我们走，称我们是骗子和无能之辈。但直到今天，我仍然具有他们域名的委派访问权限，以及两个域名的生产和开发环境的 wp-admin 访问权限。

此外，尽管我们给了一个加密位置的链接用于共享访问凭据，他们却通过电子邮件发送了我们的登录信息。

— [Laura Byrne](http://twitter.com/@NewYorkerLaura)

### 不要忘记备份

我在企业网络上的工作经验不多，所以我没有使任何服务器崩溃过。然而，作为一个年轻人，我曾经试图帮助一个人解决 IT 问题，不知何故导致 Windows 95 崩溃，并不得不免费重新安装。

作为一个非常年轻的 Amiga 用户，我最悲伤的时刻之一是我的保存磁盘坏掉了，里面装满了所有我的文件，原因是某种机械故障。如今，我已经学会更好地备份我的重要个人文件。

— [Rikard Grossman-Nielsen](https://opensource.com/users/rikardgn)

### 万恶之源

当时我刚开始接触 Linux，之前我用的是 DOS，借助 Norton Commander 进行操作。后来，Midnight Commander 发布了，我非常喜欢它。当时我使用的 Linux 发行版（Jurix）没有打包 Midnight Commander，所以我自己从源代码编译了它，就像我那个时候使用的其他软件一样。它完美地运行了，突然间我在 Linux 上感到更亲切了。

这不是一个恐怖的故事。

我的同事告诉我不要以 root 身份运行 Midnight Commander，无论它有多么让人舒适。但是 root 权限很方便，感觉更像 DOS，所以我无视了他们的建议。结果就是：我意外地删除了整个 `/etc` 目录的内容。在那之前，我从来没有用过备份功能，但是那一天我意识到备份实际上是有用的。

27 年过去了，我仍然记得这个故事，并定期进行备份。

— [Peter Czanik](https://opensource.com/users/czanik)

### 幻觉

最糟糕的项目是一家代理机构让我做的一个一屏的页面，一开始看起来很简单。我说我可以用一些 HTML、CSS，也许加点 JavaScript，将其组合起来。但他们特别要求我不要这样做。他们希望我将设计图剪切下来，然后使用 CSS 在页面中定位这些元素。他们还要求我将所有的 CSS 内嵌到 HTML 文件中，因为他们真的只想要**一个页面**。

其中的文本都不是真实的文本。

除了定位这些图片所需的元素之外，其他都不是真正的 HTML 元素。

我告诉他们，设计足够简单，我可以用实际的代码将其组合起来，但他们不想要那样。他们只想让我花时间将这些碎片拼凑在一起，然后转而做其他项目。他们让我做了两个类似的一屏网站。

这实在伤害了我的前端灵魂。为我来说，这个项目在身体上是痛苦的。这是一个试用合同职位，当他们给我提供全职工作时，我礼貌地拒绝了。

— [Rachel Vasquez](https://opensource.com/users/rachievee)

### 内存破坏

对我来说，最可怕的事情就是 ANSI C99 中可能发生的内存破坏。在一个屏幕录像中，我捕捉到了这个（不完全是）超自然现象，可以在这个 [YouTube 视频片段](https://youtu.be/Go6r-CT06zc?t=103) 中观看到。

标有 `file` 的 GtkEntry 显示了一些随机的符号。我检查了一下 [代码](https://git.savannah.nongnu.org/cgit/gsequencer.git/tree/ags/app/ags_export_soundcard_callbacks.c?h=4.4.x#n397)，但没有发现任何问题。

`ags_export_soundcard_open_response_callback()` 函数是一个回调函数，用于处理 `GtkFileChooserDialog` 的 `response` 事件。（顺便说一句，用于解决这个问题的工具是 [valgrind](https://opensource.com/article/21/8/memory-programming-c)。）

— [Joël Krähemann](https://opensource.com/users/joel2001k)

### Python 的恐怖之处

我见过的最可怕的编程特性是 Python 中对 `dict` 的访问权限。在运行时改变对象的类型违背了我的编程行为准则。

* [Josh Salomon](https://opensource.com/users/joshs)

### 缝合怪网络

在 2006 年，我用 Fedora 和一些脚本构建了一台防火墙，并说服了一家托管在合作数据中心的大型网站的客户，将其专有的防火墙替换为我的防火墙。我建立了系统并在一个清晨的 4 点到达现场进行安装。那时我才发现（饱受痛苦地）他在防火墙后面有一个带有公共 IP 地址的负载均衡器。客户经历了一个 5 分钟的停机时间，但我重新连接了一切恢复到原来的状态。

我发现了一种通过使用代理 ARP 来处理他复杂的网络配置的方法。这个想法是，当外部世界的任何人发出负载均衡器的 ARP 请求时，我会进行回应。几天后，我再次在凌晨 4 点出现并安装了我的系统。这次，我把整个数据中心的所有设备都给搞宕了。我设置了我的代理 ARP 来回应所有请求，因此局域网上的所有流量最终都找到了我并消失在黑洞中。

当我意识到我做了什么时，我把一切都恢复到原来的状态。但是损害已经造成。如果有人在 2006 年的一个清晨美国中部时间大约 4 点钟尝试浏览你最喜欢的网站，它没有响应，那可能是我的错。我通过在机架上安装并启动一个系统，让整个数据中心的网站都宕机了。

网站运营商愤怒地抗议，而我则黯然离开。他们再也没有邀请我回去再试。真是遗憾，我觉得再试试桥接可能会起作用。

— [Greg Scott](https://opensource.com/users/greg-scott)

### 你的恐怖故事

你最喜欢的与技术相关的恐怖故事是什么？在评论中告诉我们（但要友善，并更改项目名称以保护无辜者！）

---

via: <https://opensource.com/article/22/10/technology-horror-stories>

作者：[AmyJune Hineline](https://opensource.com/users/amyjune) 选题：[lkxed](https://github.com/lkxed) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary:
? Wayland 正在成为 Linux 图形用户界面的首选方式
? 安装量超百万的 WordPress 安全插件明文记录密码
? 网站建设公司提供创建整个网站的人工智能工具
»
»

再想想 [X.org](...) [多少年](...) [没有](...) [实际开发](...) 在进行了，连 [董事会选举](...) 都差点凑不够人。

咱都是老读者了，引用那么多干嘛

来自四川泸州的 Chrome Mobile 114.0|Android 13 用户

哈哈哈，其实就是臊一下 X.org

这就像国内的软件生态一样，90%的软件只支持windows，想要wayland 替代X ,  再等个几十年吧

linux不是windows那个裹脚布，软件要更新都一起更新的，systemd取代sysv就是最好的证明

# 硬核观察 #1066 Wayland 正在成为 Linux 图形用户界面的首选方式

### Wayland 正在成为 Linux 图形用户界面的首选方式

越来越多的证据表明，Wayland 显示服务器可能很快就会取代 X11，成为 Linux 上最常用的 GUI 方式。比如，为苹果芯片 Mac 开发 Linux 的团队表示，他们没有足够的人力来开发 [X.org 支持](/article-15825-1.html)。被许多 Linux 应用程序和桌面使用的 Gtk 工具包的开发者说，下一个版本可能会 [放弃](/article-14793-1.html) 对 X11 的支持。Budgie 桌面的下一个版本将只支持 Wayland。KDE 6 会话 [默认使用](/article-15821-1.html) Wayland。甚至还有人尝试让 Wayland 在 OpenBSD 上运行，而它已经可以在 FreeBSD 上使用了。

>
> **[消息来源：The Register](https://www.theregister.com/2023/07/13/wayland_is_coming/)**
>
>
>

>
> 老王点评：再想想 [X.org](/article-12760-1.html) [多少年](/article-13648-1.html) [没有](/article-15331-1.html) [实际开发](/article-15403-1.html) 在进行了，连 [董事会选举](/article-15667-1.html) 都差点凑不够人。所以，是时候全面转向 Wayland 了。当然，Wayland 自己还有一些问题需要解决。
>
>
>

### 安装量超百万的 WordPress 安全插件明文记录密码

All-In-One Security（AIOS）是一款安装量超过了百万的增强 WordPress 安全性的插件，在其 5 月发布的 v5.1.9 中引入了一个错误，用户登录使用 AIOS 的网站后会以明文方式记录其密码，并将其存储在管理员可访问数据库中。上周释出的 v5.2.0 修复了该问题，并从数据库里删除了相关数据。在公告中，他们还给出了一些安全建议，其中包括已被认为是糟糕的安全实践“定期修改密码”——因为这会事实上迫使用户使用弱密码。微软认为这种做法 “古老而过时”。

>
> **[消息来源：Ars Technica](https://arstechnica.com/security/2023/07/wordpress-plugin-installed-on-1-million-sites-logged-plaintext-passwords/)**
>
>
>

>
> 老王点评：无论如何，不用明文存储密码都是最起码的安全常识。从这一点和该插件开发方给出的安全建议看，他们或许并没有真正的安全意识。
>
>
>

### 网站建设公司提供创建整个网站的人工智能工具

Wix 是网站建设领域的老牌公司。该公司发布的新人工智能网站生成工具可以让 Wix 用户描述他们的意图，并生成一个包含主页、内页、文本和图片的网站，并可以包括活动、预订等特定业务板块。在一个类似聊天机器人的界面中，该工具会询问一系列有关网站和业务性质的问题，并尝试将其转化为定制的网站模板。Wix 认为客户不会特别在意花时间定制网站外观的方方面面。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2023/07/17/wixs-new-tool-can-create-entire-websites-from-prompts)**
>
>
>

>
> 老王点评：很多年前，开发一个网站是一件艰巨的工作，而现在，通过新的工具，开发一个网站可能就像快餐一样简单。
>
>
>


不可变发行版 blendOS 发布最新版本

Summary: blendOS v3 已经来到，并带来了重大升级！

blendOS v3 已经来到，并带来了重大升级！

# 不可变发行版 blendOS 发布最新版本

>
> blendOS v3 已经来到，并带来了重大升级！
>
>
>

blendOS 是一个 [不可变发行版](https://itsfoss.com/immutable-linux-distros/)，它的目标（野心）是取代所有 Linux 发行版。我们最近 [介绍了它](/article-15684-1.html) 之前的版本。该项目由 [Ubuntu Unity](https://news.itsfoss.com/unity-remix-official-flavor/) 的首席开发者 Rudra Saraswat 领导，其进展一直良好。

在最近的公告中，他们推出了一个带来了许多改进的新版本，使 **blendOS** 更加接近其目标。

让我们看看这个版本有什么内容。

### ? blendOS v3 “Bhatura”：有什么新内容？

作为一个支持大多数软件包的 **基于 Arch 的发行版**，最新版本的 blendOS 的名字来源于印度美食中的一道美味佳肴 “[印度炸麦饼](https://en.wikipedia.org/wiki/Bhatura)”。

这个版本提供了很多东西，值得注意的亮点包括：

* 更好的桌面环境支持
* 直观的应用安装
* 支持附加发行版
* 改进的系统更新
* 新的命令行程序

#### 更好的桌面环境支持

blendOS 现在 **支持 7 种桌面环境**，其中包括：

* [GNOME](https://www.gnome.org/)
* [KDE Plasma](https://kde.org/plasma-desktop/)
* [Cinnamon](https://github.com/linuxmint/Cinnamon)
* [XFCE](https://www.xfce.org/)
* [Deepin](https://www.deepin.org/en/dde/)
* [MATE](https://mate-desktop.org/)
* [LXQt](https://lxqt-project.org/)

**现在支持的太多啦！** ?

你可以通过在终端中运行 `system track` 命令轻松地在这些之间切换。

#### 直观的应用安装

此版本的 blendOS 现在提供了双击 **DEB**、**RPM**、**pkg.tar.zst** 甚至 **APK** 包将它们安装到容器中的功能。

>
> ? 对于 APK：你需要从设置启用安卓应用支持。
>
>
>

#### 支持附加发行版

blendOS 现在**支持在容器中运行十个发行版**，并且能够通过单用户/多用户安装 [运行 NixOS](https://itsfoss.com/why-use-nixos/)。以下是支持的发行版：

* Arch Linux
* AlmaLinux 9
* Crystal Linux
* Debian
* Fedora 38
* Kali Linux （滚动版）
* Neurodebian Bookworm
* Rocky Linux
* Ubuntu 22.04
* Ubuntu 23.04

#### 改进的系统更新

**blendOS v3 使用 ISO 进行系统更新。** 与传统发行版不同，它允许重建系统，更新大小在 **10-100 MB** 范围内。

多亏了 [zsync](https://github.com/AppImageCommunity/zsync2)，更新下载的大小才如此之小。更新在后台下载，下次启动时，当前的根文件系统将被替换，同时保持任何自定义系统包完好无损。

**根据开发者的说法**，此更新系统解决了 Arch Linux 等滚动发行版的重大缺陷，防止任何数据丢失或系统故障，提供了出色的稳定性。

#### 新的命令行程序

最后，它引入了**两个新的命令行程序**； 一个是 `system`，另一个是 `user`。

`system` 将允许你安装软件包，甚至切换桌面。而 `user` 将使你能够创建/管理容器及其关联。

就是这样。对于此版本的亮点，你可以通过 [发布公告](https://blendOS.co/blend-os-v3/) 博客来了解有关此精彩版本的更多信息。

### ? 下载 blendOS v3 “Bhatura”

blendOS v3 **有七个不同的版本**，从 GNOME 版本一直到 Deepin 版本。

你可以从 [官方网站](https://docs.blendOS.co/guides/installation-guide/#mirror-list) 获取它们，你也可以在其中查看安装指南。

>
> **[blendOS v3 “Bhatura”](https://docs.blendOS.co/guides/installation-guide/#mirror-list)**
>
>
>

---

via: <https://news.itsfoss.com/blendOS-v3-released/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


你应该使用新的、较为冷门的 Linux 发行版，还是坚持使用主流的发行版？

Summary: 简单的答案是坚持使用主流的发行版，但真正的答案需要你自己思考。

最后发现LFS或者Slackware才是Linux的正确打开方式。但也不能阻止人家用雨林木风啊，一个GHOST就解决问题，多方便。

如果前提是你想流畅的使用 那么肯定是选主流的啊 出了什么问题一搜解决方案就一大把 整冷门纯粹头铁

简单的答案是坚持使用主流的发行版，但真正的答案需要你自己思考。

# 你应该使用新的、较为冷门的 Linux 发行版，还是坚持使用主流的发行版？

当你开始在桌面上使用 Linux 时，你可能会选择像 Ubuntu 或者 Linux Mint 这样的 [对初学者友好的发行版](https://itsfoss.com/best-linux-beginners/)。

随着你逐渐熟悉 Linux 并且开始喜欢上它，你会加入各种社交渠道上的 Linux 相关社区，关注分享 Linux 内容的网站。而当你这样做的时候，你也会发现一些新的、相对不知名的发行版。

因为你对这个领域还比较陌生，你可能会被诱惑尝试一个接一个的发行版，从而陷入“[发行版快闪](/article-15949-1.html)”的陷阱。

于是你开始问自己这个问题：“我应该使用一个未知的发行版，还是像大多数人那样使用流行的发行版呢”？

简单的答案是坚持使用主流的发行版，但真正的答案需要你自己思考。

### 使用新的、较为冷门的发行版存在的问题

使用“全新的、个人开发者的发行版”存在一个主要问题，那就是不确定性。你无法确定这个项目将会存在多久。可能是一年，也可能是一个月。

我曾经见过几个发行版出现这种情况。比如，[SemiCode OS](https://itsfoss.com/semicode-os-linux/) 由于为程序员而创建而变得流行。类似的发行版 Emperor OS 最近消失了。这只是被停止开发的发行版长列表中的几个例子。

你可能会说，一个有一定用户基础的旧发行版也可能出现同样的情况。这是对的，但通常情况下，有一个社区和多个开发者参与项目。这样你就有一定的保证。

由于开发者的经验不足，新的发行版可能会缺失关键功能。例如，在撰写本文时，看起来令人惊艳的 Garuda Linux 官方并不推荐双启动。

尽管 Garuda Linux 拥有相当数量的支持者和几名开发者参与项目，但仍存在这个问题。

### 大多数新的发行版没有提供实质性的内容

你经常会遇到一些全新的发行版，它们基于一些其他流行的发行版，比如 Ubuntu 或 Arch Linux。唯一的不同可能只在于默认的应用程序、主题和壁纸。

如果它是一个“面向程序员的发行版”，它可能会默认安装一些编程应用程序。如果它是一个“游戏发行版”，它可能会默认安装一些工具，如 Steam、Wine 和 [Lutris](https://lutris.net/)。你不太可能在图形或硬件方面看到真正的优化。

这就是为什么很多人说，已经有了数百个发行版的拥挤空间中，我们不需要更多的发行版。毕竟，在主流发行版中安装所需的应用程序并不难。

### 我反对这些新的发行版吗？

绝对不是。

你可能会觉得几乎没有提供任何价值的新发行版是多余的。你可能是对的，因为这些项目可能对你来说无关紧要，但对于开发它的人来说，它们是重要的。

你有没有试过学习一门编程语言？第一个教程通常是一个“Hello World”的程序。即便是高级程序员也是从“Hello World”开始的。

婴儿不会直接开始跑步。到达那个阶段需要时间。

我对这些项目的看法也是一样的。如果有人热爱 Linux 并且对创建自己的“操作系统”感到兴奋，就让他们去做吧。如果你不想鼓励他们，也不要泼冷水。

大多数项目都是从相同的方式开始的。Linux Mint 是一款非常受欢迎的 Linux 发行版。它于 2006 年开始，并以 Kubuntu 为基础。

真的需要“一个基于 Ubuntu 的类似发行版”吗？实际上并不需要。但看看 Linux Mint 如今的地位。

### 那么，你应该使用新的发行版还是不应该使用呢？

总体而言，这取决于你自己。

如果你不喜欢频繁格式化你的系统，并且希望继续正常生活，那就坚持使用主流的发行版。

如果你喜欢实验，不介意频繁更换操作系统并且愿意冒着搞乱系统的风险，那么你可以尝试新的发行版。就个人而言，我建议你在虚拟机中尝试它们。如果你能有一台空闲的系统专门用于实验，那就更好了。

你也可以使用那些在社区中存在多年，但不如 Ubuntu、Mint、Fedora 和 Debian 等发行版流行的发行版。像 [PCLinuxOS](http://www.pclinuxos.com/)、[Puppy Linux](https://puppylinux.com/)、Peppermint OS 等项目拥有一个较小但活跃的社区。它们绝对是一个可靠的选择，即使用于你的主系统也没有问题。

在选择发行版时，除了基础发行版外，你还应该看看该发行版是否经常更新，并拥有一个活跃的社区。你只需要查看该项目的论坛，看看社区中是否有足够的活动即可。

### 你更喜欢哪种类型的发行版？

这是我在选择新的较为冷门发行版和流行的主流发行版之间提出的想法和建议。

那你呢？你更喜欢哪种类型的发行版？

*（题图：MJ/930988c0-443d-4d61-a603-1466a5e33d85）*

---

via: <https://news.itsfoss.com/obscure-or-maintsream-distro/>

作者：[Abhishek](https://news.itsfoss.com/author/root/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary:
? Meta 发布新大语言模型，可免费商用，采用特别的“开源”方式
? 美国启动物联网安全标签计划
? 印度大部分外包程序员将在两年内因人工智能而消失
»
»

# 硬核观察 #1067 Meta 发布新大语言模型，可免费商用，采用特别的“开源”方式

### Meta 发布新大语言模型，可免费商用，采用特别的“开源”方式

Meta 周二发布了 Llama 2：这是一套经过预训练和微调的基于文本的人工智能模型，有三种不同的规模，分别包含 70 亿、130 亿和 700 亿个参数。与之前的 LLaMA 模型不同的是，任何人都可以申请下载 Llama 2，开发人员可以用它来构建商业产品或服务，以及开展有趣的项目。Meta 表示，不会对访问或使用其开发的模型收费，而是通过向其他公司开放该技术，如与微软和亚马逊合作，在 Azure 和 AWS 上提供该模型。值得注意的是，Llama 2 采用了专门的 [许可证](https://github.com/facebookresearch/llama/blob/main/LICENSE)，有一些独特的限制，因此不符合“开源”的定义。除了常见的免责声明外，开发人员不能利用其输出结果来改进其他类型的大型语言模型。以及，如果将 Llama 2 用于支持那些拥有超过 7 亿月活跃用户的应用程序的大公司，必须申请使用 Meta 技术的特殊许可。

>
> **[消息来源：The Register](https://www.theregister.com/2023/07/19/meta_llama_2/)**
>
>
>

>
> 老王点评：虽然不是规范定义的“开源”软件，但至少是开放的。值得注意但是，从 LLaMA 到 Llama 2，Meta 都采用了非同寻常的“开源”方式，这或许是 Meta 既想利用开源的优势，又有一些不确定的担忧。也许人工智能领域需要一种独特的开放许可证。
>
>
>

### 美国启动物联网安全标签计划

该计划的正式名称为《美国网络信任标识》，旨在帮助美国人确保他们购买的互联网连接设备具有强大的网络安全保护措施，可防范网络攻击。长期以来，物联网一直被认为是网络安全的薄弱环节。符合该标准的设备将要求具有唯一且强大的默认密码、保护存储和传输的数据、提供定期的安全更新以及具备事故检测能力等。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2023/07/18/us-government-launches-the-cyber-trust-mark-its-long-awaited-iot-security-labeling-program/)**
>
>
>

>
> 老王点评：越来越多的物联网设备，其实是埋在信息社会底层的空洞，你不知道它什么时候就会导致塌陷。
>
>
>

### 印度大部分外包程序员将在两年内因人工智能而消失

Stability AI 公司的 CEO 表示，印度的大多数外包程序员将在未来一两年内失业。不过他认为，在法国等受《劳动法》保护较强的国家受到这种影响的可能性较小。他重申了他之前的说法，五年后将 “不再有程序员”，不过，他也说明，他指的是传统意义上的程序员。他说，“当你把编程这件事从错误测试、单元测试到构思进行解构时，人工智能可以做到这一点，而且做得更好。但这不是自动完成的，而是人工智能‘辅助驾驶’完成的。”

>
> **[消息来源：CNBC](https://www.cnbc.com/2023/07/18/stability-ai-ceo-most-outsourced-coders-in-india-will-go-in-2-years.html)**
>
>
>

>
> 老王点评：其实也不用特别慌，就像计算器、计算机出现，并没有让原来的财务和文员失业一样，只是如果你掌握不了新工具，那这种“古典程序员”被淘汰也是自然的。
>
>
>


Linux 桌面拥有近一半的 Linux 桌面市场！

Summary: 如果人们能停止争论谁算谁不算，那就会加倍了。

建议用 chatgpt 翻译多加点能提升译文可读性的 prompt, 这种英文语法的邯郸学步式中文读起来很累, 请细细品味本文题目<Linux 桌面拥有近一半的 Linux 桌面市场>

这个标题是我特意这样翻译的

如果你让 AI 多润色，会变得和原文不太一样，不忠实原文了。我们大多翻译的技术文章，宁可生硬，也不能偏离。所以翻译腔其实不算 bug（，算功能，哈哈）~~

跟“黑苹果”一样，普通的 ChromeOS 也可以通过 brunch 在 PC 安装（因为 Chromebook 跟 PC 的区别比 Mac 跟 PC 的区别小得多），macOS 的底层是开源的，虽然不是完全的开源（至今无法编译能启动的 darwin）。

如果人们能停止争论谁算谁不算，那就会加倍了。

# Linux 桌面拥有近一半的 Linux 桌面市场！

>
> 如果人们能停止争论谁算谁不算，那就会加倍了。
>
>
>

<img src="content_image/album_202307_20_115246hzczzqpvxbvmxlyb.jpg" alt="" title="">

Linux 现在占据全球桌面操作系统市场略超过 3%，不包括 4% 多的 ChromeOS（虽然 ChromeOS 实际上 *也是* Linux，但是它是“错误类型”的 Linux）。

Web 服务器统计聚合网站 Statcounter 上周宣布，截至 2023 年 6 月，Linux [占据](https://gs.statcounter.com/os-market-share/desktop/worldwide) 全球桌面操作系统使用量的 3%。然而，ChromeOS 的使用量仍然超过 Linux，这意味着 Linux 桌面占不到一半的 Linux 桌面市场的份额。如果你感到这话有点奇怪，那你是对的。

显然，Linux 桌面的使用量为 3.08%，落后于 ChromeOS 的 4.15%。问题在于，ChromeOS 实际上 *也是* 一种 Linux 发行版。它是一种奇怪的发行版，在几个方面不符合标准，它目前的版本基于 Gentoo Linux [构建](https://www.theregister.com/2023/02/14/chromeos_opinion_column/)，是几年前从基于 Ubuntu 转换而来的。

我们认为更准确的计算结果应该是，Linux 现在占据了 Statcounter 统计的使用数据的 7.23%，而 ChromeOS 占据了一半以上：总计 57.4%。这似乎是一个更积极的解释，Linux 粉丝应该会乐于接受，但显然事实并非如此。例如，Linux 布道网站 Linuxiac 在其报道中甚至没有 [提到](https://linuxiac.com/linux-hits-3-percent-market-share/) ChromeOS。

（顺便说一下，我们怀疑 “未知” 类别下的 3.23% 操作系统很可能也是 Linux 用户，只是他们的极度谨慎遮掩了他们的用户代理或其他信息。）

为什么 ChromeOS *不* 算进去呢？它是一个在标准 glibc C 库之上构建的 Linux 内核和 Linux 用户空间。你可以打开 Shell。如果你愿意，你还可以运行一个 [Debian 容器](https://www.theregister.com/2018/04/27/linux_vms_on_chrome_os/)，并在其中安装和运行任何 Debian 应用；我们的实验性 ChromeOS Flex 机器运行着 Firefox 和 DOSemu。

如果有人说 “安卓不是 Linux”，这还是有一定的道理的。你不能轻松免费地下载它，也不能在自己的通用个人电脑上运行它。尽管有一些实验性的基于安卓的桌面操作系统，但迄今为止它们都失败了。在其原生平台的智能手机和平板电脑上，你无法在安卓上运行普通的 Linux 应用程序。它是一种不同类型的系统，尽管*从技术上*讲，它是一个带有 Linux 内核的系统。但仅此而已。它甚至使用了奇怪的、非标准的、非 GPL 许可的 libc，名为 "Bionic"。默认情况下，除了内核之外，它没有任何其他类似 Linux 的东西。没有 Shell，没有桌面，没有 X11 或 Wayland，什么都没有。

但 ChromeOS 不是如此。在其独特的 GUI 层下（与 macOS 不同，它是 [开源](https://chromium.googlesource.com/chromium/src.git/+/lkgr/ash/) 的），它是一个相对标准的 Linux，可以直接在 x86 和 ARM 平台上运行标准的 Linux 应用程序。因此，它是目前最成功的桌面 Linux。

它不是*典型的* Linux，因为典型的 Linux 是给怀有技术痴迷的黑客人群使用的工具，这种操作系统永远不会成为主流，除非有人强迫人们使用它。

ChromeOS 是一个去除了 Linux 特性的 Linux 桌面。没有关于分区的选择。没有奇怪的双启动机制。不用选择桌面环境或软件包管理器。甚至没有软件包管理器！

从重要的方面来看，ChromeOS 是一个主流、商业成功、精心设计的面向最终用户的桌面操作系统，而且它确实是一个 Linux 系统。

因此，自由开源软件（FOSS）阵营的力量自然对它充满敌意。当然他们愿意这么做。他们是如何表达这种蔑视呢？他们声称它不是一个“真正的 Linux”。

Unix 就像一种宗教：不知何故，它鼓励分裂和分散的派别，每个派别都否认其他派别的合法性。这几乎成了 Unix 的定义特征之一。

如果我们忽略所有商业版的 Unix，因为它们实际上都已经 [不复存在](https://www.theregister.com/2023/01/17/unix_is_dead/)，只关注 FOSS 阵营，有大约十几个竞争派别：NetBSD、FreeBSD、OpenBSD、DragonflyBSD、Minix、HURD 和 L4 及其 [各种分派](https://www.theregister.com/2022/02/24/neptune_os_sel4_windows/)、Plan 9（[9front](https://www.theregister.com/2022/11/02/plan_9_fork_9front/)、HarveyOS、Jeanne 等）、Inferno、[xv6](https://github.com/mit-pdos/xv6-public)、[v7/86](https://www.nordier.com/)，当然还有 Linux 和数千个不同的发行版。

确切地说，只有 **两个** 基于 Linux 的操作系统在面向非技术用户的 GUI 系统中取得了大规模的商业成功。一个拥有 [数十亿用户](https://www.theregister.com/2012/06/11/android_activation_nears_one_million_daily/)，另一个则有 [数亿用户](https://www.theregister.com/2021/05/05/chromebook_shipments_canalys_figures/)。它们都来自谷歌，并且都具有一个定义性的特征：自由开源软件（FOSS）世界拒绝接受它们。

ChromeOS 有两个版本：普通的 ChromeOS 只能通过购买专门为其设计的硬件来获得（就像苹果的 macOS 一样），而另一个是 ChromeOS Flex。Flex 过去被称为 Neverware Cloudready。Neverware 起源于 Hexxeh 对普通个人电脑 [重新混编和重构](https://www.theregister.com/2010/11/08/google_chrome_os_is_not_android/) 的 ChromiumOS。Hexxeh 开发了 ChromeOS Flow，它是 ChromeOS Flex 的直接前身：两者都是可以用在通用个人电脑硬件上的 ChromeOS。这是其中一个重要的方面，它表明 ChromeOS 就是又一个 Linux 发行版。

ChromeOS Flex 不像安卓。从重要的方面来看，它就是一个 Linux。它既是自由 [开源](https://www.chromium.org/chromium-os/) 的，也有多个混编和重构版本。它可以在通用的具有普通 BIOS 或 UEFI（包括安全启动）的设备上运行。它有自己独特的桌面环境。你可以打开一个 Shell，并安装和运行任何任意的 Linux 应用程序。

外观上它看起来像一个 Linux，行为也像一个 Linux，并且像任何其他桌面 Linux 一样运行。它基于通用的 Linux 内核，使用与其他桌面 Linux 相同的 Linux 二进制文件执行 Linux 相关的操作。

它没有 systemd，但感谢伟大的 Torvalds 大神以及他的使徒圣·Cox，它还不是 Linux 发行版的要求。它使用的是 upstart，这是一种最广泛使用的初始化系统之一。

当某种特定形式的基于 Linux 的操作系统开始变得主流，并被 [大约一半](https://www.bankmycell.com/blog/how-many-android-users-are-there) 的人使用时，Linux 世界的真正信徒们会放弃它，这完全符合 Linux 世界的特点。安卓不是 Linux。好吧，他们某种程度上是对的。

但是对于 ChromeOS，尤其是 ChromeOS Flex 来说呢？当然，所有的倡导者都会声称它不是真正的 Linux，但随之而来的很快就变成了一个“[没有真正的苏格兰人](https://www.scribbr.com/fallacies/no-true-scotsman-fallacy/)”的争论。红帽族认为 Ubuntu 是垃圾，Debian 迷们认为其他一切都是垃圾，Arch 族认为自己是真正的前沿，Slackware 爱好者认为其他人都是新手，而 NixOS 的那些人则认为其他所有人仍然停留在某个石器时代……

*（题图：MJ/3dcb3470-0b08-41bf-b826-be5afac57775）*

---

via: <https://www.theregister.com/2023/07/18/linux_desktop_debate/>

作者：[Liam Proven](https://www.theregister.com/Author/Liam-Proven) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](/article-16013-1.html) 荣誉推出


Bash 基础知识系列 #5：在 Bash 中使用数组

# Bash 基础知识系列 #5：在 Bash 中使用数组

>
> 本章将介绍如何在 Bash Shell 脚本中使用数组。学习添加元素、删除元素和获取数组长度。
>
>
>

在本系列的前面部分中，你了解了变量。变量中可以有单个值。

数组内部可以有多个值。当你必须一次处理多个变量时，这会使事情变得更容易。你不必将各个值存储在新变量中。

因此，不要像这样声明五个变量：

```
distro1=Ubuntu
distro2=Fedora
distro3=SUSE
distro4=Arch Linux
distro5=Nix

```

你可以在单个数组中初始化它们所有：

```
distros=(Ubuntu Fedora SUSE "Arch Linux" Nix)

```

与其他一些编程语言不同，你不使用逗号作为数组元素分隔符。

那挺好的。让我们看看如何访问数组元素。

### 在 Bash 中访问数组元素

使用索引（数组中的位置）访问数组元素。要访问索引 N 处的数组元素，请使用：

```
${array_name[N]}

```

>
> ? 与大多数其他编程语言一样，Bash Shell 中的数组从索引 0 开始。这意味着第一个元素的索引为 0，第二个元素的索引为 1，第 n 个元素的索引为 `n-1`。
>
>
>

因此，如果你想打印 SUSE，你将使用：

```
echo ${distros[2]}

```

>
> ? `${` 之后或 `}` 之前不能有任何空格。你不能像 `${ array[n] }` 那样使用它。
>
>
>

### 一次访问所有数组元素

假设你要打印数组的所有元素。

你可以一一使用 `echo ${array[n]}` 但这确实没有必要。有一个更好更简单的方法：

```
${array[*]}

```

这将为你提供所有数组元素。

### 在 Bash 中获取数组长度

如何知道数组中有多少个元素？ 有一个专门的方法 [在 Bash 中获取数组长度](https://linuxhandbook.com:443/array-length-bash/)：

```
${#array_name[@]}

```

就这么简单，对吧？

### 在 Bash 中添加数组元素

如果必须向数组添加其他元素，请使用 `+=` 运算符 [将元素追加到 Bash 中的现有数组](https://linuxhandbook.com:443/bash-append-array/)：

```
array_name+=("new_value")

```

这是一个例子：

>
> ? 追加元素时使用 `()` 很重要。
>
>
>

你还可以使用索引将元素设置在任何位置。

```
array_name[N]=new_value

```

**但请记住使用正确的索引编号。** 如果在现有索引上使用它，新值将替换该元素。

如果你使用“越界”索引，它仍会添加到最后一个元素之后。例如，如果数组长度为 6，并且你尝试在索引 9 处设置新值，则该值仍将作为最后一个元素添加到第 7 个位置（索引 6）。

### 删除数组元素

你可以使用 Shell 内置的 `unset` 通过提供索引号来删除数组元素：

```
unset array_name[N]

```

这是一个示例，我删除了数组的第四个元素。

你还可以通过 unset 来删除整个数组：

```
unset array_name

```

>
> ? Bash 中没有严格的数据类型规则。你可以创建一个同时包含整数和字符串的数组。
>
>
>

### ? 练习时间

让我们练习一下你所学到的有关 Bash 数组的知识。

**练习 1**：创建一个 Bash 脚本，其中包含五个最佳 Linux 发行版的数组。全部打印出来。

现在，用 “Hannah Montanna Linux” 替换中间的选择。

**练习 2**：创建一个 Bash 脚本，该脚本接受用户提供的三个数字，然后以相反的顺序打印它们。

预期输出：

```
Enter three numbers and press enter
12 23 44
Numbers in reverse order are: 44 23 12

```

我希望你喜欢通过本系列学习 Bash Shell 脚本。在下一章中，你将学习如何使用 `if-else`。敬请关注。

*（题图：MJ/09477e2f-2bf9-4fdf-bc1e-c894a068adf2）*

---

via: <https://itsfoss.com/bash-arrays/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Linux 爱好者线下沙龙：LLUG 2023 ，上海 · 集合

Summary: 终于，大家千呼万唤的 LLUG 上海，来了。

终于，大家千呼万唤的 LLUG 上海，来了。

# Linux 爱好者线下沙龙：LLUG 2023 ，上海 · 集合

自打 LLUG 北京活动举办，大家就开始纷纷希望 LLUG 能够在自己所在的城市中举办，其中，呼声最高的，莫过于上海。

终于，大家千呼万唤的 LLUG 上海，来了。

7 月 23 日下午，我们将在上海举办 LLUG 线下活动，和大家一起聊聊 Linux 和开源技术方面的新动态，给 Linux 爱好者们送些小福利，以及邀请业界大咖，来给大家做个线下分享。本次我们分享的主题是：**社区与云**。

具体议程如下：

| 时间 | 议程 | 演讲者 |
| --- | --- | --- |
| 14:00 - 14:30 | 签到 |  |
| 14:30 - 15:00 | 《浅谈云计算架构设计》 | 肖力某创业公司技术合伙人，腾讯云 TVP，中国商业联合会互联网应用工作委员会智库专家 |
|  15:00 - 15:10 | 《龙蜥技术认证课程介绍》 | 蔡佳丽龙蜥社区运营委员 |
| 15:10 - 15:30 | 茶歇  |  |
| 15:30 - 16:00 | LCTT Tools 发布 | 白宦成（Bestony）Linux 中国技术负责人 |
| 16:00 - 16:30 | 神秘话题 | 老王（wxy）Linux 中国创始人  |
| 16:30 - 17:30 | 闪电演讲 & 自由交流 |  |

### 活动信息

活动主办方：Linux 中国

联合主办方：龙蜥社区（OpenAnolis）

活动支持：奇虎 360、图灵社区、SlashData

活动地点：**上海市普陀区云岭东路570号**

活动时间：**2023 年 7 月 23 日，下午 14:00 ～ 17:00**

报名方式：点击[链接](https://jinshuju.net/f/R1YHy0)报名，或扫描下方二维码提交报名信息

如果你要来现场，不妨扫码加群，和我们更早的交流起来。到时候，咱们现场见！

### One More Thing

我们将会在活动现场举办线下抽奖，如果来到现场，别忘了参与互动，进行线下的抽奖哦～我们为大家准备了技术图书、小米背包、充电头等精选好物，期待在现场见到你哦～


硬核观察 #1068 现存最古老的发行版 Slackware 已经 30 岁了

Summary:
? 现存最古老的发行版 Slackware 已经 30 岁了
? 黑客之王凯文·米特尼克去世
? 苹果正在开发自己的人工智能大模型
»
»

莫名其妙被拉黑了，今天还想进你主页看看是不是很久没更新了，结果发现自己被拉黑了

# 硬核观察 #1068 现存最古老的发行版 Slackware 已经 30 岁了

### 现存最古老的发行版 Slackware 已经 30 岁了

本周，Slackware Linux 项目庆祝其成立 30 周年。Slackware 1.0 版本于 1993 年 7 月 16 日发布，它是目前仍在积极维护和开发的最古老的 Linux 发行版，虽然它不是第一个 Linux 发行版。最让人敬佩的是，其创始人至今仍在维护该项目。他说，“这真的是一段非凡的旅程，我在 1993 年开始时根本无法预料。”当前版本 Slackware 15 于 2021 年进入测试阶段，并于去年初发布。顺便说一句，MCC Interim Linux 可以说是第一个发行版，它的第一个候选版本 0.97 在 1991 年内核发布几个月后就出现了。Debian 比 Slackware 稍微年轻一点，是在 Slackware 发布两个月后发布的。

>
> **[消息来源：The Register](https://www.theregister.com/2023/07/20/slackware_turns_30/)**
>
>
>

>
> 老王点评：Slackware 是我用过的第一个 Linux 发行版，那应该是 1997 年或 1998 年。而我那时最喜欢的发行版是 Mandrake。
>
>
>

### 黑客之王凯文·米特尼克去世

<ruby> 凯文·米特尼克 <rt>  Kevin Mitnick </rt></ruby>，曾被称为 “世界头号通缉黑客”，于上周日去世，享年 59 岁。他曾因侵入和篡改公司计算机网络而入狱服刑，2000 年获释后开始了新的职业生涯，担任安全顾问、作家和公共演讲人。他最为人熟知的是 20 世纪 90 年代的疯狂犯罪，当时他从美国各地的电脑中窃取了成千上万的数据文件和信用卡号码。他利用自己的技能进入美国的电话和手机网络，破坏政府、企业和大学的计算机系统。1995 年，经过长达两年多的追捕，他被美国联邦调查局抓获。

>
> **[消息来源：Engadget](https://www.engadget.com/kevin-mitnick-formerly-the-worlds-most-wanted-hacker-has-passed-away-084912966.html)**
>
>
>

>
> 老王点评：这是一个传奇，虽然是那种以破坏为目的的“黑客”，但依然是传奇的一生。
>
>
>

### 苹果正在开发自己的人工智能大模型

据报道，苹果正在开发自己的大语言模型以及类似 ChatGPT 的 AI 工具。苹果的大模型代号 “Ajax”，苹果还创建了一个聊天机器人服务，一些工程师称之为 “Apple GPT”。苹果有多个团队在 AI 项目上展开合作，它已成为苹果的一大重要工作。苹果员工表示这项工作基本上是对 Bard、ChatGPT 的复制，并不包含任何新功能或新技术。苹果正在积极改进模型，但目前没有向消费者发布的计划。

>
> **[消息来源：彭博社](https://www.bloomberg.com/news/articles/2023-07-19/apple-preps-ajax-generative-ai-apple-gpt-to-rival-openai-and-google)**
>
>
>

>
> 老王点评：苹果在这一点上已经大大落后，不知道什么时候它的 Siri 才可以变聪明。
>
>
>


Geary 44 电子邮件应用添加了两项实用增强功能

Summary: Geary 44 听起来是一个有趣的版本，有一些有用的变化。

几年钱使用elementary os 的时候还不支持126,163,qq等国内邮箱，最近不知道是否支持？有在用的小伙伴告知一下，觉得它的软件界面很舒服，比thundbird要好些。

我用的是 Ubuntu 22.04 软件源中的 Geany 40：不支持像国产手机 ROM 自带的电子邮件客户端那样直接登陆，但支持手动输入 IMAP/POP3/SMTP 服务器地址登陆。我试了一下 QQ 邮箱和 163 邮箱，其中 163 邮箱账户无法登陆，QQ 邮箱能正常接收邮件，但邮件显示有问题，经常是邮件末尾显示出一大串代码或者是乱码，且一些邮件格式显示不正确。

刚刚又从 Flatpak 安装了 Geary 44，没有邮件乱码问题了，但还是有好多邮件加载不出来，且 163 邮箱中邮件的接收还是有问题。另外更正一下上一条中的笔误：不是 "Geany 40"，而是 "Geary 40"。

可能外国人更喜欢用Gmail outlook Hotmail 什么的。也许他们就没听说过163邮箱。

Geary 44 听起来是一个有趣的版本，有一些有用的变化。

# Geary 44 电子邮件应用添加了两项实用增强功能

>
> Geary 44 听起来是一个有趣的版本，有一些有用的变化。
>
>
>

Geary 是 [Linux 上最好的电子邮件客户端](https://itsfoss.com:443/best-email-clients-linux/) 之一，多年来增加了一些相当不错的更新。

它是 GNOME 项目下的一个电子邮件应用，**为 GNOME 桌面**（不限于）量身定制，支持 IMAP 和 SMTP 协议，使其能够与大多数网络邮件服务完美集成。

几天前，它发布了具有重要改进的新版本。让我们快速浏览一下这些内容。

### ? Geary 44：有什么新内容？

Geary 44 是一个相对较小的版本，有两个重要的补充。第一个是**重新设计的标题栏**，第二个是**重新设计的对话列表。**

新的“选择”按钮已添加到搜索按钮附近的标题栏中，并且消息视图工具栏图标的位置已更改。

当我们上次查看 Geary 时，它有不同的对话列表布局。但现在，**重新设计的对话列表让邮件阅读体验变得更好**。

你知道，这让我想知道 Geary 的这个版本与即将重新设计的 Thunderbird 相比会如何。你可能需要做出一些选择，是吗？?

#### ? 其他更改和改进

除了上面提到的之外，还有一些值得注意的变化：

* 修复网络检测问题。
* 各种用户界面翻译改进。
* 系统挂起时使用挂起引擎。
* 多个错误修复和用户界面调整。

你可以浏览 [发行说明](https://gitlab.gnome.org:443/GNOME/geary/-/tags/44.0) 以了解有关此版本的更多信息。

### ? 获取 Geary 44

你可以从 [GitLab](https://gitlab.gnome.org:443/GNOME/geary) 上提供的源代码构建 Geary，也可以从 [Flathub 商店](https://flathub.org:443/apps/org.gnome.Geary) 获取它。

>
> **[Geary 44 (Flathub)](https://flathub.org:443/apps/org.gnome.Geary)**
>
>
>

? 如果你要尝试此版本的 Geary，请告诉我们！

---

via: <https://news.itsfoss.com/geary-44-release/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


DNS 故障集锦

Summary: 当我第一次知道 DNS 时，我想它应该不会很复杂。

这是我迄今为止看到的最有水平的翻译，无关翻译本身，而是内容非常好，加鸡脚！！！

当我第一次知道 DNS 时，我想它应该不会很复杂。

# DNS 故障集锦

<img src="content_image/album_202307_21_122322a5gd2ff1ffagfbnr.jpg" alt="" title="">

当我第一次知道 DNS 时，我想它应该不会很复杂。不就是一些存储在服务器上的 DNS 记录罢了。有什么大不了的？

但是教科书上只是介绍了 DNS 的原理，并没有告诉你实际使用中 DNS 可能会以多少种方式破坏你的系统。这可不仅仅是缓存问题！

所以我 [在 Twitter 上发起了一个提问](https://twitter.com/b0rk/status/1481265429897261058)，征集人们遇到的 DNS 问题，尤其是那些一开始看起来与 DNS 没什么关系的问题。（“总是 DNS 问题”这个梗）

我不打算在这篇文章中讨论如何解决或避免这些问题，但我会放一些讨论这些问题的链接，在那里可以找到解决问题的方法。

### 问题：网络请求缓慢

如果你的网络比预期的要慢，这是因为某些原因导致 DNS 解析器变慢了。这可能是解析器负载过大或者存在内存泄漏等原因导致的。

我的路由器的 DNS 转发器曾遇到过这个问题，导致我的所有 DNS 请求很慢。我通过重启路由器解决了这个问题。

### 问题：DNS 超时

一些网友提到由于 DNS 查询超时，他们的网络请求需要耗时 2 秒多甚至 30 秒。这跟“网络请求缓慢”问题类似，但情况要更糟糕，因为 DNS 请求就会消耗掉几秒钟时间。

Sophie Haskins 有一篇关于 Kubernete DNS 超时的博客文章 [一次 Kube DNS 踩坑经历](https://blog.sophaskins.net/blog/misadventures-with-kube-dns/)。

### 问题：ndots 设置

一些网友提到在 `/etc/resolv.conf` 中设置 `ndots:5` 时会出现问题。

下面是从 [这篇](https://pracucci.com/kubernetes-dns-resolution-ndots-options-and-why-it-may-affect-application-performances.html)《Kubernetes 容器荚中 `/etc/resolv.conf` 里设置 `ndots:5` 为什么会拖慢你的程序性能》中引用的 `/etc/resolv.conf`文件。

```
    nameserver 100.64.0.10
    search namespace.svc.cluster.local svc.cluster.local cluster.local eu-west-1.compute.internal
    options ndots:5

```

如果你用上面的配置文件，想要查询得域名是 `google.com`，那么你的程序会调用 `getaddrinfo` 函数，而它会依次查询以下域名：

1. `google.com.namespace.svc.cluster.local.`
2. `google.com.svc.cluster.local.`
3. `google.com.cluster.local.`
4. `google.com.eu-west-1.compute.internal.`
5. `google.com.`

简单来说，它会检查 `google.com` 是不是 `search` 这一行中的某个子域名。

所以每发起一次 DNS 查询，你都得先等待前 4 次查询失败后才能获取到最终查询结果。

### 问题：难以判断系统使用的 DNS 解析器

这本身并不是一个问题，但当你遇到 DNS 问题时，一般都会跟 DNS 解析器有关。我没有一种判断 DNS 解析器的万能方法。

下面是我知道的方法：

* 在 Linux 系统上，最常见的是通过 `/etc/resolv.conf` 来选择 DNS 解析器。但是也有例外，比如浏览器可能会忽略 `/etc/resolv.conf`，而是使用 <ruby> 基于 HTTPS 的 DNS <rt>  DNS-over-HTTPS </rt></ruby> 服务。
* 如果你使用的是 UDP DNS，你可以通过 `sudo tcpdump port 53` 来查看 DNS 请求被发送到了哪里。但如果你使用的是基于 HTTPS 的 DNS 或 <ruby> 基于 TLS 的 DNS <rt>  DNS over TLS </rt></ruby>，这个方法就不行了。

我依稀记得这在 MacOS 系统上会更加令人迷惑，我也不清楚原因。

### 问题：DNS 服务器返回 NXDOMAIN 而不是 NOERROR

这是我曾经遇到过的一个 Nginx 不能解析域名的问题。

* 我设置 Nginx 使用一个特定的 DNS 服务器来解析 DNS 查询
* 当访问这个域名时，Nginx 做了两次查询，第一次是对 `A` 的，第二次是对 `AAAA` 的
* 对于 `A` 的查询，DNS 服务器返回 `NXDOMAIN`
* Nginx 认为这个域名不存在，然后放弃查询
* 对于 `AAAA` 的查询 DNS 服务器返回了成功
* 但 Nginx 忽略了对 `AAAA` 返回的查询结果，因为它前面已经放弃查询了

问题出在 DNS 服务器本应该返回 `NOERROR` 的——那个域名确实存在，只是没有关于 `A` 的记录罢了。我报告了这个问题，然后他们修复了这个问题。

我自己也写出过这个问题，所以我理解为什么会发生这种情况——很容易想当然地认为“没有要查询的记录，就应该返回 `NXDOMAIN` 错误码”。

### 问题：自动生效的 DNS 缓存

如果你在生成一个域名的 DNS 记录之前就访问这个域名，那么这个记录的缺失会被缓存起来。当你第一次遇到这个问题时一定会非常吃惊——我也是去年才知道有这个问题。

缓存的 TTL 就是域名的 <ruby> 起始权限记录 <rt>  Start of Authority </rt></ruby>（SOA） 记录的 TTL ——比如对于 `jvns.ca` ，这个值是一个小时。

### 问题：Nginx 永久缓存 DNS 记录

如果你在 Nginx 中使用下面的配置：

```
    location / {
        proxy_pass https://some.domain.com;
    }

```

Nginx 只会在启动的时候解析一次 `some.domain.com`，以后不会再对其进行解析。这是非常危险的操作，尤其是对于那些 IP 地址经常变动的域名。它可能平安无事地运行几个月，然后突然在某个凌晨两点把你从床上纠起来。

针对这个问题已经有很多众所周知的方法了，但由于本文不是关于 Nginx 的，所以我不打算深入探讨它。但你第一次遇到它时一定会很惊讶。

这是一篇关于这个问题发生在 AWS 负载均衡器上的 [博客文章](https://medium.com/driven-by-code/dynamic-dns-resolution-in-nginx-22133c22e3ab)。

### 问题：Java 永久缓存 DNS 记录

跟上面类似的问题，只是出现在 Java 上：[据说](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-jvm-ttl.html) 这与你 Java 的配置有关。“JVM 的默认 TTL 设置可能会导致只有 JVM 重启时才会刷新 DNS 记录。”

我还没有遇到过这个问题，不过我那些经常写 Java 的朋友遇到过这个问题。

当然，任何软件都可能存在永久缓存 DNS 的问题，但据我所知它经常出现在 Nginx 和 Java 上。

### 问题：被遗忘的 /etc/hosts 记录

这是另一种缓存问题：`/etc/hosts` 中的记录会覆盖你的常规 DNS 设置！

让人迷惑的是 `dig` 命令会忽略 `/etc/hosts` 文件。所以当你使用 `dig whatever.com` 来查询 DNS 信息时，它会告诉你一切正常。

### 问题：电子邮件未发送 / 将成为垃圾邮件

电子邮件是通过 DNS（MX 记录, SPF 记录, DKIM 记录）来发送和验证的，所以有些电子邮件问题其实是 DNS 问题。

### 问题：对国际化域名无效

你可以使用非 ASCII 字符甚至是表情符来注册域名，比如 [拉屎网 https://?.la](https://xn--ls8h.la/)。

DNS 能够处理国际化域名是因为 `?.la` 会被用 punycode 编码将转换为 `xn--ls8h.la`。

尽管已经有了 DNS 处理国际化域名的标准，很多软件并不能很好地处理国际化域名。Julian Squires 的 [干掉 Chrome 浏览器的表情符！！](https://www.youtube.com/watch?v=UE-fJjMasec) 就是一个非常有趣的例子。

### 问题：TCP DNS 被防火墙拦截

有人提到一些防火墙会允许在 53 端口上使用 UDP 协议，但是禁止 TCP 协议。然而很多 DNS 查询需要在 53 端口上使用 TCP，这可能会导致很难排查的间歇性的问题。

### 问题：musl 不支持 TCP DNS

很多应用程序使用 `libc` 的 `getaddrinfo` 来做 DNS 查询。`musl` 是用在 Alpine Docker 容器上的 `glibc` 替代品。而它不支持 TCP DNS。如果你的 DNS 查询的响应数据超过 DNS UDP 数据包的大小（512 字节）就会出现问题。

我对此仍然不太清楚，我下面我的理解也可能是错的:

1. `musl` 的 `getaddrinfo` 发起一个 DNS 请求
2. DNS 服务器发现请求的响应数据太大了，没法放入一个 DNS 数据包中
3. DNS 服务器返回一个<ruby> 空截断响应 <rt>  empty truncated response </rt></ruby>，并期望客户端通过 TCP DNS 重新用发起查询
4. 但 `musl` 不支持 TCP DNS，所以根本不会重试

关于这个问题的文章：[在 Alpine Linux 上的 DNS 解析问题](https://christoph.luppri.ch/fixing-dns-resolution-for-ruby-on-alpine-linux)。

### 问题：getaddrinfo 不支持轮询 DNS

<ruby> 轮询 <rt>  round robin </rt></ruby> DNS 是一种 <ruby> 负载均衡 <rt>  load balancing </rt></ruby> 技术，每次 DNS 查询都会获得一个不同的 IP 地址。显然如果你使用 `gethostbyname` 做 DNS 查询不会有任何问题，但是用 `getaddrinfo` 就不行了。因为 `getaddrinfo` 会对获得的 IP 地址进行排序。

在你从 `gethostbyname` 切换到 `getaddrinfo` 时可能完全不会意识到这可能会引起负载均衡问题。

这个问题可能会非常隐蔽，如果你不是用 C 语言编程的话，这些函数调用被隐藏在各种调用库背后，你可能完全意识不到发生了这种改变。所以某次看似人畜无害的升级就可能导致你的 DNS 负载均衡失效。

下面是讨论这个的一些文章：

* [getaddrinfo 导致轮询 DNS 失效](https://groups.google.com/g/consul-tool/c/AGgPjrrkw3g)
* [getaddrinfo，轮询 DNS 和 happy eyeballs 算法](https://daniel.haxx.se/blog/2012/01/03/getaddrinfo-with-round-robin-dns-and-happy-eyeballs/)

### 问题：启动服务时的竞争条件

有人 [提到](https://mobile.twitter.com/omatskiv/status/1481305175440646148) 使用 Kubernete DNS 时遇到的问题：他们有两个同时启动的容器，一旦启动就会立即尝试解析对方的地址。由于 Kubernete DNS 还没有改变，所以 DNS 查询会失败。这个失败会被缓存起来，所以后续的查询会一直失败。

### 写在最后

我所列举的不过是 DNS 问题的冰山一角，期待大家告诉我那些我没有提到的问题和相关链接。我希望了解这些问题在实际中是如何发生的以及如何被解决的。

*（题图：MJ/f512f18e-2e1d-4614-bed1-b0a0c373e14d）*

---

via: <https://jvns.ca/blog/2022/01/15/some-ways-dns-can-break/>

作者：[Julia Evans](https://jvns.ca/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[toknow-gh](https://github.com/toknow-gh) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1069 IMAX 电影播放仍然需要一台 21 年前的掌上电脑

Summary:
? IMAX 电影播放仍然需要一台 21 年前的掌上电脑
? 特斯拉开始生产可以媲美超算榜首的 Dojo 超级计算机
? AMI 固件中发现影响数百万计算机的严重漏洞
»
»

“老王点评：2000 年时，我用过早期 Palm，却没想到在二十几年后 Palm 仍然在用。”

冷门的东西超级防盗版/防破解。。。

似乎一个原因是：用者少，太冷门，很少有黑客会投入精力。好不容易做出来的成果无人反馈，也影响黑客的积极性。

注：此处的“黑客”概念与《提问的智慧》中的黑客相同。

# 硬核观察 #1069 IMAX 电影播放仍然需要一台 21 年前的掌上电脑

### IMAX 电影播放仍然需要一台 21 年前的掌上电脑

在《奥本海默》上映之前，IMAX TikTok 官方账号发布的一段视频中，有一个小小的蓝银色 Palm 设备。它是在另一台设备上运行的 Palm Pilot 模拟器，安装在放置卷轴的机器旁边的白色柱子上。这个仿真的设备是 Palm m130，于 2002 年发布。它有一个两英寸的 160x160 显示屏，采用 33MHz 的摩托罗拉处理器，运行 Palm OS 4.1 系统。在 IMAX 影院中，该掌上电脑的工作是控制快转卷轴装置，多年来，在大多数 IMAX 影院里，似乎都有一个实体 m130。IMAX 为什么还要在 21 年前的设备上运行其系统？又为什么会选择在一台蹩脚的 Windows 平板电脑上简单地模拟这台 21 年前的设备呢？因为，放映员们已经习惯了它的存在。

>
> **[消息来源：The Verge](https://www.theverge.com/23801118/imax-movie-palm-pilot-oppenheimer)**
>
>
>

>
> 老王点评：2000 年时，我用过早期 Palm，却没想到在二十几年后 Palm 仍然在用。
>
>
>

### 特斯拉开始生产可以媲美超算榜首的 Dojo 超级计算机

特斯拉在 2023 年第二季度财报中概述了大规模解决车辆自动驾驶问题所需的四大技术支柱：超大型真实世界数据集、神经网络训练、车辆硬件和车辆软件。特斯拉表示，它已经开始生产用于训练其自动驾驶车队的 Dojo 超级计算机，该计算机宣布于 2019 年。特斯拉已经拥有一台基于英伟达 GPU 的大型超级计算机，它是世界上最强大的超级计算机之一，但新的 Dojo 定制计算机使用的是特斯拉设计的芯片。此前，马斯克曾宣称，Dojo 的运算能力将达到 1 ExaFLOP。目前，据公开披露的信息，美国橡树岭国家实验室的超级计算机 Frontier 是全球首台达到 ExaFLOP 级别的计算机，也是唯一一台。

>
> **[消息来源：The Verge](https://www.theverge.com/2023/7/19/23800854/tesla-driverless-dojo-supercomputers-production)**
>
>
>

>
> 老王点评：虽然可能还需要一年时间，但是特斯拉能从芯片到贴片、托盘、机架，乃至于构成一个集群，其计算实力不容小觑。
>
>
>

### AMI 固件中发现影响数百万计算机的严重漏洞

这些漏洞是在 AMI 为 BMC（底板管理控制器）制作的固件中发现的，BMC 是集成在服务器主板上的小型计算机，可以远程管理多台计算机。可以访问 Redfish 远程管理接口的本地或远程攻击者可以利用这些漏洞，导致未经授权的访问、远程代码执行和服务器的潜在物理损坏。这一漏洞使其能够在世界上一些最敏感的云环境中获得超级用户身份。在那里，攻击者可以安装勒索软件和间谍恶意软件，在受感染机器的最底层运行。成功的攻击者还可能对服务器造成物理损坏或无限期重启循环。

>
> **[消息来源：Ars Technica](https://arstechnica.com/security/2023/07/millions-of-servers-inside-data-centers-imperiled-by-flaws-in-ami-bmc-firmware/)**
>
>
>

>
> 老王点评：在支持远程管理的固件上出现的安全漏洞，那才叫一个防不胜防。
>
>
>


什么是 KDE Connect？怎么用？

值得注意的是，如果电脑端配置了防火墙，必须先放行 KDE Connect 服务，端口为 1714:1764/tcp|1714:1764/udp。

另外，手机与计算机配对后，可以同步剪切板，但电脑到 Android 设备的同步是自动进行的，手机到电脑的同步则必须点击 KDE Connect 的常驻通知中的 "发送剪切板" 来完成，这是由于 Android 系统不允许后台运行的应用自动读取系统剪切板内容。据说可以通过一些 Magisk 模块来解决这一问题。

KDE Connect 不仅可以连接电脑与手机，两部手机也可以进行配对，互相发送剪切板内容及文件。

KDE Connect 还有一个 "查找设备" 应用，可

KDE Connect 还有一个 "查找设备" 应用，可以让设备响铃，说实话还挺实用的，但在 MIUI 14 上测试时发现当手机处于熄屏状态时，手机没法响铃，不知道是哪里的配置出了问题。<br />
另外，KDE Connect 还有一个 "开放文件系统" 功能，可以通过 KDE 的 Dolphin 文件管理器直接查看已配对的设备中的文件。（应该是只能在 Dolphin 上使用，其他文件管理器貌似不可以）

"开放文件系统" 功能是通过 SFTP 实现，默认访问的是 /，而根目录没权限，所以会报错。

只需在后面加上 storage/emulated/0 或 sdcard 就行了。

Android 10 以上出于安全考虑禁止 APP 后台操作剪切板，但也有解决方案。

1. ADB 调试桥: invent.kde.org/network/kdeconnect-android/-/commit/edc655da5ac1eb5c3027c8556cc62037a1d4c5ac

1. Magisk 模块 (需 ROOT): github.com/Kr328/Riru-ClipboardWhitelist

2. Xposed 模块 (需 ROOT): github.com/GamerGirlandCo/xposed-clipboard-whitelist

KDE Connect 想要跨局域网同步，只需在外面套一层 OpenVPN 就行了。

见：userbase.kde.org/KDEConnect#Running_KDE_Connect_over_OpenVPN

# 什么是 KDE Connect？怎么用？

>
> 什么是 KDE Connect？它的主要特性是什么？它应该如何安装？本文提供了基本的使用指南。
>
>
>

科技日新月异。有各种软件、硬件和不同外形的设备。未来，不同设备之间将无缝集成，工作流程会跨越多个设备。每一天，我们都在向跨所有联网设备发送和接收数据的状态迈进。而 KDE Connect 就是引领 Linux 桌面系统向这一天进展的一面旗帜。

### 什么是 KDE Connect？

[KDE Connect](https://kdeconnect.kde.org/) 是由 KDE 桌面团队开发的，提供了 Linux 系统与其他系统，如 Windows、MacOS、Android 及 Linux，的无缝连接。

KDE Connect 安装后会使你拥有接收电话的通知、发送或接受短信、浏览文件、发送或接受文件等许多功能。

此外，KDE Connect 在无线网络上遵循安全协议，以防止任何隐私泄露。它是自由开源的软件，出现任何隐患的可能性微乎其微。组合了这些优良特性，KDE Connect 是一款出色的工具。

下文介绍你如何安装和使用它。

### 安装 KDE Connect

本文将为你展示如何在 Linux 发行版和安卓智能手机之间连接。Windows 与安卓的连接也应是如此。

KDE Connect 的设置是一个双向过程。你必须在你的 Linux 发行版和你的安卓智能手机都安装 KDE Connect。

#### 在 Linux 发行版上安装

在你的 Linux 发行版上安装 KDE Connect 很简单。其在所有的主流 Linux 发行版的官方仓库中都可用。如果你在用 Ubuntu，并且想在终端安装，运行如下指令：

```
sudo apt install kdeconnect

```

Fedora：

```
sudo dnf install kdeconnect

```

Arch Linux：

```
pacman -S kdeconnect

```

或在 “<ruby> 软件 <rt>  Software </rt></ruby>” 应用中搜索并安装。

对于 Windows 和其他 Linux 发行版，请参考 [这个页面](https://kdeconnect.kde.org/download.html) 的其他几种下载安装方式。

#### 在安卓智能手机上安装

在安卓设备中，在谷歌 Play 商店中搜索 “KDE Connect” 并安装。

>
> **[谷歌 Play 商店中的 KDE Connect](https://play.google.com/store/apps/details?id=org.kde.kdeconnect_tp&hl=en_IN&gl=US)**
>
>
>

如果你在使用某个自由版本的安卓，你可以用下面的链接来通过 F-droid 安装。（感谢我们的读者提出这一条）。

>
> **[F-droid 商店中的 KDE Connect](https://f-droid.org/en/packages/org.kde.kdeconnect_tp/)**
>
>
>

### 设置 KDE Connect

KDE Connect 可以连接相同网络中的设备。因此，确保你的 Linux 系统和安卓设备都连接到了同一个无线网络中。

打开你手机里的 KDE Connect。你应该可以见到你的 Linux 系统的名称。如果没有看到任何内容，确保你的设备和 Linux 都连接到了同一个网络后点击“<ruby> 刷新 <rt>  Refresh </rt></ruby>”。

打开 Linux 中的 KDE Connect，你应当见到你的手机进入了下图展示的样子。

现在，点开你手机的名称然后点击 “<ruby> 配对 <rt>  Pair </rt></ruby>”。

紧接着你的手机就会收到一个提醒：是否接受配对。选择 “<ruby> 接受 <rt>  Accept </rt></ruby>”。

代表你的手机的图标应当转为绿色 ，这表示你的手机和 Linux 系统都已经连接且配对。

默认情况下，程序会开启以下特性：

* 多媒体控制
* 远程输入
* 远程演示
* 搜寻设备
* 分享文件

以下的特性需要你的安卓设备的额外权限。因为它们与隐私相关，这意味着你需要手动启用它们。

* 短信发送及接收
* 控制媒体播放器
* 手机上接受电脑的键盘输入
* 提醒同步
* 来电提醒
* 联系人同步
* 接受鼠标操作

对于这些特性，你需要去手动打开选项，并在安卓手机中授予权限。然后你就可以在 Linux 设备中享受这些服务了。

### 示例：提醒同步

我将为你演示提醒同步选项应在何处打开。打开你安卓手机中的 KDE Connect 程序，进入 “<ruby> 已连接设备 <rt>  Connected Device </rt></ruby>” 部分。打开 “<ruby> 提醒同步 <rt>  Notification Sync </rt></ruby>” 并选择 “<ruby> 打开设置应用 <rt>  OPEN SETTINGS </rt></ruby>”。

对 KDE Connect 启用通知访问，然后点击 “<ruby> 允许 <rt>  Allow </rt></ruby>”。

之后将展示你手机上的提醒到你的 Linux 设备。例如，下面的提醒是我在我的测试安卓设备中收到的。

同样的信息也展现在了 Linux 系统中的 KDE Connect。

同样地，在给 KDE Connect 权限后，你可以启动对你可用的其他服务。

### 总结

我希望这个指南可以帮助你在你的 Linux 系统和手机中设置 KDE Connect。

你可以在给与一些主要权限后，轻松地设置几个特性，以使 KDE Connect 应用程序发挥最大优势。配置完成后，你不再需要一直看你的手机。因为你可以在工作时轻易地在你的台式电脑或笔记本上阅读提示、回消息。

你觉得 KDE Connect 怎么样？发在下面的评论框来让我知道吧。

*（题图：MJ/5b09a037-14c3-4f62-a15a-dfd9fb2c7b3a）*

---

via: <https://www.debugpoint.com/2022/01/kde-connect-guide/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[yjacks](https://github.com/yjacks) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Linux 主机和 KVM 中的 Windows 客户机之间共享文件夹

samba完事

# 如何在 Linux 主机和 KVM 中的 Windows 客户机之间共享文件夹

>
> 在本指南中，你将了解如何在 Linux 主机（例如使用 KVM 的 Fedora、Ubuntu 或 Linux Mint）下运行的 Windows 客户机之间共享文件夹。
>
>
>

[virt-manager](https://virt-manager.org/) 应用（带有 [libvirt](https://libvirt.org/manpages/libvirtd.html)）和软件包提供了一组灵活的工具来管理 Linux 中的虚拟机。它是自由开源的，用于 KVM 虚拟机和其他虚拟机管理程序。

在上一篇文章中，我解释了 [如何在 Linux 客户机和 Linux 主机之间共享文件夹](https://www.debugpoint.com/share-folder-virt-manager/)。然而，当你尝试使用 Windows 客户机和 Linux 主机创建共享文件夹时，这是一个有点困难和复杂的过程。因为两种操作系统的工作方式不同，需要进行大量配置。

按照下面提到的说明在 Windows 客户机和 Linux 主机之间共享文件夹。

### 关于 virtiofs 的说明

共享文件和文件夹由名为 virtiofs 的 libvirt 共享文件系统提供支持。它提供了访问主机上目录树的所有功能和参数。由于大多数 virt-manager 虚拟机配置都会转换为 XML，因此共享文件/文件夹也可以由 XML 文件指定。

注意：如果你正在寻求在**两台 Linux 计算机**（客户机和主机）之间使用 KVM 进行文件共享，请 [阅读此文](https://www.debugpoint.com/share-folder-virt-manager/)。

### 使用 KVM 在 Windows 客户机和 Linux 主机之间共享文件夹

以下说明假设你已在任何 Linux 主机的 virt-manager 中安装了 Windows。如果没有，你可以阅读有关如何在 Linux 中安装 Windows 的完整指南。

#### 在 virt-manager 中设置挂载标签

首先，确保你的客户虚拟机已关闭。从 virt-manager GUI 中，选择虚拟机并单击“<ruby> 打开 <rt>  Open </rt></ruby>”以调出控制台设置。

单击工具栏中显示虚拟硬件详细信息的图标。然后单击左侧面板上的“<ruby> 内存 <rt>  Memory </rt></ruby>”。

选择选项“<ruby> 启用共享内存 <rt>  Enable shared memory </rt></ruby>”。单击“<ruby> 应用 <rt>  Apply </rt></ruby>”。

确保 XML 在 XML 选项卡中显示 `<access mode="shared"/>`，如下所示。

```
<memoryBacking>
    <source type="memfd"/>
    <access mode="shared"/>
  </memoryBacking>

```

单击底部的“<ruby> 添加硬件 <rt>  Add hardware </rt></ruby>”。

从添加新硬件窗口的左侧面板中选择“<ruby> 文件系统 <rt>  Filesystem </rt></ruby>”。

然后在详细信息选项卡中选择 “<ruby> 驱动 <rt>  Driver </rt></ruby>” 为 “virtiofs”。单击“<ruby> 浏览 <rt>  browse </rt></ruby> > <ruby> 浏览本地 <rt>  browse local </rt></ruby>”并从 Linux 系统中**选择主机路径**。

在“<ruby> 目标路径 <rt>  Target path </rt></ruby>”中，输入你想要的任何名称。它只是一个文件标签，将在挂载过程中使用。目标路径中的此名称将作为 Windows 中的驱动器挂载，即资源管理器中的我的电脑。

我已添加 “linux\_pictures” 作为目标挂载标签。

因此，如果我想访问图片文件夹（`/home/debugpoint/Pictures`），示例设置可能如下：

单击“<ruby> 完成 <rt>  Finish </rt></ruby>”。

上述配置的 XML 设置如下。你可以在 XML 选项卡中找到它。

```
<filesystem type="mount" accessmode="passthrough">
  <driver type="virtiofs"/>
  <source dir="/home/debugpoint/Pictures"/>
  <target dir="linux_pictures"/>
  <address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
</filesystem>

```

在 virt-manager 主窗口中，右键单击 Windows 虚拟机，然后单击“<ruby> 运行 <rt>  Run </rt></ruby>”启动虚拟机。如果未显示虚拟机，请单击“显示图形控制台”（工具栏中的监视器图标）。

#### 设置 WinFSP – 适用于 Windows 的 FUSE

确保 Windows 虚拟机（客户机）正在运行。

首先，我们需要安装 WinFSP（Windows File System Proxy）– FUSE for Windows。这使你能够毫无困难地挂载任何类 UNIX 文件系统。

从客户 Windows 计算机打开 WinFSP 的 GitHub 页面。

>
> **[下载 WinFSP 安装程序](https://github.com/winfsp/winfsp/releases/)**
>
>
>

下载 WinFSP .msi 安装程序。

在 Windows 虚拟机上安装软件包。安装软件包时请确保选择 “Core”。完成安装。

#### 创建 VirtIO-FS 服务

进入 `stable-virtio` 文件夹，从以下地址下载 `virtio-win-guest-tools.exe`。

>
> **[下载 virtio-win-guest-tools](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)**
>
>
>

在 Windows 虚拟机上安装软件包。

安装完成后，**重启** Windows 虚拟机。

重启后，在开始菜单中搜索打开“设备管理器”。

进入系统设备并查找 “VirtIO FS 设备”。它应该被识别并且驱动程序应该由 Red Hat 签名。

**注意**：（可选）如果你看到感叹号，即未检测到驱动程序，请按照 [此处](https://virtio-fs.gitlab.io/howto-windows.html) 说明下载 ISO 文件、安装它并手动检测驱动程序。

打开开始菜单并搜索“服务”。

向下滚动找到 “VirtIO-FS Service”。右键单击并单击“开始”启动该服务。

或者，你可以以管理员身份从 PowerShell/命令提示符运行以下命令来启动服务。

```
sc create VirtioFsSvc binpath="C:\Program Files\Virtio-Win\VioFS\virtiofs.exe" start=auto depend="WinFsp.Launcher/VirtioFsDrv" DisplayName="Virtio FS Service"

```

```
sc start VirtioFsSvc

```

服务启动后，打开资源管理器，你应该看到你在上面第一步中创建的挂载标签，该标签应映射为 Z 驱动器。见下图。

你现在可以根据需要使用修改后的权限访问整个 Linux 文件夹。

以下是在 Linux Mint 和 Windows 客户虚拟机中访问的同一文件夹的并排比较。

### 总结

我希望你现在能够在 Windows 客户机和 Linux 主机系统之间共享文件夹。本文在 Linux Mint 中测试了上述方法。它应该也适用于 Ubuntu、Fedora。

如果上述方法有效，请在下面发表评论以造福他人。

### 参考

* <https://virtio-fs.gitlab.io/howto-windows.html>
* <https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/>
* <https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md>
* <https://github.com/virtio-win/kvm-guest-drivers-windows/issues/473>

*（题图：MJ/91c30453-5939-4368-b885-c4cb84e732bf）*

---

via: <https://www.debugpoint.com/kvm-share-folder-windows-guest/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1070 社区批评 Meta 滥用“开源”来称呼其新大语言模型

Summary:
? 社区批评 Meta 滥用“开源”来称呼其新大语言模型
? 人工智能公司承诺将为人工智能生成内容打上水印
? Cerebras 推出人工智能超级计算机网络
»
»

印度linux才是滥用开源一词最多的。。。

总有这么一些操作：标榜“开源”，但不用OSI批准的许可证，关键组件还遮遮掩掩不放出源码。

要商业就踏踏实实搞商业，别用“开源”当噱头。

你最好真的在说印度

# 硬核观察 #1070 社区批评 Meta 滥用“开源”来称呼其新大语言模型

### 社区批评 Meta 滥用“开源”来称呼其新大语言模型

Meta AI 宣称：“Llama 2 是我们的下一代开源 LLM，可用于研究和商业用途”。但事实上 Llama 2 并没有使用 OSI（开源计划）批准的许可证，也不符合 OSD（开源定义）。其社区协议禁止使用 Llama 2 训练其他语言模型；如果在月活用户超过 7 亿的应用程序或服务中使用该技术，比如那些大公司，则需要获得 Meta 的特殊许可。对于程序员来说，可能是否“开源”并不要紧，他们能够用它来搭建和研究就够了。对于 Meta 高层来说，“开源”被他们当成了一个营销用语，但是这显然会让人对“开源”一词产生混淆。

>
> **[消息来源：The Register](https://www.theregister.com/2023/07/21/llama_is_not_open_source/)**
>
>
>

>
> 老王点评：我不觉得 Meta 不知道什么是“开源”，但是这种草率编写的许可协议，显然代表了 Meta 既想借开源的模式打狼，又担心开源反而赔了孩子。这种首鼠两端的想法最后不会有好结果。
>
>
>

### 人工智能公司承诺将为人工智能生成内容打上水印

OpenAI、Alphabet、Meta、亚马逊和微软等七家主要的美国人工智能公司，承诺开发一个系统来 “标记” 文本、图像、音频、视频等所有形式的人工智能生成的内容，这样用户就能知道什么时候使用了这项技术。这种以技术方式嵌入内容的水印，会让用户更容易发现深度伪造的图像或音频。他们还承诺在发布新的人工智能系统前进行彻底地测试，并分享诸如如何降低风险等信息。

>
> **[消息来源：路透社](https://www.reuters.com/technology/openai-google-others-pledge-watermark-ai-content-safety-white-house-2023-07-21/)**
>
>
>

>
> 老王点评：这真的能做到到么？或者说，这种水印能被其它人工智能系统去掉吧。更不要说还有开源的人工智能系统。
>
>
>

### Cerebras 推出人工智能超级计算机网络

Cerebras 公司推出了 Condor Galaxy 项目，这是一个由九台相互连接的超级计算机组成的网络，专为人工智能模型训练而设计，总性能达到 36 FP16 ExaFLOP。其中第一台超级计算机 CG-1 是由 64 台 Cerebras CS-2 系统整合而成，有 5400 万个内核，能够为人工智能训练提供 4 ExaFLOP 的算力。它支持多达 6000 亿个参数的模型，其配置可扩展至支持多达 100 万亿个参数。其它几台将陆续建设。该公司 CEO 称，“许多云计算公司都宣布了耗资数十亿美元建造的大规模 GPU 集群，但这些集群却极难使用。将一个模型分布到数千个微小的 GPU 上，需要数十名具有罕见专业知识的人员花费数月的时间。CG-1 消除了这一挑战。建立一个生成式人工智能模型只需要几分钟，而不是几个月，而且一个人就能完成。”

>
> **[消息来源：Anand Tech](https://www.anandtech.com/show/18969/cerebras-to-enable-a-network-of-ai-supercomputers-36-exaflops-for-ai)**
>
>
>

>
> 老王点评：算力不是问题，将来的人工智能系统才是问题。这样大量训练出来的人工智能系统，真的能按照人们最善良的愿望去发展吗？
>
>
>


在 Linux 中使用 cat 命令

Summary: cat 命令的用途不仅仅是显示文件内容。

cat 命令的用途不仅仅是显示文件内容。

# 在 Linux 中使用 cat 命令

>
> `cat` 命令的用途不仅仅是显示文件内容。
>
>
>

`cat` 命令用于打印文本文件的文件内容。至少，大多数 Linux 用户都是这么做的，而且没有什么问题。

`cat` 实际上代表 “<ruby> 连接 <rt>  concatenate </rt></ruby>”，创建它是为了 [合并文本文件](https://linuxhandbook.com:443/merge-files/)。但只要有一个参数，它就会打印文件内容。因此，它是用户在终端中读取文件而无需任何其他选项的首选。

### 在 Linux 中使用 cat 命令

要使用 `cat` 命令，你必须遵循给定的命令语法：

```
cat [options] Filename(s)

```

这里：

* `[options]` 用于修改 `cat` 命令的默认行为，例如使用 `-n` 选项获取每行的数字。
* `Filename` 是你输入要使用的文件的文件名的位置。

为了简单起见，我将在本指南中使用名为 `Haruki.txt` 的文本文件，其中包含以下文本行：

```
Hear the Wind Sing (1979)
Pinball, 1973 (1980)
A Wild Sheep Chase (1982)
Hard-Boiled Wonderland and the End of the World (1985)
Norwegian Wood (1987)
Dance Dance Dance (1990)
South of the Border, West of the Sun (1992)
The Wind-Up Bird Chronicle (1994)
Sputnik Sweetheart (1999)
Kafka on the Shore (2002)
After Dark (2004)
1Q84 (2009-2010)
Colorless Tsukuru Tazaki and His Years of Pilgrimage (2013)
Men Without Women (2014)
Killing Commendatore (2017)

```

那么，在没有任何选项的情况下使用时，输出会是什么？ 好吧，让我们看一下：

```
cat Haruki.txt

```

正如你所看到的，它打印了整个文本文件！

但你可以做的远不止这些。让我向你展示一些实际例子。

#### 1、创建新文件

大多数 Linux 用户使用 `touch` 命令来 [创建新文件](https://itsfoss.com/create-files/)，但使用 `cat` 命令也可以完成相同的操作！

在这种场景下，`cat` 命令比 `touch` 命令有一个优势，因为你可以在创建文件时向文件添加文本。听起来很酷。不是吗？

为此，你需要使用 `cat` 命令，将文件名附加到 `>` 后面，如下所示：

```
cat > Filename

```

例如，在这里，我创建了一个名为 `NewFile.txt` 的文件：

```
cat > NewFile.txt

```

当你这样做了，就会有一个闪烁的光标要求你写一些东西，最后，你可以使用 `Ctrl + d` 来保存更改。

**如果你想创建一个空文件，则只需按 `Ctrl + d` 而不进行任何更改。**

这就好了！现在，你可以使用 `ls` 命令来显示 [当前工作目录的内容](https://itsfoss.com/list-directory-content/)：

#### 2、将文件内容复制到另一个文件

考虑一个场景，你要将 `FileA` 的文件内容重定向到 `FileB`。

当然，你可以复制和粘贴。但是如果有几百或几千行怎么办？

简单。你可以使用 `cat` 命令来重定向数据流。为此，你必须遵循给定的命令语法：

```
cat FileA > FileB

```

>
> ? 如果使用上述语法重定向文件内容，它将删除 `FileB` 的文件内容，然后重定向 `FileA` 的文件内容。
>
>
>

例如，我将使用两个文本文件 `FileA` 和 `FileB`，其中包含以下内容：

现在，如果我使用从 `FileA` 到 `FileB` 的重定向，它将删除 `FileB` 的数据，然后重定向 `FileA` 的数据：

```
cat FileA > FileB

```

同样，你可以对多个文件执行相同的操作：

```
cat FileA FileB > FileC

```

可以看到，上面的命令删除了 `FileC` 的数据，然后重定向了 `FileA` 和 `FileB` 的数据。

#### 3、将一个文件的内容附加到另一个文件

有时你想要将数据附加到现有数据，在这种情况下，你必须使用 `>>` 而不是单个 `>`：

```
cat FileA >> FileB

```

例如，在这里，我将把两个文件 `FileA` 和 `FileB` 重定向到 `FileC`：

```
cat FileA.txt FileB.txt >> FileC.txt

```

如你所见，它保留了 `FileC.txt` 的数据，并将数据附加在末尾。

>
> ? 你可以使用 `>>` 向现有文件添加新行。使用 `cat >> filename` 并开始添加所需的文本，最后使用 `Ctrl+D` 保存更改。
>
>
>

#### 4、显示行数

你可能会遇到这样的情况，你想查看行数，这可以使用 `-n` 选项来实现：

```
cat -n File

```

例如，在这里，我将 `-n` 选项与 `Haruki.txt` 一起使用：

#### 5、删除空行

在文本文档中留下多个空白行？ `cat` 命令将为你修复它！

为此，你所要做的就是使用 `-s` 标志。

但使用 `-s` 标志有一个缺点。你仍然留有一行空白：

正如你所看到的，它有效，但结果接近预期。

那么如何删除所有空行呢？ 通过管道将其传递给 `grep` 命令：

```
cat File | grep -v '^$'

```

这里，`-v` 标志将根据指定的模式过滤掉结果，`'^$'` 是匹配空行的正则表达式。

以下是我在 `Haruki.txt` 上使用它时的结果：

```
cat Haruki.txt | grep -v '^$'

```

当获得完美的输出，你可以将其重定向到文件以保存输出：

```
cat Haruki.txt | grep -v '^$' > File

```

### 这就是你到目前为止所学到的

以下是我在本教程中解释的内容的快速摘要：

| 命令 | 描述 |
| --- | --- |
| `cat <Filename>` | 将文件内容打印到终端。 |
| `cat >File` | 创建一个新文件。 |
| `cat FileA > FileB` | `FileB` 的文件内容将被 `FileA` 覆盖。 |
| `cat FileA >> FileB` | `FileA` 的文件内容将附加到 `FileB` 的末尾。 |
| `cat -n File` | 显示行数，同时省略文件的文件内容。 |
| `cat File | more` | 将 `cat` 命令通过管道连接到 `more` 命令以处理大文件。请记住，它不能让你向上滚动！ |
| `cat File | less` | 将 `cat` 命令通过管道传输到 `less` 命令，这与上面类似，但它允许你双向滚动。 |
| `cat File | grep -v '^$'` | 从文件中删除所有空行。 |

### ? 练习时间

如果你学到了新东西，用不同的可能性来执行它是最好的记忆方式。

为此，你可以使用 `cat` 命令进行一些简单的练习。它们将是超级基本的，就像 `cat` 一样是[最基本的命令之一](https://learnubuntu.com:443/top-ubuntu-commands/)。

出于练习目的，你可以 [使用 GitHub 上的文本文件](https://github.com:443/itsfoss/text-files)。

* 如何使用 `cat` 命令创建空文件？
* 将 `cat` 命令生成的输出重定向到新文件 `IF.txt`
* 能否将三个或更多文件输入重定向到一个文件？ 如果是，该如何做？

*（题图：MJ/f06c9b9c-689e-4a67-abe9-0487e26bd34b）*

---

via: <https://itsfoss.com/cat-command/>

作者：[Sagar Sharma](https://itsfoss.com/author/sagar/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


演讲：如何高效参与开源？（个人篇）

Summary: 开源是一种工作和生活的方式。你也许喜欢，也许不喜欢。

鼓掌

开源的前提是：个人生活无忧无虑。

这篇演讲值得一读，非常精彩！

感谢！

开源是一种工作和生活的方式。你也许喜欢，也许不喜欢。

# 演讲：如何高效参与开源？（个人篇）

>
> 按：本文来自硬核老王在 LLUG 2023 上海线下沙龙的演讲《高效开源（个人篇）》。
>
>
>

### 我要开源！

今天，我在这里与大家探讨一个我内心深处热爱的话题——开源。无论出于理想主义还是实用性的目的，我坚信开源的力量。它不仅代表着崇高的思想追求，更为个人和职业发展提供了巨大的机遇。

首先，开源与我们对协作和分享的天性相契合。开源的理念源于这样一种信念：知识应该为所有人所共享，通过携手合作，我们可以取得伟大的成就。这种高尚的理念与我们在教育和成长过程中所受的教育价值观完美契合。拥抱开源不仅仅是关乎技术，它反映了对世界的更广阔理解，以及我们在其中的定位。

此外，积极参与开源对我们的职业发展有着重要的影响。越来越明显的是，许多大型公司强调他们对开源的承诺。通过积极参与开源项目，我们不仅为社区做出贡献，还能提升我们的职业形象。在简历中写上自己的开源参与经历不仅仅令人印象深刻，还展示了我们的奉献精神、主动性和团队协作能力。这向我们的简历增添了一份很“酷”的感觉，使我们在竞争激烈的就业市场中与众不同。

总而言之，我对开源的热爱既源于其崇高的理念，也源于其潜力能够推动个人的成长。通过拥抱开源的理念并积极参与其中，我们可以开启知识和机遇的无限大海。让我们一同踏上开源之旅，发现无尽的可能。

### 每个人都可以爱开源

无论你是一个懂编码的人，还是一个具备艺术素养的人；无论你是一个善于社交的社交达人，还是一个擅长文字表达的人；又或者，你只是希望多一种新的体验。开源欢迎每一个人的参与。

如果你懂编码，无论是初学者还是经验丰富的开发者，你都可以贡献你的代码。参与开源项目，你可以帮助解决问题，改进功能，甚至发起自己的项目。你的代码将被广泛使用和赞赏，为开源社区做出重要贡献。

如果你有艺术素养，你可以参与开源项目的用户界面设计、图标设计等方面，为项目增添美感和易用性。你的创意和设计可以改善用户体验，为项目赋予独特的视觉风格。

如果你善于社交，开源社区需要你的贡献。你可以参与讨论、解答问题，提供支持和指引给其他开发者。通过分享你的经验和知识，你可以帮助其他人成长，构建一个更加友善和协作的开源社区。

如果你擅长文字表达，你可以成为开源项目的文档贡献者或博客作者。通过撰写清晰准确的文档和文章，你帮助他人理解和使用开源项目，推动项目的传播和发展。

最重要的是，如果你只是想多一种全新的体验，开源将成为你的理想选择。加入开源社区，你将结识志同道合的人，不断学习和成长，分享和接触到创新的思想和技术。

无论你是谁，无论你的技能和背景如何，开源都为你敞开大门。让我们一同参与开源，共同创造一个更加开放、协作和进步的世界。

### 你的第一步

让我们来讲讲你参与开源之前的第一步。

首先，了解开源是什么。开源不仅仅是一种软件许可证，它更是一种思想和文化。它鼓励知识的分享和合作，追求透明和开放的工作方式。同时，开源也是一种行为模式，要求贡献者共同协作、审查代码、提出改进，并为改进和发展项目做出贡献。

接下来，你需要找到适合你的“社区”。开源是一种群体行为，它由一群以特定方式组合起来的人构成。通过寻找相应的开源社区，你可以与志同道合的人共同工作，相互学习和支持。参与开源社区需要你积极参与讨论和互动，遵守社区准则和规范，以及尊重其他成员的意见和贡献。

最后，你需要知道如何加入。加入开源社区并不是一蹴而就的过程，而是一种渐进的参与。你可以开始通过报告问题或提出改进建议来参与，这样你可以逐渐熟悉项目的工作方式和社区的文化。随着你的参与和贡献增加，你可以逐渐获得更多的权限和责任，成为项目的核心成员之一。

参与开源需要耐心和热情，但它也为你带来了巨大的回报。通过参与开源，你将学习到新的技能，扩展你的专业网络，以及与全球范围内的人一同协作，共同推动项目的发展。

所以，准备好了吗？让我们踏出第一步，开始你的开源之旅吧！

### 0.0.1

现在，让我们一起来探索版本号 0.0.1，代表你参与开源的初步尝试。

首先，你需要寻求加入的方式。在开源社区中，你可以通过多种途径找到加入的机会，如GitHub、邮件列表、论坛和聚会。这些平台不仅提供了项目的代码和文档，还是交流和互动的重要渠道。通过参与这些平台，你可以与项目的贡献者和其他社区成员进行交流，并了解他们的工作方式和社区文化。

作为一个初学者，你可以先做一个观察者。入乡随俗，了解并尊重项目的规范和准则。学习项目的代码风格、开发流程和沟通方式。这样你将更好地融入社区，并有效地与其他成员进行交流。逐渐举手发言，提出你的观点、问题或建议。

接下来，重要的是踩下你的第一个脚印。你可以通过多种途径贡献自己的力量。你可以报告错误、提出功能请求或修补建议，帮助项目变得更好。你还可以贡献文档、进行本地化工作、提供艺术素材，从而提高用户体验。如果你具备编程技能，你可以提交代码补丁并参与技术讨论，为项目的发展和改进贡献你的一份力量。

切记，第一步并不需要完美。关键是积极参与和贡献，哪怕是小小的一步也能为开源社区带来积极的影响。通过持续的努力和学习，你将逐渐提升自己的技能，获得更多的机会和责任，成为开源社区的重要一员。

0.0.1 可能只是一个小小的版本号，但它标志着你在开源世界里踏出了重要的一步。让我们一同迈向开源之路，共同推动项目的发展和进步。

### 实践胜过理论

既然说到了开源，那何不将开源精神践行到这篇演讲中呢？因此，我们开发了一个网站，可以让大家用开源的方式来学习和实践开源。

这个网址也很好记：

>
> **<https://opensource.pragmatic.guide/>**
>
>
>

这是一个用于实践上面的 0.0.1 版本的试验场，大家不但可以看到这份演讲稿，而且还可以对这份演讲稿进行贡献。

你可以对这份演讲稿的内容进行完善，也可以对它的演示内容和注释进行勘误。亦或，你还可以提供更具象征意义的插图和设计，甚至可以对这个网站的代码和框架进行修改。当然，我们也非常有计划将它翻译为各种语言，因此，如果你擅长其它语言，那更是我们所欢迎的。

通过在这个试验场的实践，你不但可以亲自体验如何进行开源贡献，而且你的每一点贡献都会给后来的贡献者提供帮助。

### 0.1.0

让我们迈向版本号 0.1.0，这一阶段鼓励你创建自己的“玩具”项目，真正体验动手创作的乐趣和分享的乐趣。

首先，制作你的第一个“玩具”。选择你喜欢的主题，运用你所学的知识和技能来实现它。你可以使用你喜欢的编程语言和开发工具，或者实现你所见到的有趣的功能。就像爱因斯坦的那个“丑陋小板凳”一样，重要的是你的创作过程和体验，而不仅仅是最终的成果。

在这一阶段，许可证并不是必需品。更重要的是展示你的作品，让大家喜欢。许可证可以回头再考虑，在你有了一个更严肃的项目时再去探讨。现在，专注于让你的“玩具”项目更有趣、更吸引人。

然后，让更多人知道你的项目。积极地与别人分享、宣传。告诉尽量多的人，吸引更多的人来一起玩耍。你的“玩具”项目是你开源旅程的第一个里程碑，分享它能够获得鼓励和反馈，也能够吸引其他人的兴趣和参与。

版本号 0.1.0 代表了你在开源世界中迈出的重要一步。通过制作你的“玩具”项目，你能够真正体验到创作和分享的乐趣。坚持下去，继续成长和学习，不断追求更高的版本号，你将不仅在技术上成长，还会体会到开源社区的温暖和互助的力量。

### 0.2.0

现在，我们来到版本号 0.2.0，你已经有了自己的“玩具”开源项目，可以考虑加入更大的项目，参与贡献。但是在这过程中，你会遇到各种困难和困扰，就像从乡下来到城市被那里的车水马龙吓到，不小心还可能被汽车撞到。但是，除了谨慎之外，千万不要灰心。

首先，找到一个大型项目或社区。这就像从乡下走向城市，你会面临新的挑战和复杂的环境。不要害怕“被车撞到”，这意味着你会遇到难题和困难。但是请记住，每个人都有从头开始的时候，坚持和努力，你会逐渐适应并超越。

接下来，找到一个贡献的方向。了解项目的现状，看看别人做了什么。从你能力范围内的领域开始，尽力去做那些你能做到的事情。参与讨论，寻求指导和建议，逐渐扩展你的影响力和贡献范围。

然后，发起一个拉取请求（PR）或合并请求（MR）。这是你贡献的重要一步。第一个贡献被接纳是一种意外收获，但也可能需要等待和再次尝试。不要灰心，持续改进你的贡献，与项目的核心成员保持沟通，继续努力。

在这个过程中，要保持谦虚和学习的心态。大型项目和社区往往拥有繁忙的开发进程和复杂的治理结构。了解并尊重项目的规则和准则，虚心接受反馈和指导，与其他贡献者和核心成员建立联系，逐渐构建你在项目中的地位和影响力。

版本号 0.2.0 代表了你进一步融入开源社区的一步。不论在面对困难时遇到多少坎坷，始终要保持积极的态度和勇气。你的贡献和成长将不仅仅为你自己带来收益，同时也为开源社区和整个技术世界带来积极的影响。

### 1、2、3……

现在，我们进入了版本号 1、2、3……，这时你需要评估你的开源之旅。你可以思考这是否是你真正想要的，它给你带来了什么样的收获？你之后会将这看作一种过往的经历，还是继续投入开源，将其作为生活中不可或缺的一部分？

首先，你需要思考这是否是你想要的。回顾一下你经历过的一切，你喜欢这样的参与和贡献吗？有没有让你感到失望或不满意的地方？你是否愿意继续为之付出？这是一个重要的自我评估过程，需要考虑你的兴趣、目标以及与其他生活方面的协调。

接下来，思考开源带给了你哪些收获。盘点一下你在这个过程中获得的成长、技能和人际关系。思考开源为你带来了什么样的价值和意义。这将为你自己决定是否继续投入提供参考。

最后，你需要决定是继续浅尝辄止还是将开源作为一种生活方式。这是一个个人选择，没有对错之分。或许你在开源中找到了快乐和成就感，愿意继续贡献。或者你可能决定尝试其他领域和兴趣，将开源作为一段美好的经历留在回忆中。无论你做出什么选择，重要的是要保持心怀感激和对开源社区的尊重。

版本号 1、2、3……代表你在开源世界迈出的更大的步伐。无论你选择何去何从，这段经历将成为你的宝贵财富。感谢你的参与和努力，无论你的未来道路如何，愿你在其中找到快乐和成长。

### 结语

开源是一种工作和生活的方式。你也许喜欢，也许不喜欢。

*（本文得到了 ChatGPT 帮助，插图由 MJ 生成）*


硬核观察 #1071 研究发现更大的上下文对大语言模型来说意义不大

Summary:
? 研究发现更大的上下文对大语言模型来说意义不大
? 谷歌敦促 Gmail 用户启用 “增强型安全浏览”
? 五年后，Cython 3.0 发布
»
»

# 硬核观察 #1071 研究发现更大的上下文对大语言模型来说意义不大

### 研究发现更大的上下文对大语言模型来说意义不大

在大语言模型中，上下文窗口指的是模型在给定实例中可以处理和响应的文本长度。它可以被视为特定文本分析或聊天机器人对话的工作记忆。许多人都认为，语境窗口变大的趋势将继续提高 大语言模型的性能和在各种应用中的实用性。但根据一项最新研究，大语言模型往往无法访问和使用在较长的上下文窗口中提供给它们的相关信息。当相关信息出现在输入上下文的开头或结尾时，它的性能最佳；而当模型必须在长上下文中间获取相关信息时，性能就会明显下降。此外，随着输入上下文的长度增加，即使是明确的长上下文模型，性能也会大幅下降。

>
> **[消息来源：Venture Beat](https://venturebeat.com/ai/stanford-study-challenges-assumptions-about-language-models-larger-context-doesnt-mean-better-understanding/)**
>
>
>

>
> 老王点评：可见我们对大语言模型内部到底发生了什么，还是一无所知。
>
>
>

### 谷歌敦促 Gmail 用户启用 “增强型安全浏览”

这项增强的安全功能已经存在了三年，但谷歌最近开始在 Gmail 收件箱中显示一条信息，建议人们打开 “增强安全浏览” 功能。如果谷歌认为你正在浏览的网站冒充你的银行等，你就会看到一个红色的警告屏幕。一般而言，开启这项安全功能是个好主意，虽然它会收集你的更多信息，但如果你本来就使用了 Gmail 等谷歌服务，其实它已经收集了足够多的信息。如果你开启了该功能，即使你没有登录谷歌账户，谷歌也会对你访问的网站了如指掌。它还会从你访问的网站上收集一些视觉图像，以扫描诈骗网站的特征。

>
> **[消息来源：MSN](https://www.msn.com/en-us/news/technology/google-has-an-enhanced-safe-browsing-feature-should-you-use-it/ar-AA1eb0PY)**
>
>
>

>
> 老王点评：你应该自己决定是否愿意放弃部分隐私来换取额外的安全保护，以防止常见的犯罪行为。
>
>
>

### 五年后，Cython 3.0 发布

Cython 是一种基于 Python 的编程语言和编译器，它可以编译输出原生代码，执行速度可能比 CPython 解释器快得多。它既可用于优化 Python 应用程序，也可用于创建 CPython 可使用的模块，从而在解释器中运行应用程序的主要部分时，编译性能关键的代码。Cython 至今已有 21 年历史。在接近五年的漫长时间后，Cython 3.0 发布，增加了许多新功能，现在支持 Python 3 的所有版本，但放弃了对 Python 2.6 的支持。但 Cython 2.x 和 Cython 3.0 之间的兼容性问题已经造成了一些问题，影响到了包括 AWS CLI 在内的一些重要项目。

>
> **[消息来源：Dev Class](https://devclass.com/2023/07/19/cython-3-0-released-after-nearly-5-years-but-beware-breaking-changes/)**
>
>
>

>
> 老王点评：觉得 Python 慢吗？那就编译好了。
>
>
>