硬核观察 #1072 特斯拉将向其他汽车制造商授权全自动驾驶套件

Summary:
? 特斯拉将向其他汽车制造商授权全自动驾驶套件
? 俄罗斯禁止官员们使用苹果手机
? RISC-V 现已晋升为 Debian 官方架构
»
»

![](/data/attachment/album/202307/24/102758n36atmt36ahz3zs3.jpg)

![](/data/attachment/album/202307/24/102812ksv3wzlmai36i6oi.jpg)

### 特斯拉将向其他汽车制造商授权全自动驾驶套件

马斯克称，特斯拉计划向其他汽车制造商授权其尚未推出的全自动驾驶（FSD）套件。尽管各国政府对特斯拉自动驾驶汽车的安全性进行了多项调查，以及梅赛德斯-奔驰在加利福尼亚州击败特斯拉达到了三级自动驾驶水平，而特斯拉的 FSD 功能仍处于测试阶段。但马斯克在第二季度财报电话会议上说，特斯拉对向其他汽车公司授权其 FSD 软件和硬件持开放态度，并已在为此而努力。当被问及全自动驾驶何时实现？马斯克说，今年。马斯克称，“FSD 的改进是按对数曲线，甚至是多对数曲线进行的。”

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

>
> 老王点评：或许今年 FSD 就行了呢。?
>
>
>

![](/data/attachment/album/202307/24/102823wk1kke77z9zmkqv1.jpg)

### 俄罗斯禁止官员们使用苹果手机

据英国《金融时报》报道，数千名俄罗斯高级官员和国家雇员被禁止使用从 iPhone、iPad 到笔记本电脑的各种苹果产品，因为他们担心这些产品可能会成为西方情报机构的秘密间谍工具。新禁令将于 7 月 17 日星期一生效。俄罗斯情报官员上个月指责美国国家安全局入侵数千部俄罗斯人拥有的 iPhone 手机，并将驻俄外国外交官的手机作为攻击目标。苹果公司称它 “从未与任何政府合作在任何苹果产品中建立后门，以后也不会”。

>
> **[消息来源：Gizmodo](https://gizmodo.com/russia-bans-officials-use-of-iphones-government-work-1850646999)**
>
>
>

>
> 老王点评：现在的情况是，无论苹果说什么，人们都有担忧。
>
>
>

![](/data/attachment/album/202307/24/102842bne0z76uaey8guak.jpg)

### RISC-V 现已晋升为 Debian 官方架构

之前我们 [报道](/article-15910-1.html) 过，Debian 13 可能正式支持 RISC-V 架构。从本周末开始，RISC-V 64 位已被确认为 Debian 的正式架构，将在两年后发布的 Debian 13 中正式支持，之前该架构一直是 Debian 的移植版本。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Debian-Official-RISC-V)**
>
>
>

>
> 老王点评：可惜 Debian 12 没来得及正式支持。
>
>
>


Llama 2 vs GPT-4：有何区别？

![](/data/attachment/album/202307/24/223302fj41272110s7df4c.jpg)

>
> 了解 Llama 2 和 GPT-4 之间的主要区别，它们是自然语言处理的领先巨头。揭示它们的优势、劣势以及它们如何塑造语言技术的未来。
>
>
>

在撰写内容时，有两个关键因素至关重要，“<ruby> 困惑度 <rt>  perplexity </rt></ruby>”和“<ruby> 爆发性 <rt>  burstiness </rt></ruby>”。困惑度衡量文本的复杂程度。而爆发性则比较句子的变化程度。人类倾向于以较大的爆发性写作，例如长句或复杂句与短句并存。人工智能生成的句子往往更加均一。

在自然语言处理领域，Llama 2 和 GPT-4 是两个杰出的参与者，吸引了研究人员和爱好者的关注。这些大型语言模型展示出独特的功能和特点。

虽然 GPT-4 由 OpenAI 已经发布一段时间，但 Meta 与微软合作推出了 Llama 2，这是 LLaMa 扩展语言模型的改进版本。

让我们深入探讨这两个模型之间的关键区别，以了解它们的特点之所在。

### Llama 2：简单易用

Llama 2 是其前身 LLaMa 的升级版本，以其简洁高效的特点震撼了科技界。尽管它支持的语言范围较窄，仅包括 20 种语言，但其性能令人印象深刻，可以与 GPT-4、Claude 或 Bard 等重量级模型相媲美。令人惊讶的是，尽管参数比 GPT-3 模型少，但 Llama 2 可以在单个 GPU 上高效运行，使其成为各种应用的更便捷选择。

Llama 2 真正的特点是它专门训练于公开可获得的数据集，使其对研究人员和开发人员更加可用。更为引人注目的是，尽管仅在 1,000 个精确提示的相对较小数据集上进行训练，它依然实现了有竞争力的结果。

### GPT-4

在 2023 年 3 月，OpenAI 自豪地推出了其最新的创作——GPT-4，这一力作轰动了语言模型领域。GPT-4 在许多任务中表现卓越，包括专业医学和法律考试，展示了其多功能和高水平的能力。

GPT-4 的一个显著特点是相对于之前的版本，它能够扩展最大输入长度。这个增强功能使其能够处理更加广泛和复杂的语言数据，为自然语言理解和生成开辟了新的可能性。

此外，GPT-4 拥有广泛的语言支持，支持 26 种语言。这种多样的语言能力扩大了其在全球范围内的覆盖和适用性，使其成为多语言项目和应用的首选。

### 区别：Llama 2 与 GPT-4

在比较 Llama 2 和 GPT-4 时，我们可以看到两个模型都有各自独特的优缺点。Llama 2 以其简洁高效的特点脱颖而出，尽管其数据集较小且语言支持有限，但其表现卓越。其易用性和有竞争力的结果使其成为某些应用的有力选择。

另一方面，GPT-4 在各种任务上的出色表现和广泛的语言支持使其成为更复杂和多样化项目的强大选择。然而，关于其模型架构和训练数据集的详细信息缺乏，还有一些问题尚待回答。

下表显示了两个模型的一些基准分数（以及其他热门模型）：

| 基准测试 | <ruby> 样本数 <rt>  Shot </rt></ruby> | GPT-3.5 | GPT-4 | PaLM | PaLM-2-L | Llama 2 |
| --- | --- | --- | --- | --- | --- | --- |
| MMLU （5 样本） | 70 | 78.3 | 86.1 | – | – | 86.4 |
| TriviaQA （1 样本） | 69.3 | 33 | 37.5 | – | – | 81.4 |
| Natural Questions （1 样本） | 68.9 | 37.5 | 52.3 | – | – | 85 |
| GSM8K （8 样本） | 85 | 56.5 | 56.8 | – | – | 87 |
| HumanEval （0 样本） | 48.1 | 92 | 56.7 | – | – | 51.2 |
| BIG-Bench Hard （3 样本） | 29.3 | 56.8 | 26.2 | – | – | 29.9 |

### 常见问题解答

1、Llama 2 和 GPT-4 的主要区别是什么？

主要区别在于设计和性能。Llama 2 注重简洁高效，而 GPT-4 具有扩展的输入长度和广泛的语言支持。

2、哪个模型更适合多语言模型？

GPT-4 适用于多语言项目，因为它支持 26 种语言，为全球应用提供了更广泛的范围。

3、Llama 2 可以运行在单个 GPU 上吗？

是的，Llama 2 可以在单个 GPU 上有效运行，使其成为各种应用的实用选择。

4、Llama 2 支持多少种语言？

Llama 2 支持 20 种语言，虽然比 GPT-4 稍少，但仍覆盖了相当广泛的语言范围。

5、GPT-4 是否有可用的基准测试？

不幸的是，没有提及 GPT-4 的具体基准测试，因此对其性能还有一些问题没有答案。

### 结论

Llama 2 和 GPT-4 代表了自然语言处理领域的前沿进展。尽管数据集较小，Llama 2 以其简洁性、易用性和有竞争力的性能令人印象深刻。另一方面，GPT-4 的多功能性、高水平和广泛的语言支持使其成为处理复杂项目的杰出选择。这两个模型对自然语言处理的发展做出了重要贡献，为语言技术在我们生活中发挥更加重要的作用铺平了道路。

基准测试参考：

