蚊章汇 - 2020年2月
type: channel
link: https://linuxcn.bwsl.wang/2020/02/
description: Linux中国社区镜像站，没有大保镖。
items: 如何使用 byobu 复用 SSH 会话
items: 使用 Python 和 GNU Octave 绘制数据
items: 如何在 Fedora 上安装 MongoDB 服务器
items: Kubernetes 如何成为计算资源的标准
items: elementary OS 正在构建一个可以买应用的开源应用商店
items: 如何让 Emacs 俄罗斯方块变得更难
items: 使用 KRAWL 扫描 Kubernetes 错误
items: 如何组织构建多文件 C 语言程序（一）
items: 不喜欢 IDE？试试看 grepgitvi
items: 使用 Emacs 发送电子邮件和检查日历

如何使用 byobu 复用 SSH 会话
type: item
date: 2020-02-29T20:50:50+08:00
description: Byobu 能让你在保持会话活跃的情况下维护多个终端窗口，通过 SSH 连接、断开、重连以及共享访问。Byobu 是基于文本的窗口管理器和终端多路复用器。它类似于 GNU Screen，但更现代、更直观。它还适用于大多数 Linux、BSD 和 Mac 发行版。Byobu 能让你在保持会话活跃的情况下维护多个终端窗口、通过 SSH（secure shell）连接、断开、重连，甚至让其他人访问。比如，你 SSH 进入树莓派或服务器，并运行（比如） sudo apt update && sudo apt upgrade，然后你在它运行的时候失去了互联网连接，你的命令会丢失无效。然而，如果你首先启动 byobu 会话，那么它会继续运行，在你重连后，你会发现它仍在继续运行。Byobu 名称来自于日语的装饰性多面板屏风，它可作为折叠式隔断，我认为这很合适。要在 Debian/Raspbian/Ubuntu 上安装 byobu：sudo apt install byobu接着启用它：byobu-enable现在，请退出 SSH 会话并重新登录，你将会在 byobu 会话中登录。运行类似 sudo apt update 命令并关闭窗口（或输入转义序列（Enter + ~ + .）并重新登录。你将看到更新命令在你离开后还在运行。有很多我不常使用的功能。我通常使用的是：F2 – 新窗口F3/F4 – 在窗口间导航Ctrl+F2 – 垂直拆分窗格Shift+F2 – 水平拆分窗格Shift+左箭头/Shift+右箭头 – 在拆分窗格间导航Shift+F11 – 放大（或缩小）拆分窗格我们如何使用 byobuByobu 对于维护 piwheels（一个用于树莓派的方便的，预编译 Python 包）很好用。我水平拆分了窗格，在上半部分显示了 piwheels 监视器，在下半部分实时显示了 syslog 条目。接着，如果我们想要做其他事情，我们可以切换到另外一个窗口。当我们进行协作分析时，这特别方便，因为当我在 IRC 中聊天时，我可以看到我的同事 Dave 输入了什么（并纠正他的错字）。我在家庭和办公服务器上启用了 byobu，因此，当我登录到任何一台计算机时，一切都与我离开时一样。它正在运行多个作业、在特定目录中保留一个窗口，以另一个用户身份运行进程等。Byobu 对于在树莓派上进行开发也很方便。你可以在桌面上启动它，运行命令，然后 SSH 进入，并连接到该命令运行所在的会话。请注意，启用 byobu 不会更改终端启动器的功能。只需运行 byobu 即可启动它。本文最初发表在 Ben Nuttall 的 Tooling blog 中，并获许重用。via: https://opensource.com/article/20/2/byobu-ssh作者：Ben Nuttall 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

