2022年1月

三星 Tizen 应用商城已永久关闭

去年 6 月,三星公司关闭了 Tizen 应用商城的注册,并使商店只对现有用户开放,他们只能获得以前下载的应用程序。在 2021 年 12 月 31 日之后,Tizen 应用商店 永久关闭,不再对新用户和现有用户开放。最后一部运行 Tizen 的手机是三星在 2017 年发布的 Z4 手机。Tizen 公布于 2012 年 2 月,是英特尔 MeeGo 系统与三星 LiMo 系统的混合体。2016 年,Tizen 曾一度是全球第四大手机操作系统。由于三星电视全球巨大的出货量,Tizen 目前仍旧是 第一大电视操作系统

老王点评:又一次反抗 iOS 和安卓统治的努力宣告失败。

TIOBE 宣布年度最佳编程语言是 Python

TIOBE 发布公告宣布了这一消息,该奖项被授予在一年内获得最高评级增长的编程语言。2021 年初,Python 从 TIOBE 指数的第 3 位开始,把 Java 和 C 都甩在身后,成为了 第一名。TIOBE 指数是基于一种编程语言在流行搜索引擎中的搜索结果数量的指数,并不表明最好或最有效率的编程语言,也不衡量整个互联网上用一种语言编写的代码量,并且不考虑非英语语言。

老王点评:这是一个趣味性排行榜,你不应该用这个来指导你学习哪种编程语言。

“快速内核头文件”项目 V2 进一步将构建速度提高了 88%

之前我们 报道过,“快速内核头文件” 项目会清理内核头文件依赖关系,大大加快 Linux 内核的构建速度。它可能会成为 2022 年最伟大的 Linux 内核功能之一。周末,该项目发布了 V2 版本,根据 Linux 5.16-rc8 上游状态进行了重构。值得注意的是,现在也支持用 LLVM Clang 编译器进行编译,这使得内核构建过程加快了 88%! 而之前使用 GCC 编译提升了 77%。

老王点评:积极关注这个项目,就是不知道内核社区对它的看法如何?毕竟牵涉太大了。

Audacity 是开源软件世界中的一个经典的强大工具,可以用于录音、编辑等对声音进行操作。

 title=

Audacity 声音编辑器是填补了一个似乎没有人意识到的空白的开源应用程序。它最初是在卡内基梅隆大学开发的,当时很多人还认为电脑只是用来办公和学习的,要进行严肃的多媒体工作需要特殊的 DSP 外围设备。Audacity 认识到,普通计算机用户偶尔也需要编辑音频。在此后的 20 年里,Audacity 团队一直为录音和清理声音打造这个开源的应用程序。

我经常使用 Audacity,作为一个受过培训的编辑,我已经习惯了在我的应用程序中使用重要的、通常是单键的键盘快捷键。通过围绕单个字母建立快捷键,你可以一只手放在鼠标上,一只手放在键盘上,所以选择一个工具或一个重要功能和点击鼠标之间的延迟仅仅是几毫秒而已。在本文中,我将专门给出我在 Audacity 中使用的键盘快捷方式,如果你想优化自己的设置可以参考。

在 Linux 上安装 Audacity

在大多数 Linux 发行版上,Audacity 都可以从你的软件包管理器中获得。在 Fedora、Mageia 和类似的发行版上:

$ sudo dnf install audacity

在 Elementary、Mint 和其他基于 Debian 的发行版上:

$ sudo apt install audacity

然而,我是以 Flatpak 方式来使用 Audacity 的。

在 Windows 或 macOS 上,可以从 Audacity 网站 下载一个 Audacity 安装程序。

它最近有一个叫做 Tenacity 的复刻版本,是另外的开发者团队准备延续 Audacity 的传统而开发的。在写这篇文章的时候,两者基本上是相同的应用程序,所以这篇文章同样适用于两者。以后是否在功能上有分歧,还有待观察。

安装后,从你的应用程序或活动菜单中启动该应用程序。

在 Audacity 中设置输入

首先,你必须设置你的音频 输入,以便 Audacity 接收你使用的麦克风或音频接口的信号。你选择什么输入取决于你的设置和你拥有的音频外围设备。USB 麦克风通常被标为 麦克风 Microphone ,但带有 1/8" 输入插孔的麦克风可能被标为 线路输入 Line in 。你可以选择不同输入:

Pulse Audio 音频服务器

Linux 使用 高级 Linux 声音架构 Advanced Linux Sound Architecture (ALSA)作为其声音的后端,而 macOS 和 Windows 则使用自己的封闭框架。在 Linux 上,你可以将 Pulse Audio 音频服务器设置为你的输入源,将 Audacity 导向 一个 虚拟接口(Pulse),因此你可以从系统设置中选择声音输入。这是我的首选方法,因为它将所有控制集中在一个方便的控制面板上。在一个应用程序中选择一个麦克风,却发现麦克风在其他地方被静音的日子已经一去不复返了。

 title=

