蚊章汇 - 2018年7月
type: channel
link: https://linuxcn.bwsl.wang/2018/07/
description: Linux中国社区镜像站，没有大保镖。
items: GitLab 的付费套餐现在可以免费用于开源项目
items: Kubernetes 分布式应用部署实战：以人脸识别应用为例
items: 想学习区块链？那就用 Python 构建一个
items: Python 集合是什么，为什么应该使用以及如何使用？
items: 使用 Wttr.in 在你的终端中显示天气预报
items: Streams：一个新的 Redis 通用数据结构
items: Debian 打包入门
items: 为什么 DevSecOps 对 IT 领导来说如此重要
items: 15 个适用于 MacOS 的开源应用程序
items: 如何提升自动化的 ROI：4 个小提示

GitLab 的付费套餐现在可以免费用于开源项目
type: item
date: 2018-07-31T21:23:13+08:00
description: 最近在开源社区发生了很多事情。首先，微软收购了 GitHub，然后人们开始寻找 GitHub 替代套餐，甚至在 Linus Torvalds 发布 Linux Kernel 4.17 时没有花一点时间考虑它。好吧，如果你一直关注我们，我认为你知道这一切。但是，如今，GitLab 做出了一个明智的举措，为教育机构和开源项目免费提供高级套餐。当许多开发人员有兴趣将他们的开源项目迁移到 GitLab 时，没有更好的时机来提供这些了。GitLab 的高级套餐现在对开源项目和教育机构免费在今天（2018/6/7）发布的博客中，GitLab 宣布其旗舰和黄金套餐现在对教育机构和开源项目免费。虽然我们已经知道为什么 GitLab 做出这个举动（一个完美的时机！），但他们还是解释了他们让它免费的动机：我们让 GitLab 对教育机构免费，因为我们希望学生使用我们最先进的功能。许多大学已经运行了 GitLab。如果学生使用 GitLab 旗舰和黄金套餐的高级功能，他们将把这些高级功能的经验带到他们的工作场所。我们希望有更多的开源项目使用 GitLab。GitLab.com 上的公共项目已经拥有 GitLab 旗舰套餐的所有功能。像 Gnome 和 Debian 这样的项目已经在自己的服务器运行开源版 GitLab 。随着今天的宣布，在专有软件上运行的开源项目可以使用 GitLab 提供的所有功能，同时我们通过向非开源组织收费来建立可持续的业务模式。GitLab 提供的这些“免费”套餐是什么？GitLab 有两类产品。一个是你可以在自己的云托管服务如 Digital Ocean 上运行的软件。另一个是 Gitlab 软件既服务，其中托管由 GitLab 本身管理，你在 GitLab.com 上获得一个帐户。黄金套餐是托管类别中最高的产品，而旗舰套餐是自托管类别中的最高产品。你可以在 GitLab 定价页面上获得有关其功能的更多详细信息。请注意，支持服务不包括在套餐中。你必须单独购买。你必须符合某些条件才能使用此优惠GitLab 还提到 —— 该优惠对谁有效。以下是他们在博客文章中写的内容：教育机构：任何为了学习、教育的机构，并且/或者由合格的教育机构、教职人员、学生训练。教育目的不包括商业，专业或任何其他营利目的。开源项目：任何使用标准开源许可证且非商业性的项目。它不应该有付费支持或付费贡献者。虽然免费套餐不包括支持，但是当你迫切需要专家帮助解决问题时，你仍然可以支付每用户每月 4.95 美元的额外费用 —— 当你特别需要一个专家来解决问题时，这是一个非常合理的价格。GitLab 还为学生们添加了一条说明：为减轻 GitLab 的管理负担，只有教育机构才能代表学生申请。如果你是学生并且你的教育机构不申请，你可以在 GitLab.com 上使用公共项目的所有功能，使用私人项目的免费功能，或者自己付费。总结现在 GitLab 正在加快脚步，你如何看待它？你有 GitHub 上的项目吗？你会切换么？或者，幸运的是，你从一开始就碰巧使用 GitLab？请在下面的评论栏告诉我们你的想法。via: https://itsfoss.com/gitlab-free-open-source/作者：Ankush Das 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

