编写好 Git 提交信息的 11 个技巧

Summary: 我请社区的开源从业者分享了他们关于编写有用的 Git 提交信息的建议。

我请社区的开源从业者分享了他们关于编写有用的 Git 提交信息的建议。

![](/data/attachment/album/202301/22/184300vcsqmm85ub1ssh4b.jpg)

>
> 我请社区的开源从业者分享了他们关于编写有用的 Git 提交信息的建议。
>
>
>

最近，当需要更新时，我一直在密切关注从产品和服务获得的变更日志。以下是一些示例：

* 修复了一些错误。
* 进行了一些可访问性改进。
* 我们已经进行了改进，并修复了错误，以实现更顺畅地运行。

当我想到我还是一名初级开发人员写的一些首次提交信息时，我不得不沮丧地垂下头：

* 用鼠标点了一下，现在一切似乎都正常了。
* 执行了程序员 X 告诉我的操作，现在横幅是蓝色的。

这可真令人沮丧！我向我们的贡献者们提出了以下问题：

* 什么是好的 Git 提交信息？
* 什么是坏的 Git 提交信息？
* 你认为一个项目应该有哪些关于提交信息所写内容的规则？

以下是他们的答案：

### 易阅读的文笔是关键

与你写任何东西一样，你应该考虑谁会阅读它。然后相应地调整信息的数量和深度。

提高你的自然语言和写作技能对于软件开发的职业生涯顺利发展至关重要。重要的不仅仅是代码。