设备访问

如果你的发行版或操作系统没有使用 Pulse Audio 音频服务器,或者由于某种原因你喜欢直接访问声音设备,你可以从下拉菜单中选择一个设备。这需要了解你的系统是如何列出声音设备的,这有时候并不很好找。台式机可能有几个输入源,有些在机箱的后面,有些在前面的面板上。笔记本电脑通常输入方式较少,但你可能在网络摄像头附近有一个麦克风,如果你使用的是外部麦克风,可能还有一个。

用 Audacity 录制音频

选中你的输入后,按“ 录音 Record ”按钮(有红点的按钮)。

 title=

如果你是对着麦克风录音,你所要做的就是开始说话。如果你从,比如说,黑胶唱片机 录制输入,那么你必须启动它。不管是什么,只要 Audacity 处于录音模式,任何发送到你选择的输入的信号都会被写入 Audacity 并在你的屏幕上呈现为波形。

我的快捷方式: 我使用 R 键来开始录音。默认情况下,按下空格键停止录音(也可以回放录音)。

编辑音频

录音很少完全按计划进行。也许你过早地开始录音,不得不忍受几秒钟的黑胶静音(它就像静音,但更嘈杂),或者你发现你的语气停顿都是 “呃”、“嗯”或其他声调,或者你一开始就录制错误了。Audacity 首先是一个波形编辑器,这意味着你可以在最终的录音中剪掉你不想要的声音,就像你在文字处理器中输入的文字一样容易编辑。

编辑过零点的声音

Audacity 的主要编辑工具是“ 选择工具 Selection Tool ”。它是你在文字处理程序中看到的熟悉的“工字形”光标,它的功能在这里也是一样。你可以点击并拖动这个光标,穿过声音的一个区域,然后你可以复制、粘贴、剪切、删除或直接播放这个区域。

我的快捷键: 我用 I 键来激活“ 选择工具 Selection Tool ”,因为光标看起来像字母 “I”。

在文字处理器中,你可以非常清楚地看到每个字母的结尾和开头。你不可能不小心选择和删除一个字母的一半。然而,在现代应用程序中,声音的 “分辨率”(称为 采样率)非常好,所以人眼很难在音频波中找到一个清晰的断点。Audacity 可以调整你的选择,使你选择的区域落在所谓的 过零点 zero crossing ,这可以避免在你做切割的地方出现微妙但明显的突兀现象。

 title=

在你做出选择后,进入“ 选择 Select ”菜单,选择 “ 在过零点 At Zero Crossings ”。

我的快捷键: 我使用 Z 键来调整选区到过零点,使用 X 键来删除一个区域(它使我不必将手一直移到 DelBackspace )。

腾出空间

编辑的好处是,你的最终产品不一定要与你录制的内容一致。我曾经录制过一些讲座,甚至录制过一些读物的剧本,但最终因为某种原因而偏离了方向,或者遗漏了一部分重要的信息,后来在发布前又重新编排或添加了全新的音频。

移动所选的音频与删除类似,但不是删除音频,而是复制和粘贴所选内容,就像你在文字处理器中做的那样 —— 使用标准的键盘快捷键复制或剪切,重新定位你的光标,然后粘贴。不过,为插入的内容腾出空间,需要在音频时间线上留出空位,这样你就可以录制额外的音频来填补你所创造的空白。为此,你可以使用“ 选择工具 Selection Tool ”和“ 时间偏移工具 Time Shift Tool ”。

要在音频中创建一个空隙,将你的“ 选择工具 Selection Tool ”的光标放在你想添加空隙的地方。导航到“ 编辑 Edit ”菜单,选择“ 剪辑边界 Clip Boundaries ”子菜单,然后选择“ 分割 Split ”。这将在你的选择点上分割你的音频。

激活顶部工具栏中的“ 时间偏移工具 Time Shift Tool ”(图标是两个连接的箭头,分别指向左边和右边),点击并拖动分割后的音频的右半部分,创建一个间隙。

 title=

我的快捷方式: 我用 K 来分割,用 T 来激活“ 时间偏移工具 Time Shift Tool ”。

导出音频

当你对你的音频感到满意时,你可以导出它,这样你就可以与他人分享。Audacity 可以选择它能够导出的格式,并且它能够将其输出到像 ffmpeg 这样的工具,以获得比你可能永远需要的更多格式。

我更喜欢用 FLAC 格式输出音频,这种音频格式有点像 WAV,只是它是无损压缩的。它只占用一小部分空间,而没有任何质量上的损失。要尝试它,去“ 文件 File ”菜单,选择“ 导出 Export ”子菜单,然后选择“ 导出音频 Export Audio ”。有了 FLAC 文件作为你的 黄金镜像,你可以用 SoundConverter 把你的文件转换成任何数量的传输目标的最佳格式 —— 用于浏览器的 Ogg Vorbis 或 Opus 或 Webm,用于苹果设备的 M4A 文件,也许还有用于传统系统的 MP3。