Kubernetes 分布式应用部署实战：以人脸识别应用为例
type: item
date: 2018-07-31T02:24:55+08:00
description: 简介伙计们，请搬好小板凳坐好，下面将是一段漫长的旅程，期望你能够乐在其中。我将基于 Kubernetes 部署一个分布式应用。我曾试图编写一个尽可能真实的应用，但由于时间和精力有限，最终砍掉了很多细节。我将聚焦 Kubernetes 及其部署。让我们开始吧。应用TL;DR该应用本身由 6 个组件构成。代码可以从如下链接中找到：Kubenetes 集群示例。这是一个人脸识别服务，通过比较已知个人的图片，识别给定图片对应的个人。前端页面用表格形式简要的展示图片及对应的个人。具体而言，向 接收器 发送请求，请求包含指向一个图片的链接。图片可以位于任何位置。接受器将图片地址存储到数据库 (MySQL) 中，然后向队列发送处理请求，请求中包含已保存图片的 ID。这里我们使用 NSQ 建立队列。图片处理 服务一直监听处理请求队列，从中获取任务。处理过程包括如下几步：获取图片 ID，读取图片，通过 gRPC 将图片路径发送至 Python 编写的 人脸识别 后端。如果识别成功，后端给出图片对应个人的名字。图片处理器进而根据个人 ID 更新图片记录，将其标记为处理成功。如果识别不成功，图片被标记为待解决。如果图片识别过程中出现错误，图片被标记为失败。标记为失败的图片可以通过计划任务等方式进行重试。那么具体是如何工作的呢？我们深入探索一下。接收器接收器服务是整个流程的起点，通过如下形式的 API 接收请求：curl -d '{"path":"/unknown_images/unknown0001.jpg"}' http://127.0.0.1:8000/image/post 此时，接收器将 路径 path 存储到共享数据库集群中，该实体存储后将从数据库服务收到对应的 ID。本应用采用“ 实体对象 Entity Object 的唯一标识由持久层提供”的模型。获得实体 ID 后，接收器向 NSQ 发送消息，至此接收器的工作完成。图片处理器从这里开始变得有趣起来。图片处理器首次运行时会创建两个 Go 协程 routine ，具体为：Consume这是一个 NSQ 消费者，需要完成三项必需的任务。首先，监听队列中的消息。其次，当有新消息到达时，将对应的 ID 追加到一个线程安全的 ID 片段中，以供第二个协程处理。最后，告知第二个协程处理新任务，方法为 sync.Condition。ProcessImages该协程会处理指定 ID 片段，直到对应片段全部处理完成。当处理完一个片段后，该协程并不是在一个通道上睡眠等待，而是进入悬挂状态。对每个 ID，按如下步骤顺序处理：与人脸识别服务建立 gRPC 连接，其中人脸识别服务会在人脸识别部分进行介绍从数据库获取图片对应的实体为 断路器 准备两个函数函数 1: 用于 RPC 方法调用的主函数函数 2: 基于 ping 的断路器健康检查调用函数 1 将图片路径发送至人脸识别服务，其中路径应该是人脸识别服务可以访问的，最好是共享的，例如 NFS如果调用失败，将图片实体状态更新为 FAILEDPROCESSING如果调用成功，返回值是一个图片的名字，对应数据库中的一个个人。通过联合 SQL 查询，获取对应个人的 ID将数据库中的图片实体状态更新为 PROCESSED，更新图片被识别成的个人的 ID这个服务可以复制多份同时运行。断路器即使对于一个复制资源几乎没有开销的系统，也会有意外的情况发生，例如网络故障或任何两个服务之间的通信存在问题等。我在 gRPC 调用中实现了一个简单的断路器，这十分有趣。下面给出工作原理：当出现 5 次不成功的服务调用时，断路器启动并阻断后续的调用请求。经过指定的时间后，它对服务进行健康检查并判断是否恢复。如果问题依然存在，等待时间会进一步增大。如果已经恢复，断路器停止对服务调用的阻断，允许请求流量通过。前端前端只包含一个极其简单的表格视图，通过 Go 自身的 html/模板显示一系列图片。人脸识别人脸识别是整个识别的关键点。仅因为追求灵活性，我将这个服务设计为基于 gRPC 的服务。最初我使用 Go 编写，但后续发现基于 Python 的实现更加适合。事实上，不算 gRPC 部分的代码，人脸识别部分仅有 7 行代码。我使用的人脸识别库极为出色，它包含 OpenCV 的全部 C 绑定。维护 API 标准意味着只要标准本身不变，实现可以任意改变。注意：我曾经试图使用 GoCV，这是一个极好的 Go 库，但欠缺所需的 C 绑定。推荐马上了解一下这个库，它会让你大吃一惊，例如编写若干行代码即可实现实时摄像处理。这个 Python 库的工作方式本质上很简单。准备一些你认识的人的图片，把信息记录下来。对于我而言，我有一个图片文件夹，包含若干图片，名称分别为 hannibal_1.jpg、 hannib…

