分类 技术 下的文章

最好的聊天应用是一个不属于聊天应用的应用。

 title=

请考虑一下,当用户的数据被发布到互联网上,或通过互联网发布时,他们的数据究竟去了哪里。古老的聊天应用是互联网通信领域的一个手工行业,似乎在潮流中起起落落。人们使用聊天应用进行各种形式的对话,大多数人不会想到机器人正在记录和监控他们所说的话,无论是为了有效地定位广告还是只是为了建立一个档案供将来使用。这使得聊天应用特别容易受到不良的隐私做法的影响,但幸运的是,现在有几个开源的、注重隐私的应用,如 SignalRocket.ChatMattermost。我运行过 Mattermost 和 Rocket.Chat,我也在使用 Signal,但我最兴奋的应用是 Delta Chat,这个聊天服务非常方便,甚至不使用聊天服务器。相反,Delta Chat 使用的是你已经使用的最大规模和最多样化的开放信息系统:它使用电子邮件,通过聊天应用发送和接收信息,并以 Autocrypt 的端到端加密为特色。

安装 Delta Chat

Delta Chat 使用标准的电子邮件协议作为它的后端,但对于作为普通用户的你和我来说,它的外观和行为完全像一个聊天应用。也就是说你需要安装一个开源的 Delta Chat 应用。

在 Linux 上,你可以从 Flatpak 包或你的软件库中安装 Delta Chat。

在 macOS 和 Windows 上,从 delta.chat/downloads 下载一个安装程序。

在安卓系统上,你可以从 Play Store 或开源的 F-droid 仓库 安装 Delta Chat。

在 iOS 系统中,从 App Store 安装 Delta Chat。

因为 Delta Chat 使用电子邮件来传递信息,所以如果你不在你的聊天应用中,你也可以在收件箱中收到信息。是的,即使没有安装 Delta Chat,你也可以使用 Delta Chat!

配置 Delta Chat

当你第一次启动 Delta Chat 时,你必须登录到你的电子邮件账户。这往往是 Delta Chat 最难的部分,因为它要求你了解你的电子邮件服务器的详细信息,或者在你的电子邮件提供商的安全设置中创建一个“应用密码”。

如果你使用的是自己的服务器,并且所有配置都是默认的(993 端口用于 IMAP 接收,465 端口用于 SMTP 发出,启用了 SSL/TLS),那么你可以直接输入你的电子邮件地址和密码,然后继续。

 title=

如果你运行自己的服务器,但你有自定义设置,那么点击“ 高级 Advanced ”按钮,输入你的设置。如果你使用一个不寻常的子域来用作你的邮件服务器,或一个自定义端口,或一个复杂的登录和密码配置,你可能需要这样做。

如果你使用的是 Gmail、Fastmail、Yahoo 或类似的电子邮件供应商,那么你必须创建一个应用密码,这样你就可以通过 Delta Chat 而不是网络浏览器登录到你的账户。许多电子邮件供应商限制登录,以避免无休止的机器人和脚本试图用暴力手段进入人们的账户,所以对你的供应商来说,Delta Chat 看起来很像机器人。当你授予 Delta Chat 特殊权限时,你就是在提醒你的电子邮件提供商,从一个远程应用发出大量的短信息是预期的行为。

每个电子邮件提供商都有不同的提供应用密码的方式,但 Fastmail(在我看来)是最简单的:

  1. 进入“ 设置 Settings
  2. 点击“ 密码和安全 Passwords & Security
  3. 在“ 第三方应用 Third-party apps ”的旁边,点击“ 添加 Add ”按钮

验证你的密码,并创建一个新的应用密码。使用你创建的应用密码登录 Delta Chat。

 title=

使用 Delta Chat 聊天

当你克服了登录的障碍,剩下的就很容易了。因为 Delta Chat 只使用电子邮件,你可以通过电子邮件地址而不是通过聊天程序的用户名或电话号码来添加朋友。从技术上讲,你可以在 Delta Chat 上添加任何电子邮件地址。毕竟,它只是一个有特定使用场景的电子邮件应用。不过,告诉你的朋友 Delta Chat 是很有礼貌的,而不是期望他们通过他们的电子邮件客户端与你进行随意的聊天。

无论你是在手机还是在电脑上运行这个应用,其外观都与你所期望的聊天应用完全一样。你可以发起聊天,发送消息,并通过加密文本与朋友闲聊。

 title=

开始聊天

Delta Chat 是去中心化的、完全加密的,并依赖于一个成熟的基础设施。多亏 Delta Chat,你可以选择你和你的联系人之间的服务器,你可以在私下里交流。没有需要安装的复杂的服务器,没有需要维护的硬件。这是一个看似复杂问题的简单解决方案,而且是开源的。我们有充分的理由去尝试它。


via: https://opensource.com/article/22/1/delta-chat-software-privacy-day

作者:Alan Smithee 选题:lujun9972 译者:geekpi 校对:wxy

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

KDE 团队宣布了 KDE Plasma 5.24 LTS 版,已经可以下载和安装了。如果你打算从以前的版本升级,在这里我们给你提供了从 5.23 升级到 5.24 的简明步骤。

KDE Plasma 5.24 桌面

