分类 技术 下的文章

你好! 我最近又开始运行一些服务器(nginx playgroundmess with dnsdns lookup),所以我一直在考虑监控问题。

最初我并不完全清楚如何监控这些网站,所以我想快速写下我是如何做到的。

我根本不打算谈如何监控大型的、严肃的关键任务网站,只谈微型的不重要的网站。

目标:在操作上几乎不花时间

我希望网站大部分时间都能正常工作,但我也希望不用在持续的运营上花费时间。

我最初对运行服务器非常警惕,因为在我的上一份工作中,我是 24/7 轮流值班,负责一些关键的服务,在我的印象中,“负责服务器”意味着“在凌晨 2 点被叫起来修理服务器”和“有很多复杂的仪表盘”。

所以有一段时间我只做静态网站,这样我就不用考虑服务器的问题。

但最终我意识到,我所要写的任何服务器的风险都很低,如果它们偶尔宕机 2 小时也没什么大不了的,我只需设置一些非常简单的监控来帮助它们保持运行。

没有监控很糟糕

起初,我根本没有为我的服务器设置任何监控。这样做的结果是非常可预见的:有时网站坏了,而我却没有发现,直到有人告诉我!

步骤 1:uptime 检查器

第一步是建立一个 uptime 检查器。外面有很多这样的东西,我现在使用的是 updown.iouptime robot。我更喜欢 updown 的用户界面和 定价 结构(它是按请求而不是按月收费),但 uptime 机器人有一个更慷慨的免费套餐。

它们会:

  1. 检查网站是否正常
  2. 如果出现故障,它会给我发电子邮件

我发现电子邮件通知对我来说是一个很好的通知级别,如果网站宕机,我会很快发现,但它不会吵醒我或做其它的什么打扰。

步骤 2:端到端的健康检查

接下来,让我们谈谈“检查网站是否正常”到底是什么意思。

起初,我只是把我的健康检查端点之一变成一个函数,无论如何都会返回 200 OK

这倒是挺有用的 – 它告诉我服务器是启动着的!

但不出所料,我遇到了问题,因为它没有检查 API 是否真的在 工作 – 有时健康检查成功了,尽管服务的其他部分实际上已经进入了一个糟糕的状态。

所以我更新了它,让它真正地发出 API 请求,并确保它成功了。

我所有的服务都只做了很少的事情(nginx playground 只有一个端点),所以设置一个健康检查是非常容易的,它实际上贯穿了服务应该做的大部分动作。

下面是 nginx playground 的端到端健康检查处理程序的样子。它非常基本:它只是发出一个 POST 请求(给自己),并检查该请求是成功还是失败。

    func healthHandler(w http.ResponseWriter, r *http.Request) {
        // make a request to localhost:8080 with `healthcheckJSON` as the body
        // if it works, return 200
        // if it doesn't, return 500
        client := http.Client{}
        resp, err := client.Post("http://localhost:8080/", "application/json", strings.NewReader(healthcheckJSON))
        if err != nil {
            log.Println(err)
            w.WriteHeader(http.StatusInternalServerError)
            return
        }
        if resp.StatusCode != http.StatusOK {
            log.Println(resp.StatusCode)
            w.WriteHeader(http.StatusInternalServerError)
            return
        }
        w.WriteHeader(http.StatusOK)
    }

健康检查频率:每小时一次

现在,我大部分健康检查每小时运行一次,有些每 30 分钟运行一次。

我每小时运行一次,因为 updown.io 的定价是按健康检查次数计算的,我正在监控 18 个不同的 URL,而且我想把我的健康检查预算保持在 5 美元/年的最低水平。

花一个小时来发现这些网站中的一个出现故障,对我来说是可以的 – 如果有问题,我也不能保证能很快修复它。

如果可以更频繁地运行它们,我可能会每 5-10 分钟运行一次。

步骤 3:第三步:如果健康检查失败,自动重新启动

我的一些网站在 fly.io 上,fly 有一个相当标准的功能,我可以为一个服务配置一个 HTTP 健康检查,如果健康检查失败,就重新启动服务。

“经常重启”是一个非常有用的策略来弥补我尚未修复的 bug,有一段时间,nginx playground 有一个进程泄漏,nginx 进程没有被终止,所以服务器的内存一直在耗尽。

通过健康检查,其结果是,每隔一天左右就会发生这样的情况:

  • 服务器的内存用完了
  • 健康检查开始失败
  • 它被重新启动
  • 一切又正常了
  • 几个小时后再次重复整个传奇

最终,我开始实际修复进程泄漏,但很高兴有一个解决方法可以在我拖延修复 bug 时保持运行。

这些用于决定是否重新启动服务的运行状况检查更频繁地运行:每 5 分钟左右。

这不是监控大型服务的最佳方式

这可能很明显,我在一开始就已经说过了,但是“编写一个 HTTP 健康检查”并不是监控大型复杂服务的最佳方法。 但我不会深入讨论,因为这不是这篇文章的主题。

到目前为止一直运行良好!

