Ben Cotton 发布的文章

不管怎么说,好的交流是一个活跃的开源社区的必备品。

我通常不会定下大的新年决心。当然,我在自我提升方面没有任何问题,这篇文章我希望锚定的是这个日历中的另外一部分。不过即使是这样,这里也有一些东西要从今年的免费日历上划掉,并将其替换为一些可以激发我的自省的新日历内容。

在 2017 年,我从不在社交媒体上分享我从未阅读过的文章。我一直保持这样的状态,我也认为它让我成为了一个更好的互联网公民。对于 2019 年,我正在考虑让我成为更好的开源软件维护者的决心。

下面是一些我在一些项目中担任维护者或共同维护者时坚持的决心:

1、包含行为准则

Jono Bacon 在他的文章“7 个你可能犯的错误”中包含了一条“不强制执行行为准则”。当然,要强制执行行为准则,你首先需要有一个行为准则。我打算默认用贡献者契约,但是你可以使用其他你喜欢的。关于这个许可协议,最好的方法是使用别人已经写好的,而不是你自己写的。但是重要的是,要找到一些能够定义你希望你的社区执行的,无论它们是什么样子。一旦这些被记录下来并强制执行,人们就能自行决定是否成为他们想象中社区的一份子。

2、使许可证清晰且明确

你知道什么真的很烦么?不清晰的许可证。这个软件基于 GPL 授权,如果没有进一步提供更多信息的文字,我无法知道更多信息。基于哪个版本的GPL?我可以用它吗?对于项目的非代码部分,“根据知识共享许可证(CC)授权”更糟糕。我喜欢知识共享许可证,但它有几个不同的许可证包含着不同的权利和义务。因此,我将非常清楚的说明哪个许可证的变种和版本适用于我的项目。我将会在仓库中包含许可的全文,并在其他文件中包含简明的注释。

与此相关的一类问题是使用 OSI 批准的许可证。想出一个新的准确的说明了你想要表达什么的许可证是有可能的,但是如果你需要强制推行它,祝你好运。会坚持使用它么?使用您项目的人会理解么?

3、快速分类错误报告和问题

在技术领域, 很少有比开源维护者更贫乏的东西了。即使在小型项目中,也很难找到时间去回答每个问题并修复每个错误。但这并不意味着我不能哪怕回应一下,它没必要是多段的回复。即使只是给 GitHub 问题贴了个标签也表明了我看见它了。也许我马上就会处理它,也许一年后我会处理它。但是让社区看到它很重要,是的,这里还有人管。

4、如果没有伴随的文档,请不要推送新特性或错误修复

尽管多年来我的开源贡献都围绕着文档,但我的项目并没有反映出我对它的重视。我能推送的提交不多,并不不需要某种形式的文档。新的特性显然应该在他们被提交时甚至是在之前就编写文档。但即使是错误修复,也应该在发行说明中有一个条目提及。如果没有什么意外,推送提交也是很好的改善文档的机会。

5、放弃一个项目时,要说清楚

我很不擅长对事情说“不”,我告诉编辑我会为 Opensource.com 写一到两篇文章,而现在我有了将近 60 篇文章。哎呀。但在某些时候,曾经我有兴趣的事情也会不再有兴趣。也许该项目是不必要的,因为它的功能被吸收到更大的项目中;也许只是我厌倦了它。但这对社区是不公平的(并且存在潜在的危险,正如最近的 event-stream 恶意软件注入所示),会让该项目陷入困境。维护者有权随时离开,但他们离开时应该说清楚。

无论你是开源维护者还是贡献者,如果你知道项目维护者应该作出的其他决心,请在评论中分享!


via: https://opensource.com/article/18/12/resolutions-open-source-project-maintainers

作者:Ben Cotton 选题:lujun9972 译者:bestony 校对:wxy

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

用 Apache HTTP 服务器的 mod\_rewrite 功能创建你自己的短链接。

很久以前,人们开始在 Twitter 上分享链接。140 个字符的限制意味着 URL 可能消耗一条推文的大部分(或全部),因此人们使用 URL 缩短服务。最终,Twitter 加入了一个内置的 URL 缩短服务(t.co)。