KDE Plasma 5.24 是 Plasma 桌面的第 26 个版本,带来了显著的视觉改变和一些后端性能的提升。在这个版本中,你会看到全新的墙纸、Breeze 主题的视觉变化、指纹登录和一个全新的概览屏幕等等。

你可以在我们的综述文章里阅读有关 KDE Plasma 5.24 功能的细节

如果你正在运行 KDE Plasma 的早期版本,你可以按本文说明升级到最新版本。

如何升级到 KDE Plasma 5.24

这个版本的升级包大小适中,在我的测试机器上大约是 450MB 以上。在开始升级过程之前,请确保关闭所有应用程序并保存你的数据。

一般来说,KDE 的升级是非常稳定的,它从来不会失败。但是,如果你想格外谨慎,并且有宝贵的数据,你可能想对这些进行备份。但同样,在我看来,我相信这是没有必要的。

步骤

如果你是在 KDE Neon 之中、滚动发布的发行版(如 Arch Linux、Manjaro 之类)中运行 KDE Plasma 5.23,你可以打开 KDE 工具 “ 发现 Discover ”,点击检查更新。

你可以通过“ 发现 Discover ”的升级包列表验证 Plasma 5.24 是否可用。

一旦确认可用,点击“ 发现 Discover ”窗口右上方的“ 全部更新 Update All ”按钮。

另外,你也可以从终端运行下面的命令,在 KDE Neon 中开始升级过程。

sudo apt update
sudo pkcon update

升级过程完成后重启系统。

而重启后,你应该看到全新的 KDE Plasma 5.24 出现在你面前。

在 Fedora 35 和 Ubuntu 21.10 中升级 KDE Plasma 5.24

截至目前,Fedora 35Ubuntu 21.10 是两个主要的 KDE 的发行版。由于 更新政策,Fedora 35 不会得到这个版本,而 Fedora 36 也将很快发布。

然而,如果你仍然想做实验,你可以在 Ubuntu 21.10 和 Ubuntu 21.04 中使用下面的 Backports PPA 安装这个新版本的 Plasma 桌面。在这样做的时候,请确保你保留一份数据备份。

sudo add-apt-repository ppa:kubuntu-ppa/backports
sudo apt-get full-upgrade

在 Fedora 35 中,我试图通过下面的 COPR 仓库来安装。但是有太多的依赖性冲突需要解决,在一个稳定的系统中尝试这样做是有风险的。我建议目前不要在 Fedora 35 中尝试下面的方法。当然你仍然可以通过 allowerasing 标志来安装。但不要这样做。

另外,我猜 Fedora 35 的官方版本会在第一个小版本(即 5.24.1)发布时更新,该版本将于 2022 年 2 月 15 日发布,所以你可以等到那时。

另外,等待 Fedora 36 也是比较明智的做法,因为它将这个版本作为默认版本。Fedora 36 将于 2022 年 4 月发布。

试图在 Fedora 35 中安装 Plasma 5.24

sudo dnf copr enable marcdeop/plasma
sudo dnf copr enable marcdeop/kf5
sudo dnf upgrade --refresh

升级后的反馈

我在虚拟机中运行了升级过程,并安装了新的 KDE Plasma 5.23。升级过程很顺利,没有出现意外或错误。好吧,到目前为止,它对我来说从未失败过。

升级时间完全取决于你的互联网连接和 KDE 服务器。一般来说,它应该在 30 分钟内完成。

升级过程后的第一次重启很顺利,没有花费多少时间。

从性能上讲,我觉得它比之前的版本更流畅,这要归功于几个错误的修复和底层的性能优化。

所以,总的来说,如果你在使用 KDE Neon,你可以安全地升级。否则就等待 Ubuntu 和 Fedora 稳定版的软件包。

享受全新的 KDE Plasma 吧!


via: https://www.debugpoint.com/2022/02/upgrade-kde-plasma-5-24/

作者:Arindam 选题:lujun9972 译者:wxy 校对:wxy

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

你不希望别人能够监视甚至控制你的电脑,你通常会努力使用各种安全机制来切断任何此类企图。然而,有时会出现这样的情况:你迫切需要一个朋友,或一个专家来帮助你解决电脑问题,但他们并不同时在同一地点。你如何向他们展示呢?你应该拿着你的手机,拍下你的屏幕照片,然后发给他们吗?你应该录制一个视频吗?当然不是。你可以与他们分享你的屏幕,并可能让他们远程控制你的电脑一段时间。在这篇文章中,我将介绍如何在 Gnome 中允许共享电脑屏幕。

设置服务器以共享屏幕

服务器 是一台提供(服务)一些内容的计算机,其他计算机(客户端)将消费这些内容。在本文中,服务器运行的是 Fedora Workstation 和标准的 Gnome 桌面

打开 Gnome 屏幕共享