想学习区块链？那就用 Python 构建一个
type: item
date: 2018-07-30T21:04:02+08:00
description: 了解区块链是如何工作的最快的方法是构建一个。你看到这篇文章是因为和我一样，对加密货币的大热而感到兴奋。并且想知道区块链是如何工作的 —— 它们背后的技术基础是什么。但是理解区块链并不容易 —— 至少对我来说是这样。我徜徉在各种难懂的视频中，并且因为示例太少而陷入深深的挫败感中。我喜欢在实践中学习。这会使得我在代码层面上处理主要问题，从而可以让我坚持到底。如果你也是这么做的，在本指南结束的时候，你将拥有一个功能正常的区块链，并且实实在在地理解了它的工作原理。开始之前 …记住，区块链是一个 不可更改的、有序的 记录（被称为区块）的链。它们可以包括 交易 transaction 、文件或者任何你希望的真实数据。最重要的是它们是通过使用哈希链接到一起的。如果你不知道哈希是什么，这里有解释。本指南的目标读者是谁？ 你应该能轻松地读、写一些基本的 Python 代码，并能够理解 HTTP 请求是如何工作的，因为我们讨论的区块链将基于 HTTP。我需要做什么？ 确保安装了 Python 3.6+（以及 pip），还需要去安装 Flask 和非常好用的 Requests 库：pip install Flask==0.12.2 requests==2.18.4 当然，你也需要一个 HTTP 客户端，像 Postman 或者 cURL。哪个都行。最终的代码在哪里可以找到？ 源代码在 这里。第 1 步：构建一个区块链打开你喜欢的文本编辑器或者 IDE，我个人喜欢 PyCharm。创建一个名为 blockchain.py 的新文件。我将仅使用一个文件，如果你看晕了，可以去参考 源代码。描述一个区块链我们将创建一个 Blockchain 类，它的构造函数将去初始化一个空列表（去存储我们的区块链），以及另一个列表去保存交易。下面是我们的类规划：class Blockchain(object): def __init__(self): self.chain = [] self.current_transactions = [] def new_block(self): # Creates a new Block and adds it to the chain pass def new_transaction(self): # Adds a new transaction to the list of transactions pass @staticmethod def hash(block): # Hashes a Block pass @property def last_block(self): # Returns the last Block in the chain pass 我们的 Blockchain 类的原型我们的 Blockchain 类负责管理链。它将存储交易并且有一些为链中增加新区块的辅助性质的方法。现在我们开始去充实一些类的方法。区块是什么样子的？每个区块有一个索引、一个时间戳（Unix 时间）、一个交易的列表、一个证明（后面会详细解释）、以及前一个区块的哈希。单个区块的示例应该是下面的样子：block = { 'index': 1, 'timestamp': 1506057125.900785, 'transactions': [ { 'sender': "8527147fe1f5426f9dd545de4b27ee00", 'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f", 'amount': 5, } ], 'proof': 324984774000, 'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" } 我们的区块链中的块示例此刻，链的概念应该非常明显 —— 每个新区块包含它自身的信息和前一个区域的哈希。这一点非常重要，因为这就是区块链不可更改的原因：如果攻击者修改了一个早期的区块，那么所有的后续区块将包含错误的哈希。这样做有意义吗？如果没有，就让时间来埋葬它吧 —— 这就是区块链背后的核心思想。添加交易到一个区块我们将需要一种区块中添加交易的方式。我们的 new_transaction() 就是做这个的，它非常简单明了：class Blockchain(object): ... def new_transaction(self, sender, recipient, amount): """ Creates a new transaction to go into the next mined Block :param sender: <str> Addres…

Python 集合是什么，为什么应该使用以及如何使用？
type: item
date: 2018-07-30T07:45:00+08:00
description: Python 配备了几种内置数据类型来帮我们组织数据。这些结构包括列表、字典、元组和集合。根据 Python 3 文档：集合是一个无序集合，没有重复元素。基本用途包括成员测试和消除重复的条目。集合对象还支持数学运算，如并集、交集、差集和对等差分。在本文中，我们将回顾并查看上述定义中列出的每个要素的示例。让我们马上开始，看看如何创建它。初始化一个集合有两种方法可以创建一个集合：一个是给内置函数 set() 提供一个元素列表，另一个是使用花括号 {}。使用内置函数 set() 来初始化一个集合：>>> s1 = set([1, 2, 3]) >>> s1 {1, 2, 3} >>> type(s1) <class 'set'> 使用 {}：>>> s2 = {3, 4, 5} >>> s2 {3, 4, 5} >>> type(s2) <class 'set'> >>> 如你所见，这两种方法都是有效的。但问题是，如果我们想要一个空的集合呢？>>> s = {} >>> type(s) <class 'dict'> 没错，如果我们使用空花括号，我们将得到一个字典而不是一个集合。=)值得一提的是，为了简单起见，本文中提供的所有示例都将使用整数集合，但集合可以包含 Python 支持的所有 可哈希的 hashable 数据类型。换句话说，即整数、字符串和元组，而不是列表或字典这样的可变类型。>>> s = {1, 'coffee', [4, 'python']} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' 既然你知道了如何创建一个集合以及它可以包含哪些类型的元素，那么让我们继续看看为什么我们总是应该把它放在我们的工具箱中。为什么你需要使用它写代码时，你可以用不止一种方法来完成它。有些被认为是相当糟糕的，另一些则是清晰的、简洁的和可维护的，或者是 “ Python 式的 pythonic ”。根据 Hitchhiker 对 Python 的建议:当一个经验丰富的 Python 开发人员（ Python 人 Pythonista ）调用一些不够 “ Python 式的 pythonic ” 的代码时，他们通常认为着这些代码不遵循通用指南，并且无法被认为是以一种好的方式（可读性）来表达意图。让我们开始探索 Python 集合那些不仅可以帮助我们提高可读性，还可以加快程序执行时间的方式。无序的集合元素首先你需要明白的是：你无法使用索引访问集合中的元素。>>> s = {1, 2, 3} >>> s[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'set' object does not support indexing 或者使用切片修改它们：>>> s[0:2] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'set' object is not subscriptable 但是，如果我们需要删除重复项，或者进行组合列表（与）之类的数学运算，那么我们可以，并且应该始终使用集合。我不得不提一下，在迭代时，集合的表现优于列表。所以，如果你需要它，那就加深对它的喜爱吧。为什么？好吧，这篇文章并不打算解释集合的内部工作原理，但是如果你感兴趣的话，这里有几个链接，你可以阅读它：时间复杂度set() 是如何实现的？Python 集合 vs 列表在列表中使用集合是否有任何优势或劣势，以确保独一无二的列表条目？没有重复项写这篇文章的时候，我总是不停地思考，我经常使用 for 循环和 if 语句检查并删除列表中的重复元素。记得那时我的脸红了，而且不止一次，我写了类似这样的代码：>>> my_list = [1, 2, 3, 2, 3, 4] >>> no_duplicate_list = [] >>> for item in my_list: ... if item not in no_duplicate_list: ... no_duplicate_list.append(item) ... >>> no_duplicate_list [1, 2, 3, 4] 或者使用列表解析：>>> my_list = [1, 2, 3, 2, 3, 4] >>> no_duplicate_list = [] >>> [no_duplicate_list.append(i…