如果你只是想从 Audacity 快速简单地导出,简单的选择是 Ogg Vorbis。这是一种开源的文件格式,可以在大多数网页浏览器(Firefox、Chromium、Chrome、Android 和 Edge)和 如 VLC、mpv 等媒体播放器 播放。

探索 Audacity

Audacity 是开源软件世界中的一个经典动力工具。基本的录音和编辑仅仅是个开始。你可以添加效果、过滤掉(一些)噪音、调整速度、改变音高等等。无论你是在学校录制讲座、混合鼓循环、为视频游戏拼接声音,还是只是在探索音频世界,都可以去启动 Audacity,发挥创意!


via: https://opensource.com/article/21/12/audacity-linux-creative-app

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

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

COVID-19 大流行使一家联网温度计制造商 Kinsa 成为全国知名企业,因为它提供了一个可能了解疾病传播的窗口。

一家名为 Kinsa 的公司正在利用 物联网 技术来创建一个连接温度计的网络,收集大量的匿名健康数据,这些数据可以为了解当前和未来的流行病提供帮助。

该公司创始人兼首席执行官 Inder Singh 表示,能够近乎实时地跟踪美国各地的发烧水平,对于广大公众以及医疗保健部门和政府的决策者来说,都可能是一条至关重要的信息。

该系统的联网技术相对简单 —— 温度计通过蓝牙连接到用户手机上的一个应用程序,该应用程序通过互联网将匿名数据报告给 Kinsa 的云。Singh 强调说,该公司只整理到县一级的数据,并声称通过 Kinsa 的数据识别个人几乎是不可能的。

“我们不提供个人身份信息,我们不提供识别数据,”他说。“这款应用程序只会引导你找到你需要的护理和服务。”

有了体温读数和一些关于体温测量者的基本人口统计信息以及他们的其他症状,这款应用程序可以提供基本的指导,比如是否需要去看医生,以及用户所在的区域是否出现了异常的发烧程度。

然而,真正的价值在于 Kinsa 在其 美国健康天气地图 上分析和细分的聚合数据,这些数据是从该公司生态系统中的 100 多万个温度计收集而来的。根据 Singh 的说法,这个想法是为了给公众提供一种方式,让他们对自己的健康做出更明智的决定。

“这是一个参与性很强的活动,”他说。“每个人都能得到数据,每个人都能做出反应。”

Kinsa 仍然直接向消费者销售温度计,但该公司正计划与地方政府、卫生部门甚至学区进行更密切的合作——辛格说,Kinsa 已经与美国两个州(他拒绝透露其名称)以及包括佛罗里达州的圣奥古斯丁在内的多个市政府合作。

他说:“我们的希望是,我们能够找出如何建立一个可扩展的模型 —— 我们永远不会只靠卖 20 美元的温度计就可以在全球范围内扩展。”。我们的目标是使该产品能够广泛应用,从而成为医疗保健部门有意义的早期预警系统。


via: https://www.networkworld.com/article/3539058/iot-offers-a-way-to-track-covid-19-via-connected-thermometers.html

作者:Jon Gold 选题:lujun9972 译者:CN-QUAN 校对:wxy

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

英国的植物出口 IT 系统只适用于旧版本的 IE 浏览器

英国政府部门要求,将植物和种子等产品从英国运往欧盟必须使用它们的 IT 系统来提前登记。但是,该系统 只能在 IE 浏览器 上正常工作,即使你使用最新的,还在支持期的 IE 11,你也必须在向后兼容模式下运行,因为该网站是 2000 年建设的。据统计,2021 年 12 月,IE 在全球的使用份额仅为 0.46%。IE 11 将于今年 6 月 15 日停止支持。

老王点评:看到国外政府部门也是这样,我就放心了。

Canonical 正在重构 Snap 应用

相比传统 Linux 安装包,Snap 更具可移植性,但它也有很多问题。除了这种容器式软件包固有的体积大、加载慢等缺陷,Snap 还不支持自定义软件库,必须通过 Canonical 的 Snap 商店分发。Linux Mint 就完全阻止了 Snap 应用程序的安装,并和其他一些发行版支持 RedHat 发明的 Flatpak 软件包。Canonical 正在计划 把 Snapcraft 拆成更小、更模块化和可重复使用的组件,以在一系列不同的产品中利用。软件包构建者可以使用通用的部件,并将添加的 Snapcraft 功能作为一个单独的层使用。

老王点评:我还以为 Canonical 会放弃 Snap,转向 Flatpak 呢。

Fedora 36 考虑放弃对 ifcfg 脚本的支持