我最初在 3 个月前的四月写了这篇文章,但我一直等到现在才发布它以确保整个设置正常工作。

这带来了很大的不同 – 在我遇到一些非常愚蠢的停机问题之前,现在在过去的几个月里,网站的运行时间达到了 99.95%!


via: https://jvns.ca/blog/2022/07/09/monitoring-small-web-services/

作者:Julia Evans 选题:lujun9972 译者:geekpi 校对:wxy

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

在本杂志 2022 年 4 月号中,我们了解了不同类型的 SSL 证书及其应用。本文介绍如何手动更新现有 SSL 证书,以使其保持最新的安全要求。

当访问者与你的网站互动并分享信用卡号码等关键细节时,他们相信他们的信息已得到保护,不会被滥用。因此,你有责任尊重这种信任并为你网站上的所有访问者提供全面保护。不这样做不仅会使你失去客户的忠诚度,而且还可能使你陷入法律困境。在许多情况下,无法保护客户数据免遭泄露、盗窃或滥用的网站被迫支付巨额罚款,同时也失去了声誉。

SSL 证书如何保护客户的数据?

保护敏感客户信息的最佳方法之一是使用 SSL(安全套接字层)证书保护你的站点。用不涉及技术细节的话来说,SSL 证书对 Web 服务器和访问者浏览器之间的通信进行加密,从而使黑客或威胁参与者在技术上不可能窃取传输中的数据。 SSL 建立了一个安全的握手过程来解密加密的信息,这个过程太复杂了,人类甚至软件都无法破解。(LCTT 校注:此处言过其实,SSL 加密传输的信息并不是绝对不可截获和破解的,比如中间人攻击等。)

为什么需要更新 SSL 证书?

虽然 SSL 证书提供了防止数据盗窃或滥用的安全性,但你需要定期更新它以确保最有效的安全性以抵御最新的威胁。本文将列出以正确方式更新 SSL 证书的分步说明。

更新 SSL 证书有很多好处:

  • 及时更新验证你的网站的身份。
  • 获得更新的安全性。
  • 一年有效期促进定期更新/升级保护范围的健康实践,从而消除与过时版本相关的风险。
注意:最佳做法是选择一种自动续订方式,以减轻你记住续订日期或手动执行相关步骤的压力。

有点跑题了,构建你自己的 SSL 证书的纯开源方式

是的,这绝对是真的!通过一些简化和紧凑的步骤,你实际上可以从头开始构建自己的 SSL 证书!虽然整个过程超出了本文的范围,但这里有一些可用于创建 SSL 证书的关键开源组件和工具。

  • OpenSSL:这是实现 TLS 和加密库的高度可信的工具。
  • EasyRSA:此命令行工具使你能够构建 PKI CA 并有效地管理它。
  • CFSSL:Cloudflare 终于为 PKI 和 TLS 构建了一个多用途、多功能的工具。
  • Lemur:由 Netflix 开发的还不错的 TLS 生成器。

如何更新你的 SSL 证书

虽然 SSL 更新的一般过程保持不变,但可能会有一些细微的调整和变化,具体取决于你的特定 SSL 提供商。

更新过程遵循三个主要步骤:CSR(证书签名请求)生成、证书激活,最后是证书安装。

生成 CSR: 对于 cPanel 托管面板,你可以单击“ 安全 Security ”选项卡并搜索 SSL/TLS 选项。它将显示一个页面,在 CSR 选项下方有一个链接。这里可以帮助你为所需的域名生成新的 CSR。

系统将询问你详细的联系信息,以确认你是真正的域所有者。填写表格后,你将获得证书重新激活所需的 CSR 代码。

激活 SSL 证书: 在你的仪表板中,你可以快速查看拥有的 SSL 证书、域和其他数字基础设施产品。单击该按钮开始 SSL 续订过程。输入之前生成的 CSR,确认信息的准确性。你现在可以验证 SSL 续订过程。

验证 SSL 证书: 系统将再次提示你确认域所有权 —— 输入与域相关的电子邮件;在需要安装证书的 Web 服务器上上传文件;借助 CNAME 记录验证 SSL 证书等等。虽然有多种选择,但最好和最简单的方法是通过电子邮件进行验证。输入与该域关联的电子邮件后,你将收到一封包含特定链接的电子邮件,然后是另一封邮件,其中包含带有 .crt 扩展名的新证书文件。

安装 SSL 证书: 你的主机托管商将为你提供与支持团队沟通的方式,以安装更新文件,或为你提供有关如何通过 cPanel 手动执行此操作的详细说明。请记住,不同的主机提供不同的续订方式。也就是说,如果你是非技术人员,那么联系支持团队将是你的最佳选择。

如需手动更新,请访问 cPanel 的 “SSL/TLS” 页并找到 “ 管理 SSL 站点 Manage SSL sites ”选项。它包含了你拥有的整个域列表。对应每个域名,你可以看到证书更新选项。

