2016年10月

我自认为自己是个奥迪亚的维基人。我通过写文章和纠正文章错误给很多维基项目贡献了 奥迪亚 Odia 知识(这是在印度的奥里萨邦的主要语言),比如维基百科和维基文库,我也为用印地语和英语写的维基文章做贡献。

我对维基的爱从我第 10 次考试(像在美国的 10 年级学生的年级考试)之后看到的英文维基文章孟加拉解放战争开始。一不小心我打开了印度维基文章的链接,并且开始阅读它。在文章左边有用奥迪亚语写的东西,所以我点击了一下, 打开了一篇在奥迪亚维基上的 ଭାରତ/Bhārat 文章。发现了用母语写的维基让我很激动!

一个邀请读者参加 2014 年 4 月 1 日召开的第二届布巴内斯瓦尔研讨会的旗帜广告引起了我的好奇。我过去从来没有为维基做过贡献,只用它做过研究,我并不熟悉开源和社区贡献流程。再加上,当时我只有 15 岁。我注册了,在研讨会上有很多语言爱好者,他们全比我大。尽管我害怕,我父亲还是鼓励我去参与。他起了非常重要的作用—他不是一个维基媒体人,和我不一样,但是他的鼓励给了我改变奥迪亚维基的动力和参加社区活动的勇气。

我觉得关于奥迪亚语言和文学的知识很多需要改进,有很多错误的观念和知识缺口,所以,我帮助组织关于奥迪亚维基的活动和和研讨会,我完成了如下列表:

我在维基项目当编辑直到去年( 2015 年 1 月)为止,当我出席孟加拉语维基百科的十周年会议毗瑟挐活动时,互联网和社会中心主任,邀请我参加培训师培训计划。我的开始超越奥迪亚维基,为GLAM的活动举办聚会和培训新的维基人。这些经验告诉我作为一个贡献者该如何为社区工作。

Ravi,在当时印度维基的总监,在我的旅程也发挥了重要作用。他非常相信我,让我参与到了 Wiki Loves Food,维基共享中的公共摄影比赛,组织方是 2016 印度维基会议。在 2015 的 Loves Food 活动期间,我的团队在维基共享中加入了 10000+ 采用 CC BY-SA 协议的图片。Ravi 进一步坚定了我的信心,和我分享了很多关于维基媒体运动的信息,以及他自己在 奥迪亚维基百科 13 周年的经历。

不到一年后,在 2015 年十二月,我成为了网络与社会中心的获取知识计划的项目助理( CIS-A2K 运动)。我自豪的时刻之一是在印度普里的研讨会,我们给奥迪亚维基媒体社区带来了 20 个新的维基人。现在,我在一个名为 WikiTungi 普里的非正式聚会上指导着维基人。我和这个小组一起工作,把奥迪亚 Wikiquotes 变成一个真实的计划项目。在奥迪亚维基我也致力于缩小性别差距。八个女编辑也正帮助组织聚会和研讨会,参加 Women's History month edit-a-thon

在我四年短暂而令人激动的旅行之中,我也参与到 维基百科的教育项目通讯团队,两个全球的 edit-a-thons: Art and FeminsimMenu Challenge。我期待着更多的到来!

我还要感谢 SameerAnna(都是之前维基百科教育计划的成员)。


via: https://opensource.com/life/16/4/my-open-source-story-sailesh-patnaik

作者:Sailesh Patnaik 译者:hkurj 校对:wxy

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

在这篇文章中,我们将介绍单元测试的布尔断言方法 assertTrueassertFalse 与身份断言 assertIs 之间的区别。

定义

下面是目前单元测试模块文档中关于 assertTrueassertFalse 的说明,代码进行了高亮:

assertTrue(expr, msg=None)

assertFalse(expr, msg=None)

测试该表达式是真值(或假值)。

注:这等价于

bool(expr) is True

而不等价于

expr is True

(后一种情况请使用 assertIs(expr, True))。

