Merge remote-tracking branch 'LCTT/master'

This commit is contained in:
Xingyu.Wang 2018-07-30 12:12:38 +08:00
commit dc413e20ce
8 changed files with 147 additions and 176 deletions

View File

@ -1,15 +1,15 @@
Streams一个新的 Redis 通用数据结构 Streams一个新的 Redis 通用数据结构
====== ======
直到几个月以前,对于我来说,在消息传递的环境中,<ruby><rt>streams</rt></ruby>只是一个有趣且相对简单的概念。这个概念在 Kafka 流行之后,我主要研究它们在 Disque 案例中的应用Disque 是一个消息队列,它将在 Redis 4.2 中被转换为 Redis 的一个模块。后来我决定让 Disque 都用 AP 消息[1],也就是说,它将在不需要客户端过多参与的情况下实现容错和可用性,这样一来,我更加确定地认为流的概念在那种情况下并不适用。 直到几个月以前,对于我来说,在消息传递的环境中,<ruby><rt>streams</rt></ruby>只是一个有趣且相对简单的概念。这个概念在 Kafka 流行之后,我主要研究它们在 Disque 案例中的应用Disque 是一个消息队列,它将在 Redis 4.2 中被转换为 Redis 的一个模块。后来我决定让 Disque 都用 AP 消息LCTT 译注:参见 [CAP 定理][1] ,也就是说,它将在不需要客户端过多参与的情况下实现容错和可用性,这样一来,我更加确定地认为流的概念在那种情况下并不适用。
然而在那时 Redis 有个问题,那就是缺省情况下导出数据结构并不轻松。它在 Redis <ruby>列表<rt>list</rt></ruby><ruby>有序集<rt>sorted list</rt></ruby><ruby>发布/订阅<rt>Pub/Sub</rt></ruby>功能之间有某些缺陷。你可以权衡使用这些工具对一消息或事件建模。 然而在那时 Redis 有个问题,那就是缺省情况下导出数据结构并不轻松。它在 Redis <ruby>列表<rt>list</rt></ruby><ruby>有序集<rt>sorted list</rt></ruby><ruby>发布/订阅<rt>Pub/Sub</rt></ruby>功能之间有某些缺陷。你可以权衡使用这些工具对一系列消息或事件建模。
排序集合是内存消耗大户,那自然就不能对投递相同消息进行一次又一次的建模,客户端不能阻塞新消息。因为有序集并不是一个序列化的数据结构,它是一个元素可以根据它们量的变化而移动的集合:所以它不像时序性的数据那样。 有序集是内存消耗大户,那自然就不能对投递相同消息进行一次又一次的建模,客户端不能阻塞新消息。因为有序集并不是一个序列化的数据结构,它是一个元素可以根据它们量的变化而移动的集合:所以它不像时序性的数据那样。
列表有另外的问题,它在某些特定的用例中产生类似的适用性问题:你无法浏览列表中间的内容,因为在那种情况下,访问时间是线性的。此外,没有任何指定输出的功能,列表上的阻塞操作仅为单个客户端提供单个元素。列表中没有固定的元素标识,也就是说,不能指定从哪个元素开始给我提供内容。 列表有另外的问题,它在某些特定的用例中产生类似的适用性问题:你无法浏览列表中间的内容,因为在那种情况下,访问时间是线性的。此外,没有任何指定输出的功能,列表上的阻塞操作仅为单个客户端提供单个元素。列表中没有固定的元素标识,也就是说,不能指定从哪个元素开始给我提供内容。
对于一对多的工作任务,有发布/订阅机制,它在大多数情况下是非常好的,但是,对于某些不想<ruby>“即发即弃”<rt>fire-and-forget</rt></ruby>的东西:保留一个历史是很重要的,不只是因为是断开之后重新获得消息,也因为某些如时序性的消息列表,用范围查询浏览是非常重要的:在这 10 秒范围内温度读数是多少? 对于一对多的工作任务,有发布/订阅机制,它在大多数情况下是非常好的,但是,对于某些不想<ruby>“即发即弃”<rt>fire-and-forget</rt></ruby>的东西:保留一个历史是很重要的,不只是因为是断开之后重新获得消息,也因为某些如时序性的消息列表,用范围查询浏览是非常重要的:比如在这 10 秒范围内温度读数是多少?
我试图解决上述问题我想规划一个通用的有序集合并列入一个独特的、更灵活的数据结构然而我的设计尝试最终以生成一个比当前的数据结构更加矫揉造作的结果而告终。Redis 有个好处,它的数据结构导出更像自然的计算机科学的数据结构,而不是 “Salvatore 发明的 API”。因此我最终停止了我的尝试并且说“ok这是我们目前能提供的”或许我会为发布/订阅增加一些历史信息,或者为列表访问增加一些更灵活的方式。然而,每次在会议上有用户对我说 “你如何在 Redis 中模拟时间系列” 或者类似的问题时,我的脸就绿了。 我试图解决上述问题我想规划一个通用的有序集合并列入一个独特的、更灵活的数据结构然而我的设计尝试最终以生成一个比当前的数据结构更加矫揉造作的结果而告终。Redis 有个好处,它的数据结构导出更像自然的计算机科学的数据结构,而不是 “Salvatore 发明的 API”。因此我最终停止了我的尝试并且说“ok这是我们目前能提供的”或许我会为发布/订阅增加一些历史信息,或者为列表访问增加一些更灵活的方式。然而,每次在会议上有用户对我说 “你如何在 Redis 中模拟时间系列” 或者类似的问题时,我的脸就绿了。
@ -22,7 +22,7 @@ Streams一个新的 Redis 通用数据结构
他的思路启发了我。我想了几天,并且意识到这可能是我们马上同时解决上面所有问题的契机。我需要去重新构思 “日志” 的概念是什么。日志是个基本的编程元素,每个人都使用过它,因为它只是简单地以追加模式打开一个文件,并以一定的格式写入数据。然而 Redis 数据结构必须是抽象的。它们在内存中,并且我们使用内存并不是因为我们懒,而是因为使用一些指针,我们可以概念化数据结构并把它们抽象,以使它们摆脱明确的限制。例如,一般来说日志有几个问题:偏移不是逻辑化的,而是真实的字节偏移,如果你想要与条目插入的时间相关的逻辑偏移应该怎么办?我们有范围查询可用。同样,日志通常很难进行垃圾回收:在一个只能进行追加操作的数据结构中怎么去删除旧的元素?好吧,在我们理想的日志中,我们只需要说,我想要数字最大的那个条目,而旧的元素一个也不要,等等。 他的思路启发了我。我想了几天,并且意识到这可能是我们马上同时解决上面所有问题的契机。我需要去重新构思 “日志” 的概念是什么。日志是个基本的编程元素,每个人都使用过它,因为它只是简单地以追加模式打开一个文件,并以一定的格式写入数据。然而 Redis 数据结构必须是抽象的。它们在内存中,并且我们使用内存并不是因为我们懒,而是因为使用一些指针,我们可以概念化数据结构并把它们抽象,以使它们摆脱明确的限制。例如,一般来说日志有几个问题:偏移不是逻辑化的,而是真实的字节偏移,如果你想要与条目插入的时间相关的逻辑偏移应该怎么办?我们有范围查询可用。同样,日志通常很难进行垃圾回收:在一个只能进行追加操作的数据结构中怎么去删除旧的元素?好吧,在我们理想的日志中,我们只需要说,我想要数字最大的那个条目,而旧的元素一个也不要,等等。
当我从 Timothy 的想法中受到启发,去尝试着写一个规范的时候,我使用了 Redis 集群中的 radix 树去实现,优化了它内部的某些部分。这为实现一个有效利用空间的日志提供了基础,而且仍然可以用<ruby>对数时间<rt>logarithmic time</rt></ruby>访问范围。同时,我开始去读关于 Kafka 流以获得另外的灵感,它也非常适合我的设计,最后借鉴了 Kafka <ruby>消费群体<rt>consumer groups</rt></ruby>的概念,并且再次针对 Redis 进行优化,以适用于 Redis 在内存中使用的情况。然而,该规范仅停留在纸面上,在一段时间后我几乎把它从头到尾重写了一遍,以便将我与别人讨论的所得到的许多建议一起增加到 Redis 升级中。我希望 Redis 流能成为对于时间序列有用的特性,而不仅是一个常见的事件和消息类的应用程序。 当我从 Timothy 的想法中受到启发,去尝试着写一个规范的时候,我使用了 Redis 集群中的 radix 树去实现,优化了它内部的某些部分。这为实现一个有效利用空间的日志提供了基础,而且仍然有可能在<ruby>对数时间<rt>logarithmic time</rt></ruby>访问范围。同时,我开始去读关于 Kafka 相关的内容以获得另外的灵感,它也非常适合我的设计,最后借鉴了 Kafka <ruby>消费<rt>consumer groups</rt></ruby>的概念,并且再次针对 Redis 进行优化,以适用于 Redis 在内存中使用的情况。然而,该规范仅停留在纸面上,在一段时间后我几乎把它从头到尾重写了一遍,以便将我与别人讨论的所得到的许多建议一起增加到 Redis 升级中。我希望 Redis 流能成为对于时间序列有用的特性,而不仅是一个常见的事件和消息类的应用程序。
### 让我们写一些代码吧 ### 让我们写一些代码吧
@ -159,7 +159,7 @@ QUEUED
### 内存使用和节省加载时间 ### 内存使用和节省加载时间
因为用来建模 Redis 流的设计,内存使用率是非常低的。这取决于它们的字段、值的数量和长度,对于简单的消息,每使用 100MB 内存可以有几百万条消息。此外格式设想为需要极少的序列化listpack 块以 radix 树节点方式存储在磁盘上和内存中都以相同方式表示的因此它们可以很轻松地存储和读取。例如Redis 可以在 0.3 秒内从 RDB 文件中读取 500 万个条目。这使流的复制和持久存储非常高效。 因为用来建模 Redis 流的设计,内存使用率是非常低的。这取决于它们的字段、值的数量和长度,对于简单的消息,每使用 100MB 内存可以有几百万条消息。此外,格式设想为需要极少的序列化listpack 块以 radix 树节点方式存储在磁盘上和内存中都以相同方式表示的因此它们可以很轻松地存储和读取。例如Redis 可以在 0.3 秒内从 RDB 文件中读取 500 万个条目。这使流的复制和持久存储非常高效。
我还计划允许从条目中间进行部分删除。现在仅实现了一部分,策略是在条目在标记中标识条目为已删除,并且,当已删除条目占全部条目的比例达到指定值时,这个块将被回收重写,如果需要,它将被连到相邻的另一个块上,以避免碎片化。 我还计划允许从条目中间进行部分删除。现在仅实现了一部分,策略是在条目在标记中标识条目为已删除,并且,当已删除条目占全部条目的比例达到指定值时,这个块将被回收重写,如果需要,它将被连到相邻的另一个块上,以避免碎片化。
@ -175,7 +175,7 @@ via: http://antirez.com/news/114
作者:[antirez][a] 作者:[antirez][a]
译者:[qhwdw](https://github.com/qhwdw) 译者:[qhwdw](https://github.com/qhwdw)
校对:[wxy](https://github.com/wxy)、[pityonline](https://github.com/pityonline) 校对:[wxy](https://github.com/wxy), [pityonline](https://github.com/pityonline)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

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

View File

@ -1,15 +1,13 @@
Python 集合是什么,为什么应该使用以及如何使用? Python 集合是什么,为什么应该使用以及如何使用?
===== =====
[wilfredinni][5] 在 07/10/2018 发表
![Python Sets: What, Why and How](https://raw.githubusercontent.com/wilfredinni/pysheetComments/master/2018-july/python_sets/sets.png) ![Python Sets: What, Why and How](https://raw.githubusercontent.com/wilfredinni/pysheetComments/master/2018-july/python_sets/sets.png)
Python 配备了几种内置数据类型来帮我们组织数据。这些结构包括列表,字典,元组和集合。 Python 配备了几种内置数据类型来帮我们组织数据。这些结构包括列表、字典、元组和集合。
根据 Python 3 文档: 根据 Python 3 文档:
> 集合是一个*无序*集合,没有*重复元素*。基本用途包括*成员测试*和*消除重复的条目*。集合对象还支持数学运算,如*并集**交集**差集*和*对等差分*。 > 集合是一个*无序*集合,没有*重复元素*。基本用途包括*成员测试*和*消除重复的条目*。集合对象还支持数学运算,如*并集*、*交集*、*差集*和*对等差分*。
在本文中,我们将回顾并查看上述定义中列出的每个要素的示例。让我们马上开始,看看如何创建它。 在本文中,我们将回顾并查看上述定义中列出的每个要素的示例。让我们马上开始,看看如何创建它。
@ -25,7 +23,6 @@ Python 配备了几种内置数据类型来帮我们组织数据。这些结构
{1, 2, 3} {1, 2, 3}
>>> type(s1) >>> type(s1)
<class 'set'> <class 'set'>
``` ```
使用 `{}` 使用 `{}`
@ -38,7 +35,6 @@ Python 配备了几种内置数据类型来帮我们组织数据。这些结构
>>> type(s2) >>> type(s2)
<class 'set'> <class 'set'>
>>> >>>
``` ```
如你所见,这两种方法都是有效的。但问题是,如果我们想要一个空的集合呢? 如你所见,这两种方法都是有效的。但问题是,如果我们想要一个空的集合呢?
@ -47,34 +43,32 @@ Python 配备了几种内置数据类型来帮我们组织数据。这些结构
>>> s = {} >>> s = {}
>>> type(s) >>> type(s)
<class 'dict'> <class 'dict'>
``` ```
没错,如果我们使用空花括号,我们将得到一个字典而不是一个集合。 没错,如果我们使用空花括号,我们将得到一个字典而不是一个集合。=)
值得一提的是,为了简单起见,本文中提供的所有示例都将使用整数集合,但集合可以包含 Python 支持的所有 [hashable可哈希][6] 数据类型。换句话说,即整数,字符串和元组,而不是*列表*或*字典*这样的可变类型。 值得一提的是,为了简单起见,本文中提供的所有示例都将使用整数集合,但集合可以包含 Python 支持的所有 <ruby>[可哈希的][6]<rt>hashable</rt></ruby> 数据类型。换句话说,即整数、字符串和元组,而不是*列表*或*字典*这样的可变类型。
``` ```
>>> s = {1, 'coffee', [4, 'python']} >>> s = {1, 'coffee', [4, 'python']}
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list' TypeError: unhashable type: 'list'
``` ```
既然你知道如何创建一个集合以及它可以包含哪些类型的元素,那么让我们继续看看*为什么*我们总是应该把它放在我们的工具箱中。 既然你知道如何创建一个集合以及它可以包含哪些类型的元素,那么让我们继续看看*为什么*我们总是应该把它放在我们的工具箱中。
### 为什么你需要使用它 ### 为什么你需要使用它
写代码时,你可以用不止一种方法来完成它。有些被认为是相当糟糕的,另一些则是清晰的,简介的和可维护的,或者是 "[_pythonic_][7]" 的 写代码时,你可以用不止一种方法来完成它。有些被认为是相当糟糕的,另一些则是清晰的、简洁的和可维护的,或者是 “<ruby>[Python 式的][7]<rt>pythonic</rt></ruby>
根据 [Hitchhiker 对 Python 的建议][8]: 根据 [Hitchhiker 对 Python 的建议][8]:
> 当一个经验丰富的 Python 开发人员Pythonista调用一些不够 “Pythonic” 的代码时,他们通常认为着这些代码不遵循通用指南,并且无法被认为是以一种好的方式(可读性)来表达意图。 > 当一个经验丰富的 Python 开发人员(<ruby>Python 人<rt>Pythonista</rt></ruby>)调用一些不够 “<ruby>Python 式的<rt>pythonic</rt></ruby>” 的代码时,他们通常认为着这些代码不遵循通用指南,并且无法被认为是以一种好的方式(可读性)来表达意图。
让我们开始探索 Python 集合那些不仅可以帮助我们提高可读性,还可以加快程序执行时间的方式。 让我们开始探索 Python 集合那些不仅可以帮助我们提高可读性,还可以加快程序执行时间的方式。
### 无序的集合元素 #### 无序的集合元素
首先你需要明白的是:你无法使用索引访问集合中的元素。 首先你需要明白的是:你无法使用索引访问集合中的元素。
@ -84,8 +78,8 @@ TypeError: unhashable type: 'list'
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing TypeError: 'set' object does not support indexing
``` ```
或者使用切片修改它们: 或者使用切片修改它们:
``` ```
@ -93,7 +87,6 @@ TypeError: 'set' object does not support indexing
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <module>
TypeError: 'set' object is not subscriptable TypeError: 'set' object is not subscriptable
``` ```
但是,如果我们需要删除重复项,或者进行组合列表(与)之类的数学运算,那么我们可以,并且*应该*始终使用集合。 但是,如果我们需要删除重复项,或者进行组合列表(与)之类的数学运算,那么我们可以,并且*应该*始终使用集合。
@ -101,16 +94,13 @@ TypeError: 'set' object is not subscriptable
我不得不提一下,在迭代时,集合的表现优于列表。所以,如果你需要它,那就加深对它的喜爱吧。为什么?好吧,这篇文章并不打算解释集合的内部工作原理,但是如果你感兴趣的话,这里有几个链接,你可以阅读它: 我不得不提一下,在迭代时,集合的表现优于列表。所以,如果你需要它,那就加深对它的喜爱吧。为什么?好吧,这篇文章并不打算解释集合的内部工作原理,但是如果你感兴趣的话,这里有几个链接,你可以阅读它:
* [时间复杂度][1] * [时间复杂度][1]
* [set() 是如何实现的?][2] * [set() 是如何实现的?][2]
* [Python 集合 vs 列表][3] * [Python 集合 vs 列表][3]
* [在列表中使用集合是否有任何优势或劣势,以确保独一无二的列表条目?][4] * [在列表中使用集合是否有任何优势或劣势,以确保独一无二的列表条目?][4]
### 没有重复项 #### 没有重复项
写这篇文章的时候,我总是不停地思考,我经常使用 *for* 循环和 *if* 语句检查并删除列表中的重复元素。记得那时我的脸红了,而且不止一次,我写了类似这样的代码: 写这篇文章的时候,我总是不停地思考,我经常使用 `for` 循环和 `if` 语句检查并删除列表中的重复元素。记得那时我的脸红了,而且不止一次,我写了类似这样的代码:
``` ```
>>> my_list = [1, 2, 3, 2, 3, 4] >>> my_list = [1, 2, 3, 2, 3, 4]
@ -121,7 +111,6 @@ TypeError: 'set' object is not subscriptable
... ...
>>> no_duplicate_list >>> no_duplicate_list
[1, 2, 3, 4] [1, 2, 3, 4]
``` ```
或者使用列表解析: 或者使用列表解析:
@ -133,7 +122,6 @@ TypeError: 'set' object is not subscriptable
[None, None, None, None] [None, None, None, None]
>>> no_duplicate_list >>> no_duplicate_list
[1, 2, 3, 4] [1, 2, 3, 4]
``` ```
但没关系,因为我们现在有了武器装备,没有什么比这更重要的了: 但没关系,因为我们现在有了武器装备,没有什么比这更重要的了:
@ -144,10 +132,9 @@ TypeError: 'set' object is not subscriptable
>>> no_duplicate_list >>> no_duplicate_list
[1, 2, 3, 4] [1, 2, 3, 4]
>>> >>>
``` ```
现在让我们使用 *timeit* 模块,查看列表和集合在删除重复项时的执行时间: 现在让我们使用 `timeit` 模块,查看列表和集合在删除重复项时的执行时间:
``` ```
>>> from timeit import timeit >>> from timeit import timeit
@ -159,7 +146,6 @@ TypeError: 'set' object is not subscriptable
>>> # 首先,让我们看看列表的执行情况: >>> # 首先,让我们看看列表的执行情况:
>>> print(timeit('no_duplicates([1, 2, 3, 1, 7])', globals=globals(), number=1000)) >>> print(timeit('no_duplicates([1, 2, 3, 1, 7])', globals=globals(), number=1000))
0.0018683355819786227 0.0018683355819786227
``` ```
``` ```
@ -168,25 +154,27 @@ TypeError: 'set' object is not subscriptable
>>> print(timeit('list(set([1, 2, 3, 1, 2, 3, 4]))', number=1000)) >>> print(timeit('list(set([1, 2, 3, 1, 2, 3, 4]))', number=1000))
0.0010220493243764395 0.0010220493243764395
>>> # 快速而且干净 =) >>> # 快速而且干净 =)
``` ```
使用集合而不是列表推导不仅让我们编写*更少的代码*,而且还能让我们获得*更具可读性*和*高性能*的代码。 使用集合而不是列表推导不仅让我们编写*更少的代码*,而且还能让我们获得*更具可读性*和*高性能*的代码。
注意:请记住集合是无序的,因此无法保证在将它们转换回列表时,元素的顺序不变。 注意:请记住集合是无序的,因此无法保证在将它们转换回列表时,元素的顺序不变。
[Python 之禅][9]: [Python 之禅][9]
to 校正者:建议英文保留)
> Beautiful is better than ugly. 优美胜于丑陋。
> Explicit is better than implicit.明了胜于晦涩。
> Simple is better than complex.简洁胜于复杂。
> Flat is better than nested. 扁平胜于嵌套。
集合不正是这样美丽,明了,简单且扁平吗? > <ruby>优美胜于丑陋<rt>Beautiful is better than ugly.</rt></ruby>
### 成员测试 > <ruby>明了胜于晦涩<rt>Explicit is better than implicit.</rt></ruby>
每次我们使用 *if* 语句来检查一个元素,例如,它是否在列表中时,意味着你正在进行成员测试: > <ruby>简洁胜于复杂<rt>Simple is better than complex.</rt></ruby>
> <ruby>扁平胜于嵌套<rt>Flat is better than nested.</rt></ruby>
集合不正是这样美丽、明了、简单且扁平吗?
#### 成员测试
每次我们使用 `if` 语句来检查一个元素,例如,它是否在列表中时,意味着你正在进行成员测试:
``` ```
my_list = [1, 2, 3] my_list = [1, 2, 3]
@ -194,7 +182,6 @@ my_list = [1, 2, 3]
... print('Yes, this is a membership test!') ... print('Yes, this is a membership test!')
... ...
Yes, this is a membership test! Yes, this is a membership test!
``` ```
在执行这些操作时,集合比列表更高效: 在执行这些操作时,集合比列表更高效:
@ -210,7 +197,6 @@ Yes, this is a membership test!
... setup="from __main__ import in_test; iterable = list(range(1000))", ... setup="from __main__ import in_test; iterable = list(range(1000))",
... number=1000) ... number=1000)
12.459663048726043 12.459663048726043
``` ```
``` ```
@ -224,11 +210,9 @@ Yes, this is a membership test!
... setup="from __main__ import in_test; iterable = set(range(1000))", ... setup="from __main__ import in_test; iterable = set(range(1000))",
... number=1000) ... number=1000)
.12354438152988223 .12354438152988223
>>>
``` ```
注意:上面的测试来自于[这里][10] StackOverflow thread。
注意:上面的测试来自于[这个][10] StackOverflow 话题。
因此,如果你在巨大的列表中进行这样的比较,尝试将该列表转换为集合,它应该可以加快你的速度。 因此,如果你在巨大的列表中进行这样的比较,尝试将该列表转换为集合,它应该可以加快你的速度。
@ -236,7 +220,7 @@ Yes, this is a membership test!
现在你已经了解了集合是什么以及为什么你应该使用它,现在让我们快速浏览一下,看看我们如何修改和操作它。 现在你已经了解了集合是什么以及为什么你应该使用它,现在让我们快速浏览一下,看看我们如何修改和操作它。
### 添加元素 #### 添加元素
根据要添加的元素数量,我们要在 `add()``update()` 方法之间进行选择。 根据要添加的元素数量,我们要在 `add()``update()` 方法之间进行选择。
@ -247,7 +231,6 @@ Yes, this is a membership test!
>>> s.add(4) >>> s.add(4)
>>> s >>> s
{1, 2, 3, 4} {1, 2, 3, 4}
``` ```
`update()` 适用于添加多个元素: `update()` 适用于添加多个元素:
@ -257,12 +240,11 @@ Yes, this is a membership test!
>>> s.update([2, 3, 4, 5, 6]) >>> s.update([2, 3, 4, 5, 6])
>>> s >>> s
{1, 2, 3, 4, 5, 6} {1, 2, 3, 4, 5, 6}
``` ```
请记住,集合会移除重复项。 请记住,集合会移除重复项。
### 移除元素 #### 移除元素
如果你希望在代码中尝试删除不在集合中的元素时收到警报,请使用 `remove()`。否则,`discard()` 提供了一个很好的选择: 如果你希望在代码中尝试删除不在集合中的元素时收到警报,请使用 `remove()`。否则,`discard()` 提供了一个很好的选择:
@ -275,7 +257,6 @@ Yes, this is a membership test!
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <module>
KeyError: 3 KeyError: 3
``` ```
`discard()` 不会引起任何错误: `discard()` 不会引起任何错误:
@ -287,7 +268,6 @@ KeyError: 3
{1, 2} {1, 2}
>>> s.discard(3) >>> s.discard(3)
>>> # 什么都不会发生 >>> # 什么都不会发生
``` ```
我们也可以使用 `pop()` 来随机丢弃一个元素: 我们也可以使用 `pop()` 来随机丢弃一个元素:
@ -298,7 +278,6 @@ KeyError: 3
1 1
>>> s >>> s
{2, 3, 4, 5} {2, 3, 4, 5}
``` ```
或者 `clear()` 方法来清空一个集合: 或者 `clear()` 方法来清空一个集合:
@ -308,10 +287,9 @@ KeyError: 3
>>> s.clear() # 清空集合 >>> s.clear() # 清空集合
>>> s >>> s
set() set()
``` ```
### union() #### union()
`union()` 或者 `|` 将创建一个新集合,其中包含我们提供集合中的所有元素: `union()` 或者 `|` 将创建一个新集合,其中包含我们提供集合中的所有元素:
@ -320,10 +298,9 @@ set()
>>> s2 = {3, 4, 5} >>> s2 = {3, 4, 5}
>>> s1.union(s2) # 或者 's1 | s2' >>> s1.union(s2) # 或者 's1 | s2'
{1, 2, 3, 4, 5} {1, 2, 3, 4, 5}
``` ```
### intersection() #### intersection()
`intersection``&` 将返回一个由集合共同元素组成的集合: `intersection``&` 将返回一个由集合共同元素组成的集合:
@ -333,10 +310,9 @@ set()
>>> s3 = {3, 4, 5} >>> s3 = {3, 4, 5}
>>> s1.intersection(s2, s3) # 或者 's1 & s2 & s3' >>> s1.intersection(s2, s3) # 或者 's1 & s2 & s3'
{3} {3}
``` ```
### difference() #### difference()
使用 `diference()``-` 创建一个新集合,其值在 “s1” 中但不在 “s2” 中: 使用 `diference()``-` 创建一个新集合,其值在 “s1” 中但不在 “s2” 中:
@ -345,10 +321,9 @@ set()
>>> s2 = {2, 3, 4} >>> s2 = {2, 3, 4}
>>> s1.difference(s2) # 或者 's1 - s2' >>> s1.difference(s2) # 或者 's1 - s2'
{1} {1}
``` ```
### symmetric_diference() #### symmetric_diference()
`symetric_difference``^` 将返回集合之间的不同元素。 `symetric_difference``^` 将返回集合之间的不同元素。
@ -357,7 +332,6 @@ set()
>>> s2 = {2, 3, 4} >>> s2 = {2, 3, 4}
>>> s1.symmetric_difference(s2) # 或者 's1 ^ s2' >>> s1.symmetric_difference(s2) # 或者 's1 ^ s2'
{1, 4} {1, 4}
``` ```
### 结论 ### 结论
@ -372,7 +346,7 @@ via: https://www.pythoncheatsheet.org/blog/python-sets-what-why-how
作者:[wilfredinni][a] 作者:[wilfredinni][a]
译者:[MjSeven](https://github.com/MjSeven) 译者:[MjSeven](https://github.com/MjSeven)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,79 +0,0 @@
translating---geekpi
GitLabs Ultimate & Gold Plans Are Now Free For Open-Source Projects
======
A lot has happened in the open-source community recently. First, [Microsoft acquired GitHub][1] and then people started to look for [GitHub alternatives][2] without even taking a second to think about it while Linus Torvalds released the [Linux Kernel 4.17][3]. Well, if youve been following us, I assume that you know all that.
But, today, GitLab made a smart move by making some of its high-tier plans free for educational institutes and open-source projects. There couldnt be a better time to offer something like this when a lot of developers are interested in migrating their open-source projects to GitLab.
### GitLabs premium plans are now free for open source projects and educational institutes
![GitLab Logo][4]
In a [blog post][5] today, GitLab announced that the **Ultimate** and Gold plans are now free for educational institutes and open-source projects. While we already know why GitLab made this move (a darn perfect timing!), they did explain their motive to make it free:
> We make GitLab free for education because we want students to use our most advanced features. Many universities already run GitLab. If the students use the advanced features of GitLab Ultimate and Gold they will take their experiences with these advanced features to their workplaces.
>
> We would love to have more open source projects use GitLab. Public projects on GitLab.com already have all the features of GitLab Ultimate. And projects like [Gnome][6] and [Debian][7] already run their own server with the open source version of GitLab. With todays announcement, open source projects that are comfortable running on proprietary software can use all the features GitLab has to offer while allowing us to have a sustainable business model by charging non-open-source organizations.
### What are these free plans offered by GitLab?
![GitLab Pricing][8]
GitLab has two categories of offerings. One is the software that you could host on your own cloud hosting service like [Digital Ocean][9]. The other is providing GitLab software as a service where the hosting is managed by GitLab itself and you get an account on GitLab.com.
![GitLab Pricing for hosted service][10]
Gold is the highest offering in the hosted category while Ultimate is the highest offering in the self-hosted category.
You can get more details about their features on GitLab pricing page. Do note that the support is not included in this offer. You have to purchase it separately.
### You have to match certain criteria to avail this offer
GitLab also mentioned to whom the offer will be valid for. Heres what they wrote in their blog post:
> 1. **Educational institutions:** any institution whose purposes directly relate to learning, teaching, and/or training by a qualified educational institution, faculty, or student. Educational purposes do not include commercial, professional, or any other for-profit purposes.
>
> 2. **Open source projects:** any project that uses a [standard open source license][11] and is non-commercial. It should not have paid support or paid contributors.
>
>
Although the free plan does not include support, you can still pay an additional fee of 4.95 USD per user per month which is a very fair price, when you are in the dire need of an expert to help resolve an issue.
GitLab also added a note for the students:
> To reduce the administrative burden for GitLab, only educational institutions can apply on behalf of their students. If youre a student and your educational institution does not apply, you can use public projects on GitLab.com with all functionality, use private projects with the free functionality, or pay yourself.
### Wrapping Up
Now that GitLab is stepping up its game, what do you think about it?
Do you have a project hosted on [GitHub][12]? Will you be switching over? Or, luckily, you already happen to use GitLab from the start?
Let us know your thoughts in the comments section below.
--------------------------------------------------------------------------------
via: https://itsfoss.com/gitlab-free-open-source/
作者:[Ankush Das][a]
选题:[lujun9972](https://github.com/lujun9972)
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://itsfoss.com/author/ankush/
[1]:https://itsfoss.com/microsoft-github/
[2]:https://itsfoss.com/github-alternatives/
[3]:https://itsfoss.com/linux-kernel-4-17/
[4]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/06/GitLab-logo-800x450.png
[5]:https://about.gitlab.com/2018/06/05/gitlab-ultimate-and-gold-free-for-education-and-open-source/
[6]:https://www.gnome.org/news/2018/05/gnome-moves-to-gitlab-2/
[7]:https://salsa.debian.org/public
[8]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/06/gitlab-pricing.jpeg
[9]:https://m.do.co/c/d58840562553
[10]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/06/gitlab-hosted-service-800x273.jpeg
[11]:https://itsfoss.com/open-source-licenses-explained/
[12]:https://github.com/

View File

@ -1,3 +1,7 @@
Translating by DavidChenLiang
How To View Detailed Information About A Package In Linux How To View Detailed Information About A Package In Linux
====== ======
This is know topic and we can write so many articles because most of the time we would stick with package managers for many reasons. This is know topic and we can write so many articles because most of the time we would stick with package managers for many reasons.

View File

@ -1,3 +1,5 @@
translating---geekpi
4 cool new projects to try in COPR for July 2018 4 cool new projects to try in COPR for July 2018
====== ======

View File

@ -1,4 +1,4 @@
translating---geelkpi translating---geekpi
Textricator: Data extraction made simple Textricator: Data extraction made simple
====== ======

View File

@ -0,0 +1,78 @@
GitLab 的旗舰和黄金计划现在可以免费用于开源项目
======
最近在开源社区发生了很多事情。首先,[微软收购了GitHub][1],然后人们开始寻找[ GitHub 替代方案][2],甚至在 Linus Torvalds 发布 [Linux Kernel 4.17][3] 时没有花一点时间考虑它。好吧,如果你一直关注我们,我认为你知道这一切。
但是今天GitLab 做出了一个明智的举措,为教育机构和开源项目免费提供高级计划。当许多开发人员有兴趣将他们的开源项目迁移到 GitLab 时,没有更好的时机来提供这些了。
### GitLab 的高级计划现在对开源项目和教育机构免费
![GitLab Logo][4]
在今天[发布的博客][5]中GitLab 宣布**旗舰**和黄金计划现在对教育机构和开源项目免费。虽然我们已经知道为什么 GitLab 做出这个举动(一个完美的时机!),但他们还是解释了他们让它免费的动机:
>我们让 GitLab 对教育免费,因为我们希望学生使用我们最先进的功能。许多大学已经运行了 GitLab。如果学生使用 GitLab Ultimate 和 Gold 的高级功能,他们将把这些高级功能的经验带到他们的工作场所。
>
>我们希望有更多的开源项目使用GitLab。GitLab.com 上的公共项目已经拥有 GitLab Ultimate 的所有功能。像 [Gnome][6] 和 [Debian][7] 这样的项目已经在自己的服务器运行开源版 GitLab 。随着今天的宣布,在专有软件上运行的开源项目可以使用 GitLab 提供的所有功能,同时我们通过向非开源组织收费来建立可持续的业务模式。
### GitLab 提供的这些“免费”计划是什么?
![GitLab Pricing][8]
GitLab 有两类产品。一个是你可以在自己的云托管服务如 [Digital Ocean][9] 上运行的软件。另一个是 Gitlab 软件既服务,其中托管由 GitLab 本身管理,你在 GitLab.com 上获得一个帐户。
![GitLab Pricing for hosted service][10]
Gold 是托管类别中最高的产品,而 Ultimate 是自托管类别中的最高产品。
You can get more details about their features on GitLab pricing page. Do note that the support is not included in this offer. You have to purchase it separately.
你可以在 GitLab 定价页面上获得有关其功能的更多详细信息。请注意,支持不在计划中。你必须单独购买。
### 你必须符合某些条件才能使用此优惠
GitLab 还提到 - 该优惠对谁有效。以下是他们在博客文章中写的内容:
> 1. **教育机构:**任何为了学习、教育的机构,并且/或者由合格的教育机构、教职人员、学生训练。教育目的不包括商业,专业或任何其他营利目的。
>
> 2. **开源项目:**任何使用[标准开源许可证][11]且非商业性的项目。它不应该有付费支持或付费贡献者。
>
>
虽然免费计划不包括支持,但是当你迫切需要专家帮助解决问题时,你仍然可以支付每用户每月 4.95 美元的额外费用 - 当你特别需要一个专家来解决问题时,这是一个非常合理的价格。
GitLab 还为学生们添加了一条说明:
>为减轻 GitLab 的管理负担,只有教育机构才能代表学生申请。如果你是学生并且你的教育机构不申请,你可以在 GitLab.com 上使用公共项目的所有功能,使用私人项目的免费功能,或者自己付费。
### 总结
现在 GitLab 正在加快脚步,你如何看待它?
你有 [GitHub][12] 上的项目吗?你会切换么?或者,幸运的是,你从一开始就碰巧使用 GitLab
请在下面的评论栏告诉我们你的想法。
--------------------------------------------------------------------------------
via: https://itsfoss.com/gitlab-free-open-source/
作者:[Ankush Das][a]
选题:[lujun9972](https://github.com/lujun9972)
译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://itsfoss.com/author/ankush/
[1]:https://itsfoss.com/microsoft-github/
[2]:https://itsfoss.com/github-alternatives/
[3]:https://itsfoss.com/linux-kernel-4-17/
[4]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/06/GitLab-logo-800x450.png
[5]:https://about.gitlab.com/2018/06/05/gitlab-ultimate-and-gold-free-for-education-and-open-source/
[6]:https://www.gnome.org/news/2018/05/gnome-moves-to-gitlab-2/
[7]:https://salsa.debian.org/public
[8]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/06/gitlab-pricing.jpeg
[9]:https://m.do.co/c/d58840562553
[10]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/06/gitlab-hosted-service-800x273.jpeg
[11]:https://itsfoss.com/open-source-licenses-explained/
[12]:https://github.com/