在旁边的页面中,使用“ 按域自动填写 Autofill by Domain ”选项输入“ 私钥 Private Key ”的详细信息。在 “ 证书 Certificate ” 选项下,填写你的 .crt 文件的详细信息。离完成就剩一步了。只需单击显示“ 安装证书 Install Certificate ”的按钮。

除了保存用户的关键数据和敏感信息外,SSL 证书还通过重申你网站上共享的数据是安全的来建立信任。由于谷歌认为 SSL 认证是一种健康的做法,因此它也会对你的 SEO 产生积极影响。但是,要继续享受此证书的最佳安全性,你需要定期更新它。这可以确保你的网站根据最新的安全要求,充分防止数据传输中的攻击。


via: https://www.opensourceforu.com/2022/07/manual-renewal-of-ssl-certificates-a-simple-guide/

作者:Jitendra Bhojwani 选题:lkxed 译者:geekpi 校对:wxy

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

Arch Linux 在桌面 Linux 世界中非常流行。受欢迎的原因之一是 安装 Arch Linux 本身就是一项复杂的任务。

我没有夸大其词。安装 Ubuntu 或 Debian 比 Arch Linux 容易得多,因为官方没给后者提供图形界面的安装程序。

这时虚拟机就派上用场了。

你可以先在 VirtualBox 中尝试安装 Arch Linux,看看它是否是你想在实际硬件上运行的系统。通过这种方式,你可以在不弄乱当前操作系统的情况下体验 Arch Linux。

在本文,我将一步一步指导你完成一个实用的 Arch Linux 虚拟机的安装过程。

在 VirtualBox 上安装 Arch Linux

毫无疑问,你需要先 在 Linux 上安装 VirtualBox(或在 Windows 上)。在 Windows 上,只需访问 Oracle 的网站并下载 VirtualBox。

下载 VirtualBox

如果你使用的是 Windows 10 或更高版本,请确保你的系统已启用虚拟化。

完成后,你需要到 Arch Linux 官方网站 下载 ISO 文件。你应该找到 使用 torrent 下载 或直接下载文件的选项。

你可以保留 ISO 文件以备不时之需,安装成功后也可以将其删除以 释放系统上的空间

现在,让我们开始在 VirtualBox 上安装 Arch Linux 吧。

第一部分 创建虚拟机

第一步:首先,你需要在 VirtualBox 中设置一下。启动 VirtualBox 并单击 “ 新建 New ” 来创建一个虚拟机。

注意,你可以使用 “ 向导模式 guided mode ” 继续创建虚拟机,但使用 “ 专家模式 expert mode ” 可以一目了然地获得更多选项。

因此,我推荐使用专家模式来创建虚拟机。

不用担心,专家模式同样简单,只是多了一些额外的可选项,无需担心其他任何事情。

第二步:输入你的虚拟机名称。当你在 “ 名称 Name ” 字段中输入 “Arch Linux” 时,它会分别自动检测 “ 类型 Type ” 和 “ 版本 Version ”。

你应该增加内存大小以舒适地使用虚拟机。如果只是用于小型测试,你可以继续使用默认设置。

我在这个例子中分配了 4 GB 左右的内存

另外,请确保在 “ 硬盘 Hard disk ”选项下选择 “ 现在创建虚拟硬盘 create a virtual hard disk ”。它应该是默认选项。

现在,继续设置虚拟硬盘大小。

第三步:你可以选择虚拟硬盘的存放位置,并根据你的需求调整大小。最小分配大小(8 GB)对于安装系统应该不是问题,但安全起见,你可能得分配至少 10 到 15 GB。

接下来,你需要将硬盘硬盘文件类型选择为 “VDI(VirtualBox Disk Image)” ,将存储选择为 “ 动态分配 Dynamically assigned ”,如上图所示。

VDI 是虚拟硬盘最常见的硬盘类型。

当你为硬盘存储选择 “ 动态分配 Dynamically allocated ” 选项时,这意味着存储空间将根据使用情况进行使用。换言之,当创建虚拟机后,并不会立即将这 15 GB 的空间从你的磁盘中锁定。

现在,你所要做的就是点击 “ 创建 Create ” 来添加虚拟机。

第二部分 添加 ISO 文件以开始安装 Arch Linux

当虚拟机在左侧列表中出现后,你可以查看其配置并在 “ 存储 Storage ” 选项下选择 ISO 文件作为磁盘驱动。

你也可以单独前往虚拟机设置以探索更多内容并选择 ISO 文件。

为此,你需要导航至虚拟机设置的 “ 存储 Storage ” 标签页。

在这里,你必须单击 “ 控制器 Controller ” 下的 “ 没有盘片 Empty ”,然后继续选择 Arch Linux ISO 文件作为磁盘文件(如上图所示)。

完成选择后,点击 “OK” 以保存设置的变更。

将 ISO 设置为要引导的磁盘时,虚拟机设置应如下所示:

现在,点击 “ 启动 Start ” 启动虚拟机并开始安装。

第三部分 使用引导式安装程序安装 Arch Linux