默认情况下,Gnome 中共享计算机屏幕的功能是 关闭 的。要使用它,你需要把它打开:

  1. 启动 Gnome 控制中心 Gnome Control Center
  2. 点击 共享 Sharing 标签。 Sharing switched off
  3. 用右上角的滑块打开共享。
  4. 单击 屏幕共享 Screen sharing Sharing switched on
  5. 用窗口左上角的滑块打开屏幕共享。
  6. 如果你希望能够从客户端控制屏幕,请勾选 允许连接控制屏幕 Allow connections to control the screen 。不勾选这个按钮访问共享屏幕只允许 仅浏览 view-only
  7. 如果你想手动确认所有传入的连接,请选择 新连接必须请求访问 New connections must ask for access
  8. 如果你想允许知道密码的人连接(你不会被通知),选择 需要密码 Require a password 并填写密码。密码的长度只能是 8 个字符。
  9. 勾选 显示密码 Show password 以查看当前的密码是什么。为了多一点保护,不要在这里使用你的登录密码,而是选择一个不同的密码。
  10. 如果你有多个网络可用,你可以选择在哪个网络上访问该屏幕。

设置客户端以显示远程屏幕

客户端 是一台连接到由服务器提供的服务(或内容)的计算机。本演示还将在客户端上运行 Fedora Workstation,但如果它运行一个 VNC 客户端,操作系统实际上应该不太重要。

检查可见性

在 Gnome 中,服务器和客户端之间共享计算机屏幕需要一个有效的网络连接,以及它们之间可见的“路由”。如果你不能建立这样的连接,你将无法查看或控制服务器的共享屏幕,这里描述的整个过程将无法工作。

为了确保连接的存在,找出服务器的 IP 地址。

启动 Gnome 控制中心 Gnome Control Center ,又称 设置 Settings 。使用右上角的菜单,或活动模式。当在活动中时,输入:

settings

并点击相应的图标。

选择 网络 Network 标签。

点击设置按钮(齿轮)以显示你的网络配置文件的参数。

打开 详情 Details 标签,查看你的计算机的 IP 地址。

进入 你的客户端的 终端(你想从它连接到别的计算机),使用 ping 命令找出客户和服务器之间是否有连接。

$ ping -c 5 192.168.122.225

检查该命令的输出。如果它与下面的例子相似,说明计算机之间的连接存在。

PING 192.168.122.225 (192.168.122.225) 56(84) bytes of data.
64 bytes from 192.168.122.225: icmp_seq=1 ttl=64 time=0.383 ms
64 bytes from 192.168.122.225: icmp_seq=2 ttl=64 time=0.357 ms
64 bytes from 192.168.122.225: icmp_seq=3 ttl=64 time=0.322 ms
64 bytes from 192.168.122.225: icmp_seq=4 ttl=64 time=0.371 ms
64 bytes from 192.168.122.225: icmp_seq=5 ttl=64 time=0.319 ms
--- 192.168.122.225 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4083ms
rtt min/avg/max/mdev = 0.319/0.350/0.383/0.025 ms

如果两台计算机存在同一个子网中,例如在你的家里或办公室,你可能不会遇到任何问题,但当你的服务器没有公共 IP 地址,无法从外部互联网上看到时,可能会出现问题。除非你是互联网接入点的唯一管理员,否则你可能需要就你的情况向你的管理员或你的 ISP 咨询。请注意,将你的计算机暴露在外部互联网上始终是一个有风险的策略,你必须充分注意保护你的计算机免受不必要的访问。

安装 VNC 客户端(Remmina)

Remmina 是一个图形化的远程桌面客户端,你可以使用多种协议连接到远程服务器,如 VNC、Spice 或 RDP。Remmina 可以从 Fedora 仓库中获得,所以你可以用 dnf 命令或 软件中心 Software 来安装它,以你喜欢的方式为准。使用 dnf,下面的命令将安装该软件包和几个依赖项。

$ sudo dnf install remmina

连接到服务器

如果服务器和客户端之间有连接,请确保以下情况:

  1. 计算机正在运行。
  2. Gnome 会话正在运行。
  3. 启用了屏幕共享的用户已经登录。
  4. 会话 没有被锁定,也就是说,用户可以使用该会话。

然后你可以尝试从客户端连接到该会话:

  1. 启动 Remmina
  2. 在地址栏左侧的下拉菜单中选择 VNC 协议。
  3. 在地址栏中输入服务器的IP地址,然后按下 回车Remmina Window
  4. 当连接开始时,会打开另一个连接窗口。根据服务器的设置,你可能需要等待,直到服务器用户允许连接,或者你可能需要提供密码。
  5. 输入密码,然后按 OKRemmina Connected to Server
  6. 按下 Align with resolution button 调整连接窗口的大小,使之与服务器的分辨率一致,或者按 Full Screen Button 调整连接窗口的大小,使其覆盖整个桌面。当处于全屏模式时,注意屏幕上边缘的白色窄条。那是 Remmina 菜单,当你需要离开全屏模式或改变一些设置时,你可以把鼠标移到它上面。

当你回到服务器时,你会注意到现在在上栏有一个黄色的图标,这表明你正在 Gnome 中共享电脑屏幕。如果你不再希望共享屏幕,你可以进入菜单,点击 屏幕正在被共享 Screen is being shared ,然后再选择 关闭 Turn off ,立即停止共享屏幕。

Turn off menu item

会话锁定时终止屏幕共享

默认情况下,当会话锁定时,连接 将总是终止 will always terminate 。在会话被解锁之前,不能建立新的连接。