虽然修改 ifcfg 脚本来管理网络连接已经基本上成为过去,NetworkManager 和类似的软件现在对大多数用户来说都很好用。NetworkManager 保留了对 ifcfg 脚本的支持,但如何处理这些文件是个麻烦,维护这种支持是个负担。ifcfg 脚本的设计没有前瞻性,导致了巨大的复杂性,而且其支持代码多达 13 万行,这还不包括巨大的测试套件,一直是各种错误的来源。因此,Fedora 36 考虑放弃 对这些脚本的支持。

老王点评:虽然这是一件好事,但是不可避免的,越来越多的老旧的、遵循古典 UNIX 哲学的东西会慢慢淘汰,这是 UNIX 哲学的没落么?

这篇文章讨论了安装 NumPy,然后创建、读取和排序 NumPy 数组。

 title=

NumPy(即 Numerical Python)是一个库,它使得在 Python 中对线性数列和矩阵进行统计和集合操作变得容易。我在 Python 数据类型的笔记中介绍过,它比 Python 的列表快几个数量级。NumPy 在数据分析和科学计算中使用得相当频繁。

我将介绍安装 NumPy,然后创建、读取和排序 NumPy 数组。NumPy 数组也被称为 ndarray,即 N 维数组的缩写。

安装 NumPy

使用 pip 安装 NumPy 包非常简单,可以像安装其他软件包一样进行安装:

pip install numpy

安装了 NumPy 包后,只需将其导入你的 Python 文件中:

import numpy as np

numpynp 之名导入是一个标准的惯例,但你可以不使用 np,而是使用你想要的任何其他别名。

为什么使用 NumPy? 因为它比 Python 列表要快好几个数量级

当涉及到处理大量的数值时,NumPy 比普通的 Python 列表快几个数量级。为了看看它到底有多快,我首先测量在普通 Python 列表上进行 min()max() 操作的时间。

我将首先创建一个具有 999,999,999 项的 Python 列表:

>>> my_list = range(1, 1000000000)
>>> len(my_list)
999999999

现在我将测量在这个列表中找到最小值的时间:

>>> start = time.time()
>>> min(my_list)
1
>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000))
Time elapsed in milliseconds: 27007.00879096985

这花了大约 27,007 毫秒,也就是大约 27 秒。这是个很长的时间。现在我试着找出寻找最大值的时间:

>>> start = time.time()
>>> max(my_list)
999999999
>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000))
Time elapsed in milliseconds: 28111.071348190308

这花了大约 28,111 毫秒,也就是大约 28 秒

现在我试试用 NumPy 找到最小值和最大值的时间:

>>> my_list = np.arange(1, 1000000000)
>>> len(my_list)
999999999
>>> start = time.time()
>>> my_list.min()
1
>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000))
Time elapsed in milliseconds: 1151.1778831481934
>>>
>>> start = time.time()
>>> my_list.max()
999999999
>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000))
Time elapsed in milliseconds: 1114.8970127105713

找到最小值花了大约 1151 毫秒,找到最大值 1114 毫秒。这大约是 1 秒

正如你所看到的,使用 NumPy 可以将寻找一个大约有 10 亿个值的列表的最小值和最大值的时间 从大约 28 秒减少到 1 秒。这就是 NumPy 的强大之处。

使用 Python 列表创建 ndarray

有几种方法可以在 NumPy 中创建 ndarray。

你可以通过使用元素列表来创建一个 ndarray:

>>> my_ndarray = np.array([1, 2, 3, 4, 5])
>>> print(my_ndarray)
[1 2 3 4 5]

有了上面的 ndarray 定义,我将检查几件事。首先,上面定义的变量的类型是 numpy.ndarray。这是所有 NumPy ndarray 的类型:

>>> type(my_ndarray)
<class 'numpy.ndarray'>

这里要注意的另一件事是 “ 形状 shape ”。ndarray 的形状是 ndarray 的每个维度的长度。你可以看到,my_ndarray 的形状是 (5,)。这意味着 my_ndarray 包含一个有 5 个元素的维度(轴)。

>>> np.shape(my_ndarray)
(5,)

数组中的维数被称为它的 “ rank ”。所以上面的 ndarray 的秩是 1。

我将定义另一个 ndarray my_ndarray2 作为一个多维 ndarray。那么它的形状会是什么呢?请看下面:

>>> my_ndarray2 = np.array([(1, 2, 3), (4, 5, 6)])
>>> np.shape(my_ndarray2)
(2, 3)

这是一个秩为 2 的 ndarray。另一个要检查的属性是 dtype,也就是数据类型。检查我们的 ndarray 的 dtype 可以得到以下结果:

>>> my_ndarray.dtype
dtype('int64')

int64 意味着我们的 ndarray 是由 64 位整数组成的。NumPy 不能创建混合类型的 ndarray,必须只包含一种类型的元素。如果你定义了一个包含混合元素类型的 ndarray,NumPy 会自动将所有的元素类型转换为可以包含所有元素的最高元素类型。