使用 Python 和 GNU Octave 绘制数据
type: item
date: 2020-02-29T19:48:00+08:00
description: 了解如何使用 Python 和 GNU Octave 完成一项常见的数据科学任务。数据科学是跨越编程语言的知识领域。有些语言以解决这一领域的问题而闻名，而另一些则鲜为人知。这篇文章将帮助你熟悉用一些流行的语言完成数据科学的工作。选择 Python 和 GNU Octave 做数据科学工作我经常尝试学习一种新的编程语言。为什么？这既有对旧方式的厌倦，也有对新方式的好奇。当我开始学习编程时，我唯一知道的语言是 C 语言。那些年的编程生涯既艰难又危险，因为我必须手动分配内存、管理指针、并记得释放内存。后来一个朋友建议我试试 Python，现在我的编程生活变得轻松多了。虽然程序运行变得慢多了，但我不必通过编写分析软件来受苦了。然而，我很快就意识到每种语言都有比其它语言更适合自己的应用场景。后来我学习了一些其它语言，每种语言都给我带来了一些新的启发。发现新的编程风格让我可以将一些解决方案移植到其他语言中，这样一切都变得有趣多了。为了对一种新的编程语言（及其文档）有所了解，我总是从编写一些执行我熟悉的任务的示例程序开始。为此，我将解释如何用 Python 和 GNU Octave 编写一个程序来完成一个你可以归类为数据科学的特殊任务。如果你已经熟悉其中一种语言，从它开始，然后通过其他语言寻找相似之处和不同之处。这篇文章并不是对编程语言的详尽比较，只是一个小小的展示。所有的程序都应该在命令行上运行，而不是用图形用户界面（GUI）。完整的例子可以在 polyglot\_fit 存储库中找到。编程任务你将在本系列中编写的程序:从 CSV 文件中读取数据用直线插入数据（例如 f(x)=m ⋅ x + q）将结果生成图像文件这是许多数据科学家遇到的常见情况。示例数据是 Anscombe 的四重奏的第一组，如下表所示。这是一组人工构建的数据，当用直线拟合时会给出相同的结果，但是它们的曲线非常不同。数据文件是一个文本文件，以制表符作为列分隔符，开头几行作为标题。此任务将仅使用第一组（即前两列）。Python 方式Python 是一种通用编程语言，是当今最流行的语言之一（依据 TIOBE 指数、RedMonk 编程语言排名、编程语言流行指数、GitHub Octoverse 状态和其他来源的调查结果）。它是一种解释型语言；因此，源代码由执行该指令的程序读取和评估。它有一个全面的标准库并且总体上非常好用（我对这最后一句话没有证据；这只是我的拙见）。安装要使用 Python 开发，你需要解释器和一些库。最低要求是：NumPy 用于简化数组和矩阵的操作SciPy 用于数据科学Matplotlib 用于绘图在 Fedora 安装它们是很容易的：sudo dnf install python3 python3-numpy python3-scipy python3-matplotlib代码注释在 Python中，注释)是通过在行首添加一个 # 来实现的，该行的其余部分将被解释器丢弃：# 这是被解释器忽略的注释。fitting\_python.py 示例使用注释在源代码中插入许可证信息，第一行是特殊注释)，它允许该脚本在命令行上执行:#!/usr/bin/env python3这一行通知命令行解释器，该脚本需要由程序 python3 执行。需要的库在 Python 中，库和模块可以作为一个对象导入（如示例中的第一行），其中包含库的所有函数和成员。可以通过使用 as 方式用自定义标签重命名它们：import numpy as np from scipy import stats import matplotlib.pyplot as plt你也可以决定只导入一个子模块（如第二行和第三行）。语法有两个（基本上）等效的方式：import module.submodule 和 from module import submodule。定义变量Python 的变量是在第一次赋值时被声明的：input_file_name = "anscombe.csv" delimiter = "\t" skip_header = 3 column_x = 0 column_y = 1变量类型由分配给变量的值推断。没有具有常量值的变量，除非它们在模块中声明并且只能被读取。习惯上，不应被修改的变量应该用大写字母命名。打印输出通过命令行运行程序意味着输出只能打印在终端上。Python 有 print() 函数，默认情况下，该函数打印其参数，并在输出的末尾添加一个换行符：print("#### Anscombe's first set with Python ####")在 Python 中，可以将 print() 函数与字符串类的格式化能力相结合。字符串具有format 方法，可用于向字符串本身添…