Mozilla 开发者网络中定义 真值 如下:

在一个布尔值的上下文环境中能变成“真”的值

在 Python 中等价于:

bool(expr) is True

这个和 assertTrue 的测试目的完全匹配。

因此该文档中已经指出 assertTrue 返回真值,assertFalse 返回假值。这些断言方法从接受到的值构造出一个布尔值,然后判断它。同样文档中也建议我们根本不应该使用 assertTrueassertFalse

在实践中怎么理解?

我们使用一个非常简单的例子 - 一个名称为 always_true 的函数,它返回 True。我们为它写一些测试用例,然后改变代码,看看测试用例的表现。

作为开始,我们先写两个测试用例。一个是“宽松的”:使用 assertTrue 来测试真值。另外一个是“严格的”:使用文档中建议的 assertIs 函数。

import unittest
from func import always_true

class TestAlwaysTrue(unittest.TestCase):
    def test_assertTrue(self):
        """
        always_true returns a truthy value
        """
        result = always_true()

        self.assertTrue(result)

    def test_assertIs(self):
        """
        always_true returns True
        """
        result = always_true()

        self.assertIs(result, True)

下面是 func.py 中的非常简单的函数代码:

def always_true():
    """
    I'm always True.

    Returns:
        bool: True
    """
    return True

当你运行时,所有测试都通过了:

always_true returns True ... ok
always_true returns a truthy value ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.004s

OK

开心ing~

现在,某个人将 always_true 函数改变成下面这样:

def always_true():
    """
    I'm always True.

    Returns:
        bool: True
    """
    return 'True'

它现在是用返回字符串 "True" 来替代之前反馈的 True (布尔值)。(当然,那个“某人”并没有更新文档 - 后面我们会增加难度。)

这次结果并不如开心了:

always_true returns True ... FAIL
always_true returns a truthy value ... ok

======================================================================
FAIL: always_true returns True
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/assertttt/test.py", line 22, in test_is_true
    self.assertIs(result, True)
AssertionError: 'True' is not True

----------------------------------------------------------------------
Ran 2 tests in 0.004s

FAILED (failures=1)

只有一个测试用例失败了!这意味着 assertTrue 给了我们一个 误判 false-positive 。在它不应该通过测试时,它通过了。很幸运的是我们第二个测试是使用 assertIs 来写的。

因此,跟手册上了解到的信息一样,为了保证 always_true 的功能和更严格测试的结果保持一致,应该使用 assertIs 而不是 assertTrue

使用断言的辅助方法

使用 assertIs 来测试返回 TrueFalse 来冗长了。因此,如果你有个项目需要经常检查是否是返回了 True 或者 False,那们你可以自己编写一些断言的辅助方法。

这好像并没有节省大量的代码,但是我个人觉得提高了代码的可读性。

def assertIsTrue(self, value):
    self.assertIs(value, True)

def assertIsFalse(self, value):
    self.assertIs(value, False)

总结

一般来说,我的建议是让测试越严格越好。如果你想测试 True 或者 False,听从文档的建议,使用 assertIs。除非不得已,否则不要使用 assertTrueassertFalse

如果你面对的是一个可以返回多种类型的函数,例如,有时候返回布尔值,有时候返回整形,那么考虑重构它。这是代码的异味。在 Python 中,抛出一个异常比使用 False 表示错误更好。

此外,如果你确实想使用断言来判断函数的返回值是否是真,可能还存在第二个代码异味 - 代码是正确封装了吗?如果 assertTrueassertFalse 是根据正确的 if 语句来执行,那么值得检查下你是否把所有你想要的东西都封装在合适的位置。也许这些 if 语句应该封装在测试的函数中。

测试开心!


via: http://jamescooke.info/python-unittest-asserttrue-is-truthy-assertfalse-is-falsy.html

作者:James Cooke 译者:chunyang-wen 校对:wxy

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