字符数现在不重要了,但还有其他原因要缩短链接。首先,缩短服务可以提供分析功能 —— 你可以看到你分享的链接的受欢迎程度。它还简化了制作易于记忆的 URL。例如,bit.ly/INtravelhttps://www.in.gov/ai/appfiles/dhs-countyMap/dhsCountyMap.html更容易记住。如果你想预先共享一个链接,但还不知道最终地址,这时 URL 缩短服务可以派上用场。。

与任何技术一样,URL 缩短服务并非都是正面的。通过屏蔽最终地址,缩短的链接可用于指向恶意或冒犯性内容。但是,如果你仔细上网,URL 缩短服务是一个有用的工具。

我们之前在网站上发布过缩短服务的文章,但也许你想要运行一些由简单的文本文件支持的缩短服务。在本文中,我们将展示如何使用 Apache HTTP 服务器的 mod\_rewrite 功能来设置自己的 URL 缩短服务。如果你不熟悉 Apache HTTP 服务器,请查看 David Both 关于安装和配置它的文章。

创建一个 VirtualHost

在本教程中,我假设你购买了一个很酷的域名,你将它专门用于 URL 缩短服务。例如,我的网站是 funnelfiasco.com,所以我买了 funnelfias.co 用于我的 URL 缩短服务(好吧,它不是很短,但它可以满足我的虚荣心)。如果你不将缩短服务作为单独的域运行,请跳到下一部分。

第一步是设置将用于 URL 缩短服务的 VirtualHost。有关 VirtualHost 的更多信息,请参阅 David Both 的文章。这步只需要几行:

    <VirtualHost *:80>
        ServerName funnelfias.co
    </VirtualHost>

创建重写规则

此服务使用 HTTPD 的重写引擎来重写 URL。如果你在上面的部分中创建了 VirtualHost,则下面的配置跳到你的 VirtualHost 部分。否则跳到服务器的 VirtualHost 或主 HTTPD 配置。

    RewriteEngine on
    RewriteMap shortlinks txt:/data/web/shortlink/links.txt
    RewriteRule ^/(.+)$ ${shortlinks:$1} [R=temp,L]

第一行只是启用重写引擎。第二行在文本文件构建短链接的映射。上面的路径只是一个例子。你需要使用系统上使用有效路径(确保它可由运行 HTTPD 的用户帐户读取)。最后一行重写 URL。在此例中,它接受任何字符并在重写映射中查找它们。你可能希望重写时使用特定的字符串。例如,如果你希望所有缩短的链接都是 “slX”(其中 X 是数字),则将上面的 (.+) 替换为 (sl\d+)

我在这里使用了临时重定向(HTTP 302)。这能让我稍后更新目标 URL。如果希望短链接始终指向同一目标,则可以使用永久重定向(HTTP 301)。用 permanent 替换第三行的 temp

构建你的映射

编辑配置文件 RewriteMap 行中的指定文件。格式是空格分隔的键值存储。在每一行上放一个链接:

    osdc https://opensource.com/users/bcotton
    twitter https://twitter.com/funnelfiasco
    swody1 https://www.spc.noaa.gov/products/outlook/day1otlk.html

重启 HTTPD

最后一步是重启 HTTPD 进程。这是通过 systemctl restart httpd 或类似命令完成的(命令和守护进程名称可能因发行版而不同)。你的链接缩短服务现已启动并运行。当你准备编辑映射时,无需重新启动 Web 服务器。你所要做的就是保存文件,Web 服务器将获取到差异。

未来的工作

此示例为你提供了基本的 URL 缩短服务。如果你想将开发自己的管理接口作为学习项目,它可以作为一个很好的起点。或者你可以使用它分享容易记住的链接到那些容易忘记的 URL。


via: https://opensource.com/article/18/7/apache-url-shortener

作者:Ben Cotton 选题:lujun9972 译者:geekpi 校对:wxy

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

用 Perlbrew 在你系统上安装多个版本的 Perl。

有比在系统上安装了 Perl 更好的事情吗?那就是在系统中安装了多个版本的 Perl。使用 Perlbrew 你可以做到这一点。但是为什么呢,除了让你包围在 Perl 下之外,有什么好处吗?