使用 Wttr.in 在你的终端中显示天气预报
type: item
date: 2018-07-30T07:06:00+08:00
description: wttr.in 是一个功能丰富的天气预报服务，它支持在命令行显示天气。它可以（根据你的 IP 地址）自动检测你的位置，也支持指定位置或搜索地理位置（如城市、山区等）等。哦，另外你不需要安装它 —— 你只需要使用 cURL 或 Wget（见下文）。wttr.in 功能包括：显示当前天气以及 3 天内的天气预报，分为早晨、中午、傍晚和夜晚（包括温度范围、风速和风向、可见度、降水量和概率）可以显示月相基于你的 IP 地址自动检测位置允许指定城市名称、3 字母的机场代码、区域代码、GPS 坐标、IP 地址或域名。你还可以指定地理位置，如湖泊、山脉、地标等）支持多语言位置名称（查询字符串必须以 Unicode 指定）支持指定天气预报显示的语言（它支持超过 50 种语言）来自美国的查询使用 USCS 单位用于，世界其他地方使用公制系统，但你可以通过附加 ?u 使用 USCS，附加 ?m 使用公制系统。 ）3 种输出格式：终端的 ANSI，浏览器的 HTML 和 PNG就像我在文章开头提到的那样，使用 wttr.in，你只需要 cURL 或 Wget，但你也可以在你的服务器上安装它。 或者你可以安装 wego，这是一个使用 wtter.in 的终端气候应用，虽然 wego 要求注册一个 API 密钥来安装。在使用 wttr.in 之前，请确保已安装 cURL。在 Debian、Ubuntu 或 Linux Mint（以及其他基于 Debian 或 Ubuntu 的 Linux 发行版）中，使用以下命令安装 cURL：sudo apt install curl wttr.in 命令行示例获取你所在位置的天气（wttr.in 会根据你的 IP 地址猜测你的位置）：curl wttr.in 通过在 curl 之后添加 -4，强制 cURL 将名称解析为 IPv4 地址（如果你用 IPv6 访问 wttr.in 有问题）：curl -4 wttr.in 如果你想检索天气预报保存为 png，还可以使用 Wget（而不是 cURL），或者你想这样使用它：wget -O- -q wttr.in 如果相对 cURL 你更喜欢 Wget ，可以在下面的所有命令中用 wget -O- -q 替换 curl。指定位置：curl wttr.in/Dublin 显示地标的天气信息（本例中为艾菲尔铁塔）：curl wttr.in/~Eiffel+Tower 获取 IP 地址位置的天气信息（以下 IP 属于 GitHub）：curl wttr.in/@192.30.253.113 使用 USCS 单位检索天气：curl wttr.in/Paris?u 如果你在美国，强制 wttr.in 使用公制系统（SI）：curl wttr.in/New+York?m 使用 Wget 将当前天气和 3 天预报下载为 PNG 图像：wget wttr.in/Istanbul.png 你可以指定 PNG 的透明度，这在你要使用一个脚本自动添加天气信息到某些图片（比如墙纸）上有用。对于其他示例，请查看 wttr.in 项目页面或在终端中输入：curl wttr.in/:help via: https://www.linuxuprising.com/2018/07/display-weather-forecast-in-your.html作者：Logix 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

