2018年6月

这些简单的幻灯片创建工具可以无缝地使用 Markdown,可以让你的演示添加魅力。

假设你需要做一个 演示 presentation 。在准备的过程中,你想到“我需要写几张幻灯片”。

你可能倾向于简洁的纯文本,认为 LibreOffice Writer 这样的软件对你要做的事情而言像是杀鸡用牛刀。或者你只是遵从你内心深处的极客意识。

将 Markdown 格式的文件转换为优雅的演示幻灯片并不困难。下面介绍可以完成这项工作的四种工具。

Landslide

在这些工具中,Landslide 具有更高的灵活性。它是一个命令行工具,可以将 Markdown、reStructuredText 或 Textile) 格式的文件转换为基于 Google HTML5 幻灯片模板的 HTML 文件。

你要做的不过是编写 Markdown 格式的幻灯片源文件,打开一个终端窗口并运行 landslide 命令即可,其中命令参数为 Markdown 文件的文件名。Landslide 会生成 presentation.html,可以在任何 Web 浏览器中打开。简单吧?

但不要被简易的操作误导你。Landslide 提供了不少有用的特性,例如增加注记以及为幻灯片增加配置文件。为何要使用这些特性呢?按照 Landslide 开发者的说法,这样可以汇聚不同演示中的源文件目录并重用。

 title=

在 Landslide 演示中查看演示者注记

Marp

Marp 仍处于开发中,但值得期待。它是 “Markdown Presentation Writer” 的简写。Marp 是一个基于 Electron) 的工具,让你在一个简单的双栏编辑器中编写幻灯片:在左栏编写 Markdown,在右栏中预览效果。

Marp 支持 GitHub 风格 Markdown。如果你需要一个使用 GitHub 风格 Markdown 编写幻灯片的快速教程,可以参考 示例项目。GitHub 风格 Markdown 比基础 Markdown 更加灵活。

Marp 只自带两个基础主题,但你可以为幻灯片增加背景图片、调整图片大小以及增加数学表达式。不足之处,目前只支持 PDF 格式导出。老实说,我很好奇为何不一开始就提供 HTML 格式导出。

 title=

使用 Marp 编辑简单的幻灯片

Pandoc

你可能已经知道 pandoc 是一种支持多种 标记语言 markup languages 相互转换的神奇工具。但你可能不知道,pandoc 可以将 Markdown 格式文件转换为 Slidy)、Slideous、DZSlides 和 Reveal.js 等演示框架支持的优雅 HTML 幻灯片。如果你使用 LaTeX,可以使用 Beamer 软件包)输出 PDF 格式的幻灯片。

你需要在幻灯片中使用特定格式,但可以通过变量控制其效果。你也可以更改幻灯片的外观与风格,增加幻灯片之间的暂停,添加演示者注记等。

当然,你需要在你的主机上安装你喜欢的演示框架,因为 Pandoc 只生成原始幻灯片文件。

 title=

查看使用 Pandoc 和 DZSlides 创建的幻灯片

Hacker Slides

Hacker Slides 是一个 Sandstorm 和 Sandstorm Oasis 平台上的应用,基于 Markdown 和 Reveal.js 幻灯片框架。生成的幻灯片可以比较朴素,也可以很炫。

在浏览器的两栏界面中编写幻灯片,左栏输入 Markdown 文本,右栏渲染效果。当你制作完成后,可以在 Sandstorm 中演示,也可以生成分享链接让其它人演示。

你可能会说,你不使用 Sandstorm 或 Sandstorm Oasis 怎么办?不要担心,Hacker Slides 提供了可以在桌面或服务器上运行的版本。

 title=

在 Hacker Slides 中编辑幻灯片

两点特别补充

如果你使用 Jupyter 笔记本 Notebooks (参考社区版主 Don Watkins 的文章)发布数据或指令文本,你可以使用 Jupyter2slides。该工具基于 Reveal.js,可以将笔记本转换为一系列精美的 HTML 幻灯片。