如何在 Fedora 上安装 MongoDB 服务器
type: item
date: 2020-02-28T22:27:44+08:00
description: Mongo（来自 “humongous” —— 巨大的）是一个高性能、开源、无模式的、面向文档的数据库，它是最受欢迎的 NoSQL 数据库之一。它使用 JSON 作为文档格式，并且可以在多个服务器节点之间进行扩展和复制。有关许可证更改的故事MongoDB 上游决定更改服务器代码的许可证已经一年多了。先前的许可证是 GNU Affero General Public License v3（AGPLv3）。但是，上游公司写了一个新许可证，旨在使运行 MongoDB 即服务的公司可以回馈社区。新许可证称为 Server Side Public License（SSPLv1），关于这个举措及其解释的更多说明，请参见 MongoDB SSPL FAQ。Fedora 一直只包含自由软件。当 SSPL 发布后，Fedora 确定它并不是自由软件许可证。许可证更改日期（2018 年 10 月）之前发布的所有 MongoDB 版本都可保留在 Fedora 中，但之后再也不更新的软件包会带来安全问题。因此，从 Fedora 30 开始，Fedora 社区决定完全移除 MongoDB 服务器。开发人员还有哪些选择？是的，还有替代方案，例如 PostgreSQL 在最新版本中也支持 JSON，它可以在无法再使用 MongoDB 的情况下使用它。使用 JSONB 类型，索引在 PostgreSQL 中可以很好地工作，其性能可与 MongoDB 媲美，甚至不会受到 ACID 的影响。开发人员可能选择 MongoDB 的技术原因并未随许可证而改变，因此许多人仍想使用它。重要的是要意识到，SSPL 许可证仅更改仅针对 MongoDB 服务器。MongoDB 上游还开发了其他项目，例如 MongoDB 工具、C 和 C++ 客户端库以及用于各种动态语言的连接器，这些项目在客户端使用（通过网络与服务器通信的应用中）。由于这些包的许可证人保持自由（主要是 Apache 许可证），因此它们保留在 Fedora 仓库中，因此用户可以将其用于应用开发。唯一的变化实际是服务器软件包本身，它已从 Fedora 仓库中完全删除。让我们看看 Fedora 用户可以如何获取非自由的包。如何从上游安装 MongoDB 服务器当 Fedora 用户想要安装 MongoDB 服务器时，他们需要直接向上游获取 MongoDB。但是，上游不为 Fedora 提供 RPM 包。相反，MongoDB 服务器可以获取源码 tarball，用户需要自己进行编译（这需要一些开发知识），或者 Fedora 用户可以使用一些兼容的包。在兼容的选项中，最好的选择是 RHEL-8 RPM。以下步骤描述了如何安装它们以及如何启动守护进程。1、使用上游 RPM 创建仓库（RHEL-8 构建）$ sudo cat > /etc/yum.repos.d/mongodb.repo >>EOF [mongodb-upstream] name=MongoDB Upstream Repository baseurl=https://repo.mongodb.org/yum/redhat/8Server/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc EOF2、安装元软件包，来拉取服务器和工具包$ sudo dnf install mongodb-org ...... Installed: mongodb-org-4.2.3-1.el8.x86_64 mongodb-org-mongos-4.2.3-1.el8.x86_64 mongodb-org-server-4.2.3-1.el8.x86_64 mongodb-org-shell-4.2.3-1.el8.x86_64 mongodb-org-tools-4.2.3-1.el8.x86_64 Complete!3、启动 MongoDB 守护进程$ sudo systemctl status mongod ● mongod.service - MongoDB Database Server Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-02-08 12:33:45 EST; 2s ago Docs: https://docs.mongodb.org/manual Process: 15768 ExecStart…

Kubernetes 如何成为计算资源的标准
type: item
date: 2020-02-28T21:17:46+08:00
description: 对于原生云生态系统来说，2019 年是改变游戏规则的一年。有大的并购，如 Red Hat Docker 和 Pivotal，并出现其他的玩家，如 Rancher Labs 和 Mirantis。Rancher Labs （一家为采用容器的团队提供完整软件栈的公司）的联合创始人兼首席执行官盛亮表示：“所有这些整合和并购，都表明这一领域的市场成熟的速度很快。”传统上，像 Kubernetes 和 Docker 这样的新兴技术吸引着开发者和像脸书和谷歌这样的超级用户。除了这群人之外则没什么兴趣。然而，这两种技术都在企业层面得到了广泛采用。突然间，出现了一个巨大的市场，有着巨大的机会。几乎每个人都跳了进去。有人带来了创新的解决方案，也有人试图赶上其他人。它很快变得非常拥挤和热闹起来。它也改变了创新的方式。早期采用者通常是精通技术的公司。现在，几乎每个人都在使用它，即使是在不被认为是 Kubernetes 地盘的地方。它改变了市场动态，像 Rancher Labs 这样的公司见证了独特的用例。盛亮补充道，“我从来没有经历过像 Kubernete 这样快速、动态的市场或技术演变。当我们五年前开始的时候，这是一个非常拥挤的空间。随着时间的推移，我们大多数的友商因为这样或那样的原因消失了。他们要么无法适应变化，要么选择不适应某些变化。”在 Kubernetes 的早期，最明显的机会是建立 Kubernetes 发行版本和 Kubernetes 业务。这是新技术。众所周知，它的安装、升级和操作相当的复杂。当谷歌、AWS 和微软进入市场时，一切都变了。当时，一群供应商蜂拥而至，为平台提供解决方案。盛亮表示:“一旦像谷歌这样的云提供商决定将 Kubernetes 作为一项服务，并免费提供亏本出售的商品，以推动基础设施消费；我们就知道，运营和支持 Kubernetes 业务的优势将非常有限了。”对谷歌之外的其它玩家来说，并非一切都不好。由于云供应商通过将它作为服务来提供，消除了 Kubernetes 带来的所有复杂性，这意味着更广泛地采用该技术，即使是那些由于运营成本而不愿使用该技术的人也是如此。这意味着 Kubernetes 将变得无处不在，并将成为一个行业标准。“Rancher Labs 是极少数将此视为机遇并比其他公司看得更远的公司之一。我们意识到 Kubernetes 将成为新的计算标准，就像 TCP/IP 成为网络标准一样，”盛亮说。CNCF 在围绕 Kubernetes 构建一个充满活力的生态系统方面发挥着至关重要的作用，创建了一个庞大的社区来构建、培育和商业化原生云开源技术。via: https://www.linux.com/articles/how-kubernetes-became-the-standard-for-compute-resources/作者：Swapnil Bhartiya 选题：lujun9972 译者：heguangzhi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