使用 介绍一个引导式安装程序 的方法使安装 Arch Linux 变得更容易,也就是说,它为你提供了设置成熟的 Arch Linux 系统所需的所有选项。

因此,在引导式安装程序的帮助下,你不必单独安装桌面环境和其他基本软件包。你所要做的就是按照屏幕上的说明选择适合你的选项。

在本文中,我们将重点介绍引导式安装程序。如果你想自己做,你应该遵循我们的 Arch 安装指南

继续安装流程,当你启动虚拟机时,将看到以下屏幕:

第一个选项是理想的处理方式。如果你有特定的要求,可以选择其他选项来启动 Arch Linux。

现在,你应该正在查看一个终端窗口。以下是如何开始:

第一步:输入 archinstall 以使用引导式安装程序启动安装。

第二步:根据你的要求选择键盘布局,美式布局应该是最常见的选择。简单地输入一个数字即可进行选择,如下图所示(例如,26):

第三步:接下来,你需要选择一个区域来下载包。

选择首选地区而不是 “ 全球 Worldwide ”。这至关重要,因为如果你选择 全球 作为你的地区,它会下载许多不必要的包。

第四步:选择区域后,它会要求你选择驱动器进行安装。在这个例子中,我们已经创建了一个大约 15 GB 的虚拟驱动器,显示为 /dev/sda

类似的,根据大小检查你创建的驱动器,然后选择该磁盘继续。在这里,我输入 1 作为输入;你的可能会有所不同。

第五步:接下来,你将被询问以下内容:

  • 选择文件系统类型
  • 加密密码(可选的)
  • 主机名
  • 创建 root 密码(可选的)
  • 创建超级用户
  • 选择一个预编程的配置文件

在我的测试中,我选择了 btrfs 作为文件系统,没有设置任何磁盘加密密码。

主机名可随心所欲的设置,但我建议保持简短。

你可以选择创建一个 root 密码,即使不这么做也应该没什么问题。不过,你需要创建一个具有 sudo 权限的超级用户。

我使用 admin/pass 作为用户名和密码。不过,如果你不想让其他人访问你计算机上的虚拟机,则不应使用易于猜测的密码。

然后,你将看到一个选择配置文件的选项。在这种情况下,我们需要一个成熟的 Arch Linux 桌面。因此,我们通过输入 0 来选择 “ 桌面 desktop ”。

第六步:接下来,你将被要求选择桌面环境。我决定使用 KDE。你可以选择任何你喜欢的。

第七步:最后,你将被要求选择显卡驱动程序。由于我们是在 VirtualBox 上安装的 Arch Linux,你可以选择选项 4:VMware/VirtualBox,如下图所示:

你可能还会被要求输入“是(y)或否(n)”选择 pipewire 而不是 PulseAudio 作为音频服务。选任何一个都应该都可以。

第八步:接下来是重要的一步。在这里,如果你需要内核的 LTS 版本,你可以选择使用 “linux-lts”,或者继续使用默认值。

安装程序会提示你输入想安装的软件包。在这里,我们没有任何特殊要求,因此我们将其留空并按回车键跳过。

第九步:你将被要求选择所需的网络适配器以启用互联网访问。你必须选择以下选项:

使用网络管理器来控制和管理你的互联网连接 Use network manager to control and manage your internet connection

第十步:下一步需要定义时区。选择适用于你的时区,或继续使用默认选项。

第十一步:完成后,它将显示你选择的大部分选项以供确认。按回车键继续。

第十二步:安装完成需要花费几分钟时间,这取决于你的互联网连接速度。

安装完成后,它会要求你 “chroot 进入新创建的安装以进行安装后配置”,但我们不需要。因此输入 N 以完成安装。

第十三步:最后,你应该会再次看到终端窗口。输入:

shutdown now

这将安全地退出安装并关闭虚拟机。

一切就绪!在启动安装了 Arch 的虚拟机之前,你还需要做一件事 —— 移除选择作为光驱的 ISO 磁盘。与添加启动 ISO 的方式类似,你可以前往虚拟机设置并将其删除,如下所示:

到此为止你已在 VirtualBox 上安装了 Arch Linux。

你所要做的就是启动虚拟机,在我的例子中它是这样的:

virtualbox arch

尽管浏览这些选项需要一些时间,但 Arch Linux 上新的引导式安装程序可以节省大量时间使必填项配置正确。

同样的步骤也适用于在你的计算机上安装 Arch Linux。你需要用 Arch Linux ISO 文件 使用 Etcher 制作单独的可启动 USB 盘

总结

Arch Linux 成为一种流行的选择 有多种原因。但是,如果这是你第一次安装,或者你想对其进行测试,那么虚拟机是在不打乱主机的情况下体验它的最佳方式。

我希望这可以帮助你在 VirtualBox 上安装 Arch Linux。在下面的评论中让我知道你的想法。


via: https://itsfoss.com/install-arch-linux-virtualbox/

作者:Ankush Das 选题:lujun9972 译者:hanszhao80 校对:wxy

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