例如,创建一个 intfloat 的混合序列将创建一个 float64 的 ndarray:

>>> my_ndarray2 = np.array([1, 2.0, 3])
>>> print(my_ndarray2)
[1. 2. 3.]
>>> my_ndarray2.dtype
dtype('float64')

另外,将其中一个元素设置为 string 将创建 dtype 等于 <U21 的字符串 ndarray,意味着我们的 ndarray 包含 unicode 字符串:

>>> my_ndarray2 = np.array([1, '2', 3])
>>> print(my_ndarray2)
['1' '2' '3']
>>> my_ndarray2.dtype
dtype('<U21')

size 属性将显示我们的 ndarray 中存在的元素总数:

>>> my_ndarray = np.array([1, 2, 3, 4, 5])
>>> my_ndarray.size
5

使用 NumPy 方法创建 ndarray

如果你不想直接使用列表来创建 ndarray,还有几种可以用来创建它的 NumPy 方法。

你可以使用 np.zeros() 来创建一个填满 0 的 ndarray。它需要一个“形状”作为参数,这是一个包含行数和列数的列表。它还可以接受一个可选的 dtype 参数,这是 ndarray 的数据类型:

>>> my_ndarray = np.zeros([2,3], dtype=int)
>>> print(my_ndarray)
[[0 0 0]
 [0 0 0]]

你可以使用 np. ones() 来创建一个填满 1 的 ndarray:

>>> my_ndarray = np.ones([2,3], dtype=int)
>>> print(my_ndarray)
[[1 1 1]
 [1 1 1]]

你可以使用 np.full() 来给 ndarray 填充一个特定的值:

>>> my_ndarray = np.full([2,3], 10, dtype=int)
>>> print(my_ndarray)
[[10 10 10]
 [10 10 10]]

你可以使用 np.eye() 来创建一个单位矩阵 / ndarray,这是一个沿主对角线都是 1 的正方形矩阵。正方形矩阵是一个行数和列数相同的矩阵:

>>> my_ndarray = np.eye(3, dtype=int)
>>> print(my_ndarray)
[[1 0 0]
 [0 1 0]
 [0 0 1]]

你可以使用 np.diag() 来创建一个沿对角线有指定数值的矩阵,而在矩阵的其他部分为 0

>>> my_ndarray = np.diag([10, 20, 30, 40, 50])
>>> print(my_ndarray)
[[10  0  0  0  0]
 [ 0 20  0  0  0]
 [ 0  0 30  0  0]
 [ 0  0  0 40  0]
 [ 0  0  0  0 50]]

你可以使用 np.range() 来创建一个具有特定数值范围的 ndarray。它是通过指定一个整数的开始和结束(不包括)范围以及一个步长来创建的:

>>> my_ndarray = np.arange(1, 20, 3)
>>> print(my_ndarray)
[ 1  4  7 10 13 16 19]

读取 ndarray

ndarray 的值可以使用索引、分片或布尔索引来读取。

使用索引读取 ndarray 的值

在索引中,你可以使用 ndarray 的元素的整数索引来读取数值,就像你读取 Python 列表一样。就像 Python 列表一样,索引从 0 开始。

例如,在定义如下的 ndarray 中:

>>> my_ndarray = np.arange(1, 20, 3)

第四个值将是 my_ndarray[3],即 10。最后一个值是 my_ndarray[-1],即 19

>>> my_ndarray = np.arange(1, 20, 3)
>>> print(my_ndarray[0])
1
>>> print(my_ndarray[3])
10
>>> print(my_ndarray[-1])
19
>>> print(my_ndarray[5])
16
>>> print(my_ndarray[6])
19

使用分片读取 ndarray

你也可以使用分片来读取 ndarray 的块。分片的工作方式是用冒号(:)操作符指定一个开始索引和一个结束索引。然后,Python 将获取该开始和结束索引之间的 ndarray 片断:

>>> print(my_ndarray[:])
[ 1  4  7 10 13 16 19]
>>> print(my_ndarray[2:4])
[ 7 10]
>>> print(my_ndarray[5:6])
[16]
>>> print(my_ndarray[6:7])
[19]
>>> print(my_ndarray[:-1])
[ 1  4  7 10 13 16]
>>> print(my_ndarray[-1:])
[19]

分片创建了一个 ndarray 的引用(或视图)。这意味着,修改分片中的值也会改变原始 ndarray 的值。

比如说:

>>> my_ndarray[-1:] = 100
>>> print(my_ndarray)
[  1   4   7  10  13  16 100]

对于秩超过 1 的 ndarray 的分片,可以使用 [行开始索引:行结束索引, 列开始索引:列结束索引] 语法:

>>> my_ndarray2 = np.array([(1, 2, 3), (4, 5, 6)])
>>> print(my_ndarray2)
[[1 2 3]
 [4 5 6]]