elementary OS 正在构建一个可以买应用的开源应用商店
type: item
date: 2020-02-28T07:36:01+08:00
description: elementary OS 正在构建一个应用中心生态系统，你可以在其中购买用于 Linux 发行版的开源应用程序。众筹构建一个开源应用中心elementary OS 最近宣布，它正在众筹举办一个构建应用中心的活动，你可以从这个应用中心购买开源应用程序。应用中心中的应用程序将为 Flatpak 格式。尽管这是 elementary OS 发起的活动，但这个新的应用中心也将适用于其他发行版。该活动旨在资助在美国科罗拉多州丹佛市进行的一项一周个人开发冲刺活动，其中包括来自 elementary OS、Endless、Flathub 和 GNOME 的开发人员。众筹活动已经超过了筹集 1 万美元的目标（LCTT 译注：截止至本译文发布，已近 15000 美金）。但你仍然可以为其提供资金，因为其他资金将用于开发 elementary OS。这个应用中心将带来什么功能其重点是提供“安全”应用程序，因此使用 Flatpak 应用来提供受限的应用程序。在这种格式下，默认情况下将会限制应用程序访问系统或个人文件，并在技术层面上将它们与其他应用程序隔离。仅当你明确表示同意时，应用程序才能访问操作系统和个人文件。除了安全性，Flatpak 还捆绑了所有依赖项。这样，即使当前 Linux 发行版中不提供这些依赖项，应用程序开发人员也可以利用这种最先进的技术使用它。AppCenter 还具有钱包功能，可以保存你的信用卡详细信息。这样，你无需每次输入卡的详细信息即可快速为应用付费。这个新的开源“应用中心”也将适用于其他 Linux 发行版。受到了 elementary OS 自己的“按需付费”应用中心模型成功的启发几年前，elementary OS 推出了自己的应用中心。应用中心的“按需付费”方法很受欢迎。开发人员可以为其开源应用设置最低金额，而用户可以选择支付等于或高于最低金额的金额。这帮助了几位独立开发人员可以对其开源应用程序接受付款。该应用中心现在拥有约 160 个原生应用程序，elementary OS 表示已通过应用中心向开发人员支付了数千美元。受到此应用中心实验在 elementary OS 中的成功的启发，他们现在也希望将此应用中心的方法也引入其他发行版。如果应用程序是开源的，你怎么为此付费？某些人仍然对 FOSS（自由而开源）的概念感到困惑。在这里，该软件的“源代码”是“开源的”，任何人都可以“自由”进行修改和重新分发。但这并不意味着开源软件必须免费。一些开发者依靠捐赠，而另一些则收取支持费用。获得开源应用程序的报酬可能会鼓励开发人员创建 Linux 应用程序。让我们拭目以待就个人而言，我不是 Flatpak 或 Snap 包格式的忠实拥护者。它们确实有其优点，但是它们花费了相对更多的时间来启动，并且它们的包大小很大。如果安装了多个此类 Snap 或 Flatpak 软件包，磁盘空间就会慢慢耗尽。也需要对这个新的应用程序生态系统中的假冒和欺诈开发者保持警惕。想象一下，如果某些骗子开始创建冷门的开源应用程序的 Flatpak 程序包，并将其放在应用中心上？我希望开发人员采用某种机制来淘汰此类应用程序。我确实希望这个新的应用中心能够复制在 elementary OS 中已经看到的成功。对于桌面 Linux 的开源应用程序，我们绝对需要更好的生态系统。你对此有何看法？这是正确的方法吗？你对改进应用中心有什么建议？via: https://itsfoss.com/appcenter-for-everyone/作者：Abhishek Prakash 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