简短的回答是,不同版本的 Perl 是......不同的。程序 A 可能依赖于较新版本中不推荐使用的行为,而程序 B 需要去年无法使用的新功能。如果你安装了多个版本的 Perl,则每个脚本都可以使用最适合它的版本。如果您是开发人员,这也会派上用场,你可以针对多个版本的 Perl 测试你的程序,这样无论你的用户运行什么,你都知道它能否工作。

安装 Perlbrew

另一个好处是 Perlbrew 会安装 Perl 到用户的家目录。这意味着每个用户都可以管理他们的 Perl 版本(以及相关的 CPAN 包),而无需与系统管理员联系。自助服务意味着为用户提供更快的安装,并为系统管理员提供更多时间来解决难题。

第一步是在你的系统上安装 Perlbrew。许多 Linux 发行版已经在包仓库中拥有它,因此你只需要 dnf install perlbrew(或者适用于你的发行版的命令)。你还可以使用 cpan App::perlbrew 从 CPAN 安装 App::perlbrew 模块。或者你可以在 install.perlbrew.pl 下载并运行安装脚本。

要开始使用 Perlbrew,请运行 perlbrew init

安装新的 Perl 版本

假设你想尝试最新的开发版本(撰写本文时为 5.27.11)。首先,你需要安装包:

perlbrew install 5.27.11

切换 Perl 版本

现在你已经安装了新版本,你可以将它用于该 shell:

perlbrew use 5.27.11

或者你可以将其设置为你帐户的默认 Perl 版本(假设你按照 perlbrew init 的输出设置了你的配置文件):

perlbrew switch 5.27.11

运行单个脚本

你也可以用特定版本的 Perl 运行单个命令:

perlberew exec 5.27.11 myscript.pl

或者,你可以针对所有已安装的版本运行命令。如果你想针对各种版本运行测试,这尤其方便。在这种情况下,请指定版本为 perl

plperlbrew exec perl myscriptpl

安装 CPAN 模块

如果你想安装 CPAN 模块,cpanm 包是一个易于使用的界面,可以很好地与 Perlbrew 一起使用。用下面命令安装它:

perlbrew install-cpanm

然后,你可以使用 cpanm 命令安装 CPAN 模块:

cpanm CGI::simple

但是等下,还有更多!

本文介绍了基本的 Perlbrew 用法。还有更多功能和选项可供选择。从查看 perlbrew help 的输出开始,或查看App::perlbrew 文档。你还喜欢 Perlbrew 的其他什么功能?让我们在评论中知道。


via: https://opensource.com/article/18/7/perlbrew

作者:Ben Cotton 选题:lujun9972 译者:geekpi 校对:wxy

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

以及 3 个有趣的 RFC。

阅读源码是开源软件的重要组成部分。这意味着用户可以查看代码并了解做了什么。

但“阅读源码”并不仅适用于代码。理解代码实现的标准同样重要。这些标准编写在由 互联网工程任务组 Internet Engineering Task Force (IETF)发布的称为“ 意见征集 Requests for Comment ”(RFC)的文档中。多年来已经发布了数以千计的 RFC,因此我们收集了一些我们的贡献者认为必读的内容。

6 个必读的 RFC

RFC 2119 - 在 RFC 中用于指示需求级别的关键字

这是一个快速阅读,但它对了解其它 RFC 非常重要。 RFC 2119 定义了后续 RFC 中使用的需求级别。 “MAY” 究竟意味着什么?如果标准说 “SHOULD”,你真的必须这样做吗?通过为需求提供明确定义的分类,RFC 2119 有助于避免歧义。

RFC 3339 - 互联网上的日期和时间:时间戳

时间是全世界程序员的祸根。 RFC 3339 定义了如何格式化时间戳。基于 ISO 8601 标准,3339 为我们提供了一种表达时间的常用方法。例如,像星期几这样的冗余信息不应该包含在存储的时间戳中,因为它很容易计算。

RFC 1918 - 私有互联网的地址分配