如果你倾向于托管应用,试试 GitPitch,支持 GitHub、GitLab 和 Bitbucket。只需在将幻灯片源文件推送到支持的代码仓库中,在 GitPitch 中指向该仓库,这样你就可以在 GitPitch 网站上看到你的幻灯片了。

你有最喜欢的基于 Markdown 的幻灯片生成器吗?留下评论分享吧。


via: https://opensource.com/article/18/5/markdown-slide-generators

作者:Scott Nesbitt 选题:lujun9972 译者:pinewall 校对:wxy

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

对于一些人来说,终端可能会很吓人。但终端不仅仅是一个输入的黑屏。它通常运行一个 shell(外壳),如此称呼的原因是它围绕着内核。shell 是一个基于文本的界面,可让你在系统上运行命令。它有时也被称为 命令行解释器 command line interpreter (CLI)。与大多数 Linux 发行版一样,Fedora 带有 bash 作为默认 shell。但是,它不是唯一可用的 shell,你可以安装其他的 shell。本文重点介绍 Z Shell (即 zsh)。

Bash 是对 UNIX 中提供的旧式 Bourne shell(sh)的重写(LCTT 译注:Bourne Again SHell)。zsh 视图通过更好的交互以比 bash 更友善。它的一些有用功能是:

  • 可编程的命令行补全 * 在运行的 shell 会话之间共享命令历史 * 拼写纠正 * 可加载模块 * 交互式选择文件和文件夹

zsh 在 Fedora 仓库中存在。要安装,请运行以下命令:

$ sudo dnf install zsh

使用 zsh

要开始使用它,只需输入 zsh,新的 shell 在第一次运行时显示向导。该向导可帮助你配置初始功能,如历史记录行为和自动补全。或者你可以选择保持 rc 文件 为空:

zsh First Run Wizzard

如果输入 1,则启动配置向导。其他选项立即启动 shell。

请注意,用户提示符是 % 而不是与 bash 的 $。这里的一个重要功能是自动补全功能,它允许你使用 Tab 键在文件和目录之间移动,非常类似于菜单:

zsh cd Feature

另一个有趣的功能是拼写纠正,这有助于在混合大小写的情况下输入文件名:

zsh Auto Completion

使用 zsh 成为你的默认 shell

zsh 提供了很多插件,如 zsh-syntax-highlighting 和著名的 “Oh my zsh”(在此查看其页面)。也许你希望将其设为默认 shell,以便在你在开始会话或打开终端时运行。为此,请使用 chsh(“更改 shell”)命令:

$ chsh -s $(which zsh)

这个命令告诉你的系统你要设置(-s)默认 shell 为该 shell 的正确位置(which zsh)。

图片来自 Flickr 由 Kate Ter Haar 提供(CC BY-SA)。


via: https://fedoramagazine.org/set-zsh-fedora-system/

作者:Eduard Lucena 选题:lujun9972 译者:geekpi 校对:wxy

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

上一周我们讲解了 栈是如何工作的 以及在函数的 序言 prologue 上栈帧是如何被构建的。今天,我们来看一下它的相反的过程,在函数 结语 epilogue 中栈帧是如何被销毁的。重新回到我们的 add.c 上:

int add(int a, int b)
{
        int result = a + b;
        return result;
}

int main(int argc)
{
        int answer;
        answer = add(40, 2);
}

简单的一个做加法的程序 - add.c

在运行到第 4 行时,在把 a + b 值赋给 result 后,这时发生了什么:

第一个指令是有些多余而且有点傻的,因为我们知道 eax 已经等于 result 了,但这就是关闭优化时得到的结果。leave 指令接着运行,这一小段做了两个任务:重置 esp 并将它指向到当前栈帧开始的地方,另一个是恢复在 ebp 中保存的值。这两个操作在逻辑上是独立的,因此,在图中将它们分开来说,但是,如果你使用一个调试器去跟踪,你就会发现它们都是自动发生的。