如何让 Emacs 俄罗斯方块变得更难
type: item
date: 2020-02-27T20:06:11+08:00
description: 你知道吗，Emacs 捆绑了一个俄罗斯方块的实现？只需要输入 M-x tetris 就行了。在对文本编辑器的讨论中，Emacs 鼓吹者经常提到这一点。“没错，但是你那个编辑器能运行俄罗斯方块吗？”我很好奇，这会让大家相信 Emacs 更优秀吗？比如，为什么有人会关心他们是否可以在文本编辑器中玩游戏呢？“没错，但是你那台吸尘器能播放 mp3 吗？”有人说，俄罗斯方块总是很有趣的。像 Emacs 中的所有东西一样，它的源代码是开放的，易于检查和修改，因此 我们可以使它变得更加有趣。所谓更加有趣，我的意思是更难。让游戏变得更难的一个最简单的方法就是“隐藏下一个块预览”。你无法在知道下一个块会填满空间的情况下有意地将 S/Z 块放在一个危险的位置——你必须碰碰运气，希望出现最好的情况。下面是没有预览的情况（如你所见，没有预览，我做出的某些选择带来了“可怕的后果”）:预览框由一个名为 tetris-draw-next-shape 1 的函数设置：(defun tetris-draw-next-shape () (dotimes (x 4) (dotimes (y 4) (gamegrid-set-cell (+ tetris-next-x x) (+ tetris-next-y y) tetris-blank))) (dotimes (i 4) (let ((tetris-shape tetris-next-shape) (tetris-rot 0)) (gamegrid-set-cell (+ tetris-next-x (aref (tetris-get-shape-cell i) 0)) (+ tetris-next-y (aref (tetris-get-shape-cell i) 1)) tetris-shape))))首先，我们引入一个标志，决定是否允许显示下一个预览块 2 ：(defvar tetris-preview-next-shape nil "When non-nil, show the next block the preview box.")现在的问题是，我们如何才能让 tetris-draw-next-shape 遵从这个标志？最明显的方法是重新定义它：(defun tetris-draw-next-shape () (when tetris-preview-next-shape ;; existing tetris-draw-next-shape logic ))但这不是理想的解决方案。同一个函数有两个定义，这很容易引起混淆，如果上游版本发生变化，我们必须维护修改后的定义。一个更好的方法是使用 advice。Emacs 的 advice 类似于 Python 装饰器，但是更加灵活，因为 advice 可以从任何地方添加到函数中。这意味着我们可以修改函数而不影响原始的源文件。有很多不同的方法使用 Emacs advice（查看手册），但是这里我们只使用 advice-add 函数和 :around 标志。advice 函数将原始函数作为参数，原始函数可能执行也可能不执行。我们这里，我们让原始函数只有在预览标志是非空的情况下才能执行：(defun tetris-maybe-draw-next-shape (tetris-draw-next-shape) (when tetris-preview-next-shape (funcall tetris-draw-next-shape))) (advice-add 'tetris-draw-next-shape :around #'tetris-maybe-draw-next-shape)这段代码将修改 tetris-draw-next-shape 的行为，而且它可以存储在配置文件中，与实际的俄罗斯方块代码分离。去掉预览框是一个简单的改变。一个更激烈的变化是，让块随机停止在空中：本图中，红色的 I 和绿色的 T 部分没有掉下来，它们被固定下来了。这会让游戏变得 极其困难，但却很容易实现。和前面一样，我们首先定义一个标志：(defvar tetris-stop-midair t "If non-nil, pieces will sometimes stop in the air.")目前，Emacs 俄罗斯方块的工作方式 类似这样子：活动部件有 x 和 y 坐标。在每个时钟滴答声中，y 坐标递增（块向下移动一行），然后检查是否有与现存的块重叠。如果检测到重叠，则将该块回退（其 y 坐标递减）并设置该活动块到位。为了让一个块在半空中停下来，我们所要做的就是破解检测函数 tetris-test-shape。这个函数内部做什么并不重要 —— 重要的是它是一个返回布尔值的无参数…