>>> print(my_ndarray2[0:2,1:3])
[[2 3]
 [5 6]]

使用布尔索引读取 ndarray 的方法

读取 ndarray 的另一种方法是使用布尔索引。在这种方法中,你在方括号内指定一个过滤条件,然后返回符合该条件的 ndarray 的一个部分。

例如,为了获得一个 ndarray 中所有大于 5 的值,你可以指定布尔索引操作 my_ndarray[my_ndarray > 5]。这个操作将返回一个包含所有大于 5 的值的 ndarray:

>>> my_ndarray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> my_ndarray2 = my_ndarray[my_ndarray > 5]
>>> print(my_ndarray2)
[ 6  7  8  9 10]

例如,为了获得一个 ndarray 中的所有偶数值,你可以使用如下的布尔索引操作:

>>> my_ndarray2 = my_ndarray[my_ndarray % 2 == 0]
>>> print(my_ndarray2)
[ 2  4  6  8 10]

而要得到所有的奇数值,你可以用这个方法:

>>> my_ndarray2 = my_ndarray[my_ndarray % 2 == 1]
>>> print(my_ndarray2)
[1 3 5 7 9]

ndarray 的矢量和标量算术

NumPy 的 ndarray 允许进行矢量和标量算术操作。在矢量算术中,在两个 ndarray 之间进行一个元素的算术操作。在标量算术中,算术运算是在一个 ndarray 和一个常数标量值之间进行的。

如下的两个 ndarray:

>>> my_ndarray = np.array([1, 2, 3, 4, 5])
>>> my_ndarray2 = np.array([6, 7, 8, 9, 10])

如果你将上述两个 ndarray 相加,就会产生一个两个 ndarray 的元素相加的新的 ndarray。例如,产生的 ndarray 的第一个元素将是原始 ndarray 的第一个元素相加的结果,以此类推:

>>> print(my_ndarray2 + my_ndarray)
[ 7  9 11 13 15]

这里,716 的和,这是我相加的 ndarray 中的前两个元素。同样,15510 之和,是最后一个元素。

请看以下算术运算:

>>> print(my_ndarray2 - my_ndarray)
[5 5 5 5 5]
>>>
>>> print(my_ndarray2 * my_ndarray)
[ 6 14 24 36 50]
>>>
>>> print(my_ndarray2 / my_ndarray)
[6.         3.5        2.66666667 2.25       2.        ]

在 ndarray 中加一个标量值也有类似的效果,标量值被添加到 ndarray 的所有元素中。这被称为“ 广播 broadcasting ”:

>>> print(my_ndarray + 10)
[11 12 13 14 15]
>>>
>>> print(my_ndarray - 10)
[-9 -8 -7 -6 -5]
>>>
>>> print(my_ndarray * 10)
[10 20 30 40 50]
>>>
>>> print(my_ndarray / 10)
[0.1 0.2 0.3 0.4 0.5]

ndarray 的排序

有两种方法可以对 ndarray 进行原地或非原地排序。原地排序会对原始 ndarray 进行排序和修改,而非原地排序会返回排序后的 ndarray,但不会修改原始 ndarray。我将尝试这两个例子:

>>> my_ndarray = np.array([3, 1, 2, 5, 4])
>>> my_ndarray.sort()
>>> print(my_ndarray)
[1 2 3 4 5]

正如你所看到的,sort() 方法对 ndarray 进行原地排序,并修改了原数组。

还有一个方法叫 np.sort(),它对数组进行非原地排序:

>>> my_ndarray = np.array([3, 1, 2, 5, 4])
>>> print(np.sort(my_ndarray))
[1 2 3 4 5]
>>> print(my_ndarray)
[3 1 2 5 4]

正如你所看到的,np.sort() 方法返回一个已排序的 ndarray,但没有修改它。

总结

我已经介绍了很多关于 NumPy 和 ndarray 的内容。我谈到了创建 ndarray,读取它们的不同方法,基本的向量和标量算术,以及排序。NumPy 还有很多东西可以探索,包括像 union()intersection()这样的集合操作,像 min()max() 这样的统计操作,等等。

我希望我上面演示的例子是有用的。祝你在探索 NumPy 时愉快。

本文最初发表于 作者的个人博客,经授权后改编。


via: https://opensource.com/article/21/9/python-numpy

作者:Ayush Sharma 选题:lujun9972 译者:wxy 校对:wxy

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

在 Linux 或 BSD 操作系统上设置基本的实时流媒体服务器。

实时视频流越来越流行。亚马逊的 Twitch 和谷歌的 YouTube 等平台拥有数百万用户,这些用户消磨了无数小时的来观看直播和录制视频。这些视频服务通常可以免费使用,但需要你拥有一个帐户,并且一般会将你的视频内容隐藏在广告中。有些人不希望他们的视频提供给大众观看,或者想更多地控制自己的视频内容。幸运的是,借助强大的开源软件,任何人都可以设置直播服务器。