在 leave 运行后,恢复了前一个栈帧。add 调用唯一留下的东西就是在栈顶部的返回地址。它包含了运行完 add 之后在 main 中必须运行的指令的地址。ret 指令用来处理它:它弹出返回地址到 eip 寄存器(LCTT 译注:32 位的指令寄存器),这个寄存器指向下一个要执行的指令。现在程序将返回到 main ,主要部分如下:

main 从 add 中拷贝返回值到本地变量 answer,然后,运行它自己的 结语 epilogue ,这一点和其它的函数是一样的。在 main 中唯一的怪异之处是,保存在 ebp 中的是 null 值,因为它是我们的代码中的第一个栈帧。最后一步执行的是,返回到 C 运行时库(libc),它将退回到操作系统中。这里为需要的人提供了一个 完整的返回顺序 的图。

现在,你已经理解了栈是如何运作的,所以我们现在可以来看一下,一直以来最臭名昭著的黑客行为:利用缓冲区溢出。这是一个有漏洞的程序:

void doRead()
{
        char buffer[28];
        gets(buffer);
}

int main(int argc)
{
        doRead();
}

有漏洞的程序 - buffer.c

上面的代码中使用了 gets 从标准输入中去读取内容。gets 持续读取直到一个新行或者文件结束。下图是读取一个字符串之后栈的示意图:

在这里存在的问题是,gets 并不知道缓冲区(buffer)大小:它毫无查觉地持续读取输入内容,并将读取的内容填入到缓冲区那边的栈,清除保存在 ebp 中的值、返回地址,下面的其它内容也是如此。对于利用这种行为,攻击者制作一个精密的载荷并将它“喂”给程序。在这个时候,栈应该是下图所示的样子,然后去调用 gets:

基本的思路是提供一个恶意的汇编代码去运行,通过覆写栈上的返回地址指向到那个代码。这有点像病毒侵入一个细胞,颠覆它,然后引入一些 RNA 去达到它的目的。

和病毒一样,挖掘者的载荷有许多特别的功能。它以几个 nop 指令开始,以提升成功利用的可能性。这是因为返回的地址是一个绝对的地址,需要猜测,而攻击者并不知道保存它的代码的栈的准确位置。但是,只要它们进入一个 nop,这个漏洞利用就成功了:处理器将运行 nop 指令,直到命中它希望去运行的指令。

exec /bin/sh 表示运行一个 shell 的原始汇编指令(假设漏洞是在一个网络程序中,因此,这个漏洞可能提供一个访问系统的 shell)。将一个命令或用户输入以原始汇编指令的方式嵌入到一个程序中的思路是很可怕的,但是,那只是让安全研究如此有趣且“脑洞大开”的一部分而已。对于防范这个怪异的 get,给你提供一个思路,有时候,在有漏洞的程序上,让它的输入转换为小写或者大写,将迫使攻击者写的汇编指令的完整字节不属于小写或者大写的 ascii 字母的范围内。

最后,攻击者重复猜测几次返回地址,这将再次提升他们的胜算。以 4 字节为界进行多次重复,它们就会更好地覆写栈上的原始返回地址。

幸亏,现代操作系统有了 防止缓冲区溢出 的一系列保护措施,包括不可执行的栈和 栈内金丝雀 stack canary 。这个 “ 金丝雀 canary ” 名字来自 煤矿中的金丝雀 canary in a coal mine 中的表述(LCTT 译注:指在过去煤矿工人下井时会带一只金丝雀,因为金丝雀对煤矿中的瓦斯气体非常敏感,如果进入煤矿后,金丝雀死亡,说明瓦斯超标,矿工会立即撤出煤矿。金丝雀做为煤矿中瓦斯预警器来使用),这是对计算机科学词汇的补充,用 Steve McConnell 的话解释如下:

计算机科学拥有比其它任何领域都丰富多彩的语言,在其它的领域中你进入一个无菌室,小心地将温度控制在 68°F,然后,能找到病毒、特洛伊木马、蠕虫、臭虫(bug)、炸弹(逻辑炸弹)、崩溃、爆发(口水战)、扭曲的变性者(双绞线转换头),以及致命错误吗?

—— Steve McConnell 《代码大全 2》

不管怎么说,这里所谓的“栈金丝雀”应该看起来是这个样子的:

金丝雀是通过汇编来实现的。例如,由于 GCC 的 栈保护器 选项的原因使金丝雀能被用于任何可能有漏洞的函数上。函数序言加载一个魔法值到金丝雀的位置,并且在函数结语时确保这个值完好无损。如果这个值发生了变化,那就表示发生了一个缓冲区溢出(或者 bug),这时,程序通过 __stack_chk_fail 被终止运行。由于金丝雀处于栈的关键位置上,它使得栈缓冲区溢出的漏洞挖掘变得非常困难。

深入栈的探秘之旅结束了。我并不想过于深入。下一周我将深入递归、尾调用以及其它相关内容。或许要用到谷歌的 V8 引擎。作为函数的序言和结语的讨论的结束,我引述了美国国家档案馆纪念雕像上的一句名言:( 凡是过去 皆为序章 what is past is prologue )。


via:https://manybutfinite.com/post/epilogues-canaries-buffer-overflows/

作者:Gustavo Duarte 译者:qhwdw 校对:wxy

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

正如你了解的,Arch Linux 是一个滚动版本和 DIY(自己动手)发行版。因此,在经常更新时必须小心,特别是从 AUR 等第三方存储库安装或更新软件包。如果你不知道自己在做什么,那么最终很可能会破坏系统。你有责任使 Arch Linux 更加稳定。但是,我们都会犯错误,要时刻小心是很难的。有时候,你想更新到最新的版本,但你可能会被破损的包卡住。不要惊慌!在这种情况下,你可以简单地回滚到旧的稳定包。这个简短的教程描述了如何在 Arch Linux 中以及它的变体,如 Antergos,Manjaro Linux 中降级一个包,

在 Arch Linux 中降级一个包

在 Arch Linux 中,有一个名为 “downgrade” 的实用程序,可帮助你将安装的软件包降级为任何可用的旧版本。此实用程序将检查你的本地缓存和远程服务器(Arch Linux 仓库)以查找所需软件包的旧版本。你可以从该列表中选择任何一个旧的稳定的软件包并进行安装。

该软件包在官方仓库中不可用,你需要添加非官方的 archlinuxfr 仓库。

为此,请编辑 /etc/pacman.conf 文件:

$ sudo nano /etc/pacman.conf

添加以下行:

[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch

保存并关闭文件。

使用以下命令来更新仓库:

$ sudo pacman -Sy

然后在终端中使用以下命令安装 “Downgrade” 实用程序:

$ sudo pacman -S downgrade

示例输出:

resolving dependencies...
 looking for conflicting packages...

Packages (1) downgrade-5.2.3-1

Total Download Size: 0.01 MiB
 Total Installed Size: 0.10 MiB

:: Proceed with installation? [Y/n]

“downgrade” 命令的典型用法是:

$ sudo downgrade [PACKAGE, ...] [-- [PACMAN OPTIONS]]

让我们假设你想要将 opera web 浏览器 降级到任何可用的旧版本。

为此,运行:

$ sudo downgrade opera

此命令将从本地缓存和远程镜像列出所有可用的 opera 包(新旧两种版本)。

示例输出:

Available packages:

 1) opera-37.0.2178.43-1-x86_64.pkg.tar.xz (local)
 2) opera-37.0.2178.43-1-x86_64.pkg.tar.xz (remote)
 3) opera-37.0.2178.32-1-x86_64.pkg.tar.xz (remote)
 4) opera-36.0.2130.65-2-x86_64.pkg.tar.xz (remote)
 5) opera-36.0.2130.65-1-x86_64.pkg.tar.xz (remote)
 6) opera-36.0.2130.46-2-x86_64.pkg.tar.xz (remote)
 7) opera-36.0.2130.46-1-x86_64.pkg.tar.xz (remote)
 8) opera-36.0.2130.32-2-x86_64.pkg.tar.xz (remote)
 9) opera-36.0.2130.32-1-x86_64.pkg.tar.xz (remote)
 10) opera-35.0.2066.92-1-x86_64.pkg.tar.xz (remote)
 11) opera-35.0.2066.82-1-x86_64.pkg.tar.xz (remote)
 12) opera-35.0.2066.68-1-x86_64.pkg.tar.xz (remote)
 13) opera-35.0.2066.37-2-x86_64.pkg.tar.xz (remote)
 14) opera-34.0.2036.50-1-x86_64.pkg.tar.xz (remote)
 15) opera-34.0.2036.47-1-x86_64.pkg.tar.xz (remote)
 16) opera-34.0.2036.25-1-x86_64.pkg.tar.xz (remote)
 17) opera-33.0.1990.115-2-x86_64.pkg.tar.xz (remote)
 18) opera-33.0.1990.115-1-x86_64.pkg.tar.xz (remote)
 19) opera-33.0.1990.58-1-x86_64.pkg.tar.xz (remote)
 20) opera-32.0.1948.69-1-x86_64.pkg.tar.xz (remote)
 21) opera-32.0.1948.25-1-x86_64.pkg.tar.xz (remote)
 22) opera-31.0.1889.174-1-x86_64.pkg.tar.xz (remote)
 23) opera-31.0.1889.99-1-x86_64.pkg.tar.xz (remote)
 24) opera-30.0.1835.125-1-x86_64.pkg.tar.xz (remote)
 25) opera-30.0.1835.88-1-x86_64.pkg.tar.xz (remote)
 26) opera-30.0.1835.59-1-x86_64.pkg.tar.xz (remote)
 27) opera-30.0.1835.52-1-x86_64.pkg.tar.xz (remote)
 28) opera-29.0.1795.60-1-x86_64.pkg.tar.xz (remote)
 29) opera-29.0.1795.47-1-x86_64.pkg.tar.xz (remote)
 30) opera-28.0.1750.51-1-x86_64.pkg.tar.xz (remote)
 31) opera-28.0.1750.48-1-x86_64.pkg.tar.xz (remote)
 32) opera-28.0.1750.40-1-x86_64.pkg.tar.xz (remote)
 33) opera-27.0.1689.76-1-x86_64.pkg.tar.xz (remote)
 34) opera-27.0.1689.69-1-x86_64.pkg.tar.xz (remote)
 35) opera-27.0.1689.66-1-x86_64.pkg.tar.xz (remote)
 36) opera-27.0.1689.54-2-x86_64.pkg.tar.xz (remote)
 37) opera-27.0.1689.54-1-x86_64.pkg.tar.xz (remote)
 38) opera-26.0.1656.60-1-x86_64.pkg.tar.xz (remote)
 39) opera-26.0.1656.32-1-x86_64.pkg.tar.xz (remote)
 40) opera-12.16.1860-2-x86_64.pkg.tar.xz (remote)
 41) opera-12.16.1860-1-x86_64.pkg.tar.xz (remote)

select a package by number:

只需输入你选择的包号码,然后按回车即可安装。

就这样。当前安装的软件包将被降级为旧版本。

另外阅读:在 Arch Linux 中如何将所有软件包降级到特定日期

那么,如何避免已损坏的软件包并使 Arch Linux 更加稳定?