据 Net Market Share 的数据,全球的 Linux 桌面用户的份额已经连续四个月超过了 2% 。

我们之前报道过,今年六月份时 Linux 桌面的市场份额首次突破了 2%,并于次月达到了历史最高点 2.33%。

那些将 Linux 作为主要桌面的用户们为这个份额做出了贡献。显然,从 这个图表的趋势来看,使用 Linux 作为桌面的用户越来越多了。

不过,不同的分析公司由于采样范围和分析方法的不同,其报告的数据、图表会有些不同,但是从总体的趋势来看,都是呈现向上增长的。

Net Market Share 的报告是基于全球 4 万个网站的访客得出的,4 万个网站也是一个比较大的数量了,当然,与整个互联网相比还是较小。

事实上,我们并不能真正摸清 Linux 具体的市场份额,因为有太多的发行版、内核版本和浏览器了,而且有些专门在隐私保护方面做了不少的工作,因此这部分我们的采集不到的。

我们的数字音频处理技术第三部分涵盖了信号调制内容,将解释如何进行 调幅 Amplitude Modulation 颤音效果 Tremolo Effect 频率变化 Frequency Variation

调制

调幅

正如它的名字暗示的那样, 影响正弦信号的振幅变化依据传递的信息而不断改变。正弦波因为承载着大量的信息被称作 载波 carrier 。这种调制技术被用于许多的商业广播和市民信息传输波段(AM)。

为何要使用调幅技术?

调制发射

假设信道是免费资源,有天线就可以发射和接收信号。这要求有效的电磁信号发射天线,它的大小和要被发射的信号的波长应该是同一数量级。很多信号,包括音频成分,通常在 100 赫兹或更低。对于这些信号,如果直接发射,我们就需要建立长达 300 公里的天线。如果通过信号调制将信息加载到 100MHz 的高频载波中,那么天线仅仅需要 1 米(横向长度)。

集中调制与多通道

假设多个信号占用一个通道,调制可以将不同的信号不同频域位置,以便接收者选择该特定信号。使用集中调制(“复用”)的应用有遥感探测数据、立体声调频收音机和长途电话等。

克服设备限制的调制

信号处理设备,比如过滤器、放大器,以及可以用它们简单组成的设备,它们的性能依赖于信号在频域中的境况以及高频率和低频信号的关系。调制可以用于传递信号到频域中的更容易满足设计需求的位置。调制也可以将“宽带信号“(高频和低频的比例很大的信号)转换成”窄带“信号。

音频特效

许多音频特效由于引人注目和处理信号的便捷性使用了调幅技术。我们可以说出很多,比如颤音、合唱、镶边等等。这种实用性就是我们关注它的原因。

颤音效果

颤音效果是调幅最简单的应用,为实现这样的效果,我们会用周期信号改变(乘)音频信号,使用正弦或其他。

>> tremolo='tremolo.ogg';
>> fs=44100;
>> t=0:1/fs:10;
>> wo=2*pi*440*t;
>> wa=2*pi*1.2*t;
>> audiowrite(tremolo, cos(wa).*cos(wo),fs);

Tremolo

这将创造一个正弦形状的信号,它的效果就像‘颤音’。

Tremolo Shape

在真实音频文件中的颤音

现在我们将展示真实世界中的颤音效果。首先,我们使用之前记录过男性发声 ‘A’ 的音频文件。这个信号图就像下面这样:

>> [y,fs]=audioread('A.ogg');
>> plot(y);

Vocal

现在我们将创建一个完整的正弦信号,使用如下的参数:

  • 增幅 = 1
  • 频率= 1.5Hz
  • 相位 = 0
>> t=0:1/fs:4.99999999;
>> t=t(:);
>> w=2*pi*1.5*t;
>> q=cos(w);
>> plot(q);

注意: 当我们创建一组时间值时,默认情况下,它是以列的格式呈现,如, 1x220500 的值。为了乘以这样的值,必须将其变成行的形式(220500x1)。这就是 t=t(:) 命令的作用。