一方面,这听起来很合理。如果你想和别人分享你的屏幕,你可能不想让他们在你不在的时候使用你的电脑。另一方面,如果你想从远程位置控制你自己的电脑,无论是你在另一个房间的床上,还是你岳母的地方,同样的方法也不是很有用。有两个选项可以处理这个问题。你可以完全禁止锁定屏幕,或者使用支持通过 VNC 连接解锁会话的 Gnome 扩展。

禁用屏幕锁定

要禁用屏幕锁定:

  1. 打开 Gnome 控制中心 Gnome Control Center
  2. 点击 隐私 Privacy 标签。
  3. 选择 屏幕锁定 Screen Lock 设置。
  4. 关掉 自动屏幕锁定 Automatic Screen Lock

现在,会话将永远不会被锁定(除非你手动锁定),所以它能启动一个 VNC 连接到它。

使用 Gnome 扩展来允许远程解锁会话

如果你不想关闭锁定屏幕的功能,或者你想有一个远程解锁会话的选项,即使它被锁定,你将需要安装一个提供这种功能的扩展,因为这种行为是默认不允许的。

要安装该扩展:

  1. 打开火狐浏览器,并打开 Gnome 扩展页面Gnome Extensions Page
  2. 在页面的上部,找到一个信息块,告诉你为火狐安装 “GNOME Shell integration”。
  3. 点击 点此安装浏览器扩展 Click here to install browser extension 来安装 Firefox 扩展。
  4. 安装完毕后,注意到 Firefox 的菜单部分有 Gnome 的标志。
  5. 点击 Gnome 标志,回到扩展页面。
  6. 搜索 “allow locked remote desktop”。
  7. 点击显示的项目,进入该扩展的页面。
  8. 使用右边的开/关按钮,将扩展打开Extension selected

现在,可以在任何时候启动 VNC 连接。注意,你需要知道会话密码以解锁会话。如果你的 VNC 密码与会话密码不同,你的会话仍然受到 一点 保护。

总结

这篇文章介绍了在 Gnome 中实现共享计算机屏幕的方法。它提到了受限(仅浏览)访问和非受限(完全)访问之间的区别。然而,对于正式任务的远程访问,例如管理一个生产服务器,这个解决方案无论如何都不算是一个正确的方法。为什么?

  1. 服务器将始终保持其控制模式。任何在服务器会话中的人都将能够控制鼠标和键盘。
  2. 如果会话被锁定,从客户端解锁也会在服务器上解锁。它也会把显示器从待机模式中唤醒。任何能看到你的服务器屏幕的人都能看到你此刻正在做什么。
  3. VNC 协议本身没有加密或保护,所以你通过它发送的任何东西都可能被泄露。

你几种可以建立一个受保护的 VNC 连接的方法。例如,你可以通过 SSH 协议建立隧道,以提高安全性。然而,这些都超出了本文的范围。

免责声明:上述工作流程在 Fedora 35 上使用几个虚拟机工作时没有问题。如果它对你不起作用,那么你可能遇到了一个错误。请报告它。


via: https://fedoramagazine.org/sharing-the-computer-screen-in-gnome/

作者:Lukáš Růžička 选题:lujun9972 译者:geekpi 校对:wxy

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

“Java” 有很多意思。除了是印度尼西亚的爪哇岛之外,它还是一个大型的软件开发生态系统。Java 公开发布于 1995 年 3 月 23 日(LCTT 译注:据维基百科数据)。它仍然是企业和休闲软件开发的一个流行平台。从银行业到“我的世界”,许多东西都是由 Java 开发的。

本文将引导你了解构成 Java 的各个组件,以及它们是如何相互作用的。本文还将介绍 Java 是如何集成在 Fedora Linux 中的,以及该如何管理不同的版本。最后,还提供了一个使用游戏《破碎的像素地牢》做的小演示。

Java 的鸟瞰图

下面几个小节快速回顾了 Java 生态系统的几个重要部分。

Java 语言

Java 是一种强类型的、面向对象的编程语言。它的主要设计者是在 Sun 公司工作的 James Gosling,Java 在 1995 年正式公布。Java 的设计受到了 C 和 C++ 的强烈启发,但使用了更精简的语法。没有指针,参数是按值传递的。整数和浮点数不再有有符号和无符号的变体,更复杂的对象如字符串是基础定义的一部分。

但那是 1995 年,该语言在发展中经历了兴衰。在 2006 年至 2014 年期间,没有任何重大发布,停滞不前,这也为市场竞争打开了大门。现在有多种竞争性的 Java 类语言,如 Scala、Clojure 和 Kotlin。现在很大一部分 “Java” 编程都使用这些替代语言规范中的一种,这些语言专注于函数式编程或交叉编译。

// Java
public class Hello {
  public static void main(String[] args) {
    println("Hello, world!");
  }
}

// Scala
object Hello {
  def main(args: Array[String]) = {
    println("Hello, world!")
  }
}

// Clojure
(defn -main
  [& args]
  (println "Hello, world!"))

// Kotlin
fun main(args: Array<String>) {
  println("Hello, world!")
}

现在选择权在你手中。你可以选择使用现代版本,或者你可以选择替代语言之一,如果它们更适合你的风格或业务。

Java 平台