我喜欢 在 Ubuntu 中使用深色模式。在我看来深色模式能够缓解视觉疲劳,让系统看起来更加的赏心悦目。

我发现了一个 gedit 文本编辑器的小麻烦,如果你在深色模式下使用它,你也许也会遇到。

默认情况下 gedit 高亮当前光标所在的行。这是一个非常有用的功能,但是如果你在 Linux 系统中开启了深色模式,那么你将会感到痛苦。为什么?因为被高亮的文本将不再变得可读。你自己看吧:

Text on the highlighted line is hardly visible

如果你选择文本,它将变得可读,但这并不是一个让人感到有多么愉快的阅读或者编辑体验。(LCTT 校注:在新的 Ubuntu 22.04 中,这一情况已经有所改善,“高亮当前行”已被取消勾选)

Selecting the text makes it better but that’s not a convenient thing to do for all lines

好消息是你不需要再忍受它。我将演示几个步骤让你能够同时享受 gedit 以及系统的深色模式。

让 gedit 在深色模式下阅读体验友好

你基本上有两个选择:

  1. 禁用高亮当前行,但也同时意味着你必须清楚地知道你在哪一行。
  2. 改变默认的颜色设置,但编辑器的颜色会变得稍微有些不同,而且如果你更改系统主题,它不会自动切换到浅色模式。

在 gedit 或者 GNOME 的开发者解决这个问题之前,这是你必须要做的应变和妥协。

选项1: 禁止高亮当前行

当你打开 gedit 后,点击汉堡菜单然后选择“ 首选项 Preferences ”。

Go to Preferences

在查看选项卡,你应该看到在 “ 高亮 Highlighting ” 区域的下方的 “ 高亮当前行 Highlight current line ” 选项。取消勾选这个选项,马上就可以看到效果。

Disable highlighting current line

“高亮当前行”是一个有用的功能,如果你想继续使用它,请选择第二个选项。

选项2: 更改编辑器的颜色主题

在“ 首选项 Preferences ”窗口,找到 “字体与颜色Font & Colors” 标签页,然后将颜色主题更改为 “Oblivion”、“Solarized Dark”,或者 “Cobalt”。

Change the color scheme

正如我前面所提到的,缺点就是当你把系统主题切换为浅色模式时,编辑器将不会自动切换到浅色模式。

开发者应该修复的一个 bug

这里 有几个 Linux 可用的文本编辑器 ,但是为了快速阅读或编辑文本文件,我更推荐使用 gedit。尽管如此,小烦恼仍旧是小烦恼。开发者应该在将来的版本中为这个很好的文本编辑器修复这个问题,让我们不再求助于这些应对办法。

你呢?你在你的系统上使用深色模式还是浅色模式?你注意到 gedit 的这个问题了吗?你有使用什么方法去解决它吗?欢迎分享你的经验。


via: https://itsfoss.com/gedit-dark-mode-problem/

作者:Abhishek Prakash 选题:lujun9972 译者:void-mori 校对:wxy

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

R 语言有非常多的绘图和数据可视化的包,比如 graphicslatticeggplot2 等。这是 R 语言系列的第 9 篇文章,我们会介绍 R 中用来绘图的各种函数。

本文使用的 R 是 4.1.2 版本,运行环境为 Parabola GNU/Linux-libre (x86-64)。

$ R --version

R version 4.1.2 (2021-11-01) -- "Bird Hippie"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R 是自由软件,没有任何担保责任。只要遵守 GNU 通用公共许可证的版本 2 或者版本 3,你就可以对它进行(修改和)再分发。详情见 https://www.gnu.org/licenses/

折线图

我们以印度全境消费者物价指数(CPI -- 乡村/城市)数据集为研究对象,它可以从 https://data.gov.in/catalog/all-india-consumer-price-index-ruralurban-0 下载。选择“截止到 2021 年 11 月” 的版本,用 read.csv 函数读取下载好的文件,如下所示:

> cpi <- read.csv(file="CPI.csv", sep=",")

> head(cpi)
Sector Year Name Andhra.Pradesh Arunachal.Pradesh Assam Bihar
1 Rural 2011 January 104 NA 104 NA
2 Urban 2011 January 103 NA 103 NA
3 Rural+Urban 2011 January 103 NA 104 NA
4 Rural 2011 February 107 NA 105 NA
5 Urban 2011 February 106 NA 106 NA
6 Rural+Urban 2011 February 105 NA 105 NA
Chattisgarh Delhi Goa Gujarat Haryana Himachal.Pradesh Jharkhand Karnataka
1 105 NA 103 104 104 104 105 104
2 104 NA 103 104 104 103 104 104
3 104 NA 103 104 104 103 105 104
4 107 NA 105 106 106 105 107 106
5 106 NA 105 107 107 105 107 108
6 105 NA 104 105 106 104 106 106
...

以 Punjab 州为例,对每年各月份的 CPI 值求和,然后用 plot 函数画一张折线图:

> punjab <- aggregate(x=cpi$Punjab, by=list(cpi$Year), FUN=sum)