Sinusodial

我们将创建第二份 ogg 音频格式的文件,它包含了如下的调制信号:

>> tremolo='tremolo.ogg';
>> audiowrite(tremolo, q.*y,fs);

Tremolo Signal

频率变化

我们可以改变频率实现一些有趣的音效,比如原音变形,电影音效,多人比赛。

正弦频率调制的影响

这是正弦调制频率变化的演示代码,根据方程:

Y=Ac*Cos(wo*Cos(wo/k))

这里:

  • Ac = 增幅
  • wo = 基频
  • k = 标量除数
>> fm='fm.ogg';
>> fs=44100;
>> t=0:1/fs:10;
>> w=2*pi*442*t;
>> audiowrite(fm, cos(cos(w/1500).*w), fs);
>> [y,fs]=audioread('fm.ogg');
>> figure (); plot (y);

信号图:

你可以使用几乎任何类型的周期函数频率调制。本例中,我们仅仅用了一个正弦函数。请大胆的改变函数频率,用复合函数,甚至改变函数的类型。


via: https://www.howtoforge.com/tutorial/ubuntu-octave-audio-processing-part-3/

作者:David Duarte 译者:theArcticOcean 校对:wxy

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

换操作系统对每个人来说都是一件大事——尤其是许多用户根本不清楚操作系统是什么。

然而,从 Windows 切换到 Linux 特别地困难。这两个操作系统有着不同的前提和优先级,以及不同的处理方式。结果导致 Linux 新手容易混淆,因为他们在 Windows 上面得到经验不再适用。

例如,这里有 7 个 Windows “难民”开始使用 Linux 的时候会犯的错误(没有先后顺序):

7. 选择错误的 Linux 发行版

Linux 有几百个不同的版本,或者按他们的称呼叫做 发行版 distribution 。其中许多是专门针对不同的版本或用户的。选择了错误的版本,你与 Linux 的第一次亲密体验将很快变成一个噩梦。

如果你是在朋友的帮助下切换的话,确认他们的建议是适合你,而不是他们。有大量的文章可以帮助到你,你只需要关注前 20 名左右的或者列在 Distrowatch 的即可,就不太可能会搞错。

更好的做法是,在你安装某个发行版之前先试试它的 Live DVD。Live DVD 是在外设上运行发行版的,这样可以允许你在不对硬盘做任何改动的情况下对其进行测试。事实上,除非你知道怎么让硬盘在 Linux 下可访问,否则你是不会看到你的硬盘的。

6. 期待什么都是一样的

由于经验有限,许多 Windows 用户不知道新的操作系统意味着新的程序和新的处理方式。事实上你的 Windows 程序是无法在 Linux 上运行的,除非你用 WINE 或者 Windows 虚拟机。而且你还不能用 MS Office 或者 PhotoShop —— 你必须要学会使用 LibreOffice 和 Krita。经过这些年,这些应用可能会有和 Windows 上的应用类似的功能,但它们的功能可能具有不同的名称,并且会从不同的菜单或工具栏获得。

就连很多想当然的都不一样了。Windows 用户会特别容易因为他们有多个桌面环境可以选择而大吃一惊——至少有一个主要的和很多次要的桌面环境。

5. 安装软件的时候不知所措

在 Windows 上,新软件是作为一个完全独立的程序来安装的。通常它囊括了其它所需的依赖库。

有两种叫做 FlatpakSnap 的软件包服务目前正在 Linux 上引进类似的安装系统,但是它们对于移动设备和嵌入式设备来说太大了。更多情况下,Linux 依赖于包管理系统,它会根据已安装的包来判断软件的依赖包是否是必需的,从而提供其它所需的依赖包。

笔记本和工作站上的包管理本质上相当于手机或平板电脑上的 Google Play:它速度很快,并且不需要用于安装的物理介质。不仅如此,它还可以节省 20%-35% 的硬盘空间,因为依赖包不会重复安装。