有属于每个人的互联网,也有只属于你的互联网。私有网络一直在使用,RFC 1918 定义了这些网络。当然,你可以在路由器上设置在内部使用公网地址,但这是一个坏主意。或者,你可以将未使用的公共 IP 地址视为内部网络。在任何一种情况下都表明你从未阅读过 RFC 1918。

RFC 1912 - 常见的 DNS 操作和配置错误

一切都是 #@%@ 的 DNS 问题,对吧? RFC 1912 列出了管理员在试图保持互联网运行时所犯的错误。虽然它是在 1996 年发布的,但 DNS(以及人们犯的错误)并没有真正改变这么多。为了理解我们为什么首先需要 DNS,如今我们再来看看 RFC 289 - 我们希望正式的主机列表是什么样子的 就知道了。

RFC 2822 — 互联网邮件格式

想想你知道什么是有效的电子邮件地址么?如果你知道有多少个站点不接受我邮件地址中 “+” 的话,你就知道你知道不知道了。 RFC 2822 定义了有效的电子邮件地址。它还详细介绍了电子邮件的其余部分。

RFC 7231 - 超文本传输​​协议(HTTP/1.1):语义和内容

想想看,几乎我们在网上做的一切都依赖于 HTTP。 RFC 7231 是该协议的最新更新。它有超过 100 页,定义了方法、请求头和状态代码。

3 个应该阅读的 RFC

好吧,并非每个 RFC 都是严肃的。

RFC 1149 - 在禽类载体上传输 IP 数据报的标准

网络以多种不同方式传递数据包。 RFC 1149 描述了鸽子载体的使用。当我距离州际高速公路一英里以外时,它们的可靠性不会低于我的移动提供商。

RFC 2324 — 超文本咖啡壶控制协议(HTCPCP/1.0)

咖啡对于完成工作非常重要,当然,我们需要一个用于管理咖啡壶的程序化界面。 RFC 2324 定义了一个用于与咖啡壶交互的协议,并添加了 HTTP 418(“我是一个茶壶”)。

RFC 69 — M.I.T.的分发列表更改

RFC 69 是否是第一个误导取消订阅请求的发布示例?

你必须阅读的 RFC 是什么(无论它们是否严肃)?在评论中分享你的列表。


via: https://opensource.com/article/18/7/requests-for-comments-to-know

作者:Ben Cotton 选题:lujun9972 译者:geekpi 校对:wxy

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

使用正确的参数,find 命令是在你的系统上找到数据的强大而灵活的方式。

最近的一篇文章中,Lewis Cowles 介绍了 find 命令。

find 是日常工具箱中功能更强大、更灵活的命令行工具之一,因此值得花费更多的时间。

最简单的,find 跟上路径寻找一些东西。例如:

find /

它将找到(并打印出)系统中的每个文件。而且由于一切都是文件,你会得到很多需要整理的输出。这可能不能帮助你找到你要找的东西。你可以改变路径参数来缩小范围,但它不会比使用 ls 命令更有帮助。所以你需要考虑你想要找的东西。

也许你想在主目录中找到所有的 JPEG 文件。 -name 参数允许你将结果限制为与给定模式匹配的文件。

find ~ -name '*jpg'

可是等等!如果它们中的一些是大写的扩展名会怎么样?-iname 就像 -name,但是不区分大小写。

find ~ -iname '*jpg'

很好!但是 8.3 名称方案是如此的老。一些图片可能是 .jpeg 扩展名。幸运的是,我们可以将模式用“或”(表示为 -o)来组合。

find ~ ( -iname 'jpeg' -o -iname 'jpg' )

我们正在接近目标。但是如果你有一些以 jpg 结尾的目录呢? (为什么你要命名一个 bucketofjpg 而不是 pictures 的目录就超出了本文的范围。)我们使用 -type 参数修改我们的命令来查找文件。

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f

或者,也许你想找到那些命名奇怪的目录,以便稍后重命名它们:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d

你最近拍了很多照片,所以让我们把它缩小到上周更改的文件。

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7

你可以根据文件状态更改时间 (ctime)、修改时间 (mtime) 或访问时间 (atime) 来执行时间过滤。 这些是在几天内,所以如果你想要更细粒度的控制,你可以表示为在几分钟内(分别是 cminmminamin)。 除非你确切地知道你想要的时间,否则你可能会在 + (大于)或 - (小于)的后面加上数字。