Java 不仅仅是一种语言。它也是一个运行语言的虚拟机,它是一个基于 C/C++ 的应用程序,它接收代码,并在实际的硬件上执行它。除此之外,该平台也是一套标准库,它包含在 Java 虚拟机(JVM)中,并且是用同样的语言编写的。这些库包含集合和链接列表、日期时间和安全等方面的逻辑。

Java 生态系统并不局限于此。还有像 Maven 和 Clojars 这样的软件库,其中包含了相当数量的可用的第三方库。还有一些针对某些语言的特殊库,在一起使用时提供额外的好处。此外,像 Apache Maven、Sbt 和 Gradle 这样的工具允许你编译、捆绑和分发你编写的应用程序。重要的是,这个平台可以和其他语言一起使用。你可以用 Scala 编写代码,让它与 Java 代码在同一平台上一同运行。

还有就是,在 Java 平台和 Android 世界之间有一种特殊的联系。你可以为 Android 平台编译 Java 和 Kotlin,来使用额外的库和工具。

许可证历史

从 2006 年起,Java 平台在 GPL 2.0 下授权,并有一个 类路径例外 classpath-exception 。这意味着每个人都可以建立自己的 Java 平台;包括工具和库。这使得该生态系统的竞争非常激烈。有许多用于构建、分发和开发的工具彼此竞争。

Java 的原始维护者 Sun 公司在 2009 年被甲骨文公司收购。2017 年,甲骨文改变了 Java 软件包的许可条款。这促使多个知名的软件供应商创建自己的 Java 打包链。红帽、IBM、亚马逊和 SAP 现在都有自己的 Java 软件包。他们使用“OpenJDK”商标来区分他们的产品与甲骨文的版本。

值得特别一提的是,甲骨文提供的 Java 平台包并不是 FLOSS。对甲骨文的 Java 商标平台有严格的许可限制。在本文的其余部分,“Java” 指的是 FLOSS 版本:OpenJDK。

最后,类路径例外 值得特别一提。虽然许可证是 GPL 2.0,但类路径例外允许你使用 Java 编写专有软件,只要你不改变平台本身。这使得该许可证介于 GPL 2.0 和 LGPL 之间,它使 Java 非常适用于企业和商业活动。

Praxis

如果这些看起来如此繁杂,请不要惊慌。这是 26 年的软件历史,有很多的竞争。下面的小节演示了在 Fedora Linux 上使用 Java。

在本地运行 Java

默认的 Fedora 工作站 33 的环境包括 OpenJDK 11。该平台的开源代码是由 Fedora 项目的软件包维护者为 Fedora 工作站捆绑的。要想亲眼看看,你可以运行以下内容:

$ java -version

OpenJDK 的多个版本在 Fedora Linux 的默认存储库中都有。它们可以同时安装。使用 alternatives 命令来选择默认使用哪个已安装的 OpenJDK 版本。

$ dnf search openjdk
$ alternatives --config java

另外,如果你安装了 Podman,你可以通过搜索找到大多数 OpenJDK 软件包。

$ podman search openjdk

运行 Java 有许多方式,包括原生的和容器中的。许多其他的 Linux 发行版也带有开箱即用的 OpenJDK。Pkgs.org一个全面的列表。在这种情况下,GNOME BoxesVirt Manager 可以用来运行它们。

要直接参与 Fedora 社区,请看他们的项目 维基

替代配置

如果你想要的 Java 版本在软件库中不可用,请使用 SDKMAN 在你的主目录中安装 Java。它还允许你在多个已安装的版本之间进行切换,而且它还带有 Ant、Maven、Gradle 和 Sbt 等流行的 CLI 工具。

同样,一些供应商直接提供了 Java 的下载。特别值得一提的是 AdoptOpenJDK,它是几个主要供应商之间的合作,提供简单的 FLOSS 包和二进制文件。

图形化工具

有几个 集成开发环境(IDE)可用于 Java。一些比较流行的 IDE 包括:

  • Eclipse:这是由 Eclipse 基金会发布和维护的自由软件。可以直接从 Fedora 项目的软件库或 Flathub 上安装它。
  • NetBeans:这是由 Apache 基金会发布和维护的自由软件。可以从他们的网站或 Flathub 上安装它。
  • IntelliJ IDEA:这是一个专有软件,但它有一个免费的社区版本。它是由 Jet Beans 发布的。可以从他们的网站或 Flathub 上安装它。

上述工具本身是用 OpenJDK 编写的。这是自产自销的例子。

示范

下面的演示使用了《破碎的像素地牢》,这是一个基于 Java 的 Roguelike 游戏,它在 Android、Flathub 和其他平台上都有。

首先,建立一个开发环境:

$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
$ sdk install gradle

接下来,关闭你的终端窗口并打开一个新的终端窗口。然后在新窗口中运行以下命令:

$ git clone https://github.com/00-Evan/shattered-pixel-dungeon.git
$ cd shattered-pixel-dungeon
$ gradle desktop:debug

现在,在 Eclipse 中导入该项目。如果 Eclipse 还没有安装,运行下面的命令来安装它:

$ sudo dnf install eclipe-jdt

使用从文件系统导入项目方式来添加《破碎的像素地牢》的代码。