4. 假想软件会自动更新好

Linux 用户认为控制权很重要。Linux 提供更新服务,不过默认需要用户手动运行。例如,大多数发行版会让你知道有可用的软件更新,但是你需要选择安装这些更新。

如果你选择更新的话,你甚至可以单独决定每一个更新。例如,你可能不想更新到新的内核,因为你安装了一些东西需要使用当前的内核。又或者你想要安装所有的安全性更新,但不想把发行版更新到一个新的版本。一切都由你来选择。

3. 忘记密码

许多 Windows 用户因为登录不方便而忘记密码。又或者为了方便起见,经常运行一个管理账户。

在 Linux 上这两种做法都不容易。许多发行版使用 sudo 来避免以 root 登录,特别是那些基于 Ubuntu 的发行版,而其它发行版大多数是安装为禁止 root 运行图形界面。但是,如果你在 Linux 上成功绕开了这些限制,请注意你的大部分 Linux 安全性优势都会无效(其实在 Windows 上也不推荐这样做)。

对了,你是不是在安装程序上看到一个自动登录的选项?那是在不常用的情景下使用的,例如不包含隐私信息的虚拟机。

2. 担心没有碎片整理和杀毒软件

Linux 偶尔需要进行碎片整理,不过只有在恢复分区或者分区差不多满了的时候。并且由于固态硬盘越来越火,碎片整理正在变成过去时,尽管固态硬盘确实需要在任何操作系统上定期运行 trim

同样地,只有当你安装的 Linux 经常传输文件给 Windows 机器的时候,杀毒软件才是一个主要问题。很少有 Linux 病毒或恶意软件存在,并且日常使用非 root 用户、使用强密码、经常备份当前文件就已经足够阻止病毒了。

1. 认为自己没有软件可用

Windows 上的软件是收费的,大多数类别由一家公司独占——例如,办公套装 MS Office 以及图形和设计的 Adobe。这些条件鼓励用户坚持使用相同的应用程序,尽管它们错漏百出。

在 Linux 上,故事情节不一样了。只有少数高端程序是收费的,而且几乎每一类软件都有两三个替代品,所有这些可用的软件都可以在 10 分钟或者更短的时间内下载好。如果一个替代品不合你口味,你可以删掉它然后毫不费力就可以再装一个其它的。在 Linux 上,你几乎总会有选择。

过渡期

可能没有那么多建议可以让 Windows 用户充分准备好切换到 Linux。即使说新用户应该保持开放的心态也是没什么用的,因为他们的期望总是太高,以至于许多用户都没有意识到自己有如此高的期望。

Linux 新手可以做的最好的事情就是调整心态,并且花一点时间来适应它们。过渡期会需要一些功夫,不过,从长远来看,你的多次尝试终会得到回报。


via: http://www.datamation.com/open-source/7-mistakes-new-linux-users-make.html

作者:Bruce Byfield 译者:OneNewLife 校对:wxy

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

毫无疑问,Vim 是一个开箱即用并能够胜任编程任务的编辑器,但实际上是该编辑器中的插件帮你实现这些方便的功能。在 开发者的实用 Vim 插件(一),我们已经讨论两个编程相关的 Vim 插件——标签侧边栏(Tagbar)和定界符自动补齐(delimitMate)。作为相同系列,我们在本文讨论另一个非常有用、专门为软件开发正定制的插件——语法高亮插件。

请注意:本教程中列举的所有例示、命令和说明都是在 Ubuntu 16.04 环境下进行测试的,并且,我们使用的 Vim 版本是 7.4。

语法高亮(Syntastic)插件

假如你的软件开发工作涉及到 C/C++ 语言,毫无疑问的说,遇到编译错误也是你每天工作中的一部分。很多时候,编译错误是由源代码之中的语法不正确造成的,因为开发者在浏览源码的时候很少能够一眼就看出所有这些错误。