Streams：一个新的 Redis 通用数据结构
type: item
date: 2018-07-30T05:47:00+08:00
description: 直到几个月以前，对于我来说，在消息传递的环境中， 流 streams 只是一个有趣且相对简单的概念。这个概念在 Kafka 流行之后，我主要研究它们在 Disque 案例中的应用，Disque 是一个消息队列，它将在 Redis 4.2 中被转换为 Redis 的一个模块。后来我决定让 Disque 都用 AP 消息（LCTT 译注：参见 CAP 定理），也就是说，它将在不需要客户端过多参与的情况下实现容错和可用性，这样一来，我更加确定地认为流的概念在那种情况下并不适用。然而在那时 Redis 有个问题，那就是缺省情况下导出数据结构并不轻松。它在 Redis 列表 list 、 有序集 sorted list 、 发布/订阅 Pub/Sub 功能之间有某些缺陷。你可以权衡使用这些工具对一系列消息或事件建模。有序集是内存消耗大户，那自然就不能对投递的相同消息进行一次又一次的建模，客户端不能阻塞新消息。因为有序集并不是一个序列化的数据结构，它是一个元素可以根据它们量的变化而移动的集合：所以它不像时序性的数据那样。列表有另外的问题，它在某些特定的用例中会产生类似的适用性问题：你无法浏览列表中间的内容，因为在那种情况下，访问时间是线性的。此外，没有任何指定输出的功能，列表上的阻塞操作仅为单个客户端提供单个元素。列表中没有固定的元素标识，也就是说，不能指定从哪个元素开始给我提供内容。对于一对多的工作任务，有发布/订阅机制，它在大多数情况下是非常好的，但是，对于某些不想 “即发即弃” fire-and-forget 的东西：保留一个历史是很重要的，不只是因为是断开之后会重新获得消息，也因为某些如时序性的消息列表，用范围查询浏览是非常重要的：比如在这 10 秒范围内温度读数是多少？我试图解决上述问题，我想规划一个通用的有序集合，并列入一个独特的、更灵活的数据结构，然而，我的设计尝试最终以生成一个比当前的数据结构更加矫揉造作的结果而告终。Redis 有个好处，它的数据结构导出更像自然的计算机科学的数据结构，而不是 “Salvatore 发明的 API”。因此，我最终停止了我的尝试，并且说，“ok，这是我们目前能提供的”，或许我会为发布/订阅增加一些历史信息，或者为列表访问增加一些更灵活的方式。然而，每次在会议上有用户对我说 “你如何在 Redis 中模拟时间系列” 或者类似的问题时，我的脸就绿了。起源在 Redis 4.0 中引入模块之后，用户开始考虑他们自己怎么去修复这些问题。其中一个用户 Timothy Downs 通过 IRC 和我说道：\<forkfork> 我计划给这个模块增加一个事务日志式的数据类型 —— 这意味着大量的订阅者可以在不导致 redis 内存激增的情况下做一些像发布/订阅那样的事情 \<forkfork> 订阅者持有他们在消息队列中的位置，而不是让 Redis 必须维护每个消费者的位置和为每个订阅者复制消息 他的思路启发了我。我想了几天，并且意识到这可能是我们马上同时解决上面所有问题的契机。我需要去重新构思 “日志” 的概念是什么。日志是个基本的编程元素，每个人都使用过它，因为它只是简单地以追加模式打开一个文件，并以一定的格式写入数据。然而 Redis 数据结构必须是抽象的。它们在内存中，并且我们使用内存并不是因为我们懒，而是因为使用一些指针，我们可以概念化数据结构并把它们抽象，以使它们摆脱明确的限制。例如，一般来说日志有几个问题：偏移不是逻辑化的，而是真实的字节偏移，如果你想要与条目插入的时间相关的逻辑偏移应该怎么办？我们有范围查询可用。同样，日志通常很难进行垃圾回收：在一个只能进行追加操作的数据结构中怎么去删除旧的元素？好吧，在我们理想的日志中，我们只需要说，我想要数字最大的那个条目，而旧的元素一个也不要，等等。当我从 Timothy 的想法中受到启发，去尝试着写一个规范的时候，我使用了 Redis 集群中的 radix 树去实现，优化了它内部的某些部分。这为实现一个有效利用空间的日志提供了基础，而且仍然有可能在 对数时间 logarithmic time 内访问范围。同时，我开始去读关于 Kafka 的流相关的内容以获得另外的灵感，它也非常适合我的设计，最后借鉴了 Kafka 消费组 consumer groups 的概念，并且再次针对 Redis 进行优化，以适用于 Redis 在内存中使用的情况。然而，该规范仅停留在纸面上，在一段时间后我几乎把它从头到尾重写了一遍，以便将我与别人讨论的所得到的许多建议一起增加到 Redis 升级中。我希望 Redis 流能成为对于时间序列有用的特性，而不仅是一个常见的事件和消息类的应用程序。让我们写一些代码吧从 Redis 大会回来后，整个夏天我都在实现一个叫 listpa…

Debian 打包入门
type: item
date: 2018-07-29T18:50:36+08:00
description: 创建 CardBook 软件包、本地 Debian 仓库，并修复错误。我在 GSoC（LCTT 译注：Google Summer Of Code，一项针对学生进行的开源项目训练营，一般在夏季进行。)的任务中有一项是为用户构建 Thunderbird 扩展 add-ons 。一些非常流行的扩展，比如 Lightning （日历行事历）已经拥有了 deb 包。另外一个重要的用于管理基于 CardDav 和 vCard 标准的联系人的扩展 Cardbook ，还没有一个 deb 包。我的导师， Daniel 鼓励我去为它制作一个包，并上传到 mentors.debian.net。因为这样就可以使用 apt-get 来安装，简化了安装流程。这篇博客描述了我是如何从头开始学习为 CardBook 创建一个 Debian 包的。首先，我是第一次接触打包，我在从源码构建包的基础上进行了大量研究，并检查它的协议是是否与 DFSG 兼容。我从多个 Debian Wiki 中的指南中进行学习，比如 打包介绍、 构建一个包，以及一些博客。我还研究了包含在 Lightning 扩展包的 amd64 文件。我创建的包可以在这里找到。Debian 包创建一个空的包我从使用 dh_make 来创建一个 debian 目录开始。# Empty project folder $ mkdir -p Debian/cardbook # create files $ dh_make\ > --native \ > --single \ > --packagename cardbook_1.0.0 \ > --email minkush@example.com 一些重要的文件，比如 control、rules、changelog、copyright 等文件被初始化其中。所创建的文件的完整列表如下：$ find /debian debian/ debian/rules debian/preinst.ex debian/cardbook-docs.docs debian/manpage.1.ex debian/install debian/source debian/source/format debian/cardbook.debhelper.lo debian/manpage.xml.ex debian/README.Debian debian/postrm.ex debian/prerm.ex debian/copyright debian/changelog debian/manpage.sgml.ex debian/cardbook.default.ex debian/README debian/cardbook.doc-base.EX debian/README.source debian/compat debian/control debian/debhelper-build-stamp debian/menu.ex debian/postinst.ex debian/cardbook.substvars debian/files 我了解了 Debian 系统中 Dpkg 包管理器及如何用它安装、删除和管理包。我使用 dpkg 命令创建了一个空的包。这个命令创建一个空的包文件以及四个名为 .changes、.deb、 .dsc、 .tar.gz 的文件。.dsc 文件包含了所发生的修改和签名.deb 文件是用于安装的主要包文件。.tar.gz （tarball）包含了源代码这个过程也在 /usr/share 目录下创建了 README 和 changelog 文件。它们包含了关于这个包的基本信息比如描述、作者、版本。我安装这个包，并检查这个包安装的内容。我的新包中包含了版本、架构和描述。$ dpkg -L cardbook /usr /usr/share /usr/share/doc /usr/share/doc/cardbook /usr/share/doc/cardbook/README.Debian /usr/share/doc/cardbook/changelog.gz /usr/share/doc/cardbook/copyright 包含 CardBook 源代码在成功的创建了一个空包以后，我在包中添加了实际的 CardBook 扩展文件。 CardBook 的源代码托管在 Gitlab 上。我将所有的源码文件包含在另外一个目录，并告诉打包命令哪些文件需要包含在这个包中。我使用 vi 编辑器创建一个 debian/install 文件并列举了需要被安装的文件。在这个过程中，我花费了一些时间去学习基于 Linux 终端的文本编辑器，比如 vi 。这…