入门

在本教程中,我将说明如何使用 Linux 或 BSD 操作系统设置基本的实时流媒体服务器。

搭建实时流媒体服务器不可避免地提到系统需求问题。这些需求多种多样,因为实时流媒体涉及许多因素,例如:

  • 流媒体质量: 你想以高清流媒体播放还是标清视频就可以满足你的需求?
  • 收视率: 你的视频预计有多少观众?
  • 存储: 你是否打算保留已保存的视频流副本?
  • 访问: 你的视频流是私有的还是向全世界开放的?

在硬件要求方面没有固定规则,因此我建议你进行测试,以便找到最适合你需求的配置。本项目中,我将服务器安装在配有 4GB 内存、20GB 硬盘空间和单个 Intel i7 处理器内核的虚拟机上。

本项目使用 实时消息传递协议 Real-Time Messaging Protocol (RTMP)来处理音频和视频流。当然还有其他协议可用,但我选择 RTMP 是因为它具有广泛的支持。鉴于像 WebRTC 这样的开放标准变得更加兼容,我比较推荐这条路线。

同样重要的是,要明白“实时”并不总是意味着即时。视频流必须经过编码、传输、缓冲和显示,这通常会增大延迟。延迟可以被缩短或延长,具体取决于你创建的流类型及其属性。

设置 Linux 服务器

你可以使用许多不同的 Linux 发行版,但我更喜欢 Ubuntu,因此我下载了 Ubuntu 服务器版 作为我的操作系统。如果你希望你的服务器具有图形用户界面(GUI),请随意使用 Ubuntu 桌面版 或其多种风味版本之一。然后,我在我的计算机或虚拟机上启动了 Ubuntu 安装程序,并选择了最适合我的环境的设置。以下是我采取的步骤。

注意:因为这是一个服务器,你可能需要设置静态网络。

安装程序完成并重新启动系统后,你会看到一个可爱的新 Ubuntu 系统。 与任何新安装的操作系统一样,安装任何可用的更新:

sudo apt update
sudo apt upgrade

这个流媒体服务器将使用非常强大通用的 Nginx 网络服务器,所以你需要安装它:

sudo apt install nginx

然后你需要获取 RTMP 模块,以便 Nginx 可以处理你的媒体流:

sudo add-apt-repository universe
sudo apt install libnginx-mod-rtmp

修改你的网页服务器配置,使其能够接受和传送你的媒体流。

sudo nano /etc/nginx/nginx.conf

滚动到配置文件的底部并添加以下代码:

rtmp {
   server {
    listen 1935;
    chunk_size 4096;

    application live {
      live on;
      record off;
    }
  }
}

保存配置。我是使用 Nano 来编辑配置文件的异端。在 Nano 中,你可以通过快捷键 Ctrl+XY 并按下回车来保存你的配置。

这么一个非常小的配置就可以创建一个可工作的流服务器。稍后你将添加更多内容到此配置中,但这是一个很好的起点。

在开始第一个流之前,你需要使用新配置重新启动 Nginx:

sudo systemctl restart nginx

设置 BSD 服务器

如果是“小恶魔”(LCTT 译者注:FreeBSD 的标志是一个拿着叉子的红色小恶魔)的信徒,那么建立并运行一个流媒体服务器也非常容易。

前往 FreeBSD 网站并下载最新版本。在你的计算机或虚拟机上启动 FreeBSD 安装程序,然后执行初始步骤并选择最适合你环境的设置。由于这是一个服务器,你可能需要设置静态网络。

在安装程序完成并重新启动系统后,你应该就拥有了一个闪亮的新 FreeBSD 系统。像任何其他新安装的系统一样,你可能希望更新所有内容(从这一步开始,请确保你以 root 身份登录):

pkg update
pkg upgrade

安装 Nano 来编辑配置文件:

pkg install nano

这个流媒体服务器将使用非常强大通用的 Nginx 网络服务器。 你可以使用 FreeBSD 所拥有的优秀 ports 系统来构建 Nginx。

首先,更新你的 ports 树:

portsnap fetch
portsnap extract

进入 Nginx ports 目录:

cd /usr/ports/www/nginx

运行如下命令开始构建 Nginx:

make install

你将看到一个屏幕,询问你的 Nginx 构建中要包含哪些模块。对于这个项目,你需要添加 RTMP 模块。向下滚动直到选中 RTMP 模块,并按下空格键。然后按回车键继续剩下的构建和安装。

Nginx 安装完成后,就该为它配置流式传输了。

首先,在 /etc/rc.conf 中添加一个条目以确保 Nginx 服务器在系统启动时启动:

nano /etc/rc.conf

将此文本添加到文件中:

nginx_enable="YES"