* MMLU Benchmark (Multi-task Language Understanding): <https://arxiv.org/abs/2009.03300>
* Papers With Code: <https://paperswithcode.com/paper/measuring-massive-multitask-language>
* GPT-4 Technical Report: <https://arxiv.org/abs/2303.08774>
* PaLM: Scaling Language Modeling with Pathways: <https://www.marktechpost.com/2022/04/04/google-ais-latest-540-billion-parameter-model-pathways-language-model-called-palm-unlocks-new-tasks-proportional-to-scale/>
* Llama 2: Open Foundation and Fine-Tuned Chat Models: [https://www.youtube.com/watch?v=Xdl\_zC1ChRs](https://www.youtube.com:443/watch?v=Xdl_zC1ChRs)

*（题图：MJ/60e112f7-3399-49fd-9157-c6b03de5efea）*

---

via: <https://www.debugpoint.com/llama-2-vs-gpt-4/>

作者：[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/) 荣誉推出


在 Ubuntu 上安装和使用 Flatpak

所以为什么不用mint？不仅预装flatpak，而且没有令人讨厌的snap

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

可以把 Flathub 仓库换成上海交通大学的镜像，速度会快一些，具体方法可参考：mirrors.sjtug.sjtu.edu.cn/docs/flathub 。

谢谢，用了你的方法，再也下不了flathub的软件了，一直加载，挂梯子提示308错误。卸载重装flatpak都没用

![](/data/attachment/album/202307/24/230017g1qhhwfzhhhcyz13.jpg)

>
> Ubuntu 可能默认安装了 Snap，但你仍然可以使用 Flatpak 通用软件包。
>
>
>

Linux 世界有三种“通用”打包格式，允许在“任何” Linux 发行版上运行：Snap、Flatpak 和 AppImage。

Ubuntu 内置了 Snap，但大多数发行版和开发人员都避免使用它，因为它的闭源性质。他们更喜欢 [Fedora 的 Flatpak 打包系统](https://itsfoss.com/what-is-flatpak/)。

作为 Ubuntu 用户，你并不局限于 Snap。你还可以在 Ubuntu 系统上使用 Flatpak。

在本教程中，我将讨论以下内容：

* 在 Ubuntu 上启用 Flatpak 支持
* 使用 Flatpak 命令来管理包
* 从 Flathub 获取包
* 将 Flatpak 软件包添加到软件中心

听起来很令人兴奋？ 让我们一一看看。

### 在 Ubuntu 上安装 Flatpak

你可以使用以下命令轻松安装 Flatpak：

```
sudo apt install flatpak

```

对于 **Ubuntu 18.04 或更早版本**，请使用 PPA：

```
sudo add-apt-repository ppa:flatpak/stable
sudo apt update
sudo apt install flatpak

```

#### 添加 Flathub 仓库

你已在 Ubuntu 系统中安装了 Flatpak 支持。但是，如果你尝试安装 Flatpak 软件包，你将收到 [“No remote refs found”](https://itsfoss.com/no-remote-ref-found-flatpak/) 错误。这是因为没有添加 Flatpak 仓库，因此 Flatpak 甚至不知道应该从哪里获取应用。

Flatpak 有一个名为 “Flathub” 的集中仓库，可以从此处找到并下载许多 Flatpak 应用。

你应该添加 Flathub 仓库来访问这些应用。

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

```

![Install Flatpak in latest versions of Ubuntu and then add Flathub repo](/data/attachment/album/202307/24/230051f1l2wqiwlcxpyivw.svg)

安装并配置 Flatpak 后，**重启你的系统**。否则，已安装的 Flatpak 应用将不会在你的系统菜单上可见。

不过，你始终可以通过运行以下命令来运行 Flatpak 应用：

```
flatpak run <package-name>

```

### 常用 Flatpak 命令

现在你已经安装了 Flatpak 打包支持，是时候学习包管理所需的一些最常见的 Flatpak 命令了。

#### 搜索包

如果你知道应用名称，请使用 Flathub 网站或使用以下命令：

```
flatpak search <package-name>

```

![Search for a package using Flatpak Search command](/data/attachment/album/202307/24/230051kcig3cgzrmio87zr.svg)

>
> ? 除了搜索 Flatpak 包之外，在其他情况下， 指的是正确的 Flatpak 包名称，例如 `com.raggesilver.BlackBox`（上面截图中的应用 ID）。你还可以使用应用 ID 的最后一个词 `Blackbox`。
>
>
>

#### 安装 Flatpak 包

以下是安装 Flatpak 包的语法：

```
flatpak install <remote-repo> <package-name>

```

由于几乎所有时候你都会从 Flathub 获取应用，因此远程仓库将是 `flathub`：

```
flatpak install flathub <package-name>

```

![Install a package after searching for its name](/data/attachment/album/202307/24/230051fhqi8sggp4tgsing.svg)

在极少数情况下，你可以直接从开发人员的仓库安装 Flatpak 包，而不是 Flathub。在这种情况下，你可以使用如下语法：

```
flatpak install --from https://flathub.org/repo/appstream/com.spotify.Client.flatpakref

```

#### 从 flatpakref 安装包

这是可选的，也很少见。但有时，你会获得应用的 `.flatpakref` 文件。这**不是离线安装**。.flatpakref 包含有关从何处获取包的必要详细信息。

要从此类文件安装，请打开终端并运行：

```
flatpak install <path-to-flatpakref file>

```

![Install a Flatpak package from Flatpakref file](/data/attachment/album/202307/24/230052um1hkeotfzcxx10x.svg)

#### 从终端运行 Flatpak 应用

再说一遍，这是你不会经常做的事情。大多数情况下，你将在系统菜单中搜索安装应用并从那里运行该应用。

但是，你也可以使用以下命令从终端运行它们：

```
flatpak run <package-name>

```

#### 列出已安装的 Flatpak 软件包

想要查看你的系统上安装了哪些 Flatpak 应用？ 像这样列出它们：

```
flatpak list

```

![List all the installed Flatpak packages on your system](/data/attachment/album/202307/24/230052lfssbnuia7dxxmxj.svg)

#### 卸载 Flatpak 包

你可以通过以下方式删除已安装的 Flatpak 包：

```
flatpak uninstall <package-name>

```

如果你想**清除不再需要的剩余包和运行时**，请使用：

```
flatpak uninstall --unused

```

![Remove a Flatpak package and later, if there is any unused runtimes or packages, remove them](/data/attachment/album/202307/24/230052obp5gbxy33pzhph7.svg)

它可能会帮助你 [在 Ubuntu 上节省一些磁盘空间](https://itsfoss.com/free-up-space-ubuntu-linux/)。

### Flatpak 命令总结

以下是你在上面学到的命令的快速摘要：

| 用途 | 命令 |
| --- | --- |
| 搜索包 | `flatpak search` |
| 安装包 | `flatpak install` |
| 列出已安装的包 | `flatpak list` |
| 从 flatpakref 安装 | `flatpak install <package-name.flatpakref>` |
| 卸载软件包 | `flatpak uninstall` |
| 卸载未使用的运行时和包 | `flatpak uninstall --unused` |

### 使用 Flathub 探索 Flatpak 包

我知道通过命令行搜索 Flatpak 包并不是最好的体验，这就是 [Flathub 网站](https://flathub.org:443/en-GB) 的用武之地。

你可以在 Flathub 上浏览 Flatpak 应用，它提供了更多详细信息，例如经过验证的发布商、下载总数等。

你还将在应用页面底部获得安装应用所需的命令。

![](/data/attachment/album/202307/24/230052e8mfr77mfpkonmqn.png)

![](/data/attachment/album/202307/24/230053yqkbxk1zf0v8bv87.png)

### 额外信息：使用支持 Flatpak 软件包的软件中心

你可以将 Flatpak 包添加到 GNOME 软件中心，并使用它以图形方式安装软件包。

有一个专用插件可以将 Flatpak 添加到 GNOME 软件中心。

>
> ? 从 Ubuntu 20.04 开始，Ubuntu 默认的软件中心是 Snap Store，并且不支持 Flatpak 集成。因此，安装以下软件包将产生两个软件中心：一个 Snap 和另一个 DEB。
>
>
>

![When you install GNOME Software Flatpak plugin in Ubuntu, a DEB version of GNOME Software is installed. So you will have two software center application](/data/attachment/album/202307/24/230053bm51mdp57m2x6wup.png)

```
sudo apt install gnome-software-plugin-flatpak

```

![Installing GNOME Software Plugin in Ubuntu](/data/attachment/album/202307/24/230054zfkgooqclhyfptrp.svg)

### 总结

你在这里学到了很多东西。你学习了在 Ubuntu 中启用 Flatpak 支持并通过命令行管理 Flatpak 软件包。你还了解了与软件中心的集成。

我希望你现在对 Flatpaks 感觉更舒服一些。既然你发现了三个通用软件包之一，那么再 [了解一下 Appimages](https://itsfoss.com/use-appimage-linux/) 怎么样？

如果你有疑问或遇到任何问题，请告诉我。

*（题图：MJ/d03886af-9b7f-401e-a964-da0e5d6531a2）*

---

via: <https://itsfoss.com/flatpak-ubuntu/>

作者：[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/) 荣誉推出


硬核观察 #1073 谷歌的《网络环境完整性 API》提案遭到抨击

Summary:
? 谷歌的《网络环境完整性 API》提案遭到抨击
? 研究人员在加密的军警无线电标准中发现后门
? Twitter 的新 “X” 标志让很多人想起了 X.Org
»
»

![](/data/attachment/album/202307/25/183708b3pp311kk6wtrp3k.jpg)

![](/data/attachment/album/202307/25/183724yk9jqfckqfjv8359.jpg)

### 谷歌的《网络环境完整性 API》提案遭到抨击

谷歌悄悄准备了一份《网络环境完整性 API》提案，该项目的目标之一和安卓的 Play Integrity 类似，确保浏览器没有被以任何未经批准的方式修改或篡改过。Play Integrity 可以让应用程序发现你的设备是否已被 Root，否则银行、钱包、在线游戏等对环境敏感的应用可以拒绝执行。换言之，谷歌想要在网络上创造某种 DRM。这一提案被发现后，引来了对该提案的很多抨击，有人称这一提案 “绝对不道德，与开放网络背道而驰”。Mozilla 也已经表达了 [反对意见](https://github.com/mozilla/standards-positions/issues/852)，认为它会从理论上的供应商中立变成实际上的供应商锁定。

>
> **[消息来源：Ars Technica](https://arstechnica.com/gadgets/2023/07/googles-web-integrity-api-sounds-like-drm-for-the-web/)**
>
>
>

>
> 老王点评：谷歌总是干了一些悄悄挖开放互联网墙角的事情。
>
>
>

![](/data/attachment/album/202307/25/183737k0iggg94aniy04dd.jpg)

### 研究人员在加密的军警无线电标准中发现后门

在世界各地的警察、军队和关键基础设施实体使用的加密无线电 TETRA 标准中，安全研究人员发现了一个后门，他们认为这是一个故意“后门”。研究人员称，这个后门可能已经存在了几十年，可能会暴露大量通过它们传输的敏感信息。虽然负责维护该标准的组织 ETSI 否认这是后门，并表示该标准是为决定加密强度的出口控制而设计的，不过，使用普通笔记本电脑就可以在一分钟内解密无线电通信。ETSI 称，没有任何已知的在运行网络中利用研究人员披露的漏洞的行为。但因为它可以被动拦截和解密，所以不存在可检测到的干扰，因此，ETSI 的声明毫无意义。

>
> **[消息来源：VICE](https://www.vice.com/en/article/4a3n3j/backdoor-in-police-radios-tetra-burst)**
>
>
>

>
> 老王点评：很难说这种“后门”之前没有被悄悄发现和利用过。
>
>
>

![](/data/attachment/album/202307/25/183806qdexro1p4pyeq1cp.jpg)

### Twitter 的新 “X” 标志让很多人想起了 X.Org

马斯克开始将 Twitter 改名为 “X”，他拥有的 [x.com](http://x.com/) 也指向了 [Twitter.com](http://twitter.com/)，并试图让 X 成为一个更通用的应用程序。作为计划的一部分，Twitter 的小鸟不见了，新的标志是一个大大的 “X”。但这可能带来商标噩梦。美国有近 900 个有效的商标注册已经涵盖了各行各业的 X 字母。比如自 2003 年以来，微软一直拥有与其 Xbox 视频游戏系统相关的 “X” 商标。Meta 拥有一个 X 商标。而对于我们的读者来说，这可能更像是 [X.org](http://x.org/) 一直以来的标志。

>
> **[消息来源：路透社](https://www.reuters.com/technology/problem-with-x-meta-microsoft-hundreds-more-own-trademarks-new-twitter-name-2023-07-25/)**
>
>
>

>
> 老王点评：马斯克主打的就是一个任性。不过不能说，X 这个名字短了很多。
>
>
>


GDB 调试器如何通过调用帧信息来确定函数调用关系

Summary: 从调试器中获取函数调用关系。

从调试器中获取函数调用关系。

![](/data/attachment/album/202307/26/062542j0picgf1fs6nd8qn.jpg)

>
> 从调试器中获取函数调用关系。
>
>
>

在我的 [上一篇文章](https://opensource.com/article/23/2/compiler-optimization-debugger-line-information) 中，我展示了如何使用 `debuginfo` 在当前指令指针（IP）和包含它的函数或行之间进行映射。该信息对于显示 CPU 当前正在执行的代码很有帮助。不过，如果能显示更多的有关当前函数调用栈及其正在执行语句的上下文对我们定位问题来说也是十分有助的。

例如，将空指针作为参数传递到函数中而导致非法内存访问的问题，只需查看当前执行函数行，即可发现该错误是由尝试通过空指针进行访问而触发的。但是，你真正想知道的是导致空指针访问的函数调用的完整上下文，以便确定该空指针最初是如何传递到该函数中的。此上下文信息由回溯提供，可以让你确定哪些函数可能对空指针参数负责。

有一点是肯定的：确定当前活动的函数调用栈不是一项简单的操作。

### 函数激活记录

现代编程语言具有局部变量，并允许函数可以调用自身的递归。此外，并发程序具有多个线程，这些线程可能同时运行相同的函数。在这些情况下，局部变量不能存储在全局位置。对于函数的每次调用，局部变量的位置必须是唯一的。它的工作原理如下：

* 每次调用函数时，编译器都会生成函数激活记录，以将局部变量存储在唯一位置。
* 为了提高效率，处理器堆栈用于存储函数激活记录。
* 当函数被调用时，会在处理器堆栈的顶部为该函数创建一条新的函数激活记录。
* 如果该函数调用另一个函数，则新的函数激活记录将放置在现有函数激活记录之上。
* 每次函数返回时，其函数激活记录都会从堆栈中删除。

函数激活记录的创建是由函数中称为“<ruby> 序言 <rt>  prologue </rt></ruby>”的代码创建的。函数激活记录的删除由函数“<ruby> 尾声 <rt>  epilogue </rt></ruby>”处理。函数体可以利用堆栈上为其预留的内存来存储临时值和局部变量。

函数激活记录的大小可以是可变的。对于某些函数，不需要空间来存储局部变量。理想情况下，函数激活记录只需要存储调用 *该* 函数的函数的返回地址。对于其他函数，除了返回地址之外，可能还需要大量空间来存储函数的本地数据结构。帧大小的可变导致编译器使用帧指针来跟踪函数激活帧的开始。函数序言代码具有在为当前函数创建新帧指针之前存储旧帧指针的额外任务，并且函数尾声必须恢复旧帧指针值。

函数激活记录的布局方式、调用函数的返回地址和旧帧指针是相对于当前帧指针的恒定偏移量。通过旧的帧指针，可以定位堆栈上下一个函数的激活帧。重复此过程，直到检查完所有函数激活记录为止。

### 优化复杂性

在代码中使用显式帧指针有几个缺点。在某些处理器上，可用的寄存器相对较少。具有显式帧指针会导致使用更多内存操作。生成的代码速度较慢，因为帧指针必须位于寄存器中。具有显式帧指针可能会限制编译器可以生成的代码，因为编译器可能不会将函数序言和尾声代码与函数体混合。

编译器的目标是尽可能生成快速代码，因此编译器通常会从生成的代码中省略帧指针。正如 [Phoronix 的基准测试](https://www.phoronix.com/review/fedora-frame-pointer) 所示，保留帧指针会显着降低性能。不过省略帧指针也有缺点，查找前一个调用函数的激活帧和返回地址不再是相对于帧指针的简单偏移。

### 调用帧信息

为了帮助生成函数回溯，编译器包含 DWARF 调用帧信息（CFI）来重建帧指针并查找返回地址。此补充信息存储在执行的 `.eh_frame` 部分中。与传统的函数和行位置信息的 `debuginfo` 不同，即使生成的可执行文件没有调试信息，或者调试信息已从文件中删除，`.eh_frame` 部分也位于可执行文件中。 调用帧信息对于 C++ 中的 `throw-catch` 等语言结构的操作至关重要。

CFI 的每个功能都有一个帧描述条目（FDE）。作为其步骤之一，回溯生成过程为当前正在检查的激活帧找到适当的 FDE。将 FDE 视为一张表，每一行代表一个或多个指令，并具有以下列：

* 规范帧地址（CFA），帧指针指向的位置
* 返回地址
* 有关其他寄存器的信息

FDE 的编码旨在最大限度地减少所需的空间量。FDE 描述了行之间的变化，而不是完全指定每一行。为了进一步压缩数据，多个 FDE 共有的起始信息被分解出来并放置在通用信息条目（CIE）中。 这使得 FDE 更加紧凑，但也需要更多的工作来计算实际的 CFA 并找到返回地址位置。该工具必须从未初始化状态启动。它逐步遍历 CIE 中的条目以获取函数条目的初始状态，然后从 FDE 的第一个条目开始继续处理 FDE，并处理操作，直到到达覆盖当前正在分析的指令指针的行。

### 调用帧信息使用实例

从一个简单的示例开始，其中包含将华氏温度转换为摄氏度的函数。 内联函数在 CFI 中没有条目，因此 `f2c` 函数的 `__attribute__((noinline))` 确保编译器将 `f2c` 保留为真实函数。

```
#include <stdio.h>

int __attribute__ ((noinline)) f2c(int f)
{
    int c;
    printf("converting\n");
    c = (f-32.0) * 5.0 /9.0;
    return c;
}

int main (int argc, char *argv[])
{
    int f;
    scanf("%d", &f);
    printf ("%d Fahrenheit = %d Celsius\n",
            f, f2c(f));
    return 0;
}

```

编译代码：

```
$ gcc -O2 -g -o f2c f2c.c

```

`.eh_frame` 部分展示如下:

```
$ eu-readelf -S f2c |grep eh_frame
[17] .eh_frame_hdr  PROGBITS   0000000000402058 00002058 00000034  0 A  0   0  4
[18] .eh_frame      PROGBITS   0000000000402090 00002090 000000a0  0 A  0   0  8

```

我们可以通过以下方式获取 CFI 信息：

```
$ readelf --debug-dump=frames  f2c > f2c.cfi

```

生成 `f2c` 可执行文件的反汇编代码，这样你可以查找 `f2c` 和 `main` 函数：

```
$ objdump -d f2c > f2c.dis

```

在 `f2c.dis` 中找到以下信息来看看 `f2c` 和 `main` 函数的执行位置：

```
0000000000401060 <main>:
0000000000401190 <f2c>:

```

在许多情况下，二进制文件中的所有函数在执行函数的第一条指令之前都使用相同的 CIE 来定义初始条件。 在此示例中， `f2c` 和 `main` 都使用以下 CIE：

```
00000000 0000000000000014 00000000 CIE
  Version:                   1
  Augmentation:              "zR"
  Code alignment factor: 1
  Data alignment factor: -8
  Return address column: 16
  Augmentation data:         1b
  DW_CFA_def_cfa: r7 (rsp) ofs 8
  DW_CFA_offset: r16 (rip) at cfa-8
  DW_CFA_nop
  DW_CFA_nop

```

本示例中，不必担心增强或增强数据条目。由于 x86\_64 处理器具有 1 到 15 字节大小的可变长度指令，因此 “代码对齐因子” 设置为 1。在只有 32 位（4 字节指令）的处理器上，“代码对齐因子” 设置为 4，并且允许对一行状态信息适用的字节数进行更紧凑的编码。类似地，还有 “数据对齐因子” 来使 CFA 所在位置的调整更加紧凑。在 x86\_64 上，堆栈槽的大小为 8 个字节。

虚拟表中保存返回地址的列是 16。这在 CIE 尾部的指令中使用。 有四个 `DW_CFA` 指令。第一条指令 `DW_CFA_def_cfa` 描述了如果代码具有帧指针，如何计算帧指针将指向的规范帧地址（CFA）。 在这种情况下，CFA 是根据 `r7 (rsp)` 和 `CFA=rsp+8` 计算的。

第二条指令 `DW_CFA_offset` 定义从哪里获取返回地址 `CFA-8` 。在这种情况下，返回地址当前由堆栈指针 `(rsp+8)-8` 指向。CFA 从堆栈返回地址的正上方开始。

CIE 末尾的 `DW_CFA_nop` 进行填充以保持 DWARF 信息的对齐。 FDE 还可以在末尾添加填充以进行对齐。

在 `f2c.cfi` 中找到 `main` 的 FDE，它涵盖了从 `0x40160` 到（但不包括）`0x401097` 的 `main` 函数：

```
00000084 0000000000000014 00000088 FDE cie=00000000 pc=0000000000401060..0000000000401097
  DW_CFA_advance_loc: 4 to 0000000000401064
  DW_CFA_def_cfa_offset: 32
  DW_CFA_advance_loc: 50 to 0000000000401096
  DW_CFA_def_cfa_offset: 8
  DW_CFA_nop

```

在执行函数中的第一条指令之前，CIE 描述调用帧状态。然而，当处理器执行函数中的指令时，细节将会改变。 首先，指令 `DW_CFA_advance_loc` 和 `DW_CFA_def_cfa_offset` 与 `main` 中 `401060` 处的第一条指令匹配。 这会将堆栈指针向下调整 `0x18`（24 个字节）。 CFA 没有改变位置，但堆栈指针改变了，因此 CFA 在 `401064` 处的正确计算是 `rsp+32`。 这就是这段代码中序言指令的范围。 以下是 `main` 中的前几条指令：

```
0000000000401060 <main>:
  401060:    48 83 ec 18      sub        $0x18,%rsp
  401064:    bf 1b 20 40 00   mov        $0x40201b,%edi

```

`DW_CFA_advance_loc` 使当前行应用于函数中接下来的 50 个字节的代码，直到 `401096`。CFA 位于 `rsp+32`，直到 `401092` 处的堆栈调整指令完成执行。`DW_CFA_def_cfa_offset` 将 CFA 的计算更新为与函数入口相同。这是预期之中的，因为 `401096` 处的下一条指令是返回指令 `ret`，并将返回值从堆栈中弹出。

```
  401090:    31 c0        xor        %eax,%eax
  401092:    48 83 c4 18  add        $0x18,%rsp
  401096:    c3           ret

```

`f2c` 函数的 FDE 使用与 `main` 函数相同的 CIE，并覆盖 `0x41190` 到 `0x4011c3` 的范围：

```
00000068 0000000000000018 0000006c FDE cie=00000000 pc=0000000000401190..00000000004011c3
  DW_CFA_advance_loc: 1 to 0000000000401191
  DW_CFA_def_cfa_offset: 16
  DW_CFA_offset: r3 (rbx) at cfa-16
  DW_CFA_advance_loc: 29 to 00000000004011ae
  DW_CFA_def_cfa_offset: 8
  DW_CFA_nop
  DW_CFA_nop
  DW_CFA_nop

```

可执行文件中 `f2c` 函数的 `objdump` 输出：

```
0000000000401190 <f2c>:
  401190:	53                   	push   %rbx
  401191:	89 fb                	mov    %edi,%ebx
  401193:	bf 10 20 40 00       	mov    $0x402010,%edi
  401198:	e8 93 fe ff ff       	call   401030 <puts@plt>
  40119d:	66 0f ef c0          	pxor   %xmm0,%xmm0
  4011a1:	f2 0f 2a c3          	cvtsi2sd %ebx,%xmm0
  4011a5:	f2 0f 5c 05 93 0e 00 	subsd  0xe93(%rip),%xmm0        # 402040 <__dso_handle+0x38>
  4011ac:	00
  4011ad:	5b                   	pop    %rbx
  4011ae:	f2 0f 59 05 92 0e 00 	mulsd  0xe92(%rip),%xmm0        # 402048 <__dso_handle+0x40>
  4011b5:	00
  4011b6:	f2 0f 5e 05 92 0e 00 	divsd  0xe92(%rip),%xmm0        # 402050 <__dso_handle+0x48>
  4011bd:	00
  4011be:	f2 0f 2c c0          	cvttsd2si %xmm0,%eax
  4011c2:	c3                   	ret

```

在 `f2c` 的 FDE 中，函数开头有一个带有 `DW_CFA_advance_loc` 的单字节指令。在高级操作之后，还有两个附加操作。`DW_CFA_def_cfa_offset` 将 CFA 更改为 `%rsp+16`，`DW_CFA_offset` 表示 `%rbx` 中的初始值现在位于 `CFA-16`（堆栈顶部）。

查看这个 `fc2` 反汇编代码，可以看到 `push` 用于将 `%rbx` 保存到堆栈中。 在代码生成中省略帧指针的优点之一是可以使用 `push` 和 `pop` 等紧凑指令在堆栈中存储和检索值。 在这种情况下，保存 `%rbx` 是因为 `%rbx` 用于向 `printf` 函数传递参数（实际上转换为 `puts` 调用），但需要保存传递到函数中的 `f` 初始值以供后面的计算使用。`4011ae` 的 `DW_CFA_advance_loc` 29字节显示了 `pop %rbx` 之后的下一个状态变化，它恢复了 `%rbx` 的原始值。 `DW_CFA_def_cfa_offset` 指出 pop 将 CFA 更改为 `%rsp+8`。

### GDB 使用调用帧信息

有了 CFI 信息，[GNU 调试器（GDB）](https://opensource.com/article/21/3/debug-code-gdb) 和其他工具就可以生成准确的回溯。如果没有 CFI 信息，GDB 将很难找到返回地址。如果在 `f2c.c` 的第 7 行设置断点，可以看到 GDB 使用此信息。GDB在 `f2c` 函数中的 `pop %rbx` 完成且返回值不在栈顶之前放置了断点。

GDB 能够展开堆栈，并且作为额外收获还能够获取当前保存在堆栈上的参数 `f`：

```
$ gdb f2c
[...]
(gdb) break f2c.c:7
Breakpoint 1 at 0x40119d: file f2c.c, line 7.
(gdb) run
Starting program: /home/wcohen/present/202207youarehere/f2c
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
98
converting

Breakpoint 1, f2c (f=98) at f2c.c:8
8            return c;
(gdb) where
#0  f2c (f=98) at f2c.c:8
#1  0x000000000040107e in main (argc=<optimized out>, argv=<optimized out>)
        at f2c.c:15

```

### 调用帧信息

DWARF 调用帧信息为编译器提供了一种灵活的方式来包含用于准确展开堆栈的信息。这使得可以确定当前活动的函数调用。我在本文中提供了简要介绍，但有关 DWARF 如何实现此机制的更多详细信息，请参阅 [DWARF 规范](https://dwarfstd.org/Download.php)。

*（题图：MJ/4004d7c7-8407-40bd-8aa8-92404601dba0）*

---

via: <https://opensource.com/article/23/3/gdb-debugger-call-frame-active-function-calls>

作者：[Will Cohen](https://opensource.com/users/wcohen) 选题：[lkxed](https://github.com/lkxed/) 译者：[jrglinux](https://github.com/jrglinux) 校对：[wxy](https://github.com/wxy)

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


5 个专注于隐私保护的 Linux 发行版

![](/data/attachment/album/202307/26/065805uggn1zamz3ztt11i.jpg)

>
> 我们在这篇文章中列出了 2023 年排名前 5 的专注于隐私保护的 Linux 发行版，旨在提供给你在选择之前的参考。
>
>
>

随着疫情和远程办公的普及，网络隐私成为一个主要关注点。随着我们越深入数字世界，网络安全和隐私变得对每个人的日常生活都至关重要。几乎每天都会看到 [公共漏洞（CVE）](https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures)，一个月中也会爆出几个 [零日漏洞](https://en.wikipedia.org/wiki/Zero-day_(computing)) 和勒索软件攻击。

幸运的是，与 Windows 相比，Linux 通常在设计上就相对安全。此外，如果你在日常工作中使用 Linux 发行版时遵循一些最佳实践，大多数 Linux 发行版也是安全的。

此外，一些特定的 [Linux 发行版](https://www.debugpoint.com/category/distributions) 为你的工作和个人使用提供了额外的安全层和工具。例如，如果你想在互联网上实现完全匿名，或者你是网络安全专家，你可能会考虑一些区别于普及的主流 Linux 发行版，如 Ubuntu 或 Fedora 的其他发行版。

以下是提供更好隐私保护和安全性的 5 个 Linux 发行版的列表。

### 2023年度最佳隐私专用 Linux 发行版

#### 1、Tails

<ruby> 匿名隐私系统 <rt>  The Amnesic Incognito Live System </rt></ruby>（简称 Tails）是一种基于 Debian 的 Linux 发行版，让你在浏览网页时完全匿名。它主要使用 Tor 网络，通过其网络重定向流量以隐藏你的位置和其他私密信息。此外，它还配备了处理电子邮件、浏览器和其他工具所需的所有必要安全应用程序。

如果你需要一种内置完全隐私功能的 Linux 发行版，请选择 Tails。

![Tails](/data/attachment/album/202307/26/070003v1uxmdigssieeeu1.jpg)

优点:

* 与 Tor 网络完美集成
* 预配置了 NoScript、HTTPS anywhere 和其他相关插件的浏览器（Firefox）
* 内置比特币钱包、无线网络审计工具，并配备 Onion Circuits
* <ruby> 立付介质 <rt>  Live medium </rt></ruby>

更多详情：

* 主页：<https://tails.boum.org/>
* 发行频率：每年 5 到 6 次发布
* 发行类型：Debian（稳定版）、GNOME、LIVE 图像、仅支持 64 位、x86\_64
* 下载：<https://tails.boum.org/install/index.en.html>

#### 2、Parrot OS

Parrot OS（以前称为 Parrot Security OS）也是一种基于 Debian 的 Linux 发行版，主要面向网络安全专业人员和渗透测试人员，为他们提供了一种完整的 Linux 发行版，提供了他们所需的所有工具。

此外，你还可以将其用作日常使用，具有用于数字取证工作的内置沙盒选项。此外，它可以使用其容器化技术连接到其他设备。

![Parrot OS 隐私专用 Linux 发行版](/data/attachment/album/202307/26/070016pl5advc4z42324j3.jpg)

优点：

* 基于 Debian 的立付系统
* 提供多种桌面风格选择
* 运行的应用程序都被隔离在沙盒中
* 非常适合数字取证工作

更多详情：

* 主页：<https://parrotsec.org/>
* 发行频率：每年 2 到 3 次发布
* 发行类型：Debian（测试版）、MATE 和 KDE Plasma、LIVE 图像、仅支持 64 位、x86\_64
* 下载：<https://parrotsec.org/download/>

#### 3、Qubes OS

Qubes OS 是一种基于 Fedora Linux 的独特 Linux 发行版。Qubes 提供多个“虚拟机”（被称为“Qubes”），用于托管应用程序。该方法有效地将“个人”、“工作”或其他用户定义的工作流程隔离开来。

此外，为了区分不同的“虚拟机”，该发行版为配置文件提供了色彩代码，以便你知道哪个正在运行哪个应用程序。

使用这种方法，如果你在一个“虚拟机”中遭受身份泄露或下载了恶意软件，系统的其他部分都是安全的。这种方法被称为“安全隔离”，非常适合需要在互联网上保护隐私的科技爱好者和普通用户。

![Qubes OS 隐私专用 Linux 发行版](/data/attachment/album/202307/26/070027i8q8in1c66biqvej.jpg)

优点：

* 通过独立的“虚拟机”实现“安全隔离”
* 内置沙盒支持
* 提供完全磁盘加密
* 通过色彩代码标记的“Qubes”，方便进行工作流程导航

更多详情：

* 主页：<http://qubes-os.org/>
* 发行频率：每年 2 到 3 次发布
* 发行类型：Fedora、Xfce、桌面版、仅支持 64 位、x86\_64
* 下载：<https://www.qubes-os.org/downloads/>

#### 4、Kali Linux

Kali Linux 是基于 Debian 测试分支的最受欢迎的渗透测试 Linux 发行版。以印度教女神“卡利”命名，这个 Linux 发行版提供了适用于树莓派和其他设备的 32 位、64 位和 ARM 版本。此外，它搭载了大量的工具，使安全研究人员和网络安全专家能够在其他发行版上拥有优势。

![Kali Linux 隐私专用 Linux 发行版](/data/attachment/album/202307/26/070037d4rv9j4xr8fhkkh4.jpg)

优点：

* Kali Linux 几乎成为安全研究人员的“行业标准”发行版
* 提供完全磁盘加密
* 支持 i686、x86 和 ARM
* LIVE 系统
* 提供完善的文档，以及用于自定义 Kali Linux 进行特定研究的培训套件
* Kali Linux 提供付费的渗透测试认证课程

更多详情：

* 主页：<http://www.kali.org/>
* 发行频率：每年 3 到 4 次发布
* 发行类型：Debian（测试版）、GNOME、KDE Plasma 等等、桌面版和 LIVE 等等、32 位和 64 位、x86\_64、i686、ARM
* 下载：<http://www.kali.org/downloads/>

#### 5、Whonix Linux

Whonix 是另一种基于 Debian 的独特设计的 Linux 发行版。它作为虚拟机在 VirtualBox 中运行，从而提供了一个不能驻留在磁盘上、在多次重启后不会丢失的操作系统。

此外，其独特的设计提供了一个连接到 Tor 网络的网关组件，以及一个名为“工作站”的第二个组件，负责运行所有用户应用程序。这些用户应用程序连接到网关，为应用程序和用户提供完全匿名性。最后，这种独特的两阶段隔离方法在确保完全隐私的同时，减轻了多种风险。

![Whonix 隐私专用 Linux 发行版](/data/attachment/album/202307/26/070050cy8ybxybr9jqn54u.jpg)

优点：

* 两阶段隔离，分离网络和用户应用程序
* 支持 Tor 网络，提供 Tor 浏览器和即时通讯等应用程序
* 预装了主要应用程序
* 支持 Linux 内核运行时保护

更多详情：

* 主页：<https://www.whonix.org/>
* 发行频率：每年发布 1 次
* 发行类型：Debian、桌面版、Xfce、64 位、x86\_64
* 下载：<https://www.whonix.org/>

### 其它

除了上述列表，我们还要提到 Linux Kodachi 和 BlackArch Linux，它们与上述发行版本类似。

首先，[Linux Kodachi](https://www.digi77.com/linux-kodachi/) 也是一个基于 Debian 的发行版，使用 Tor 网络为用户提供隐私保护。它配备了 Xfce 桌面环境，并提供仅支持64位的安装程序。

除了 Kodachi，还有 [BlackArch Linux](http://blackarch.org/)，它是本列表中唯一基于 Arch Linux 的发行版。它采用了窗口管理器（如 Fluxbox、Openbox），而不是桌面环境，并提供了 1000 多个适用于渗透测试和安全分析的应用程序。

### 总结

最后，我希望这个 2023 年顶级隐私专注的 Linux 发行版列表能给你保护自己和你在互联网上的隐私提供一个起点。

最后但并非最不重要的是，我要提醒你，如果你将上述发行版与 Tor 网络一起使用，请不要使用这些发行版进行任何银行或金融交易（尤其是那些使用手机验证的多因素身份验证的交易）。因为 Tor 会通过不同的国家路由你的流量，因此最好不要在这些发行版上进行金融工作。

图像来自各个发行版及维基百科。

*（题图：MJ/0603df83-3221-4a15-9312-011325786414）*

---

via: <https://www.debugpoint.com/privacy-linux-distributions-2022/>

作者：[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/) 荣誉推出


硬核观察 #1074 甲骨文的新 Java 许可条款将增加 2-5 倍费用

Summary:
? 甲骨文的新 Java 许可条款将增加 2-5 倍费用
? FCC 建议新的宽带标准
? OpenAI 悄然关闭其人工智能检测工具
»
»

![](/data/attachment/album/202307/26/142536kvjm58k0h8s5psdy.jpg)

![](/data/attachment/album/202307/26/142545djcja9rjj69znccj.jpg)

### 甲骨文的新 Java 许可条款将增加 2-5 倍费用

据 Gartner 公司估计，大多数企业在接受甲骨文公司新的 Java 许可条款时，预计按员工订阅模式的成本将是传统模式的两到五倍。新模式以每个员工的消耗量为基础，而不是以前的每个处理器或每个用户的消耗量。这同时意味着到 2026 年，80% 以上的 Java 应用程序将部署在第三方 Java 运行时上，而 2023 年这一比例仅为 65%。Gartner 还警告说，甲骨文公司已经准备好测试用户是否遵守它所认为的 Java 许可条款，预计 1/5 的 Java 用户会在未来三年内接受甲骨文的审计。

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

>
> 老王点评：Java 真是一只下金蛋的鸡，但是现在它一天要下一只是不行的了。
>
>
>

![](/data/attachment/album/202307/26/142604wn83p3inid07s3j2.jpg)

### FCC 建议新的宽带标准

美国联邦通信委员会（FCC）主席提出了一项新的宽带标准，即下载速度为 100Mbps，上传速度为 20Mbps，以取代 2015 年的 25Mbps/3Mbps 标准。根据她的计划，FCC 将评估宽带的可用性、速度和价格，以决定是否采取监管措施来促进网络部署和竞争。FCC 还将为未来设定一个 1Gbps/500Mbps 的目标。

>
> **[消息来源：Ars Technica](https://arstechnica.com/tech-policy/2023/07/fcc-chair-speed-standard-of-25mbps-down-3mbps-up-isnt-good-enough-anymore/)**
>
>
>

>
> 老王点评：新的带宽目标，将带来新的基础设施，而新的基础设施是更多应用的基础，比如 AR/VR/XR 等，以及 AI。
>
>
>

![](/data/attachment/album/202307/26/142614t5tmf7p5kkcpi4ch.jpg)

### OpenAI 悄然关闭其人工智能检测工具

今年 1 月，人工智能巨头 OpenAI 发布了一款工具，它可以通过检测内容是否使用了生成式人工智能工具（比如它自己的 ChatGPT）来创建。半年后，这个工具死了，原因是 “它的准确率很低”，但这一解释并没有出现在新的公告中，而是添加到了首次发布该工具的博客文章的注释中。

>
> **[消息来源：Decrypt](https://decrypt.co/149826/openai-quietly-shutters-its-ai-detection-tool)**
>
>
>

>
> 老王点评：AI 工具无法识别 AI 输出的内容。还有什么能束缚 AI 的发展？
>
>
>


发展中国家面临的三个关键开源挑战

![](/data/attachment/album/202307/27/073634a244fon440y25kug.jpg)

>
> 开源在发展中国家面临着许多困难，这些困难使人们对开源的看法以及与开源的联系变得不准确、不贴切。
>
>
>

>
> 编者按：本文作者 Ahmed Sobeh 是 Aiven 开源项目办公室的开源工程经理。他来自埃及，在开源领域有各种经验。本文是他对埃及的开源文化的见解。
>
>
>

当我回国，和科技行业或其他行业的人谈起我的工作和我每天参与的话题时，我通常会对 <ruby> <a href="https://opensource.com/article/20/5/open-source-program-office">  开源计划办公室 </a> <rt>  Open Source Programs Office </rt></ruby>（OSPO）这个想法感到困惑。一家公司在没有明显的直接经济利益的情况下为开源项目做出贡献，这种概念在文化上很难理解或解释。

作为一个在发展中国家出生并成长的人，我理解并赞同这个观点。曾几何时，我对开源软件的唯一理解是，它是一种无需付费、无需等待特定问题或附加功能发布即可使用的软件。我可以自己在本地做任何我需要的事情。

在发展中国家，开源面临着许多困难，这些困难使人们对它的看法和相关印象变得不准确和脱节。我将在本文中讨论这些问题。

### 发展中国家的开源挑战

开源在这些地区面临的挑战主要分为三个部分：

* 社会与文化
* 资源与基础设施
* 政府管理

### 社会与文化

众所周知，科技中的文化，特别是其中的开源部分，源自它所存在的社会文化。这就是为什么在当今世界，开源更有可能在世界较发达地区得到维持和维护。

但是，试想一个完美的社会，一个最适合开源发展、维持和维护的社会。这个社会的文化是什么样的？其主要特征是什么？

#### 开放和透明

开源想要发展，社会文化必须尽可能开放和透明。信息必须可以自由公开地获取，这在许多欠发达地区是一个巨大的问题。信息往往受到繁文缛节的制约，普通公民难以获取，更不用说那些试图为开源做出贡献的人了。

#### 自由

“自由”这个词有许多不同的含义与解释。有言论自由、表达自由、选择自由、信仰自由、宗教自由等等。在本文中，我最关心的自由方面是在没有更高层机构干预的情况下建立新社区和组织的能力。这是开源的本质。分布式协作模式是一种高效的协作模式，在这种模式下，大型团体在没有强大的中央权威指挥的情况下开展合作。这是大多数这些地区面临的另一个重大挑战。新的社区和组织往往会受到质疑、密切监视，不幸的是，在某些情况下，甚至会因为害怕可能出现的新思想或其他原因而遭到起诉并最终被关闭。

#### 充满活力

充满活力的文化对开源的发展至关重要。准备接受和实行新想法的文化是发展开源最理想的地方。抵制改变和倾向于固守传统方法会阻止社会接受新的技术和方法，这是大部分发展中国家中的主要问题。

这些地区抵制改变背后最重要也是最常见的原因是对未知的恐惧。把对未知的恐惧作为“发展中国家”的问题来讨论是不公平的。这是在哪里都常见问题，甚至在发达国家。但是恐惧背后的一些原因是发展中国家特有的。主要原因有两个，一是对科技行业的能力缺乏信心，二是缺乏责任感。企业和个人都不信任现有软件解决方案的功能，更不用说开源解决方案了。有一种观点认为，开源软件不安全、不可靠。当人们不相信软件开发者的能力时这种担忧会被放大。其次，人们不相信该系统会对使用软件或法律冲突中可能出现的错误或问题追究责任。

### 资源、基础设施和经济

经济挑战是发展中国家开源面临的最明显的困难，影响着这些地区的开源开发者和社区。

#### 供应和资金

开源开发人员在发展中国家努力解决供应问题。无论是上网还是使用设备，当你每天都在努力获取资源时，就很难成为一名固定的开源贡献者。这些国家的数字鸿沟十分巨大。依然有许多地区没有正常、稳定和高速的互联网连接。在设备方面，这些地区也与世界其他地区存在市场差距。没有足够的资金购买最新、最强大的机器始终是个难题，但同时也存在供应问题。在这些地区，建立和运行最大的开源项目所需的现代化、功能强大的技术设备并不总能提供。

这些问题使得自我教育和学习具有挑战性。由于这些供应问题，开源开发人员很难选择一个开源项目，自行学习所有相关知识，并开始为其做出贡献。

在这种情况下，如何建立开源社区呢？项目最终只能由少数拥有稳定高速互联网连接和最新设备的特权人士来维护。剩下的将是零星的、偶尔来自他人的贡献，很难被视为一个社区。一旦出现有偿工作的机会，即使是这些人也会消失。我亲眼见过多次这种情况。有人会开始了解一个开源项目，研究特定的堆栈或提高自己的技能，并开始为其做出贡献。但一旦出现了有偿工作的机会，即使是作为第二份工作，他们也会完全放弃开源项目。这是有道理的。任何个人都必须优先考虑自己和家人的生存手段。

这种资源匮乏和对少数特权人群的依赖，也使其几乎不可能为营销活动、社区建设活动以及最后但并非最不重要的文献本地化尝试提供资金。

#### 本地化

英语是互联网语言，但对许多国家来说并非如此。虽然几乎所有的开发人员都会说基本的英语，但并不是每个人都有能力理解文档、架构资源和技术规范，使他们能够有意义地 [为开源项目做出贡献](https://opensource.com/article/22/3/contribute-open-source-2022)。由于没有相应的文档，发展中国家的开发人员很难找到进入开源项目的切入点。为此所需的时间和资源通常会使这些地区的潜在贡献者望而却步。

#### 员工合同

几乎所有的软件员工合同都旨在将开发人员的每一行代码、贡献或想法货币化。任何参与外部项目的行为都会受到雇佣公司的质疑，而雇佣公司往往会阻止开发人员为开源做贡献，以避免法律问题。法律偏向于公司和组织，阻止软件开发人员做出外部贡献。

#### 知识产权法

发展中国家的法律框架往往不具备处理知识产权和开源许可细微差别的能力。与发达国家相比，发展中国家的知识产权法律可能较弱或不够全面，执法效力也可能较低。这可能使创作者和贡献者难以保护自己的作品，并防止他人在未经许可的情况下使用。

此外，开源许可证可能很复杂。许多发展中国家可能不具备有效驾驭这些许可的法律专业知识或资源。这可能使开发人员很难在不无意中违反许可证条款的情况下为开源项目做出贡献。

另一个问题是，知识产权法和开源许可证有时被视为发展中国家创新和发展的障碍。批评者认为，这些法律和许可会扼杀创造力，阻碍知识和技术的传播，尤其是在资源和技术有限的地区。

总体而言，发展中国家围绕知识产权法和开源贡献所面临的挑战是复杂的、多方面的，需要采取细致入微的方法来应对这些国家所面临的独特情况和挑战。

### 专有软件交易

美国和欧洲的科技巨头与发展中地区的政府签订了价值数十亿美元、长达数十年的软件供应协议。一旦有人当选，并决定开始采用开源软件，他们就会发现摆脱这些交易需要付出巨大的代价。

### 开源并非一帆风顺

这些只是开放源代码在发展中国家面临的一些困难。要改善这种状况，使开源技术的采用和发展变得可行，还有许多工作要做。在今后的文章中，我将深入探讨具体的解决方案，但现在，我想说的是，任何事情都要从个人做起。当我们每个人都 “众包” 开放文化时，我们生活和工作所在地区的文化也会随之改变。尽你所能，将开放源代码带入你的社区，看看它会带来什么。

*（题图：MJ/e9f5a8be-b0bd-425a-8199-248f5c0abe16）*

---

via: <https://opensource.com/article/23/4/challenges-open-source-developing-countries>

作者：[Ahmed Sobeh](https://opensource.com/users/ahmed-sobeh) 选题：[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/) 荣誉推出


Linux Shell 介绍：Bash、Zsh 和 Fish

nushell

![](/data/attachment/album/202307/27/152721rd48wwn7xxfkngdw.jpg)

>
> 关于著名的 Linux Shell - Bash、Zsh 和 Fish 的一些注释和特性。
>
>
>

Linux 之所以强大，是因为它提供了用于与系统进行交互的多功能的命令行界面。在这中情况下，Shell 扮演了用户和 Linux 内核之间的桥梁。本文将探讨三种流行的 Linux Shell - Bash、Zsh 和 Fish，并深入了解它们的独特特性和功能。

### 理解 Linux Shell

#### 什么是 Shell？

Shell 是一个命令行解释器，允许你通过文本命令与操作系统进行交互。它接收你的输入，处理它，并与 Linux 内核通信以执行所请求的操作。最后，它会给你一个输出。

（LCTT 译注：“Shell” 一词大约取自其“界面”、“外壳”的含义。）

Shell 在 Linux 中起着至关重要的作用，因为它们使用户能够执行各种任务，从简单的文件导航到复杂的系统管理任务。不同的 Shell 提供各种功能，因此选择适合你工作流程的 Shell 至关重要。

### Bash

[Bash](https://www.gnu.org/software/bash/)，全称 “Bourne Again SHell”，是 Linux 发行版中最广泛使用的默认 Shell 之一。它以其简洁和兼容性而闻名，是初学者的优秀选择。

#### Bash 的特点

Bash 具有众多特性，包括：

* 命令历史：使用箭头键轻松访问先前执行的命令。
* `Tab` 键补全：节省时间，让 Bash 为你自动完成文件名和命令。
* 脚本编写：编写和运行 Shell 脚本以自动化重复任务。从这个角度来看，它也是一个程序。
* Bash 在大多数 GNU/Linux 系统中默认安装。
* 配置设置存储在家目录下的 `.bashrc` 文件中。

和其他 Shell 一样，Bash 有其优点和缺点。使用 Bash 的一些优势包括广泛的使用性、详尽的文档以及庞大的社区支持。然而，Bash 可能缺乏其他 Shell 中存在的一些现代化特性。

![Linux 中的 Bash shell](/data/attachment/album/202307/27/152903kf8wmp4hhs4xl999.jpg)

#### 安装

* 在 Linux 发行版中打开终端。
* 输入 `bash --version` 检查是否已安装 Bash。
* 若尚未安装，使用软件包管理器安装 Bash。例如，在 Ubuntu 上，输入 `sudo apt-get install bash`。
* 对于 Fedora 和基于 RPM 的 Linux，请使用 `sudo dnf install bash`。

### Zsh

[Zsh](https://www.zsh.org/)，全称 “Z Shell”，是一种强大且功能丰富的 Shell，深受经验丰富的用户欢迎。它吸取了 Bash 和其他 Shell 的优点，提升了用户体验。

#### Zsh 的优势

Zsh 提供了几个优势，包括：

* 高级自动补全：Zsh 在 Bash 的基础上提供了更多上下文感知的建议，超越了简单的 `Tab` 键补全。
* 当你按下 `Tab` 键时，Zsh 会显示可能的值以供选择，同时进行自动补全。
* 插件支持：通过社区中提供的各种插件，扩展 Zsh 的功能。
* 这里有一个 [庞大的 Zsh 主题集合](https://github.com/unixorn/awesome-zsh-plugins)。
* 你还可以使用 [Oh My Zsh 脚本](https://www.debugpoint.com/oh-my-zsh-powerlevel10k/) 进行广泛的自定义。

![应用 powerlevel10k zsh 主题后的效果](/data/attachment/album/202307/27/152916xhbxqgrdbrpliayl.jpg)

Zsh 的复杂性可能使新手感到不知所措，其丰富的配置选项可能会使初学者感到困惑。

以下是安装 Zsh 的方法：

* 在 Linux 发行版中打开终端。
* 输入 `zsh --version` 检查是否已安装 Zsh。
* 如果尚未安装，请使用软件包管理器安装 Zsh。
* 例如，在 Ubuntu 上，输入 `sudo apt-get install zsh`。
* 对于 Fedora 和基于 RPM 的发行版，输入 `sudo dnf install zsh`。

### Fish Shell

[Fish](https://fishshell.com/)，全称 “Friendly Interactive SHell”，着重于用户友好性和易用性。它拥有现代、直观的界面，特别适合新的 Linux 用户。

#### Fish 的独特特性

Fish 的独特之处在于：

* 语法高亮：使用彩色标记文本来区分命令、选项和参数。
* 自动建议：Fish 根据你的历史记录和当前输入智能地建议命令。
* Fish 被设计为开箱即用的高效工具。但是，你可以通过创建 `~/.config/fish/config.fish` 文件并添加自定义配置来进一步个性化它。

虽然 Fish 在用户友好性方面表现出色，但其独特的设计可能并不适合所有人。一些高级用户可能会发现某些功能在高级使用方面有所限制。

![Fish Shell](/data/attachment/album/202307/27/152925sjn8uuzpo1xu3mz1.jpg)

#### Fish Shell 的安装

* 在 Linux 发行版中打开终端。
* 输入 `fish --version` 检查是否已安装 Fish。
* 如果尚未安装，请使用软件包管理器安装 Fish。例如，在 Ubuntu 上，输入 `sudo apt-get install fish`。
* 对于 Fedora 和其他基于 RPM 的发行版，输入 `sudo dnf install fish`。

### Bash、Zsh 和 Fish 的比较

为了帮助你决定哪种 Shell 适合你的需求，让我们从各个方面比较这三个流行选择：

#### 性能与速度

Bash 以其速度和高效性而闻名，适用于资源受限的系统。Zsh 虽然稍慢一些，但其广泛的功能和能力弥补了这一点。作为更具交互性的 Shell，Fish Shell 可能会略微降低性能，但提供了愉快的用户体验。

#### 用户界面和体验

Bash 的界面简单明了，非常适合初学者，而 Zsh 和 Fish 提供了更引人注目和交互式的界面。Zsh 的高级自动补全和 Fish 的语法高亮为用户创造了视觉上的吸引力。

#### 可定制性和插件

Zsh 在可定制性方面表现出色，允许用户对其 Shell 环境进行微调。通过庞大的插件集合，Zsh 提供了无与伦比的可扩展性。Fish 则采取了更有主见的方式，专注于开箱即用的可用性，这可能对某些用户有所限制。

### 选择合适的 Shell

选择合适的 Shell 与你的具体需求和经验水平密切相关。

如果你是 Linux 的新手并且更喜欢简单、无花俏的体验，Bash 是一个极好的起点。它的易用性和详尽的文档使其非常适合初学者。

对于希望更多掌握控制权并愿意花时间进行定制的经验丰富的用户来说，Zsh 强大的功能和插件提供了一个令人兴奋和动态的环境。

如果你对自动化任务和编写复杂的 Shell 脚本感兴趣，Bash 在 Linux 生态系统中的广泛应用和全面支持使其成为一个可靠的选择。

### 结论

Bash、Zsh 和 Fish 各有其优势，满足不同用户偏好。如果你刚接触 Linux，Bash 的简单性使其成为一个极好的起点。精通用户和那些寻求定制化的用户可能会觉得 Zsh 更吸引人，而 Fish 的用户友好设计则适合寻求直观界面的初学者。最终，选择权在你手中，探索这些 Shell 将带来更高效和愉悦的 Linux 使用体验。

你最喜欢的 Shell 是什么？在下方的评论框中告诉我。

*（题图：MJ/b6490b57-63bd-4fdd-bd3f-bf6d4aef1c4a）*

---

via: <https://www.debugpoint.com/linux-shells/>

作者：[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/) 荣誉推出


硬核观察 #1075 Twitter 抢夺了已注册 16 年的 @X 账号

Summary:
? Twitter 抢夺了已注册 16 年的 @X 账号
? 联合国教科文组织呼吁全球禁止在学校使用智能手机
? 偷偷摸摸的 Python 软件包安全修复对谁都没好处
»
»

![](/data/attachment/album/202307/27/170850ivz5rr9ter52q5rz.jpg)

![](/data/attachment/album/202307/27/170914b5ndacencuc9ez3r.jpg)

### Twitter 抢夺了已注册 16 年的 @X 账号

马斯克将 Twitter 品牌重塑为 “X”，其蓝鸟标志也改为 X，但 Twitter 上的 @X 账号并没有控制在 Twitter 手中，它早在 16 年前就被用户使用了。如果 Twitter 的官方账号没有改为 @X，那么马斯克此番重塑商标的动作显然是不完整的。所以他们直接接管了 @X 账号。Twitter 之前的服务条款允许它接管任何用户名。该账号的原拥有者、旧金山摄影师 Gene X Hwang 称他们发了封邮件，说该账号是 X 的财产。Twitter 没有提供任何经济补偿，只是让他创建一个新账号，为其转移历史记录等信息，以及提供一些纪念品和与管理团队见面等机会。

>
> **[消息来源：Ars Technica](https://arstechnica.com/tech-policy/2023/07/twitter-took-x-handle-from-longtime-user-and-only-offered-him-some-merch/)**
>
>
>

>
> 老王点评：虽然很令人遗憾，但是你在所有中心化平台注册的账号名，其实都不属于你，平台方可以任意拿走。
>
>
>

![](/data/attachment/album/202307/27/170914dz9559eilfv5z5zi.jpg)

### 联合国教科文组织呼吁全球禁止在学校使用智能手机

联合国教科文组织说，有证据表明，过度使用手机与学习成绩下降有关，而且大量的屏幕时间会对儿童的情绪稳定产生负面影响。呼吁禁止使用智能手机发出了一个明确的信息，即包括人工智能在内的整个数字技术应始终服从于 “以人为本的教育理念”，绝不能取代与教师面对面的交流。教科文组织警告政策制定者不要不假思索地拥抱数字技术，认为数字技术对学习成果和经济效率的积极影响可能被夸大，而且“并非所有变化都是进步，可以做的事情并不意味着应该做”。

>
> **[消息来源：卫报](https://www.theguardian.com/world/2023/jul/26/put-learners-first-unesco-calls-for-global-ban-on-smartphones-in-schools)**
>
>
>

>
> 老王点评：作为一个焦虑的父亲，从未觉得教科文组织的话这么正确过。?有一点非常赞同，“并非所有变化都是进步”。
>
>
>

![](/data/attachment/album/202307/27/170919v4h6p4azotpbb64d.jpg)

### 偷偷摸摸的 Python 软件包安全修复对谁都没好处

Python 的安全修复通常是通过 “静默” 的代码提交实现的，没有相关的 CVE 标识符。这导致不是安全专家的开发人员可能无法识别上游提交针对的是与其代码相关的可利用漏洞，从而没有修复该安全漏洞的紧迫性。有人提出了一种补救措施：建立一个名为 PySecDB 的安全提交数据库，让 Python 代码的修复对社区更加可见。这是 Python 中第一个安全提交数据集，它涵盖了 119 个以上的 CWE 分类。Python 基金会的安全研究人员表示，将会注册为 CVE 编号机构以改善这种情况。

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

>
> 老王点评：这样的措施，应该对其它的语言和模块仓库有借鉴价值。
>
>
>


如何在 Linux 中安装 Jupyter Notebook

![](/data/attachment/album/202307/28/063430e6lz9elvz4pw55l4.jpg)

>
> 如何在 Ubuntu 或 Debian Linux 中安装 Jupyter Notebook 的简单教程。
>
>
>

[Jupyter](https://jupyter.org/) Notebook 是一款功能强大的基于 Web 的交互式开发工具，可让你创建和共享实时代码、可视化和交互式数据。其笔记本格式结合了代码和文本，使其成为数据探索、分析和协作项目的绝佳选择。

在本教程中，我们将逐步指导你在基于 Ubuntu 或 Debian 的系统上安装 Jupyter Notebook，使你能够利用其多功能性并扩展编程能力。

### 安装 pip

在开始之前，请确保你的系统上已安装 `pip`（Python 包安装程序）。如果你已经安装了 `pip`，则可以跳过此步骤。否则，请按照以下说明进行安装。你还可以访问 [此页面](https://www.debugpoint.com/pip-command-not-found/) 获取详细说明。

打开终端窗口（`Ctrl+Alt+T`）并输入以下命令，按回车键：

```
sudo apt updatesudo apt install python3-pip

```

系统可能会提示你输入密码。提供它并等待安装完成。

### 安装 virtualenv

尽管不是强制性的，但建议在 Jupyter Notebook 安装中通过此工具隔离你的工作环境。这可以确保你安装的任何更改或软件包都不会干扰系统的 Python 环境。要设置虚拟环境，请按照以下步骤操作：

在终端中，输入以下命令：

```
sudo apt install python3-virtualenv

```

等待安装完成。完成后，继续下一步。

### 创建虚拟环境

创建虚拟环境是一个简单的过程。以下是专门为 Jupyter Notebook 设置新虚拟环境的方法：

进入到要在其中创建虚拟环境的目录。在终端中运行以下命令：

```
virtualenv my-jupyter-env

```

此命令创建一个名为 `my-jupyter-env` 的新目录，其中将包含虚拟环境文件。

![create jupyter environment](/data/attachment/album/202307/28/063640nsmauyescyyhu7oy.jpg)

你还可以通过任何文件管理器验证该目录是否在你的主文件夹下创建成功。

![jupyter env folders](/data/attachment/album/202307/28/063656uptgtdittpziki7l.jpg)

输入以下命令激活虚拟环境：

```
source my-jupyter-env/bin/activate

```

你会注意到终端提示符发生变化，表明你现在位于虚拟环境中。

![activate the environment](/data/attachment/album/202307/28/063709xp9yzkti98kikb1h.jpg)

### 安装 Jupyter Notebook

激活虚拟环境后，你现在可以继续安装 Jupyter Notebook：

在终端中，输入以下命令：

```
pip install jupyter

```

此命令会获取必要的包并在虚拟环境中安装 Jupyter Notebook。

![Installing jupyter using pip](/data/attachment/album/202307/28/063722w90979756ccjap60.jpg)

### 启动 Jupyter Notebook

安装完成后，你就可以启动 Jupyter Notebook：

在终端中，输入以下命令：

```
jupyter notebook

```

执行命令后，Jupyter Notebook 将启动，你应该看到类似于以下内容的输出：

![running jupyter notebook in Debian](/data/attachment/album/202307/28/063735lmnu1nn4zuumq9nm.jpg)

你的默认 Web 浏览器将打开，显示 Jupyter Notebook 界面。

![Jupyter notebook running in browser](/data/attachment/album/202307/28/063748vz9koiiiibi8jd5k.jpg)

### 关闭并重新启动

如果要关闭 Notebook 服务器，请确保关闭并保存所有笔记。关闭浏览器。然后在终端窗口中按 `CTRL+C`。它会提示你是否要关闭服务器。输入 `Yes` 并按回车键。最后，关闭终端窗口。

要再次重新启动服务器，你需要按上面的描述运行 `virtualenv my-jupyter-env` 等所有命令

### 总结

恭喜！ 你已在 Ubuntu 或 Debian 系统上成功安装 Jupyter Notebook。通过执行上述步骤，你现在可以利用 Jupyter 的交互式开发环境轻松编写代码、创建可视化并探索数据。

请记住，Jupyter Notebook 支持各种编程语言，包括 Python，并提供大量插件来进一步扩展其功能。

*（题图：MJ/e3436c7f-435d-491e-9032-b945730cb000）*

---

via: <https://www.debugpoint.com/install-jupyter-ubuntu/>

作者：[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/) 荣誉推出


每年都是某个人的 “Linux 桌面之年”

Summary: 如果以我的经验为例，大多数精通技术的人都可以实现 “Linux 桌面之年”。

非深度专业目的的电脑使用，已经可以完全移植到linux上面了，有些比较专业的还是不行。

如果以我的经验为例，大多数精通技术的人都可以实现 “Linux 桌面之年”。

当我的第一部特别电影获得批准时，我正处于为期两年的 Linux 实验中。我是如何使用（大多数）开源软件技术制作我的电影的呢？

![](/data/attachment/album/202307/28/073821x1krrwlm1081jk8k.jpg)

我在 2020 年爱上了 Linux。时机不可能更尴尬了。

世界卫生组织宣布我们这一生中的第一次大流行病降临。我刚刚从工作中休假，打算利用这段时间完成硕士学位，并完成我处女作《第一次言辞》的续集。

但作家是一群善变的人。有时我们的注意力可以持续数周，锐利无比。有时，我们的注意力却像金鱼一样短暂。

那时我处在金鱼模式中。

我需要一些东西来逃离我日复一日的生活：醒来，写几个小时，开始学习，完成课程作业，重复。

互联网上的某个地方有人提到，大流行病为人们提供了在日常计算中尝试 Linux 的最佳机会。

立刻，金鱼般的大脑被吸引住了。

这是有充分理由的：

20 年前，我放弃了电影学院，选择攻读计算机科学学士学位。

令我惊讶的是，我发现自己喜欢上了大部分课程（直到我们学习《Java 编程入门》时，我因此退学了，但这是另外一个故事）；《计算机体系结构》、《网络》和《系统管理》模块真的引起了我的兴趣，我发现自己在学校实验室里花更多时间在安装了 Linux 的机器上。

关键是我和 Linux 之间有历史。

而在 2020 年，时机刚刚好。

### 疫情期间的技术爱好者生活

在我退学后的几年里，我远离了计算机引发我内心的那些好奇心。

作为对电影学院的替代，我成为了一名小说家。

我从信息技术转向了市场营销，并花费了 20 多年的时间为平面、电视、广播和数字平台撰写广告文案。

我创办了自己的广告代理公司。

在这 20 年里，我们目睹了社交媒体与互联网变得同义。

到了 2020 年，我决定永远离开广告界，其中很大一部分原因是我对技术的幻想破灭，尤其是对社交媒体的失望，特别是社交媒体以冷漠的方式伤害我们，无论是个人还是整个社会。

虽然我知道社交媒体并不等同于互联网，但在我的脑海中很难将它们分开。作为一个广告人，我也觉得自己在使社交媒体无处不在方面起到了一定的作用。

**拥有自己的 Linux 桌面之年，在整个大流行期间让我保持理智。**

### 2022 年：我首部特别电影

到了 2022 年，我已经在我的笔记本电脑上日常使用 Linux。我还买了一台旧的 ThinkPad T420，安装了 Ubuntu Server，并开始运行 Plex 和 NextCloud 的实例。

我在 Linux 上感到很自在，几乎将所有的写作工作都从 MS Word 和云存储转移到了 Vim 和 GitHub 上。

就在这时，我接到了一位制片人的电话，批准了我的首部特别电影。

此时，我需要做一个决定。在片场剪辑镜头时，我需要使用行业标准的非线性编辑器（NLE）。我对 Adobe Premiere 很熟悉，但我知道没有 Linux 版本。我已经尝试过 Kden Live 和其他几个自由开源软件的替代品，包括内置 NLE 的 Blender，但都不太满意。

更重要的是，我担心我的写作流程 —— 完全基于（Neo）Vim 和 Git ——对我的合作作者来说太陌生。

### 你好，Windows？

此时，我不得不问自己 Linux 是否准备好应对我未来的电影工作。为了回答这个问题，我提醒自己以下几点：

#### Linux 对非技术人员/非程序员来说是开放的（且易于接触）

我已经足够老了，记得当年 Ubuntu Linux 免费向世界上的任何人寄送安装光盘。那时，我遇到了一系列我无法解决的硬件问题，而且在我主要工具（MS Word）的高质量替代品方面非常匮乏。

到了 2020 年代，Linux 已经变得截然不同。安装过程非常简单，帮助文档非常详尽，还有 Linux 的 YouTube 资源，使过渡变得更加顺利，我所有的硬件都完美地工作，我准备彻底放弃 MS Word。

#### Git 是作家的（秘密）好朋友

自从我第一次理解了 Git 的含义和它的用途以来，我就一直这样认为：不向作家教授 Git 是一种罪过。Linus Torvalds 无意间创造了作家的好朋友。

是的，我知道当 Git 无法正常工作时会有多么令人沮丧，但是将软件工程师处理大型代码库、多人贡献的复杂 Git 工作流程剥离后，你会发现它核心的功能似乎刚好为数字时代的作家量身定制。

与此同时，我和我的合作作者面临两个问题。由于我们位于不同的大陆，我们需要一个满足以下条件的系统：

以一种不会将文件弄得一团糟而无法阅读的方式追踪更改（这样在 MS Word、谷歌文档上进行协作会非常痛苦）；

以行业标准格式格式化剧本，而无需购买 Final Draft 等剧本撰写软件。

Git 和 GitHub 满足了第一个要求。而专门为剧本撰写创建的标记语法 [Fountain](https://fountain.io/) 解决了第二个问题。

#### Linux 和好莱坞

这可能会让很多人感到惊讶，但自上世纪 90 年代以来，Linux 已经牢固地融入了好莱坞的后期制作工作流程中。

早在 1998 年，《泰坦尼克号》这样具有标志性的电影的后期制作中，Linux 就扮演了至关重要的角色。BlackMagic 的 <ruby> <a href="https://www.blackmagicdesign.com/products/davinciresolve">  达芬奇调色软件 </a> <rt>  aVinci Resolve </rt></ruby> 最初是一款在基于 CentOS 或 RHEL 的系统上运行的首选色彩分级工具。

如今，达芬奇调色软件已成为一款功能完备的编辑器，是电影制片人和 YouTuber 们的首选工具。对我们 Linux 用户而言，该公司继续提供其软件的免费版本以供 Fedora 和基于 Debian 的系统使用。对于 Arch 用户，AUR 中也提供了一个达芬奇调色软件版本，尽管我没有亲自测试过。具体效果可能因人而异。

### 如何在大部分 FOSS 技术的支持下完成我的电影

让我分享一下我的电影制作工作流程。

#### 前期制作

##### 影片概念说明

我使用 NeoVim 和 Org 模式语法编写了 [影片概念说明](https://www.studiobinder.com/blog/what-is-a-film-treatment-definition/#:~:text=A%20film%20treatment%20is%20a,or%20even%20purchasing%20your%20idea.)。Org 模式对于编写类似报告的文档结构非常有用。[Vim-org](https://www.vim.org/scripts/script.php?script_id=3642) 能够轻松将文档导出为 PDF、LaTeX、HTML 和 doc 格式。我喜欢将我的文档保存为开放文件标准，以确保在各种设备间的可移植性，所以我选择了 PDF 格式。下面的截图是电影拍摄前的最终影片概念说明：

![影片概念说明](/data/attachment/album/202307/28/074005wjr48pp346633r6u.jpg)

##### 剧本

我与合作作者商定了一种简单的工作流程。我在一天的时间里向她介绍了 VSCode、Fountain、Git 和 GitHub 的基本知识，之后她就得心应手了。此后的合作过程基本上是无缝的，基于 Git 的工作流程对我们两个人来说几乎成为自然而然的事情。请记住，我们两个人都不具备软件背景。下面的图片显示了 NeoVim 上正在编辑的 Fountain 剧本文件，而右侧的屏幕上是 [Zathura PDF 阅读器](https://pwmt.org/projects/zathura/) 即时渲染的剧本。

![使用自由开源软件技术进行剧本创作](/data/attachment/album/202307/28/074006d205zhn0zcq2llzh.jpg)

#### 制作

##### 每日镜头回顾

我们在锡哈拉加雨林进行了主要拍摄，这是该国最古老的森林之一。我们在那里待了一个星期。我带上了我的日常使用机（一台运行 Ubuntu Studio 20.04 的 Dell XPS 9750），在一天的拍摄结束后使用达芬奇调色软件来回顾当天的镜头。

##### 使用 Rsync 进行备份

负责备份每日镜头素材的工作人员会在主硬盘上进行备份，然后在其他外部存储设备上进行二次备份。由于我也带了我的 ThinkPad 服务器，我使用 [Rsync](https://www.wikiwand.com/en/Rsync) 自动化进行备份。

#### 后期制作

##### 编辑

尽管我的 XPS 笔记本内部配置足以处理这个项目，但我并不打算在上面进行影片编辑。最初，我是在工作室的一台运行达芬奇调色软件的 Windows 机器上进行编辑的。不幸的是，2022 年第二季度，斯里兰卡经济陷入了自由落体，该国已经无法偿还债务。燃料短缺和停电使得我无法前往工作室进行编辑工作，增加了我的困扰。

就在这时，我的调色师建议我们将项目转移到我的笔记本电脑上，这样我就可以在家工作。他多年来一直在 CentOS 上运行达芬奇调色软件，他认为在 Ubuntu 机器上做同样的工作没有问题。为了确保我可以进行快速编辑，他将代理素材转码为 [ProRes 422](https://support.apple.com/en-us/HT202410) 720p。

一旦我们克服了这些小问题，编辑本身就是非常稳定和无压力的操作。完成后，我的电影制作人朋友们都在问我一台运行 Linux 的笔记本电脑是如何处理这个项目的。

### 结论：我们到达目的地了吗？

在某个时刻，每个最近转向 Linux 的人都会参与到“Linux 桌面之年”的辩论中。

三年过去了，我的观念发生了变化：从理想主义（大约在 2030 年左右），到现实主义（永远不会发生），再到我目前的立场：《Linux 桌面之年》掌握在“技术探索者”的手中。

“技术探索者”被技术所吸引，有时超出主流的范畴。

而作为对社交媒体技术和大型科技公司感到幻灭的人，我正好处于尝试 Linux 桌面的理想状态。

如果以我的经验为例，大多数精通技术的人都可以实现 “Linux 桌面之年”。通过使用其他自由开源软件工具（如 Git、Fountain、Markdown、LaTeX、Org 模式和（Neo）Vim），我相信像我这样的小说家和电影制片人类型的人有足够的理由转向 Linux。

当然，如果 Black Magic 没有推出达芬奇调色软件的 Linux 版本，我就不能说这番话，但幸运的是，他们不是 Adobe 或微软。

要让人们接受 Linux 桌面，关键是专有软件的开发者们也要加入进来，承认 Linux 领域有一些用户需要与 Windows 和 Mac 领域同样的工具。如果这种情况发生，我们可能会看到 “Linux 桌面” 从梗成为现实。

>
> ? 由斯里兰卡的小说家/电影制片人 [Theena Kumaragurunathan](https://theena.net/) 撰写。他的首部小说已在 [亚马逊 Kindle](https://www.amazon.com/First-Utterance-Miragian-Cycles-Book-ebook/dp/B08MBX8GRZ) 上发售，并且他的第一部长片正在筹备发行中。
>
>
>

*（题图：MJ/1bace6a9-5d11-4cae-921c-18a850b7bff1）*

---

via: <https://news.itsfoss.com/filiming-with-foss-tech/>

作者：[Theena Kumaragurunathan](https://news.itsfoss.com/author/team/) 选题：[lkxed](https://github.com/lkxed/) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


硬核观察 #1076 Vivaldi 反对谷歌的 WEI 规范提议

Summary:
? Vivaldi 反对谷歌的 WEI 规范提议
? LXD 的维护只限于 Canonical 员工
? 安卓手机现在可以发现你身边的 AirTag 跟踪器
»
»

![](/data/attachment/album/202307/28/084516vl1917ps3msqqe0l.jpg)

![](/data/attachment/album/202307/28/084528jwy7zn3igynpgena.jpg)

### Vivaldi 反对谷歌的 WEI 规范提议

在 Mozilla 之后，另一家浏览器开发商 Vivaldi 对谷歌的<ruby> 网络环境完整性 <rt>  Web Environment Integrity </rt></ruby>（WEI）规范提议表达了反对。Vivaldi 认为谷歌的提议相当于给网站提供了一种 DRM。谷歌提议 WEI 被认为是明显针对广告屏蔽插件。WEI 将可以允许网站以浏览器安装广告插件或屏蔽了跟踪程序的完整性理由拒绝提供服务。它甚至可以让网站有理由拒绝不支持 WEI 的浏览器。鉴于基于 Chromium 的浏览器事实上垄断了市场，那么市场占有率较小的浏览器如 Firefox 将可能成为区别对待的受害者，其它浏览器都面临生存威胁，Linux 平台也存在类似的情况。但谷歌已经开始在 Chromium 中加入 WEI [相关代码](https://github.com/chromium/chromium/commit/6f47a22906b2899412e79a2727355efa9cc8f5bd)。

>
> **[消息来源：Vivaldi](https://vivaldi.com/blog/googles-new-dangerous-web-environment-integrity-spec/)**
>
>
>

>
> 老王点评：这一切的行为，都是在“谷歌是一家广告公司”的前提下发生的。
>
>
>

![](/data/attachment/album/202307/28/084539shp3osoz6w64j43m.jpg)

### LXD 的维护只限于 Canonical 员工

本月初，Canonical 公司将 LXD 项目从 LXC 项目中剥离出来，[转移](/article-15971-1.html) 到了 Canonical 名下。之前 LXD 的主要维护工作都是 Ubuntu 的母公司 Canonical 的员工参与，但当员工离开 Canonical 之后仍然可以继续开发 LXD/LXC，并拥有该项目的维护权。任何运作良好的开放源码软件项目都应该如此。但现在，看起来 Canonical 的前员工已经被取消了对 LXD 项目的维护权，两位曾经担任过维护者的前员工反馈了这一变化。或许稍具安慰或讽刺的是，他们目前还接受外面贡献。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/LXD-Maintainership-Canonical)**
>
>
>

>
> 老王点评：呵，我想用不了多久，就会出现一个 LXD 的复刻分支。
>
>
>

![](/data/attachment/album/202307/28/084550rhpysp6ncq1fpz2z.jpg)

### 安卓手机现在可以发现你身边的 AirTag 跟踪器

现在，安卓用户很快就会收到这些 “未知追踪器警报”。这种警报目前只适用于 AirTag，但谷歌表示将与标签制造商合作扩大其覆盖范围。如果你不拥有的 AirTag “与主人分离并被确定与你同行”，通知会告诉你“该追踪器的主人可以看到它的位置”。你还可以追溯第一次看到它与你同行的地点，并让追踪器播放声音，以及提供追踪器的一些主人信息。

>
> **[消息来源：Ars Technica](https://arstechnica.com/gadgets/2023/07/android-phones-can-now-tell-you-if-theres-an-airtag-following-you/)**
>
>
>

>
> 老王点评：这对于防止追踪是有好处，但是如果你用 AirTag 保护你的遗失物品，可能就不是很妙了。所以，这是矛盾的两面么？
>
>
>


如何在 Kubernetes 集群中设置动态 NFS 配置

![](/data/attachment/album/202307/28/222834togtruhoeuh3gtr1.jpg)

>
> 在这篇文章中，我们将向你展示如何在 Kubernetes（k8s）集群中设置动态 NFS 配置。
>
>
>

Kubernetes 中的动态 NFS 存储配置允许你按需自动为 Kubernetes 应用配置和管理 NFS（网络文件系统）卷。它允许创建持久卷（PV）和持久卷声明（PVC），而无需手动干预或预配置存储。

NFS 配置程序负责动态创建 PV 并将其绑定到 PVC。它与 NFS 服务器交互，为每个 PVC 创建目录或卷。

### 先决条件

* 预装 Kubernetes 集群
* 具有 Kubernetes 集群管理员权限的普通用户
* 互联网连接

事不宜迟，让我们深入探讨步骤：

### 步骤 1、准备 NFS 服务器

就我而言，我将在 Kubernetes 主节点（Ubuntu 22.04）上安装 NFS 服务器。登录主节点并运行以下命令：

```
$ sudo apt update
$ sudo apt install nfs-kernel-server -y

```

创建以下文件夹并使用 NFS 共享它：

```
$ sudo mkdir /opt/dynamic-storage
$ sudo chown -R nobody:nogroup /opt/dynamic-storage
$ sudo chmod 777 /opt/dynamic-storage

```

在 `/etc/exports` 文件中添加以下条目：

```
$ sudo vi /etc/exports
/opt/dynamic-storage 192.168.1.0/24(rw,sync,no_subtree_check)

```

保存并关闭文件。

注意：不要忘记更改导出文件中适合你的部署的网络。

要使上述更改生效，请运行：

```
$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server
$ sudo systemctl status nfs-kernel-server

```

![NFS-Service-Status-Kubernetes-Master-Ubuntu](/data/attachment/album/202307/28/223041bzx61xy1g16ktzsi.jpg)

在工作节点上，使用以下 `apt` 命令安装 `nfs-common` 包。

```
$ sudo apt install nfs-common -y

```

### 步骤 2、安装和配置 NFS 客户端配置程序

NFS 子目录外部配置程序在 Kubernetes 集群中部署 NFS 客户端配置程序。配置程序负责动态创建和管理由 NFS 存储支持的持久卷（PV）和持久卷声明（PVC）。

因此，要安装 NFS 子目录外部配置程序，首先使用以下命令集安装 `helm`：

```
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

```

运行以下命令来启用 `helm` 仓库：

```
$ helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner

```

使用以下 `helm` 命令部署配置程序：

```
$ helm install -n nfs-provisioning --create-namespace nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.1.139 --set nfs.path=/opt/dynamic-storage

```

![helm-install-nfs-provisioning-kubernetes-cluster](/data/attachment/album/202307/28/223102j8wpwx1p7xmxzvpr.jpg)

上面的 `helm` 命令将自动创建 `nfs-provisioning` 命名空间，并安装 NFS 配置程序的容器荚/部署、名称为 `nfs-client` 的存储类，并将创建所需的 rbac。

```
$ kubectl get all -n nfs-provisioning
$ kubectl get sc -n nfs-provisioning

```

![kubectl-get-all-nfs-provisioning-kubernetes-cluster](/data/attachment/album/202307/28/223115t81slq74u9q8ddss.jpg)

完美，上面的输出确认了配置程序容器荚和存储类已成功创建。

### 步骤 3、创建持久卷声明（PVC）

让我们创建 PVC 来为你的容器荚或部署请求存储。PVC 将从存储类 `nfs-client` 请求特定数量的存储：

```
$ vi demo-pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: demo-claim
  namespace: nfs-provisioning
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Mi

```

保存并关闭文件。

![PVC-Yaml-Dynamic-NFS-Kubernetes](/data/attachment/album/202307/28/223127zwz9zy98yy80ity1.jpg)

运行以下 `kubectl` 命令以使用上面创建的 YML 文件创建 PVC：

```
$ kubectl create -f demo-pvc.yml

```

验证 PVC 和 PV 是否创建：

```
$ kubectl get pv,pvc -n nfs-provisioning

```

![Verify-pv-pvc-dynamic-nfs-kubernetes-cluster](/data/attachment/album/202307/28/223143i0jiziu2dnk2pi9z.jpg)

太好了，上面的输出表明 PV 和 PVC 创建成功。

### 步骤 4、测试并验证动态 NFS 配置

为了测试和验证动态 NFS 配置，请使用以下 YML 文件启动测试容器荚：

```
$ vi test-pod.yml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
  namespace: nfs-provisioning
spec:
  containers:
  - name: test-pod
    image: busybox:latest
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && sleep 600"
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: demo-claim

```

![Pod-Yml-Dynamic-NFS-kubernetes](/data/attachment/album/202307/28/223216ib8gmhkqzhmmagfq.jpg)

使用以下 `kubectl` 命令部署容器荚：

```
$ kubectl create -f test-pod.yml

```

验证 `test-pod` 的状态：

```
$ kubectl get pods -n nfs-provisioning

```

![Verify-Test-Pod-Using-NFS-Volume-Kubernetes](/data/attachment/album/202307/28/223241kwy855mbwz5jm5wb.jpg)

登录到容器荚并验证 NFS 卷是否已安装。

```
$ kubectl exec -it test-pod -n nfs-provisioning /bin/sh

```

![Access-Dynamic-NFS-Inside-Pod-Kubernetes](/data/attachment/album/202307/28/223252dsbotdzi1zoofcys.jpg)

太棒了，上面容器荚的输出确认了动态 NFS 卷已安装且可访问。

最后删除容器荚和 PVC，查看 PV 是否自动删除。

```
$ kubectl delete -f test-pod.yml
$ kubectl delete -f demo-pvc.yml
$ kubectl get pv,pvc -n  nfs-provisioning

```

![Delete-Pod-PVC-Dynamic-NFS](/data/attachment/album/202307/28/223303b51o55ou5oxo1xwl.jpg)

这就是这篇文章的全部内容，希望对你有所帮助。请随时在下面的评论部分发表你的疑问和反馈。

*（题图：MJ/75dae36f-ff68-4c63-81e8-281e2c239356）*

---

via: <https://www.linuxtechi.com/dynamic-nfs-provisioning-kubernetes/>

作者：[Pradeep Kumar](https://www.linuxtechi.com/author/pradeep/) 选题：[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 条 Git 技巧

Summary: 跟随这个演示来了解我如何使用 Git 为 Foreman 编写文档。

跟随这个演示来了解我如何使用 Git 为 Foreman 编写文档。

![](/data/attachment/album/202307/29/082043e587yilezk45ayin.jpg)

>
> 跟随这个演示来了解我如何使用 Git 为 Foreman 编写文档。
>
>
>

作为 [ATIX](https://atix.de/en/) 的技术作家，我的任务包括为 [Foreman](https://opensource.com/article/17/8/system-management-foreman) 创建和维护存放在 [github.com/theforeman/foreman-documentation](https://github.com/theforeman/foreman-documentation) 的文档。Git 帮助我跟踪内容的版本，并与开源社区进行协作。它是我存储工作成果、共享和讨论改进的重要工具。我主要使用的工具包括浏览器、用 OpenSSH 连接 Foreman 实例、用 [Vim](https://opensource.com/resources/what-vim) 编辑源文件，以及使用 Git 进行版本控制。

本文重点介绍在开始使用 Git 和为 Foreman 文档做贡献时经常遇到的挑战。适用于中级 Git 用户。

### 先决条件

* 你已在系统上安装和配置了 Git。你至少需要设置用户名和电子邮件地址。
* 你在 [github.com](https://github.com/) 上拥有一个帐户。GitHub 本身并不是一个开源项目，但它是许多开源 Git 存储库的托管站点（包括 Foreman 的文档）。
* 你已将 [foreman-documentation](https://github.com/theforeman/foreman-documentation) 存储库复刻到你自己的账户或组织（例如，`github.com/<My_User_Account>/foreman-documentation`，这里 `<My_User_Account>` 是你的 GitHub 用户名）。有关更多信息，请参阅 Kedar Vijay Kulkarni 的 [Kedar Vijay Kulkarni 的 Git 逐步指南](https://opensource.com/article/18/1/step-step-guide-git)。
* 你已将你的 SSH 公钥添加到 GitHub。这是将你的更改推送到 GitHub 所必需的。有关更多信息，请参阅 Nicole C. Baratta 的《[GitHub 简单指引](https://opensource.com/life/15/11/short-introduction-github)》。

### 对 Foreman 文档做出贡献

Foreman 是一个开源项目，依靠社区的贡献而发展壮大。该项目欢迎所有人的参与，并且只有一些要求才能做出有意义的贡献。这些要求和惯例在 [README.md](https://github.com/theforeman/foreman-documentation/blob/master/guides/README.md#contribution-guidelines) 和 [CONTRIBUTING.md](https://github.com/theforeman/foreman-documentation/blob/master/CONTRIBUTING.md#contributing-to-foreman-documentation) 文件中有详细记录。

以下是在处理 Foreman 文档时最常见的一些任务。

#### 我想开始贡献 Foreman 文档

1、从 [github.com](http://github.com) 克隆存储库：

```
$ git clone git@github.com:theforeman/foreman-documentation.git
$ cd foreman-documentation/

```

2、重命名远程存储库：

```
$ git remote rename origin upstream

```

3、可选：确保你的本地主分支跟踪 theforeman 组织的 `foreman-documentation` 存储库的 `master` 分支：

```
$ git status

```

这将自动将你置于默认分支（本例中为 `master`）的最新提交上。

4、如果你的账户或组织中尚未有该存储库的 <ruby> 复刻 <rt>  Fork </rt></ruby>，请创建一个。前往 [github.com/theforeman/foreman-documentation](https://github.com/theforeman/foreman-documentation) 并点击 “<ruby> 复刻 <rt>  Fork </rt></ruby>” 按钮。

5、将你的复刻添加到你的存储库中：

```
$ git remote add github git@github.com:<My_User_Account>/foreman-documentation.git

```

你的本地存储库现在有两个远程存储库：`upstream` 和 `github`。

#### 我想扩展 Foreman 文档

对于简单的更改，比如修正拼写错误，你可以直接创建一个拉取请求（PR）。

1、创建一个分支，例如 `fix_spelling`。`git switch` 命令用于切换当前所在的分支，`-c` 参数用于创建分支：

```
$ git switch -c fix_spelling

```

2、进行你的更改。

3、添加你的更改并进行提交：

```
$ git add guides/common/modules/abc.adoc
$ git commit -m "Fix spelling of existing"

```

良好的 Git 提交消息的重要性无需再强调。提交消息告诉贡献者你做了哪些工作，因为它与代码库的其余部分一起保存，所以它在查看代码时起到历史注释的作用，帮助了解代码的演化过程。有关优秀的 Git 提交消息的更多信息，请参阅由 cbeams 撰写的 《[创建完美的 Git 提交信息的 7 条规则](https://cbea.ms/git-commit/#seven-rules)》。

4、可选但建议的操作：查看并验证与默认分支的差异。`foreman-documentation` 的默认分支称为 `master`，但其他项目可能有不同的命名（例如 `main`、`dev` 或 `devel`）。

```
$ git diff master

```

5、将分支推送到 GitHub。这将发布你的更改到你的代码库副本：

```
$ git push --set-upstream github fix_spelling

```

6、点击终端中 Git 提供的链接来创建一个拉取请求（PR）：

```
remote: Create a pull request for 'fix_spelling' on Github by visiting:
remote:      https://github.com/_My_User_Account_/foreman-documentation/pull/new/fix_spelling

```

7、在解释中说明社区*为什么*应该接受你的更改。对于修正拼写错误等简单 PR，这并不是必需的，但对于重大更改则很重要。

#### 我想将我的分支变基到 master

1、确保你的本地 `master` 分支跟踪的是 [github.com/theforeman/foreman-documentation](https://github.com/theforeman/foreman-documentation) 的 `master` 分支，而不是你自己命名空间下的 `foreman-documentation`：

```
$ git switch master

```

此时应该显示 `Your branch is up to date with 'upstream/master'`，其中 `upstream` 是指向 `github.com/theforeman/foreman-documentation` 的远程存储库的名称。你可以通过运行 `git remote -v` 来查看远程存储库设置情况。

2、从远程获取可能的更改。`git fetch` 命令会从远程下载被跟踪的分支，并且使用 `--all` 选项可以同时更新所有分支。在使用其他分支时这是必要的。`--prune` 选项会删除对已不存在的分支的引用。

```
$ git fetch --all --prune

```

3、将可能的更改从 `upstream/master` 拉取到你的本地 `master` 分支。`git pull` 命令将跟踪的分支上的提交复制到当前分支。这用于将你的本地 `master` 分支“更新”为远程（在本例中为 GitHub）`master` 分支的最新状态。

```
$ git pull

```

4、将你的分支 <ruby> 变基 <rt>  rebase </rt></ruby> 到 `master`。

```
$ git switch my_branch
$ git rebase -i master

```

#### 我在 master 分支上意外地提交了代码

1、创建一个分支来保存你的工作：

```
$ git switch -c my_feature

```

2、切换回 `master` 分支：

```
$ git switch master

```

3、回退 `master` 分支上的最后一次提交：

```
$ git reset --soft HEAD~1

```

4、切换回 `my_feature` 分支并继续工作：

```
$ git switch my_feature

```

#### 我想修改我的提交消息

1、如果你的分支只有一次提交，可以使用 `git amend` 来修改你的最后一次提交：

```
$ git commit --amend

```

这假设你没有将其他文件添加到暂存区（即，没有运行过 `git add My_File`，并且没有进行提交）。

2、使用 `--force` 选项将你的 “更改” 推送到 GitHub，因为 Git 提交消息是你现有提交的一部分，所以你正在更改分支上的历史记录：

```
$ git push --force

```

#### 我想重新整理单个分支上的多个更改

1、可选但强烈推荐：从 GitHub 获取更改。

```
$ git switch master
$ git fetch
$ git pull

```

这确保你将其他更改按照它们被合并到 `master` 中的顺序直接合并到你的分支中。

2、若要重新整理你的工作，请对你的分支进行变基并根据需要进行更改。对于将分支变基到 `master`，这意味着你需要更改你的分支上第一个提交的父提交：

```
$ git rebase --interactive master

```

使用你喜欢的编辑器打开变基交互界面，将第一个单词 `pick` 替换为你要修改的提交。

* 使用 `e` 来对你的提交进行实际更改。这会中断你的变基操作！
* 使用 `f` 将一个提交与其父提交合并。
* 使用 `d` 完全删除一个提交。
* 移动行以改变你更改的顺序。

成功进行变基后，你自己的提交将位于 `master` 上最后一个提交的顶部。

#### 我想从其他分支复制一个提交

1、从稳定分支（例如名为 `3.3` 的分支）获取提交的 ID，请使用 `-n` 选项限制提交数量：

```
$ git log -n 5 3.3

```

2、通过挑选提交来复制更改到你的分支。`-x` 选项将提交的 ID 添加到你的提交消息中。这仅建议在从稳定分支挑选提交时使用：

```
$ git switch My_Branch
$ git cherry-pick -x Commit_ID

```

### 更多技巧

在 ATIX，我们运行一个 [GitLab](https://about.gitlab.com/) 实例，用于内部共享代码、协作以及自动化测试和构建。对于围绕 Foreman 生态系统的开源社区，我们依赖于 GitHub。

我建议你始终将名为 `origin` 的远程指向你的*内部的*版本控制系统。这样做可以防止在纯粹凭记忆进行 `git push` 时向外部服务泄露信息。

此外，我建议使用固定的命名方案来命名远程。我总是将指向自己的 GitLab 实例的远程命名为 `origin`，将指向开源项目的远程命名为 `upstream`，将指向我在 Github 上的复刻的远程命名为 `github`。

对于 `foreman-documentation`，该存储库具有相对较平的历史记录。当处理更复杂结构时，我倾向于以非常可视化的方式思考 Git 存储库，其中节点（提交）指向线上的节点（分支），这些分支可以交织在一起。图形化工具如 `gitk` 或 [Git Cola](https://opensource.com/article/20/3/git-cola) 可以帮助可视化你的 Git 历史记录。一旦你完全掌握了 Git 的工作原理，如果你更喜欢命令行，可以使用别名。

在进行具有大量预期合并冲突的大型变基之前，我建议创建一个“备份”分支，以便你可以快速查看差异。请注意，要永久删除提交是相当困难的，因此在进行重大更改之前，请在本地 Git 存储库中进行测试。

### Git 对技术文档编写者的帮助

Git 对技术文档编写者来说是一个巨大的帮助。不仅可以使用 Git 对文档进行版本控制，还可以与他人积极地进行协作。

*（题图：MJ/1fb1dd43-e460-4e76-9ff6-b6ef76570f7e）*

---

via: <https://opensource.com/article/22/11/git-tips-technical-writers>

作者：[Maximilian Kolb](https://opensource.com/users/kolb) 选题：[lkxed](https://github.com/lkxed) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


硬核观察 #1077 科学海盗湾 Sci-Hub 创始人获 EFF 年度大奖

Summary:
? 科学海盗湾 Sci-Hub 创始人获 EFF 年度大奖
? 昨天是系统管理员日
? 美国立法禁止汽车制造商在新车中取消调幅广播
»
»

广播是严重灾害时最可靠获得外部信息的媒介，没有之一。

![](/data/attachment/album/202307/29/100150w34mfyvfmhz33mma.jpg)

![](/data/attachment/album/202307/29/100203ejjd55qkkjj8x6kl.jpg)

### 科学海盗湾 Sci-Hub 创始人获 EFF 年度大奖

电子前沿基金会（EFF）将 2023 年度大奖授予了 Sci-Hub 的创始人 Alexandra Elbakyan。Sci-Hub 是她在 2011 年还是一名大学生时创办的，为所有科学知识提供免费不受限制的访问。它在今天发展成为一个包含逾 8830 万篇论文和书籍的数据库，任何人都可以下载和阅读。EFF 称，Sci-Hub 是数百万学生和研究人员的重要资源。一些医学专家甚至认为，该网站有助于挽救生命。Sci-Hub 打破了期刊出版业的垄断机制，因而她成为了众多诉讼和政府行动的目标，但她仍然坚持其信念而不动摇。本次获奖者还有 <ruby> 图书馆自由项目 <rt>  Library Freedom Project </rt></ruby> 和 Signal 基金会。Linux 之父 Linus Torvalds 之前也获得过该奖项。

>
> **[消息来源：EFF](https://www.eff.org/press/releases/electronic-frontier-foundation-present-annual-eff-awards-alexandra-asanovna-elbakyan)**
>
>
>

>
> 老王点评：无需多说，就一个字，?
>
>
>

![](/data/attachment/album/202307/29/100217mtroshmjwmmkotzs.jpg)

### 昨天是系统管理员日

昨天（7 月 28 日）是 “<ruby> 系统管理员日 <rt>  System Administrator Appreciation Day </rt></ruby>”，其组织者表示，全世界都应该借此机会 “向那些风雨无阻地预防灾难、保护 IT 安全和扑灭技术火灾的英雄们致敬”。该活动由系统管理员 Ted Kekatos 于 1999 年创立，每年 7 月的最后一个星期五都会举行庆祝活动，以表彰和感谢这些兢兢业业，但往往不被重视的 IT 专业人员所做出的贡献。

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

>
> 老王点评：国内了解并庆祝该日子的系统管理员们非常少，连我这样一个老系统管理员都是第一次知道。国内往往会庆祝另外一个日子 —— 代表 7X24 运维的 7.24。
>
>
>

![](/data/attachment/album/202307/29/100237fhxhey8sdyc1xxu8.jpg)

### 美国立法禁止汽车制造商在新车中取消调幅广播

今年至少有七家汽车制造商在其电动汽车中 [取消](/article-15614-1.html) 了调幅广播，其中包括福特、特斯拉、宝马和大众。迫于压力，福特在今年 5 月改变了取消的做法。美国参议院商业委员会周四批准了一项立法，禁止汽车制造商在新车中取消调幅广播。立法者称，失去调幅广播会破坏向公众提供关键公共安全信息的联邦系统。

>
> **[消息来源：路透社](https://www.reuters.com/world/us/us-senate-panel-passes-am-radio-ticket-fee-pricing-bills-2023-07-27/)**
>
>
>

>
> 老王点评：虽然调幅广播是很老的技术了，但是它仍然有不可取代的优势。你有多久没有收听过调幅广播了？
>
>
>


使用开源工具来举办线上大会

Summary: 下面是使用开源工具来举办一场线上活动的方法。

妙啊

下面是使用开源工具来举办一场线上活动的方法。

![](/data/attachment/album/202307/30/073728saabpgnjtz5ankgb.jpg)

>
> 下面是使用开源工具来举办一场线上活动的方法。
>
>
>

在 2023 年 1 月举办了首届 <ruby> <a href="http://creativefreedomsummit.com/">  创意自由峰会 </a> <rt>  Creative Freedom Summit </rt></ruby> 后，[Fedora 设计团队](https://fedoraproject.org/wiki/Design) 发现使用开源工具来举办线上大会非常有效。

在本文中，我将分享一些关于这场大会的背景信息，为什么对我们来说使用开源工具来举办大会很重要，以及为实现这一目标我们的团队所使用的具体工具和配置。我还会谈谈哪些工作做的很好，在以及我们 2024 年下一届峰会中需要改进的地方。

### 创意自由峰会

创意自由峰会是 Marie Nordin 在审查了 [Fedora 用户与贡献者年度大会（Flock）](http://flocktofedora.org/) 的演讲提交后提出的一个想法。在 2022 年 8 月的 Flock 大会上，她收到了大量与开源设计和创意相关的演讲提交，远远超出我们能够接受的数量。由于存在许多关于开源设计的优秀想法，她想知道是否有机会举办一个独立的开源创意大会，专门面向在创作中使用开源工具的创意人士。

Marie 在 2022 年秋季向 Fedora 设计团队提出了这个想法，我们开始筹划这个会议，会议于 2023 年 1 月 17 日至 19 日举行。由于这是我们第一次举办这样一场新的会议，我们决定首先基于 Flock 提交的演讲和我们自己的开源创意人士网络，邀请其中一些人士担任演讲嘉宾。几乎每位我们邀请的演讲者都答应演讲，所以我们没有接受其他人的提交。明年我们需要找到更好的解决办法，所以目前我们还没有开源的投稿管理工具可供介绍。

### 在开源大会中使用开源工具

自从最初的大流行封锁以来，Fedora 的 Flock 大会一直使用 Hopin 虚拟平台在线举办，尽管 Hopin 不是开源的，但对开源工具很友好。Fedora 几年前开始使用 Hopin，它确实提供了专业的会议体验，包括内置的赞助商展位/博览厅、分会场、大厅聊天对话和管理工具。通过 Hopin 来举办创意自由峰会对我们来说可行，因为作为 Fedora 赞助的活动，我们可以使用 Fedora 的 Hopin 环境。再次强调，Hopin 不是开源的。

作为一个长期（约 20 年）的开源贡献者，我可以告诉你，做出这样的决定总是很困难的。如果你的大会专注于开源，使用专有平台来举办你的活动可能会有些奇怪。然而，随着我们社区和活动的规模和复杂性不断增长，开发一个集成的开源会议系统变得更具挑战性。

并不存在正确或错误的答案。在做出这个决定时，你必须权衡很多因素：

* 预算
* 人力资源
* 基础设施
* 技术能力
* 活动的复杂性/正式性/文化

我们没有为这次活动安排任何预算。我们有一支志愿者团队可以投入一些工作时间。我们有 Fedora Matrix 服务器作为可以加入的支持基础设施，并且有一个托管的 WordPress 系统用于网站。我和队友 Madeline Peck 在举办每周的 Fedora 设计团队的 [视频会议](https://opensource.com/article/23/3/video-templates-inkscape) 方面具有一定的技术能力和经验。我们希望这次活动是低调、单一会场和非正式的，所以对于一些小故障或瑕疵我们有一定的容忍度。我们对尝试使用开源工具组合也有很大的热情。

现在你了解了我们在做出这个决定时的一些考虑因素，这可能有助于你在为自己的活动做决策时参考。

### 一个开源会议技术栈

以下是会议技术栈的工作方式。

#### 概述

直播组件：

* **直播流**: 我们通过 PeerTube 频道将主舞台和社交活动进行实时直播。会议参与者可以从我们的 PeerTube 频道观看直播。PeerTube 提供了一些注重隐私的分析功能，可以跟踪直播观众和活动后观看次数。
* **直播舞台 + 社交活动房间**: 我们设有一个用于演讲者和主持人的直播舞台，使用 Jitsi 确保只有有权限的人可以上镜。我们额外设有一个 Jitsi 会议室，用于社交活动，允许任何希望参与社交活动的人上镜。
* **后台**: 我们有一个名为“后台”的 Matrix 频道，用于在活动期间与演讲者、主持人和志愿者协调工作。
* **公告和问答**: 我们通过共享的 Etherpad（后来转移到 [Hackmd.io](http://Hackmd.io)）来管理问答和每日议程。
* **集成和集中化的会议体验**: 使用 Matrix 的 Element 客户端，我们将直播视频和 Etherpad 嵌入到一个公共的 Matrix 频道中，供会议使用。我们根据频道中的参与人数来监控整体会议出席情况。我们在整个会议期间设有实时聊天，并从聊天和嵌入的用于问答的 Etherpad 中接受观众提问。
* **会议网站**: 我们有一个由 Ryan Gorley 设计精美的网站，托管在 WordPress 上，网站提供了基本信息和链接，包括如何参加会议、日期/时间和议程。

活动后组件：

* **活动后调查**: 我们使用开源的 LimeSurvey 系统向参会者发送了一份活动后的调查，以了解他们的参会体验。我在这篇文章中使用了该调查的一些数据。
* **活动后的视频编辑和字幕**: 我们的会议没有实时字幕系统，但在我能做到的情况下，我在频道中即时记录了演讲的笔记，与会者对此表示非常感激。活动后，我们使用了 Kdenlive（活动中演讲中展示的工具之一）来编辑视频并生成字幕。
* **活动录像**: PeerTube 会自动将直播录像发布到频道，从而使参会者可以看到他们可能错过的演讲的几乎即时录像。

接下来，我将介绍一些细节。

### 使用 PeerTube 进行直播

![创意自由峰会的 PeerTube 频道截图，显示了标志、事件描述和一组视频缩略图](/data/attachment/album/202307/30/073921ff11qfbrq1rr1rf1.jpg)

我们在创意自由峰会的直播中使用了由 [LinuxRocks.online](https://linuxrocks.online/) 慷慨提供的 [LinuxRocks PeerTube 平台](https://peertube.linuxrocks.online/c/creativefreedom/videos)。PeerTube 是一个自由开源的去中心化视频平台，也是 <ruby> 联邦宇宙 <rt>  Fediverse </rt></ruby> 的一部分。

PeerTube 最好的特点之一（我所了解的其他平台所没有的）是，在直播结束后，你会在 PeerTube 上的频道上获得一个几乎即时的重播录像。我们的聊天室用户将这视为该平台的主要优点。如果某位参与者错过了他们非常感兴趣的一个会议，他们可以在该演讲结束后的几分钟内观看到它。这不需要志愿者组织团队进行手动干预、上传或协调，PeerTube 会自动完成。

以下是使用 PeerTube 进行直播的工作方式：你在频道上创建一个新的直播流，它会给你一个直播流 URL 和一个用于授权流媒体的密钥。这个 URL 和密钥可以反复使用。我们进行配置，使得录像会在直播结束后立即发布到我们创建直播流 URL 的频道上。接下来，在开始直播时将 URL 和密钥复制/粘贴到 Jitsi 中。这意味着你不必为会议期间的每个演讲生成新的 URL 和密钥，组织者管理这些将会带来相当大的工作量。相反，我们可以重复使用相同的 URL 和密钥，将其共享在会议组织者之间的共同文档中（我们每个人都有不同的演讲托管时间段）。团队中任何具有该文档访问权限的人都可以启动直播。

#### 如何生成 PeerTube 中的直播流 URL 和密钥

以下部分逐步介绍了如何在 PeerTube 中生成直播流的 URL 和密钥。

##### 1、创建 PeerTube 上的直播视频

登录到 PeerTube，并点击右上角的 “<ruby> 发布 <rt>  Publish </rt></ruby>” 按钮：

![PeerTube 发布按钮的截图](/data/attachment/album/202307/30/073808l6cfik65cdk6kn74.png)

##### 2、设置选项

点击 “<ruby> 进行直播 <rt>  Go live </rt></ruby>” 选项卡（从左数第四个），并设置以下选项：

* <ruby> 频道 <rt>  Channel </rt></ruby>：（你希望直播发布在的频道名称）
* <ruby> 隐私 <rt>  Privacy </rt></ruby>：公开
* 单选按钮：<ruby> 普通直播 <rt>  Normal live </rt></ruby>

然后选择 “<ruby> 进行直播 <rt>  Go live </rt></ruby>” 。 （不用担心，你还不会真正开始直播，还有更多数据需要填写。）

![PeerTube 中的 Go Live 按钮的截图](/data/attachment/album/202307/30/073808eo9agzm1ccsmmfnz.png)

##### 3. 基本信息（暂时不要点击更新按钮）

首先，在 <ruby> 基本信息 <rt>  Basic info </rt></ruby> 选项卡中填写信息，然后在下一步选择 <ruby> 高级设置 <rt>  Advanced settings </rt></ruby> 选项卡。填写直播流的名称、描述、标签、类别、许可证等。在转码复选框启用后记得发布。

这样一来，一旦直播结束，录制视频将自动发布到你的频道上。

##### 4. 高级设置

你可以上传一个“待机”图像，当观看直播流 URL 并等待开始时，该图像会显示在所有人面前。

![PeerTube 高级设置的截图](/data/attachment/album/202307/30/073808vdkw4n4yukkdhd0n.png)

这是我们在创意自由峰会上使用的待机图像：

![创意自由峰会横幅的截图](/data/attachment/album/202307/30/073809fjfcxcxgjojxnanf.png)

##### 5. 在 PeerTube 上开始直播

选择右下角的 “<ruby> 更新 <rt>  Update” 按钮。直播流将显示如下，直到你从 Jitsi 开始直播： </rt></ruby>

![在 PeerTube 上开始直播的截图](/data/attachment/album/202307/30/073810rphoiixu2bzvh5pm.jpg)

##### 6. 将直播流的 URL 复制粘贴到 Jitsi

这是 PeerTube 的最后一步。一旦直播流启动，点击视频下方右侧的 “...” 图标：

![复制并粘贴 URL](/data/attachment/album/202307/30/073810v1cqqyuyuuaa3u1y.png)

选择 “<ruby> 显示直播信息 <rt>  Display live information </rt></ruby>”。你将看到如下对话框：

![显示直播信息选项的截图](/data/attachment/album/202307/30/073811gzakpi1cp1z7p311.png)

你需要复制直播的 RTMP URL 和直播流密钥。将它们合并成一个 URL，然后将其复制粘贴到 Jitsi。

以下是我测试运行时的这两个文本块示例，可供复制：

* 直播的 RTMP URL：`rtmp://peertube.linuxrocks.online:1935/live`
* 直播流密钥：`8b940f96-c46d-46aa-81a0-701de3c43c8f`

你需要将这两个文本块合并，并在它们之间加上 `/`，如下所示：

```
rtmp://peertube.linuxrocks.online:1935/live/8b940f96-c46d-46aa-81a0-701de3c43c8f

```

### Jitsi 的直播舞台 + 社交活动室

我们在我们的 “直播舞台” 上使用了自由开源的托管平台 [Jitsi Meet](https://meet.jit.si/) 视频会议平台。我们在 <https://meet.jit.si> 上创建了一个自定义 URL 的 Jitsi 会议室，并只与演讲者和会议组织者共享了该 URL。

我们配置了会议室的等候室（该功能在你加入新创建的会议室后在会议设置中可用），这样演讲者可以在他们的演讲前几分钟加入而不用担心打断前一个演讲。我们的主持人志愿者在前一个会话结束后让他们进入。另一个选项是给会议室添加密码。我们只是配置了一个等候室就行了。在测试时似乎发现，会议室中的管理状态并不是持久的。如果一个管理员离开了会议室，他们似乎会失去管理员状态和设置，比如等候室的设置。我通过让我的电脑保持打开的状态，使 Jitsi 会议室在整个会议期间可用和活动。（在这方面，你的情况可能会有所不同。）

Jitsi 提供了内置的直播选项，你可以将视频服务的 URL 发布到 Jitsi 中，它会将你的视频流式传输到该服务。我们对这种方法有信心，因为这是我们主办和直播每周举行的 [Fedora 设计团队会议](https://peertube.linuxrocks.online/c/fedora_design_live/videos) 的方式。对于创意自由峰会，我们将我们的 Jitsi 直播舞台（用于演讲者和主持人）连接到 [Linux Rocks PeerTube 上的一个频道](https://peertube.linuxrocks.online/c/creativefreedom/videos)。

Jitsi 允许演讲者共享屏幕来展示幻灯片或进行实时演示。

#### 将 Jitsi 直播到 PeerTube

1、加入会议并点击屏幕底部红色挂断按钮旁边的 “...” 图标。

![加入 Jitsi 会议](/data/attachment/album/202307/30/073811elllo3vp6dglfroo.png)

2、从弹出菜单中选择 “<ruby> 开始直播 <rt>  Start live stream </rt></ruby>”。

![在 Jitsi 中开始直播的截图](/data/attachment/album/202307/30/073811yndz2d2rr2r3r22n.png)

3、复制并粘贴 PeerTube 的 URL + 密钥文本

![复制并粘贴直播流密钥的截图](/data/attachment/album/202307/30/073811q9osovsc40cmicj9.png)

4、倾听 Jitsi 机器人朋友的声音

几秒钟后，会出现一个女性声音告诉你，“Live streaming is on.”（直播已开启）。一旦听到这个声音，微笑吧！你正在进行直播。

5、停止直播

这将停止你设置的 PeerTube URL 的工作，所以重复这些步骤可以重新启动直播。

#### Jitsi 技巧

##### 通过开关 Jitsi 的流来管理录制

我们在会议中认识到，在演讲之间关闭 Jitsi 的直播流会更好，这样你将在 PeerTube 上针对每个演讲发布一个原始录制文件。第一天我们让它一直运行，因此一些录制中包含了多个演讲的视频，这使得那些试图赶上进度的人使用即时回放功能更困难。他们需要在视频中寻找他们想观看的演讲，或者等待我们在几天或几周后发布编辑过的版本。

#### 避免音频回音

我们在活动期间实时发现的另一个问题是音频回音。这在我们的测试中并没有出现，这完全是我的错（对所有参加的人道歉）。我负责设置 Jitsi/PeerTube 的链接、监控流和协助主持活动。尽管我知道一旦直播开始，我需要关闭所有已打开的 PeerTube 浏览器标签，但我可能打开了比我想象中更多的 PeerTube 标签，或者直播会在我可用于监控聊天的 Element 客户端中自动开始播放。我没有很方便地静音 Element 的方法。在我进行的一些演讲者介绍中，你会注意到我知道在音频回音开始之前大约有 30 秒的时间，因此我做的介绍非常匆忙/急促。

我认为有更简单的方法来避免这种情况：

* 尽量确保主持人/活动主持人不是负责设置/监控流和聊天的同一个人。（根据你每次拥有多少义工人员的情况，这并不总是可能的。）
* 如果可能，使用一台电脑监控流，另一台电脑担任主持人角色。这样，你在用于监控的电脑上只需按一下静音按钮，简化了你在另一个电脑上的主持体验。

这是一件值得提前练习和完善的事情。

### 后台：Element

![以下是 Element 中显示的三个聊天室列表的截图：Creative Freedom Summit（白色徽标）、Creative Freedom Summit Backstage（黑色徽标）和 Creative Freedom Summit Hosts（橙色徽标）](/data/attachment/album/202307/30/074013isn56yxkxe06ey6i.jpg)

我们在会议开始前大约一周设置了一个 “后台” 邀请制聊天室，并邀请了所有的演讲者加入。这有助于确保以下几点：

* 我们的演讲者在活动开始之前就加入了 Element/Matrix，并有机会在注册遇到任何问题时都可以获得帮助（实际上没有人遇到问题）。
* 在活动开始之前，我们与所有演讲者建立了一个实时的交流渠道，以便我们能够轻松地发送公告和更新。

在活动期间，这个聊天室成为一个有用的地方，用于协调演讲者之间的过渡，提醒日程是否延迟，以及在一个情况下，当我们的演讲者出现紧急情况无法按原定时间发言时，迅速重新安排演讲时间。

我们还为主持人设置了一个房间，但在我们的情况下，它是多余的。我们只是使用后台频道进行协调。我们发现两个频道很容易监控，但三个频道对于方便起见有点太多了。

### 公告和问答：Etherpad/Hackmd.io

![这是一个名为 “General information” 的 Etherpad 的截图，其中包含有关创意自由峰会的一些信息](/data/attachment/album/202307/30/074024vjbn3uj3f232j7tv.jpg)

我们在 Element 主频道中设置了一个固定的小部件，提供有关活动的一般信息，包括每日日程安排、行为准则等。我们还为每个演讲设置了一个问答部分，让与会者可以在其中提出问题，主持人会为演讲者朗读这些问题。

在开始的一两天中，我们发现一些与会者在加载 Etherpad 小部件时遇到问题，因此我们改为在频道中固定一个内嵌的 [hackmd.io](http://hackmd.io) 文档作为小部件，那似乎效果更好一些。我们并不 100% 确定小部件加载问题的具体原因，但我们可以在频道主题中发布一个原始（非内嵌）链接，这样参与者就可以绕过通过小部件访问时可能遇到的任何问题。

### 综合和集中的会议体验

![在左上角是一个视频直播，右上角是一个 hackmd.io 的公告页面，下方是一个活跃的聊天窗口](/data/attachment/album/202307/30/074036eyquffwaqmfmi1q1.jpg)

通过 Fedora 的 Element 服务器使用 Matrix 是参加会议的关键地方。Element 中的 Matrix 聊天室具有小部件系统，可以将网站嵌入到聊天室中，成为体验的一部分。这个功能对于将我们的 Matrix 聊天室作为集中参会的地方非常重要。

我们将 PeerTube 的直播嵌入到了聊天频道中，在上面的截图中左上角可以看到。会议结束后，我们可以分享未编辑的视频回放的播放列表。现在，我们志愿者项目编辑视频的工作已经完成，该频道中有按顺序排列的编辑演讲的播放列表。

如前一节所讨论的，我们在右上角嵌入了一个 [hackmd.io](http://hackmd.io) 笔记，用于发布当天的日程安排、公告以及一个用于问答的区域。我本来想设置一个 Matrix 机器人来处理问答，但我在运行时遇到了一些困难。不过，这可能是明年一个很酷的项目。

在会议期间，与会者直接在主要聊天窗口下方进行交流，同时与小部件进行互动。

在将 Matrix/Element 聊天室作为在线会议的中心地点时，有几个要考虑的因素，例如：

* 在 Element 桌面客户端或桌面系统的 Web 浏览器上会有最佳体验。但是，你也可以在 Element 移动客户端中查看小部件（尽管一些参与者在发现此功能时遇到了困难，其用户界面不太明显）。其他 Matrix 客户端可能无法查看小部件。
* 如果需要，与会者可以根据自己的喜好自行组合体验。那些不使用 Element 客户端参加会议的用户报告称加入聊天并直接查看 PeerTube 直播 URL 没有问题。我们在频道主题中分享了直播 URL 和 hackmd URL，以便那些不想使用 Element 的用户也可以访问。

### 网站

[Ryan Gorley](https://mastodon.social/@ryangorley) 使用 [WordPress](https://wordpress.com/) 开发了 [创意自由峰会网站](https://creativefreedomsummit.com/)。该网站由 WPengine 托管，是一个单页网站，其中嵌入了来自 [sched.org](http://sched.org) 的会议日程安排。在网站顶部，有一个标题为 “Create. Learn. Connect.” 的屏幕截图，背景是蓝色和紫色的渐变效果。

### 后续活动

#### 后续调查

我们使用开源调查工具 LimeSurvey。在会议结束后的一两周内，我们通过 Element 聊天频道和 PeerTube 视频频道向与会者发送了调查，以了解他们对我们活动的看法。活动组织者们继续定期开会。在这些会议的其中一个议题是共同撰写 [hackmd.io](http://hackmd.io) 文档，以制定调查问题。以下是我们从活动中学到的一些对你计划自己的开源线上会议可能有兴趣的事项：

* 绝大多数与会者（共 70% 的受访者）是通过 Mastodon 和 Twitter 得知本次活动的。
* 33% 的与会者使用 Element 桌面应用程序参加会议，30% 使用 Element 聊天 Web 应用程序。因此，大约有 63% 的与会者使用了集成的 Matrix/Element 体验。其他与会者直接在 PeerTube 上观看或在会后观看了回放。
* 35% 的与会者表示他们通过聊天与其他创意人建立了联系，因此如果你的目标是促进人际交流和连接，聊天体验对于活动来说非常重要。

#### 字幕

在活动期间，我们收到了与会者的积极反馈，他们对其他与会者在聊天中实时添加的演讲字幕表示赞赏，并希望能够提供实时字幕以提升可访问性。虽然本文未提及实时字幕的相关软件，但有一些开源解决方案可供选择。其中一个工具是 Live Captions，在 Seth Kenlon 撰写的一篇文章《[在 Linux 上的开源视频字幕](https://opensource.com/article/23/2/live-captions-linux)》中进行了介绍。虽然这个工具主要用于本地观看视频内容的与会者，但我们有可能让会议主持人在 Jitsi 中运行它并与直播共享。其中一种方法是使用开源广播工具 [OBS](https://obsproject.com/)，这样每个观看直播的人都能受益于字幕功能。

在会后编辑视频时，我们发现了内置于我们首选的开源视频编辑软件 [Kdenlive](https://kdenlive.org/) 中的一项功能，它能够自动生成字幕并自动放置到视频中。在 [Kdenlive 手册](https://docs.kdenlive.org/en/effects_and_compositions/speech_to_text.html) 中有关于如何使用这个功能的基本说明。Fedora 设计团队成员 Kyle Conway 在协助会后视频编辑时，制作了一份 [详细教程（包括视频指导）：如何在 Kdenlive 中自动生成并添加字幕](https://gitlab.com/groups/fedora/design/-/epics/23#video-captioning-and-handoff)。如果你对这个功能感兴趣，阅读和观看这个教程会非常有帮助。

#### 视频编辑志愿者工作

活动结束后，我们在会议的 Element 频道中召集了一组志愿者，共同进行视频编辑工作，包括添加标题卡、片头/片尾音乐以及进行整体清理。我们自动生成的一些重播录像可能会分为两个文件，或者与其他多个演讲合并在一个文件中，因此需要重新组装或裁剪。

我们使用 [GitLab Epic](https://gitlab.com/groups/fedora/design/-/epics/23) 来组织这项工作，其中包含常见问题和寻找按技能组织的志愿者的帮助，每个视频工作都附加有相应的议题。我们为每个视频设置了一系列自定义标签，以明确该视频的状态以及需要何种帮助。所有视频的编辑工作都已完成，其中一些视频需要为其在 [创意自由峰会频道](https://peertube.linuxrocks.online/c/creativefreedom/videos) 上的描述区域撰写内容。许多视频都有自动生成的字幕，但字幕中可能存在拼写错误和其他常见的自动生成文本错误，还需要进行编辑修正。

![GitLab 上需要编辑帮助的视频清单的截图](/data/attachment/album/202307/30/074049dl4o7vva4nyvju9l.jpg)

我们通过让志愿者从创意自由峰会的 PeerTube 主频道的未编辑录像中下载原始视频来传递这些视频文件（由于文件大小可能相当大）。当志愿者准备好分享编辑好的视频时，我们有一个私人的 PeerTube 账户，他们可以将视频上传到该账户。具有主频道账户访问权限的管理员会定期从私人账户中获取视频，并将其上传到主账户中。请注意，PeerTube 并没有一个多个账户访问同一频道的系统，因此我们不得不进行密码共享，这可能有些令人紧张。我们认为这是一个合理的妥协，可以限制掌握主要密码的人数，同时仍然可以让志愿者提交编辑好的视频而不会太过麻烦。

### 准备尝试一下吗？

我希望这个对于我们如何使用开源工具集来举办创意自由峰会的全面描述能够激发你尝试在你的开源活动中使用这些方法。让我们知道进展如何，并随时联系我们如果你有问题或改进建议！我们的频道链接为：<https://matrix.to/#/#creativefreedom:fedora.im>

*（题图：MJ/cb6a4ea4-95ed-40cb-9e78-85f8676219f2）*

---

via: <https://opensource.com/article/23/4/open-source-tools-virtual-conference>

作者：[Máirín Duffy](https://opensource.com/users/mairin) 选题：[lkxed](https://github.com/lkxed/) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


Bash 基础知识系列 #6：处理字符串操作

bash中若能如fish那样内建string命令就太强大了。

112-123-1234 这个替换所有正确答案应该是什么呀？

$ telnumber=112-123-1234 # 为字符串变量赋值

$ echo ${telnumber//-} # 删除字符串中所有的 "-"

1121231234

不能理解你说的

老王有两条狗，问-老李有几只猫

谢谢大神

![](/data/attachment/album/202307/30/090030gvm6pgutlvzll4zg.jpg)

在大多数编程语言中，你都会找到字符串数据类型。字符串基本上是一组字符。

但 Bash Shell 有所不同。字符串没有单独的数据类型。这里一切都是变量。

但这并不意味着你不能像在 C 和其他编程语言中那样处理字符串。

在 Bash Shell 中可以查找子字符串、替换子字符串、连接字符串以及更多字符串操作。

在 Bash 基础知识系列的这一部分中，你将学习基本的字符串操作。

### 在 Bash 中获取字符串长度

让我们从最简单的选项开始。也就是获取字符串的长度。这很简单：

```
${#string}

```

让我们在示例中使用它。

![Example of getting string length in bash](/data/attachment/album/202307/30/090053lzt0jo8arresae6y.png)

正如你所看到的，第二个示例中有两个单词，但由于它用引号引起来，因此它被视为单个单词。连空格都算作一个字符。

### 在 Bash 中连接字符串

用技术术语来说是字符串 <ruby> 连接 <rt>  concatenation </rt></ruby>，这是 Bash 中最简单的字符串操作之一。

你只需像这样一个接一个地使用字符串变量：

```
str3=$str1$str2

```

还能比这更简单吗？我觉得不能。

让我们看一个例子。这是我的示例脚本，名为 `join.sh`：

```
#!/bin/bash

read -p "Enter first string: " str1
read -p "Enter second string: " str2

joined=$str1$str2

echo "The joined string is: $joined"

```

以下是该脚本的运行示例：

![Join two strings in bash](/data/attachment/album/202307/30/090053g3zoruhrh7w7r22o.png)

### 在 Bash 中提取子字符串

假设你有一个包含多个字符的大字符串，并且你想要提取其中的一部分。

要提取子字符串，需要指定主字符串、子字符串的起始位置和子字符串的长度，如下所示：

```
${string:$pos:$len}

```

>
> ? 和数组一样，字符串中的定位也是从 0 开始。
>
>
>

这是一个例子：

![Extracting substring in bash](/data/attachment/album/202307/30/090054rtxev2i5aezeo3yx.png)

即使你指定的子字符串长度大于字符串长度，它也只会到达字符串末尾。

### 替换 Bash 中的子字符串

假设你有一个大字符串，并且你想用另一个字符串替换其中的一部分。

在这种情况下，你可以使用这种语法：

```
${string/substr1/substr2}

```

>
> ✋ 只有第一次出现的子字符串才会以这种方式替换。如果要替换所有出现的地方，请使用 `${string//substr1/substr2}`
>
>
>

这是一个例子：

![Replace substring in bash](/data/attachment/album/202307/30/090054caii0ib0dladsuaw.png)

正如你在上面看到的，“good” 一词被替换为 “best”。我将替换的字符串保存到同一字符串中以更改原始字符串。

>
> ? 如果未找到子字符串，则不会替换任何内容。它不会导致错误。
>
>
>

### 在 Bash 中删除子字符串

我们来谈谈删除子字符串。假设你要删除字符串的一部分。在这种情况下，只需将子字符串提供给主字符串，如下所示：

```
${string/substring}

```

>
> ✋ 通过这种方式，仅删除第一次出现的子字符串。如果要删除所有出现的内容，请使用 `${string//substr}`
>
>
>

如果找到子字符串，则将从字符串中删除它。

让我们通过一个例子来看看。

![Delete substring in bash](/data/attachment/album/202307/30/090054vz4lpr501pycccta.png)

不用说，如果没有找到子字符串，则不会删除它。它不会导致错误。

### ? 练习时间

现在是你通过简单练习来实践字符串操作的时候了。

**练习 1**：声明一个字符串 “I am all wet”。现在通过用 “set” 替换单词 “wet” 来更改此字符串。

**练习 2**：创建一个字符串，以 `112-123-1234` 格式保存电话号码。现在，你必须删除所有 `-`。

这应该会给你一些在 Bash 中使用字符串的不错的练习。在下一章中，你将学习如何在 Bash 中使用 `if-else` 语句。敬请关注。

*（题图：MJ/aa73b2c9-6d2f-42e2-972d-94fab56d30cc）*

---

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

作者：[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/) 荣誉推出


硬核观察 #1078 FSF 指谷歌在 WEI 上的做法是“邪恶先锋”

Summary:
? FSF 指谷歌在 WEI 上的做法是“邪恶先锋”
? AlmaLinux 向红帽示好，被拒绝了
? Python 接受可选全局解释器锁提案
»
»

谁能 1:1 克隆印度Linux？

印度Linux?求科普

Firefox, yes!<br />
Chrome, no!

![](/data/attachment/album/202307/30/164231hc2zl7zdsdshz8cx.jpg)

![](/data/attachment/album/202307/30/164242leupg0l60f30pfhf.jpg)

### FSF 指谷歌在 WEI 上的做法是“邪恶先锋”

自由软件基金会（FSF）的 Greg Farough 批评谷歌提出的网络环境完整性（WEI）是对自由互联网的全面攻击。称该政策文件所强调的使用案例与其真正的使用案例相比，简直是小巫见大巫，因为其真正的使用案例是制定一种方法来完全彻底地限制互联网的自由。借助 WEI，政府将可以利用它来确保只有其官方 “批准”（读作：后门）的浏览器才能访问互联网；Netflix 等公司将利用它来推进数字限制管理（DRM）；谷歌将利用它来拒绝用户访问其服务，除非用户使用的浏览器符合其利润率。最初 WEI 还只是发布在 GitHub 上的一份无伤大雅的 [政策文件](/article-16032-1.html)，但谷歌现在已将其快速发展到 [Chromium](/article-16042-1.html) 浏览器中，WEI 将很快就会出现在我们面前。他说，“曾经有段时间谷歌的理念是‘不作恶’，它如此短时间内就在 WEI 上取得进展，我们可以非常肯定地说，他们现在的政策是要成为邪恶先锋。”

>
> **[消息来源：FSF](https://www.fsf.org/blogs/community/web-environment-integrity-is-an-all-out-attack-on-the-free-internet)**
>
>
>

>
> 老王点评：很多人没太理解 WEI 的危害，而这篇文章清晰的分析了其潜在的危害。但是，这种程度的社区抗议恐怕无济于事。谷歌比较忌惮的是其它企业和政府对它的反对。除了支持 Firefox 这类自由的浏览器之外，我们还可以寄希望于在其它的 Chromium 下游版本中去除 WEI。
>
>
>

![](/data/attachment/album/202307/30/164254z6rwr2w6oo6sttrt.jpg)

### AlmaLinux 向红帽示好，被拒绝了

红帽关闭 CentOS，推行 CentOS Stream 成为 RHEL 上游，其中一个理由是希望社区来参与 CentOS Stream/RHEL 的开发，并指责 AlmaLinux 等 RHEL 克隆品只是简单的重建，而没有做出任何贡献。而 AlamLinux 一方面表示将不再寻求 1:1 克隆，将在 RHEL 之外合并补丁，另外一方面“也尝试在 CentOS Stream 中测试和复制问题”，以示好红帽。最近，AlmaLinux 提交了一个 Iperf3 的 CVE 修复到 CentOS Stream。但红帽公司的一位高级软件工程师回复说：“感谢您的贡献。目前，我们不打算在 RHEL 中解决这个问题，不过我们会根据客户需求继续评估。”AlamLinux 不理解“只需合并即可，为什么还要拒绝修复呢？”之前曾经称 AlmaLinux 等“只是简单地重建代码”的红帽公司核心平台（又名 RHEL）副总裁 Mike McGrath 对 AlmaLinux 表示了感谢，但拒绝了这些代码。事后，McGrath 承认错失了对 AlmaLinux 表达善意的机会，并提升了该 CVE 的等级，合并了这些代码。

>
> **[消息来源：ZDNet](https://www.zdnet.com/article/almalinux-discovers-working-with-red-hat-isnt-easy/)**
>
>
>

>
> 老王点评：只是说说而已，谁让你真提交代码了，没事就给添乱，你知道你提交了代码，红帽要做作多少回归测试吗。
>
>
>

![](/data/attachment/album/202307/30/164311qzwooz74yr424xpo.jpg)

### Python 接受可选全局解释器锁提案

Python 指导委员会宣布，它计划接受 PEP 703，让全局解释器锁成为可选，即 No-GIL 模式。预计将在 Python 3.13 初步支持该模式。CPython 的全局解释器锁（GIL）阻止了同时多线程执行代码，成为了在多核 CPU 上提高 Python 代码运行效率的一大障碍。Meta 公司承诺为 PEP 703 提案提供 [人力支持](/article-15986-1.html)。Python 指导委员会强调了兼容性的重要性，要避免出现类似 Python 3 的情况，称它不是 Python 4。

>
> **[消息来源：Python 基金会](https://discuss.python.org/t/a-steering-council-notice-about-pep-703-making-the-global-interpreter-lock-optional-in-cpython/30474)**
>
>
>

>
> 老王点评：不是 Python 4，胜似 Python 4，这一改进对将 Python 应用到重要领域很有意义。
>
>
>


探索 Shell 脚本的威力

Summary: 本文章向你介绍了 Shell 脚本的基础知识以及其在日常生活中的重要性。

shebang “释伴” ?

?

本文章向你介绍了 Shell 脚本的基础知识以及其在日常生活中的重要性。

![](/data/attachment/album/202307/31/070953kv0kdvld33h55uk5.jpg)

>
> 本文章向你介绍了 Shell 脚本的基础知识以及其在日常生活中的重要性。
>
>
>

当我们登录到一个 UNIX/Linux 系统时，我们首先注意到的是闪烁的光标和 `$` 符号之间的空格。这就是 Shell（交互界面）。多年来，它一直是一种无处不在（有时甚至是唯一的）与计算机交互的界面。在图形用户界面（GUI）出现和流行之前，终端和 Shell 是唯一的机制，可以让计算机按照我们的意图进行操作。乍一看，我们可能会想知道 Shell 的作用，除了将命令传递给底层操作系统以进行执行之外。我们中的大多数人熟悉像 `ls`（用于列出目录内容），`cd`（用于更改当前目录）等命令。通过 Shell，我们可以执行这些命令。Shell 理解我们输入的文本 - 将其转换为标记 - 然后在操作系统上执行这些标记。

### 不同的 Shell 变种

最初，终端使用了朴素的 Bourne Shell（即 Sh）。多年来，许多不同的 Shell 变种被开发出来和使用。其中一些流行的包括 C Shell（Csh） 和 Korn Shell（Ksh）。Sh 在一段时间内不再受欢迎，但通过其最新的化身 —— Bourne Again Shell（Bash），它再次流行起来。

### Shell 实际上是做什么的？

Shell 是操作系统（OS）和用户之间的直接接口。通过使用命令和应用程序来使用计算机上安装的工具，我们可以使计算机按照我们的意愿工作。一些命令是安装在操作系统上的应用程序，而某些命令则是直接内置在 Shell 中的。在 Bash 中内置的一些命令包括 `clear`、`cd`、`eval` 和 `exec`，还有 `ls` 和 `mkdir` 这样的应用程序。内置在 Shell 中的命令因 Shell 而异。

在本文中，我们将涵盖与 Bash 相关的几个方面。

### 更多关于 Shell 的内容

我们中的大多数人都用过像 `ls`、`cd` 和 `mkdir` 这样的命令。当我们在一个目录上运行 `ls -l` 命令时，该目录中的所有子目录和文件都会在屏幕上列出。如果数量很大，屏幕会滚动。如果终端不支持滚动条（在很多年里都是如此），则无法查看已滚动过的条目。为了克服这个问题，我们使用像 `more` 和 `less` 这样的命令。它们允许我们逐页查看输出。通常使用的命令是：

```
ls -l | less

```

在这里 Shell 是在做什么？看起来像是单个命令，实际上是 `ls` 和 `less` 两个命令依次执行。管道符（`|`）将这两个程序连接起来，但连接由 Shell 管理。由于有了管道符，Shell 连接了这两个程序——它将 `ls` 命令的标准输出连接到 `less` 的标准输入（stdin）。管道功能使我们能够将任何程序的输出作为另一个程序的输入提供，而无需对程序进行任何更改。这是许多 UNIX/Linux 应用程序的理念——保持应用程序简单，然后将许多应用程序组合在一起以实现最终结果，而不是让一个程序做很多事情。

如果需要，我们可以将 `ls` 的输出重定向到文件中，然后使用 `vi` 查看它。为此，我们使用以下命令：

```
ls -l > /tmp/my_file.txt
vi /tmp/my_file.txt

```

在这种情况下，`ls` 的输出被重定向到一个文件中。这由 Shell 进行管理，它理解 `>` 符号表示重定向。它将其后面的标记视为文件。

### 使用 Shell 自动化

结合命令的能力是使用 Shell 命令创建自动化脚本的关键要素之一。在我最近的项目中，我们使用集群模式执行 Python/Spark（PySpark）应用程序。每个应用程序执行了许多结构化查询语言（SQL）语句 - SparkSQL。为了跟踪应用程序的进展，我们会打印有关正在执行的 SQL 的详细信息。这样可以让我们保留应用程序中正在发生的情况的日志。由于应用程序在集群模式下执行，要查看日志，我们必须使用以下 `yarn` 命令：

```
yarn log –applicationId [application_id]

```

在大多数情况下，应用程序生成的日志非常大。因此，我们通常将日志导入到 `less` 中，或将其重定向到一个文件中。我们使用的命令是：

```
yarn log –aplicationId [application_id] | less

```

我们的开发团队有 40 人。每个人都必须记住这个命令。为了简化操作，我将这个命令转换成了一个 Bash 脚本。为此，我创建了一个以 `.sh` 为扩展名的文件。在 UNIX 和 Linux 系统上，文件扩展名并不重要。只要文件是可执行的，它就能工作。扩展名在 MS Windows 上有意义。

### 需要记住的重要事项

Shell 是一个解释器。这意味着它会逐行读取程序并执行它。这种方法的限制在于错误（如果有）在事先无法被识别。直到解释器读取和执行它们时，错误才会被识别出来。简而言之，假如我们有一个在前 20 行完美执行，但在第 21 行由于语法错误而失败的 Shell 程序。当脚本在第 21 行失败时，Shell 不会回滚/撤销之前的步骤。当发生这样的情况时，我们必须纠正脚本并从第一行开始执行。因此，例如，如果在遇到错误之前删除了几个文件，脚本的执行将停止，而文件将永远消失。

我创建的脚本是：

```
#!/bin/bash
yarn log –applicationId 123 | less

```

…其中 123 是应用程序的 ID。

第一行的前两个字符是特殊字符（“释伴”）。它们告诉脚本这是一个可执行文件，并且该行包含要用于执行的程序的名称。脚本的其余行传递给所提到的程序。在这个例子中，我们将执行 Bash。即使包含了第一行，我们仍然必须使用以下命令对文件应用执行权限：

```
chmod +x my_file.sh

```

在给文件设置了执行权限之后，我们可以如下执行它：

```
./my_file.sh

```

如果我们没有给文件设置执行权限，我们可以使用以下命令执行该脚本：

```
sh ./my_file.sh

```

### 传递参数

你很快就会意识到，这样的脚本很方便，但立即变得无用。每次执行 Python/Spark 应用程序时，都会生成一个新的 ID。因此，对于每次运行，我们都必须编辑文件并添加新的应用程序 ID。这无疑降低了脚本的可用性。为了提高其可用性，我们应该将应用程序 ID 作为参数传递：

```
#!/bin/bash
yarn –log -applicationId ${1} | less

```

我们需要这样执行脚本：

```
./show_log.sh 123

```

脚本将执行 `yarn` 命令，获取应用程序的日志并允许我们查看它。

如果我们想将输出重定向到一个文件中怎么办？没问题。我们可以将输出重定向到一个文件而不是发送给 `less`：

```
#!/bin/bash
ls –l ${1} > ${2}
view ${2}

```

要运行脚本，我们需要提供两个参数，命令变为：

```
./my_file.sh /tmp /tmp/listing.txt

```

当执行时，`$1` 将绑定到 `/tmp`，`$2` 将绑定到 `/tmp/listing.txt`。对于 Shell，参数从一到九命名。这并不意味着我们不能将超过九个参数传递给脚本。我们可以，但这是另一篇文章的主题。你会注意到，我将参数命名为 `${1}` 和 `${2}`，而不是 `$1` 和 `$2`。将参数名称封闭在花括号中是一个好习惯，因为它使我们能够无歧义地将参数作为较长变量的一部分组合起来。例如，我们可以要求用户将文件名作为参数，并使用它来形成一个更大的文件名。例如，我们可以将 `$1` 作为参数，创建一个新的文件名为 `${1}_student_names.txt`。

### 使脚本更健壮

如果用户忘记提供参数怎么办？Shell 允许我们检查这种情况。我们将脚本修改如下：

```
#!/bin/bash
if [ -z "${2}" ]; then
  echo "file name not provided"
  exit 1
fi
if [ -z "${1}" ]; then
  echo "directory name not provided"
  exit 1
fi
DIR_NAME=${1}
FILE_NAME=${2}
ls -l ${DIR_NAME} > /tmp/${FILE_NAME}
view /tmp/${FILE_NAME}

```

在这个程序中，我们检查是否传递了正确的参数。如果未传递参数，我们将退出脚本。你会注意到，我以相反的顺序检查参数。如果我们在检查第一个参数存在之前检查第二个参数的存在，如果只传递了一个参数，脚本将进行到下一步。虽然可以按递增顺序检查参数的存在，但我最近意识到，从九到一检查会更好，因为我们可以提供适当的错误消息。你还会注意到，参数已分配给变量。参数一到九是位置参数。将位置参数分配给具名参数可以在出现问题时更容易调试脚本。

### 自动化备份

我自动化的另一个任务是备份。在开发的初期阶段，我们没有使用版本控制系统。但我们需要有一个机制来定期备份。因此，最好的方法是编写一个 Shell 脚本，在执行时将所有代码文件复制到一个单独的目录中，将它们压缩，并使用日期和时间作为后缀来上传到 HDFS。我知道，这种方法不如使用版本控制系统那样清晰，因为我们存储了完整的文件，查找差异仍然需要使用像 `diff` 这样的程序；但它总比没有好。尽管我们最终没有删除代码文件，但团队确实删除了存储助手脚本的 `bin` 目录！！！而且对于这个目录，我没有备份。我别无选择，只能重新创建所有的脚本。

一旦建立了源代码控制系统，我很容易将备份脚本扩展到除了之前上传到 HDFS 的方法之外，还可以将文件上传到版本控制系统。

### 总结

如今，像 Python、Spark、Scala 和 Java 这样的编程语言很受欢迎，因为它们用于开发与人工智能和机器学习相关的应用程序。尽管与 Shell 相比，这些语言更强大，但“不起眼”的 Shell 提供了一个即用即得的平台，让我们能够创建辅助脚本来简化我们的日常任务。Shell 是相当强大的，尤其是因为我们可以结合操作系统上安装的所有应用程序的功能。正如我在我的项目中发现的那样，即使经过了几十年，Shell 脚本仍然非常强大。我希望我已经说服你尝试一下了。

### 最后一个例子

Shell 脚本确实非常方便。考虑以下命令：

```
spark3-submit --queue pyspark --conf "spark.yarn.principal=abcd@abcd.com" --conf "spark.yarn.keytab=/keytabs/abcd.keytab" --jars /opt/custom_jars/abcd_1.jar --deploy-mode cluster --master yarn $*

```

我们要求在执行 Python/Spark 应用程序时使用此命令。现在想象一下，这个命令必须每天被一个由 40 个人组成的团队多次使用。大多数人会在记事本中复制这个命令，每次需要使用时，会将其从记事本中复制并粘贴到终端中。如果复制粘贴过程中出现错误怎么办？如果有人错误使用了参数怎么办？我们如何调试使用的是哪个命令？查看历史记录并没有太多帮助。

为了让团队能够简单地执行 Python/Spark 应用程序，我们可以创建一个 Bash Shell 脚本，如下所示：

```
#!/bin/bash
SERVICE_PRINCIPAL=abcd@abcd.com
KEYTAB_PATH=/keytabs/abcd.keytab
MY_JARS=/opt/custom_jars/abcd_1.jar
MAX_RETRIES=128
QUEUE=pyspark
MASTER=yarn
MODE=cluster

spark3-submit --queue ${QUEUE} --conf "spark.yarn.principal=${SERVICE_PRINCIPAL}" --conf "spark.yarn.keytab=${KEYTAB_PATH}" --jars ${MY_JARS} --deploy-mode ${MODE} --master ${MASTER} $*

```

这展示了一个 Shell 脚本的强大之处，让我们的生活变得简单。根据你的需求，你可以尝试更多的命令和脚本，并进一步探索。

*（题图：MJ/f32880e8-0cdc-4897-8a1c-242c131111bf）*

---

via: <https://www.opensourceforu.com/2022/05/shell-scripting-is-still-going-strong/>

作者：[Bipin Patwardhan](https://www.opensourceforu.com/author/bipin-patwardhan/) 选题：[lkxed](https://github.com/lkxed) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


Fedora Linux 的家族（一）：官方版本

Summary: 本文将对 Fedora Linux 官方版本进行更详细的介绍。

本文将对 Fedora Linux 官方版本进行更详细的介绍。

![](/data/attachment/album/202307/31/091317uqdzd48u2nuqdt26.jpg)

Fedora Linux 提供了多个变体以满足你的需求。你可以在我之前的文章《[Fedora Linux 的各种版本](/article-15003-1.html)》中找到所有 Fedora Linux 变体的概述。本文将对 Fedora Linux 官方版本进行更详细的介绍。共有五个 <ruby> 版本 <rt>  Edition </rt></ruby>： Fedora Workstation、Fedora Server、Fedora IoT、Fedora CoreOS 和 Fedora Silverblue。Fedora Linux 下载页面目前显示其中三个为 *官方* 版本，另外两个为 *新兴* 版本。本文将涵盖所有五个版本。

### Fedora Workstation

如果你是笔记本电脑或台式计算机用户，则 Fedora Workstation 是适合你的操作系统。Fedora Workstation 非常易于使用。你可以用它满足日常工作、教育、爱好等需求。例如，你可以使用它创建文档，制作演示文稿，上网冲浪，处理图像，编辑视频等等。

这个 Fedora Linux 版本默认使用 GNOME 桌面环境。你可以使用这种环境舒适地工作和进行各种活动。你还可以根据个人喜好自定义 Fedora Workstation 的外观，让你在使用过程中更加舒适。如果你是 Fedora Workstation 的新用户，你可以阅读我之前的文章 [在安装 Fedora Workstation 之后要做的事](https://fedoramagazine.org/things-to-do-after-installing-fedora-34-workstation/)。通过该文章，你将更容易上手 Fedora Workstation。

更多信息请参阅以下链接：

>
> **[Fedora Workstation](https://getfedora.org/en/workstation/)**
>
>
>

### Fedora Server

许多公司需要自己的服务器来支持基础设施。Fedora Server 版操作系统配备了一个强大的基于 Web 的管理界面称为 Cockpit，具有现代化的外观。Cockpit 可以让你轻松查看和监控系统性能和状态。

Fedora Server 包含一些开源世界中的最新技术，并得到一个活跃的社区的支持。它非常稳定可靠。然而，并不保证 Fedora 社区中的任何人都能够在你遇到问题时提供帮助。如果你运行的是关键任务的应用程序，并且可能需要技术支持，你可能要考虑使用 [Red Hat Enterprise Linux](https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux)。

更多信息请访问以下链接：

>
> **[Fedora Server](https://getfedora.org/en/server/)**
>
>
>

### Fedora IoT

为物联网设备专门设计的操作系统越来越受欢迎。Fedora IoT 就是为了应对这一需求而创建的操作系统。Fedora IoT 是一个不可变操作系统，使用 OSTree 技术来进行原子更新。该操作系统专注于物联网设备的安全性，这非常重要。Fedora IoT 支持多种架构。它还配备了一个基于 Web 的配置控制台，因此可以在不需要键盘、鼠标或监视器物理连接到设备的情况下进行远程配置。

更多信息请访问以下链接：

>
> **[Fedora IoT](https://getfedora.org/en/iot/)**
>
>
>

### Fedora CoreOS

Fedora CoreOS 是一个面向容器的操作系统。该操作系统用于在任何环境中安全可靠地运行应用程序。它设计用于集群，但也可以作为独立系统运行。该操作系统与 Linux 容器配置具有高度兼容性。

更多信息请访问以下链接：

>
> **[Fedora CoreOS](https://getfedora.org/en/coreos?stream=stable)**
>
>
>

### Fedora Silverblue

这个版本是 Fedora Workstation 的一个变体，界面并没有太大区别。但是，Fedora Silverblue 是一个不可变的操作系统，采用以容器为中心的工作流程。这意味着每个安装的副本与同一版本的其他副本完全相同。其目标是使其更加稳定，更少出现错误，并更容易进行测试和开发。

更多信息请访问以下链接：

>
> **[Fedora Silverblue](https://silverblue.fedoraproject.org/)**
>
>
>

### 结论

Fedora Linux 的每个版本都有不同的目的。多个版本的可用性可以帮助你获得适合你需求的操作系统。本文讨论的 Fedora Linux 版本是在 Fedora Linux 的主要下载页面上提供的操作系统。你可以在 <https://getfedora.org/> 找到下载链接和更完整的文档说明。

*（题图：MJ/90ffba71-aee2-4429-a846-41f06997792c）*

---

via: <https://fedoramagazine.org/fedora-linux-editions-part-1-official-editions/>

作者：[Arman Arisman](https://fedoramagazine.org/author/armanwu/) 选题：[lkxed](https://github.com/lkxed) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


硬核观察 #1079 GNOME 正在开发新的马赛克窗口管理系统

Summary:
? GNOME 正在开发新的马赛克窗口管理系统
? 目前仍有 10,000 台大型机在使用
? 抗量子加密技术还需要数年
»
»

![](/data/attachment/album/202307/31/123108b2taammzjlirloav.jpg)

![](/data/attachment/album/202307/31/123117s5rrzfi8dtf5htrh.jpg)

### GNOME 正在开发新的马赛克窗口管理系统

GNOME 希望能有更强大的窗口管理系统，除了经典的浮动堆叠模式和平铺模式外，他们设计了一种新的马赛克模式作为默认模式，它结合了平铺和浮动的优点。（不是你想的那个“马赛克”?）当你打开一个窗口，它就会以最适合应用程序的大小在屏幕中央打开。当你打开更多窗口时，现有的窗口会移到一边，为新窗口腾出空间。如果新窗口不合适，例如，因为它想最大化，它就会移动到自己的工作区。如果窗口布局接近填满屏幕，窗口就会自动平铺。但要想让每个人都满意新的窗口管理器，他们必须进行大量的用户研究，并测试无数种方案，可以想象，这可能需要数月甚至数年的时间。

>
> **[消息来源：GNOME](https://blogs.gnome.org/tbernard/2023/07/26/rethinking-window-management/)**
>
>
>

>
> 老王点评：GNOME 和 KDE 不缺乏创新，并不只是抄袭 Windows 和 macOS，甚至反过来被抄袭。Linux 上的桌面环境缺乏的是精细打磨。
>
>
>

![](/data/attachment/album/202307/31/123134e9bkdc2tb2lg39tb.jpg)

### 目前仍有 10,000 台大型机在使用

大型计算机通常被视为像恐龙一样古老的机器，但是，专门用于处理海量数据的大型机在今天仍然非常重要。据估计，目前仍在使用的大型机有一万台。世界上最大的公司几乎都在使用它们，其中包括三分之二的《财富》500 强公司。而这些大型机大多来自 IBM。今天的大型机可以拥有多达 240 个服务器级 CPU、40TB 的纠错 RAM 和多 PB 的冗余闪存二级存储。

>
> **[消息来源：Ars Technica](https://arstechnica.com/information-technology/2023/07/the-ibm-mainframe-how-it-runs-and-why-it-survives/)**
>
>
>

>
> 老王点评：一方面，云计算并没有那么可靠，另外一方面，旧的信息基础设施很难迁移，或者说，不敢迁移。
>
>
>

![](/data/attachment/album/202307/31/123150zhgib8i5b234n4zb.jpg)

### 抗量子加密技术还需要数年

能够破解公钥加密的量子计算机可能还需要几年时间。不幸的是，支持抗量子加密技术的产品也是如此。NIST 上周宣布的第二轮后量子算法评估预计将耗时数年，而 FIPS 产品验证流程也有后顾之忧。新标准一般需要 4 到 6 年的时间，供应商才能开发出执行该标准的专用集成电路，然后，供应商还需要时间来验证产品。由于现在窃取的加密数据可以在稍后解密，因此“现在收获，稍后解密”攻击的可能性“是一个已经存在的量子计算安全问题”。

>
> **[消息来源：E-Security Planet](https://www.esecurityplanet.com/trends/nist-encryption-standards/)**
>
>
>

>
> 老王点评：如果不能在量子计算机真正发挥作用之前就部署好抗量子加密算法，那几乎可以肯定会面临大量的泄密事件，世界的真相也将更早揭晓。
>
>
>


活动资料下载｜LLUG 2023 上海场成功举办

![](/data/attachment/album/202307/31/145912zcpxwml4rbc4bm4l.jpg)

7 月 23 日下午，由 Linux 中国主办，龙蜥社区联合主办，奇虎 360、图灵社区、Slash Data 支持的 LLUG 2023 上海场活动在上海市 360 大厦成功举办。

本次活动分为主题演讲和闪电演讲，来自技术社区、龙蜥社区和 Linux 中国的社区的分享者分享了自己的实践，现场的观众也在闪电演讲环节积极分享，大家热情交流。

![](/data/attachment/album/202307/31/143156xukvvk24r0nknvi9.jpg)

*现场爱好者听分享*

腾讯云 TVP 肖力老师分享了他自己的成长路径，以及对于 Linux 新手们的建议，帮助大家理解云计算到底是什么以及如何更好的了解、使用云计算；龙蜥社区运营委员蔡佳丽则分享了龙蜥技术认证背后的设计理念和心得，并分享了目前龙蜥技术认证的具体情况；Linux 中国的技术组组长 Bestony 正式发布了 LCTT.Tools ，并进行了现场的演示，邀请更多社区爱好者参与并体验该工具。Linux 中国的创始人老王则远程分享了作为新手，如何更加高效的参与开源。

![](/data/attachment/album/202307/31/143224qnrwb1kfgk6gkbds.jpg)

*肖力老师的现场分享*

![](/data/attachment/album/202307/31/143245v42x4gp2cl2k226k.jpg)

*龙蜥社区运营委员蔡佳丽分享龙蜥社区技术认证*

![](/data/attachment/album/202307/31/143304hvgg4f25fff8gmw1.jpg)

*老王分享如何高效的参与开源*

除了主题演讲之外，来自现场爱好者的闪电演讲的分享，也赢得了满堂喝彩，胡张治同学分享了他自己从一个 Linux 小白逐渐成长为 ArchLinuxCN 的维护者的经历，并介绍他自己对于不同发行版的看法；来自大连的孙捂饭同学，则介绍了自己作为一个传统的运维工程师，对于 LLUG 线下活动的感想和体验；李轲韡介绍自己作为一个从事 Linux 发行版工作的软件公司，是如何看待 Anolis OS 的，帮助大家从一个从业者的视角，理解 Anolis OS 的价值；李伟光（a.k.a.地瓜）现场安利了一波 NeoVim，让大家知道了 Vim 的一个有趣的发行版。

![](/data/attachment/album/202307/31/143352a1xz1nmwywpwn0ma.jpg)

*胡张治分享自己从 GNU/Linux 小白到 ArchLinuxCN 贡献者的旅程*

![](/data/attachment/album/202307/31/143411w0xj33s5fosxo4sf.jpg)

*李伟光现场介绍 neovim 的使用*

### PPT 及视频下载

LLUG 的创办希望帮助 Linux 社区当中的每一个人都可以充分的交流经验和心得，所以我们也将本次活动的视频以及演示文稿开放出来，供大家查看。视频托管在 Bilibili，PPT 文稿则托管在 Github 的 Linux-CN/LLUG-Shares 仓库中，供大家下载。

本次活动的 PPT 及视频的汇总在这里，方便大家下载和在线查看。

| 类型 | 活动主题 | 主讲人 | PPT | 在线视频 |
| --- | --- | --- | --- | --- |
| 主题演讲 | 浅谈云计算架构设计 | 肖力 | [下载地址](https://github.com/Linux-CN/LLUG-Shares/blob/main/Shanghai/2023.07-Qihoo/7.23%20%E8%82%96%E5%8A%9B%20%E6%B5%85%E8%B0%88%E4%BA%91%E8%AE%A1%E7%AE%97%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%20v6%EF%BC%88%E8%84%B1%E6%95%8F%E7%89%88%EF%BC%89%20.pdf) | [bilibili](https://www.bilibili.com/video/BV1RM4y1p7qe/) |
| 主题演讲 | 龙蜥技术认证介绍 | 蔡佳丽 | [下载地址](https://github.com/Linux-CN/LLUG-Shares/blob/main/Shanghai/2023.07-Qihoo/7.23%20%E8%94%A1%E4%BD%B3%E4%B8%BD%20%E9%BE%99%E8%9C%A5%E6%8A%80%E6%9C%AF%E8%AE%A4%E8%AF%81%E4%BB%8B%E7%BB%8D.pdf) | [bilibili](https://www.bilibili.com/video/BV1zX4y1E78U/) |
| 主题演讲 | 高效开源（个人篇） | wxy | [下载地址](https://github.com/Linux-CN/LLUG-Shares/blob/main/Shanghai/2023.07-Qihoo/7.23%20wxy%20%E9%AB%98%E6%95%88%E5%BC%80%E6%BA%90%EF%BC%88%E4%B8%AA%E4%BA%BA%E7%AF%87%EF%BC%89.pdf) | 暂缺（准备重新录制），[文字稿](/article-16026-1.html) |
| 主题演讲 | LCTT Tools Release | bestony | [下载地址](https://github.com/Linux-CN/LLUG-Shares/blob/main/Shanghai/2023.07-Qihoo/7.23%20%E7%99%BD%E5%AE%A6%E6%88%90%20LCTT.%20Tools%20Release.pdf) | [bilibili](https://www.bilibili.com/video/BV17c411F7jD/) |
| 闪电演讲 | 从 GNULinux 小白到 archlinuxcn 维护者 | 胡张治 | 无 | [bilibili](https://www.bilibili.com/video/BV1cm4y1j7eW/) |
| 闪电演讲 | 技术，以人为本。沟通，无处不在 | 孙捂饭 | 无 | [bilibili](https://www.bilibili.com/video/BV15k4y1V7Dd/) |
| 闪电演讲 | Neovim的简单介绍 | 李伟光 | 无 | [bilibili](https://www.bilibili.com/video/BV1xV4y1q71u/) |
| 闪电演讲 | 浅谈龙蜥系统在千寻的应用和思考 | 李轲韡 | 无 | [bilibili](https://www.bilibili.com/video/BV1pu4y127x2/) |

### 关于深圳，你想聊点什么？

北京、上海，下一步，LLUG 将在 8 月份，来到鹏城深圳，和深圳的爱好者们，一起交流。如果你感兴趣，来到 LLUG 现场分享你和 Linux 的故事，欢迎扫描下方二维码，提交你的分享议题～

![](/data/attachment/album/202307/31/144328e9g51gu5hfifisu1.png)

*议题提交*

*（题图：MJ/2f6c9c25-86df-48c8-9268-7dd187cbe649）*


终端基础：在 Linux 中复制文件和目录

![](/data/attachment/album/202307/31/220802ozpf3gt9gpj2pp0f.jpg)

>
> 在终端基础知识系列的这一部分中，学习如何在 Linux 中使用命令行复制文件和目录。
>
>
>

复制文件是你经常执行的最基本但最重要的任务之一。

Linux 有一个专门的 `cp` 命令用于复制文件和目录（文件夹）。

在终端基础知识系列的这一部分中，你将学习在终端中复制文件和文件夹。

>
> ? 回想一下，以下是你迄今为止在本终端基础知识系列中所学到的内容：
>
>
> * [更改目录](https://itsfoss.com/change-directories/)
> * [创建新目录](/article-15595-1.html)
> * [列出目录内容](https://itsfoss.com/list-directory-content/)
> * [创建文件](/article-15643-1.html)
> * [读取文件](https://itsfoss.com/view-file-contents/)
> * [删除文件和目录](/article-15809-1.html)
>
>
>

让我们继续该系列的第七章。

### 在 Linux 命令行中复制文件

让我向你展示一些复制文件的示例。

#### 将文件复制到另一个目录

要将一个文件复制到另一目录，你所要做的就是遵循给定的命令语法：

```
cp 源文件 目标目录

```

例如，在这里，我将名为 `Hello.txt` 的文件复制到名为 `Tux` 的目录中：

![copy file to another directory in linux command line](/data/attachment/album/202307/31/220849xmp849c8l8dwa9mr.png)

正如你所看到的，文件已成功复制到 `Tux` 目录中。

#### 复制文件但重命名

你可以选择在复制文件时重命名该文件。只需为“目标文件”指定一个不同的名称即可。

```
cp 源文件 改名的文件

```

作为参考，在这里，我将名为 `Hello.txt` 的文件复制到同一目录，并将其重命名为 `Renamed_Hello.txt`：

![rename a file while copying in a same directory in linux terminal](/data/attachment/album/202307/31/220851ta35a5omcrmo8n7f.png)

为什么要这么做？ 比如说，你必须编辑配置文件。一个好的做法是在编辑配置文件之前在同一位置对其进行备份。这样，如果事情没有按计划进行，你可以恢复到旧配置。

#### 将多个文件复制到另一个位置

要将多个文件复制到另一个目录，请按以下方式执行命令：

```
cp File1 File2 File3 FileN Target_directory

```

在这里，我将多个文件复制到新位置。

![copy multiple files using the cp command in linux](/data/attachment/album/202307/31/220852qaaegi3pav0orhod.png)

>
> ? 当你复制多个文件时，仅使用 `cp` 命令无法重命名它们。
>
>
>

#### 复制时处理重复文件

默认情况下，如果目标目录中存在同名文件，`cp` 命令将覆盖该文件。

为了避免覆盖，你可以在 cp 命令中使用 `-n` 选项，它不会覆盖现有文件：

```
cp -n 源文件 目标目录

```

例如，在这里，我尝试复制目标目录中已有的两个文件，并使用 `-v` 选项来展示该命令正在执行的操作：

```
cp -n -v itsFOSS.txt LHB.txt LU.txt ~/Tux

```

![how not to override files while copying in linux using the cp command](/data/attachment/album/202307/31/220852qqz5szrqzqcuaz1f.png)

#### 交互式复制文件

但是，当你想要覆盖某些文件，而某些文件应该保持不变时该怎么办？

好吧，你可以使用 `-i` 选项在交互模式下使用 `cp` 命令，它每次都会询问你是否应该覆盖该文件：

```
cp -i 源文件 目标目录

```

![how to use cp command in interactive mode](/data/attachment/album/202307/31/220853tu6clmoll78ssz3z.png)

>
> ? 自己练习上述所有示例。你已经了解如何创建文件和文件夹，因此请重新创建所有内容。
>
>
>

### 在 Linux 命令行中复制目录

`mkdir` 命令用于创建新目录，`rmdir` 命令用于删除（空）目录。但没有用于复制目录的 `cpdir` 命令。

你必须使用相同的 `cp` 命令，但使用递归选项 `-r` 将目录及其所有内容复制到另一个位置：

```
cp -r 源目录 目标目录

```

例如，在这里，我将名为 `IF` 的目录复制到 `LHB`：

![how to copy a directory in linux command line](/data/attachment/album/202307/31/220854ik4zbqondmynf2y6.png)

但它复制了整个目录。?

那么，当你只想复制目录内容而不是目录本身时该怎么办？

你可以执行以下操作：

#### 仅复制目录的内容（不是目录）

要仅复制目录的内容，而不复制目录本身，请在源目录名称的末尾附加 `/.`：

```
cp -r 源目录/. 目标目录

```

在这里，我想复制名为 `IF` 的目录的内容，其中包含以下三个文件：

![check the file contents of directory using the tree command](/data/attachment/album/202307/31/220854z7bdfd7pddwkz46v.png)

我将执行以下命令将 `IF` 目录的文件内容复制到 `LHB`：

```
cp -r IF/. LHB

```

![copy the file contents of directory not a directory itself in linux command line](/data/attachment/album/202307/31/220854anfzlix1793cjcjn.png)

你还可以在此处使用 `源目录/*` 。

#### 复制多个目录

要复制多个目录，你必须按以下方式执行命令：

```
cp -r 目录1 目录2 目录3 目录N 目标目录

```

例如，在这里，我将两个名为 `IF` 和 `LU` 的目录复制到 `LHB`：

```
cp -r IF LU ~/LHB

```

![copy multiple directories using the cp command in linux command line](/data/attachment/album/202307/31/220855zqtqmzx2mpmux9ob.png)

当你想要从多个目录复制文件但不复制目录本身时，你可以执行相同的操作：

```
cp -r 目录1/. 目录2/. 目录3/. 目录N/. 目标目录

```

![copy files from multiple directories but not directories their self using the cp command](/data/attachment/album/202307/31/220856azcq9dqgcpsgzq5t.png)

>
> ? 你还可以像重命名文件一样重命名目录。
>
>
>

### 测试你的知识

现在，让我们看看你对到目前为止所学到的知识还记得多少。

* 创建一个名为 `copy_practice` 的目录。
* 将文件 `/etc/services` 复制到这个新创建的文件夹。
* 在此目录下创建一个名为 `secrets` 的文件夹，并将文件 `/etc/passwd` 和 `/etc/services` 复制到其中。
* 将 `copy_practice` 中的 `services` 文件复制到 `secrets` 文件夹中，但不要覆盖它。
* 将 `secrets` 文件夹复制到你的主目录。
* 删除 `secrets` 和 `copy_practice` 目录。

这会给你一些练习。

到目前为止进展顺利。你已经学到了很多东西。在下一章中，你将了解如何使用 `mv` 命令移动文件和文件夹。

---

via: <https://itsfoss.com/copy-files-directory-linux/>

作者：[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/) 荣誉推出


硬核观察 #1080 谁在为 NSO 间谍工具买单？FBI 发现是它自己

Summary:
? 谁在为 NSO 间谍工具买单？FBI 发现是它自己
? 安卓的已知安全漏洞和 0day 一样危险
? YouTube 现在用人工智能生成的声音为视频配音
»
»

![](/data/attachment/album/202308/01/064412c2qfqo2rr23mgmu4.jpg)

![](/data/attachment/album/202308/01/064423xmiq4gel84rd98lw.jpg)

### 谁在为 NSO 间谍工具买单？FBI 发现是它自己

今年早些时候的一项调查发现，美国政府使用了以色列黑客公司 NSO 生产的间谍软件。现在，在联邦调查局（FBI）对谁在使用这项技术进行调查后，该部门发现了一个令人困惑的答案：它自己。FBI 在 4 月底发现 Riva 网络公司代表它使用间谍工具后，与 Riva 终止了合同。FBI 称它是在不知情的情况下使用了该工具。几天前，美国政府将 NSO 列入商务部黑名单，禁止美国公司与该公司开展业务。

>
> **[消息来源：纽约时报](https://www.nytimes.com/2023/07/31/us/politics/nso-spy-tool-landmark-fbi.html)**
>
>
>

>
> 老王点评：查来查去，原来是自己。?
>
>
>

![](/data/attachment/album/202308/01/064435vkcf4vvfima6343h.jpg)

### 安卓的已知安全漏洞和 0day 一样危险

0day 漏洞是指没有被公开的漏洞。2022 年发现了 41 个正被利用的 0day，低于 2021 年的 69 个，但高于 2015 年以来的其它年份。谷歌称，安卓生态系统的一大问题是补丁更新不及时，OEM 厂商不能及时向用户推送安全更新，导致的结果是已知安全漏洞和 0day 漏洞的严重性相差无几，不需要 0day，攻击者使用已知漏洞漏洞就能实现成功入侵。

>
> **[消息来源：谷歌](https://security.googleblog.com/2023/07/the-ups-and-downs-of-0-days-year-in.html)**
>
>
>

>
> 老王点评：并不是未知的漏洞最可怕，反而是已知漏洞更容易被利用。
>
>
>

![](/data/attachment/album/202308/01/064454rb5ghxl4hib20mgi.jpg)

### YouTube 现在用人工智能生成的声音为视频配音

在 6 月底举行的 VidCon 大会上，YouTube 宣布了 Aloud 试点项目。该工具首先会生成视频音频的转录，创作者可以对其进行编辑，然后再选择自己喜欢的语言和合成语音风格。配音只需几分钟即可生成。Aloud 目前可以将视频配音成英语、西班牙语和葡萄牙语，并还将推出更多语言。

>
> **[消息来源：Rest Of World](https://restofworld.org/2023/youtube-ai-dubbing-automated-translation/)**
>
>
>

>
> 老王点评：就像人脸识别一样，以后 AI 会参与到越来越多的地方。
>
>
>