正如你在左上方的导入资源中所看到的,你不仅有项目的代码可以看,而且还有 OpenJDK 及其所有的资源和库。

如果这激励你进一步深入,我想把你引导到《破碎的像素地牢》的 官方文档。《破碎的像素地牢》的构建系统依赖于 Gradle,这是一个可选的额外功能,你必须 在 Eclipse 中手动配置。如果你想做一个 Android 构建,你必须使用 Android Studio。它是一个免费的、Google 品牌的 IntelliJ IDEA 版本。

总结

在 Fedora Linux 上使用 OpenJDK 开发是一件很容易的事情。Fedora Linux 提供了一些最强大的开发工具。使用 Podman 或 Virt-Manager 可以轻松、安全地托管服务器应用程序。OpenJDK 提供了一种创建应用程序的 FLOSS 方式,使你可以控制所有的应用程序组件。

Java 和 OpenJDK 是 Oracle 和/或其附属公司的商标或注册商标。其他名称可能是其各自所有者的商标。


via: https://fedoramagazine.org/java-development-on-fedora-linux/

作者:Kevin Degeling 选题:lujun9972 译者:wxy 校对:wxy

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

 title=

使用 Linux 的 grep 和 fgrep 命令来赢得你最喜欢的基于单词的猜测游戏。

我最近有点迷恋上了一个在线单词猜谜游戏,在这个游戏中,你有六次机会来猜一个随机的五个字母的单词。这个词每天都在变化,而且你每天只能玩一次。每次猜测后,你猜测中的每个字母都会被高亮显示:灰色表示该字母没有出现在神秘单词中,黄色表示该字母出现在单词中,但不在那个位置,绿色表示该字母出现在单词中的那个正确位置。

下面是你如何使用 Linux 命令行来帮助你玩像 Wordle 这样的猜测游戏。我用这个方法来帮助我解决 1 月 6 日的谜题:

第一次尝试

Linux 系统在 /usr/share/dict/words 文件中保存了一个单词词典。这是一个很长的纯文本文件。我的系统的单词文件里有超过 479,800 个条目。该文件既包含纯文本,也包含专有名词(名字、地点等等)。

为了开始我的第一次猜测,我只想得到一个长度正好是五个字母的纯文本词的列表。要做到这一点,我使用这个 grep 命令:

$ grep '^[a-z][a-z][a-z][a-z][a-z]$' /usr/share/dict/words > myguess

grep 命令使用正则表达式来进行搜索。你可以用正则表达式做很多事情,但为了帮助我解决 Wordle 问题,我只需要基本的东西。^ 表示一行的开始,$ 表示一行的结束。在两者之间,我指定了五个 [a-z] 的实例,表示从 a 到 z 的任何小写字母。

我还可以使用 wc 命令来查看我的可能单词列表,“只有” 15,000 个单词:

$ wc -l myguess
15034 myguess

从这个列表中,我随机挑选了一个五个字母的单词:acresa 被设置为黄色,意味着该字母存在于神秘单词的某处,但不在第一位置。其他字母是灰色的,所以我知道它们并不存在于今天的单词中。

 title=

第二次尝试

对于我的下一个猜测,我想得到一个包含 a 的所有单词的列表,但不是在第一位置。我的列表也不应该包括字母 cres。让我们把这个问题分解成几个步骤。

为了得到所有带 a 的单词的列表,我使用 fgrep(固定字符串 grep)命令。fgrep 命令也像 grep 一样搜索文本,但不使用正则表达式:

$ fgrep a myguess > myguess2

这使我的下一个猜测的可能列表从 15,000 个字下降到 6,600 个字:

$ wc -l myguess myguess2
 15034 myguess
  6634 myguess2
 21668 total

但是这个单词列表中的第一个位置也有字母 a,这是我不想要的。游戏已经表明字母 a 存在于其他位置。我可以用 grep 修改我的命令,以寻找在第一个位置包含其他字母的词。这就把我可能的猜测缩小到了 5500 个单词:

$ fgrep a myguess | grep '^[b-z]' > myguess2
$ wc -l myguess myguess2
 15034 myguess
  5566 myguess2
 20600 total

但我知道这个神秘的词也不包括字母 cres。我可以使用另一个 grep 命令,在搜索中省略这些字母:

$ fgrep a myguess | grep '^[b-z]' | grep -v '[cres]' > myguess2
$ wc -l myguess myguess2
15034 myguess
 1257 myguess2
16291 total

-v 选项意味着反转搜索,所以 grep 将只返回不符合正则表达式 [cres] 或单列字母 cres 的行。有了这个额外的 grep 命令,我把下一个猜测的范围大大缩小到只有 1200 个可能的单词,这些单词在某处有一个 a,但不在第一位置,并且不包含 cre、或 s

在查看了这个列表后,我决定尝试一下 balmy 这个词。

 title=

第三次尝试

这一次,字母 ba 被高亮显示为绿色,意味着我把这些字母放在了正确的位置。字母 l 是黄色的,所以这个字母存在于单词的其他地方,但不是在那个位置。字母 my 是灰色的,所以我可以从我的下一个猜测中排除这些。

为了确定下一个可能的单词列表,我可以使用另一组 grep 命令。我知道这个词以 ba 开头,所以我可以从这里开始搜索:

$ grep '^ba' myguess2 > myguess3
$ wc -l myguess3
77 myguess3

这只有 77 个词! 我可以进一步缩小范围,寻找除第三位外还包含字母 l 的词:

$ grep '^ba[^l]' myguess2 > myguess3
$ wc -l myguess3
61 myguess3

方括号 [^l] 内的 ^ 表示不是这个字母列表,即不是字母 l。这使我的可能单词列表达到 61 个,并非所有的单词都包含字母 l,我可以用另一个 grep 搜索来消除这些单词:

$ grep '^ba[^l]' myguess2 | fgrep l > myguess3
$ wc -l myguess3
10 myguess3

这些词中有些可能包含字母 my,而这些字母并不在今天的神秘词中。我可以再进行一次反转 grep 搜索,将它们从我的猜测列表中删除:

$ grep '^ba[^l]' myguess2 | fgrep l | grep -v '[my]' > myguess3
$ wc -l myguess3
7 myguess3

我的可能的单词列表现在非常短,只有七个单词!

$ cat myguess3
babul
bailo
bakal
bakli
banal
bauld
baulk

我选择 banal 作为我下一次猜测的可能的词,而这恰好是正确的。

 title=

正则表达式的力量

Linux 的命令行提供了强大的工具来帮助你完成实际工作。grepfgrep 命令在扫描单词列表方面提供了极大的灵活性。对于一个基于单词的猜测游戏,grep 帮助识别了一个包含 15000 个可能的单词的列表。在猜测并知道哪些字母出现在神秘的单词中,哪些没有,grepfgrep 帮助将选项缩小到 1200 个单词,然后只剩下 7 个单词。这就是命令行的力量。


via: https://opensource.com/article/22/1/word-game-linux-command-line

作者:Jim Hall 选题:lujun9972 译者:geekpi 校对:wxy

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

提供一个适当的 CMake 配置文件来使其他人可以更容易地构建、使用和贡献你的项目。

 title=

这篇文章是使用开源 DevOps 工具进行 C/C++ 开发系列文章的一部分。如果你从一开始就把你的项目建立在一个功能强大的工具链上,你的开发会更快和更安全。除此之外,这会使别人更容易地参与你的项目。在这篇文章中,我将搭建一个基于 CMakeVSCodium 的 C/C++ 构建系统。像往常一样,相关的示例代码可以在 GitHub 上找到。

我已经测试了在本文中描述的步骤。这是一种适用于所有平台的解决方案。

为什么用 CMake ?

CMake 是一个构建系统生成器,可以为你的项目创建 Makefile。乍一看简单的东西可能相当地复杂。在较高的层次上,你可以定义你的项目的各个部分(可执行文件、库)、编译选项(C/C++ 标准、优化、架构)、依赖关系项(头文件、库),和文件级的项目结构。CMake 使用的这些信息可以在文件 CMakeLists.txt 中获取,它使用一种特殊的描述性语言编写。当 CMake 处理这个文件时,它将自动地侦测在你的系统上已安装的编译器,并创建一个用于启动它的 Makefile 文件。

此外,在 CMakeLists.txt 中描述的配置,能够被很多编辑器读取,像 QtCreator、VSCodium/VSCode 或 Visual Studio 。

示例程序

我们的示例程序是一个简单的命令行工具:它接受一个整数来作为参数,输出一个从 1 到所提供输入值的范围内的随机排列的数字。

$ ./Producer 10
3 8 2 7 9 1 5 10 6 4 

在我们的可执行文件中的 main() 函数,我们只处理输入的参数,如果没有提供一个值(或者一个不能被处理的值)的话,就退出程序。

int main(int argc, char** argv){

    if (argc != 2) {
        std::cerr << "Enter the number of elements as argument" << std::endl;
        return -1;
    }

    int range = 0;
    
    try{
        range = std::stoi(argv[1]);
    }catch (const std::invalid_argument&){
        std::cerr << "Error: Cannot parse \"" << argv[1] << "\" ";
        return -1;
    }

    catch (const std::out_of_range&) {
        std::cerr << "Error: " << argv[1] << " is out of range";
        return -1;
    }

    if (range <= 0) {
        std::cerr << "Error: Zero or negative number provided: " << argv[1];
        return -1;
    }

    std::stringstream data;
    std::cout << Generator::generate(data, range).rdbuf();
}

producer.cpp

实际的工作是在 生成器 中完成的,它将被编译,并将作为一个静态库来链接到我们的Producer 可执行文件。

std::stringstream &Generator::generate(std::stringstream &stream, const int range) {
    std::vector<int> data(range);
    std::iota(data.begin(), data.end(), 1);

    std::random_device rd;
    std::mt19937 g(rd());

    std::shuffle(data.begin(), data.end(), g);

    for (const auto n : data) {

        stream << std::to_string(n) << " ";
    }

    return stream;
}

Generator.cpp

函数 generate 引用一个 std::stringstream 和一个整数来作为一个参数。根据整数 range 的值 n,制作一个在 1n 的范围之中的整数向量,并随后打乱。接下来打乱的向量值转换成一个字符串,并推送到 stringstream 之中。该函数返回与作为参数传递相同的 stringstream 引用。