在更新 Arch Linux 之前查看 Arch Linux 新闻和论坛,看看是否有任何已报告的问题。过去几周我一直在使用 Arch Linux 作为我的主要操作系统,以下是我在这段时间内发现的一些简单提示,以避免在 Arch Linux 中安装不稳定的软件包。

  1. 避免部分升级。这意味着永远不要运行 pacman -Sy <软件包名称>。此命令将在安装软件包时部分升级你的系统。相反,优先使用 pacman -Syu 来更新系统,然后使用 package -S <软件包名称> 安装软件包。
  2. 避免使用 pacman -Syu -force 命令。-force 标志将忽略程序包和文件冲突,并且可能会以破损的程序包或损坏的系统结束。
  3. 不要跳过依赖性检查。这意味着不要使用 pacman -Rdd <软件包名称>。此命令将在删除软件包时避免依赖性检查。如果你运行这个命令,另一个重要的包所需的关键依赖也可以被删除。最终,它会损坏你的 Arch Linux。
  4. 定期备份重要数据和配置文件以避免数据丢失总是一个好习惯。
  5. 安装第三方软件包和 AUR 等非官方软件包时要小心。不要安装那些正在经历重大发展的软件包。

有关更多详细信息,请查看 Arch Linux 维护指南。

我不是 Arch Linux 专家,我仍然在学习如何使它更稳定。如果你有任何技巧让 Arch Linux 保持稳定和安全,请在下面的评论部分保持稳定和安全告诉我,我将洗耳恭听。

希望这可以有帮助。目前为止这就是全部了。我很快会再次在这里与另一篇有趣的文章。在此之前,请继续关注。

干杯!


via: https://www.ostechnix.com/downgrade-package-arch-linux/

作者:SK 选题:lujun9972 译者:MjSeven 校对:wxy

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

Anaconda 是一个完备的、开源的数据科学软件包,拥有超过 600 万社区用户。

像很多人一样,我一直努力加入到快速发展的数据科学领域。我上过 Udemy 的 R 及 Python 语言编程课,那时我分别下载并安装了应用程序。当我试图解决各种依赖关系,安装类似 Numpy 和 Matplotlib 这样的数据科学扩展包时,我了解了 Anaconda Python 发行版。

Anaconda 是一个完备的、开源的数据科学包,拥有超过 600 万社区用户。下载和安装 Anaconda 都很容易,支持的操作系统包括 Linux, MacOS 及 Windows。

我感谢 Anaconda 降低了初学者的学习门槛。发行版自带 1000 多个数据科学包以及 Conda 包和虚拟环境管理器,让你无需单独学习每个库的安装方法。就像 Anaconda 官网上提到的,“Anaconda 库中的 Python 和 R 语言的 conda 包是我们在安全环境中修订并编译得到的优化二进制程序,可以在你系统上工作”。

我推荐使用 Anaconda Navigator,它是一个桌面 GUI 系统,包含了发行版自带的全部应用的链接,包括 RStudio、 iPython、 Jupyter Notebook、 JupyterLab、 Spyder、 Glue 和 Orange。默认环境采用 Python 3.6,但你可以轻松安装 Python 3.5、 Python 2.7 或 R。文档十分详尽,而且用户社区极好,可以提供额外的支持。

安装 Anaconda

为在我的 Linux 笔记本(I3 CPU,4GB 内存)上安装 Anaconda,我下载了 Anaconda 5.1 Linux 版安装器并运行 md5sum 进行文件校验:

$ md5sum Anaconda3-5.1.0-Linux-x86_64.sh

接着按照安装文档的说明,无论是否在 Bash shell 环境下,执行如下 shell 命令:

$ bash Anaconda3-5.1.0-Linux-x86_64.sh

我完全按照安装指南操作,运行这个精心编写的脚本,大约花费 5 分钟可以完成安装。安装过程中会提示:“是否希望安装器将 Anaconda 的安装路径加入到你的 /home/<user>/.bashrc?”我选择允许并重启了 shell,这会让 .bashrc 中的环境变量生效。

安装完成后,我启动了 Anaconda Navigator,具体操作是在 shell 中执行如下命令:

$ anaconda-navigator

Anaconda Navigator 每次启动时会检查是否有可更新的软件包,如果有,会提醒你进行更新。