那么 Vim 中是否存在一种插件可以让你不经编译源码就可以显示出语法错误呢?当然是有这样一种插件的,其名字就是 Syntastic。

“Syntastic 是 Vim 用来检验语法的插件,通过外部语法校验器校验文件并将错误呈现给用户。该过程可以在需要时进行,或者在文件保存的时候自动进行。”该插件 官方文档 如是说。“如果检测到语法错误就会提示用户,因为不用编译代码或者执行脚本就可以知道语法错误,用户也就乐享与此了。”

安装过程和第一部分提到的方法类似,你只需要运行下列命令即可:

cd ~/.vim/bundle/

git clone https://github.com/scrooloose/syntastic.git

一旦你成功安装这个插件(即上述命令执行成功),你就不需要进行任何配置了——当 Vim 启动时会自动加载这个插件。

现在,打开一个源码文件并用 :w Vim 命令保存即可使用这个插件了。等待片刻之后,如果在源码中有语法错误的好,就会高亮显示出来。比如,看看一下截图你就会明白该插件是如何高亮显示语法错误的:

Vim Syntax error highlighting

在每行之前的 >> 表示该行中有语法错误。了解确切的错误或者想知道是什么东西错了,将光标移到该行——错误描述就会展示在 Vim 窗口的最底下。

View Syntax errors in Vim

这样,不用进行编译你就能够修复大多数语法相关的错误。

再往下,如果你运行 :Errors 命令,就会展现当前源文件中所有语法相关错误的描述。比如,我运行 :Errors 命令就是下图的效果:

Syntastic :Errors command

请记住,:Errors 展现的语法错误是不会自动更新的,这意味着在你修复错误之后,你需要重新运行 :Errors 命令,编辑器底部的错误描述才会消除。

值得一提的是,还有 许多配置选项 能够使得 Syntastic 插件使用起来更加友好。比如,你可以在你的 .vimrc 中添加下列内容,然后 :Errors 就可以在修复错误之后自动更新它的底部描述。

let g:syntastic_always_populate_loc_list = 1

添加以下内容,以确保在你打开文件时 Syntastic 插件自动高亮显示错误。

let g:syntastic_check_on_open = 1

类似的,你也可以在保存或打开文件时让光标跳转到检测到的第一个问题处,将下列行放到你的 .vimrc 文件之中:

let g:syntastic_auto_jump = 1

这个值也可以指定为其它两个值: 2 和 3,其官方文档的解释如下:

“如果设置为 2 的话,光标就会跳到检测到的第一个问题,当然,只有这个问题是一个错误的时候才跳转;设置为 3 的话,如果存在错误,则会跳到第一个错误。所有检测到的问题都会有警告,但光标不会跳转。”

以下信息可能对你有帮助:

“使用 :SyntasticCheck 来手动检测错误。使用 :Errors 打开错误位置列表并使用 :lclose 来关闭。使用 :SyntasticReset 可以清除掉错误列表,使用 :SyntasticToggleMode 来切换激活(在写到 buffer 时检测)和被动(即手动检测)检测错误。”

注意:Syntastic 并不局限于 C/C++ 所写的代码,它同时也支持很多的编程语言——点击 此处 了解更多相关信息。

结论

毫无疑问的,Syntastic 是一个非常有用的 Vim 插件,因为在出现语法相关错误时候,它至少能够让免去频繁编译的麻烦,而且不用说,同时也节约了你不少的时间。

正如你所看到的一样,配置好几个主要选项之后,Syntastic 变得非常好用了。为了帮助你了解这些设置,官方文档中包含了一份“推荐设置”——跟着文档进行设置即可。加入你遇到一些错误、有些疑问或者问题,你也可以查询一下 FAQ。


via: https://www.howtoforge.com/tutorial/vim-editor-plugins-for-software-developers-2-syntastic/

作者:Ansh 译者:GHLandy 校对:wxy

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