但也许你不关心你的照片。也许你的磁盘空间不够用,所以你想在 log 目录下找到所有巨大的(让我们定义为“大于 1GB”)文件:

find /var/log -size +1G

或者,也许你想在 /data 中找到 bcotton 拥有的所有文件:

find /data -owner bcotton

你还可以根据权限查找文件。也许你想在你的主目录中找到对所有人可读的文件,以确保你不会过度分享。

find ~ -perm -o=r

这篇文章只说了 find 能做什么的表面。将测试条件与布尔逻辑相结合可以为你提供难以置信的灵活性,以便准确找到要查找的文件。并且像 -exec-delete 这样的参数,你可以让 find 对它发现的内容采取行动。你有任何最喜欢的 find 表达式么?在评论中分享它们!


via: https://opensource.com/article/18/4/how-use-find-linux

作者:Ben Cotton 选题:lujun9972 译者:geekpi 校对:wxy

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

所有人都知道 SSH 是一种远程登录工具,然而它也有许多其他用途。

创建一个 SOCKS 代理来浏览网页(也就是翻墙啦):

ssh -D <port> <remote_host>

设置 localhost:<port> 作为你浏览器的代理

连接一个堡垒机后的 Windows RDP 主机:

ssh -L <port>:<target_host>:3389 <bastion_server> 

让你的 RDP 客户端连接到 localhost:<port>

在不使用 VNC 端口的情况下,连接远程 VNC 主机:

ssh -L 5901:localhost:5901 <remote_host> 

让你的 VNC 客户端连接到 localhost:5901

按照这个思路,你可以映射任意端口:LDAP (389)、631 (CUPS)、8080 (替代的 HTTP),等等。

产生一个新的 SSH 密钥对:

ssh-keygen

更新密钥对的密码:

ssh-keygen -p

把公钥复制到远程主机上:

ssh-copy-id -i <identity file> <remote_host>

SSH 有一堆命令行选项,但是如果有一些是你经常使用的,你可以为它们在 SSH 配置文件 (${HOME}/.ssh/config) 里创建一个入口。比如:

host myhouse 
    User itsme 
    HostName house.example.com

那么你就可以输入 ssh myhouse 来代替 ssh [email protected]

以下是常用的命令行选项和他们的配置文件写法。一些是常用的简化写法。请查看 ssh(1)ssh_config(5) 的手册页来获取详尽信息。

命令行配置文件描述
-l <login name>User <login name>远程主机的登录用户名。
-i <identity file>IdentityFile <identity file>指定要使用的鉴权文件(SSH 密码对)。
-p <remote port>Port <remote port>远程 SSH 守护进程监听的端口号。 (默认为 22)
-CCompression <yes,no>压缩往来信息。 (默认为 no)
-D <port>DynamicForward <port>把本地端口的报文转发到远程主机。
-XForwardX11 <yes,no>把 X11 的图像数据转发到远程主机的端口. (默认为 no)
-AForwardAgent <yes,no>把授权代理的报文转发给远程主机。如果你使用第三方主机登录,这个功能将很有用。 (默认为 no)
-4(仅使用 IPv4) -6 (仅使用 IPv6)AddressFamily <any,inet4,inet6>指定仅使用 IPv4 或者 IPv6。
-L <local port>:<target host>:<target port>LocalForward <local port>:<target host>:<target port>把本地主机指定端口的报文转发到远程主机的某个端口。

opensource.com Twitter @opensourceway | facebook.com/opensourceway | IRC: #opensource.com on Freenode


作者简介:

Ben Cotton 是业余的气象学家和职业的高性能计算工程师。Ben 是微软 Azure 的产品营销经理,专注于高性能计算。他是一个 Fedora 用户和贡献者,共同创立了一个当地的开放源码群,并且是开源促进会的成员和保护自由软件的支持者。通过以下方式联系他 Twitter (@FunnelFiasco) 或者 FunnelFiasco.com.


via: https://opensource.com/sites/default/files/gated-content/cheat_sheet_ssh_v03.pdf

作者:BEN COTTON 译者:kennethXia 校对:wxy

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