接下来,创建一个网站根目录,Nginx 将从中提供其内容。我自己的目录叫 stream

cd /usr/local/www/
mkdir stream
chmod -R 755 stream/

现在你已经创建了你的流目录,通过编辑配置文件来配置 Nginx:

nano /usr/local/etc/nginx/nginx.conf

在文件顶部加载你的流媒体模块:

load_module /usr/local/libexec/nginx/ngx_stream_module.so;
load_module /usr/local/libexec/nginx/ngx_rtmp_module.so;

Server 部分下,更改 root 位置以匹配你之前创建的目录位置:

Location / {
  root /usr/local/www/stream
}

最后,添加你的 RTMP 设置,以便 Nginx 知道如何处理你的媒体流:

rtmp {
  server {
    listen 1935;
    chunk_size 4096;
    
    application live {
      live on;
      record off;
    }
  }
}

保存配置。在 Nano 中,你可以通过快捷键 Ctrl+XY,然后按回车键来执行此操作。

如你所见,这么一个非常小的配置将创建一个工作的流服务器。稍后,你将添加更多内容到此配置中,但这将为你提供一个很好的起点。

但是,在开始第一个流之前,你需要使用新配置重新启动 Nginx:

service nginx restart

设置你的流媒体软件

使用 OBS 进行广播

现在你的服务器已准备好接受你的视频流,是时候设置你的流媒体软件了。本教程使用功能强大的开源的 Open Broadcast Studio(OBS)。

前往 OBS 网站,找到适用于你的操作系统的版本并安装它。OBS 启动后,你应该会看到一个首次运行向导,该向导将帮助你使用最适合你的硬件的设置来配置 OBS。

OBS 没有捕获任何内容,因为你没有为其提供源。在本教程中,你只需为流捕获桌面。单击“ 来源 Source ”下的 “+” 按钮,选择“ 显示捕获 Screen Capture ”,然后选择要捕获的桌面。

单击“ 确定 OK ”,你应该会看到 OBS 镜像了你的桌面。

现在可以将你新配置的视频流发送到你的服务器了。在 OBS 中,单击“ 文件 > 设置 File > Settings ”。 单击“ Stream ”部分,并将“ 串流类型 Stream Type ” 设置为“ 自定义流媒体服务器 Custom Streaming Server ”。

在 URL 框中,输入前缀 rtmp:// 后跟流媒体服务器的 IP 地址,后跟 /live。例如,rtmp://IP-ADDRESS/live

接下来,你可能需要输入“ 串流密钥 Stream key ”,这是观看你的流所需的特殊标识符。 在“ 串流密钥 Stream key ”框中输入你想要(并且可以记住)的任何关键词。

单击“ 应用 Apply ”,然后单击“ 确定 OK ”。

现在 OBS 已配置为将你的流发送到你的服务器,你可以开始你的第一个视频流。 单击“ 开始推流 Start Streaming ”。

如果一切正常,你应该会看到按钮更改为“ 停止推流 Stop Streaming ”,并且在 OBS 的底部将出现一些带宽指标。

如果你收到错误消息,请仔细检查 OBS 中的流设置是否有拼写错误。如果一切看起来都不错,则可能是另一个问题阻止了它的工作。

观看你的视频流

如果没有人观看,就说明直播视频不是很好,所以请成为你的第一个观众!

有许多支持 RTMP 的开源媒体播放器,但最著名的可能是 VLC 媒体播放器

安装并启动 VLC 后,通过单击“ 媒体 > 打开网络串流 Media > Open Network Stream ” 打开你的流。输入你的流的路径,添加你在 OBS 中设置的串流密钥,然后单击“ 播放 Play ”。 例如,rtmp://IP-ADDRESS/live/SECRET-KEY

你现在应该可以看到自己的实时视频流了!

接下来要做什么?

本项目是一个非常简单的设置,可以让你开始工作。 以下是你可能想要使用的另外两个功能。

  • 限制访问: 你可能想要做的下一件事情是限制对你服务器的访问,因为默认设置允许任何人与服务器之间进行流传输。有多种设置方法,例如操作系统防火墙、.htaccess 文件,甚至使用 STMP 模块中的内置访问控制
  • 录制流: 这个简单的 Nginx 配置只会流传输而不会保存你的视频,但这很容易修改。在 Nginx 配置文件中的 RTMP 部分下,设置录制选项和要保存视频的位置。确保你设置的路径存在并且 Nginx 能够写入它。
application live {
  live on;
  record all;
  record_path /var/www/html/recordings;
  record_unique on;
}

实时流媒体的世界在不断发展,如果你对更高级的用途感兴趣,可以在互联网上找到许多其他很棒的资源。祝你好运,直播快乐!


via: https://opensource.com/article/19/1/basic-live-video-streaming-server

作者:Aaron J.Prisk 选题:lujun9972 译者:Starryi 校对:wxy

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