顶层的 CMakeLists.txt

顶层的 CMakeLists.txt 的是我们项目的入口点。在子目录中可能有多个 CMakeLists.txt 文件(例如,与项目所相关联的库或其它可执行文件)。我们先一步一步地浏览顶层的 CMakeLists.txt

第一行告诉我们处理文件所需要的 CMake 的版本、项目名称及其版本,以及预定的 C++ 标准。

cmake_minimum_required(VERSION 3.14)

project(CPP_Testing_Sample VERSION 1.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

我们用下面一行告诉 CMake 去查看子目录 Generator。这个子目录包括构建 Generator 库的所有信息,并包含它自身的一个 CMakeLists.txt 。我们很快就会谈到这个问题。

add_subdirectory(Generator)

现在,我们将涉及一个绝对特别的功能: CMake 模块 。加载模块可以扩展 CMake 功能。在我们的项目中,我们加载了 FetchContent 模块,这能使我们能够在 CMake 运行时下载外部的资源,在我们的示例中是 GoogleTest

include(FetchContent)

FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/bb9216085fbbf193408653ced9e73c61e7766e80.zip
)
FetchContent_MakeAvailable(googletest)

在接下来的部分中,我们会做一些我们通常在普通的 Makefile 中会做的事: 指定要构建的二进制文件、它们相关的源文件、应该链接的库,以及编译器可以找到头文件的目录。

add_executable(Producer Producer.cpp)

target_link_libraries(Producer PUBLIC Generator)

target_include_directories(Producer PUBLIC "${PROJECT_BINARY_DIR}")

通过下面的语句,我们使 CMake 来在构建文件夹中创建一个名称为 compile_commands.json 的文件。这个文件会展示项目的每个文件的编译器选项。在 VSCodium 中加载该文件,会告知 IntelliSense 功能在哪里查找头文件(查看 文档)。

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

最后的部分为我们的项目定义一些测试。项目使用先前加载的 GoogleTest 框架。单元测试的整个话题将会划归到另外一篇文章。

enable_testing()

add_executable(unit_test unit_test.cpp)

target_link_libraries(unit_test gtest_main)

include(GoogleTest)

gtest_discover_tests(unit_test)

库层次的 CMakeLists.txt

现在,我们来看看包含同名库的子目录 Generator 中的 CMakeLists.txt 文件。这个 CMakeLists.txt 文件的内容更简短一些,除了单元测试相关的命令外,它仅包含 2 条语句。

add_library(Generator STATIC Generator.cpp Generator.h)
target_include_directories(Generator INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

我们使用 add_library(...) 来定义一个新的构建目标:静态的 Generator 库。我们使用语句 target_include_directories(...) 来把当前子目录添加到其它构建目标的头文件的搜索路径之中。我们也具体指定这个属性的范围为类型 INTERFACE:这意味着该属性仅影响链接到这个库的构建目标,而不是库本身。

开始使用 VSCodium

通过使用 CMakeLists.txt 文件中的信息,像 VSCodium 一样的 IDE 可以相应地配置构建系统。如果你还没有使用 VSCodium 或 VS Code 的经验,这个示例项目会是一个很好的起点。首先,转到它们的 网站 ,然后针对你的系统下载最新的安装软件包。打开 VSCodium 并导航到 “ 扩展 Extensions ” 标签页。

为了正确地构建、调试和测试项目,搜索下面的扩展并安装它们:

 title=

如果尚未完成,通过单击起始页的 “ 克隆 Git 存储库 Clone Git Repository ” 来克隆存储库。

 title=

或者手动输入:

git clone https://github.com/hANSIc99/cpp_testing_sample.git

之后,通过输入如下内容来签出标签 devops_1

git checkout tags/devops_1

或者,通过单击 “main” 分支按钮(红色框),并从下拉菜单(黄色框)中选择标签。

 title=

在你打开 VSCodium 内部中的存储库的根文件夹后,CMake Tools 扩展会侦测 CMakeLists.txt 文件并立即扫描你的系统寻找合适的编译器。你现在可以单击屏幕的底部的 “ 构建 Build ” 按钮(红色框)来开始构建过程。你也可以通过单击底部区域的按钮(黄色框)标记来更改编译器,它显示当前活动的编译器。

 title=

要开始调试 Producer 可执行文件,单击调试器符号(黄色框)并从下拉菜单中选择 “ 调试 Debug Producer”(绿色框)。

 title=

如上所述,Producer 可执行文件要求将元素的数量作为一个命令行的参数。命令行参数可以在 .vscode/launch.json 中具体指定。

 title=

好了,你现在能够构建和调试项目了。

结束语

归功于 CMake ,不管你正在运行哪种操作系统,上述步骤应该都能工作。特别是使用与 CMake 相关的扩展,VSCodium 变成了一个强大的 IDE 。我没有提及 VSCodium 的 Git 集成,是因为你已经能够在网络上查找很多的资源。我希望你可以看到:提供一个适当的 CMake 配置文件可以使其他人更容易地构建、使用和贡献于你的项目。在未来的文章中,我将介绍单元测试和 CMake 的测试实用程序 ctest


via: https://opensource.com/article/22/1/devops-cmake

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

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