使用 KRAWL 扫描 Kubernetes 错误
type: item
date: 2020-02-27T18:29:43+08:00
description: 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernetes 运行容器时，你通常会发现它们堆积在一起。这是设计使然。它是容器的优点之一：每当需要新的容器时，它们启动成本都很低。你可以使用前端工具（如 OpenShift 或 OKD）来管理 Pod 和容器。这些工具使可视化设置变得容易，并且它具有一组丰富的用于快速交互的命令。如果管理容器的平台不符合你的要求，你也可以仅使用 Kubernetes 工具链获取这些信息，但这需要大量命令才能全面了解复杂环境。出于这个原因，我编写了 KRAWL，这是一个简单的脚本，可用于扫描 Kubernetes 集群命名空间下的 Pod 和容器，并在发现任何事件时，显示事件的输出。它也可用作为 Kubernetes 插件使用。这是获取大量有用信息的快速简便方法。先决条件必须安装 kubectl。集群的 kubeconfig 配置必须在它的默认位置（$HOME/.kube/config）或已被导出到环境变量（KUBECONFIG=/path/to/kubeconfig）。使用$ ./krawl脚本#!/bin/bash # AUTHOR: Abhishek Tamrakar # EMAIL: abhishek.tamrakar08@gmail.com # LICENSE: Copyright (C) 2018 Abhishek Tamrakar # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ## #define the variables KUBE_LOC=~/.kube/config #define variables KUBECTL=$(which kubectl) GET=$(which egrep) AWK=$(which awk) red=$(tput setaf 1) normal=$(tput sgr0) # define functions # wrapper for printing info messages info() { printf '\n\e[34m%s\e[m: %s\n' "INFO" "$@" } # cleanup when all done cleanup() { rm -f results.csv } # just check if the command we are about to call is available checkcmd() { #check if command exists local cmd=$1 if [ -z "${!cmd}" ] then printf '\n\e[31m%s\e[m: %s\n' "ERROR" "check if $1 is installed !!!" exit 1 fi } get_namespaces() { #get namespaces namespaces=( \ $($KUBECTL get namespaces --ignore-not-found=true | \ $AWK '/Active/ {print $1}' \ ORS=" ") \ ) #exit if namespaces are not found if [ ${#namespaces[@]} -eq 0 ] then printf '\n\e[31m%s\e[m: %s\n' "ERROR" "No namespaces found!!" exit 1 fi }…