—— [Camilla Conte](https://opensource.com/users/spotlesstofu)

### 具有描述性，不要假设

我在 [OpenStack](https://opensource.com/resources/what-is-openstack) 社区中花了很多时间合作，与我在像“野外”的其他随意的项目中看到的相比，它的代码审查者有一些相当严格的标准。

我花在撰写一条可靠的提交信息的时间，往往要比编写实际的代码实现或修复程序的时间长得多。有时，提交信息可能会比它们解释的代码变化长很多倍。

总结一些贡献者指导：

* 描述为什么要做出改变，而不仅仅是改变了什么
* 第一个提交行是最重要的（就像电子邮件的主题行）
* 不要假设审查者了解你正在修复的原始问题
* 不要假设审查者可以访问外部 Web 服务或网站（总结缺陷报告和其他相关讨论）
* 不要假设代码是不言自明的和自我说明的（尽管没有必要重复你在代码注释中也提出的观点）
* 不要只包含与更改的早期修订相关的信息（我们希望贡献者将修订压扁在一起，并相应地编辑其提交信息）。

《OpenStack 贡献者指南》中有一个关于该主题的 [简短章节](https://docs.openstack.org/contributors/common/git.html#commit-messages)。

—— [Jeremy Stanley](https://opensource.com/users/fungi)

### 未来的你会感谢自己

我非常同意 Jeremy 的观点。+1000。

Jeremy 说：“描述为什么要做出改变，而不仅仅是改变了什么。”

想象一下，你是旁观者，在遥远的未来试图理解这个提交。

正如老话所说，设身处地为他人着想。

—— [Leigh Morresi](https://opensource.com/users/dgtlmoon)

### 使用 bug ID

我建议在提交信息的开头添加 bug ID，这样在以后使用 [grep 命令](https://opensource.com/downloads/grep-cheat-sheet) 跟踪提交信息时就会更方便。

例如：

```
$ git commit -m "BZ#19xxxxx

```

要写出深思熟虑的提交，请考虑以下事项：

* 我为什么要做这些更改？
* 我的更改产生了什么影响？
* 为什么有更改的必要？
* 更改的依据是什么？

—— [Agil Antony](https://opensource.com/users/agantony)

### 讲述整个故事

我喜欢想象每个提交信息都有一个隐藏的前缀，上面写着 “By applying this（通过应用这个）”。

一个好的提交信息包括将要发生的事情以及原因。仅仅有工单作参考是不够的，因为这分散了信息；Git 是去中心化的。作为一名软件开发人员，我想知道为什么当前要考虑做出更改。正在解决的具体问题是什么？考虑（并放弃）了哪些替代解决方案？在创建变更集的过程中发现了哪些影响当前内容的意外情况？

缩短提交信息没有什么好处。你未来的自己和未来的同事会感激你深入地解释了问题，以及为什么这个变更集是解决方案。认真学习和利用那些内容丰富的“烹饪”博客。然而，在此，仅仅是把生活经验替换成了项目的问题罢了（LCTT 译注：意思是要认真学习和模仿优秀、详细的提交信息）。

—— [Lisa Seelye](https://opensource.com/users/lisa)

### 但不要过于冗长

一个好的 Git 提交信息包含有关所做操作的信息，而不要包含其他信息。例如，如果你需要更新 `.gitignore`，只需写 “更新了 .gitignore” 即可。人们可以自行深入到提交本身中了解更多细节。它不需要冗长。

糟糕的提交信息类似于“哦，糟糕”或“试试这个”。当然，我也曾经犯过这样的错误，但这对于任何需要一目了然地查看提交信息的人来说都没有任何帮助。

提交信息的规则非常主观。他们可能因领导和团队而异。但至少要提供一些有关提交的上下文信息。特别是如果它是一个大的更改。没有人有时间浏览 1000 多个具有大量更改历史的文件。

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

### 使用现在时

我喜欢项目经理风格的提交信息，用现在时而不是将来时的术语编写（例如，“添加” 而不是“已添加”）。然而，这通常只有在频繁提交时才有可能。当你面临最后期限时，你能记住的只有“我是如何做的”而已。然而，写得好的提交不仅有助于合作者，而且有助于提交者回忆历史。

—— [Chris Okpada](https://opensource.com/users/ojchris)

### 不要依赖链接

我想提醒同事们的一件事是，你不仅仅是向给你的提交作批准的人解释。你还要向未来的开发人员和用户解释，他们在使用 bisect 或 blame 定位问题时发现了这个提交，并试图了解其相关性。

如果提供的唯一的上下文是指向某个外部系统的链接，并且在未来很长一段时间内，它所链接的系统不再使用，或者该用户无法访问，那么你的提交信息将变得无用，可能还不如空白。

我经常去挖掘一些开源项目的 Git 历史，发现有些提交信息无非就是一个 Bug ID，或者是某个公司内部的和专用的缺陷跟踪器的链接。

不要依赖链接！

—— [Jeremy Stanley](https://opensource.com/users/fungi)

### 清晰简洁的变更日志

作为一名发布沟通经理，我会经常阅读整个发布版块。我还会与开发人员会面，讨论任何尚未明确的领域。然后我提前测试了版本。之后，我将通过寻找变更日志和相应的修订或新内容来撰写发布文章。

变更日志是开发人员的个人提醒，但也有相应的提议和工单。你应该适当地将产品名称大写，使用拼写检查器，与标点符号和句子结构保持一致。首席开发人员也应该校对这些。你的客户，即开发人员，正在阅读这些内容。在运行更新之前，他们应该了解哪些信息能更好地为客户服务？

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

### 具体一点

作为一个经常性的发布经理，我喜欢带有组件名称的提交的信息，以及对更改内容的简要描述。在我们忘记了你聪明的分支名称之后，还可以参考一下这项工作的请求来自何处，这有助于将修复程序联系在一起。

* “修复致命错误”并不是理想的提交。
* “ISS-304: 修复具有合作伙伴角色的用户在登录访问控制功能中的致命错误”更好。
* “ISS-304: 登录访问控制：修复 `getPartnerId()` 的致命错误”也更好。

我可以查看 Git 提交、分支、合并提交之间的整个关系，并检查更改的各个行和文件。但我在发布过程中没有这样的时间。我希望能够在项目管理工具回溯这项工作的源头，了解哪些组件正在被更改，以及以何种方式进行更改。

—— [Ryan Price](https://opensource.com/users/liberatr)

### 让它成为一种习惯

我最喜欢犯的错误是“在我切换分支之前提交”，因为我必须处理其他更紧急的事情。有时候，我需要把我目前的工作提交给一个完全不同的项目。我的经理的策略是让我们像平时一样工作。但当我们变基时，他希望我们在有意义的地方压扁提交，并编写更好的信息。我不能说我们总是这样做，但他的方法确实有道理。

我也有很多“这个坏了，不知道为什么”类型的信息（哈哈），我尝试了一些东西，但想在尝试其他东西之前提交该尝试，以防方法 A 比方法 B 更接近解决问题。我已经写了 10 多年了。

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

你的提交信息建议或提示是什么？让我们在评论中知道。

---

via: <https://opensource.com/article/22/12/git-commit-message>

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

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


硬核观察 #889 C++ 之父认为 Rust 的安全性并不优于 C++

Summary:
? C++ 之父认为 Rust 的安全性并不优于 C++
? OpenAI 说 GPT-4 的 100 万亿参数数量是“胡说”
? GitHub 将停止支持 Subversion

![](/data/attachment/album/202301/22/191245fqcttd069qqcu4qk.jpg)

![](/data/attachment/album/202301/22/191252mzfbfb3wqsbcxcok.jpg)

### C++ 之父认为 Rust 的安全性并不优于 C++

C++ 之父 Bjarne 最近发布了一篇文章，号召认真思考 “安全” 问题；然后做一些明智的事情。Bjarne 对 NSA 关于软件内存安全的报告做出了回应，因为该报告将 C 和 C++ 排除在安全之外。Bjarne 不认为报告中任何一种 “安全” 语言的选择在他所关心的使用范围内比 C++ 优越。他认为，在 NSA 的文件中，“‘安全’仅限于内存安全，而忽略了语言可能（以及将）被用来违反某种形式的安全和保障的十几种其他方式。”

>
> **[消息来源：Slashdot](https://developers.slashdot.org/story/23/01/21/0526236/rust-safety-is-not-superior-to-c-bjarne-stroustrup-says)**
>
>
>

>
> 老王点评：确实，安全缺陷本来不是 C++ 或者大部分流行的编程语言的一部分，编程的人才是安全漏洞的引入者。问题是，Rust 可以通过语言本身的机制来避免这些本可以避免的安全漏洞。
>
>
>

![](/data/attachment/album/202301/22/191301mux4wv5p3vq9qoq8.jpg)

### OpenAI 说 GPT-4 的 100 万亿参数数量是“胡说”

OpenAI 的 CEO 澄清了一些关于 GPT-4 的流言。他说 GPT-4 的发布没有确定的时间框架，“它会在某个时间点出现，当我们有信心能够安全和负责任地完成它时”。并称那张比较了 GPT-3（1750 亿）和 GPT-4（100 万亿）中的参数数量的图表“完全是胡说”。而对于通用人工智能（AGI），他说，“人们在乞求失望，他们会失望的……我们没有一个真正的 AGI。”他也认为 ChatGPT 将杀死谷歌的预测是错误的，“我确实认为搜索有一个变化，可能会在某个时候到来 —— 但变化短期内不会像人们想象的那样剧烈。”

>
> **[消息来源：The Verge](https://www.theverge.com/23560328/openai-gpt-4-rumor-release-date-sam-altman-interview)**
>
>
>

>
> 老王点评：看到 OpenAI 的创始人还如此清醒，这很好。我也为我之前传播的那张错误的参数对比图道歉。
>
>
>

![](/data/attachment/album/202301/22/191317qemtd11chelpdmhp.jpg)

### GitHub 将停止支持 Subversion

GitHub 宣布将于 2024 年 1 月 8 日停止支持 Subversion（SVN）。GitHub 是在 2010 年的愚人节这天宣布支持 Subversion 版本控制系统（一度被视为玩笑），当时集中式版本控制系统是主流，分布式版本控制系统如 Git 还是一个新人，还没有迹象显示它将统治世界。通过在 GitHub 后端原生支持 Subversion，GitHub 让用户能更容易迁移到 Git。今天 Git 在开发者中的使用比例高达 94%，Subversion 的使用比例越来越少。

>
> **[消息来源：Solidot](https://www.solidot.org/story?sid=73939)**
>
>
>

>
> 老王点评：谁能想到，当年流行的 Subversion 等版本控制系统都被 Git 所取代了。想想，Linus 真是天命之子啊。
>
>
>


上世纪的 BBC Micro 和如今的 Codecademy

Summary: BBC作出了一个大胆的举动，决定通过帮助英国人战胜他们对计算机的反感，来解决英国的国家竞争力问题。

![](/data/attachment/album/202301/23/131931eegzjokllq1j440z.jpg)

20 世纪 70 年代末期，计算机突然成为了某种普罗大众能够买回家的商品；而此前的几十年间，它一直只是听命于企业级霸主的神秘而笨重的机器。少数狂热的爱好者注意到了它是多么的吸引人，并争相购买了属于自己的计算机。对更多的人而言，微型计算机的到来引发了对未来的无助焦虑。同时期的杂志上的一则广告承诺，家用计算机将“让您的孩子在学校享有不公平的优势”。广告中展示了一位打着领带，身着时髦的西装外套的男孩子急切地举手回答问题，而在他的身后，他的那些显得不那么聪明的同学们闷闷不乐地望着他。这则广告以及其它类似的广告在暗示：世界正在疾速改变，而如果你不立即学习如何使用这些令人生畏的新设备之一，你和你的家人就会被时代所抛弃。

在英国，这些焦虑转化为政府高层对国家竞争力的担忧。从各种意义上，20 世纪 70 年代对英国来说都是平平无奇的十年，通胀与失业率高企。与此同时，一系列的罢工让伦敦陷于一次又一次的停电中。一篇 1979 年的政府报告担心：没有跟上计算机技术浪潮将“为我们糟糕的工业表现平添又一个影响因素”   [1] 。英国似乎已经在计算机技术的角逐中落后了 —— 所有的大型的计算机公司都是美国的，而集成电路则在日本和中国台湾制造。

由英国政府建立的公共服务广播公司英国广播公司（BBC）作出了一个大胆的举动，决定通过帮助英国人战胜他们对计算机的反感，来解决英国的国家竞争力问题。BBC 发起了 “<ruby>   计算机认知计划  <rt>  Computer Literacy Project </rt></ruby>”，该计划包括多个教育方向的努力：几部电视连续剧、一些相关书籍、一个支持团队网络以及一款名为 [BBC Micro](https://bbcmicro.computer/) 的特别定制的微型计算机。该项目是如此成功，以致于 1983 年 《[BYTE](https://archive.org/details/byte-magazine?tab=about)》杂志的一位编辑写道：“与美国相比，英国人对微型计算机感兴趣的比例更高。”   [2]  这位编辑惊讶于在英国举办的 <ruby> 第五届个人计算机世界展 <rt>  Fifth Personal Computer World Show </rt></ruby> 的人数比参加当年的西海岸计算机展的人数更多。超过六分之一的英国人观看了由该计划制作的第一部电视连续剧，并最终售出了 150 万台 BBC Micro 微型计算机。   [3]

去年，一份包含了由计算机认知计划制作的每一部电视连续剧和所有出版资料的 [档案](https://computer-literacy-project.pilots.bbcconnectedstudio.co.uk/) 被发布在了互联网上。我抱着极大的兴趣观看了这些电视连续剧，并试图想象在 20 世纪 80 年代早期学习计算机使用是什么样子。但事实证明，更有趣的是计算机是如何被教授的。今天，我们仍然担心技术发展使人们落伍。富有的科技企业家与政府花费大量的资金试图教孩子们“编码”。我们拥有诸如 [Codecademy](https://www.codecademy.com/) 这样的网站，通过新技术的运用进行交互式编程教学。我们可能假定这种方式比 80 年代的呆板的电视连续剧更高效，不过真的是这样吗？

### 计算机认知计划

1975 年发布的 [Altair 8800](https://twobithistory.org/2018/07/22/dawn-of-the-microcomputer.html) 拉开了微型计算机革命的大幕。不到两年，Apple II、TRS-80 以及 Commodore PET 也都相继发布。全新的计算机的销量爆发式增长。1978 年，BBC 在一部名为 《<ruby>   芯片来了  <rt>  Now the Chips Are Down </rt></ruby>》（LCTT 译注：对于非英国区域的读者，可以在 [这里](https://archive.org/details/BBCHorizon19771978NowTheChipsAreDown) 观看该纪录片）的纪录片中探讨了这些新机器必将会带来的剧烈的社会变革。

该纪录片充满担忧。在前 5 分钟内，解说员提到这种微电子器件将“彻底改变我们的生活方式”。随着诡异的合成音乐的播放，屏幕上绿色的电脉冲围绕着放大后的芯片起舞，解说员进一步说，这种芯片“正是日本放弃造船业的原因，也将成为我们的孩子们长大后失业的原因”。该纪录片继续探讨了机器人如何用于汽车自动化组装，以及欧洲的手表业如何在与美国的电子表行业竞争中败下阵来。它指责英国政府在应对未来的大规模失业的准备上做得不够。

该纪录片据信可能在英国议会上展示过。   [4]  包括工业署和人力服务委员会在内的一些政府代表，开始对尝试提高英国公众对计算机的认识感兴趣。人力服务委员会为来自 BBC 的教育部门提供了资助，让他们的一个团队到日本、美国以及其他国家进行了实地考察。该研究团队完成了一份报告，历数了微电子技术在工业制造、劳动关系与办公室工作等领域的哪些方面将发生重大改变。70 年代末，BBC 决定制作一部十集电视连续剧，帮助普通英国人“学习如何使用和控制计算机，避免产生被计算机支配的感受”   [5] 。这一努力最终成为了一个与 “<ruby> 成人认知计划 <rt>  Adult Literacy Project </rt></ruby>” 相似的多媒体项目。成人认知计划是 BBC 此前进行的一项工作，包括一部电视连续剧以及补充课程，帮助两百万人提高他们的阅读能力。

计算机认知计划背后的制作方热衷于以“实操”示例为特色的电视连续剧。这样如果观众拥有一台微型计算机在家里，他们就可以亲自动手尝试。这些例子必须使用 BASIC 语言，因为这是在几乎所有的微型计算机上都使用的编程语言（实际是整个 <ruby> 交互界面 <rt>  shell </rt></ruby>）。但是制作者面临一个棘手的问题：微型计算机制造商均拥有他们自己的 BASIC 方言，因此不论他们选择哪一种方言，他们都不可避免地疏远大部分的观众。唯一切实可行的方案是创造一种全新的 BASIC 方言 —— BBC BASIC，以及与之配合使用的微型计算机。英国公众可以购买这种全新的微型计算机，并依照示例操作，而不需要担心软硬件上的差异带来的问题。

BBC 的电视制作人与节目主持人并不具备自行制造微型计算机的能力，因此他们汇总了一份他们预期的计算机的规范，并邀请英国的微型计算机公司推出满足该规范要求的新机器。这份规范要求提供一种相对更强劲的计算机，因为 BBC 的制作方认为相应的设备应当能够运行真实有用的应用程序。计算机认知计划的技术顾问还建议：如果必须要教授全体国人一种 BASIC 方言的话，那么最好选择表现良好的方言（他们可能没有确切地这样说，不过我认为这就是他们的真实想法）。BBS BASIC 通过允许递归调用与局部变量弥补了一些 BASIC 语言的常见缺点。   [6]

BBC 最终决定由一家位于剑桥的名为 Acorn Computers 的公司制造 BBC Micro 计算机。在选择 Acorn 公司的时候，BBC 没有接受来自 [Clive Sinclair](https://en.wikipedia.org/wiki/Sinclair_Research) 的申请，他经营着一家 Sinclair Research 公司。1980 年，Sinclair 公司通过 Sinclair ZX80 为英国开拓了微型计算机的大众市场。虽然 Sinclair 公司的新产品 ZX81 更便宜，但是性能不足以满足 BBC 的要求。而 Acorn 的新型计算机（内部被称为 Proton）的原型机更加昂贵，但是性能更好，更具备扩展性。BBC 对此印象深刻。该型号的计算机从未以 “Proton” 的名字上市或销售过，因为它在 1981 年 12 月以 “BBC Micro” 的名字发布了。BBC Micro 又被亲切地称为 “The Beeb”，你可以以 235 英磅的价格购得其 16k 内存的版本，或者以 335 英磅的价格获得其 32k 内存的版本。

到了 1980 年，Acorn 在英国计算机行业逐渐衰微，但是 BBC Micro 帮助 Acorn 公司创立了其遗留至今的宝贵遗产。时至今日，世界范围内最流行的微处理器指令集是 ARM 架构，“ARM” 如今代表的是 “<ruby> 先进 RISC 架构设备 <rt>  Advanced RISC Machine </rt></ruby>”，然而最初它代表的是 “<ruby> Acorn RISC 架构设备 <rt>  Acorn RISC Machine </rt></ruby>”。ARM 架构背后的 ARM 控股公司就是 Acorn 公司在 1990 年之后的延续。

![Picture of the BBC Micro.](/data/attachment/album/202301/23/131635bswazmvuaavwrvma.jpg)

*BBC Micro 的一幅差劲的图片，我摄于美国加州山景城的<ruby> 计算机历史博物馆 <rt>  Computer History Museum </rt></ruby>*

### 《计算机程序》电视连续剧

作为计算机认知计划的一部分，他们最终制作了十几部不同的电视连续剧。第一部作品是一部名为 《计算机程序The Computer Programme》 的十集电视连续剧。该连续剧在 1982 年初播出了十周。每周晚上有一百万人收看该节目，还有 25 万人在每周日与周一的下午收看该节目的重播。

该电视节目由两名主持人主持：Chris Serle 和 Ian McNaught-Davis。Serle 扮演初学者，而 McNaught-Davis 扮演专家，他具有专业的大型计算机编程经验。这是一个启发性的方式，有些 [略显笨拙的过渡](https://twitter.com/TwoBitHistory/status/1112372000742404098) —— Serle 经常直接从与 McNaught-Davis 的对话中，过渡到面向镜头的边走边说的讲述，此时你不禁会疑惑 McNaught-Davis 是否还站在画面之外。不过这意味着 Serle 可以表达观众肯定会有的关注 —— 他可能会惊恐地看着满屏的 BASIC 语言，并提出类似“这些美元符号是什么意思”的问题。在节目中的某些时刻，Serle 与 McNaught-Davis 会坐在计算机前进行事实上的结对编程。McNaught-Davis 会在各个地方留下一些线索，而 Serle 则试图将它们弄清楚。如果这一节目仅仅由一个无所不知的讲述者主持，那么它的亲和力就会差很多。

该节目也在努力展示计算在普通人生活中的实际应用。到 80 年代早期，家用电脑已经开始与年轻男孩和电子游戏联系在一起。计算机认知计划的制作方试图避免采访“令人印象深刻的、有能力的年轻人”，因为这可能会“加剧老年观众的焦虑”，而该节目正打算吸引这一人群对计算感兴趣    [7] 。在该系列的第一集中，该节目的 “现场” 记者 Gill Nevill 采访了一位女性，她购买了一台 Commodore PET 计算机用于辅助管理她的糖果店。这位名叫 Phyllis 的女性受访者看上去大约 60 多岁，但她在使用 PET 完成她的会计工作上没有任何问题，甚至已经开始使用 PET 为其他企业做计算机工作，这听上去像是一个有前途的自由职业的开端。Phyllis 说她并不介意计算机工作逐步取代她的糖果店生意，因为她更喜欢计算机工作。这次采访要是换成对一名青少年的采访，介绍了他是如何修改 《[Breakout](https://en.wikipedia.org/wiki/Breakout_(video_game))》 电子游戏，以使之运行更快并更具挑战性，不过这就几乎鼓舞不了任何人。另一方面，如果普罗大众中的 Phyllis 都会使用计算机，那么你当然也可以。

虽然该节目以大量的 BASIC 编程为特色，不过它实际想要教给观众的是，计算机通常是如何工作的。该节目通过类比的方法解释了其中的一般原则。在第二集中，有一个关于 [Jacquard](https://www.scienceandindustrymuseum.org.uk/objects-and-stories/jacquard-loom) 织机（LCTT 译注：中文网络译为雅卡尔提布机）的延伸讨论，主要是两个方面：其一，它揭示了计算机并不仅仅基于昨天发明的神秘技术 —— 计算的一些基本原则可以上溯到两百年前，就跟你可以在卡片上打孔来控制纺织机的想法一样简单；其二，经线与纬线的交织用来证明二元选择（即纬线是从上方还是下方穿过经线）在不断重复时足以产生巨大变化。当然，节目接下来继续讨论信息是如何使用二进制存储的。

在该节目中接下来是一个蒸汽管风琴的章节，该管风琴能够演奏编码在一卷长长的、分段的打孔卡片的音乐。这个类比用以解释 BASIC 中的 <ruby> 子程序 <rt>  subroutine </rt></ruby>。Serle 与 McNaught-Davis 将整卷的打孔卡片摊开在演播室的地板上，然后指出看上去像是重复的副歌的分段。McNaught-Davis 解释说，如果你将这些重复的卡片分段剪下，并以某种方式添加一条指令，回到第一次播放该副歌的最初的分段，这就是子程序。这是一个绝妙的解释，它在人们的脑海中的印象非常深刻。

我仅仅摘录了一些例子，不过我认为，总的来看该节目尤为擅长通过解释计算机实现功能所依赖的原理，使计算机不再神秘。这一节目本可以专注于 BASIC 教学，不过它并没有这样做。这被证明是一个相当明智的选择。在 1983 年写就的一篇回忆文章中，计算机认知计划的总制作人 John Radcliffe 如是写道：

>
> 如果计算机将如我们所相信的那样重要，对这一新主题的真正理解对每个人都很重要，也许与文字读写能力同等重要。不管是在我们这里还是在美国，在计算机认知的主要路线上的早期思路均集中于编程上。然而随着我们思想的发展，尽管我们意识到“动手”体验在个人计算机上的价值，但我们开始降低对编程的重视，而更多的强调广泛的理解，将微型计算机与大型计算机联系起来，鼓励人们获取一系列应用程序与高级语言的经验，并将这些经验同现实世界中的工业与商业活动中的经验联系起来……。我们相信，一旦人们掌握了这些最简单的原则，它们将可以进一步深入该主题。
>
>
>

后来，Radcliffe 又以类似的口吻写道：

>
> 围绕着这一系列节目的主要阐释目标有很多争论。一些人认为，在使用微型计算机上的实际细节上给予建议，对本项目而言尤为重要。但我们的结论是，如果该系列节目要拥有可持续性的教育价值，它就必须通过对计算原理的解释，成为进入真实计算世界的一种方式。这需要通过对微型计算机上的室内演示，通过类比方式解释其中的原则，以及通过电影说明实际应用的真实例子来实现。不仅仅是微型计算机，小型机以及大型机也将被展示。
>
>
>

我喜爱这一连续剧，尤其是其中关于小型机与大型机的部分。计算机认知计划背后的制作方旨在帮助英国人找准定位：计算身处何处又去向何方？计算机现在能做什么，未来又能做什么？学习一些 BASIC 语言是回答这些问题的一个部分，但是仅仅理解 BASIC 语言似乎不足以使人们认知计算机。

### 如今的计算机认知

如果你现在搜索“学习编码”，你看到的排在第一的是指向 Codecademy 网站的链接。如果要说存在一个“计算机认知计划”的现代替代品 —— 具有相同的影响与目标，那就是 Codecademy。

“<ruby> 学习编码 <rt>  learn to code </rt></ruby>” 是 Codecademy 的口号。我认为我不是第一个指出这一点的人 —— 事实上我可能在某个地方读过这句话，只是现在拿来用而已。但是这里使用的是 “<ruby> 编码 <rt>  code </rt></ruby>” 而非 “<ruby> 编程 <rt>  program </rt></ruby>”，这说明了一些问题。这表明你学习的重要内容是如何读懂代码，如何阅读满屏的 Python 代码的意思，而不是目光呆滞、不知所云。我能够理解为什么对于普通人而言，这似乎是成为专业程序员的主要障碍。专业程序员整日盯着布满编程术语的计算机屏幕，如果我想要成为一个专业程序员，我最好确保我能够理解这些天书一样的字符。但是理解语法并不是成为程序员的最大的挑战。在更大的障碍面前，它很快将变成微不足道。仅仅以掌握一门编程语言的语法为目标，你可能能够 *阅读* 代码，但是无法做到 *编写* 代码以解决全新的问题。

我最近学习了 Codecademy 的 《编程基础》 课程。如果你对编程感兴趣（而不是对网页开发或者数据科学），并且没有任何编程经验，这是 Codecademy 推荐你学习的课程。里面有几节关于计算机科学史的课时，不过都是流于表面而没有深入研究。（感谢上帝，[一位高尚的互联网秩序义务维护者](https://twitter.com/TwoBitHistory/status/1111305774939234304) 指出了其中存在的一个特别恶劣的错误）。该课程的主要目的是教授你编程语言的通用结构要素：变量、函数、控制流、循环等。换句话说，该课程聚焦于为了让你理解天书般的代码中的模式，而所需要知道的内容。

公平地看，Codecademy 也提供了其他内容深入的课程。但是即使是如 《计算机科学之路》 这样的课程也几乎只仅仅专注于编程以及程序中表达的概念。有人可能会反驳说这才是重点 —— Codecademy 的主要特点就是提供给你一些交互式的、带有自动反馈的编程课程。在有限的自动化课程中能够灌输给学员的内容只有这么多，因此学员的脑海里也没有更多的空间容纳更多其他的内容。但是负责启动计算机认知计划的 BBC 的制作人也面临同样的问题。他们意识到受限于他们的传播媒介，“通过电视节目所能获得的学习内容的容量也是受限的”   [8] 。虽然在他们所能传达的信息总量上存在相似的限制，但是 BBC 的制作人选择强调在学习 BASIC 语言上的一般原则。难道 Codecademy 就不能将其中一两节交互式可视化的课时替换为编织经线与纬线的 Jacquard 织机的案例吗？

我一直在大声鼓吹 “一般原则”，因此让我再解释下我认为的一般原则是什么，以及为什么它们如此重要。J. Clark Scott 出了一本有关计算机的书，书名为 《<ruby> 但是它怎么知道？ <rt>  But How Do It Know? </rt></ruby>》。这个书名来自书的序言里的一则笑话：一个店员向人群推销保温瓶，说保温瓶可以让热食始终是热的，冷食始终是冷的。一名听众对这个新发明感到惊讶，问道，但是它怎么知道（根据你给它的食物类型的不同选择做相应的事情呢）？笑点在于保温瓶当然不能感知食物的温度然后据此做出决定 —— 保温瓶仅仅制作成保证冷食必然保持冷的，热食必然保持热的就可以了。人们也以（笑话中的那个听众）一样的方式看待计算机，相信计算机就是数字大脑，能够基于提供给它们的代码 “选择” 做一件事或者另一件事。但是了解一些有关计算机如何工作的知识，哪怕是很初级水平的理解，也能让（人们理解中的）计算机摆脱（做判断的）侏儒。这就是为什么 Jacquard 织机是一个很好的有助理解的例子。一开始它似乎是一种难以置信的设备，它读取打孔卡片，然后以某种方式“知道”编织正确的样式。现实是显而易见的：每一行孔都对应一根线，而一行中有孔的地方对应着提起的线。理解了这些虽然不会有助于你用计算机完成新的事情，但是将使你自信于你不是在跟某些神秘事物打交道。我们应当尽快将这种自信的感受传授给初学者。

唉，可能真正的问题是没有人想要了解 Jacquard 织机。根据 Codecademy 如何强调他们教授的专业应用来判断，很多人开始使用 Codecademy 可能是因为他们相信这有助于 “提升” 他们的职业水平。他们没有来由地相信，首要的问题是理解编程的专业术语，因此他们才想要 “学习编码”。他们想要在他们所拥用的。每天晚上晚餐与就寝之间的一两个小时里尽快完成这件事。Codecademy 毕竟只是一门投其所好的生意，而非一些有关 18 世纪就发明了的机器的间接说明。

另一方面，计算机认知计划是供职于 BBC 的一群制作人与公务员所认为的，将计算机的使用教给国民的最好的方式。我承认，因为这一群人教会大众他们无法以己之力所能求得的事物，而赞美这一群人的建议多少有点精英主义。但我情不自禁认为他们做对了。许多人使用 BBC Micro 第一次学会了使用计算机，他们中的很多人进而成为了成功的软件开发者或游戏设计师。[正如我曾经所说的](https://twobithistory.org/2018/09/02/learning-basic.html)，我怀疑在计算机已经变得相对简单的时代里，学习使用计算机是一个巨大的优势。不过或许这群人所拥有的另一个优势在于有像 《计算机程序》 这样的尽己所能不仅仅教授编程，而且教授计算机是为什么又是如何运行程序的节目。在看完 《计算机程序》 之后，你可能并不能理解计算机屏幕上的所有天书般的编程术语，但是实际上你也并不需要，因为你知道无论 “代码” 是什么样子，计算机总是在重复做基础的事情。在完成了 Codecademy 上的一到两个课程之后，你可能能够感受一些天书般的编程术语，但是对你来说，一台计算机仍然只是一台能够以某种方式将天书般的字符转化为运行的软件的魔法机器。但这并不是计算机认知。

---

1. Robert Albury and David Allen, Microelectronics, report (1979). [↩](#fnref1)
2. Gregg Williams, “Microcomputing, British Style”, Byte Magazine, 40, January 1983, accessed on March 31, 2019, <https://archive.org/stream/byte-magazine-1983-01/1983_01_BYTE_08-01_Looking_Ahead#page/n41/mode/2up>. [↩](#fnref2)
3. John Radcliffe, “Toward Computer Literacy,” Computer Literacy Project Achive, 42, accessed March 31, 2019, [https://computer-literacy-project.pilots.bbcconnectedstudio.co.uk/media/Towards Computer Literacy.pdf](https://computer-literacy-project.pilots.bbcconnectedstudio.co.uk/media/Towards%20Computer%20Literacy.pdf). [↩](#fnref3)
4. David Allen, “About the Computer Literacy Project,” Computer Literacy Project Archive, accessed March 31, 2019, <https://computer-literacy-project.pilots.bbcconnectedstudio.co.uk/history>. [↩](#fnref4)
5. ibid. [↩](#fnref5)
6. Williams, 51. [↩](#fnref6)
7. Radcliffe, 11. [↩](#fnref7)
8. Radcliffe, 5. [↩](#fnref8)

---

via: <https://twobithistory.org/2019/03/31/bbc-micro.html>

作者：[Two-Bit History](https://twobithistory.org) 选题：[lujun9972](https://github.com/lujun9972) 译者：[CanYellow](https://github.com/CanYellow) 校对：[wxy](https://github.com/wxy)

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


在 virt-manager 的主机和客户机之间共享文件夹

![](/data/attachment/album/202301/23/163636dm5j1wrsga95xgrd.jpg)

>
> 在本指南中，你将学习如何在 virt-manager 的 KVM、QEMU 和 libvirt 的主机和客户机之间共享文件夹。
>
>
>

[virt-manager](https://virt-manager.org/) 应用或软件包使用 [libvirt](https://libvirt.org/manpages/libvirtd.html) 库来提供虚拟机管理服务。它有一个桌面界面，有助于创建、删除和管理多个虚拟机。

virt-manager 桌面界面及其组件为各种个人和商业场景提供了灵活的虚拟机管理服务。它是一个自由开源的应用，主要用于 KVM 虚拟机。然而，它也可以支持其他管理程序，如 Xen 和 LXC。

在之前的文章中，我解释了 [如何使用 virt-manager 创建虚拟机](https://www.debugpoint.com/virt-manager/)。这篇文章介绍了如何在客户机和主机之间无缝访问文件和文件夹。

### 关于 virtiofs 的说明

共享文件和文件夹是由名为 virtiofs 的 libvirt 共享文件系统提供的。它提供了访问主机上的目录树的所有功能和参数。由于大多数 virt-manager 虚拟机的配置都被翻译成 XML，所以共享文件/文件夹也可以通过 XML 文件来指定。

### 在 virt-manager中共享文件夹

首先，确保你的客户机关闭了电源。在 virt-manager GUI 中，选择虚拟机，点击“<ruby> 打开 <rt>  Open </rt></ruby>”，弹出控制台设置。

![打开设置](/data/attachment/album/202301/23/163743zt75s5iixx99px8s.jpg)

点击工具条上显示虚拟硬件细节的图标。然后点击左边面板上的“<ruby> 内存 <rt>  Memory </rt></ruby>”。

选择选项 “<ruby> 启用共享内存 <rt>  Enable shared memory </rt></ruby>”。点击应用。

![启用共享内存选项](/data/attachment/album/202301/23/163748pximgcwy22iydasi.jpg)

然后点击底部的 “<ruby> 添加硬件 <rt>  Add hardware </rt></ruby>”。

![点击添加硬件](/data/attachment/album/202301/23/163755h0hf3l0mcafrmim0.jpg)

在添加新硬件的窗口中，从左边的面板上选择 “<ruby> 文件系统 <rt>  File system </rt></ruby>”。

然后在 “<ruby> 细节 <rt>  Details </rt></ruby>” 标签中选择 “<ruby> 驱动程序 <rt>  Driver </rt></ruby>” 为 “virtiofs”。点击 “<ruby> 浏览 <rt>  Browse </rt></ruby> > <ruby> 浏览本地 <rt>  browse local </rt></ruby>”，**选择你想在客户机内访问的主机路径**。

在目标路径中，输入你想要的任何名字。这只是一个文件标签，将在挂载时使用。

所以，如果我想访问 `Pictures/Screenshots` 文件夹（`/home/debugpoint/Pictures/Screenshots`），示例设置可以是这样：

![添加一个新的文件系统硬件](/data/attachment/album/202301/23/163802w9ucph989b9bmch6.jpg)

下面是上述配置的 XML 设置。你可以在 XML 标签中找到它。

```
<filesystem type="mount" accessmode="passthrough">
  <driver type="virtiofs"/>
  <binary path="/usr/libexec/virtiofsd"/>
  <source dir="/home/debugpoint/Pictures/Screenshots"/>
  <target dir="mount_tag_pictures"/>
  <alias name="fs1"/>
  <address type="pci" domain="0x0000" bus="0x08" slot="0x00" function="0x0"/>
</filesystem>

```

点击 “<ruby> 完成 <rt>  Finish </rt></ruby>”。在 virt-manager 主窗口中，右键点击虚拟机，点击运行，启动虚拟机。确保点击“<ruby> 显示图形控制台 <rt>  show the graphical console </rt></ruby>”（如果虚拟机没有显示，点击工具条上的监视器图标）。

在客户机中，创建一个你想挂载主机文件夹的文件夹。在这个例子中，我使用了 `/mnt/pictures`。

```
sudo mkdir /mnt/pictures

```

最后，使用你在上述步骤中创建的标签将主机文件夹挂载到这个新文件夹。使用下面的命令在终端做这件事。确保根据你的系统改变下面命令中的标签和文件夹名称。

```
sudo mount -t virtiofs mount_tag_pictures /mnt/pictures

```

现在你可以在 virt-manager 中的主机和客户机之间的无缝地浏览文件夹和添加/删除项目。

![从 virt-manager 客户机访问主机文件](/data/attachment/album/202301/23/163813o65cqgw5g6wt7b9a.jpg)

### 总结

我希望这个方案能帮助你从客户机上访问主机文件和文件夹。记住，你的用户 ID，也就是用来启动 virt-manager 应用的用户，应该有同样的权限来访问主机文件夹。

如果你遇到任何错误，上述指南帮助了你，请在下面留言。

* [参考](https://libvirt.org/kbase/virtiofs.html)

---

via: <https://www.debugpoint.com/share-folder-virt-manager/>

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


硬核观察 #890 微软元宇宙梦碎，砍掉了整个 VR/AR 团队

Summary:
? 微软元宇宙梦碎，砍掉了整个 VR/AR 团队
? 83% 的 GNOME 用户安装了扩展
? VSCode 扩展市场容易出现欺骗性扩展
»
»

HoloLens的军用版本一度中标，然后又被否。

现在大规模裁员，要么是产品不成熟，打算换一波人重启炉灶。

要么是影响现有军火商利益，被强行要求放弃。

还有就是保密，防止兔子轻易获得。毕竟微软这么大的公司早就被各国情报机关渗透成筛子了。

不仅 VSCode 扩展市场，还有 Node.js、Python…… 的包仓库也是，还有 AUR，Chrome/Firefox 扩展……也是。

更有甚者，像之前 node-ipc 包，判断 IP 为俄罗斯时，会删用户本地文件。

所以我把开发环境放进沙盒里了。

![](/data/attachment/album/202301/23/174145ckxz8qwq8q5ehv2e.jpg)

![](/data/attachment/album/202301/23/174155difxc97zxftkt9nt.jpg)

### 微软元宇宙梦碎，砍掉了整个 VR/AR 团队

在这波大规模裁员中，微软砍掉了虚拟现实和混合现实项目的整个团队。微软在 2017 年收购的社交虚拟现实平台 AltSpaceVR 被整个砍掉了，该平台将于 3 月 10 日关闭。微软也裁掉了开发混合现实框架 MRTK 的团队，该团队本应在下个月发布新版本，MRTK 目前的重心是混合现实头戴式设备 HoloLens。

>
> **[消息来源：Windows Central](https://www.windowscentral.com/microsoft/microsoft-has-laid-off-entire-teams-behind-virtual-mixed-reality-and-hololens)**
>
>
>

>
> 老王点评：这代表了微软也结束了其在元宇宙领域的努力。建立在 VR/AR 之上的所谓“元宇宙”，前景堪忧啊。
>
>
>

![](/data/attachment/album/202301/23/174206owo6aonz61fiionc.jpg)

### 83% 的 GNOME 用户安装了扩展

去年夏天，GNOME 邀请人们自愿在他们的系统上运行一个工具，以对系统配置方面的数据进行宏观统计。有 2560 人运行了这个工具，他们现在公布了这些数据。一些有趣的数据有：在受访者中，一半的用户在运行 Fedora；近 1/4 的用户使用的是联想的机器；90% 的系统都安装了 Flatpak；3/4 的默认浏览器是 Firefox；只有 1/10 的默认浏览器是 Chrome；83% 受访者安装了非默认的 GNOME 扩展。

>
> **[消息来源：GNOME](https://blogs.gnome.org/aday/2023/01/18/gnome-info-collect-what-we-learned/)**
>
>
>

>
> 老王点评：我最感兴趣这个安装扩展的比例，这充分说明了多样性的用户需求通过扩展的方式来满足是个好方法。
>
>
>

![](/data/attachment/album/202301/23/174219zyyb345qzbbn343f.jpg)

### VSCode 扩展市场容易出现欺骗性扩展

根据调查，74.48% 的开发者在使用微软的 VSCode，几乎每个开发者都会使用扩展，而在 VSCode 市场上有超过 4 万个的扩展。研究发现，攻击者可以轻易地冒充流行的扩展，并欺骗不知情的开发者下载它们。一方面很难区分恶意扩展，扩展名称上的蓝色复选标记仅仅意味着发布者对随便一个域名的所有权。虽然 VSCode 市场会对每个新扩展和后续更新进行病毒扫描，并在发现恶意扩展时将其删除。但上传一个扩展，在被删除前很容易欺骗用户下载使用。最糟糕的是，VSCode 的扩展没有沙箱环境，这意味着扩展可以安装勒索软件、擦拭器和其他恶意代码，还可以改变你的本地代码，甚至使用你的 SSH 密钥来改变远程代码库中的代码。

>
> **[消息来源：Info World](https://www.infoworld.com/article/3685542/researchers-warn-of-malicious-visual-studio-code-extensions.html)**
>
>
>

>
> 老王点评：同样是扩展的话题，这个消息反映出来的潜在危险令人担心。我想微软应该对 VSCode 的扩展安全做更多的工作。
>
>
>


完整指南：使用 VirtualBox 在 Windows 上安装 Ubuntu

![](/data/attachment/album/202301/23/230204pr8c36xesq5r8vx9.jpg)

>
> 本教程将指导你用最简单的步骤在 Windows 上的 Oracle VirtualBox 上安装 Ubuntu 桌面版。
>
>
>

[VirtualBox](https://www.debugpoint.com/tag/virtualbox) 是 Oracle 的一款流行的虚拟化软件，可用于 Linux、mac 和 Windows 系统。它是灵活的，并提供了许多功能来实现虚拟化。这是在 Windows 中体验 Ubuntu 而不安装它的最佳且简单的方法。然而，我强烈建议将 Ubuntu 以双引导的方式安装在物理机上，从而更好地体验 Ubuntu。

下面列出的步骤假设你是第一次在 Windows 中安装 Ubuntu。因此，这些步骤有点描述性，也有点冗长。此外，以下步骤适用于 Windows 10 和 Windows 11 作为宿主机。

### 你需要什么

* 可上网的 PC
* 用于安装的 Ubuntu Linux ISO 镜像文件
* 安装了 VirtualBox 的 Windows 系统

### 使用 VirtualBox 在 Windows 上安装 Ubuntu

#### 下载并安装必要的东西

从以下链接下载 Ubuntu Linux 桌面版 ISO 镜像文件。

>
> **[下载 Ubuntu 桌面版](https://ubuntu.com/download/desktop)**
>
>
>

此外，请从下面的官方网站下载 Oracle VirtualBox 安装程序。

>
> **[下载 VirtualBox](https://www.virtualbox.org/wiki/Downloads)**
>
>
>

![VirtualBox for Windows 的下载位置](/data/attachment/album/202301/23/230544n8twuigir6zf65g8.jpg)

#### 如何安装和配置 VirtualBox

Windows 中的 VirtualBox 需要 “Microsoft Visual C++ 2019 Redistrobutiable package”。你必须先安装它。从以下链接下载软件包（X64 架构）：

>
> **[下载 MSVC](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170)**
>
>
>

![下载 VirtualBox 的依赖项](/data/attachment/album/202301/23/230553kwvbtt3vyza1ayk3.jpg)

![安装 VirtualBox 的依赖项](/data/attachment/album/202301/23/230602s9xnn75cd52v17oz.jpg)

完成以上安装后，从以下链接下载最新的 Python 包。Python 绑定也是 Windows 端 VirtualBox 安装所需的依赖项。

>
> **[下载 Python for Windows](https://www.python.org/downloads/windows/)**
>
>
>

然后，启动 VirtualBox 安装程序并按照屏幕上的说明进行安装。

安装后，重新启动 Windows 系统。

#### 为 Ubuntu 设置虚拟机

从开始菜单启动 VirtualBox。

![从开始菜单中选择 VirtualBox](/data/attachment/album/202301/23/230613sfnsrjqgunuzbofy.jpg)

在 VirtualBox 窗口工具栏上，单击 “<ruby> 新建 <rt>  New </rt></ruby>”。

![单击新建](/data/attachment/album/202301/23/230625sd4m9pplq0ycqaal.jpg)

* 在创建虚拟机窗口中，输入虚拟机的名称。它可以是标识此版本 Ubuntu 的任何名称。
* 保持 “<ruby> 文件夹 <rt>  Folder </rt></ruby>” 不变。这是创建虚拟机文件的路径。
* 在 “<ruby> ISO 镜像文件 <rt>  ISO Image </rt></ruby>” 一栏，浏览你下载的 Ubuntu ISO 文件。
* 然后选择 “<ruby> 跳过无人值守安装 <rt>  Skip Unattended installation </rt></ruby>”。如果不选择此选项，将在虚拟机中创建一个 [默认用户 id（vboxuser）和密码](https://www.debugpoint.com/virtualbox-id-password/)。让我们暂时不要管它。

![选择 ISO 文件](/data/attachment/album/202301/23/230645pf7zv8t07l5c5t5h.jpg)

* 单击 “<ruby> 硬件 <rt>  Hardware </rt></ruby>” 部分，并调整虚拟机所需的内存。一般的经验是，虚拟机的内存大小应该小于主机系统中的物理内存。我建议对于 8 GB 内存系统的虚拟机使用 2 GB 到 4 GB。要选择 4 GB 内存，拖动滑块（或键入）使其为 4096 MB（即 4×1024）。
* 选择 2 或 4 核处理器。

![选择硬件](/data/attachment/album/202301/23/230654sk00u2jd7d7x7v7z.jpg)

* 单击 “<ruby> 硬盘 <rt>  Hard Disk </rt></ruby>” 部分，并保持文件位置不变。
* 为 Ubuntu 安装提供至少 20 GB 到 25 GB 的容量。
* 硬盘文件类型值保持为 VDI（VirtualBox 磁盘镜像）
* 不要选择 “<ruby> 预分配完整大小 <rt>  Pre-allocate Full Size </rt></ruby>”。
* 最后，单击 “<ruby> 完成 <rt>  Finish </rt></ruby>”。

![选择硬盘](/data/attachment/album/202301/23/230703go8ot5pip2pccc1z.jpg)

你应该在 VirtualBox 的左侧面板上看到一个新条目，其中包含一个 Ubuntu 22.04 条目（你之前设置的名称）。

选择条目并单击 “<ruby> 开始 <rt>  Start </rt></ruby>” 以引导到虚拟机：

![在 VirtualBox 中启动 Ubuntu](/data/attachment/album/202301/23/230713l3ae8385azn3n55f.jpg)

#### 使用 VirtualBox 安装 Ubuntu

成功引导后，你应该看到以下屏幕，其中显示了安装 Ubuntu 的各种选项。选择 “<ruby> 尝试 Ubuntu <rt>  Try Ubuntu </rt></ruby>” 或 “<ruby> 安装 Ubuntu <rt>  Install Ubuntu </rt></ruby>”。

在欢迎屏幕中，单击 “<ruby> 尝试 Ubuntu <rt>  Try Ubuntu </rt></ruby>”。过了一会儿，你会看到下面的 Ubuntu <ruby> 临场 <rt>  Live </rt></ruby>桌面。如果要更改分辨率，请右键单击桌面并选择显示设置。并将分辨率更改为 1400×900。

![选择尝试 Ubuntu](/data/attachment/album/202301/23/230822oaq6gqlxxglxegae.jpg)

在桌面上，双击 “<ruby> 安装 Ubuntu <rt>  Install Ubuntu </rt></ruby>”。

![Ubuntu LIVE 桌面](/data/attachment/album/202301/23/230829azltkvkg5iph66nh.jpg)

在下一组屏幕中，根据需要选择 “<ruby> 语言 <rt>  Language </rt></ruby>” 和 “<ruby> 键盘布局 <rt>  Keyboard Layout </rt></ruby>”。

![选择语言](/data/attachment/album/202301/23/230836ni44c9wni2aq6w9k.jpg)

![选择键盘布局](/data/attachment/album/202301/23/230859p6sytmreh3j1t56v.jpg)

安装屏幕为你提供所需的安装类型。选择 “<ruby> 正常安装 <rt>  Normal Installation </rt></ruby>”，然后在 “<ruby> 其他选项 <rt>  Other options </rt></ruby>” 下选择两个选项。

![选择安装选项](/data/attachment/album/202301/23/230909j66l6leqq2jg3sn3.jpg)

由于你是在虚拟磁盘空间中安装的，即它只是一个文件，因此你可以安全地选择 “<ruby> 擦除磁盘并安装 Ubuntu <rt>  Erase disk and install Ubuntu </rt></ruby>” 选项。

![安装类型](/data/attachment/album/202301/23/230918z77kin6memzc28xy.jpg)

点击 “<ruby> 立即安装 <rt>  Install Now </rt></ruby>” 并 “<ruby> 继续 <rt>  Continue </rt></ruby>”。

![将更改写入磁盘](/data/attachment/album/202301/23/230926kzcjoj1yom2yzamm.jpg)

然后选择 “<ruby> 地区 <rt>  region </rt></ruby>”，添加“<ruby> 你的名字 <rt>  Your name </rt></ruby>”、“<ruby> 计算机名称 <rt>  Your computer's name </rt></ruby>”、“<ruby> 用户名 <rt>  Username </rt></ruby>” 和 “<ruby> 密码 <rt>  Password </rt></ruby>”。这将是安装后登录 Ubuntu 的用户 id 和密码。

单击 “<ruby> 继续 <rt>  Continue </rt></ruby>” 开始安装。等到它完成。

![创建用户帐户](/data/attachment/album/202301/23/230934ow2afgswss6gwd0w.jpg)

安装完成后，单击 “<ruby> 立即重新启动 <rt>  Restart Now </rt></ruby>”。等待几秒钟，你将看到一个登录屏幕。使用用户 id 和密码登录。你应该看到 Ubuntu 桌面在 Windows 端 VirtualBox 中作为 VM 运行。

![Ubuntu 安装完成](/data/attachment/album/202301/23/230942bsclslqssse2stee.jpg)

![登录 Ubuntu](/data/attachment/album/202301/23/231113xhadp4n9u2a82qs4.jpg)

![使用 Virtualbox 在 Windows 中运行的 Ubuntu](/data/attachment/album/202301/23/231121jkfjacqjn0pupufv.jpg)

### 安装后配置和提示（可选）

#### 安装客体机增强项

成功安装后，应为 Windows 宿主机和 Ubuntu 客体机安装 “<ruby> VirtualBox 客体机增强项 <rt>  VirtualBox guest additions </rt></ruby>”。客体机增强项是一组需要安装在客体虚拟机（即 Ubuntu）内的软件包，以启用 **共享文件夹、双向复制 / 粘贴、自动更改分辨率** 和许多类似功能。

要安装它，请引导到 Ubuntu。从 VirtualBox 菜单中，选择“<ruby> 设备 <rt>  Devices </rt></ruby> > <ruby> 插入客体机增强 CD 镜像 <rt>  Insert Guest Additions CD Image </rt></ruby>”。必要的软件包将安装在 Ubuntu 中。

![从菜单中选择客体机增强](/data/attachment/album/202301/23/231130l9kp6k05g9g0545y.jpg)

打开文件管理器并打开装入的文件夹，如下所示。然后右键单击 > 选择 “<ruby> 在终端中打开 <rt>  open in terminal </rt></ruby>”。

![打开已挂载的光盘并选择带有终端的选项](/data/attachment/album/202301/23/231139c5b6bkvbtv9vcb7f.jpg)

然后运行以下命令：

```
sudo ./VBoxLinuxAdditions.run

```

![VirtualBox 为 Windows 主机添加客体机增强项](/data/attachment/album/202301/23/231149ud0pd0v6ze6ddvez.jpg)

完成上述命令后，重新启动 Ubuntu VM。

#### 启用 Windows 和 Ubuntu 之间的复制和粘贴

要在 Windows 和 Ubuntu 系统之间启用复制和粘贴，请从菜单中选择 “<ruby> 设备 <rt>  Devices </rt></ruby> > <ruby> 共享剪贴板 <rt>  Shared Clipboard </rt></ruby> > <ruby> 双向 <rt>  Bi-directional </rt></ruby>”。

![启用共享剪贴板](/data/attachment/album/202301/23/231159efc6tuctew3t11t2.jpg)

#### 关闭 Ubuntu VM

理想情况下，你应该从自己的关机菜单中关闭 VM。但是，你也可以从 VirtualBox 主窗口关闭。右键单击虚拟机名称并选择 “<ruby> 关闭 <rt>  Close </rt></ruby> > <ruby> 关机 <rt>  Poweroff </rt></ruby>”。

![关闭虚拟机](/data/attachment/album/202301/23/231207pobrnb9d396r9bj2.jpg)

#### 如何删除 Ubuntu 并删除所有数据

如果要完全删除虚拟机（例如 Ubuntu）及其数据，请选择 “<ruby> 删除 <rt>  Remove </rt></ruby>” 和 “<ruby> 删除所有文件 <rt>  Delete All Files </rt></ruby>”。

![选择删除以移除虚拟机](/data/attachment/album/202301/23/231219bnwlwssnqullu64u.jpg)

![选择删除选项](/data/attachment/album/202301/23/231236qd4c2kc44ndcnukh.jpg)

### 结语

在本教程中，你学习了使用 VirtualBox 在 Windows（10 或 11）上安装 Ubuntu 的最简单方法。此外，你还学习了几步安装后配置 Ubuntu VM 的基本步骤。你可以对 VirtualBox 中的其他任何 Linux 发行版使用上述步骤。

如果你有任何疑问，欢迎在下面发表评论。

---

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

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

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


如何在 Java 中使用方法

linux.cn ✖<br />
java.cn ✔

>
> 在这个简便的教程中，我们可以了解到 Java 中方法的定义，如何使用方法，以及何时使用方法。
>
>
>

![](/data/attachment/album/202301/24/003036jk84quk8ngdqgd8z.jpg)

Java 中的方法（在许多其他编程语言中称为“函数”）是被组合在一起并标记为可重用的一块代码。方法很有用，因为它们允许你在不重写相同代码的情况下，执行相同的操作或一系列操作，这不仅意味着你的工作量减少，还意味着出现问题时需要维护和调试的代码减少。

方法存在于类中，因此标准 Java 样板代码适用：

```
package com.opensource.example;

public class Example {
  // 在此写代码
}

```

在这样一个简单的单文件应用程序中，包定义并不是绝对必要的，但它是一个很好的习惯，而且大多数 IDE 都强制执行它。

默认情况下，Java 会寻找在类中运行的 `main` 方法。方法可以是公有的或私有的，也可以是静态的或非静态的，但 `main` 方法必须是公有的、静态的，Java 编译器才能识别和使用它。当方法是公有的时，它可以从类外部执行。要在程序启动时调用 `Example` 类，其 `main` 方法必须是可访问的，因此将其设置为 `public`。

下面是两个方法的简单演示：一个 `main` 方法在调用 `Example` 类时默认执行，另一个 `report` 方法接受 `main` 的输入并执行简单操作。

为了模拟任意数据输入，我使用了 `if`-`then` 语句，该语句根据你启动应用程序的时间在两个字符串之间进行选择。换句话说，`main` 方法首先设置一些数据（在现实生活中，这些数据可以来自用户输入，也可以来自应用程序其他地方的其他方法），然后 “调用” `report`方法，将处理后的数据作为输入提供：

```
package com.opensource.example;

public class Example {
  public static void main(String[] args) {
    // 生成一些数据
    long myTime = System.currentTimeMillis();
    String weather;

    if ( myTime%2 == 0 ) {
      weather = "party";
    } else {
      weather = "apocalypse";
    }

    // 调用其他方法
    report(weather);
  }

  private static void report(String day) {
    System.out.printf("Welcome to the zombie %s\n", day);
  }
}

```

运行代码：

```
$ java ./Example.java
Welcome to the zombie apocalypse
$ java ./Example.java
Welcome to the zombie party

```

请注意，同一 `report` 方法有两个不同的结果。当然，在这个简单的演示中，不需要第二种方法。模拟数据生成的 `if`-`then` 语句可能生成了相同的结果。但是，当一个方法执行一项复杂的任务时，比如将图像调整为缩略图，然后使用调整后的图像在屏幕上生成小部件，那么附加组件的“费用”就很有意义了。

### 何时使用 Java 方法

很难知道何时使用方法，何时只将数据发送到 [Java 流](https://opensource.com/article/20/1/javastream) 或循环中。如果你面临这个决定，答案通常是使用一种方法。原因如下：

* 方法开销少。它们不会给代码增加处理开销。
* 方法减少代码的行数。
* 方法是特定的。查找名为 `resizeImage` 的方法通常比查找隐藏在从驱动器加载图像的函数中某个循环中的代码更容易。
* 方法是可重用的。当你第一次编写方法时，你可能会 *认为* 它只对应用程序中的一个任务有用。然而，随着应用程序的编写，你可能会发现自己正在使用一种你认为“已完成”的方法。

### 函数式编程与面向对象编程

函数式编程利用方法作为执行任务的主要构造。创建一个方法，该方法接受一种数据，处理该数据，并输出新数据。将许多方法串在一起，你就拥有了一个动态且功能强大的应用程序。像 C 和 [Lua](https://opensource.com/article/22/11/lua-worth-learning) 这样的编程语言就是这种编码风格的例子。

用代码完成任务的另一种方式是 Java 使用的面向对象模型。在面向对象编程中，方法是模板的组成部分。你可以创建对象，而不是将数据从一个方法发送到另一个方法，并可以通过使用它们的方法来更改它们。

从面向对象的角度来看，这是一个简单的 “僵尸末日” 演示程序。在函数方法中，我使用一种方法生成数据，另一种方法使用该数据执行操作。面向对象的等价物是具有表示工作单元的类。这个示例应用程序向用户显示一条当天的消息，宣布这一天会有僵尸派对或是僵尸末日。编写一个“天”对象，然后查询该对象以了解其特性是有意义的。作为演示面向对象构造的不同方面的借口，新的示例应用程序还将统计有多少僵尸出现在派对上（或末日）。

Java 为每个类使用一个文件，因此要创建的第一个文件是 `Day.Java`，它用作 `Day` 对象：

```
package com.opensource.example;

import java.util.Random;

// 类
public class Day {
    public static String weather;
    public int count;

// 构造方法
  public Day() {
    long myTime = System.currentTimeMillis();

    if ( myTime%2 == 0 ) {
      weather = "paradise";
    } else {
      weather = "apocalypse";
    }
  }

// 方法
  public String report() {
      return weather;
  }

  public int counter() {
    Random rand = new Random();
    count = count + rand.nextInt(100);

    return(count);
    }
}

```

在“类”部分中，创建了两个域：天象 `weather` 和计数 `count`。`weather` 是静态的。在一天的过程中（在这种假想的情况下），`weather` 不会改变。要么是派对 `paradise`，要么是末日 `apocalypse`，持续了一整天。然而，僵尸的数量在一天中会增加。

在“构造方法”部分，确定当天的天象。它是作为一个 [构造方法](https://opensource.com/article/19/6/what-java-constructor) 完成的，因为它只在类最初被调用时发生一次。

在“方法”部分，`report` 方法只返回由构造方法确定和设置的天象报告。然而，`counter` 方法生成一个随机数，并将其添加到当前僵尸计数中。

换句话说，这个类做了三件不同的事情：

* 表示应用程序定义的“天”。
* 设置当天不变的天气报告。
* 设置一天中不断增加的僵尸数量。

要使用这所有，请创建第二个文件：

```
package com.opensource.example;

public class Example {
  public static void main(String[] args) {
    Day myDay = new Day();
    String foo = myDay.report();
    String bar = myDay.report();

    System.out.printf("Welcome to a zombie %s\n", foo);
    System.out.printf("Welcome to a zombie %s\n", bar);
    System.out.printf("There are %d zombies out today.\n", myDay.counter());
    System.out.printf("UPDATE: %d zombies. ", myDay.counter());
    System.out.printf("UPDATE: %d zombies. ", myDay.counter());
  }
}

```

因为现在有两个文件，所以使用 Java IDE 运行代码是最简单的，但是如果不想使用 IDE，可以创建自己的 [JAR 文件](https://opensource.com/article/21/8/fastjar)。运行代码以查看结果：

```
Welcome to a zombie apocalypse
Welcome to a zombie apocalypse
There are 35 zombies out today.
UPDATE: 67 zombies. UPDATE: 149 zombies.

```

无论调用 `report` 方法多少次，`weather` 都保持不变，但调用 `counter` 方法的次数越多，僵尸的数量就会增加。

### Java 方法

方法（或函数）是编程中的重要组成。在 Java 中，你可以将它们作为函数式编程的单个类的一部分使用，也可以在面向对象编程的类之间使用它们。两种类型的编程对于解决同一个问题有不同的视角，因此没有对与错之分。通过反复尝试，积累一点经验，你会知道哪一个最适合某个特定的问题。

---

via: <https://opensource.com/article/23/1/java-methods>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lkxed](https://github.com/lkxed) 译者：[ZhangZhanhaoxiang](https://github.com/ZhangZhanhaoxiang) 校对：[wxy](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

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


硬核观察 #891 Twitter 修改开发者协议明确禁止第三方客户端

Summary:
? Twitter 修改开发者协议明确禁止第三方客户端
? 因软件故障，7000 盏灯连续亮了 17 个月
? 用 AI 检测 AI 撰写的文字
»
»

讽刺的好

来自四川泸州的 Chrome Mobile 83.0|Android 10 用户

不至于没电源总闸吧？晚上关上、白天打开不就行了。

![](/data/attachment/album/202301/24/103741ewa773nq6t6wylly.jpg)

![](/data/attachment/album/202301/24/103804wgmphumbqom3mcmi.jpg)

### Twitter 修改开发者协议明确禁止第三方客户端

前几天，我们 [报道（#882）](/article-15447-1.html) 过，在没有告知的情况下，众多第三方 Twitter 客户端由于 API 访问受限而不能使用。现在 Twitter 给出了一个解释，“Twitter 正在执行其长期的 API 规则，这可能导致一些应用程序无法工作”。在其 API 规则中添加了一条新的规则，限制开发者“使用或访问授权材料去创建或尝试创建 Twitter 应用的替代或类似的服务或产品”。这意味着 Twitter 明确禁止了开发者开发第三方客户端。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/21/twitter_third_party_apps/)**
>
>
>

>
> 老王点评：我想说 Twitter “醒悟”的太晚了，凭啥让第三方客户端挣钱啊，瞧瞧它的某个山寨品早就干掉第三方客户端了。
>
>
>

![](/data/attachment/album/202301/24/103820e9awh97q7k11hdwk.jpg)

### 因软件故障，7000 盏灯连续亮了 17 个月

美国麻省的一所高中十多年前安装了一种软件控制的照明控制系统，但在 2021 年该软件出现了故障，以至于所有的灯都无法关闭，这 7000 盏灯 24 小时点亮，一直亮了 17 个月。但是由于年代久远，安装该照明系统的公司也几经易手，已经没有修复该系统专有软件了。而更换整个照明系统需要替换大量硬件，一时也无法开展。

>
> **[消息来源：ARS Technica](https://arstechnica.com/?p=1911551)**
>
>
>

>
> 老王点评：一方面，软件的淘汰速度要比我们想象的要快，另外一方面，“古老”的电气开关看起来比软件更可靠。
>
>
>

![](/data/attachment/album/202301/24/103838qkzmxz757mckzx7r.jpg)

### 用 AI 检测 AI 撰写的文字

一家从事反剽窃服务的公司正在开发一种新的工具，以检测 ChatGPT 等 AI 工具生成的文字。他们发现 AI 写作中有明显的模式，“人类并不倾向于在高概率的地方持续使用高概率的词，但 GPT-3 会这样做”。他们的检测器基于与 GPT-3 相同的架构，并将其描述为该 GPT-3 的微型版本。“它所做的是以与 GPT-3 阅读语言完全相同的方式阅读语言，但它不是吐出更多的语言。”而是显示一篇文章中似乎有多少是 AI 写的。他们认为该工具可以保护学术诚信。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/23/turnitin_chatgpt_detector/)**
>
>
>

>
> 老王点评：AI 的进步我们只能顺应，而无法逆转。一方面我们要利用 AI 来替我们完成大量初级、重复的工作，另外一方面也可以利用 AI 来防止 AI 用在不当的地方。
>
>
>


如何在 Ubuntu 和 Fedora 中设置 Python 开发环境

![](/data/attachment/album/202301/24/111553awf8ufcd6vkzwqcq.jpg)

>
> 本文将帮助你了解在 Ubuntu 和 Fedora 中设置 Python 开发环境的基础知识和步骤。
>
>
>

[Python](https://www.python.org/) 由于其强大的库、简单的语法和可移植性，在过去几年中变得很流行。目前几乎所有的企业系统都在使用它。

因此，如果你正试图建立你的 Python 环境，并想知道如何开始等等，那么你就找到正确的地方了。在这里，我试图给你一些开始的步骤。

### 在 Ubuntu 和 Fedora 中设置 Python 开发环境

#### Python 版本

如果你刚刚开始 Python 开发，那么建议你使用最新的 Python 3.x 进行开发，因为 Python 2.x 已经不再支持了。几乎所有领先的 Linux 发行版都取消了对 Python 2 的依赖。

如果你正在运行 Fedora 或 Ubuntu 的最新发行版，那么你应该已经安装了 Python 3.x，并设置为默认解释器。例如，Fedora 37 和 Ubuntu 22.04 LTS 将 [Python 3.11](https://www.debugpoint.com/install-python-3-11-ubuntu/) 作为默认的 Python 交互界面。

找到你的 Python 版本的一个快速方法是在 Ubuntu 和 Fedora 的终端运行以下命令：

```
python2

```

```
python3

```

![python3](/data/attachment/album/202301/24/111838u56rim8n6inl5ool.jpg)

如果你运行的是早期版本的 Ubuntu 或 Fedora，那么你可以使用以下命令安装最新的 Python 3.x：

Ubuntu：

```
sudo apt install python3

```

Fedora：

```
sudo dnf install python3

```

另外，运行下面的命令，找出当前系统中 Python 可执行文件的路径：

```
Which python

```

#### 切换默认解释器的版本

如果你的系统安装了多个 Python 版本 —— 2.x 和 3.x，并且你想在它们之间切换，也是可以的。

如果你只安装了一个版本，你可以跳过这一节。

要进行切换，首先，从终端运行 `python`，找出默认的可执行路径。理想情况下，它应该是 `/usr/bin/python`。现在，运行下面的程序，找出通往可执行文件的符号链接：

```
ln -l /usr/bin/python

```

```
lrwxrwxrwx 1 root root .... /usr/bin/pyhton -> python2

```

现在检查一下 `$PATH` 变量，确定系统查找可执行文件的路径连接顺序：

```
echo $PATH

```

![PATH 变量](/data/attachment/album/202301/24/111845gmh2kzpichlim2dr.png)

你可以看到 `/usr/local/bin` 在 `/usr/bin/` 之前，那么你可以创建一个软符号链接到 `python3`。然后你的解释器在运行 `python` 命令时就会找到最新的 Python 3 而不是 Python 2。

```
ls -s /usr/bin/python3 /usr/local/bin/python

```

现在你应该注销并再次登录以清除任何哈希条目，或者你可以运行 `hash -r` 来清除它们。

现在你可以从终端运行 `python`，你应该有最新的 Python 3 了。

#### Python IDE

集成开发环境（IDE）可以帮助你编写、编译和执行你的代码。有 [几个免费的 Python 集成开发环境](https://www.debugpoint.com/5-best-python-ide-code-editor/) —— 如 PyCharm、Eclipse、Eric 等，你可以使用。但那将是另一篇关于其优点和缺点的文章。

如果你从官方 [python.org](https://www.python.org/) 网站下载 Python，Python 还带着一个叫做 IDLE 的默认开发环境。IDLE 适合于起步，之后你可以决定选择任何一个最好的免费 Python IDE。

在 Ubuntu 和 Fedora 中，IDLE 并没有和 Python 一起被默认包含，你必须手动安装它。从终端运行下面的命令来手动安装 IDLE：

Ubuntu：

```
sudo apt install idle

```

Fedora：

```
sudo dnf install python-tools

```

安装后，你可以从命令行空闲启动 IDLE 或从应用程序中搜索。

![IDLE](/data/attachment/album/202301/24/111853c03ftmfl090i113f.png)

现在，你可以使用 IDLE 开始你的开发。大部分的基本选项你可以在 IDLE 的文件菜单中找到。

我希望这篇指南解释了你在开始 Python 开发之前应该知道的东西。 尽管本指南主要是针对 Ubuntu 和 Fedora 的，但你仍然可以在所有基于 Ubuntu 和 Fedora 的发行版上参考它。如果你在 Python 环境设置方面遇到问题，请在下面的评论区告诉我。

---

via: <https://www.debugpoint.com/setup-python-environment-ubuntu-fedora/>

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

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


EndeavourOS：你对完美的 Arch 发行版的搜寻到此为止

Summary: 我们整体点评了最近发布的 EndeavourOS “Cassini”。

整体感觉审美偏中式。

一个外国发行版，有这么中式风格感觉不太对劲。

不会是假洋鬼子吧。

想要 "完美的 Arch 发行版"，不用上游的 Arch，却去用魔改过的下游发行版，想不通。

另外："尽管有桌面环境，Arch Linux 的性能总是更好。它总是令人感觉更快，因为它的内部并不臃肿"。

Arch 还是算臃肿的，因为拆包很粗糙，安装软件时会带上很多不必要的依赖。

另外："Pacman 的配置已被定制过，使用 EndeavourOS 选择的镜像，以确保你的体验是完美的"。

需要注意的是，AUR 只为官方源服务，如果使用第三方源，AUR 中有些包可能会出现问题。

![](/data/attachment/album/202301/24/205819zhx7kx5899ra9ka9.jpg)

>
> 我们整体点评了最近发布的 EndeavourOS “Cassini”。
>
>
>

每年，个人和小型团队们推出了数以百计的 Linux 发行版。它们大多是 Debian、Ubuntu、Fedora 或 Arch Linux 的直接衍生品，再加上一些定制的东西。这也难怪每年都有因为缺乏贡献、愿景和坚持而死亡的发行版。

三年前，作为已停止的 Antergos 项目的延续，一个由贡献者们组成的小团队发起了 EndeavourOS 项目。从那时起，由于其安装简单，用户体验和功能，它已经变得很受欢迎。

![具备 Xfce 桌面的 EndeavourOS](/data/attachment/album/202301/24/210020xf20xyhqy5msxyqt.jpg)

### 点评 EndeavourOS

如果你曾经试过它，你就会很明显地发现，他们花了很多心血来开发这个发行版。这个发行版的口号是成为一个面向大众的 “通用” Arch Linux 发行版，摒弃了新用户对 Arch Linux 安装的恐惧，以及使用 Arch 时的优越感。

如果你曾经尝试过 EndeavourOS，你一定会 “感觉” 到作为一个 Arch 发行版，对最终用户来说，在桌面上执行的事情是多么的 “容易”。

#### 安装和可供选择的桌面

通过 “独有的” Calamares 安装程序，它的安装变得超级简单。除此之外，EndeavourOS 团队还特别注意在安装步骤中为你提供了大部分的选项。例如，无需用户干预的临场介质直接启动。它会启动欢迎屏幕。欢迎屏幕要做的事就是提供让你在系统中安装它所有必要选项。

![EndeavourOS 欢迎屏幕](/data/attachment/album/202301/24/210027l67aodz7ys7ydo9n.jpg)

默认情况下，ISO 提供了一个轻量级的 Xfce 桌面。然而，EndeavourOS 也为你提供了各种桌面环境和窗口管理器（见下文）。而且它们都经过测试，可以正常工作。如果你在安装过程中连接到了互联网，你可以通过 Calamares 安装程序来安装这些。这意味着你不需要在基本的 Xfce 设置后重新安装它们。

此外，如果你是一个资深用户，只想安装一个基本的 Arch Linux，不需要任何桌面，那也是可以的。只要在安装时使用 “<ruby> 无桌面 <rt>  No desktop </rt></ruby>” 选项就可以了!

尽管 Arch Linux 最近创建了一个自动脚本 `archinstall` 来使安装更容易，但通过 EndeavourOS 的 ISO 来获得 Arch 的基本安装仍然更快、更容易。

![EndeavourOS 安装程序显示无桌面和其他选项](/data/attachment/album/202301/24/210033l70rxkchx7j0ni0r.jpg)

此外，你可以在三个选项中选择：GRUB、systemd-boot 或 “<ruby> 无启动器 <rt>  no bootloader </rt></ruby>”，这是 EndeavourOS “Cassini” 版本的亮点功能之一。此外，你还可以选择你要安装的软件包（仅在线模式支持）。例如，你可能需要一个基本的系统来开始使用。或者，你可能想安装一些与视频/音频或开发工作有关的应用程序。所有这些你都可以在这个版本中选择。

安装通过检测我的测试机中安装的其他操作系统而完成，很顺利。在“Cassini” 版本中，该团队还将 mkinitcpio 换成了 [dracut](https://wiki.archlinux.org/title/Dracut)，以获得更好的性能，减少启动相关问题的失败。

#### “Xfce” 旗舰版的桌面体验

第一次登录后，你会再次看到欢迎程序，其中有一个 “安装后” 可以做的项目列表。开发人员提供了一个非常周到的列表。这包括改变墙纸、更新 Arch 镜像、安装英伟达驱动等初始任务。许多 Linux 发行版都有一个欢迎程序，但我认为这个程序是一个完善的软件包。

![欢迎应用中的安装后项目](/data/attachment/album/202301/24/210040mybeyb6hyyc9bkyg.jpg)

默认的外观是你能得到的定制的最好的 Xfce 桌面。通过定制，它成为一个外观良好的发行版，远非默认的 Xfce 可比。定制包括 GRUB 菜单、登录屏幕和桌面等等。

Xfce 主菜单配置了更多的项目，终端略带透明，使用 Qogir 图标主题。所有这些变化都辅以令人惊叹的壁纸和 Arc-Darker 默认 Xfce 主题。

![EndeavourOS “Cassini” 桌面带有 Xfce 4.18](/data/attachment/album/202301/24/210049qlqhzruu65hr5leh.jpg)

#### 性能

尽管有桌面环境，Arch Linux 的性能总是更好。它总是令人感觉更快，因为它的内部并不臃肿。除此之外，[Xfce 桌面 4.18](https://www.debugpoint.com/xfce-4-18-features/) 在 “Cassini” 版本中还做了额外的性能优化，你可以在浏览桌面的时候感受到。

在空闲状态下，它使用了大约 700MB 的内存和平均 4% 的 CPU 占用。这是性能基线。资源使用量可能会根据你打开的应用程序的数量而增加。在我之前对 EndeavourOS 的点评中，其性能表现也类似。

不仅如此，它在默认的 Xfce 安装中只使用了 4GB 的磁盘空间。然而，你可能需要安装额外的重型软件，如 LibreOffice、GIMP 或 KDenlive，这将占用更多磁盘空间。

![EndeavourOS “Cassini” 的性能](/data/attachment/album/202301/24/210106mohjzqjotzbzs2qa.jpg)

#### 在 EndeavourOS 中执行日常任务有多容易？

EndeavourOS 的一大特点是一些基于 Python 的 GUI 工具，可以使你在 Arch Linux 中的生活变得简单。例如，你可以从 Arch 和 EndeavourOS 的软件仓库中获得更新通知、一键从 AUR 安装软件、一键更新镜像和你的系统。你不需要从终端运行任何命令。这对 Arch Linux 的新用户来说是一个很大的帮助。

![一键安装软件](/data/attachment/album/202301/24/210113jsfg9jjbfhj111ct.jpg)

![软件包清理器和更新管理器](/data/attachment/album/202301/24/210120jnnnymcjv0e0gfeh.jpg)

#### 处理滚动发布的独特方式，以实现稳定性

Arch Linux 作为一个滚动发布的发行版，往往会出现故障。例如，在 Arch 主仓库的每个月的内核更新期间，一些系统可能会出现故障。由于它的受欢迎程度和开发者的主动性，如果出现问题，你会得到通知和相关的解决方法。

最近 Arch Linux 中的 GRUB 问题，给用户带来了大量的启动问题，EndeavourOS 团队通过适当的沟通，给用户提供了解决方法，真的 [处理得很好](https://endeavouros.com/news/full-transparency-on-the-grub-issue/)。

因此，如果你最终遇到一个不稳定的系统，你也不会真的迷失。

此外，Pacman 的配置已被定制过，使用 EndeavourOS 选择的镜像，以确保你的体验是完美的。

#### 对开源硬件和 ARM 的正式支持

在这个 EndeavourOS “Cassini” 版本中，官方支持了 Pinebook Pro 笔记本电脑。该团队在 Manjaro 软件包的基础上与 Pine64 团队合作，为你提供了独家的 Arch 软件包，使该笔记本开箱即用。此外， EndeavourOS ARM 镜像也可用于树莓派 4。

#### 社区帮助

EndeavourOS 最大的好处之一是社区帮助 —— 这是即时的！这主要是指其专门的 [Telegram 频道](https://endeavouros.com/community/)，在那里你可以在几分钟内得到对你的 EndeavourOS 的任何问题的回应。我曾经去过这个频道，管理员/贡献者们都很友好，很有帮助。

此外，你也可以从官方论坛和其他社交渠道获得帮助。

### 总结

在结束对 EndeavourOS 的 [“Cassini” 版本](https://endeavouros.com/news/cassini-packed-with-new-features-is-here/) 的点评时，我想说这是一个构建得最好的发行版，而且组织良好。开发者和团队有一个建立通用的 Arch Linux 发行版的清晰路线图。另外，通过对 ARM 和 Pinebook Pro 的支持以及其他举措，其愿景也很明确。

总而言之，对于每一个希望在 Arch Linux 中拥有一个运行时间更长、更稳定的系统的人来说，这是一个完美的发行版。

你可以从 [官方网站](https://endeavouros.com/download/) 下载 EndeavourOS。

让我们举杯！

---

via: <https://www.debugpoint.com/endeavouros-review/>

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

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


硬核观察 #892 JavaScript 比 Java 和 .NET 缺陷更少，修复更快

Summary:
? JavaScript 比 Java 和 .NET 缺陷更少，修复更快
? 微软通过补丁检查过期的 Office 套件
? Linux 基金会发起新的“开放元宇宙基金会”
»
»

LF you can bite lighter when you don't know how to earn money.

“老王点评：这个结果有点出乎意料，专门为企业应用而设计的 Java 和 .NET 反而不如 JavaScript。”

大型软件Bug修复与修改难度要远高于小型软件。经常牵一发而动全身。事后的测试更加详细与复杂。需要时间长很正常。

不是JavaScript更安全，而是没人用它开发大型软件。

典型的幸存者偏差。

还有，测试真的很重要。

早前，向某国产系统商报了一个安全隐患，对方很快出了一个更新修复（印象中1～2星期内）。结果大量客户机更新后崩溃。成为笑话。

另一家也好不到哪里去，更新以后我的电脑打不开了。。。

![](/data/attachment/album/202301/25/075117uh3gbef8ehn3a88v.jpg)

![](/data/attachment/album/202301/25/075132ol555kg752l25wgl.jpg)

### JavaScript 比 Java 和 .NET 缺陷更少，修复更快

对数百万个商业应用程序的研究显示，近 75% 的应用程序存在安全缺陷，并随着时间的增长而变得不那么安全。其中，82.2% [的.NET](http://xn--hxy.net/) 应用程序存在缺陷，而 Java 的缺陷为 77.7%，JavaScript的缺陷为 55.8%。只有 9.5% 的 JavaScript 应用程序存在较严重的安全漏洞，而 Java 和 .NET 的比例分别为 19.9% 和 21.9%。此外，JavaScript 缺陷的修复速度也更快，其一半的缺陷平均在 116天内修复，而 .NET 为 158 天，Java 为 243 天。

>
> **[消息来源：Dev Class](https://devclass.com/2023/01/17/application-security-survey-finds-javascript-beats-java-and-net-with-fewer-flaws-faster-fixes/)**
>
>
>

>
> 老王点评：这个结果有点出乎意料，专门为企业应用而设计的 Java 和 .NET 反而不如 JavaScript。
>
>
>

![](/data/attachment/album/202301/25/075141npgpepxd6bbjbkua.jpg)

### 微软通过补丁检查过期的 Office 套件

微软打算通过更新推送一个补丁，来了解知道在 Windows PC 上安装了多少个超出支持范围的 Office 应用副本。该补丁主要检查的是已经停止支持的 Office 2007 和 2010，也包括今年 4 月将停止支持的 Office 2013。微软称，“这个更新将默默地运行一次，不会在用户的设备上安装任何东西”。微软没有提到它打算如何处理从更新中收集的数据。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/21/microsoft_office_count_update/)**
>
>
>

>
> 老王点评：微软这手未免伸的有的过长了，难道支持过期的 Office 就不能用了么？
>
>
>

![](/data/attachment/album/202301/25/075200fkelivddz7mmxwji.jpg)

### Linux 基金会发起新的“开放元宇宙基金会”

Linux 基金会称，开放元宇宙基金会（OMF）的使命是培养一个由开发者、工程师、学者和思想领袖组成的强大社区，希望联合各行业，“致力于开发开源软件和标准，以建立一个包容的、全球性的、供应商中立的、可扩展的元宇宙”。他们认为元宇宙“可以在数字空间创造新的就业机会和产业。它可以弥合物理世界和数字世界之间的差距，同时提供一个任何人都可以创造自己机会的奇妙世界。……所有这些的未来市场价值可能超过任何单一的媒体市场。”

>
> **[消息来源：Linux 基金会](https://www.linuxfoundation.org/press/open-metaverse-foundation)**
>
>
>

>
> 老王点评：我倒是觉得成立这个开放元宇宙基金会有的太早了。
>
>
>


如何在 Windows 上安装 Python

Summary: 这个简单的指南演示了如何在 Windows 上下载和安装 Python。

Linux CN，错误的<br />
Windows CN，正确的

这个简单的指南演示了如何在 Windows 上下载和安装 Python。

![](/data/attachment/album/202301/25/211813u4mmhhffif58hmpu.jpg)

>
> 这个简单的指南演示了如何在 Windows 上下载和安装 Python。
>
>
>

这篇文章是用最新的 Python 3.11 稳定版测试的。

在学习如何在 Windows 上安装 Python 之前，你可能想看看如何在 Linux 发行版（如 Ubuntu）上[轻松安装](/article-15475-1.html) Python。如果你打算成为一名开发者，最好在 Linux 中尝试 Python。那么，你可能想看看 [如何在 Windows 之外安装 Linux（如 Ubuntu）](https://www.debugpoint.com/complete-guide-how-dual-boot-ubuntu-windows/)。

Python 是一种流行的通用编程语言，在过去十年中成为开发者的选择。而且它的受欢迎程度与日俱增。它被广泛用于网络开发、复杂系统、数据科学、机器学习和所有科学领域。

你可能遇到的 Python 有两个版本。Python2 目前已经不支持了。而 Python3 系列是持续支持的版本。

### 检查 Python 是否已经安装

在 Windows 上安装它之前，你应该检查它是否已经安装。一般来说，它应该没有安装，不像在 Ubuntu （和其他 Linux 发行版）中，Python 是预先安装的。

从开始菜单中，打开“命令提示符”。

并输入以下内容：

```
python --version

```

如果 Python 是可用的，它将显示一个包含版本细节的信息。

### 下载并安装 Python

打开下面的 Python 官方下载页面。

>
> **[下载 Python](https://www.python.org/downloads/)**
>
>
>

![如何找到要安装的 Python](/data/attachment/album/202301/25/212051d3ym01036v0cym66.jpg)

在顶部，你应该看到当前的稳定版本。点击下载链接。如果你正在寻找任何特定的版本，在这个页面上向下滚动，在 “Python releases by version number:” 的标签下下载特定的版本。

下载后，进入下载文件夹，运行安装程序。

按照屏幕上的指示进行安装。

![安装 Python 第 1 步](/data/attachment/album/202301/25/212058zdz7dk0ftu7ku6rd.jpg)

![安装 Python 第 2 步](/data/attachment/album/202301/25/212107bgzj2u8cc79cc7sc.jpg)

安装完成后，验证 Python 的版本。

### 验证 Python 版本

从开始菜单，打开“命令提示符”，运行以下命令。

```
python --version

```

![Windows 上的 Python 版本](/data/attachment/album/202301/25/212115xpfz68mpmfhty8wf.jpg)

你应该看到你的系统当前安装的 Python 包的版本。另外，你也可以运行下面的程序来获得一个 Python 交互式 shell。

```
python

```

你可以用 `CTRL+Z` 和回车键退出这个交互界面。

### 检查 PATH 变量

你应该检查系统变量 `PATH`，看看 Python 的可执行位置是否存在。这应该是使用安装程序自动更新的。

从开始菜单中，搜索“<ruby> 系统变量 <rt>  system variables </rt></ruby>”并打开它。

![打开环境变量设置](/data/attachment/album/202301/25/212121zlccq989v8zlluuq.jpg)

在“系统属性”对话框中，点击“<ruby> 高级 <rt>  Advanced </rt></ruby> > <ruby> 环境变量 <rt>  Environment Variables </rt></ruby>”。在用户变量部分，对照路径变量，检查 Python 的安装位置是否存在。请参考下面的图片作为指导。

如果你看到所有的路径都存在，你就可以运行你的 Python 项目了。

![检查 Windows 中的 Python 环境 PATH 值](/data/attachment/album/202301/25/212134machh12h8gu6a186.jpg)

### 创建并运行你的第一个 Python 程序

一个额外的步骤，这里是你如何编码和运行你的第一个 Python 程序。你可以使用任意 [推荐的 Python 编辑器](https://www.debugpoint.com/5-best-python-ide-code-editor/) 来编写你的程序。

下面是一个简单的程序，它在控制台中输出文本 `debugpoint.com`。

```
# Sample Python program
print("debugpoint.com")

```

用任意名字保存文件。这里我把它保存为 `hello.py`，放在 E 盘。`.py` 是 Python 源码的扩展名。

要运行这个程序，请打开命令提示符，在 E 盘中执行以下内容。

```
python hello.py

```

输出：

![在 Windows 中运行一个简单的 Python 程序](/data/attachment/album/202301/25/212141x8o60xq0xnhxhdxo.jpg)

### 结束语

我希望这个简单的初学者指南能够帮助你在 Windows 中安装 Python，验证安装并运行你的第一个程序。

如果你遇到问题，请在下面的评论栏中告诉我。

---

via: <https://www.debugpoint.com/install-python-windows/>

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


使用时间序列数据，用开源工具助力你的边缘项目

![](/data/attachment/album/202301/25/220620ftlnqfm4og7q2j0z.jpg)

>
> InfluxData 是一个开源的时间序列数据库平台。下面介绍了它是如何被用于边缘应用案例的。
>
>
>

收集到的随时间变化的数据称为时间序列数据。今天，它已经成为每个行业和生态系统的一部分。它是不断增长的物联网行业的一大组成部分，将成为人们日常生活的重要部分。但时间序列数据及其需求很难处理。这是因为没有专门为处理时间序列数据而构建的工具。在这篇文章中，我将详细介绍这些问题，以及过去 10 年来 InfluxData 如何解决这些问题。

### InfluxData

InfluxData 是一个开源的时间序列数据库平台。你可能通过 [InfluxDB](https://opensource.com/article/17/8/influxdb-time-series-database-stack) 了解该公司，但你可能不知道它专门从事时间序列数据库开发。这很重要，因为在管理时间序列数据时，你要处理两个问题：存储生命周期和查询。

在存储生命周期中，开发人员通常首先收集和分析非常详细的数据。但开发人员希望存储较小的、降低采样率的数据集，以描述其趋势，而不占用太多的存储空间。

查询数据库时，你不希望基于 ID 查询数据，而是希望基于时间范围进行查询。使用时间序列数据最常见的一件事是在一段时间内对其进行汇总。在典型的关系型数据库中存储数据时，这种查询是很慢的，这种数据库使用行和列来描述不同数据点的关系。专门为处理时间序列数据而设计的数据库可以更快地处理这类查询。InfluxDB 有自己的内置查询语言：Flux，这是专门为查询时间序列数据集而构建的。

![Telegraf 如何工作的图像](/data/attachment/album/202301/25/220623qw6vvusgqimcqq5q.png)

### 数据采集

数据采集和数据处理都有一些很棒的工具。InfluxData 有 12 个以上的客户端库，允许你使用自己选择的编程语言编写和查询数据。这是自定义用法的一个很好的工具。开源摄取代理 Telegraf 包括 300 多个输入和输出插件。如果你是一个开发者，你也可以贡献自己的插件。

InfluxDB 还可以接受上传小体积历史数据集的 CSV 文件，以及大数据集的批量导入。

```
import math
bicycles3 = from(bucket: "smartcity")
    |> range(start:2021-03-01T00:00:00z, stop: 2021-04-01T00:00:00z)
    |> filter(fn: (r) => r._measurement == "city_IoT")
    |> filter(fn: (r) => r._field == "counter")
    |> filter(fn: (r) => r.source == "bicycle")
    |> filter(fn: (r) => r.neighborhood_id == "3")
    |> aggregateWindow(every: 1h, fn: mean, createEmpty:false)
bicycles4 = from(bucket: "smartcity")
    |> range(start:2021-03-01T00:00:00z, stop: 2021-04-01T00:00:00z)
    |> filter(fn: (r) => r._measurement == "city_IoT")
    |> filter(fn: (r) => r._field == "counter")
    |> filter(fn: (r) => r.source == "bicycle")
    |> filter(fn: (r) => r.neighborhood_id == "4")
    |> aggregateWindow(every: 1h, fn: mean, createEmpty:false)join(tables: {neighborhood_3: bicycles3, neighborhood_4: bicycles4}, on ["_time"], method: "inner")
    |> keep(columns: ["_time", "_value_neighborhood_3","_value_neighborhood_4"])
    |> map(fn: (r) => ({
        r with
        difference_value : math.abs(x: (r._value_neighborhood_3 - r._value_neighborhood_4))
    }))

```

### Flux

Flux 是我们的内部查询语言，从零开始建立，用于处理时间序列数据。它也是我们一些工具的基础动力，包括 <ruby> 任务 <rt>  task </rt></ruby>、<ruby> 警报 <rt>  alert </rt></ruby> 和 <ruby> 通知 <rt>  notification </rt></ruby>。要剖析上面的 Flux 查询，需要定义一些东西。首先，“<ruby> 桶 <rt>  bucket </rt></ruby>”就是我们所说的数据库。你可以配置存储桶，然后将数据流添加到其中。查询会调用 `smartcity` 存储桶，其范围为特定的一天（准确地说是 24 小时）。你可以从存储桶中获取所有数据，但大多数用户都包含一个数据范围。这是你能做的最基本的 Flux 查询。

接下来，我添加过滤器，将数据过滤到更精确、更易于管理的地方。例如，我过滤分配给 id 为 3 的社区中的自行车数量。从那里，我使用 `aggregateWindow` 获取每小时的平均值。这意味着我希望收到一个包含 24 列的表，每小时一列。我也对 id 为 4 的社区进行同样的查询。最后，我将这两张表相叠加，得出这两个社区自行车使用量的差异。

如果你想知道什么时候是交通高峰，这是不错的选择。显然，这只是 Flux 查询功能的一个小例子。但它提供了一个很好的例子，使用了 Flux 附带的一些工具。我还有很多的数据分析和统计功能。但对于这一点，我建议查看 Flux 文档。

```
import "influxdata/influxdb/tasks"
option task = {name: PB_downsample, every: 1h, offset: 10s}
from(bucket: "plantbuddy")
    |>range(start: tasks.lastSuccess(orTime: -task.every))
    |>filter(fn: (r) => r["_measurement"] == "sensor_data")
    |>aggregateWindow(every: 10m, fn:last, createEmpty:false)
    |>yield(name: "last")
    |>to(bucket: "downsampled")

```

### 任务

InfluxDB <ruby> 任务 <rt>  task </rt></ruby> 是一个定时 Flux 脚本，它接收输入数据流并以某种方式修改或分析它。然后，它将修改后的数据存储在新的存储桶中或执行其他操作。将较小的数据集存储到新的存储桶中，称为“<ruby> 降采样 <rt>  downsampling </rt></ruby>”，这是数据库的核心功能，也是时间序列数据生命周期的核心部分。

你可以在当前任务示例中看到，我已经对数据进行了降采样。我得到每 10 分钟增量的最后一个值，并将该值存储在降采样桶中。原始数据集在这 10 分钟内可能有数千个数据点，但现在降采样桶只有 60 个新值。需要注意的一点是，我还使用了范围内的 `lastSuccess` 函数。这会告诉 InfluxDB 从上次成功运行的时间开始运行此任务，以防它在过去 2 小时内失败，在这种情况下，它可以追溯 3 个小时内的最后一次成功运行。这对于内置错误处理非常有用。

![检查和警报通知系统的图像](/data/attachment/album/202301/25/220624j6fzs9m1spce66y6.png)

### 检查和警报

InfluxDB 包含一个 <ruby> 警报 <rt>  Alert </rt></ruby> 或 <ruby> 检查 <rt>  Check </rt></ruby> 和 <ruby> 通知 <rt>  notification </rt></ruby> 系统。这个系统非常简单直白。首先进行检查，定期查看数据以查找你定义的异常。通常，这是用阈值定义的。例如，任何低于 32°F 的温度值都被指定为“WARN”值，高于 32°F 都被分配为“OK”值，低于 0°F 都被赋予“CRITICAL”值。从那开始，你的检查可以按你认为必要的频率运行。你的检查以及每个检查的当前状态都有历史记录。在不需要的时候，你不需要设置通知。你可以根据需要参考你的警报历史记录。

许多人选择设置通知。为此，你需要定义一个 <ruby> 通知端点 <rt>  notification endpoint </rt></ruby>。例如，聊天应用程序可以进行 HTTP 调用以接收通知。然后你定义何时接收通知，例如，你可以每小时运行一次检查。你可以每 24 小时运行一次通知。你可以让通知响应值更改，例如，“WARN”更改为“CRITICAL”，或者当值为“CRITICAL”时，无论如何都从“OK”更改为“WARN”。这是一个高度可定制的系统。从这个系统创建的 Flux 代码也可以编辑。

![新 Edge 功能的图像](/data/attachment/album/202301/25/220625irgna92x524px4c0.png)

### 边缘

最后，我想把所有的核心功能放在一起，包括最近发布的一个非常特别的新功能。“Edge to cloud” 是一个非常强大的工具，允许你运行开源 InfluxDB，并在出现连接问题时在本地存储数据。连接修复后，它会将数据流传输到 InfluxData 云平台。

这对于边缘设备和重要数据非常重要，因为任何数据丢失都是有害的。你定义一个要复制到云的存储桶，然后该存储桶有一个磁盘支持的队列来本地存储数据。然后定义云存储桶应该复制到的内容。在连接到云端之前，数据都存储在本地。

### InfluxDB 和物联网边缘

假设你有一个项目，你想使用连接到植物上的物联网传感器 [监测家里植物的健康状况](https://opensource.com/article/22/5/plant-care)。该项目是使用你的笔记本电脑作为边缘设备设置的。当你的笔记本电脑合上或关闭时，它会在本地存储数据，然后在重新连接时将数据流传到我的云存储桶。

![图片展示了 Plant buddy 的工作方式](/data/attachment/album/202301/25/220626u0rqq4qmrz0poqq5.png)

需要注意的一点是，在将数据存储到复制桶之前，这会对本地设备上的数据进行降采样。你的植物传感器每秒提供一个数据点。但它将数据压缩为一分钟的平均数，因此存储的数据更少了。在云账户中，你可以添加一些警报和通知，让你知道植物的水分何时低于某个水平，需要浇水。也可以在网站上使用视觉效果来告诉用户植物的健康状况。

数据库是许多应用程序的主干。在像 InfluxDB 的时间序列数据库平台中使用带有时间戳的数据可以节省开发人员的时间，并使他们能够访问各种工具和服务。InfluxDB 的维护者喜欢看到人们在我们的开源社区中构建什么，所以请与我们联系，并与其他人共享你的项目和代码！

---

via: <https://opensource.com/article/23/1/time-series-data-edge-open-source-tools>

作者：[Zoe Steinkamp](https://opensource.com/users/zoesteinkamp) 选题：[lkxed](https://github.com/lkxed) 译者：[ZhangZhanhaoxiang](https://github.com/ZhangZhanhaoxiang) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #893 《英雄联盟》源代码失窃，被勒索 1000 万美元

Summary:
? 《英雄联盟》源代码失窃，被勒索 1000 万美元
? 自由软件基金会收紧对许可证的审批
? Wine 8.0 发布，完成 PE 转换
»
»

蹲一个 LOL 私服

因为有了 Wine，所以才有了 Proton，还记得第一次用 Proton 玩游戏，简直惊艳炸了。

蹲一个 LOL Linux服

等一个 300+dota的魔改英雄联盟

![](/data/attachment/album/202301/26/090433c6fufifwdeooueep.jpg)

![](/data/attachment/album/202301/26/090444lkfk88mpxrn0x9xk.jpg)

### 《英雄联盟》源代码被窃，勒索 1000 万美元

开发《英雄联盟》的拳头游戏被入侵，入侵者说，“我们已经获得了你的宝贵数据，包括珍贵的反作弊源代码和整个《英雄联盟》的游戏代码及其工具，以及你的用户模式反作弊器 Packman。……要求交换 10,000,000 美元。”并只给了 12 个小时的期限。入侵者警告称，他们只花费了几个小时的业余水平的入侵。拳头游戏承认了被入侵，但表示不会支付赎金，没有提供更多信息。

>
> **[消息来源：VICE](https://www.vice.com/en/article/qjky8d/hackers-demand-dollar10m-from-riot-games-to-stop-leak-of-league-of-legends-source-code)**
>
>
>

>
> 老王点评：1000 万美元对日进斗金的《英雄联盟》倒是不贵，问题是，支付了赎金怕是也没用。
>
>
>

![](/data/attachment/album/202301/26/090501z0ppizqqpyy5q4hj.jpg)

### 自由软件基金会收紧对许可证的审批

自由软件基金会（FSF）董事会通过了下个月实施的更新章程，旨在进一步保护左版许可。更新后的附则收紧了起草和发布新的/更新的许可证的审批程序：现在需要绝对多数（66%）的赞成票。此规定适用于所有 FSF 许可证，包括任何 GNU 版权许可证。

>
> **[消息来源：自由软件基金会](https://www.fsf.org/news/fsf-board-adopts-updated-by-laws-to-protect-copyleft)**
>
>
>

>
> 老王点评：看起来 FSF 在治理方面进一步完善了。
>
>
>

![](/data/attachment/album/202301/26/090516mjh6bb4i0f3zopto.jpg)

### Wine 8.0 发布，完成 PE 转换

作为年度稳定版本，Wine 8.0 纳入了过去一年中的所有变化。在此版本中，完成了将所有 Wine 模块转换为 PE 格式的工作。这对于复制保护、64 位主机上的 32 位应用支持、Windows 调试器、Arm 上的 x86 应用等工作非常重要。此外，在 Wine 8.0 中还有如下变化：打印处理器架构已经实现；继续进行 WoW64 的开发；控制器的热插拔支持得到了极大的改善等等。

>
> **[消息来源：Wine HQ](https://www.winehq.org/news/2023012401)**
>
>
>

>
> 老王点评：虽然有越来越多的原生 Linux 应用和游戏，现在 Wine 并不如早期那么重要，但是 Wine 依然是 Linux 的重要基石之一。
>
>
>


文字间的战斗与其救世主 Unicode

Summary: 我们都知道如何从键盘输入文字，不是吗？

外国人的电脑里有没有中文字体呢？

有的

感觉这篇翻译的质量比上次来看某些翻译文章时要好很多，赞

你去试试英文版的 Windows 就知道了。带了中文字体的，但没有中文版系统带的那么全。

参考: learn.microsoft.com/en-us/typography/fonts/windows_10_font_list

我们都知道如何从键盘输入文字，不是吗？

![](/data/attachment/album/202301/27/123501fod5doujjgo5jfjk.jpg)

我们都知道如何从键盘输入文字，不是吗？

那么，请允许我挑战你在你最爱的文本编辑器中输入这段文字：

![«Ayumi moved to Tokyo in 1993 to pursue her career» said Dmitrii](/data/attachment/album/202301/27/123527d9c9ychhryc54rte.png)

这段文字难以被输入因为它包含着：

* 键盘上没有的印刷符号，
* 平假名日文字符，
* 为符合平文式罗马字标准，日本首都的名字中的两个字母 “o” 头顶带有长音符号，
* 以及最后，用西里尔字母拼写的名字德米特里。

毫无疑问，想要在早期的电脑中输入这样的句子是不可能的。这是因为早期电脑所使用的字符集有限，无法兼容多种书写系统。而如今类似的限制已不复存在，马上我们就能在文中看到。

### 电脑是如何储存文字的？

计算机将字符作为数字储存。它们再通过表格将这些数字与含有意义的字形一一对应。

在很长一段时间里，计算机将每个字符作为 0 到 255 之间的数字储存（这正好是一个字节的长度）。但这用来代表人类书写所用到的全部字符是远远不够的。而解决这个问题的诀窍在于，取决于你住在地球上的哪一块区域，系统会分别使用不同的对照表。

这里有一张在法国常被广泛使用的对照表 [ISO 8859-15](https://en.wikipedia.org/wiki/ISO/IEC_8859-15)：

![The ISO 8859-15 encoding](/data/attachment/album/202301/27/123527ewo76mwrhmw33v00.png)

如果你住在俄罗斯，你的电脑大概会使用 [KOI8-R](https://en.wikipedia.org/wiki/KOI8-R) 或是 [Windows-1251](https://en.wikipedia.org/wiki/Windows-1251) 来进行编码。现在让我们假设我们在使用后者：

![The Windows-1251 encoding is a popular choice to store text written using the Cyrillic alphabets](/data/attachment/album/202301/27/123528rs4w7fpuumjiwhmm.png)

对于 128 之前的数字，两张表格是一样的。这个范围与 [US-ASCII](https://en.wikipedia.org/wiki/ASCII) 相对应，这是不同字符表格之间的最低兼容性。而对于 128 之后的数字，这两张表格则完全不同了。

比如，依据 Windows-1251，字符串 “said Дмитрий” 会被储存为：

```
115 97 105 100 32 196 236 232 242 240 232 233

```

按照计算机科学的常规方法，这十二个数字可被写成更加紧凑的十六进制：

```
73 61 69 64 20 c4 ec e8 f2 f0 e8 e9

```

如果德米特里发给我这份文件，我在打开后可能会看到：

```
said Äìèòðèé

```

这份文件 *看起来* 被损坏了，实则不然。这些储存在文件里的数据，即数字，并没有发生改变。被显示出的字符与 *另一张表格* 中的数据相对应，而非文字最初被写出来时所用的编码表。

让我们来举一个例子，就以字符 “Д” 为例。按照 Windows-1251，“Д” 的数字编码为 196（c4）。储存在文件里的只有数字 196。而正是这同样的数字在 ISO8859-15 中与 “Ä” 相对应。这就是为什么我的电脑错误地认为字形 “Ä” 就是应该被显示的字形。

![When the same text file is written then read again but using a different encoding](/data/attachment/album/202301/27/123528ycym6nr2nm8rfers.png)

多提一句，你依然可以时不时地看到一些错误配置的网站展示，或由 [用户邮箱代理](https://en.wikipedia.org/wiki/Email_client) 发出的对收件人电脑所使用的字符编码做出错误假设的邮件。这样的故障有时被称为乱码（LCTT 译注：原文用词为 [mojibake](https://en.wikipedia.org/wiki/Mojibake)， 源自日语 *文字化け*）。好在这种情况在今天已经越来越少见了。

![Example of Mojibake on the website of a French movie distributor. The website name has been changed to preserve the innocent.](/data/attachment/album/202301/27/123528jpbpepvbmyrpml1b.png)

### Unicode 拯救了世界

我解释了不同国家间交换文件时会遇到的编码问题。但事情还能更糟，同一个国家的不同生产商未必会使用相同的编码。如果你在 80 年代用 Mac 和 PC 互传过文件你就懂我是什么意思了。

也不知道是不是巧合，[Unicode](https://en.wikipedia.org/wiki/Unicode) 项目始于 1987 年，主导者来自<ruby> 施乐 <rt>  Xerox </rt></ruby>和……<ruby> 苹果 <rt>  Apple </rt></ruby> 。

这个项目的目标是定义一套通用字符集来允许同一段文字中 *同时* 出现人类书写会用到的任何文字。最初的 Unicode 项目被限制在 65536 个不同字符（每个字符用 16 位表示，即每个字符两字节）。这个数字已被证实是远远不够的。

于是，在 1996 年 Unicode 被扩展以支持高达 100 万不同的 <ruby>   代码点  <rt>  code point </rt></ruby>。粗略来说，一个“代码点”可被用来识别字符表中的一个条目。Unicode 项目的一个核心工作就是将世界上正在被使用（或曾被使用）的字母、符号、标点符号以及其他文字仓管起来，并给每一项条目分配一个代码点用以准确分辨对应的字符。

这是一个庞大的项目：为了让你有个大致了解，发布于 2017 年的 Unicode 版本 10 定义了超过 136,000 个字符，覆盖了 139 种现代和历史上的语言文字。

随着如此庞大数量的可能性，一个基本的编码会需要每个字符 32 位（即 4 字节）。但对于主要使用 US-ASCII 范围内字符的文字，每个字符 4 字节意味着 4 倍多的储存需求以及 4 倍多的带宽用以传输这些文字。

![Encoding text as UTF-32 requires 4 bytes per character](/data/attachment/album/202301/27/123529l9rsusejro9j9ozr.png)

所以除了 [UTF-32](https://en.wikipedia.org/wiki/UTF-32)，Unicode 联盟还定义了更加节约空间的 [UTF-16](https://en.wikipedia.org/wiki/UTF-16) 和 [UTF-8](https://en.wikipedia.org/wiki/UTF-8) 编码，分别使用了 16 位和 8 位。但只有 8 位该如何储存超过 100,000 个不同的值呢？事实是，你不能。但这其中窍门在于用一个代码值（UTF-8 中的 8 位以及 UTF-16 中的 16 位）来储存最常用的一些字符。再用几个代码值储存最不常用的一些字符。所以说 UTF-8 和 UTF-16 是 *可变长度* 编码。尽管这样也有缺陷，但 UTF-8 是空间与时间效率之间一个不错的折中。更不用提 UTF-8 可以向后兼容大部分 Unicode 之前的 1 字节编码，因为 UTF-8 经过了特别设计，任何有效的 US-ASCII 文件都是有效的 UTF-8 文件。你也可以说，UTF-8 是 US-ASCII 的超集。而在今天已经找不到不用 UTF-8 编码的理由了。当然除非你书写主要用的语言需要多字节编码，或是你不得不与一些残留的老旧系统打交道。

在下面两张图中，你可以亲自比较一下同一字符串的 UTF-16 和 UTF-8 编码。特别注意 UTF-8 使用了一字节来储存拉丁字母表中的字符，但它使用了两字节来存储西里尔字母表中的字符。这是 Windows-1251 西里尔编码储存同样字符所需空间的两倍。

![UTF-16 is a variable length encoding requiring 2 bytes to encode most characters. Some character still requires 4 bytes though (for example](/data/attachment/album/202301/27/123529vkgg89rc6vd4e87a.png)

![UTF-8 is a variable length encoding requiring 1, 2, 3 or 4 bytes per character](/data/attachment/album/202301/27/123529zgpxzfp5atzapxdb.png)

### 而这些对于打字有什么用呢？

啊……知道一些你的电脑的能力与局限以及其底层机制也不是什么坏事嘛。特别是我们马上就要说到 Unicode 和十六进制。现在……让我们再聊点历史。真的就一点，我保证……

……就说从 80 年代起，电脑键盘曾经有过 [`Compose` 键](https://en.wikipedia.org/wiki/Compose_key)（有时候也被标为 `Multi` 键）就在 `Shift` 键的下边。当按下这个键时，你会进入 “<ruby> 组合 <rt>  Compose </rt></ruby>” 模式。一旦在这个模式下，你便可以通过输入助记符来输入你键盘上没有的字符。比如说，在组合模式下，输入 RO 便可生成字符 ®（当作是 O 里面有一个 R 就能很容易记住）。

![Compose key on lk201 keyboard](/data/attachment/album/202301/27/123530eu5pl5u59u5zllg4.jpg)

现在很难在现代键盘上看到 `Compose` 键了。这大概是因为占据主导地位的 PC 不再用它了。但是在 Linux 上（可能还有其他系统）你可以模拟 `Compose` 键。这项设置可以通过 GUI 开启，在大多数桌面环境下调用“键盘”控制面板：但具体的步骤取决于你的桌面环境以及版本。如果你成功启用了那项设置，不要犹豫，在评论区分享你在你电脑上所采取的具体步骤。

（LCTT 译注：如果有读者想要尝试，建议将 `Compose` 键设为大写锁定键，或是别的不常用的键，`Ctrl` 和 `Alt` 会被大部分 GUI 程序优先识别为功能键。还有一些我自己试验时遇到过的问题，在开启 `Compose` 键前要确认大写锁定是关闭的，输入法要切换成英文，组合模式下输入大小写敏感。我试验的系统是 Ubuntu 22.04 LTS。）

至于我自己嘛，我现在先假设你用的就是默认的 `Shift+AltGr` 组合来模拟 `Compose` 键。（LCTT 校注：`AltGr` 在欧洲键盘上是指右侧的 `Alt` 键，在国际键盘上等价于 `Ctrl+Alt` 组合键。）

那么，作为一个实际例子，尝试输入 “LEFT-POINTING DOUBLE ANGLE QUOTATION MARK（左双角引号）”（LCTT 译注：Guillemet，是法语和一些欧洲语言中的引号，与中文的书名号不同），你可以输入 `Shift+AltGr` `<<`（你在敲助记符时不需要一直按着 `Shift+AltGr`）。如果你成功输入了这个符号，你自己应该也能猜到要怎么输入 “RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK（右双角引号）” 了。

来看看另一个例子，试试 `Shift+AltGr` `---` 来生成一个 “EM DASH（长破折号）”（LCTT 译注：中文输入法的长破折号由两个 “EM DASH” 组成）。要做到这个，你需要按下主键盘上的的 [连字符减号](https://en.wikipedia.org/wiki/Hyphen-minus) 键而非数字键盘上的那个。

值得注意的是 `Compose` 键在非 GUI 环境下也能工作。但是取决于你使用的是 X11 控制台还是只显示文字的控制台，它们所支持的组合按键顺序并不相同。

在控制台上，你可以通过命令 `dumpkeys` 来查看支持的组合按键列表（LCTT 译注：可能需要 root 权限）：

```
dumpkeys --compose-only

```

在 GUI 下，组合键是在 Gtk/X11 层被实现的。想要知道 Gtk 所支持的助记符，可以查看页面：<https://help.ubuntu.com/community/GtkComposeTable>

### 我们可以避免对 Gtk 字符组合的依赖吗？

或许我是个纯粹主义者，但是我为 Gtk 这种对 Compose 键进行硬编码的方式感到悲哀。毕竟，不是所有 GUI 应用都会使用 Gtk 库。而且我如果想要添加我自己的助记符的话就只能重新编译 Gtk 了。

幸好在 X11 层也有对字符组合的支持。在以前则是通过令人尊敬的 [X 输入法（XIM）](https://en.wikipedia.org/wiki/X_Input_Method)。

这个方法在比起基于 Gtk 的字符组合能够在更加底层的地方工作，同时具备优秀的灵活性并兼容很多 X11 应用。

比如说，假设我只是想要添加 `-->` 组合来输入字符 `→` （U+2192，RIGHTWARDS ARROW（朝右箭头）），我只需要新建 `~/.XCompose` 文件并写入以下代码：

```
cat > ~/.XCompose << EOT
# Load default compose table for the current local
include "%L"

# Custom definitions
<Multi_key> <minus> <minus> <greater> : U2192 # RIGHTWARDS ARROW
EOT

```

然后你就可以启动一个新的 X11 应用，强制函数库使用 XIM 作为输入法，并开始测试：

```
GTK_IM_MODULE="xim" QT_IM_MODULE="xim" xterm

```

新的组合排序应该可以在你刚启动的应用里被输入了。我鼓励你通过 `man 5 compose` 来进一步学习组合文件格式。

在你的 `~/.profile` 中加入以下两行来将 XIM 设为你所有应用的默认输入法。这些改动会在下一次你登录电脑时生效：

```
export GTK_IM_MODULE="xim"
export QT_IM_MODULE="xim"

```

这挺酷的，不是吗？这样你就可以随意的加入你想要的组合排序。而且在默认的 XIM 设置中已经有几个有意思的组合了。试一下输入组合键 `LLAP`。

但我不得不提到两个缺陷。XIM 已经比较老了，而且只适合我们这些不太需要多字节输入法的人。其次，当你用 XIM 作为输入法的时候，你就不能利用 `Ctrl+Shift+u` 加上代码点来输入 Unicode 字符了。什么？等一下？我还没聊过那个？让我们现在来聊一下吧：

### 如果我需要的字符没有对应的组合键排序该怎么办？

组合键是一个不错的工具，它可以用来输入一些键盘上没有的字符。但默认的组合集有限，而切换 XIM 并为一个你一生仅用一次的字符来定义一个新的组合排序十分麻烦。

但这能阻止你在同一段文字里混用日语、拉丁语，还有西里尔字符吗？显然不能，这多亏了 Unicode。比如说，名字 “あゆみ” 由三个字母组成：

* [“HIRAGANA LETTER A（平假名字母 あ）” （U+3042）](http://www.fileformat.info/info/unicode/char/3042/index.htm)
* [“HIRAGANA LETTER YU（平假名字母 ゆ）” （U+3086）](http://www.fileformat.info/info/unicode/char/3086/index.htm)
* 以及 [“HIRAGANA LETTER MI（平假名字母 み）” （U+307F）](http://www.fileformat.info/info/unicode/char/307F/index.htm)

我在上文提及了 Unicode 字符的正式名称，并遵循了全部用大写拼写的规范。在它们的名字后面，你可以找到它们的 Unicode 代码点，位于括号之间并写作 16 位的十六进制数字。这让你想到什么了吗？

不管怎样，一旦你知道了的一个字符的代码点，你就可以按照以下组合输入：

* `Ctrl+Shift+u`，然后是 `XXXX`（你想要的字符的 *十六进制* 代码点）然后回车。

作为一种简写方式，如果你在输入代码点时不松开 `Ctrl+Shift`，你就不用敲回车。

不幸的是，这项功能的实现是在软件库层而非 X11 层，所以对其支持在不同应用间并不统一。以 LibreOffice 为例，你必须使用主键盘来输入代码点。而在基于 Gtk 的应用则接受来自数字键盘的输入。

最后，当我和我的 Debian 系统上的控制台打交道时，我发现了一个类似的功能，但它需要你按下 `Alt+XXXXX` 而 `XXXXX` 是你想要的字符的 *十进制* 的代码点。我很好奇这究竟是 Debian 独有的功能，还是因为我使用的语言环境（Locale） 是 `en_US.UTF-8`。如果你对此有更多信息，我会很愿意在评论区读到它们的！

| GUI | 控制台 | 字符 |
| --- | --- | --- |
| `Ctrl+Shift+u` `3042` `Enter` | `Alt+12354` | あ |
| `Ctrl+Shift+u` `3086` `Enter` | `Alt+12422` | ゆ |
| `Ctrl+Shift+u` `307F` `Enter` | `Alt+12415` | み |

### 死键

最后值得一提的是，想要不（必须）依赖 Compose 键来输入键组合还有一个更简单的方法。

你的键盘上的某些键是专门用来创造字符组合的。这些键叫做 <ruby>   死键  <rt>  Dead Key </rt></ruby>。这是因为当你按下它们一次，看起来什么都没有发生，但它们会悄悄地改变你下一次按键所产生的字符。这个行为的灵感来自于机械打字机：在使用机械打字机时，按下一个死键会印下一个字符，但不会移动字盘。于是下一次按键则会在同一个地方印下另一个字符。视觉效果就是两次按键的组合。

我们在法语里经常用到这个。举例来说，想要输入字母 `ë` 我必须按下死键 `¨` 然后再按下 `e` 键。同样地，西班牙人的键盘上有着死键 `~`。而在北欧语系下的键盘布局，你可以找到 `°` 键。我可以念很久这份清单。

![hungary dead keys](/data/attachment/album/202301/27/123530gv17730jjk939jc4.png)

显然，不是所有键盘都有所有死键。实际上，你的键盘上是找不到大部分死键的。比如说，我猜在你们当中只有小部分人——如果真的有的话——有死键 `¯` 来输入 `Tōkyō` 所需要的长音符号（“平变音符”）。

对于那些你键盘上没有的死键，你需要寻找别的解决方案。好消息是，我们已经用过那些技术了。但这一次我们要用它们来模拟死键，而非“普通”键。

那么，我们的第一个选择是利用 `Compose` `-` 来生成长音符号（你键盘上有的连字符减号）。按下时屏幕上什么都不会出现，但当你接着按下 `o` 键你就能看到 `ō`。

Gtk 在组合模式下可以生成的一系列死键都能在 [这里](https://help.ubuntu.com/community/GtkDeadKeyTable) 找到。

另一个解决方法则是利用 Unicode 字符 “COMBINING MACRON（组合长音符号）”（U+0304），然后字母 `o`。我把细节都留给你。但如果你好奇的话，你会发现你打出的结果有着微妙的不同，你并没有真地打出 “LATIN SMALL LETTER O WITH MACRON（小写拉丁字母 O 带长音符号）”。我在上一句话的结尾用了大写拼写，这就是一个提示，引导你寻找通过 Unicode 组合字符按更少的键输入 `ō` 的方法……现在我将这些留给你的聪明才智去解决了。

### 轮到你来练习了！

所以，你都学会了吗？这些在你的电脑上工作吗？现在轮到你来尝试了：根据上面提出的线索，加上一点练习，现在你可以完成文章开头给出的挑战了。挑战一下吧，然后把成果复制到评论区作为你成功的证明。

赢了也没有奖励，或许来自同伴的惊叹能够满足你！

---

via: <https://itsfoss.com/unicode-linux/>

作者：[Sylvain Leroux](https://www.yesik.it/) 选题：[lkxed](https://github.com/lkxed) 译者：[yzuowei](https://github.com/yzuowei) 校对：[wxy](https://github.com/wxy)

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


Pandas：用于数据分析和数据科学的最热门 Python 库

![](/data/attachment/album/202301/27/163400o6afgegh0nf4nfec.jpg)

>
> Pandas 是一个十分流行的 Python 第三方库。本文介绍了 Pandas 库中的一些特性和函数，并且我们鼓励读者亲手使用 Pandas 库，来解决实际的业务问题。
>
>
>

Pandas 为 Python 中数据分析提供了基础和高级的构建组件。Pandas 库是用于数据分析与数据操作的最强大和最灵活的开源**分析工具**之一，并且它还提供了用于建模和操作表格数据（以行和列组织的数据）的**数据结构**。

Pandas 库有两个主要的数据结构：第一个是 “<ruby> 系列 <rt>  Series </rt></ruby>”，该数据结构能够很方便地从 Python 数组或字典中**按位置或指定的索引名称**来检索数据；第二个是“<ruby> 数据帧 <rt>  DataFrames </rt></ruby>”，该数据结构将数据存储在行和列中。列可以通过列名访问，行通过索引访问。列可以有不同类型的数据，包括列表、字典、序列、数据帧、NumPy 数组等。

### Pandas 库可以处理各种文件格式

有各种各样的文件格式。用于数据分析的工具必须能够提供处理各种文件格式的方法。

Pandas 可以读取各种文件格式，例如 CSV 文件、JSON 文件、XML 文件、Parquet 文件、SQL 文件，详见下表。

|  | 写入 | 读取 |
| --- | --- | --- |
| CSV 文件 | `to_csv` 函数 | `read_csv` 函数 |
| JSON 文件 | `to_json` 函数 | `read_json` 函数 |
| Parquet 文件 | `to_parquet` 函数 | `read_parquet` 函数 |
| SQL 文件 | `to_sql` 函数 | `read_sql` 函数，`read_sql_query` 函数，`read_sql_table` 函数 |
| XML 文件 | `to_xml` 函数 | `read_xml` 函数 |

### 使用 Pandas 进行数据清理

在现实场景中，很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况，如果要对使数据分析更加准确，就需要对这些没有用的数据进行处理。此外，数据还会有需要 <ruby> 屏蔽 <rt>  mask </rt></ruby> 的敏感和机密信息。接下来，Pandas 提供了清理、丢弃、替换、屏蔽等方法，来处理这些坏数据。

#### Pandas 清洗空值：

a. 空行可以使用 `df.dropna(inplace=True)` 方法来删除。

b. 空值可以使用 `df.fillna(<value>, inplace=True)` 方法来替换。还可以指定某一个列来替换该列的空数据。

#### Pandas 屏蔽数据：

c. 要屏蔽所有不满足条件 `my_list.where(my_list < 5)` 的敏感数据的值，可以使用 `my_list.mask(my_list < 5)`。

#### Pandas 清洗重复数据：

d. 要删除重复数据，可以使用 `drop_duplicates()` 方法：

```
df.drop_duplicates(‘<column>’, keep = False)
df.drop_duplicates(‘<column>’, keep = ‘first’)
df.drop_duplicates(‘<column>’, keep = ‘last’)

```

### 使用 Pandas 进行数据分析

下面的表格列出了 Pandas 中进行数据分析的各种函数，以及其语法。（请注意：`df` 代表一个 <ruby> 数据帧 <rt>  DataFrame </rt></ruby> 数据结构的实例。）

| 语法 | 描述 |
| --- | --- |
| `df.head(x)` | `head()` 函数用于读取前面的 x 行，如果不填参数 x，默认返回 5 行 |
| `df.tail(x)` | `tail()` 函数用于读取尾部的 x 行，如果不填参数 x ，默认返回最后 5 行，空行各个字段的值返回 NaN |
| `loc(x:y)` | Loc 函数返回指定行的数据，也可以对数据进行切片 |
| `groupby('<column>')` | 对指定列的数据进行分组 |
| `df['column'].sum()` | 计算指定列数据的总和 |
| `df['column']. mean()` | 计算指定列数据的算术平均值 |
| `df['column'].min()` | 计算指定列数据的最小值 |
| `df['column'].max()` | 计算指定列数据的最大值 |
| `df.sort_values(['column'])` | 在指定列上根据数值进行排序，默认升序 |
| `df.size` | 返回元素的个数，即为行数 \* 列数 |
| `df.describe` | 返回对各列的统计汇总 |
| `pd.crosstab(df['column1'], df['column2'], margins = True)` | 创建 `column1` 和 `column2` 的交叉表 |
| `df.duplicated([column1, 'column2'])` | 根据 `column1` 和 `column2` 中的重复值，返回 `True` 或 `False` |

### Pandas 的优点

* 支持多索引（层次索引），方便分析多维数据。
* 支持数据透视表的创建，堆栈和取消堆栈操作。
* 可以使用 Pandas 处理有限值的分类数据。
* 支持分组和聚合运算。
* 可以禁用排序。
* 支持行级过滤（获取满足过滤条件的行）和列级过滤（只选择需要的列）。
* 有助于重塑数据集（数组的维度变换）。还可以转置数组的值，并转换为列表。当你使用 Python 处理数据时，可以将 Pandas 数据帧转换为多维 NumPy 数组。
* 支持面向标签的数据切片。

### Pandas 的不足

Pandas 的代码和语法与 Python 不同，所以人们需要额外再学习 Pandas。此外，相较于 Pandas，像三维数据这样的高维数据会在 NumPy 等其他库有更好的处理。

### 总结

Pandas 能够大幅提升数据分析的效率。它与其他库的兼容性使它在其他 Python 库中都能有效地使用。

---

via: <https://www.opensourceforu.com/2022/08/pandas-the-popular-python-library-for-data-analysis-and-data-science/>

作者：[Phani Kiran](https://www.opensourceforu.com/author/phani-kiran/) 选题：[lkxed](https://github.com/lkxed) 译者：[chai001125](https://github.com/chai001125) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #894 欧盟拟议的《网络弹性法案》可能对开源产生可怕的影响

Summary:
? 欧盟拟议的《网络弹性法案》可能对开源产生可怕的影响
? 美国联邦调查局黑掉了勒索团伙
? 2022 年 FreeBSD 没有达到筹款目标
»
»

![](/data/attachment/album/202301/27/183526m9m3f07vcua0vmvu.jpg)

![](/data/attachment/album/202301/27/183533yx2s7wswduux7y46.jpg)

### 欧盟拟议的《网络弹性法案》可能对开源产生可怕的影响

欧盟拟议的《网络弹性法案（CRA）》被称之为软件产品的 “CE 标志”。它有四个具体目标，其中之一要求制造商在 “整个生命周期” 内提高数字产品的安全性。对于软件开发商和硬件制造商来说，这将增加新的网络安全要求、合格评估、文件和报告义务的直接合规成本。这个成本预计将达到 290 亿欧元，但预计可以减少安全事件带来的成本为 1800 至 2900 亿欧元。问题是，自由软件开发者如何能够承担合规成本？这可能打破了开源生态系统的社会契约：免费提供用于任何目的的开源软件，可以自由修改和进一步分发，但作者、贡献者或开源分销商没有保证或责任。

>
> **[消息来源：Dev Class](https://devclass.com/2023/01/24/eus-proposed-ce-mark-for-software-could-have-dire-impact-on-open-source/)**
>
>
>

>
> 老王点评：我觉得，开源软件的基石不容触动，CRA 尽可以去约束那些商业的专有软件。
>
>
>

![](/data/attachment/album/202301/27/183600y44xhdg2vccczvhv.jpg)

### 美国联邦调查局黑掉了勒索团伙

美国联邦调查局的政府黑客闯入了勒索团伙 Hive 的网络，并对该团伙进行了监视，窃取了该团伙用来解锁数据的数字密钥。然后他们提前提醒受害者，以便他们能够在 Hive 要求付款之前保护他们的系统。美国司法部表示，多年来，Hive 入侵了 80 个不同国家的 1500 多名受害者，勒索金额超过了 1 亿美元。周四，Hive 的网站被查封，并在该网站显示了查封信息。政府黑客对 Hive 的监视从 2022 年 7 月开始直到被查封前，都没有被 Hive 发现。

>
> **[消息来源：路透社](https://www.reuters.com/world/us/announcement-posted-hive-ransomware-groups-site-says-it-has-been-seized-by-fbi-2023-01-26/)**
>
>
>

>
> 老王点评：政府黑客技高一筹啊，看来是懒得和勒索黑帮玩下去了。
>
>
>

![](/data/attachment/album/202301/27/183619eqbhuq7uaanuab77.jpg)

### 2022 年 FreeBSD 没有达到筹款目标

FreeBSD 发布了其 2022 年第四季度的状态报告。根据报告，他们 2022 年的筹款目标是 140 万美元，而截至现在大约是 114.7 万美元。他们正在考虑引进一个能够鼓励组织投资于 FreeBSD 的人。报告中其中值得关注的信息还有：发布工程团队正在努力推出 FreeBSD 13.2；正在开发集成应用容器 Vessel，以类似 Docker 的界面向应用开发者展示许多 FreeBSD 的特性。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/FreeBSD-Q4-2022-Highlights)**
>
>
>

>
> 老王点评：FreeBSD 的日子比起来 Linux 惨淡得多，但是 FreeBSD 依旧带来了很多技术进步。
>
>
>

### 回音

* AI 律师（[#874](/article-15422-1.html)）背后的公司受到多个州的律师协会 [起诉](https://www.npr.org/2023/01/25/1151435033/a-robot-was-scheduled-to-argue-in-court-then-came-the-jail-threats)，称未经授权进行律师执业活动在某些州属于轻罪，因此原定于 1 月 22 日的 AI 律师参与的庭审被取消了。


Twitter 和 Mastodon 的四个关键区别

![](/data/attachment/album/202301/28/093152q9c5yeo9dyebp2mj.jpg)

>
> Mastodon 并不是一家公司。所有 Mastodon 实例都由各自所属服务器的贡献者负责支持维护的。以下是它的一些其他优势。
>
>
>

社交媒体并不总是社交性的，有时我们还需要足够的推动力来改变我们工作和阅读的内容。我在 2008 年开始使用 Twitter 作为 RSS 阅读器的替代品，这彻底颠覆了我那时的阅读和学习方式。世界各地的教育家和自由与开放源码（FOSS）倡导者的推文让我了解并参与到一个无与伦比的学习网络中。但这在过去的六年间，事情发生了变化，以及最近它的所有权发生了变化，造成我阅读的内容更多是由算法驱动的，而不是出于我个人的兴趣和选择。在几年前的 [Opensource.com](http://Opensource.com) 记者编辑碰头会中，[Seth Kenlon](https://opensource.com/users/seth) 建议我试试 [Mastodon](https://joinmastodon.org/)。于是我在 2019 年加入了 [Fosstodon](https://fosstodon.org/about/)。Fosstodon 是一个专为喜欢自由和开源软件的同好们搭建的实例。

### Mastodon 与 Twitter 对比

作为一个墨守成规的人，改变对我来说并不容易，尽管 Twitter 变得越来越让人厌倦，我还一直在使用。可是到了 2022 年的春天，Twitter 的出售危机让我重新考虑使用 Fosstodon 了。

### 1、收藏而不是点赞

Mastodon 的界面与 Twitter 很相似。但在 Mastodon上，你不是“点赞”一个帖子，而是通过点击帖子下方的星标来“收藏”一个帖子。

![Favorite button](/data/attachment/album/202301/28/093244liigtfitbbgh5flp.jpg)

### 2、分享帖子

在 Twitter 上，重新分享是“<ruby> 转推 <rt>  retweet </rt></ruby>”，但在 Mastodon，它是“<ruby> 转嘟 <rt>  boost </rt></ruby>”。你可以点击帖子下方的双箭头图标来转嘟。

![Boost button](/data/attachment/album/202301/28/093250tmcqlmg7xrqcfqtw.jpg)

### 3、Mastodon 实例

任何人都可以运行一个 Mastodon 实例，这让不同的实例上发展出了独特的社区（类似在 Twitter 上围绕特定标签形成的社区，不过 Mastodon 也有标签），有些实例有一套独特的规则。举个例子，和我以前的社交网络不同，Fosstodon 上采取了内容审核制度。最初这让我觉得有些严格，我发了一个与自由与开放源码软件无关的帖子，然后帖子就被删除了。我被告知的删除原因是，我没有给帖子打上 “内容警告”。这惹怒了我，于是我尝试寻找别的实例，发现了几个更符合我胃口的。其中一个是 [Mastodon.social](https://mastodon.social/about)，另一个是 [Scholar.social](https://scholar.social/about/more)，前者是一个泛用的实例，没有预设的发帖主题，后者则是一个学术专用的实例。当然，他们也都制定有严格的行为规范。

每个实例都有规则，虽然在表述上略有不同，但都清楚地说明了可以接受和不可接受的行为。Fosstodon 公布了它的 [行为规范](https://hub.fosstodon.org/coc/)，确立了站点的规则和预期。

### 4、开源社交网络

如果你也想运行自己的 Mastodon 实例或协助开发一个，好消息是，Mastodon 是开源的。它使用 AGPLv3 许可证，它的源代码可以在 [Git 仓库](https://github.com/mastodon/mastodon) 获得。Mastodon 使用 [ActivityPub](https://en.wikipedia.org/wiki/ActivityPub) 协议与世界各地的服务器通信。

Mastodon 不是互联网上的单一的网站，而是一系列横跨全球并相互通信的网站们。这个联邦网络被称为 “<ruby> 联邦宇宙 <rt>  Fediverse </rt></ruby>”。不像其他社交网站有单一的所有者，任何人都可以在服务器上运行 Mastodon 或者其他 ActivityPub 协议网站。

从用户的角度来看，这一开始时其实并不重要。你可以在任何 Mastodon 实例上注册，然后连接到其余所有的实例。

不过，这种分布式设计是有其好处的。如果你碰见一个实例上的社区内容你不想看，你可以从屏蔽该实例中的某个用户，或者屏蔽整个实例。

过去的一个月里，我又回到了 Fosstodon，主要还是因为我热衷开源。我很享受在 Fosstodon 上分享开源内容，而 Fosstodon 上的其他用户也都能乐于看到关于自由和开源软件的帖子。当我有一些内容不适合在 Fosstodon 上分享时，我会分享到 Scholar.social 或者 Mastodon.social 上。

不是所有的实例都有关注的主题，即便是那些有主题的实例，主题常常也是仅作参考，而不是严格作为删帖的依据。如果你有特定的兴趣，也许就能找到一个围绕这个话题建立的社区，然后马上就能收获及时的关注。当然，你也依然能够与其他实例的用户交流。

### 试试 Mastodon

Mastodon 不是一家公司，所有 Mastodon 实例都是由各自所属的服务器的贡献者负责支持维护的。有些能很容易地通过 Patreon 或 PayPal 提供支持。

我发现，联邦宇宙是个很温馨的地方，把快乐带回给了社交网络。你加入了 Mastodon 了吗？有没有什么收获？请在评论中告诉我们。

---

via: <https://opensource.com/article/22/11/twitter-vs-mastodon>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[lkxed](https://github.com/lkxed) 译者：[onionstalgia](https://github.com/onionstalgia) 校对：[wxy](https://github.com/wxy)

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


在 Linux 上用 zram 替代传统交换空间

Summary: zram 是一个用于创建内存压缩缓存的工具，特别是可以用作交换空间。

会不会出问题，剩余空间和使用空间不好精确计算？

zram 是一个用于创建内存压缩缓存的工具，特别是可以用作交换空间。

![](/data/attachment/album/202301/28/113826twvkkbrso9ws2kss.jpg)

>
> zram 是一个用于创建内存压缩缓存的工具，特别是可以用作交换空间。
>
>
>

我在我的电脑上花了很多时间（我是说工作），我发现了很多有趣的东西。其中最近引起我注意的是 `zram0` 设备。我是在几个月前写一篇文章时第一次注意到它，它显示在 `lsblk` 命令的输出中：

```
# lsblk
NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda             8:0    0 931.5G  0 disk
├─sda1          8:1    0   600M  0 part
[...]
zram0         252:0    0     8G  0 disk [SWAP]

```

它被识别为交换空间，这就是首先引起我的好奇心的原因，所以我做了一些研究。zram 最初被称为 “<ruby> 压缩缓存 <rt>  compcache </rt></ruby>”，即 “压缩的高速缓存”。事实证明，zram 是一个用于创建内存内压缩缓存的工具，特别是作为交换空间使用。

但为什么呢？

当我开始研究 zram 时，我只发现了几篇关于将 zram 用于交换空间的基础文章。起初，这对我来说似乎有点违反直觉。毕竟，如果你的内存快用完了，你把页面交换到内存中的虚拟驱动器中，有什么好处呢？

然后我找到了 Fedora 项目的维基页面，它提议使用 <ruby> <a href="https://fedoraproject.org/wiki/Changes/SwapOnZRAM">  zram 交换空间 </a> <rt>  swap-on-zram </rt></ruby>。该建议说：“交换是有用的，除了它的速度很慢。zram 是一个使用了压缩的内存驱动器。在启动时创建一个 zram 交换空间，并且不再使用默认的交换分区。”

该页面的其余部分是关于它的细节、好处、副作用和反馈。

### Linux 上用于交换空间的 zram

使用 zram 作为交换空间，与常规的基于分区或基于文件的交换空间做的事情相同。当内存压力过大时，一些最近使用最少的数据会被移到交换空间。平均来说，它会被压缩到其原始大小的 50% 左右，并被放置在内存的 zram 空间中。这比将这些内存页存储在硬盘上要快得多，并可以释放出它所使用的内存用于其他用途。

### 节省交换空间

我试图找到关于配置多少交换空间或 zram 交换空间的总结建议。这使我重新回顾了交换空间的设置，以及我之前的文章《[现代 Linux 系统的正确交换空间是多少？](https://opensource.com/article/19/2/swap-space-poll)》。就我所知，从 RHEL 和 Fedora 的最新文档来看，推荐的交换空间数量并没有改变。不过，该文档忽略了 zram 的使用。

然而，在不使用 zram 的旧版 Linux 或 zram 被禁用的情况下，之前文章中的表格仍然为交换空间的分配提供了一个好的起点。

我找到的关于 zram 功能的文档在 zram 如何根据内存大小分配空间，以及分配给 zram 交换空间的数量方面是不一致的。

由于缺乏权威性的文档，我进行了一些实验来凭经验确定用于分配 zram 交换空间的算法。我为此使用了我自己的物理和虚拟系统。结果很有趣，与我迄今为止发现的任何文档都不一致。

在所有足够大的系统上，zram 的默认大小是 8GB，但在内存较小的主机上通常会大大减少。在我用于测试的一台虚拟机（VM）上，可以访问 4GB 的内存，zram 的虚拟交换空间被分配为 3.8GB。我的一台旧戴尔电脑拥有 8GB 的内存，zram 被设置为 7.6GB。当内存减少到 2GB 时，zram 就减少到 1.9GB。

我拥有的所有内存超过 8GB 的物理和虚拟主机都显示正好是 8GB 的 zram。这包括我拥有 64GB 内存的主工作站和其他拥有 16GB 或 32GB 内存的主机。

基于这几个数据点，我可以得出这样的结论：目前的默认设置是最多 8GB 的 zram，而在 8GB 或以下的主机上，zram 占内存的 95%。

我读过一些文章，其中提到了 zram 交换空间的其他大小，甚至高达 100% 的内存，但这些似乎都是理论上的，而不是现实。

你的发行版可能不同，但这里是 Fedora 和类似发行版的实际 zram 交换空间的分配情况：

* 内存 ⇐ 8 GB：0.95 × 内存
* 内存 > 8 GB:8 GB

请注意，zram 交换空间大小的算法并没有基于对任何给定的现实世界的系统或应用程序的 “最佳” 交换大小的建议。这种 zram 交换空间的分配是一种相当概率性的方法，它应该在广泛的 Linux 主机上运行良好。然而，最大的 zram 交换空间大小被配置为 8GB，而且我一直推荐 8GB 作为传统交换空间的最大容量，我想我可以说它反映了 zram 交换空间的最佳大小。

### 管理 zram 交换空间

zram 的默认值保存在 `/usr/lib/systemd/zram-generator.conf` 配置文件中。以下是我的一个测试虚拟机，分配了 5097GB 的内存。

```
# cat /usr/lib/systemd/zram-generator.conf
# This config file enables a /dev/zram0 device with the default settings:
# - size - same as available RAM or 8GB, whichever is less
# - compression - most likely lzo-rle
#
# To disable, uninstall zram-generator-defaults or create empty
# /etc/systemd/zram-generator.conf file.
[zram0]zram-size= min(ram, 8192)

```

你可以在 `zram-generator.conf` 配置文件的最后一行改变默认的 zram 交换空间大小。但我建议不要这样做，除非你能明确说明这样做的原因，并在你做任何改变后测试你的结果。像 Linux 中的许多其他配置默认值一样，zram 的默认值已经被很好地测试过了，适合大多数使用情况。

### 监控 zram

可以使用 `zramctl` 工具来查看 zram 的当前状态。

```
# zramctl
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle       4.8G   4K   80B   12K       4[SWAP]

```

传统的 `swapon` 命令也可以用来查看交换，包括作为交换使用的 zram：

```
# swapon --show
NAME       TYPE      SIZE USED PRIO
/dev/zram0 partition 4.8G   0B  100

```

需要注意的是，`zramctl` 在不包含数据时不报告 zram，所以结果会包含空输出。而像 `lsblk`、`swapon`、 `top`、`free`、`htop` 等工具，即使不包含数据，也会显示 zram。

### 停用 zram

`swapoff -a` 命令会关闭 zram 交换空间以及用作交换的传统 HDD 或 SSD 存储。`swapon -a` 命令在 zram 为空时不显示它，可以使用 `zramctl /dev/zram0` 代替。

```
# swapon --show# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:00  120G  0 disk
├─sda1          8:10    1G  0 part /boot/efi
├─sda2          8:20    1G  0 part /boot
└─sda3          8:30  118G  0 part
  ├─vg01-root 253:00   10G  0 lvm  /
  ├─vg01-swap 253:10    3G  0 lvm  [SWAP]
  ├─vg01-usr  253:10   30G  0 lvm  /usr
  ├─vg01-home 253:20   10G  0 lvm  /home
  ├─vg01-var  253:30   30G  0 lvm  /var
  └─vg01-tmp  253:40   10G  0 lvm  /tmp
sr0            11:01 1024M  0 rom
zram0         252:00    0B  0 disk
# zramctl## zramctl /dev/zram0
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle         0B   0B    0B    0B       4

```

注意，`/dev/zram0` 在这些命令中并没有显示为交换空间，直到它被用于该目的。这给我造成了一些困惑，直到我的实验表明这是事实。

### 创建 zram 交换空间

zram 本身已经存在了大约 20 年，但只是在过去的一两年里才在一些发行版上作为交换空间使用。你的一些或所有主机上当前的 Linux 环境可能没有用 zram 创建交换空间。如果是这种情况，它可以很容易地被补救。

对于 Fedora 32，它是默认使用 zram 交换空间之前的最后一个版本，它只需要三个简单的命令。

首先，验证是否存在 `zram-swap.service` 文件，它作为 `zram` RPM 包的一部分安装：

```
# systemctl status zram-swap
● zram-swap.service - Enable compressed swap in memory using zram
     Loaded: loaded (/usr/lib/systemd/system/zram-swap.service; disabled; vendor preset: disabled)
     Active: inactive (dead)

```

接下来，安装 `zram-generator-defaults` 和 `zram-generator` 软件包：

```
# dnf install zram-generator-defaults zram-generator

```

启用并启动 `zram-swap` 服务：

```
# systemctl enable zram-swap.service# systemctl start zram-swap.service

```

然后验证 `zram0` 是否存在并被用作交换空间：

```
# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:00  120G  0 disk
├─sda1          8:10    2G  0 part /boot
└─sda2          8:20  118G  0 part
  ├─vg01-root 253:00   10G  0 lvm  /
  ├─vg01-swap 253:10    3G  0 lvm  [SWAP]
  ├─vg01-usr  253:20   35G  0 lvm  /usr
  ├─vg01-tmp  253:30   15G  0 lvm  /tmp
  ├─vg01-var  253:40   35G  0 lvm  /var
  └─vg01-home 253:50   20G  0 lvm  /home
sr0            11:01 1024M  0 rom
zram0         252:00  7.5G  0 disk [SWAP]

```

### 用 zram 改进交换空间

这就是全部内容了。在 Fedora 上这很容易。不同的发行版可能也一样简单，只是软件包名称和命令的细节可能不同。在你的电脑上试试 zram 交换空间吧。在我的下一篇文章中，我将进一步演示一些 zram 选项。

---

via: <https://opensource.com/article/22/11/zram-swap-linux>

作者：[David Both](https://opensource.com/users/dboth) 选题：[lkxed](https://github.com/lkxed) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #895 英特尔砍掉了 Pathfinder for RISC-V 项目

Summary:
? 英特尔砍掉了 Pathfinder for RISC-V 项目
? 奔驰成为美国首家获得三级自动驾驶认证的汽车公司
? 《科学》期刊禁止将 ChatGPT 列为论文的共同作者
»
»

低功耗有Arm，高性能有x86。RISC-V 没有明显的竞争优势。

![](/data/attachment/album/202301/28/173418hinjznidyrsujjzu.jpg)

![](/data/attachment/album/202301/28/173407fzva0yfjmoir0wui.jpg)

### 英特尔砍掉了 Pathfinder for RISC-V 项目

英特尔 2022 年第四季度灾难性地亏损了 6.61 亿美元，市值跌掉 80 亿美元，利润率跌至几十年来的最低点。在此形式下，英特尔宣布砍掉了一系列项目，包括 Pathfinder for RISC-V 项目。该项目是英特尔探索新 CPU 开放架构的一次尝试，旨在帮助加速开发 RISC-V 芯片，允许用户构建 RISC-V 芯片然后运行在 FPGA 上。直接砍掉该项目意味着这次尝试的失败。

>
> **[消息来源：Tom's Hardware](https://www.tomshardware.com/news/intel-sunsets-network-switch-biz-kills-risc-v-pathfinder-program)**
>
>
>

>
> 老王点评：毕竟，固守发家的主业还是更可靠些，但这给 RISC-V 的发展蒙上了阴影。
>
>
>

![](/data/attachment/album/202301/28/173433nos7llzh3mk77ygy.jpg)

### 奔驰成为美国首家获得三级自动驾驶认证的汽车公司

周四，奔驰确认其 Drive Pilot 自动驾驶辅助系统（ADAS）现在符合内华达州第 482A 章的要求，成为目前美国唯一合法的三级自动驾驶系统。第三级能力将使车辆在参与时能够处理 “所有方面的驾驶”，这比我们今天看到的二级系统，如特斯拉的 “完全自动驾驶”、福特的 “蓝色巡航” 和通用的 “超级巡航”，有了很大的进步。奔驰称，其 ADAS 可以“在 40 英里/小时的速度范围内接管保险杠对保险杠的爬行任务，而驾驶员不需要将手放在方向盘上。” 甚至可以对 “意外的交通情况作出反应并独立处理，例如，在车道内进行规避动作或进行制动动作。”

>
> **[消息来源：Engadget](https://www.engadget.com/mercedes-first-certified-level-3-autonomy-car-company-us-201021118.html)**
>
>
>

>
> 老王点评：原本我以为会是特斯拉率先推出三级自动驾驶辅助系统的。
>
>
>

![](/data/attachment/album/202301/28/173449o6nk34f4k1gvnbbh.jpg)

### 《科学》期刊禁止将 ChatGPT 列为论文的共同作者

《科学》期刊宣布了一项更新的编辑政策，禁止使用 ChatGPT 生成的文本，并澄清该程序不能被列为作者。《科学》期刊要求作者签署一份表格，声明他们对自己对工作的贡献负责任，而由于 ChatGPT 不能这样做，所以它不能成为作者。此外，他们认为，即使在准备论文时使用 ChatGPT 也有问题。因为 ChatGPT 会犯很多错误，这些错误可能会出现在文献中，如果科学家们开始依赖人工智能程序来准备文献综述或总结他们的发现，那么工作的正确背景和结果应有的深入审查就可能会丢失。

>
> **[消息来源：《卫报》](https://www.theguardian.com/science/2023/jan/26/science-journals-ban-listing-of-chatgpt-as-co-author-on-papers)**
>
>
>

>
> 老王点评：有一定的道理，但是我认为是徒劳的，就像你不可能阻止使用计算器一样。计算器本身并不能替你完成全部求解，只是一个辅助工具。经过 AI 辅助的研究论文终究会找到它应有的位置。
>
>
>


开源代码评审的十个通用步骤

Summary: 只要你遵循这些通用流程，代码评审并不可怕。

看懂别人的代码比自己写一遍要难多了。

只要你遵循这些通用流程，代码评审并不可怕。

![](/data/attachment/album/202301/29/140840wsbypukbubp69buv.jpg)

>
> 只要你遵循这些通用流程，代码评审并不可怕。
>
>
>

你是否需要在你还没有完全理解整个项目时就对代码进行评审？抑或你避开了评审，以免让你看起来不知道如何进行。

本篇文章想要告诉你一个更好的方法。<ruby> 代码评审 <rt>  code review </rt></ruby> 并不需要你知道所有事情。实际上，就我个人经验而言，这种情况非常普遍。

我还记得作为实习生加入 <ruby> 红帽 <rt>  Red Hat </rt></ruby> 的时候，被要求参与代码评审。我们当时采取的是 +1 或 -1 的投票系统，而我在一开始的时候常常踌躇于该如何评审。我发现我会问自己，如果我对于一处改动给予了 +1，而别人却投了 -1，我是不是看起来很蠢？

如果你对一处改动投了 +1，而别人投了 -1，这又意味着什么呢？答案是不意味任何事！你可能只是漏掉了一处别人注意到的细节。这不意味着世界末日。这也是为什么我们会用投票系统。正如同所有开源项目一样，代码合并是一项协同工作。

最近，我接到了太多的代码评审工作，以至于我几乎做不过来。我同时也注意到，参与评审的贡献者数量正在稳步减少。

出于这个原因，我想要写一篇文章阐述我对代码评审的个人观点。在这篇文章里，我会分享一些诀窍与技巧。我将会向你展示几个用来问自己的问题，以及在评审代码时需要注意的一些地方。

### 代码评审的目的是什么？

你是否曾写过一个非常简单的补丁？你认为它是如此微不足道，不需要审查。或许你直接就合并了它。直到晚些时候，你意识到你犯了个错误，一个明显的或是愚蠢的错误，比如错误的缩进，比如几行重复的代码而不是调用函数（是的，这些都是经验之谈！）。

如果有其他人来审查代码，就会发现这些东西。

代码评审的一个目的便是为你带来一双新的眼睛，从新的视角看待你要尝试解决的问题。这种新的背景也正是为什么代码评审至关重要。

你可能认为你必须是一个语言专家，才能审查别人的代码、项目，或两者。让我来告诉你一个所有代码评审者都想跟你说的秘密吧：大错特错！你并不需要完全理解该项目或者编程语言，就可以为一个改动提供全新的视角。下面，我将向你展示代码评审的通用流程。

### 代码评审的通用流程

这是我的代码评审流程，拆分成了几个要点。这个流程包含了我会问自己的一些问题，以帮助我专注于代码的变化以及其后果。你不需要严格依照这个顺序来进行评审。如果有任何原因导致你无法执行其中的某一步，跳过那一步就好。

#### 1、理解改动，它想要解决的问题，以及为什么要这么做

为什么需要改动的解释以及任何相关背景都应该被放在 <ruby> 提交 <rt>  commit </rt></ruby> 信息里。如果没有，请要求提供，并请投 -1 直到相关信息被提供。

改动想解决的问题需要被解决吗？它是项目应当关注的问题，还是与项目完全无关？

#### 2、你会如何实现解决方案？它会不一样吗？

在这个时候，你应该已经知道代码改动是为了什么。换做是你会怎么做？在进一步对改动进行细节评审前，先思考这个问题。如果你想出了一个不一样的解决方案，并且你认为你的方案更好，在评审中提出来。你不需要投 -1；去问问作者为什么没有往那个方向走，看看这次讨论会把你们带向何方。

#### 3、运行有改动和没有改动的代码

我通常会在代码中设置几个断点，运行代码并检查新代码是如何与其余部分互动的。

如果你无法运行整个代码，试着将带有新代码的函数复制到一个新的本地文件，模拟输入数据，然后运行。这在你不知道怎么运行整个项目，或者无法接触到运行所需的特殊环境时很有帮助。

#### 4、新代码会破坏任何东西吗？

我是说，任何东西。想一想可能的后果。

以一个新的命令行选项为例，它会总是被目标所接受吗？

是否存在这样一种情况，使得新选项无法被接受或是会与其他东西起冲突？

或许新代码是导入了新的东西。那么这个新的库，以及可能的新的依赖关系，能够在老版本或者项目的运行系统中被找到吗？

安全方面呢？新的依赖足够安全吗？你至少可以在网上快速地搜索一下。还有，注意一下控制台日志里的警告。有的时候在同一个库里也可以找到更安全的函数。

#### 5、新代码是否有效？

你刚刚确认了被提出的解决方案大概是正确的。现在该检查代码本身了。你需要关注代码的有效性和必要性。

检查新代码的风格。它与项目的代码风格相匹配吗？任何开源项目都（应该）有一份文档告知（新）贡献者项目所遵循的风格和优秀实践。

比如说，OpenStack 社区的所有项目都有一份 HACKING.rst 文件。你经常也能找到一份[新贡献者指南](https://docs.openstack.org/tempest/latest/contributor/contributing.html)包含所有必须知道的信息。

#### 6、确认所有新增的变量和导入都被使用

你正在评审的代码常常已经过多次迭代，有的时候代码的最终版本与初始版已迥然不同。所以我们很容易忘记一些在历史版本中加入的变量与引用。自动化检测通常会用到 lint 工具，类似 Python 中的 [flake8][12]。

（LCTT 译注：[lint](https://codedocs.org/what-is/lint-software) 指编程中用来发现代码潜在错误和约束代码风格的工具，起源于 C 语言编程中的静态分析工具 `lint`。“lint” 本意为衣服上积累的绒毛与灰尘，“lint” 的取名寓意则在于捕捉编程时产生的“绒毛与灰尘”）

（LCTT 校注：我建议，“Lint” 工具可以翻译为 “代码清理” 或 “代码清洁” 工具。）

你可以在不声明新变量的情况下重写代码吗？通常情况下你可以，但问题是这样是否更好。这会带来什么益处吗？我们的目标不是要创造尽可能多的单行代码，而是写出高效且易读的代码。

#### 7、新的函数和方法是否必要？

项目里的别的地方是否存在可以被复用的功能类似的函数？确保避免重新发明轮子以及重新实现已经被定义的逻辑永远都是值得的。

#### 8、有单元测试吗？

如果补丁增加了新的函数或者在函数内添加了新的逻辑，它也应该附带对应的单元测试。新函数的作者总是比别人更适合写该函数的单元测试。

#### 9. 验证重构

如果这次提交对现有代码进行了重构（它可能重命名了某个变量，或者是改变了的变量的作用域，或者是通过加减参数来改变函数的足迹，又或者是删去了某个东西），问一问你自己：

* 这个可以被删除吗？它会影响到稳定分支吗？
* 所有出现的地方都删掉了吗？

你可以利用 [grep 命令](https://opensource.com/downloads/grep-cheat-sheet) 来查找。你不会相信有多少次我投 -1 就是因为这个。这是一个任何人都会犯的简单错误，也正因如此任何人都可以发现它。

提交的所有者很容易忽略这些事情，这完全可以理解。我也犯过很多次这种错误。我最终发现问题的根源在于我太急于提出评审，以至于我忘记了对仓库进行整体检查。

除了对项目仓库的检查外，检查其他代码用户也十分必要。如果有别的项目导入了这个项目，它们可能也需要进行重构。在 OpenStack 社区中，我们有对应的工具来查询别的社区项目。

#### 10、项目文档是否需要做出更改？

你可以再一次使用 [grep 命令](https://www.redhat.com/sysadmin/how-to-use-grep) 来检查在项目文档中是否提到了相关的代码改动。用常识来判断这次改动是否需要被收入文档以告知最终用户，还是只是一个不会影响用户体验的内部变化。

#### 额外提示：考虑周到

当你在评审完新代码后提出建议或评论时，要考虑周到，反馈准确，描述详尽。如果有你不理解的地方就发出提问。如果你认为代码存在错误，解释你的理由。记住，如果作者不知道什么地方出了问题，他们就无法修复它。

### 最后几句

唯一的坏评审是没有评审。通过评审和投票，你提供了你的观点并为此投票。没有人指望你来做出最终决定（除非你是核心维护者），但是投票系统允许你提供你的观点和意见。相信我，补丁所有者会很高兴你这么做了的。

你能想到别的要点来给出好的评审吗？你是否有我不知道的特殊技巧？在评论中分享它们吧！

---

via: <https://opensource.com/article/22/10/code-review>

作者：[Martin Kopec](https://opensource.com/users/martin-kopec) 选题：[lkxed](https://github.com/lkxed) 译者：[yzuowei](https://github.com/yzuowei) 校对：[wxy](https://github.com/wxy)

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


GNOME 的研究报告称 90% 以上的系统都安装了 Flatpak

这也不客观呀，像Fedora 默认就装有 Flatpack。

我还在apt呢看来我是少数咯

>
> GNOME 的调查数据揭示了一些令人感兴趣的用户偏好。这是否会影响 GNOME 在不久的将来的开发决策？让我们拭目以待。
>
>
>

![GNOME 的研究报告说，超过 90% 的系统安装了 Flatpak](/data/attachment/album/202301/29/151551o4zomo3001k4yvam.jpg)

在 2022 年 8 月，GNOME 开发了 [一个工具](https://news.itsfoss.com/gnome-improve-tool/)，让用户可以匿名提供关于他们的系统配置、扩展和 GNOME 调整的设置。

这是为了**帮助 GNOME 深入了解**用户的偏好，并在分析数据的基础上做出更好的决定。

GNOME 设计团队的成员 [Allan Day](https://twitter.com/allanday) 在最近的一篇博文中分享了收集的数据。它包含了一些有趣的洞察和发现。

让我带你了解一下：

### 研究报告的发现

本研究报告包括来自 2,517 个用户的数据，这些用户的硬件和软件配置各不相同。

>
> ? 这些数据是使用 [gnome-info-collect 工具](https://gitlab.gnome.org/vstanek/gnome-info-collect/) 从向 GNOME 提供数据的人那里获得的，并不代表 GNOME 的全部用户。
>
>
>

最初，他们收到了 2,560 个回复，但由于一些数据没有来自使用 GNOME 的系统或来自虚拟机，他们不得不从数据集中删除一些。

它包含什么？它含有匿名的非敏感数据指标，显示了用户是如何设置他们的系统的。

>
> ? 这对 GNOME 团队来说可以有很大的用处，他们现在可以使用这些数据来做出设计和开发的决定。
>
>
>

其中一个引起我们注意的数据指标是在他们的 GNOME 系统上使用 Flatpak 的人的百分比。

**超过 90% 的系统都安装了 Flatpak。**

在 2517 个用户中，有高达 2344 个用户在他们的 GNOME 系统上安装了 Flatpak。其中 2,102 人完全启用了它。

在这样一个小的数据集中，这是一个巨大的数字！ ?

关于这一点，Allan 有这样的补充说明：

>
> Flatpak 和 Flathub 对 GNOME 的战略方向至关重要，所以了解它们的采用程度是很有用的。这种采用程度也与 GNOME 的软件应用设计有关。
>
>
>

除此之外，一些关键的收获包括：

* 最常用的默认网页浏览器是 Mozilla Firefox。
* 在使用 GNOME 的人中，最常用的发行版是 Fedora。
* 谷歌是配置了在线账户的用户的首选账户。
* GIMP 是安装在 GNOME 上最受欢迎的应用程序之一，紧随其后的是 VLC。
* 83% 的用户至少启用了一个 GNOME 扩展。

我建议你通过该 [研究报告](https://blogs.gnome.org/aday/2023/01/18/gnome-info-collect-what-we-learned/) 来获得更深入的了解。

### 这是否有助于改善 GNOME 的体验？

收集这些数据是为了通过分析和提供给设计和开发团队来改善桌面体验。

然而，收集到的数据仍然相当有限，可能无法代表大多数的 GNOME 用户。

为了解决这个问题，博文中提到：

>
> 总的来说，这些数据对于 GNOME 项目应该专注于哪些功能给出了一些有力的提示。它也提供了关于哪些功能不应该被优先考虑的证据。需要记住的是，虽然我们在这里有关于一些 GNOME 用户做出的决定的证据，但这些数据并没有让我们深入了解为什么他们会做出这样的决定。
>
>
>

GNOME 团队希望在根据这些数据做出决定时保持谨慎。而且，像这样的调查应该能让他们更好地了解用户的偏好，并把重点放在基本层面上更重要的东西上。

当然，不可能照顾到每一种类型的用户。但是，只要基本面得到了照顾，桌面体验最终应该得到改善。

你对这些发现有什么看法？欢迎在下面的评论中分享你的想法。

---

via: <https://news.itsfoss.com/gnome-research-report/>

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

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


硬核观察 #896 谷歌裁掉了很多重要的开源开发者

Summary:
? 谷歌裁掉了很多重要的开源开发者
? 沃顿商学院的副教授要求学生使用 ChatGPT
? GitHub 质疑对 Copilot 滥用开源代码的指控
»
»

![](/data/attachment/album/202301/29/162551dm3ti73vdovmjvbk.jpg)

![](/data/attachment/album/202301/29/162601r7vawpdrasfrp7sv.jpg)

### 谷歌裁掉了很多重要的开源开发者

许多被开除的人是谷歌开源项目办公室（OSPO）和其他开源工作中最优秀的人。这包括 18 年前创建谷歌 OSPO 的 Chris DiBona；还有 Samba 的共同创造者，前谷歌开发者生态系统的项目经理，以及新招聘的负责谷歌开源安全计划的人等等。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/27/google_open_source/)**
>
>
>

>
> 老王点评：这时候我们要问一句，“谷歌还爱开源”吗？并不是开源的人不能裁，对谷歌来说，这些开源专家并没有他们自己想象中的那么重要。他们只是裁人算法下的牺牲品。
>
>
>

![](/data/attachment/album/202301/29/162637ntruo0jwttfssxz2.jpg)

### 沃顿商学院的副教授要求学生使用 ChatGPT

出于对利用 ChatGPT 作弊的担忧，一些学区已经禁止使用它，但沃顿商学院的副教授 Ethan Mollick 不仅允许学生使用 ChatGPT，而且将其列为要求，并将 AI 政策纳入教学大纲。他说，“我们是在一个有计算器的世界教学生数学。现在的挑战是教育者要教学生世界如何再次改变，以及他们如何适应这种改变。”他指出，使用人工智能是一项 “新兴技能”；它可能是错误的，学生应该根据其他来源检查其结果；他们将对该工具提供的任何错误或遗漏负责。

>
> **[消息来源：NPR](https://www.npr.org/2023/01/26/1151499213/chatgpt-ai-education-cheating-classroom-wharton-school)**
>
>
>

>
> 老王点评：积极正面的去迎接新技术的到来，而不是螳臂当车。
>
>
>

![](/data/attachment/album/202301/29/162706l6jfaayjby2f2aea.jpg)

### GitHub 质疑对 Copilot 滥用开源代码的指控

GitHub、微软和 OpenAI 在周四给法庭的文件中说，由一群匿名版权所有者提出的投诉没有足够具体地概述他们的指控。他们认为，原告缺乏提起诉讼的资格，因为他们未能证明他们因该公司的行为而受到具体伤害。并称，诉讼中没有指明他们滥用的特定版权作品或他们违反的合同。文件中还称，这些版权指控将 “一头撞上合理使用原则”，该原则允许在某些情况下未经许可使用版权作品。

>
> **[消息来源：路透社](https://www.reuters.com/legal/litigation/openai-microsoft-want-court-toss-lawsuit-accusing-them-abusing-open-source-code-2023-01-27/)**
>
>
>

>
> 老王点评：首先，GitHub 恐怕否认不了 Copilot 是从 GitHub 上存储的代码进行学习的，甚至是直接原样复制了代码。而是否是“合理使用”，可能不仅仅要看判例，还要看这些代码使用的许可证。
>
>
>


关于开源，你需要知道些什么

Summary: 一份用简单直白的语句来解释开源的新手指南。

一份用简单直白的语句来解释开源的新手指南。

![](/data/attachment/album/202301/30/110936lhhk216wajijdh22.jpg)

>
> 一份用简单直白的语句来解释开源的新手指南。
>
>
>

要是你想要（或需要）知道 [开源](https://opensource.com/resources/what-open-source) 的意思究竟是什么。我会介绍开源的一些基础，无论你是对项目贡献感兴趣，还是在想要融入的新工作圈子里总是听到这个名词，因为这个词总是被人不断的提起。

我坦白，我这个人没什么技术经验，在极具技术性的开源社区中从事着内容设计的边缘工作。考虑到我原来的背景是营销与传播，我决定换工作时感觉就像离了水的鱼儿。[Git](https://opensource.com/resources/what-is-git)、数据科学、软件的来龙去脉……直到一年后的今天，我依然感到难以消化。

但这正是为什么我要写这篇文章。我想要让开源变得不那么令人生畏。毕竟，开源的中心是一个支持型的学习社区 —— 这个社区对所有人开放，无论你是否有技术经验。

我会从基础中的基础开始。

### 什么是开源？

在此声明，业界对开源的定义可以在 <ruby> <a href="https://opensource.org/osd">  开放源代码促进会 </a> <rt>  Open Source Initiative </rt></ruby> 的网站找到。

然而，大众对“开源”软件的认知通常为它不用花钱，它的源代码是公开的，任何人都可以对其贡献，你可以重新发布它或者用它做任何你想做的事。

这里面有些是真的，而有些则属于常见的误解，其中之一就是关于花费。

#### 开源只要 0 元

这是真的吗？大部分情况下是，但不是所有情况。开源软件的本质在于代码的公开性，所以获取软件本身确实不需要花费。但是，依赖开源项目营利的公司也确实存在。但如果软件不需要花钱，开源公司又是如何生存的？他们该如何盈利？

拥有“免费产品”这个概念本身是反直觉的。但你要知道：一个公司不一定要靠出售软件来赚钱，它也可以从产品的管理，数据的储存，以及对客户的支持中获利。

很多公司都采用了订阅模式，他们提供客户支持服务以帮助客户解决软件问题并为客户解答疑惑。数据储存也并非免费，这也是能为公司带来收入的另一领域。从这个角度来说，在销售的“产品”不是软件，而是订阅服务。

* **开源代码是公开访问的**：这是真的吗？是的，永远都是。“开源”一词的先决条件正是这份公开性。源代码必须允许被查看、使用、修改和重新发布。
* **你可以用这份代码做任何你想做的事**：这是真的吗？依情况而定。许可证条款会对你对代码的使用方式作出限制，但你通常都可以用代码做你想做的事。无论是调整该项目以满足特殊需求，还是以此为基础做些别的，开源软件允许你和其他所有人对其修改。
* **任何人都可以贡献开源项目**：这是真的吗？是的，但有限制。所有有 [合适技能](https://opensource.com/life/16/1/8-ways-contribute-open-source-without-writing-code) 的人都可以贡献开源。但是，这不意味着所有的贡献都会被接受和采纳。

比如说，你对一个目标是对地球上所有的鸟类进行分类的项目感兴趣。你恰好很喜欢恐龙，特别是那些最终进化成如今的鸟类的恐龙。于是，你为所有最像鸟类的恐龙提交了条目。项目所有者在看到这些后可能会想：“不错，这都是些很棒的史前鸟类。”但他们也可能会认为：“嗯……这些恐龙看起来像鸟，但他们还不是鸟，因此他们不属于鸟类百科。”

幸运的是，项目里的工作通常有法可依。开源项目通常有着贡献指南和行为准则，所以你不用担心你会加入什么使得项目脱轨的东西。

### 为什么选择开源呢？

那么，在众多贡献之后（如果这些贡献完成的话），为什么人们愿意免费赠送他们的软件？如果有那么多人为此付出了时间与精力，他们为什么不能联合起来为软件明码标价？

这个问题有很多回答。我在这里给出了一些：

* 创业是艰难的，如果你开发的项目展现不出赚钱的潜力则尤其如此。召集一群志同道合的人，没有承诺也没有对薪水的期望，相对而言要简单得多。
* 大部分开源社区的成员对软件的改进或者实现感兴趣，但他们没有时间或者不愿意将项目作为他们的全职工作。有时候开源代表的是热情驱动的项目、极客组成的团体，还有凝聚众人智慧对恼人问题的解决方案。
* 围绕各种规模的开源项目形成的团体促进了支持型社区的成形，在这里贡献者与旁观者都可以练习他们的技能，改进他们常用的软件，互教互学，并为发声被听到而感到振奋。很多开源社区本质上就是高度集中的线上爱好者俱乐部。

### 我该如何参与呢？

现在你可能会问你自己：“我知道了这些信息又可以做些什么呢？我能贡献开源项目吗？如果我不够优秀的话该怎么办？”

不要害怕 —— 即便是 [新手](https://opensource.com/article/18/4/get-started-open-source-project) 也欢迎为开源项目做贡献。在与社区一起朝着更大的目标共同努力的同时，你也得到了一个磨练技能的绝佳机会。况且，正如我之前所说，最坏的情况也不过是你的提交不被“鸟类百科”所接受（而这也是因为项目的所有者看不到你对鸟类百科的愿景，那是一片关于鸟类知识的网络天地，鸟与他们的祖先在那里愉快地共存）。

你需要会写代码来贡献开源吗？与大众认知相违的是，[你不需要](https://opensource.com/article/22/8/non-code-contribution-powers-open-source)。项目“需要举全村之力”以兴旺，这意味着他们需要来自不同背景的人的贡献。视觉设计师、撰稿人、营销、评审、翻译、主题爱好者，甚至只是最终产品的用户，都是可贵的贡献者。他们不仅是帮忙搭建并改进了产品，他们也识别出了漏洞，提出了修改建议，为项目做出宣传，最终使得社区强大。

简单来说，不论你的背景是什么，经验有多少，只要你对开源或是某个特别的项目感兴趣，你几乎可以保证会被张开双臂欢迎。

### 现在就加入开源吧

还是不确定应该从哪开始？这里有些能帮助你的想法和资源：

* [Up For Grabs](https://up-for-grabs.net/?ref=hackernoon.com#/) 是一份“专门为新贡献者策划任务的开源项目清单。”这里很适合新贡献者们来寻找简单的初次 PR 机会，这次机会也能让你探寻你更喜欢哪种贡献。
* 来看看 GitHub 上的这份 [新手友好项目](https://github.com/MunGell/awesome-for-beginners) 列表吧。
* 如果你还是缺乏灵感，考虑一下[贡献](https://github.com/patternfly)（或一起“飞”） <ruby> 红帽 <rt>  Red Hat </rt></ruby>的开放设计系统 [PatternFly](https://www.patternfly.org/v4/get-started/design)。
* LCTT 夹带私货：你还可以通过参与 LCTT 的翻译工作来首次体验如何参与开源，这几乎简单到你只需要懂一点点英文和一些热情，本文就是由开源贡献者翻译贡献而成的。入口在此： <https://linux.cn/lctt/>

---

via: <https://opensource.com/article/22/11/get-started-open-source>

作者：[Katie Edwards](https://opensource.com/users/kaedward) 选题：[lkxed](https://github.com/lkxed) 译者：[yzuowei](https://github.com/yzuowei) 校对：[wxy](https://github.com/wxy)

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


给你的终端一个复古的外观

>
> 想让你的终端有一个复古的外观？本指南将帮助你在 Linux 发行版中安装 Cool Retro Terminal 应用程序。
>
>
>

![酷炫复古终端](/data/attachment/album/202301/30/154241lguz8g95mmq5mo95.jpg)

你有没有想过如何在你的 Linux 终端中模仿那些老式 CRT 显示器的外观？

那些 CRT 屏幕有自己的粉丝。如果你把苹果 2 或 IBM 3278 终端之类与今天的 4K 显示器显示相比较，它们的外观真的很酷。我并不是说 4K 显示器不好，但有时传统的显示器会让我们想起那些过去的日子。闲话少说。让我们开始安装这个应用程序。

### Cool Retro Terminal

该应用程序是自由开源的。它被称为 [cool-retro-term](https://github.com/Swordfish90/cool-retro-term)。它是轻量级的，有许多自定义选项，有预先设置的配置文件，如 Apple 2 等。它还能在你的终端中提供那些静态噪音和扫描线效果。很酷，不是吗？

它是用 Qt 构建的，需要 Qt 5.2 或更高版本。如果你使用的是最新的 Linux 发行版，在依赖性方面你应该没问题。

![绿色扫描线主题](/data/attachment/album/202301/30/154241opgc4pc6huutpgq4.jpg)

### 如何下载和安装 Cool Retro Terminal

Ubuntu、Linux Mint 和其他基于 Debian 的发行版：

使用下面的简单命令在你的 Ubuntu 和其他相关发行版中安装这个应用程序：

```
sudo apt install cool-retro-term

```

Arch Linux：

这个软件包在 Arch 用户仓库（AUR）中可用。如果你没有启用 AUR，请使用 [本指南](https://www.debugpoint.com/2021/01/install-yay-arch/) 启用它，然后使用以下命令来安装它：

```
pacman -S cool-retro-term

```

Fedora、RHEL 和其他相关发行版：

对于 Fedora 和其他相关的 Linux，使用下面的命令来安装这个应用程序：

```
sudo dnf install cool-retro-term

```

Appimage：

也有一个 AppImage 格式的独立的可执行程序，你可以直接下载并运行。不需要安装。按照下面的命令来做：

```
wget https://github.com/Swordfish90/cool-retro-term/releases/download/1.1.1/Cool-Retro-Term-1.1.1-x86_64.AppImage
chmod a+x Cool-Retro-Term-1.1.1-x86_64.AppImage
./Cool-Retro-Term-1.1.1-x86_64.AppImage

```

注意：在 GitHub 中，没有 1.2.0 以后的版本的 AppImage 构建版。

### 配置

安装完成后，你可以在应用程序菜单中找到终端应用程序 “Cool Retro Term”。那么，启动该应用程序并享受其中吧。

请记住，这覆盖你的 Linux 发行版中的默认控制台/终端应用程序。它是一个独立的控制台应用程序。

配置选项可以通过右键菜单访问。

上下文菜单给你提供了以下预设。然后你可以通过设置窗口对它们中的每一个进行颜色和外观设置的配置。例如，如果你想要更多的透明度、对比度或更多的噪音、环境光或闪烁。所有这些都可以从下面的设置窗口通过几个选项进行配置。

而且，你可以轻松地制作你自己的主题。

![Cool Retro Term 中的预装主题](/data/attachment/album/202301/30/154246se93q3q8zzucr9qm.jpg)

![设置中的各种效果](/data/attachment/album/202301/30/154252kmff5ugsfkz5ffvw.jpg)

### 总结

Cool Retro Terminal 是一个用于 Linux 桌面的老式显示管终端，它可以让你体验到如同坐在复古终端前的感觉。你可能喜欢，也可能不喜欢，而且人们几乎不把它作为日常使用。但它仍然是一个漂亮的终端，可以时不时地体验一下，以摆脱平凡的终端。

你喜欢复古的外观吗？你最喜欢的主题是什么？请在下面的评论区告诉我。

---

via: <https://www.debugpoint.com/cool-retro-terminal/>

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

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


硬核观察 #897 甲骨文新的授权模式导致 Java 使用成本激增

Summary:
? 甲骨文新的授权模式导致 Java 使用成本激增
? GitHub 用户数突破 1 亿
? ChatGPT 在寻找和解决程序错误方面表现优异
»
»

用了很久的 Liberica JDK。

![](/data/attachment/album/202301/30/181924qzhdr8koop5641yl.jpg)

![](/data/attachment/album/202301/30/181931uhgyiitjot9goo6j.jpg)

### 甲骨文新的授权模式导致 Java 使用成本激增

甲骨文公司修改了 Oracle Java SE 订阅模式，在新的模式下，Java 将按每个员工授权，而不是像旧模式允许的那样按每个用户或每个处理器授权。尽管甲骨文公司承诺允许用户可以根据他们目前的订阅模式进行续约，但随着时间的推移，它可能会对用户施加压力，让他们采用新的模式。这种转变将惩罚那些花了多年时间尽量减少 Java 使用量的公司，因为他们发现无论他们使用多少Java，都要按员工收费。有分析称，有的公司的 Java 成本上升了 10 倍，平均在 2 到 4 倍的增长。

>
> **[消息来源：The Register](https://www.theregister.com/2023/01/27/oracle_java_licensing_change/)**
>
>
>

>
> 老王点评：是时候抛弃甲骨文的 Java 了。
>
>
>

![](/data/attachment/album/202301/30/181941f2ofn6n9zxi5nsgs.jpg)

### GitHub 用户数突破 1 亿

成立于 2008 年的 GitHub 宣布，现在有 1 亿名开发者在使用该平台。与 GitHub 十年前的 300 万用户、五年前微软以 75 亿美元收购它时声称的 2800 万用户，以及三个月前透露的 9000 多万用户相比，这一数字有了大幅提升。在 2019 年的一次主题演讲中，其前 CEO 说，该公司的目标是到 2025 年达到 1 亿名开发者，所以实际上是提前两年达成了目标。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2023/01/26/github-says-it-now-has-100m-active-users/)**
>
>
>

>
> 老王点评：要不是在某些地方访问 GitHub 经常性抽风，可能 GitHub 能更快完成这一目标吧。
>
>
>

![](/data/attachment/album/202301/30/181952p0kiyggbbrkiqgno.jpg)

### ChatGPT 在寻找和解决程序错误方面表现优异

研究人员将 40 段有错误的代码交给四个不同的代码修复系统：ChatGPT、Codex、CoCoNut 和标准 APR（自动程序修复）。在第一轮测试中，ChatGPT 解决了 19 个问题，Codex 解决了 21 个，CoCoNut 解决了 19 个，而标准 APR 方法则解决了 7 个。然而，通过和 ChatGPT 对话，提供了有关问题和错误的更多信息后，最终 ChatGPT 解决了 31 个问题。

>
> **[消息来源：《PC 杂志》](https://www.pcmag.com/news/watch-out-software-engineers-chatgpt-is-now-finding-fixing-bugs-in-code)**
>
>
>

>
> 老王点评：看看，不仅仅能写程序，还能替你挑错，甚至修改错误，所以，程序员们可能真的快被淘汰了。
>
>
>


Java 循环语句的简要指南

Summary: 无论你使用的是 while 循环、do/while 循环，还是无限循环，了解循环的工作原理对 Java 编程至关重要。

![](/data/attachment/album/202301/31/093057lesc38vufbuzustm.jpg)

>
> 无论你使用的是 `while` 循环、`do`/`while` 循环，还是无限循环，了解循环的工作原理对 Java 编程至关重要。
>
>
>

只要某些预定的条件为真，一个 `while` 循环就会执行一组任务。这被认为是一个控制结构，可以指导程序的流程。它是一种你可以通过定义一个条件来告诉你的代码要做什么的方法，它可以测试它，并根据它发现的情况采取行动。Java 中的两种 `while` 循环是 `while` 和 `do`/`while`。

### Java while 循环

`while` 循环的目的是对数据进行迭代，直到某个条件得到满足。要创建一个 `while` 循环，你需要提供一个可以测试的条件，然后是你想要运行的代码。Java 有几个内置的测试函数，其中最简单的是数学运算符（`<`, `>`, `==`, 等等）：

```
package com.opensource.example;

public class Example {
  public static void main(String[] args) {

  int count = 0;
  while (count < 5) {
    System.out.printf("%d ", count);
    count++;
    }
  }
}

```

在这个简单的例子中，条件是变量 `count` 小于 5。因为 `count` 被实例化为 0，然后在 `while` 循环的代码中增加 1，所以程序总共迭代了 5 次：

```
$ java ./while.java
0 1 2 3 4

```

在它进行第六次迭代之前，条件不再是真的，所以循环结束。

`while` 循环的条件语句是至关重要的。弄错了可能意味着你的循环永远不会执行。例如，假设你把 `count == 5` 作为条件：

```
while (count == 5) {
    System.out.printf("%d ", count);
    count++;

```

当你运行这段代码时，它的构建和运行都很成功，但什么也没有发生：

```
$ java ./while.java
$

```

循环被跳过了，因为 `count` 被设置为 0，而且在第一次遇到 while 循环的时候，它还是 0。循环从未开始，`count` 也从未被递增。

与此相反的是，当一个条件开始为真，并且永远不会为假时，这将导致一个无限循环。

### Java do while 循环

与 `while` 循环相似，`do`/`while` 循环在每次迭代结束时测试条件，而不是在开始时测试条件。有了这个循环，循环中的代码至少运行一次，因为没有进入的入口，只有退出的出口:

```
package com.opensource.example;

public class Example {
  public static void main(String[] args) {

  int count = 9;
  do {
      System.out.printf("%d ", count);
      count++;
    } while(count == 5);
  }
}

```

在这个示例代码中，`count` 被设置为 9。循环重复的条件是 `count` 等于 5，但是 9 不等于 5。不过，这个检查要到第一次迭代结束时才进行：

```
$ java ./do.java
9

```

### Java 无限循环

无限循环，正如它的名字所示，永远不会结束。有时它们是被错误地创建的，但无限循环确实有一个有效的场景。有时你想让一个进程无限地继续下去（在功能上是无限的，因为你不能保证你需要它什么时候停止），因此你可能会把你的条件设置为不可能满足的东西。

假设你写了一个应用程序，在僵尸天启期间计算留在你附近的僵尸的数量。为了模拟需要多少个循环才能达到 0 个僵尸的不确定性，我的演示代码从操作系统中检索了一个时间戳，并将计数器（`c`）的值设置为从该时间戳得出的某个数字。因为这是一个简单的例子，你不会真的想陷入一个无限循环，这段代码倒数到 0，并使用 `break` 函数来强制结束循环：

```
package com.opensource.example;

public class Example {
  public static void main(String[] args) {

  long myTime = System.currentTimeMillis();

  int c;

  if ( myTime%2 == 0 ) {
      c = 128;
  } else {
      c = 1024;
  }

  while(true) {
    System.out.printf("%d Zombies\n", c);

    // break for convenience
    if ( c <= 0 ) { break; }
    c--;
    }
  }
}

```

你可能要运行几次才能触发不同的僵尸总数，但有时你的程序会迭代 128 次，有时会迭代 1024 次：

```
$ java ./zcount.java
1024 Zombies
1023 Zombies
[...]
0 Zombies

```

你能说出为什么循环的终点是 0 而不是 -1 吗？

### Java 循环

循环使你能够控制程序的执行流程。迭代在编程中很常见，无论你使用 `while` 循环、`do`/`while` 循环还是无限循环，了解循环的工作原理都是至关重要的。

---

via: <https://opensource.com/article/23/1/java-loops>

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