> head(punjab)
Group.1 x
1 2011 3881.76
2 2012 4183.30
3 2013 4368.40
4 2014 4455.50
5 2015 4584.30
6 2016 4715.80

> plot(punjab$Group.1, punjab$x, type="l", main="Punjab Consumer Price Index upto November 2021", xlab="Year", ylab="Consumer Price Index")

plot 函数可以传入如下参数:

参数描述
x向量类型,用于绘制 x 轴的数据
y向量或列表类型,用于绘制 y 轴的数据
type设置绘图类型:p 画点;l 画线;o 同时画点和线,且相互重叠;s 画阶梯线;h 画铅垂线
xlimx 轴范围
ylimy 轴范围
main标题
sub副标题
xlabx 轴标题
ylaby 轴标题
axes逻辑型,是否绘制坐标轴

结果如图 1。

Figure 1: Line chart

自相关图

自相关图能在时序分析中展示一个变量是否具有自相关性,可以用 R 中的 acf 函数绘制。acf 函数可以设置三种自相关类型:correlationcovariancepartial。图 2 是 Punjab 州 CPI 值的自相关图,x 表示 CPI。

acf(punjab$x,main='x')

Figure 2: ACF chart

acf 函数可以传入以下参数:

参数描述
x一个单变量或多变量的时序对象,或者一个数值向量或数值矩阵
lag.max最大滞后阶数
type字符型,设置所计算的自相关类型:correlationcovariancepartial
plot逻辑性,若 TRUE 则绘制图像,若 FALSE 则打印传入数据的描述信息
i一组要保留的时差滞后
j一组要保留的名称或数字

柱状图

R 中画柱状图的函数是 barplot。下面的代码用来画 Punjab 州 CPI 的柱状图,如图3:

> barplot(punjab$x, main="Punjab Consumer Price Index", sub="Upto November 2021", xlab="Year", ylab="Consumer Price Index", col="navy")

Figure 3: Line chart of Punjab's CPI

barplot 函数的使用方法非常灵活,可以传入以下参数:

参数描述
height数值向量或数值矩阵,包含用于绘图的数据
width数值向量,用于设置柱宽
space柱间距
beside逻辑型,若 FALSE 则绘制堆积柱状图,若 TRUE 则绘制并列柱状图
density数值型,设置阴影线的填充密度(条数/英寸),默认为 NULL,即不填充阴影线
angle数值型,填充线条的角度,默认为 45
border柱形边缘的颜色
main标题
sub副标题
xlabx 轴标题
ylaby 轴标题
xlimx 轴范围
ylimy 轴范围
axes逻辑型,是否绘制坐标轴

help 命令可以查看 barplot 函数的详细信息:

> help(barplot)

barplot                package:graphics                R Documentation

Bar Plots

Description:

     Creates a bar plot with vertical or horizontal bars.

Usage:

     barplot(height, ...)

     ## Default S3 method:
     barplot(height, width = 1, space = NULL,
             names.arg = NULL, legend.text = NULL, beside = FALSE,
             horiz = FALSE, density = NULL, angle = 45,
             col = NULL, border = par("fg"),
             main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
             xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
             axes = TRUE, axisnames = TRUE,
             cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
             inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
             add = FALSE, ann = !add && par("ann"), args.legend = NULL, ...)

     ## S3 method for class 'formula'
     barplot(formula, data, subset, na.action,
             horiz = FALSE, xlab = NULL, ylab = NULL, ...)

饼图

绘制饼图时要多加注意,因为饼图不一定能展示出各扇形间的区别。(LCTT 译注:根据统计学家和一些心理学家的调查结果,这种以比例展示数据的统计图形 实际上是很糟糕的可视化方式,因此,R 关于饼图的帮助文件中清楚地说明了并不推荐使用饼图,而是使用条形图或点图作为替代。) 用 subset 函数获得 Gujarat 州在 2021 年 1 月 Rural、Urban、Rurual+Urban 的 CPI 值:

> jan2021 <- subset(cpi, Name=="January" & Year=="2021")

> jan2021$Gujarat
[1] 153.9 151.2 149.1

> names <- c('Rural', 'Urban', 'Rural+Urban')

使用 pie 函数为 Gujarat 州的 CPI 值生成饼图,如下所示:

> pie(jan2021$Gujarat, names, main="Gujarat CPI Rural and Urban Pie Chart")

Figure 4: Pie chart

pie 函数可以传入以下参数:

参数描述
`x元素大于 0 的数值向量
label字符向量,用于设置每个扇形的标签
radius饼图的半径
clockwise逻辑型,若 TRUE 则顺时针绘图,若 FALSE 则逆时针绘图
density数值型,设置阴影线的填充密度(条数/英寸),默认为 NULL,即不填充阴影线
angle数值型,填充线条的角度,默认为 45
col数值向量,用于设置颜色
lty每个扇形的线条类型
main标题

箱线图

(LCTT 译注:箱线图主要是 从四分位数的角度出发 描述数据的分布,它通过最大值(Q4)、上四分位数(Q3)、中位数(Q2)、下四分位数(Q1) 和最小值(Q0)五处位置来获取一维数据的分布概况。我们知道,这五处位置之间依次包含了四段数据,每段中数据量均为总数据量的 1/4。通过每一段数据占据的长度,我们可以大致推断出数据的集中或离散趋势。长度越短,说明数据在该区间上越密集,反之则稀疏。)

箱线图能够用“ 须线 whisker ” 展示一个变量的 四分位距 Interquartile Range (简称 IQR=Q3-Q1)。用上下四分位数分别加/减内四分位距,再乘以一个人为设定的倍数 range(见下面的参数列表),得到 range * c(Q1-IQR, Q3+IQR),超过这个范围的数据点就被视作离群点,在图中直接以点的形式表示出来。

boxplot 函数可以传入以下参数:

参数描述
data数据框或列表,用于参数类型为公式的情况
x数值向量或者列表,若为列表则对列表中每一个子对象依次作出箱线图
width设置箱子的宽度
outline逻辑型,设置是否绘制离群点
names设置每个箱子的标签
border设置每个箱子的边缘的颜色
range延伸倍数,设置箱线图末端(须)延伸到什么位置
plot逻辑型,设置是否生成图像,若 TRUE 则生成图像,若 FALSE 则打印传入数据的描述信息
horizontal逻辑型,设置箱线图是否水平放置

boxplot 函数绘制部分州的箱线图:

> names <- c ('Andaman and Nicobar', 'Lakshadweep', 'Delhi', 'Goa', 'Gujarat', 'Bihar')
> boxplot(cpi$Andaman.and.Nicobar, cpi$Lakshadweep, cpi$Delhi, cpi$Goa, cpi$Gujarat, cpi$Bihar, names=names)

Figure 5: Box plot

QQ 图

QQ 图 Quantile-Quantile plot 可以用来对比两个数据集,也可以用来检查数据是否服从某种理论分布。qqnorm 函数能绘制正态分布 QQ 图,可以检验数据是否服从正态分布,用下面的代码绘制 Punjab 州 CPI 数据的 QQ 图:

> qqnorm(punjab$x)

Figure 6: Q-Q plot

qqline 函数可以向正态分布 QQ 图上添加理论分布曲线,它可以传入以下参数:

参数描述
x第一个数据样本
y第二个数据样本
datax逻辑型,设置是否以 x 轴表示理论曲线的值,默认为 FALSE
probs长度为 2 的数值向量,代表概率
xlabx 轴标题
ylaby 轴标题
qtype[1,9] 内的整数,设置分位计算类型,详情见 help(quantile) 的类型小节

等高图

等高图可以描述三维数据,在 R 中对应的函数是 contour,这个函数也可以用来向已有的图表添加等高线。等高图常与其他图表一起使用。我们用 contour 对 R 中的 volcano 数据集(奥克兰的火山地形信息)绘制等高图,代码如下:

> contour(volcano)

Figure 7: Volcano

contour 函数的常用参数如下:

参数描述
x,yz 中数值对应的点在平面上的位置
z数值向量
nlevels设置等高线的条数,调整等高线的疏密
labels等高线上的标记字符串,默认是高度的数值
xlim设置 x 轴的范围
ylim设置 y 轴的范围
zlim设置 z 轴的范围
axes设置是否绘制坐标轴
col设置等高线的颜色
lty设置线条的类型
lwd设置线条的粗细
vfont设置标签字体

等高线之间的区域可以用颜色填充,每种颜色表示一个高度范围,如下所示:

> filled.contour(volcano, asp = 1)
# asp 为图形纵横比,即 y 轴上的 1 单位长度和 x 轴上 1 单位长度的比率

填充结果见图 8。

Figure 8: Filled volcano

掌握上述内容后,你可以尝试 R 语言 graphics 包中的其他函数和图表(LCTT 译注:用 help(package=graphics) 可以查看 graphics 包提供的函数列表)。


via: https://www.opensourceforu.com/2022/05/plotting-data-in-r-graphs/

作者:Shakthi Kannan 选题:lkxed 译者:tanloong 校对:wxy

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

这篇教程演示如何使用脚本命令来发送自己的桌面通知与提醒。

 title=

有时候,来自脚本的视觉回馈是很有用的。例如,当一个脚本或计划任务完成时,一个长期运行的构建任务失败时,或者当脚本执行中出现了紧急问题时。桌面应用程序可以通过弹出通知来做到这一点,但脚本也可以做到这一点!你可以使用脚本命令来给自己发送桌面通知与提醒。

 title=

下面的代码是在 Linux 上编写和测试的。它也可以在 macOS 上运行,只需花点功夫。请参见最后一节 提示与技巧

从 Linux 终端发送通知

要从 Linux 终端发送通知,请使用 notify-send 命令。运行 which notify-send 命令来查看它是否在于你的系统中。如果没有,请使用包管理器来安装它。

在 Fedora 上,输入:

$ sudo dnf install notify-send

在基于 Debian 的发行版上,输入:

$ sudo apt install notify-send

几个简单的通知示例:

$ notify-send "Dinner ready!"
$ notify-send "Tip of the Day" "How about a nap?"

你可以用紧急程度、自定义图标等选项来自定义通知。过 man notify-send 了解更多。你也可以在通知正文中使用一小组 HTML 标记,以使消息有一个棒的视觉感受。最重要的是,URL 被呈现为可点击的。例如:

$ notify-send -u critical \
  "Build failed!" \
  "There were <b>123</b> errors. Click here to see the results: http://buildserver/latest"

 title=

发送的通知会被桌面环境接收,并像其他通知一样显示。它们将具有相同的外观、交互和行为。

将 notify-send 与 at 结合使用

计划任务通常被用来定期安排命令。at 命令安排在一个指定的时间执行一条命令。如果你像这样运行它,它会以交互模式启动,你可以在其中输入要在指定时间执行的命令:

$ at 12:00

这对脚本来说并不有用。幸运的是 at 接受来自标准输入的参数,所以我们可以这样使用它:

$ echo "npm run build" | at now + 1 minute
$ echo "backup-db" | at 13:00

有许多指定时间的方法。 从绝对时间,如 10:00,到相对时间,如 now + 2 hours ,再特殊时间,如noonmidnight。我们可以把它和 notify-send 结合起来,在未来的某个时间向自己发送提醒。例如:

$ echo "notify-send 'Stop it and go home now?' 'Enough work for today.' -u critical" | at now

 title=

提醒的命令

现在,建立一个自定义的 Bash 命令来给自己发送提醒信息。像这样简单且人性化的命令:

$ remind "I'm still here" now
$ remind "Time to wake up!" in 5 minutes
$ remind "Dinner" in 1 hour
$ remind "Take a break" at noon
$ remind "It's Friday pints time!" at 17:00

这比 Alexa 更好!该怎样做?

请看下面的代码。它定义了一个名为 remind 的函数,它支持上述语法。实际工作是在最后两行完成的。其余的部分负责显示帮助信息、参数校验等,这与任何大型应用程序中有用的代码与必要的白噪声的比例大致相同。

把代码保存在某个地方,例如,在 ~/bin/remind 文件中,并在你的 .bashrc 配置文件写入该函数,以便在你登录时加载它:

$ source ~/bin/remind

重新打开终端,然后输入 remind 来查看语法。尽情享受吧!

#!/usr/bin/env bash
function remind () {
  local COUNT="$#"
  local COMMAND="$1"
  local MESSAGE="$1"
  local OP="$2"
  shift 2
  local WHEN="$@"
  # Display help if no parameters or help command
  if [[ $COUNT -eq 0 || "$COMMAND" == "help" || "$COMMAND" == "--help" || "$COMMAND" == "-h" ]]; then
    echo "COMMAND"
    echo "    remind &lt;message&gt; &lt;time&gt;"
    echo "    remind &lt;command&gt;"
    echo
    echo "DESCRIPTION"
    echo "    Displays notification at specified time"
    echo
    echo "EXAMPLES"
    echo '    remind "Hi there" now'
    echo '    remind "Time to wake up" in 5 minutes'
    echo '    remind "Dinner" in 1 hour'
    echo '    remind "Take a break" at noon'
    echo '    remind "Are you ready?" at 13:00'
    echo '    remind list'
    echo '    remind clear'
    echo '    remind help'
    echo
    return
  fi
  # Check presence of AT command
  if ! which at &gt;/dev/null; then
    echo "remind: AT utility is required but not installed on your system. Install it with your package manager of choice, for example 'sudo apt install at'."
    return
  fi
  # Run commands: list, clear
  if [[ $COUNT -eq 1 ]]; then
    if [[ "$COMMAND" == "list" ]]; then
      at -l
    elif [[ "$COMMAND" == "clear" ]]; then
      at -r $(atq | cut -f1)
    else
      echo "remind: unknown command $COMMAND. Type 'remind' without any parameters to see syntax."
    fi
    return
  fi
  # Determine time of notification
  if [[ "$OP" == "in" ]]; then
    local TIME="now + $WHEN"
  elif [[ "$OP" == "at" ]]; then
    local TIME="$WHEN"
  elif [[ "$OP" == "now" ]]; then
    local TIME="now"
  else
    echo "remind: invalid time operator $OP"
    return
  fi
  # Schedule the notification
  echo "notify-send '$MESSAGE' 'Reminder' -u critical" | at $TIME 2&gt;/dev/null
  echo "Notification scheduled at $TIME"
}

简单的提醒

通过这几个简单的开源命令,你可以将你自己的脚本、应用程序和任务与你的桌面结合起来。试一试吧!


(文内图片来自 Tomasz Waraksa, CC BY-SA 4.0)

本文经作者许可改编自 原文


via: https://opensource.com/article/22/1/linux-desktop-notifications

作者:Tomasz Waraksa 选题:lujun9972 译者:mcfd 校对:wxy

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