如何组织构建多文件 C 语言程序（一）
type: item
date: 2020-02-27T05:45:34+08:00
description: 准备好你喜欢的饮料、编辑器和编译器，放一些音乐，然后开始构建一个由多个文件组成的 C 语言程序。大家常说计算机编程的艺术部分是处理复杂性，部分是命名某些事物。此外，我认为“有时需要添加绘图”是在很大程度上是正确的。在这篇文章里，我会编写一个小型 C 程序，命名一些东西，同时处理一些复杂性。该程序的结构大致基于我在 《如何写一个好的 C 语言 main 函数》 文中讨论的。但是，这次做一些不同的事。准备好你喜欢的饮料、编辑器和编译器，放一些音乐，让我们一起编写一个有趣的 C 语言程序。优秀 Unix 程序哲学首先，你要知道这个 C 程序是一个 Unix 命令行工具。这意味着它运行在（或者可被移植到）那些提供 Unix C 运行环境的操作系统中。当贝尔实验室发明 Unix 后，它从一开始便充满了设计哲学。用我自己的话来说就是：程序只做一件事，并做好它，并且对文件进行一些操作。虽然“只做一件事，并做好它”是有意义的，但是“对文件进行一些操作”的部分似乎有点儿不合适。事实证明，Unix 中抽象的 “文件” 非常强大。一个 Unix 文件是以文件结束符（EOF）标志为结尾的字节流。仅此而已。文件中任何其它结构均由应用程序所施加而非操作系统。操作系统提供了系统调用，使得程序能够对文件执行一套标准的操作：打开、读取、写入、寻址和关闭（还有其他，但说起来那就复杂了）。对于文件的标准化访问使得不同的程序共用相同的抽象，而且可以一同工作，即使它们是不同的人用不同语言编写的程序。具有共享的文件接口使得构建可组合的的程序成为可能。一个程序的输出可以作为另一个程序的输入。Unix 家族的操作系统默认在执行程序时提供了三个文件：标准输入（stdin）、标准输出（stdout）和标准错误（stderr）。其中两个文件是只写的：stdout 和 stderr。而 stdin 是只读的。当我们在常见的 Shell 比如 Bash 中使用文件重定向时，可以看到其效果。$ ls | grep foo | sed -e 's/bar/baz/g' > ack这条指令可以被简要地描述为：ls 的结果被写入标准输出，它重定向到 grep 的标准输入，grep 的标准输出重定向到 sed 的标准输入，sed 的标准输出重定向到当前目录下文件名为 ack 的文件中。我们希望我们的程序在这个灵活又出色的生态系统中运作良好，因此让我们编写一个可以读写文件的程序。喵呜喵呜：流编码器/解码器概念当我还是一个露着豁牙的孩子懵懵懂懂地学习计算机科学时，学过很多编码方案。它们中的有些用于压缩文件，有些用于打包文件，另一些毫无用处因此显得十分愚蠢。列举最后这种情况的一个例子：哞哞编码方案。为了让我们的程序有个用途，我为它更新了一个 21 世纪 的概念，并且实现了一个名为“喵呜喵呜” 的编码方案的概念（毕竟网上大家都喜欢猫）。这里的基本的思路是获取文件并且使用文本 “meow” 对每个半字节（半个字节）进行编码。小写字母代表 0，大写字母代表 1。因为它会将 4 个比特替换为 32 个比特，因此会扩大文件的大小。没错，这毫无意义。但是想象一下人们看到经过这样编码后的惊讶表情。$ cat /home/your_sibling/.super_secret_journal_of_my_innermost_thoughts MeOWmeOWmeowMEoW...这非常棒。最终的实现完整的源代码可以在 GitHub 上面找到，但是我会写下我在编写程序时的思考。目的是说明如何组织构建多文件 C 语言程序。既然已经确定了要编写一个编码和解码“喵呜喵呜”格式的文件的程序时，我在 Shell 中执行了以下的命令 ：$ mkdir meowmeow $ cd meowmeow $ git init $ touch Makefile # 编译程序的方法 $ touch main.c # 处理命令行选项 $ touch main.h # “全局”常量和定义 $ touch mmencode.c # 实现对喵呜喵呜文件的编码 $ touch mmencode.h # 描述编码 API $ touch mmdecode.c # 实现对喵呜喵呜文件的解码 $ touch mmdecode.h # 描述解码 API $ touch table.h # 定义编码查找表 $ touch .gitignore # 这个文件中的文件名会被 git 忽略 $ git add . $ git commit -m "initial commit of empty files"简单的说，我创建了一个目录，里面全是空文件，并且提交到 git。即使这些文件中没有内容，你依旧可以从它的文件名推断每个文件的用途。为了避免万一你无法理解，我在每条 …

不喜欢 IDE？试试看 grepgitvi
type: item
date: 2020-02-26T19:49:00+08:00
description: 一个简单又原始的脚本来用 Vim 打开你选择的文件。像大多数开发者一样，我整天都在搜索和阅读源码。就我个人而言，我从来没有习惯过集成开发环境 （IDE），多年来，我主要使用 grep （找到文件），并复制/粘贴文件名来打开 Vi(m)。最终，我写了这个脚本，并根据需要缓慢地对其进行了完善。它依赖 Vim 和 rlwrap，并使用 Apache 2.0 许可证开源。要使用该脚本，请将它放到 PATH 中，然后在文本目录下运行：grepgitvi <grep options> <grep/vim search pattern>它将返回搜索结果的编号列表，并提示你输入结果编号并打开 Vim。退出 Vim 后，它将再次显示列表，直到你输入除结果编号以外的任何内容。你也可以使用向上和向下箭头键选择一个文件。（这对我来说）更容易找到我已经看过的结果。与现代 IDE 甚至与 Vim 的更复杂的用法相比，它简单而原始，但它对我有用。脚本#!/bin/bash # grepgitvi - grep source files, interactively open vim on results # Doesnt really have to do much with git, other than ignoring .git # # Copyright Yedidyah Bar David 2019 # # SPDX-License-Identifier: Apache-2.0 # # Requires vim and rlwrap # # Usage: grepgitvi <grep options> <grep/vim pattern> # TMPD=$(mktemp -d /tmp/grepgitvi.XXXXXX) UNCOLORED=${TMPD}/uncolored COLORED=${TMPD}/colored RLHIST=${TMPD}/readline-history [ -z "${DIRS}" ] && DIRS=. cleanup() { rm -rf "${TMPD}" } trap cleanup 0 find ${DIRS} -iname .git -prune -o \! -iname "*.min.css*" -type f -print0 > ${TMPD}/allfiles cat ${TMPD}/allfiles | xargs -0 grep --color=always -n -H "$@" > $COLORED cat ${TMPD}/allfiles | xargs -0 grep -n -H "$@" > $UNCOLORED max=`cat $UNCOLORED | wc -l` pat="${@: -1}" inp='' while true; do echo "============================ grep results ===============================" cat $COLORED | nl echo "============================ grep results ===============================" prompt="Enter a number between 1 and $max or anything else to quit: " inp=$(rlwrap -H $RLHIST bash -c "read -p \"$prompt\" inp; echo \$inp") if ! echo "$inp" | grep -q '^[0-9][0-9]*$' || [ "$inp" -gt "$max" ]; then break fi filename=$(cat $UNCOLORED | awk -F: "NR==$inp"' {print $1}') linenum=$(cat $UNCOLORED | awk -F: "NR==$inp"' {print $2-1}') vim +:"$linenum" +"norm zz" +/"${pat}" "$filename" donevia: https://opensource.com/article/20/2/no-ide-script作者：Yedidyah Bar David 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