为什么 DevSecOps 对 IT 领导来说如此重要
type: item
date: 2018-07-29T07:40:14+08:00
description: DevSecOps 也许不是一个优雅的词汇，但是其结果很吸引人：更强的安全、提前出现在开发周期中。来看看一个 IT 领导与 Meltdown 的拼搏。如果 DevOps 最终是关于创造更好的软件，那也就意味着是更安全的软件。而到了术语 “DevSecOps”，就像任何其他 IT 术语一样，DevSecOps —— 一个更成熟的 DevOps 的后代 ——可能容易受到炒作和盗用。但这个术语对那些拥抱了 DevOps 文化的领导者们来说具有重要的意义，并且其实践和工具可以帮助他们实现其承诺。说道这里：“DevSecOps”是什么意思？“DevSecOps 是开发、安全、运营的混合，”来自 Datical 的首席技术官和联合创始人 Robert 说。“这提醒我们，对我们的应用程序来说安全和创建并部署应用到生产中一样重要。”想阅读其他首席技术官的 DevOps 文章吗？查阅我们丰富的资源，[DevOps：IT 领导者指南]向非技术人员解释 DevSecOps 的一个简单的方法是：它是指将安全有意并提前加入到开发过程中。“安全团队从历史上一直都被孤立于开发团队——每个团队在 IT 的不同领域都发展了很强的专业能力”，来自红帽安全策的专家 Kirsten 最近告诉我们。“不需要这样，非常关注安全也关注他们通过软件来兑现商业价值的能力的企业正在寻找能够在应用开发生命周期中加入安全的方法。他们通过在整个 CI/CD 管道中集成安全实践、工具和自动化来采用 DevSecOps。”“为了能够做的更好，他们正在整合他们的团队——专业的安全人员从开始设计到部署到生产中都融入到了开发团队中了，”她说，“双方都收获了价值——每个团队都拓展了他们的技能和基础知识，使他们自己都成更有价值的技术人员。 DevOps 做的很正确——或者说 DevSecOps——提高了 IT 的安全性。”IT 团队比任何以往都要求要快速频繁的交付服务。DevOps 在某种程度上可以成为一个很棒的推动者，因为它能够消除开发和运营之间通常遇到的一些摩擦，运营一直被排挤在整个过程之外直到要部署的时候，开发者把代码随便一放之后就不再去管理，他们承担更少的基础架构的责任。那种孤立的方法引起了很多问题，委婉的说，在数字时代，如果将安全孤立起来同样的情况也会发生。“我们已经采用了 DevOps，因为它已经被证明通过移除开发和运营之间的阻碍来提高 IT 的绩效，”Reevess 说，“就像我们不应该在开发周期要结束时才加入运营，我们不应该在快要结束时才加入安全。”为什么 DevSecOps 必然出现或许会把 DevSecOps 看作是另一个时髦词，但对于安全意识很强的IT领导者来说，它是一个实质性的术语：在软件开发管道中安全必须是第一层面的要素，而不是部署前的最后一步的螺栓，或者更糟的是，作为一个团队只有当一个实际的事故发生的时候安全人员才会被重用争抢。“DevSecOps 不只是一个时髦的术语——因为多种原因它是现在和未来 IT 将呈现的状态”，来自 [Sumo Logic] 的安全和合规副总裁 George 说道，“最重要的好处是将安全融入到开发和运营当中开提供保护的能力”此外，DevSecOps 的出现可能是 DevOps 自身逐渐成熟并扎根于 IT 之中的一个征兆。“企业中的 DevOps 文化已成定局，而且那意味着开发者们正以不断增长的速度交付功能和更新，特别是自我管理的组织会对合作和衡量的结果更加满意”，来自 [CYBRIC] 的首席技术官和联合创始人 Mike 说道。在实施 DevOps 的同时继续保留原有安全措施的团队和公司，随着他们继续部署的更快更频繁可能正在经历越来越多的安全管理风险上的痛苦。“现在的手工的安全测试方法会继续远远被甩在后面。”“如今，手动的安全测试方法正被甩得越来越远，利用自动化和协作将安全测试转移到软件开发生命周期中，因此推动 DevSecOps 的文化是 IT 领导者们为增加整体的灵活性提供安全保证的唯一途径”，Kail 说。转移安全测试也使开发者受益：他们能够在开放的较早的阶段验证并解决潜在的问题——这样很少需要或者甚至不需要安全人员的介入，而不是在一个新的服务或者更新部署之前在他们的代码中发现一个明显的漏洞。“做的正确，DevSecOps 能够将安全融入到开发生命周期中，允许开发者们在没有安全中断的情况下更加快速容易的保证他们应用的安全”，来自 SAS 的首席信息安全员 Wilson 说道。Wilson 指出静态（SAST）和源组合分析（SCA）工具，集成到团队的持续交付管道中，作为有用的技术通过给予开发者关于他们的代码中的潜在问题和第三方依赖中的漏洞的反馈来使之逐渐成为可能。“因此，开发者们能够主动和迭代的缓解应用安全的问题，然后在不需要安全人员介入…