按照提醒进行更新即可,无需使用命令行。Anaconda 初次启动会有些慢,如果涉及更新会额外花费几分钟。

当然,你也可以通过执行如下命令手动更新:

$ conda update anaconda-navigator

浏览和安装应用

Navigator 启动后,可以很容易地浏览 Anaconda 发行版包含的应用。按照文档所述,64 位 Python 3.6 版本的 Anaconda 支持 499 个软件包。我浏览的第一个应用是 Jupyter QtConsole,这个简单易用的 GUI 支持内联数据 (inline figures) 和语法高亮。

发行版中包含 Jupyter Notebook,故无需另外安装(不像我用的其它 Python 环境那样)。

我习惯使用的 RStudio 并没有默认安装,但安装它也仅需点击一下鼠标。其它应用的启动或安装也仅需点击一下鼠标,包括 JupyterLab、 Orange、 Glue 和 Spyder 等。

Anaconda 发行版的一个强大功能是创建多套环境。假如我需要创建一套与默认 Python 3.6 不同的 Python 2.7 的环境,可以在 shell 中执行如下命令:

$ conda create -n py27 python=2.7 anaconda

Conda 负责整个安装流程,如需启动它,仅需在 shell 中执行如下命令:

$ anaconda-navigator

在 Anaconda GUI 的 “Applications on” 下拉菜单中选取 py27 即可。

更多内容

如果你想了解更多关于 Anaconda 的信息,可供参考的资源十分丰富。不妨从检索 Anaconda 社区及对应的邮件列表开始。

你是否在使用 Anaconda 发行版及 Navigator 呢?欢迎在评论中留下你的使用感想。


via: https://opensource.com/article/18/4/getting-started-anaconda-python

作者:Don Watkins 选题:lujun9972 译者:pinewall 校对:wxy

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

全球开源社区通常面临着语音壁垒、文化差异以及其它的挑战。如何去解决它们呢?

配图

今天的开源组织参与人员来自于全世界。你能预见到组建在线社区可能遇到哪些困难吗?有没有什么办法能够克服这些困难呢?

为开源社区贡献力量的人共同合作推动软件的开发和发展。在过去,人们是面对面或者通过邮件和电话来交流的。今天,科技孕育出了在线交流——人们只需要进入一个聊天室或消息渠道就能一起工作了。比如,你可以早上跟摩洛哥的人一起工作,到了晚上又跟夏威夷的人一起工作。

全球社区的三个挑战

任何一个团队合作过的人都知道意见分歧是很难被克服的。对于在线社区来说,语言障碍、不同的时区,以及文化差异也带来了新的挑战。

语言障碍

英语是开源社区中的主流语言,因此英语不好的人会很难看懂文档和修改意见。为了克服这个问题,吸引其他地区的社区成员,你需要邀请双语者参与到社区中来。问问周围的人——你会发现意想不到的精通其他语言的人。社区的双语成员可以帮助别人跨越语言障碍,并且可以通过翻译软件和文档来扩大项目的受众范围。

人们使用的编程语言也不一样。你可能喜欢用 Bash 而其他人则可能更喜欢 Python、Ruby、C 等其他语言。这意味着,人们可能由于编程语言的原因而难以为你的代码库做贡献。项目负责人为项目选择一门被软件社区广泛认可的语言至关重要。如果你选择了一门偏门的语言,则很少人能够参与其中。

不同的时区

时区为开源社区带来了另一个挑战。比如,若你在芝加哥,想与一个在伦敦的成员安排一次视频会议,你需要调整 8 小时的时差。根据合作者的地理位置,你可能要在深夜或者清晨工作。

肉身转移,可以让你的团队在同一个时区工作可以帮助克服这个挑战,但这种方法只有极少数社区才能够负担的起。我们还可以定期举行虚拟会议讨论项目,建立一个固定的时间和地点以供所有人来讨论未决的事项,即将发布的版本等其他主题。

不同的时区也可以成为你的优势,因为团队成员可以全天候的工作。若你拥有一个类似 IRC 这样的实时交流平台,用户可以在任意时间都能找到人来回答问题。