使用 Emacs 发送电子邮件和检查日历
type: item
date: 2020-02-26T18:37:00+08:00
description: 在 2020 年用开源实现更高生产力的二十种方式的第十八篇文章中，使用 Emacs 文本编辑器管理电子邮件和查看日程安排。去年，我给你们带来了 2019 年的 19 天新生产力工具系列。今年，我将采取一种不同的方式：建立一个新的环境，让你使用已用或未用的工具来在新的一年里变得更有效率。使用 Emacs 做（几乎）所有的事情，第 1 部分两天前，我曾经说过我经常使用 Vim 和 Emacs，在本系列的 16 和 17 天，我讲解了如何在 Vim 中做几乎所有的事情。现在，Emacs 的时间到了！在深入之前，我需要说明两件事。首先，我这里使用默认的 Emacs 配置，而不是我之前写过的 Spacemacs。为什么呢？因为这样一来我使用的就是默认快捷键，从而使你可以参考文档，而不必将“原生的 Emacs” 转换为 Spacemacs。第二，在本系列文章中我没有对 Org 模式进行任何设置。Org 模式本身几乎可以自成一个完整的系列，它非常强大，但是设置可能非常复杂。配置 Emacs配置 Emacs 比配置 Vim 稍微复杂一些，但以我之见，从长远来看，这样做是值得的。首先我们创建一个配置文件，并在 Emacs 中打开它：mkdir ~/.emacs.d emacs ~/.emacs.d/init.el接下来，向内置的包管理器添加一些额外的包源。在 init.el 中添加以下内容：(package-initialize) (add-to-list 'package-archives '("melpa" . "<http://melpa.org/packages/>")) (add-to-list 'package-archives '("org" . "<http://orgmode.org/elpa/>") t) (add-to-list 'package-archives '("gnu" . "<https://elpa.gnu.org/packages/>")) (package-refresh-contents)使用 Ctrl+x Ctrl+s 保存文件，然后按下 Ctrl+x Ctrl+c 退出，再重启 Emacs。Emacs 会在启动时下载所有的插件包列表，之后你就可以使用内置的包管理器安装插件了。输入 Meta+x 会弹出命令提示符（大多数键盘上 Meta 键就是的 Alt 键，而在 MacOS 上则是 Option）。在命令提示符下输入 package-list-packages 就会显示可以安装的包列表。遍历该列表并使用 i 键选择以下包：bbdb bbdb-vcard calfw calfw-ical notmuch选好软件包后按 x 安装它们。根据你的网络连接情况，这可能需要一段时间。你也许会看到一些编译错误，但是可以忽略它们。安装完成后，使用组合键 Ctrl+x Ctrl+f 打开 ~/.emacs.d/init.el，并在 (package-refresh-packages) 之后、 (custom-set-variables 之前添加以下行到文件中。 (custom-set-variables 行由 Emacs 内部维护，你永远不应该修改它之后的任何内容。以 ;; 开头的行则是注释。;; Set up bbdb (require 'bbdb) (bbdb-initialize 'message) (bbdb-insinuate-message) (add-hook 'message-setup-hook 'bbdb-insinuate-mail) ;; set up calendar (require 'calfw) (require 'calfw-ical) ;; Set this to the URL of your calendar. Google users will use ;; the Secret Address in iCalendar Format from the calendar settings (cfw:open-ical-calendar "<https://path/to/my/ics/file.ics>") ;; Set up notmuch (require 'notmuch) ;; set up mail sending using sendmail (setq send-mail-function (quote sendmail-send-it)) (setq user-mail-address "[myemail@mydomain.com][9]" user-full-name "My Name")现在，你已经准备好使用自己的配置启动 Emacs 了！保存 init.…