15 个适用于 MacOS 的开源应用程序
type: item
date: 2018-07-29T06:49:11+08:00
description: 钟爱开源的用户不会觉得在非 Linux 操作系统上使用他们喜爱的应用有多难。只要有可能的情况下，我都会去选择使用开源工具。不久之前，我回到大学去攻读教育领导学硕士学位。即便是我将喜欢的 Linux 笔记本电脑换成了一台 MacBook Pro（因为我不能确定校园里能够接受 Linux），我还是决定继续使用我喜欢的工具，哪怕是在 MacOS 上也是如此。幸运的是，它很容易，并且没有哪个教授质疑过我用的是什么软件。即然如此，我就不能秘而不宣。我知道，我的一些同学最终会在学区担任领导职务，因此，我与我的那些使用 MacOS 或 Windows 的同学分享了关于下面描述的这些开源软件。毕竟，开源软件是真正地自由和友好的。我也希望他们去了解它，并且愿意以很少的一些成本去提供给他们的学生去使用这些世界级的应用程序。他们中的大多数人都感到很惊讶，因为，众所周知，开源软件除了有像你和我这样的用户之外，压根就没有销售团队。我的 MacOS 学习曲线虽然大多数的开源工具都能像以前我在 Linux 上使用的那样工作，只是需要不同的安装方法。但是，经过这个过程，我学习了这些工具在 MacOS 上的一些细微差别。像 yum)、DNF)、和 APT) 在 MacOS 的世界中压根不存在 —— 我真的很怀念它们。一些 MacOS 应用程序要求依赖项，并且安装它们要比我在 Linux 上习惯的方法困难很多。尽管如此，我仍然没有放弃。在这个过程中，我学会了如何在我的新平台上保留最好的软件。即便是 MacOS 大部分的核心也是 开源的。此外，我的 Linux 的知识背景让我使用 MacOS 的命令行很轻松很舒适。我仍然使用命令行去创建和拷贝文件、添加用户、以及使用其它的像 cat、tac、more、less 和 tail 这样的 实用工具。15 个适用于 MacOS 的非常好的开源应用程序在大学里，要求我使用 DOCX 的电子版格式来提交我的工作，而这其实很容易，最初我使用的是 OpenOffice，而后来我使用的是 LibreOffice 去完成我的论文。当我因为演示需要去做一些图像时，我使用的是我最喜欢的图像应用程序 GIMP 和 Inkscape。我喜欢的播客创建工具是 Audacity。它比起 Mac 上搭载的专有应用程序更加简单。我使用它去录制访谈和为视频演示创建配乐。在 MacOS 上我最早发现的多媒体播放器是 VideoLan (VLC)。MacOS 内置的专有视频创建工具是一个非常好的产品，但是你也可以很轻松地去安装和使用 OpenShot，它是一个非常好的内容创建工具。当我需要在我的客户端上分析网络时，我在我的 Mac 上使用了易于安装的 Nmap (Network Mapper) 和 Wireshark 工具。当我为图书管理员和其它教育工作者提供培训时，我在 MacOS 上使用 VirtualBox 去做 Raspbian、Fedora、Ubuntu 和其它 Linux 发行版的示范操作。我使用 Etcher.io 在我的 MacBook 上制作了一个引导盘，下载 ISO 文件，将它刻录到一个 U 盘上。我认为 Firefox 比起 MacBook Pro 自带的专有浏览器更易用更安全，并且它允许我跨操作系统去同步我的书签。当我使用电子书阅读器时，Calibre 是当之无愧的选择。它很容易去下载和安装，你甚至只需要几次点击就能将它配置为一台 教室中使用的电子书服务器。最近我给中学的学生教 Python 课程，我发现它可以很容易地从 Python.org 上下载和安装 Python 3 及 IDLE3 编辑器。我也喜欢学习数据科学，并与学生分享。不论你是对 Python 还是 R 感兴趣，我都建议你下载和 安装 Anaconda 发行版。它包含了非常好的 iPython 编辑器、RStudio、Jupyter Notebooks、和 JupyterLab，以及其它一些应用程序。HandBrake 是一个将你家里的旧的视频 DVD 转成 MP4 的工具，这样你就可以将它们共享到 YouTube、Vimeo、或者你的 MacOS 上的 Kodi 服务器上。现在轮到你了：你在 MacOS（或 Windows）上都使用什么样的开源软件？在下面的评论区共享出来吧。via: https://opensource.com/article/18/7/open-source-tools-macos作者：Don Watkins 选题：lujun9972 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