文化差异

文化差异是开源组织面临的最大挑战。世界各地的人都有不同的思考方式、计划以及解决问题的方法。政治环境也会影响工作环境并影响决策。

作为项目负责人,你应该努力构建一种能包容不同看法的环境。文化差异可以鼓励社区沟通。建设性的讨论总是对项目有益,因为它可以帮助社区成员从不同角度看待问题。不同意见也有助于解决问题。

要成功开源,团队必须学会拥抱差异。这不简单,但多样性最终会使社区收益。

加强在线沟通的其他方法

  • 本地化: 在线社区成员可能会发现位于附近的贡献者——去见个面并组织一个本地社区。只需要两个人就能组建一个社区了。可以邀请其他当地用户或雇员参与其中;他们甚至还能为以后的聚会提供场所呢。
  • 组织活动: 组织活动是构建本地社区的好方法,而且费用也不高。你可以在当地的咖啡屋或者啤酒厂聚会,庆祝最新版本的发布或者某个核心功能的实现。组织的活动越多,人们参与的热情就越高(即使只是因为单纯的好奇心)。最终,可能会找到一家公司为你提供聚会的场地,或者为你提供赞助。
  • 保持联系: 每次活动后,联系本地社区成员。收起电子邮箱地址或者其他联系方式并邀请他们参与到你的交流平台中。邀请他们为其他社区做贡献。你很可能会发现很多当地的人才,运气好的话,甚至可能发现新的核心开发人员!
  • 分享经验: 本地社区是一种非常有价值的资源,对你,对其他社区来说都是。与可能受益的人分享你的发现和经验。如果你不清楚(LCTT 译注:这里原文是说 sure,但是根据上下文,这里应该是 not sure)如何策划一场活动或会议,可以咨询其他人的意见。也许能找到一些有经验的人帮你走到正轨。
  • 关注文化差异: 记住,文化规范因地点和人而异,因此在清晨安排某项活动可能适用于一个地方的人,但是不合适另一个地方的人。当然,你可以(也应该)利用其他社区的参考资料来更好地理解这种差异性,但有时你也需要通过试错的方式来学习。不要忘了分享你所学到的东西,让别人也从中获益。
  • 检查个人观点: 避免在工作场合提出带有很强主观色彩的观点(尤其是与政治相关的观点)。这会抑制开放式的沟通和问题的解决。相反,应该专注于鼓励与团队成员展开建设性讨论。如果你发现陷入了激烈的争论中,那么后退一步,冷静一下,然后再从更加积极的角度出发重新进行讨论。讨论必须是有建设性的,从多个角度讨论问题对社区有益。永远不要把自己的主观观念放在社区的总体利益之前。
  • 尝试异步沟通: 这些天,实时通讯平台已经引起了大家的关注,但除此之外还别忘了电子邮件。如果没有在网络平台上找到人的话,可以给他们发送一封电子邮件。有可能你很快就能得到回复。考虑使用那些专注于异步沟通的平台,比如 Twist,也不要忘了查看并更新论坛和维基。
  • 使用不同的解决方案: 并不存在一个单一的完美的解决方法,学习最有效的方法还是通过经验来学习。从反复试验中你可以学到很多东西。不要害怕失败;你会从失败中学到很多东西从而不停地进步。

社区需要营养

将社区想象成是一颗植物的幼苗。你需要每天给它浇水,提供阳光和氧气。社区也是一样:倾听贡献者的声音,记住你在与活生生的人进行互动,他们需要以合适的方式进行持续的交流。如果社区缺少了人情味,人们会停止对它的贡献。

最后,请记住,每个社区都是不同的,没有一种单一的解决方法能够适用于所有社区。坚持不断地从社区中学习并适应这个社区。


via: https://opensource.com/article/17/12/working-worldwide-communities

作者:José Antonio Rey 译者:lujun9972 校对:wxy

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