如何提升自动化的 ROI：4 个小提示
type: item
date: 2018-07-28T06:09:28+08:00
description: 想要在你的自动化项目上达成强 ROI？采取如下步骤来规避失败。在过去的几年间，有关自动化技术的讨论已经很多了。COO 们和运营团队（事实上还有其它的业务部门）对于可以重新定义成本随着工作量的增加而增加的这一事实而感到震惊。 机器人流程自动化 Robotic Process Automation （RPA）似乎预示着运营的 圣杯 Holy Grail ：“我们提供了开箱即用的功能来满足你的日常操作所需 —— 检查电子邮件、保存附件、取数据、更新表格、生成报告、文件以及目录操作。构建一个机器人就像配置这些功能一样简单，然后用机器人将这些操作链接到一起，而不用去请求 IT 部门来构建它们。”这是一个多么诱人的话题。低成本、几乎不出错、非常遵守流程 —— 对 COO 们和运营领导来说，这些好处真实可及。RPA 工具承诺，它从运营中节省下来的费用就足够支付它的成本（有一个短的回报期），这一事实使得业务的观点更具有吸引力。自动化的谈论都趋向于类似的话题：COO 们和他们的团队想知道，自动化操作能够给他们带来什么好处。他们想知道 RPA 平台特性和功能，以及自动化在现实中的真实案例。从这一点到概念验证的实现过程通常很短暂。 在实现人工智能技术方面的建议，可以查看我们相关的文章，[制定你的人工智能策略：3 个小提示]。但是自动化带来的现实好处有时候可能比你所预期的时间要晚。采用 RPA 的公司在其实施后可能会对它们自身的 ROI 提出一些质疑。一些人没有看到预期之中的成本节省，并对其中的原因感到疑惑。你是不是自动化了错误的东西？在这些情况下，自动化的愿景和现实之间的差距是什么呢？我们来分析一下它，在决定去继续进行一个自动化验证项目（甚至是一个成熟的实践）之后，我们来看一下通常会发生什么。在确定实施自动化所采用的路径之后，COO 一般会问运营领导和他的团队们，应该在哪个流程或者任务上实施自动化。虽然从原则上说应该鼓励他们参与进来，但是有时候这种方式产生的决策往往会产生一个次优选择。原因如下：首先，团队领导经常会是“视野较窄”：他们对自己的流程和任务非常熟悉，但是对他们不参与的流程和任务并不是那么熟悉（特别是在他们没有太多运营经验的情况下）。这意味着他们在自己的工作领域内可能会找出比较适合自动化的候选者，但是在跨整个运营的其它领域中可能并不一定会找出最适合的。另外其它的像“我希望我的流程成为第一个实施自动化的候选者”这样的“软性”因素也会影响决定。其次，候选流程的选择有时候会被自动化特性和能力的匹配度所支配，而不是根据自动化所带来的价值所决定的。一个常见的误解是，任何包括像电子邮件或目录监视、下载、计算等活动的任务都是自动化的最佳候选者。如果对这些任务实施自动化不能为组织产生价值，那么它们就不是正确的候选者。那么，对于领导们来说，怎么才能确保实施自动化能够带来他们想要的 ROI 呢？实现这个目标有四步：1. 教育团队在你的团队中，从 COO 职位以下的人中，很有可能都听说过 RPA 和运营自动化。同样很有可能他们都有许多的问题和担心。在你开始启动实施之前解决这些问题和担心是非常重要的。对运营团队进行积极的教育可以大大地提升他们对自动化的热情和信心。培训主要关注于自动化和机器人是什么，它们在流程中一般扮演什么样的角色，哪个流程和任务最适合自动化，以及自动化的预期好处是什么。建议：邀请你的自动化合作伙伴去进行这些团队教育工作，你要有所控制：他们可能会非常乐意帮助你。在领导层将这些传播到更大范围的团队之前，你应该对他们的教育内容进行把关。“实施自动化的第一步是更好地理解你的流程。”2. 审查内部流程实施自动化的第一步是更好地理解你的流程。每个 RPA 实施之前都应该进行流程清单、动作分析、以及成本/价值的绘制练习。这些练习对于理解流程中何处产生价值（或成本，如果没有价值的情况下）是至关重要的。并且这些练习需要在每个流程或者每个任务这样的粒度级别上来做。这将有助你去识别和优先考虑最合适的自动化候选者。由于能够或者可能需要自动化的任务数量较多，流程一般需要分段实施自动化，因此优先级很重要。建议：设置一个小的工作团队，每个运营团队都参与其中。从每个运营团队中提名一个协调人 —— 一般是运营团队的领导或者团队管理者。在团队级别上组织一次研讨会，去构建流程清单、识别候选流程、以及推动购买。你的自动化合作伙伴很可能有“加速器” —— 调查问卷、计分卡等等 —— 这些将帮助你加速完成这项活动。3. 为优先业务提供强有力的指导实施自动化经常会涉及到在运营团队之间，基于业务价值对流程选择和自动化优先级上要达成共识（有时候是打破平衡）虽然团队的参与仍然是分析和实施的关键部分，但是领导仍然应该是最终的决策者。建议：安排定期会议从工作团队中获取最新信息。除了像推动达成共识和购…