Quantcast
Channel: Linux 中国◆开源社区
Viewing all 9060 articles
Browse latest View live

如何评估一个 Linux 发行版的总体成本

$
0
0

经济学有云:“天下没有免费的午餐”,那么一个开源项目到底价值多少钱?到了自己手里能够增值还是贬值?那么抛开技术债务这一块不说,光从经济的角度考量下。这次我们要学习的是最最基础的评估一个开源项目成本的方法论。

开源之道引言:为什么要翻译十一年前的一份白皮书?

(本白皮书发表于 2008 年。)答案很简单,就是要学会算经济账,一个开源项目,尤其是大型的、经过多年开发的,企业利用该项目就要在开始的时候算好一笔经济账,它不是零成本,它像一个快速向前滚动(发展)的巨大磁石,如果你没有投入,那么很快便失去了任何的话语权,经过一段时间,则会被狠狠的甩下,体无完肤!不仅失去了创新的能力,而且成为了自己最大的负担。最后以失败而告终。

如果单单的只是将项目的某个时间的临时性成果来作为自己的产品或服务,那么就要想好要不要跟上步伐,要怎么跟?不过这些都要基于一个基础:这个阶段性的成果总成本是多少?该如何评估?于是就有了这篇文章。

介绍

Linux 操作系统是历史上最为成功的开源项目,但是一个 Linux 发行版中的软件究竟“价值”多少钱?2002 年,David A. Wheeler 发表了一份备受后人推崇的研究,其指出典型的 Linux 发行版中软件代码行数的意义所在。那么他的发现是什么?结果令人震惊:典型的 Linux 发行版中的总开发成本高达 12 亿美元。我们将基于 Wheeler 先生的发现而继续挖掘。使用相同的工具,我们重新以当前的美元来计算,构建 Fedora 9 发行版的成本需要大约 108 亿美元。另外,仅内核一项的开发需要约 14 亿美元,本论文概述了我们研究过程中使用的技术,并指出开发 Linux 的成本计算模式。

Linux 操作系统是当今计算中最流行的开源操作系统,在 2008 年,它意味着是一个价值 250 亿美元的生态系统。1 自 1991 年创建以来,它已发展成为计算机领域的一支重要力量,为纽约证券交易所、移动设备、超级计算机、消费设备提供重要的驱动力量。

作为一款开放的操作系统,Linux 是协同开发的,这意味着没有任何一家公司对其开发或持续的支持负全部责任。参与 Linux 开发的公司与其合作伙伴、竞争对手分担着研发成本。这样的开发模式进一步发展为个人和公司共同承担,进而成为一个超大型的、生机勃勃的生态系统,而且驱动着无穷的创新力量。

超过 1000 多名的开发者,他们来自不同的公司,公司数量至少在 100 家左右,仅在过去两年中,来自 200 家公司的 3200 多名开发人员就为内核做出了贡献。2 值得注意的是,内核只是 Linux 发行版的一小部分,一款完整的 Linux 发行版,不仅包括内核,还有诸如 GNOME 和 KDE 桌面环境、GNU 组件、X Window 系统等等很多组件。为这些项目做出贡献的个人开发者总数肯定会达到数千人。

正因为 Linux 是协作开发的,因此无法从某个单一的来源来估算开发该项目的成本。2002 年,David A. Wheeler 发表了一项备受好评的研究,该研究检查了典型 Linux 发行版中存在的软件代码行(基于 Red Hat Linux 7.1)。3 他总结说 —— 正如我们所做的那样 —— 软件代码行数是确定开源软件价值最实用的方法,因为它专注于最终结果而不是每个公司或每个开发人员的估算。4 使用他开发的用于计算和分析 SLOC(软件代码行数Software Lines of Code)的行业标准工具,他确定在美国通过传统的封闭方法开发 Linux 发行版将花费超过 12 亿美元。

但那已经是 6 年前的事情了,由于 Linux 的创新和增长速度每年都在增加,因此我们有必要更新这个 12 亿美元的数字,从而希望能够准确反映当今 Linux 中开发的真正价值(以及软件开发本身的成本上升)。在本文中,Linux 基金会着手确定典型 Linux 发行版中所代表的总开发成本,并更新自 2002 年发布以来广泛使用的 12 亿美元数字。

我们分析了 2008 年 5 月 13 日发布的 Fedora 9 发行版。之所以选择 Fedora,因为 Fedora 是一种流行度蛮高,口碑也还行的 Linux 发行版,它也是红帽企业版 Linux 的原型,而红帽企业版 Linux 则是拥有 Linux 市场的很大份额的发行版。更何况还是 Wheeler 在其原始论文中分析的 Red Hat Linux 7.1 软件的直接后代。

在本研究中,我们使用了 David A. Wheeler 所开发的 SLOC 工具 —— SLOCCount。SLOCCount 用到了行业标准的建设性成本模型COnstructive COst MOdel(COCOMO),该模型是一个算法软件成本估算模型,5是由 Barry Boehm 6 开发的。该模型使用基本回归 7 公式,其参数衍生自历史项目数据和当前项目特征数据。8 我们从 2002 年开始更新他的研究,包括不断增长的 Linux 内核代码库和其他软件包,以及软件开发人员的薪水。(关于此的更多细节将在下文的“方法论”部分中进行详细讨论。)

基于该方法,如果是采用传统的封闭方法来开发这样一个规模的 Linux 发行版的话,我们估计需要 108 亿美元(2008 年)。

方法论

我们的基本方法是:

  1. 以非压缩格式安装源代码文件;这需要下载源代码并在我们的测试机器上正确安装。
  2. 计算源代码行数(SLOC);这需要仔细定义 SLOC。
  3. 使用估算模型(基于 COCOMO 实践)来估算以专有方式开发相同系统的工作量和成本。

如果大家对于我们是如何安装和分析源代码感兴趣的话,请参阅附录内容。

为了延续原作者的研究,我们决定使用和 2002 年所采用同一套基础代码,即选择了 Fedora 社区发行版,这也是红帽企业版 Linux(RHEL)的基础平台。经过一番考量,我们决定采用 Fedora 9 这个版本。我们统计了所有在 http://mirror.kernel.org 镜像归档文件中公开的 Fedora 9 软件包。之所以选择这个源,是因为我们不想我们最终衡量的结果被其它因素所影响。Fedora 包含比红帽企业版 Linux 更多的软件包,其中一个原因是多元化社区参与构建 Fedora,而不仅仅是一家公司。使用 SLOCCount 应用程序是一项相对简单的任务:只需将其指向源代码所在的正确目录,然后让它运行即可。在 Wheeler 的网站上仍然提供有关程序如何工作以及如何使用它的详细说明。9

欲计算该发行版的开发成本,我们从美国劳工统计局查阅了计算机程序员的基本工资概况。根据美国劳工统计局的数据,2008 年 7 月美国程序员的平均工资为 75,662.08 美元。 10 这也是我们的 SLOCCount 运行中使用的工资金额。(当然,如今大多数软件开发都是全球性的,因此使用仅限美国的工资数字有点以偏概全。然而这时一个值得我们持续探索的主题,在未来我们要找到一个途径来确定全球平均工资,将之作为生产成本的基准。)

还应该指出的是,薪水本身并不是软件开发成本的唯一决定因素。在他的文章中,Wheeler 提及了 SLOCCount 中的开销参数,其中包括测试成本、设备、公司运营成本以及开发人员的总赔偿金。这些参数被称之为总包比例wrap rate

要知道这些总包比例的增长是非常之迅速的,在美国,专业员工的平均薪酬百分比(病假、休假、保险福利)为 29.0%。11 因此,虽然我们刚才所提及的美国劳工统计局给出的数据是程序员的平均工资为 75,662.0810 美元,但是企业主实际要付的数字为 97,604.08 美元。而且这只是总包比例的一部分。

Wheeler 当年的评估将总包比例的值设为 2.4。虽然这个数字明显因公司和地区而异,但进一步的研究显示,没有任何重要证据表明这个数字需要在我们所测试中进行调整。

源代码和估计成本结果

根据前面所示的所有假设,Fedora 9 的 SLOC 和估计产量值如下。

代码类型 代码行数
全部总的代码行数(SLOC) 204,500,946
开发效果估算:人年(人月) (基本的 COCOMO 模型,人月 = 2.4 * (KSLOC ** 1.05) 59389.53(712674.36)
进度估算,年(月)(基本的 COCOMO模型,月份 = 2.5 * (人月 ** 0.38) 24.64(295.68)
预计总开发成本,(平均工资 = 75,662.08 美元/年,间接费用 = 2.40) 10,784,484,309 美元

旁注:最初的 SLOCCount 年薪数字是 2000 年 $56,286 美元,有心人可以看到我们对此进行了相应的转换。为了实现它,我们将总费用乘以 2008 年美元(10,784,484,309 美元)的 0.744,这是 SLOCCount 通常使用的 2000 年程序员工资($56,286)与我们发现的 2008 年 7 月工资($ 75,662.08)之间的比率。结果是 2000 年开发 Fedora 9 的成本超过 80 亿美元。这使读者很好地了解了这六年中 Linux 发行版中添加了多少代码和功能。

聚焦 Linux内核,及其增强 COCOMO 模型

正如本文的研究覆盖的内容,聪明的读者一定发现了,并非所有 Linux 系统中所有的组件都需要得到同等的对待。根据 COCOMO 模型,一些项目的性质和复杂性需要不同的考虑。

这一点在 Wheeler 自己的 2002 年文章的后续行动中更为明显,他强调了对 Linux 内核就应该使用的不同估计模型。12 在这篇新文章中,Wheeler 坚持认为,由于 Linux 内核代码通常比“普通”应用程序更复杂 —— 特殊的除外 —— 它需要的分析超出了基本的 COCOMO 模型。例如,像 Mozilla 这样的用户空间应用程序更容易逐行编码,因为它在更高的层次上被抽象,并且只需要处理更少的任务。然而,现代企业级操作系统内核则需要同时执行大量极其复杂的操作,也就是说技术含量更高、难度也更大。

所以 Wheeler 解释说,发行版中的组件不能使用同一种标准的方法来进行分析,就内核来说就应该使用增强 COCOMO 模型intermediate COCOMO model来进行衡量。增强的 COCOMO 模型有更多的参数供选择,因此,应该更准确地分析一个复杂的软件本身。在 2004 年的文章中,他详述了他对这些参数的评估细节,即调整整体的净效应,将 SLOCCount 中的工作因子值从默认值 3 到 4.64607,同时,-effort 指数值也变为 1.12,在增强的 COCOMO 软件估算模型下,这是分配给半分离软件semi-detached software项目的值。

基于这些新的参数,针对 Linux 内核做了一个单独的评估(Fedora 9 的内核版本是 linux-2.6.25.i686):

代码类型 代码行数
全部总的代码行数(SLOC) 6,772,902
开发效果估算:人年(人月)(有效模型,人月 = 4.64607 * (KSLOC**1.12)) 7557.4(90688.77)
进度估算,年(月)(基本的COCOMO模型,月份 = 2.5 * (人月** 0.38)) 15.95 (191.34)
预计平均开发人员数量(有效/时间表) 473.96
预计总开发成本,(平均工资 = 75,662.08美元/年,间接费用 = 2.40) $1,372,340,206

本研究方法的局限性和优势

没有完美的方法来估计像 Linux 那样复杂和不断发展的软件项目的价值。虽然我们认为这种方法是最好的方法,但它可能过度计算价值的某些方面,而低估了其他方面。以下是我们认为该方法存在限制的部分:

  • COCOMO 模型是研究封闭式软件开发而设计的。因此,我们认为它低估了开源、协作开发的软件项目(如 Linux)中固有的测试复杂性。由于变更的频繁,且不论大小,而且开发者本身均是分布全球各地,Linux 生态系统参与者的测试负担比专有的独立公司高出一个数量级。
  • 衡量 Linux 发行版价值的另一个困难就是确定开始时包含 Linux 发行版的内容。我们的研究包含了 Fedora 的公共源代码库中所有软件包。但是,Fedora 本身也有不同的版本(例如 LiveCD 版本)。当然还有更大的发行版,例如,Debian GNU / Linux 的代码仓库 13 就比 Fedora 更大。还有大量的开源软件在任何一个发行版中都找不到。开源是一个非常大的宇宙,我们只是以 Linux 发行版为研究单位,尽可能的包含足够多的开源软件罢了。
  • SLOC 分析的最大弱点是它专注于软件项目的净增加。举例来讲,任何熟悉内核开发的人都会意识到,开发过程中最高的人力成本是删除和修改代码的时候。删除和更改代码所花费的精力,并未反映在与此估算相关的值中。因为在协作开发模型中,代码被开发,然后被更改和删除,真正的价值远远大于现有的代码库。聪明的你,想一下内核的开发流程:当几行代码添加到内核时,必须修改更多代码才能与现有的代码兼容。理解依赖关系和结果然后更改代码的工作在本研究中没有得到很好的体现。
  • 协作开发意味着,通常会有多个个人或小组致力于解决相同技术问题的不同方法,其中只有一种方法“获胜”而包含在最终版本中。 由于“失败”方法并未包含在最终的发布版本中,因此该 SLOC 方法未考虑这些方法的开发工作。
  • 由于 Linux 不同的发行版之间,以及同一个发行版的不同版本之间的代码行数是有着巨大差异的,所以将本研究冠以研究 “Linux” 是有点牵强的。 分析内容有很多不同的选择,我们只能选择一种。出于这个原因,我们发现所有发行版共享的离散包的估计值(例如内核)更有意义。
  • 很遗憾的是,我们只能以量来代替研究质。Linux 社区的壮大速度很快,但同时也包含了一些不被经常用到的代码,比如旧的驱动程序。但是,包含此代码非常重要,因为 Linux 中包含特定于体系结构的代码以及驱动程序(与其他操作系统不同)。因此,此数字将大于操作系统本身内不包含这些组件的其他操作系统。
  • 本研究假设所有开发者都来自美国,那么相应的就以美国劳动力的相关成本为基准来计算。尽管事实上,绝大多数的开源软件开发都是全球性的,其劳动力成本也会相应变化。
  • 本研究中反映的数字表示从头开始一款 Linux 发行版,进而计算开发所需的成本。 值得注意的是,这可以估算成本,但不会估算更大生态系统的价值,因为如此广泛使用的核心技术改变将产生巨大而深远的经济影响。

Linux 是如何增长的

本研究还没有考虑逐步更新和扩展 Linux 代码库的年度开发成本。基于这些数字(或任何人对 Linux 发行版的直接经验),很容易看出 Linux 发行版中包含的功能在过去六年中是如何以爆炸般的形式发展的。

例如,Fedora Linux 9 包含超过 2.04 亿行纯的源代码(SLOC),相比之下 Red Hat Linux 7.1(2002 年发布)才是区区的 3000 万行,而再往前的版本 6.2 中只有超过 1700 万行。代码库在过去的六年里,增加了 1.74 亿行代码。使用 COCOMO 成本模型,我们估计 Fedora 9 需要大约 60,000 人年的开发时间(相比之下,Red Hat 7.1 为 8,000 人年,而 6.2 版为 4,500 人年)。因此,与 Red Hat Linux 7.1 相比,Fedora 9 的大小增加了大约 680%,工作量增加了 750%,传统开发成本增加了 900%。背后的原因之一则是由于过去几年全球范围内可用的、成熟的开源/自由软件程序数量的增加。这种增长表明 Linux 具有更大的发展势头:不断增加开源软件包可以增强 Linux 用户可用的应用程序,反过来也使得 Linux 作为计算平台更具吸引力。

通过审视发行版中排名前十的软件包列表,我们可以轻易得知,(构成发行版的)Linux 的模块化是它本身的特性。如果有时间的话,这个特性的分析本身就是十分有趣的事情,比如,就拿嵌入式 Linux 的发行版来说吧,分析其使用最频繁的组件以及与该计算部分相关的开发成本会很有意义。

对于 Linux 创新的影响分析来讲,不能仅仅通过线性的代码增加来进行衡量。正如近来发布的“是谁在撰写 Linux 内核?”的报告中所称:”在已经发布的版本中,内核团队每年的增长率非常稳定,约为 10%,考虑到代码树的大小,这个数字非常可观。但是这不仅仅是代码数量上的增长,还有实际功能、性能等诸多的其它因素的改进和进化,因为每一次的变更都意味着代码的增加、删除、修改。” 14

虽然 Linux 内核与 Linux 发行版当中的大多数其他组件相比,可能更改的更为频繁,但是从整体而言,我们的数据也反映出整个 Linux 发行版每年都在不断增长和变化。由于 Linux 内核只是 Linux 发行版的一个小(但非常重要)组件,其每年投入的迭代开发成本非常的高,但在本次研究中还没有将其进行特别的处理。

总结

那么在阅读完这篇研究之后,你知道 Linux 的”价值”所在了吗?虽然它可能还不是一个能够完全回答的问题,但有些事情非常明确,那就是:Linux 的真正价值在于它重用它的能力以及它所创造的巨大灵活性。

想象一下,假如在一个 Linus Torvalds 不允许(实际上是迫使)Linux 用户允许其他人重复使用他们的贡献的计算世界。如果他们没有免费使用 Linux 并且能够根据他们的需求修改它,那么会不会有谷歌?如果没有可以免费使用的价值 108 亿美元的软件,是否会有不断扩大的低于 350 美元的新型超便携电脑?亚马逊是否能够建立其新的 Kindle 阅读设备系列,而无需为其提供 14 亿美元的免费研发费用?而且不能单单以金钱来衡量,Linux 发行版还意味着时间这个巨大的经济因素,如果这些公司被迫向任何一家公司支付每台设备或每台服务器的许可费,那么这些例子中的经济学就不可能实现,那么他们就不得不花费数千人年的开发时间来创建这个软件。

我们可以从这项研究中学到什么?基于社区的 Linux 发行版所代表的大量开发成本反映了其在计算领域日益增加的价值和重要性。公司和个人通过参与 Linux 相关的项目,公司通过同行(有时是竞争对手)分担开发费用,进而创造自己的利润。软件世界的一个越来越明显的事实是,像微软那样,单独承担这种研究和开发负担是一种昂贵的构建软件的方法。虽然过去的垄断地位使他们能够为这一巨大的发展提供资金,但我们深信,随着时间的推移,未来来自合作力量的竞争将使这种孤立的做法变得难以为继。

正如我们从这项研究中看到的那样,通过 Linux 在所有计算领域的爆炸式增长,协同开发创造了巨大的经济价值!诸如 IBM、Intel、HP、Fujitsu、NEC、Hitachi、Google、Novell、Oracle、RedHat 等公司,以及其它所有参与到开发中的公司,他们均从这个开放式软件开发的生态中找到了自己的利益立足点。但是,请务必澄清:当这些公司参与且贡献较大时,请不要忘记独立的个人参与的开发和造就的价值是同等重要的!要知道,所有这一切都是从个体开启的。

本文中的数据由 SLOCCount 生成, SLOCCount 的版权 © 2001-2004 归 David A. Wheeler 所有,SLOCCount 是开源软件/自由软件,基于 GNU GPL 许可协议。

SLOCCount 没有任何的担保,非常欢迎大家基于 GNU GPL许可下自由的分发该软件,欲了解 GPL 的内容,去阅读相关文档。

致谢

我们要感谢以下人员对本文的审核和反馈:James Bottomley、Jon Corbet 以及 David A. Wheeler。

作者介绍

Amanda McPherson is vice president, marketing and developer programs, at the LF and leads its promotion, developer, and community-relations activities.

Brian Proffitt is community manager with the LF, managing the Linux Developer Network.

Ron Hale-Evans is senior specifications writer with the LF and works closely with the Linux Standard Base (LSB) developer team to create LSB specifications.

附录

Fedora 9,其安装盘并没有包含源代码,所以我们的代码是从 http://mirrors.kernel.org 上下载的。因为确定要分析的文件会在流程中进入另一层次的主观性,所以决定将所有 5547 个可用的开源软件包(src.rpm)下载并安装在测试机器上。

从 FTP 服务器下载 src.rpm 后,就可以安装它们了。即使没有任何 rpm 作为二进制 RPM 包安装(因此可能实际只是做为测试机器上安装的应用程序),也建立了一个程序来允许构建和准备源代码的 RPM,而无需 root 访问权限,修改发现的过程在一个存档的 Red Hat howto 页面上。

源代码已下载到测试用户的主目录。

然后使用 gedit 创建一个脚本并将其保存为同一主目录中的 .rpmmacros。创建了目标目录集,然后使用以下命令安装 src.rpm 文件:

rpm -ivh *.src.rpm

经过一段时间后,安装了所有 5547 个软件包,规范文件(.spec)位于 rpm/SPECS 目录中,源文件和图形填充了 rpm/SOURCES 目录。

在此阶段,必须构建和准备 src.rpm 文件,这将所有应用程序的源代码一一对应地放到 rpm/BUILD 目录中自己的目录。为此,使用了以下命令:

rpmbuild -bp –nodeps *.spec

运行此命令后,所有软件包都已在 BUILD 目录中正确安装。

然后可以开始实际计数。因为发行版不是单个软件项目,所以不应该这样计算。SLOCCount 提供了一个参数来补偿: -multiproject。

对于 Fedora 9,使用的命令是:

sloccount –multiproject –personcost 75662.08 /usr/src/rpm/BUILD/ &> sloc.txt

如需进一步检查,以下是 Fedora 9 源代码中的前 10 个软件包的统计数值,(供参考):

SLOC OSS 项目 按语言分别计算的 SLOC(已排序)
5961705i kernel-2.6.25i686 ansic=5727336, asm=216356,perl=6019, cpp=3962, yacc=2901, lex=1824, objc=613,python=331,lisp=218, pascal=116, awk=96
4991916 OpenOffice.org cpp=4518218, java=262028, ansic=109607, perl=66501, sh=11288, yacc=6657, cs=6600, python=3023, lex=2474, asm=2453, lisp=920, awk=734, objc=594, pascal=407, csh=301, php=104, sed=7
3118105 Gcc-4.3.0-2 0080428 ansic=1559056, java=646496, ada=478683, cpp=305899, f90=50636, asm=25272, sh=19070, exp=11829, fortran=7651, objc=3539, perl=2732, ml=2485, yacc=1440, pascal=1092, awk=764, python=582, lex=461, tcl=381, haskell=37
2664636 Enterprise Security Client 1.0.1 cpp=1725793, ansic=862640, perl=27244, asm=16749, sh=16435, cs=6232, java=5325, python=3077, lex=306, php=244, pascal=230, csh=132, objc=97, yacc=79, ada=49, sed=4
2216353 eclipse-3.3.2 java=2089544, ansic=96269, cpp=24302, jsp=3965, perl=1325, sh=878, python=46, php=24
2123390 Mono-1.9.1 cs=1862734, ansic=257228, sh=1998, perl=807, asm=335, yacc=288
2088834 firefox-3.0 cpp=1280521, ansic=743238, asm=32703, sh=14686, perl=7177, python=6549, java=2668, makefile=2451, objc=867, lisp=256, pascal=159, awk=10
1792482 bigloo3.0b ansic=1621378, lisp=143716, sh=10296, java=8233, cs=7846, cpp=849, asm=159, yacc=5
1788219 gcc-3.4.6-20060404 ansic=858843, ada=485364, cpp=196337, java=175563, asm=24403, sh=19731, yacc=14038, exp=5657, objc=4408, fortran=2032, perl=898, lex=587, awk=189, pascal=86, haskell=66, sed=17
1543156 ParaView3.2.1 cpp=960400, ansic=509436, tcl=45787, python=19574, perl=3112, yacc=1787, java=1517, sh=644, asm=471, lex=400, objc=28

参考资料


  1. IDC “The Role of Linux Commercial Servers and Workloads”, 2008 

  2. Greg Kroah-Hartman, Jonathan Corbet, and Amanda McPherson, “Linux Kernel Development: How Fast it is Going, Who is Doing It, What They are Doing, and Who is Sponsoring It”, April 2016, https://www.linuxfoundation.org/events/2016/08/linux-kernel-development-2016/ 

  3. David A. Wheeler, “More Than a Gigabuck: Estimating GNU/Linux’s Size” 2001 (revised 2002) 

  4. http://en.wikipedia.org/wiki/Source_lines_of_code 

  5. http://en.wikipedia.org/wiki/Estimation_in_software_engineering 

  6. http://en.wikipedia.org/wiki/Barry_Boehm 

  7. http://en.wikipedia.org/wiki/Regression_analysis 

  8. http://en.wikipedia.org/wiki/COCOMO 

  9. http://www.dwheeler.com/sloccount/sloccount.html 

  10. Bureau of Labor Statistics, CES Database http://www.bls.gov/ces/#data 

  11. Bureau of Labor Statistics, http://www.bls.gov/news.release/ecec.t05.htm (March 2008) 

  12. David A. Wheeler, “Linux Kernel 2.6: It’s Worth More!” 2004 (revised 2007) http://www.dwheeler.com/essays/linux-kernel-cost.html 

  13. For more information on Debian source-code counts, see Counting Potatoes: The size of Debian 2.2 (http://people.debian.org/~jgb/debian-counting) and Measuring Libre Software Using Debian 3.1 (Sarge) as A Case Study: Preliminary Results (http://www.upgrade-cepis.org/issues/2005/3/up6-3Amor.pdf

  14. Greg Kroah-Hartman, Jonathan Corbet, and Amanda McPherson, “Linux Kernel Development: How Fast it is Going, Who is Doing It, What They are Doing, and Who is Sponsoring It”, April 2008, http://www.linuxfoundation.org/publications/linuxkerneldevelopment.php 


Rancher:一个全面的可用于产品环境的容器管理平台

$
0
0

Docker 作为一款容器化应用的新兴软件,被大多数 IT 公司使用来减少基础设施平台的成本。

通常,没有 GUI 的 Docker 软件对于 Linux 管理员来说很容易,但是对于开发者来就有点困难。当把它搬到生产环境上来,那么它对 Linux 管理员来说也相当不友好。那么,轻松管理 Docker 的最佳解决方案是什么呢?

唯一的办法就是提供 GUI。Docker API 允许第三方应用接入 Docker。在市场上有许多 Docker GUI 应用。我们已经写过一篇关于 Portainer 应用的文章。今天我们来讨论另一个应用,Rancher。

容器让软件开发更容易,让开发者更快的写代码、更好的运行它们。但是,在生产环境上运行容器却很困难。

推荐阅读: Portainer:一个简单的 Docker 管理图形工具

Rancher 简介

Rancher 是一个全面的容器管理平台,它可以让容器在各种基础设施平台的生产环境上部署和运行更容易。它提供了诸如多主机网络、全局/本地负载均衡和卷快照等基础设施服务。它整合了原生 Docker 的管理能力,如 Docker Machine 和 Docker Swarm。它提供了丰富的用户体验,让 DevOps 管理员在更大规模的生产环境上运行 Docker。

访问以下文章可以了解 Linux 系统上安装 Docker。

推荐阅读:

Rancher 特性

  • 可以在两分钟内安装 Kubernetes。
  • 一键启动应用(90 个流行的 Docker 应用)。
  • 部署和管理 Docker 更容易。
  • 全面的生产级容器管理平台。
  • 可以在生产环境上快速部署容器。
  • 强大的自动部署和运营容器技术。
  • 模块化基础设施服务。
  • 丰富的编排工具。
  • Rancher 支持多种认证机制。

怎样安装 Rancher

由于 Rancher 是以轻量级的 Docker 容器方式运行,所以它的安装非常简单。Rancher 是由一组 Docker 容器部署的。只需要简单的启动两个容器就能运行 Rancher。一个容器用作管理服务器,另一个容器在各个节点上作为代理。在 Linux 系统下简单的运行下列命令就能部署 Rancher。

Rancher 服务器提供了两个不同的安装包标签如 stablelatest。下列命令将会拉取适合的 Rancher 镜像并安装到你的操作系统上。Rancher 服务器仅需要两分钟就可以启动。

  • latest:这个标签是他们的最新开发构建。这些构建将通过 Rancher CI 的自动化框架进行验证,不建议在生产环境使用。
  • stable:这是最新的稳定发行版本,推荐在生产环境使用。

Rancher 的安装方法有多种。在这篇教程中我们仅讨论两种方法。

  • 以单一容器的方式安装 Rancher(内嵌 Rancher 数据库)
  • 以单一容器的方式安装 Rancher(外部数据库)

方法 - 1

运行下列命令以单一容器的方式安装 Rancher 服务器(内嵌数据库)

$ sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:stable
$ sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:latest

方法 - 2

你可以在启动 Rancher 服务器时指向外部数据库,而不是使用自带的内部数据库。首先创建所需的数据库,数据库用户为同一个。

> CREATE DATABASE IF NOT EXISTS cattle COLLATE = 'utf8_general_ci' CHARACTER SET = 'utf8';
> GRANT ALL ON cattle.* TO 'cattle'@'%' IDENTIFIED BY 'cattle';
> GRANT ALL ON cattle.* TO 'cattle'@'localhost' IDENTIFIED BY 'cattle';

运行下列命令启动 Rancher 去连接外部数据库。

$ sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server \
 --db-host myhost.example.com --db-port 3306 --db-user username --db-pass password --db-name cattle

如果你想测试 Rancher 2.0,使用下列的命令去启动。

$ sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/server:preview

通过 GUI 访问 & 安装 Rancher

浏览器输入 http://hostname:8080http://server_ip:8080 去访问 rancher GUI.

怎样注册主机

注册你的主机 URL 允许它连接到 Rancher API。这是一次性设置。

接下来,点击主菜单下面的 “Add a Host” 链接或者点击主菜单上的 “INFRASTRUCTURE >> Add Hosts”,点击 “Save” 按钮。

默认情况下,Rancher 里的访问控制认证禁止了访问,因此我们首先需要通过一些方法打开访问控制认证,否则任何人都不能访问 GUI。

点击 “>> Admin >> Access Control”,输入下列的值最后点击 “Enable Authentication” 按钮去打开它。在我这里,是通过 “local authentication” 的方式打开的。

  • “Login UserName”: 输入你期望的登录名
  • “Full Name”: 输入你的全名
  • &ldquoassword”: 输入你期望的密码
  • “Confirm Password”: 再一次确认密码

注销然后使用新的登录凭证重新登录:

现在,我能看到本地认证已经被打开。

怎样添加主机

注册你的主机后,它将带你进入下一个页面,在那里你能选择不同云服务提供商的 Linux 主机。我们将添加一个主机运行 Rancher 服务,因此选择“custom”选项然后输入必要的信息。

在第 4 步输入你服务器的公有 IP,运行第 5 步列出的命令,最后点击 “close” 按钮。

$ sudo docker run -e CATTLE_AGENT_IP="192.168.56.2"  --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.11 http://192.168.56.2:8080/v1/scripts/16A52B9BE2BAB87BB0F5:1546214400000:ODACe3sfis5V6U8E3JASL8jQ

INFO: Running Agent Registration Process, CATTLE_URL=http://192.168.56.2:8080/v1
INFO: Attempting to connect to: http://192.168.56.2:8080/v1
INFO: http://192.168.56.2:8080/v1 is accessible
INFO: Configured Host Registration URL info: CATTLE_URL=http://192.168.56.2:8080/v1 ENV_URL=http://192.168.56.2:8080/v1
INFO: Inspecting host capabilities
INFO: Boot2Docker: false
INFO: Host writable: true
INFO: Token: xxxxxxxx
INFO: Running registration
INFO: Printing Environment
INFO: ENV: CATTLE_ACCESS_KEY=9946BD1DCBCFEF3439F8
INFO: ENV: CATTLE_AGENT_IP=192.168.56.2
INFO: ENV: CATTLE_HOME=/var/lib/cattle
INFO: ENV: CATTLE_REGISTRATION_ACCESS_KEY=registrationToken
INFO: ENV: CATTLE_REGISTRATION_SECRET_KEY=xxxxxxx
INFO: ENV: CATTLE_SECRET_KEY=xxxxxxx
INFO: ENV: CATTLE_URL=http://192.168.56.2:8080/v1
INFO: ENV: DETECTED_CATTLE_AGENT_IP=172.17.0.1
INFO: ENV: RANCHER_AGENT_IMAGE=rancher/agent:v1.2.11
INFO: Launched Rancher Agent: e83b22afd0c023dabc62404f3e74abb1fa99b9a178b05b1728186c9bfca71e8d

等待几秒钟后新添加的主机将会出现。点击 “Infrastructure >> Hosts” 页面。

怎样查看容器

只需要点击下列位置就能列出所有容器。点击 “Infrastructure >> Containers” 页面。

怎样创建容器

非常简单,只需点击下列位置就能创建容器。

点击 “Infrastructure >> Containers >> Add Container” 然后输入每个你需要的信息。为了测试,我将创建一个 latest 标签的 CentOS 容器。

在同样的列表位置,点击 “ Infrastructure >> Containers”。

点击容器名展示容器的性能信息,如 CPU、内存、网络和存储。

选择特定容器,然后点击最右边的“三点”按钮或者点击“Actions”按钮对容器进行管理,如停止、启动、克隆、重启等。

如果你想控制台访问容器,只需要点击 “Actions” 按钮中的 “Execute Shell” 选项即可。

怎样从应用目录部署容器

Rancher 提供了一个应用模版目录,让部署变的很容易,只需要单击一下就可以。 它维护了多数流行应用,这些应用由 Rancher 社区贡献。

点击 “Catalog >> All >> Choose the required application”,最后点击 “Launch” 去部署。


via: https://www.2daygeek.com/rancher-a-complete-container-management-platform-for-production-environment/

作者:Magesh Maruthamuthu 译者:arrowfeng 校对:wxy

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

无相:我们能从 InteliJ IDEA 中学到什么?

$
0
0

近因为工作的关系,要将 Eclipse 的插件升级为 IDEA 插件。升级过程中,对 IDEA 插件做了些学习和研究,希望通过本文,对“为什么收费的 InteliJ IDEA 会比免费的 Eclipse 有着更好的用户口碑“这一现象,提供些个人的思考。

阅读本文,您将了解到心流与人体工效的重要性,并使自己变得更强大,文章将从以下几点展开:

  • InteliJ IDEA 当前的市场情况与表现;

  • IntelliJ IDEA 成功的原因;

  • IntelliJ IDEA 在 IDE 设计器领域胜出的两个关键点;

  • IntelliJ IDEA 对现实工作的启示;

InteliJ IDEA 的市场情况与表现

2012 年开始,IntelliJ IDEA 便迅速崛起,到了 2016 年,就占领了开发者市场的 46% 分额。直至 2018 的最新结果:IntelliJ IDEA 的市场份额增长到了 55.4%,显然赢得了 18 年 Java 领域的 IDE 王者之战,甚至还有重构大师 Martin Fowler 在其著名的博客上,对 IntelliJ IDEA 赞誉有加。而且根据 IDEA 的产品满意度调查,其满意度竟高达 98%。

IntelliJ IDEA 为何能成功?

很多国外学者也研究了 IDEA,它的成功之处归结起来有以下两点:

1. 产品功能上的成功:

  • 代码的智能提示:IDEA 自主开发语言解释器,做了深度的静态分析,让编程更加智能与高效,这是一项杀手级的特色功能;

  • 没有保存按钮:每一个你想使用的功能,都有快捷键;

  • 性能非常好,用户的体验极其流畅;

  • IDEA 不仅对核心插件进行维护,  还提供了优秀的工具集,给予用户一致的 UX 范式体验;

2. 营销策略上的成功:

  • 以产品为核心和根本,以 "更好用" 的设计理念和原则打败了很多竞争者;

  • IDEA 没有销售团队,但是霸气的营销口号体现了其内容营销的核心逻辑:”Try it. Test it. If you feel its better, use it“ ,没有多余的营销,真正做到了用产品说话;

相信大部分程序员,对 IDEA 的特性已经非常熟悉了。 接下来,我们将分析其真正强大的原因。

IntelliJ IDEA 为何能胜出?

IDEA 的风靡与崛起,在于它遵从了两个关键的设计哲学:

1. 不断打心流

Every aspect of IntelliJ IDEA is designed with ergonomics in mind. IntelliJ IDEA is built around the idea that every minute a developer spends in the flow is a good minute, and things that break developers out of flow are bad things. Every design and implementation decision considers the possibility of interrupting developer’s flow and seeks to eliminate or minimize it.(这句话美得我不想翻译。)

“Creative Flow” or just “Flow” is a state of mind where you feel evenly attuned, and focused on the task at hand.

创造心流是一种思考状态,是你感觉平和或专注于手头任务的时刻,通俗的理解就是当你沉浸于一件事时,有一种忘记时间与空间的感觉,心流会让你处于最佳的意识状态。McKinsey 在 2010 年的研究表明,当你处于心流状态,你的工作效率比非心流状态下的工作效率提高 500%。

通过这种设计理念的学习,不禁畅想:如果越来越多的产品,如果能像 IntelliJ IDEA 的产品体验一样,让人处于心流,高效完成任务,整体的生产效率将会成倍提升。

2. 人体工效学

IntelliJ IDEA 宣称用人体工效学来设计 IDEA, 即 “The capable and ergonomic IDE for JVM”。

我们简要地科普一下人体工效学:这是一门专注研究人体舒适,通过产品设计减少疲劳、不舒适的科学。在家居设计和人体工程学上,都会重点考虑这种设计理念,让人们在使用时感受到更舒适、更高效率与更少的压力。

接下来例举两个人体工效学的经典例子:

客服耳机:

如果没有佩戴式耳机的出现,客服同学估计会疯掉。

一撕得的包装箱:

一撕得的包装纸质量、胶水质量、人体工效学的拉链式设计,这三种要素在纸箱界都是业界第一。

3. 人体工效学对软件设计的提示:

  • 统一的 UX 风格设计;

  • 将复杂任务变成简单任务;

  • 将长任务分解成短任务;

  • 因为人类的有记忆力的限制,所以要适当提供提醒,提供关键的辅助给用户,让他们完全沉浸在核心工作中,不被打断。

(更多提示,可以参看文末参考文献中的第 5 篇)

如果想感受一下人体工效学的设计,体验 IDEA 的快捷键与无保存按钮,立刻就能明白。

对我们现实工作有哪些启示?

经过团队的讨论,我们认为 IDEA 的增长飞轮在于:优秀的设计理念,卓越的产品体验,InteliJ IDEA 开放的社区,免费与专业收费并行的商业模式。

IDEA 不断更新迭代的路径就是用更好的产品体验,吸引到更多的用户,用户贡献了更多的利润,用来吸收更多的优秀人才,一起开发更好的产品。这给予我们现实工作的指导意义就是:产品要回归至以人为中心的设计理念:

  • 心流的提示:罗列出用户的任务,让用户尽可能处于心流状态,消灭导致任务低效的因素;

  • 人体工效学提示:我们在设计产品时,要充分考虑用户使用产品的场景,这是一个一体化的设计,就像星环产品设计。写代码只是软件研发的一环,需求创意提出、需求研发上线、业务商业分析这些整体环节都要考虑,让用户舒适地完成任务;

  • 智能提示:采用人工智能来提升任务的完成效率。IntelliJ IDEA的智能代码提示,是一个经典的案例;

最后:我个人会将心流与人体工效学的设计思想,融入至技术产品设计过程中,期待我们团队的实践篇。

推荐

小编推荐两款创造心流的 IDE 插件:

  1. 热替换利器:JRebel
    一款热部署插件,帮助开发者在项目处于运行状态下任意修改 Java 文件并动态反馈到运行的项目中。
  2. 开发测试必备部署神器:Cloud Toolkit 
    帮助开发者更高效地开发、测试、诊断并部署应用,利用此插件,能够方便地将本地应用一键部署到任意机器。

参考文献

  1. Choosing your Java IDE
  2. How To Achieve Creative Flow for Designers and Entrepreneurs
  3. Research about Flow State
  4. Flow State on Wikipedia
  5. Ergonomic Guidelines for User-interface Design

本文作者

无相,阿里巴巴资深技术专家,多年担任汇金平台的架构师,是阿里 tbbpm 工作流引擎的作者。曾在阿里云负责过云产品 0 至 1 的商业化,最近几年在负责阿里的店铺 & 详情等系统的中台建设。

树莓派使用入门:进入物理世界 —— 如何使用树莓派的 GPIO 针脚

$
0
0

在树莓派使用入门的第十篇文章中,我们将学习如何使用 GPIO。

到目前为止,本系列文章主要专注于树莓派的软件方面,而今天我们将学习硬件。在树莓派最初发布时,最让我感兴趣的主要特性之一就是它的 通用输入输出(GPIO)针脚。GPIO 可以让你的树莓派程序与连接到它上面的传感器、继电器、和其它类型的电子元件与物理世界来交互。

树莓派上的每个 GPIO 针脚要么有一个预定义的功能,要么被设计为通用的。另外,不同的树莓派型号要么 26 个,要么有 40 个 GPIO 针脚,你可以根据情况使用的。在维基百科上有一个 关于每个针脚的非常详细的说明 以及它的功能介绍。

你可以使用树莓派的 GPIO 针脚做更多的事情。关于它的 GPIO 的使用我写过一些文章,包括使用树莓派来控制节日彩灯的三篇文章(第一篇第二篇、和 第三篇),在这些文章中我通过使用开源程序让灯光随着音乐起舞。

树莓派社区在用不同编程语言创建不同的库方面做了非常好的一些工作,因此,你能够使用 CPythonScratch 和其它语言与 GPIO 进行交互。

另外,如果你想在树莓派与物理世界交互方面获得更好的体验,你可以选用 Raspberry Pi Sense Hat,它是插入树莓派 GPIO 针脚上的一个很便宜的电路板,借助它你可以通过程序与 LED、驾驶杆、气压计、温度计、温度计、 陀螺仪、加速度计以及磁力仪来交互。


via: https://opensource.com/article/19/3/gpio-pins-raspberry-pi

作者:Anderson Silva 选题:lujun9972 译者:qhwdw 校对:wxy

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

加密邮件服务 Tutanota 现在有桌面应用了

$
0
0

Tutanota 最近宣布发布针对其电子邮件服务的桌面应用。该 Beta 版适用于 Linux、Windows 和 macOS。

什么是 Tutanota?

网上有大量免费的、带有广告的电子邮件服务。但是,大多数电子邮件服务并不完全安全或在意隐私。在这个后斯诺登世界中,Tutanota 提供了免费、安全的电子邮件服务,它专注于隐私。

Tutanota 有许多引人注目的功能,例如:

  • 端到端加密邮箱
  • 端到端加密地址簿
  • 用户之间自动端到端加密邮件
  • 通过分享密码将端到端加密电子邮件发送到任何电子邮件地址
  • 安全密码重置,使 Tutanota 完全无法访问
  • 从发送和接收的电子邮件中去除 IP 地址
  • 运行 Tutanota 的代码是开源
  • 双因子身份验证
  • 专注于隐私
  • 加盐的密码,并本地使用 Bcrypt 哈希
  • 位于德国的安全服务器
  • 支持 PFS、DMARC、DKIM、DNSSEC 和 DANE 的 TLS
  • 本地执行加密数据的全文搜索

web 中的 Tutanota

你可以免费注册一个帐户。你还可以升级帐户获取其他功能,例如自定义域、自定义域登录、域规则、额外的存储和别名。他们还提供企业帐户。

Tutanota 也可以在移动设备上使用。事实上,它的 Android 应用也是开源的

这家德国公司计划扩展邮件之外的其他业务。他们希望提供加密的日历和云存储。你可以通过 PayPal 和加密货币捐赠帮助他们实现目标。

Tutanota 的新桌面应用

Tutanota 在去年圣诞节前宣布了桌面应用的 Beta 版。该应用基于 Electron

Tutanota 桌面应用

他们选择 Electron 的原因:

  • 以最小的成本支持三个主流操作系统。
  • 快速调整新桌面客户端,使其与添加到网页客户端的新功能一致。
  • 将开发时间留给桌面功能,例如离线可用、电子邮件导入,将同时在所有三个桌面客户端中提供。

由于这是 Beta 版,因此应用中缺少一些功能。Tutanota 的开发团队正在努力添加以下功能:

  • 电子邮件导入和与外部邮箱同步。这将“使 Tutanota 能够从外部邮箱导入电子邮件,并在将数据存储在 Tutanota 服务器上之前在设备本地加密数据。”
  • 电子邮件的离线可用
  • 双因子身份验证

如何安装 Tutanota 桌面客户端?

在 Tutanota 中写邮件

你可以直接从 Tutanota 的网站下载 Beta 版应用。它们有适用于 Linux 的 AppImage 文件、适用于 Windows 的 .exe 文件和适用于 macOS 的 .app 文件。你可以将你遇到的任何 bug 发布到 Tutanota 的 GitHub 帐号中

为了证明应用的安全性,Tutanota 签名了每个版本。“签名确保桌面客户端以及任何更新直接来自我们且未被篡改。”你可以使用 Tutanota 的 GitHub 页面来验证签名。

请记住,你需要先创建一个 Tutanota 帐户才能使用它。该邮件客户端设计上只能用在 Tutanota。

总结

我在 Linux Mint MATE 上测试了 Tutanota 的邮件应用。正如所料,它是网络应用的镜像。同时,我发现桌面应用和 Web 应用程序之间没有任何区别。我目前觉得使用该应用的唯一场景是在自己的窗口中使用。

你曾经使用过 Tutanota 么?如果没有,你最喜欢的关心隐私的邮件服务是什么?请在下面的评论中告诉我们。

如果你觉得这篇文章很有趣,请花些时间在社交媒体上分享。


via: https://itsfoss.com/tutanota-desktop

作者:John Paul 选题:lujun9972 译者:geekpi 校对:wxy

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

区块链 2.0:重新定义金融服务(三)

$
0
0

本系列的前一篇文章侧重于建立背景,以阐明为什么将现有的金融系统向充满未来主义的区块链体系迈进是“货币”改革的下一个自然步骤。我们将继续了解哪些区块链特性将有助于这一迁移。但是,金融市场十分复杂,并且人们的交易由众多组成部分组成,而不仅仅是货币。

本部分将探索哪些区块链特性能够让金融机构向区块链平台迁移,并将传统银行和金融系统与其合并。如之前讨论证明的那样,如果有足够的人参与到给定的区块链网络并且支持交易协议,则赋给“代币”的面值将提升并变得更稳定。以比特币(BTC)为例,就和我们习惯使用的纸币一样,像比特币和以太币这样的加密货币,都可以用于所有前者的目的,从购买食物到船只,乃至贷款和购买保险。

事实上,你所涉及的银行或其他金融机构很可能已经利用了区块链分类账本技术。金融行业中区块链技术最显著的用途是建立支付基础设施、基金交易技术和数字身份管理。传统上,后两者是由金融服务业传统的系统处理的。但由于区块链处理上的效率,这些系统正逐渐的向区块链迁移合并。区块链还为这些金融服务业的公司提供了高质量的数据分析解决方案,这一方面之所以能够快速的得到重视,主要得益于最近的数据科学的发展。

从这一领域前沿阵地的初创企业和项目入手考察,区块链似乎能有所保证,因为这些企业或项目的产品已经开始在市场上扩展开来。

PayPal,这是一家创建于 1998 年的在线支付公司,现为此类平台中最大的一个,常被视作运营和技术能力的基准。PayPal 很大程度上派生自现有的货币体系。它的创新贡献来自于如何收集并利用消费者数据,以提供即时的在线服务。如今,在线交易已被认为是理所当然的事,其所基于的技术方面,在该行业里的创新极少。拥有坚实的基础是一件好事,但在快速发展的 IT 行业里并不能提供任何竞争力,毕竟每天都有新的标准和新的技术。2014 年,PayPal 子公司 Braintree 宣布与流行的加密货币支付方案解决商 CoinbaseGoCoin 建立了合作关系,以便逐步将比特币和其它加密货币整合到它们的服务平台上。这基本上给了加密货币支付方案解决商的消费者在 PayPal 可靠且熟悉的平台下探索和体验的一个机会。事实上,打车公司 Uber 和 Braintree 具有独家合作关系,允许消费者在打车的时候使用比特币。

瑞波(Ripple) 正在让人们在多个区块链之间的操作变得更简单。瑞波已经成为美国各地区银行向前发展的头条新闻,比如,在不需要第三方中介的情况下,将资金双边转移给其他地区银行,从而降低了成本和时间管理费用。瑞波的 Codius 平台允许区块链之间互相操作,并为智能合约编入系统提供了方便之门,以最大限度地减少篡改和混乱。建立在这种先进、安全并且可根据需要扩展的平台上,瑞波拥有像瑞银和渣打银行 在内的客户列表,更多的银行客户也在期待加入。

Kraken,是一个在全球各地运营的美国加密货币交易所,因其可靠的加密货币量估算而闻名,甚至向彭博终端实时提供比特币定价数据。在 2015 年,他们与菲多尔银行合作建立世界上第一个提供银行业务和加密货币交易的加密货币银行。

另一家金融科技公司 Circle 则是目前同类公司中规模最大的一家,允许用户投资和交易加密货币衍生资产,类似于传统的货币市场资产。

如今,像 WyreStellar 这样的公司已经将国际电汇的提前期从平均 3 天降到了 6 小时。有人声称,一旦建立了适当的监管体系,同样的 6 小时可以缩短至几秒钟。

虽然现在上述内容集中在相关的初创项目上,但是不应忽视更受尊敬的老派金融机构的影响力和能力。这些全球范围内交易量达数十亿美元,已经存在了数十年乃至上百年的机构,在利用区块链及其潜力上有着相当的兴趣。

前面的文章中我们已经提到,摩根大通最近披露了他们在开发加密货币和企业级别的区块链基础分类帐本上的计划。该项目被称为 Quorum,被定义为 “企业级分布式分类帐和智能合约平台”。这一平台的主要目标是将大量的银行操作逐渐的迁移到 Quorum 中,从而削减像摩根大通这样的公司在保证隐私、安全和透明度上的重大开销。他们声称自己是行业中唯一完整拥有全部的区块链、协议和代币系统的玩家。他们也发布了一个称为 JPM 硬币 的加密货币,用于大额即时结算。JPM 硬币是由摩根大通等主要银行支持的首批“稳定币”。稳定币是其价格与现存主要货币系统相关联的加密货币。Quorum 也因其每秒几近 100 次远高于同行的交易量而倍受吹捧,这远远领先于同时代。

据报道,英国跨国金融巨头巴克莱已经注册了两项基于区块链的专利,旨在简化资金转移和 KYC 规程。巴克莱更多的是旨在提高自身的银行操作效率。其中一个应用是创建一个私有区块链网络,用于存储客户的 KYC 信息。经过验证、存储和确认后,这些详细信息将不可变,并且无需再进一步验证。若能实施这一应用,该协议将取消对 KYC 信息多次验证的需求。像印度这样有着高密度人口的发展中国家,其中大部分人口的 KYC 信息尚未被引入正式的银行系统中,若能引入这种具有革新意义的 KYC 系统,将有助于减少随机错误并减少交付时间。据传,巴克莱同时也在探索区块链系统的功能,以便解决信用状态评级和保险赔偿问题。

这种以区块链作支撑的系统,被用来消除不必要的维护成本,并利用智能合约来为那些需要慎重、安全和速度的企业在行业内赢得竞争力。这些企业产品建立在一个能够确保完整交易以及合同隐私的协议之上,同时建立了可使腐败和贿赂无效的共识机制。

普华永道 2017 年的全球金融科技报告表示到 2020 年,所有金融科技公司中约有 77% 将转向基于区块链的技术和流程。高达 90% 的受访者表示他们计划在 2020 年之前将区块链技术作为生产系统的一部分。他们的判断没错,因为从监管的角度来看,通过转移到基于区块链的系统上,可以确保显著的成本节约和透明度增加。

由于区块链平台默认内置了监管能力,因此企业从传统系统迁移到运行区块链分类账本的现代网络也是行业监管机构所欢迎的举措。交易和贸易运动可以一劳永逸地进行验证和跟踪。从长远来看,这可能会带来更好的监管和风险管理,更不用说改善了公司和个人的责任。

虽然对跨越式创新的投资是由企业进行的大量投资顺带所致,但如果认为这些措施不会渗透到最终用户的利益中是具有误导性的。随着银行和金融机构开始采用区块链,这将为他们带来更多的成本节约和效率,而这最终也将对终端消费者有利。透明度和欺诈保护带来的额外好处将改善客户的感受,更重要的是提高人们对银行和金融系统的信任。通过区块链及其与传统服务的整合,金融服务行业急需的革命将成为可能。 在本系列的下一部分中,我们将讨论房地产中的区块链


via: https://www.ostechnix.com/blockchain-2-0-redefining-financial-services/

作者:ostechnix 选题:lujun9972 译者:sanfusu 校对:wxy

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

树莓派使用入门:通过树莓派和 kali Linux 学习计算机安全

$
0
0

树莓派是学习计算机安全的一个好方法。在我们这个系列的第十一篇文章中会进行学习。

在技术方面是否有比保护你的计算机更热门的话题?一些专家会告诉你,没有绝对安全的系统。他们开玩笑说,如果你想要你的服务器或者应用程序真正的安全,就关掉你的服务器,从网络上断线,然后把它放在一个安全的地方。但问题是显而易见的:没人能用的应用程序或者服务器有什么用?

这是围绕安全的一个难题,我们如何才能在保证安全性的同时,让服务器或应用程序依然可用且有价值?我无论如何都不是一个安全专家,虽然我希望有一天我能是。因此,分享可以用树莓派来做些什么以学习计算机安全的知识,我认为是有意义的。

我要提示一下,就像本系列中其他写给树莓派初学者的文章一样,我的目标不是深入研究,而是起个头,让你有兴趣去了解更多与这些主题相关的东西。

Kali Linux

当我们谈到“做一些安全方面的事”的时候,出现在脑海中的一个 Linux 发行版就是 Kali Linux。Kali Linux 的开发主要集中在调查取证和渗透测试方面。它有超过 600 个已经预先安装好了的用来测试你的计算机的安全性的渗透测试工具,还有一个取证模式,它可以避免自身接触到被检查系统的内部的硬盘驱动器或交换空间。

就像 Raspbian 一样,Kali Linux 基于 Debian 的发行版,你可以在 Kali 的主要文档门户的网页上找到将它安装在树莓派上的文档。如果你已经在你的树莓派上安装了 Raspbian 或者是其它的 Linux 发行版。那么你装 Kali 应该是没问题的,Kali 的创造者甚至将培训、研讨会和职业认证整合到了一起,以此来帮助提升你在安全领域内的职业生涯。

其他的 Linux 发行版

大多数的标准 Linux 发行版,比如 Raspbian、Ubuntu 和 Fedora 这些,在它们的仓库里同样也有很多可用的安全工具。一些很棒的探测工具你可以试试,包括 NmapWiresharkauditctl,和 SELinux

项目

你可以在树莓派上运行很多其他的安全相关的项目,例如蜜罐广告拦截器USB 清洁器。花些时间了解它们!


via: https://opensource.com/article/19/3/computer-security-raspberry-pi

作者:Anderson Silva 选题:lujun9972 译者:hopefully2333 校对:wxy

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

2019 年最好的 7 款虚拟私人网络服务

$
0
0

在过去三年中,全球至少有 67% 的企业面临着数据泄露,亿万用户受到影响。研究表明,如果事先对数据安全采取最基本的保护措施,那么预计有 93% 的安全问题是可以避免的。

糟糕的数据安全会带来极大的代价,特别是对企业而言。它会大致大规模的破坏并影响你的品牌声誉。尽管有些企业可以艰难地收拾残局,但仍有一些企业无法从事故中完全恢复。不过现在,你很幸运地可以得到数据及网络安全软件。

到了 2019 年,你可以通过虚拟私人网络,也就是我们熟知的 VPN 来保护你免受网络攻击。当涉及到在线隐私和安全时,常常存在许多不确定因素。有数百个不同的 VPN 提供商,选择合适的供应商也同时意味着在定价、服务和易用性之间谋取恰当的平衡。

如果你正在寻找一个可靠的 100% 经过测试和安全的 VPN,你可能需要进行详尽的调查并作出最佳选择。这里为你提供在 2019 年 7 款最好用并经过测试的 VPN 服务。

1、Vpnunlimitedapp

通过 VPN Unlimited,你的数据安全将得到全面的保障。此 VPN 允许你连接任何 WiFi ,而无需担心你的个人数据可能被泄露。你的数据通过 AES-256 算法加密,保护你不受第三方和黑客的窥探。无论你身处何处,这款 VPN 都可确保你在所有网站上保持匿名且不受跟踪。它提供 7 天的免费试用和多种协议支持:openvpn、IKEv2 和 KeepSolidWise。有特殊需求的用户会获得特殊的额外服务,如个人服务器、终身 VPN 订阅和个人 IP 选项。

2、VPN Lite

VPN Lite 是一款易于使用而且免费的用于上网的 VPN 服务。你可以通过它在网络上保持匿名并保护你的个人隐私。它会模糊你的 IP 并加密你的数据,这意味着第三方无法跟踪你的所有线上活动。你还可以访问网络上的全部内容。使用 VPN Lite,你可以访问在被拦截的网站。你还放心地可以访问公共 WiFi 而不必担心敏感信息被间谍软件窃取和来自黑客的跟踪和攻击。

3、HotSpot Shield

这是一款在 2005 年推出的大受欢迎的 VPN。这套 VPN 协议至少被全球 70% 的数据安全公司所集成,并在全球有数千台服务器。它提供两种免费模式:一种为完全免费,但会有线上广告;另一种则为七天试用。它提供军事级的数据加密和恶意软件防护。HotSpot Shield 保证网络安全并保证高速网络。

4、TunnelBear

如果你是一名 VPN 新手,那么 TunnelBear 将是你的最佳选择。它带有一个用户友好的界面,并配有动画熊引导。你可以在 TunnelBear 的帮助下以极快的速度连接至少 22 个国家的服务器。它使用 AES 256-bit 加密算法,保证无日志记录,这意味着你的数据将得到保护。你还可以在最多五台设备上获得无限流量。

5、ProtonVPN

这款 VPN 为你提供强大的优质服务。你的连接速度可能会受到影响,但你也可以享受到无限流量。它具有易于使用的用户界面,提供多平台兼容。 ProtonVPN 的服务据说是因为为种子下载提供了优化因而无法访问 Netflix。你可以获得如协议和加密等安全功能来保证你的网络安全。

6、ExpressVPN

ExpressVPN 被认为是最好的用于接触封锁和保护隐私的离岸 VPN。凭借强大的客户支持和快速的速度,它已成为全球顶尖的 VPN 服务。它提供带有浏览器扩展和自定义固件的路由。 ExpressVPN 拥有一系列令人赞叹高质量应用程序,配有大量的服务器,并且最多只能支持三台设备。

ExpressVPN 并不是完全免费的,恰恰相反,正是由于它所提供的高质量服务而使之成为了市场上最贵的 VPN 之一。ExpressVPN 有 30 天内退款保证,因此你可以免费试用一个月。好消息是,这是完全没有风险的。例如,如果你在短时间内需要 VPN 来绕过在线审查,这可能是你的首选解决方案。用过它之后,你就不会随意想给一个会发送垃圾邮件、缓慢的免费的程序当成试验品。

ExpressVPN 也是享受在线流媒体和户外安全的最佳方式之一。如果你需要继续使用它,你只需要续订或取消你的免费试用。ExpressVPN 在 90 多个国家架设有 2000 多台服务器,可以解锁 Netflix,提供快速连接,并为用户提供完全隐私。

7、PureVPN

虽然 PureVPN 可能不是完全免费的,但它却是此列表中最实惠的一个。用户可以注册获得 7 天的免费试用,并在之后选择任一付费计划。通过这款 VPN,你可以访问到至少 140 个国家中的 750 余台服务器。它还可以在几乎所有设备上轻松安装。它的所有付费特性仍然可以在免费试用期间使用。包括无限数据流量、IP 泄漏保护和 ISP 不可见性。它支持的系统有 iOS、Android、Windows、Linux 和 macOS。

总结

如今,可用的免费 VPN 服务越来越多,为什么不抓住这个机会来保护你自己和你的客户呢?在了解到有那么多优秀的 VPN 服务后,我们知道即使是最安全的免费服务也不一定就完全没有风险。你可能需要付费升级到高级版以增强保护。高级版的 VPN 为你提供了免费试用,提供无风险退款保证。无论你打算花钱购买 VPN 还是准备使用免费 VPN,我们都强烈建议你使用一个。

关于作者:

Renetta K. Molina 是一个技术爱好者和健身爱好者。她撰写有关技术、应用程序、 WordPress 和其他任何领域的文章。她喜欢在空余时间打高尔夫球和读书。她喜欢学习和尝试新事物。


via: https://www.ostechnix.com/7-best-opensource-vpn-services-for-2019/

作者:Editor 选题:lujun9972 译者:Modrisco 校对:wxy

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


企业开源指南:创建一个开源项目

$
0
0

最大限度优化组织中运行开源计划或启动开源项目的实践。这些资源由 Linux 基金会与 TODO Group 合作开发,代表了我们的员工、项目和成员的经验。

开源项目中心办公室是支持、培育、共享、解释和发展开源代码的特定场所。这样的办公室可以帮助企业明晰创建和执行开源项目的战略,成为保障领导、开发者、营销人员和其他员工成功运营开源项目的工具。

本指南旨在帮助您了解为何以及如何建立管理公司内部开源代码的创建和使用,并阐述开发者是如何为运营外的开源项目做出贡献。本指南涵盖开源项目办公室的多个话题,如:角色和职责、公司结构、开源项目管理要素,以及如何选择、聘用开源项目管理者等内容。

本指南的撰稿人

  • Chris Aniszczyk - Aniszczyk 云原生计算基金会首席营运官
  • Jeff McAffer - 微软开源项目办公室主任
  • Will Norris - 谷歌开源办公室经理
  • Andrew Spyker - Netflix 容器云经理

为何要创建开源项目办公室

如今,开源软件广泛运用于各行各业,覆盖零售业、金融业以及汽车行业等多个行业。然而, 这些公司的领导者和决策者并不能完全理解如何运营。

其中关键问题在于,当企业的发展遵照传统商业计划运营和发展时,开源软件可能成为企业发展的阻力。开源创新有独立的方法论,并不遵循传统业务流程。开源别具一格之处在于开发的协作性,传统的软件和商业实践是封闭的竖井式。对许多企业而言,使用开源软件这一转变并不能像理论讲述的轻而易举。

这便是创建开源项目open source program的优势所在。通过创建开源项目办公室open source program office,企业可以通过直接与公司长期业务计划相关联的方式启用、简化和组织开源项目的应用。开源项目办公室就会成为公司开源运营与架构的核心,汇集所有开源所必需的组件。

开源项目办公室可以进行设置代码的使用、分发、选择、审计和其他相关政策,同时还可以培训开发人员、保障项目合规性,并建立和提升社区参与度。该办公室还可以负责公司对内、对外所有开源资源的宣传和交流。

“开源项目办公室是目前所有公司的重要组成部分,它的扩张计划符合当前形势,足以影响软件生态系统中的各个部门。如果一家公司想要增加其影响力、净化开源消息传递渠道、最大限度地发挥项目影响力,或提高其产品开发效率,那么多样化的开源项目解决方案至关重要。“

John Mark Walker – 开源企业家网络(OSEN)创始人

开源项目办公室的角色

一个完善的开源项目办公室始终是有价值的。它有利于促进企业内部开源的使用、贡献和创新,帮助企业获得战略优势。

一个成功的开源项目办公室可以通过建立有效的流程支持开发者及其团队,为企业的开源带来巨大收益:鼓励代码标准化与最佳实践、流程和工具集。同时,创建开源项目办公室还可以避免或消除创新开发者可能绕过或忽略的不必要的刻板流程,以免威胁项目的安全和其他方面。

开源项目办公室的职责是多样化的,具体包括:

  • 明确公司内外部的开源策略
  • 掌握并监督战略执行
  • 促进商业产品和服务中开源的有效使用
  • 确保代码向开源社区的高质高频发布
  • 与开发者社区合作,了解公司对其他项目的有效贡献
  • 在组织内部形成开源文化
  • 维护开源许可合规的审查和监督

对于每家公司而言,开源项目办公室的角色可能会根据业务、产品和目标存在定制化配置。目前,并不存在创建开源项目的通用模板——甚至没有可以应用于某一行业各个公司的模板。这使创建开源程序具有挑战性,但您可以借鉴其他公司的经验,总结规律满足自身创建开源项目的需求。

“没有普适的万能模板。我不能站在大家面前说,你们都应该这样做。‘”

Jeff McAffer – 微软开源项目办公室主任

过去几年,微软一直致力于创建和完善自身的开源方式。微软拥有来自各业务部门,数以万计的职工,公司专设开源项目办公室,为开发者、营销团队,以及其他参与云服务、硬件与软件产品、游戏、内容、媒体及其他产品线的开源项目人员提供帮助。开源项目办公室需要针对各部门不同的单独业务模式和参与情景提供不同的帮助,因此无法使用相同的模式为所有部门提供服务。

开源项目办公室的一个关键角色是,当业务部门开始将开源纳入考虑中时,为这一讨论提供依据和帮助,保证充分理解考虑开源的重要性和开源的影响,以及开源的目标。这通常是一个构思谈判的问题,以便股东们可以在权衡利弊时知道从何入手和考虑方向。

开源项目办公室也可以成为开发者和开源社区用户间解决问题、理解需求的重要联络人。开源项目办公室可以协助解决法律问题、为开发者提供支持,并反馈公司开源项目外部用户的使用情况。开源项目办公室还可以协助向公司内部其他人员传递信息,包括产品管理团队,以进一步完善代码。此外,开源项目办公室正在聘用越来越多的专业开发者,保障他们的开源项目可持续发展。

关系/合作

  • Linux 基金会
  • 开源发明网络
  • 软件自由法律中心
  • Mozilla 基金会
  • GNOME 基金会
  • 自由软件基金会
  • Apache 软件基金会
  • 软件保护中心

开源法律合规:

  • 管理和支持开源合规流程
  • 关于开源合规的建议
  • 帮助解决合规性问题
  • 提供指导方针和清单
  • 跟踪新兴的开源法律问题

战略、社区和参与:

  • 开发、维护和执行企业开源战略和政策
  • 企业内外部的福音
  • 在内部政策讨论中代表开源视角
  • 启动新的开源项目并支持发布内部代码
  • 开源活动的赞助、发布和发言
  • 组织开源社区活动
  • 展开并提供内部开源培训
  • 提供工程指导以提升内部专业度
  • 举办内部技术研讨会
  • 就社区问题提供建议

案例:谷歌的开源

谷歌自 1998 年成立以来,开源应用已经成为谷歌的使命与成功所在,其开源项目办公室作用非常广泛。办公室经理 Will Norris 表示,该办公室于 2004 年启动,主要作为一个合规部门了解并组织使用开源许可和代码。当时谷歌的规模要比现在小得多,并且参与了许多开源项目和代码使用,但当时没有太多正式的合规流程。Norris 还表示,随着公司不断壮大,改变缺乏合规性和组织性问题突出。Norris 最初是一名软件工程师,曾在开源项目办公室工作了四年,后于 2016 年 9 月成为开源项目办公室经理。

谷歌开源项目办公室遵循三项重要原则——帮助 Google 员工使用开源、向社区公开源代码和支持全球更广泛的开源生态系统。该办公室自成立以来,使命一直未改变。该办公室仅有约 15 名成员,却为拥有约 72,000 名员工的公司提供服务。

为了保持开源生态系统的健康运作,办公室主要致力于雇用有能力胜任的、经验丰富的工程师开展开源项目,将大量公司资金投资于需要资金支持的开源基金会、开源团队和开源项目中。同时,定期举办技术会议,传播开源软件创立的优势与实用性。

该办公室还负责开发和运营谷歌 Summer of Code 等项目,该项目在暑假期间为来自世界各地顶尖大学和学院的学生提供由专业导师的培训、指导,自主创建代码的机会。

对于谷歌的开源项目办公室来说,Summer of Code 是一个为其投资带来直接利益的典型项目——潜在开发者拥有丰富的经验和如何进行开源开发如何的操作经验,未来他们可能在谷歌工作。在开源世界,同样的战略可以通过此类开源项目办公室的投资,惠及社区的其他公司。

谷歌的大多数开源社区的管理由众多产品团队承担,开源项目办公室给予团队和项目支持,以遵循自己想要的发展路径。每个项目的业务目标根据项目开源意义的不同而各异。在谷歌,通常有约 2000- 4000 个开源项目同时进行。

“我们允许公司各个业务部门从商业角度考虑自行决定,给定项目开源是否有意。因为可能有很多不同原因开源项目或代码片段。我们很乐意看到项目团队量体裁衣,实现目标。我们尽可能提供便利与建议。”

Will Norris - 谷歌的开源办公室经理

谷歌项目办公室由一个合规团队组成,其中包括两名律师,一个参与活动的外联团队和一个工程团队,他们负责开发工具以自动执行合规性检查并支持公司的开发计划。办公室的另一重要职责是仔细且不断地跟踪开放源代码应用中的大量统计信息,包括合规需要构建什么,及代码的发布和引用需要多久。

谷歌开源项目办公室最近新采取了一个有趣的举措,它鼓励所有负责开源主要工作的员工——无论他们是图形设计师、技术编写人员、营销人员还是开发人员——花费高达他们 20% 的时间为公司内的其他项目完成特定工作,促进跨团队之间更多的合作,帮助他们相互理解并全面改进项目。

开源项目办公室的建立

对于每家公司而言,创建开源项目办公室都是个性化决策的开始。这个过程可以从顶层管理开始,或从底层开发者开始,因为他们一直在使用开放源代码并希望看到其正式化。它可以表现为一种围绕法律问题和安全问题制定有关指导的愿望,或者起始于一种成熟的基层力量,引起企业领导者的关注。它甚至可以从一位具有前瞻性的 CEO 或 CTO 开始,通过加强对开源的承诺来推动公司前进并增加公司价值。这种共识和行政支持对于获得动力并推动项目前进来说至关重要。

那么应从哪里着手创建开源项目办公室?以下是一些关键步骤:

1、找到一位领导者

无论您的计划如何开始,重要的是找到合适的领导者来帮助发展并运营公司内部刚刚起步的开源项目办公室。最佳候选人应是一位对开源工作原理和现有开源项目中的开发者、贡献者或提交者的技术诀窍有详细了解的人。他们应该对贵公司的业务有广泛了解,并具备商业敏锐度和管理技能,以帮助向业务部门告知开源战略和计划。不仅如此,他们还需要善于社交,这样他们才能将热情、知识和信息传达给其他人,并帮助他们理解开源创新将如何转化、改变和完善公司业务。开源项目办公室的负责人需要能够与人们讨论深层技术,但他们无需了解每种技术的细节,因为这些细节实在太多,难以全部掌握。

本着开源协作的精神,当前存在着大量的在线资源来帮助企业找到最佳人选,包括开源项目经理和来自各种设立此类岗位的公司,如 Capital One,Box ,VMware,微软,Twitter 和雅虎等的其他领导者的详细职位描述示例。

2、定义你的运营

新的开源项目办公室需要解决预算、人员配置、技术工具和系统等关键问题。一些公司的此类办公室从任用兼职经理开始,但他们也意识到这样不是长久之计。聘用全职员工负责相关工作才是使项目落地的有效步骤,同时还应有一位支持人员,帮助保持办公室工作的灵活性。

如果项目办公室太大,可能会有过于集中的危险。若想尽可能保持公司内的开发者和开源社区正常运作,办公室过大则反而会导致问题拖延到项目办公室支持,而不是自行解决。

一个定位明确的开源项目办公室示例,应该如下所述:既能推动所需的政策、流程和工具的建立,也能在消除所发现的摩擦的同时保持稳定运作,它使用工具来自动化那些可精简的内容,并委派需要完成的任务。我们将在以下部分介绍如何设置政策和流程的更多细节。

项目办公室必须提供结构化的政策和流程,但也应当保持灵活性。当开源用户和贡献者需要帮助时,办公室应更像咨询公司,提供指导,同时允许员工针对工作做出个人或集体的业务决策。最终, 我们的目标是建立正确的责任与义务的平衡,以满足贵公司及其开源用户的需求。

3、寻求反馈和支持

建立一个开源项目办公室不应该在真空状态下完成。它将在业务中发挥核心作用,因此要成功创建它,需要公司内部所有相关方的开诚布公的意见和反馈。确保从高管到开发者,每个人都有发言权,有助于提供广泛帮助。

“如果你的目标是处理公司在开源的应用,在两方面——发布和引用——它确实需要你考虑什么是真正关心的问题。尽可能地精简流程,集中精力处理重要的事情,然后尽可能自动化。”

Will Norris – 谷歌开源办公室经理

组织架构

那么开源项目办公室应如何且并入公司的组织结构?它应该在工程部门内部吗?或者在法律部门,CTO 办公室或其他特定业务组?这又一次取决于公司的主要业务和开源战略。

  • 法律
    对于拥有大量知识产权组合的公司而言,这可能意味着开源项目办公室与法律办公室非常切合, 开发者可以与法律团队就出现的问题密切合作。这可能非常适合硬件公司,因为它始终关心与潜在的知识产权相关的法律问题。
  • 工程
    其他公司更多的是工程驱动的,所以选择在工程部门运营开源项目办公室,这有利于直接集中精力致力于让他们的开发者在工作中更加高效和高产。
  • 开发者关系,市场营销或沟通
    在其他情况下,一些开源办公室位于组织的营销部门内部,因为他们使用开放源代码渠道来销售他们使用开源代码构建的产品。

在 Twitter上,开源应用已成为公司成功不可或缺的一部分,开发人员发现从 2010 年开始很难回馈开源项目,因为该公司的法律部门对代码许可和相关问题有严重的担忧。开发人员和软件工程师通过寻求方法来实现许可证合规流程的自动化——帮助加快运行——以减轻法律和工程部门的担忧。寻求方法的结果是雇佣一名开源项目经理,并创建一个开源项目办公室来修复流程、简化流程、引入工具来自动完成任务并进行其他所需的更改。

有趣的是,Netflix 公司的容器云经理 Andrew Spyker 表示,它们采取了不同的方法,选择不创建或使用集中的开源项目办公室。相反,流媒体电影和娱乐公司通过一个小型的跨职能工作组使用开源, 该工作组运行了一个内部的邮件列表进行讨论,并每月进行一次非正式会面以解决开源遇到的问题。志愿者工作组成员协助其他分散的团队,使每个人都更少需要关注如法律问题、工具、监督和社区推广等行政任务。对于 Netflix 来说,这是一个可行的方法,因为它是一家娱乐公司,而不是一家软件公司。

在微软,其工程部门内的开源项目办公室结构非常独特,因为它需要支持约 60,000 名软件工程师。大量开发人员要求放弃所有开源项目的细节都必须通过一个集中式办公室的想法,因为这个办公室会不堪重负而无法运作。相反,对于无法自动执行的事情,该公司的开源项目办公室团队可以让工程师对他们的项目做出本地决策,而不必尝试可能导致操作受到干扰的集中式决策瓶颈。

在此过程中,微软工程师可以进入公司的开源工作流程,分享他们想要向一个开源社区分享的一部分代码或发布的某些东西,然后接收来自本地评论者提供的反馈与回复。这个高度专业化的流程包括大约 300 个不同的业务和法律审查团队,他们可以利用他们的专业知识来权衡本地化的请求,为公司提供可行的方法帮助。

“如果我们试图建立一个集中的机构来批准 Windows、Office 和 Azure 的开源部分,我们的头发会掉光。这些是完全不同的业务。我们为工程师提供工具和指导以完成他们的工作,而不是集中批准机构。这在一些公司有效,但在这毫无作用。“

Jeff McAffer – 微软开源项目办公室主任

管理角色

在建立开源项目办公室时,还必须确立相关角色和职责,包括确立开源项目经理、公司法律团队以及由工程师和高管组成的审核委员会的角色和职责。

  • 项目经理
    为了最大程度地提高效率,企业应该授权让项目经理担任执行层的职位,使其可以直接监督和实际管理公司在其开源活动中的利益。这将为他们提供引导企业达成开源的目标和愿景所需要的工具。微软设立与审查委员会相似的开源执行委员会。该小组由来自企业内部所有主要业务部门的副总裁组成,为政策变更和政策介绍提供董事会的建议,确定开源项目的优先顺序,协助推动企业变革。
  • 法律
    与企业内的其他职能部门一样,法律团队必须对开源项目办公室的运营拥有发言权,确保符合法律、开源许可协议以及其他法律规定。具体到开源项目,法律团队需要负责确保企业可以在内部使用代码并以可接受的条款回馈项目。规模较大的组织机构应考虑聘请或培养专职律师来为其开源项目提供建议。但企业也可以聘用兼职、有相关知识能力的工作人员或外部顾问。与在开源许可和知识产权有丰富知识与经验的律师合作往往很有帮助,因为他们是这方面的专家,但当涉及商业合同或标准时,他们有时也会有些困惑。
  • 合规团队
    开源项目的合规团队是一个由多人组成的跨学科团队,其任务是确保开源项目的合规性。核心团队通常被称为开源审查委员会(OSRB),由工程和产品团队、一名或多名法律顾问以及合规高级职员(常常是开源项目经理)组成。
    扩展团队由来自多个部门的不同人员组成,这些部门持续为合规工作做出贡献,包括文献资料、供应链、企业发展、IT、本地化、开源执行委员会(OSEC)等方面的贡献。然而,与核心团队不同,扩展团队的成员只根据他们从开源审查委员会(OSRB)收到的任务兼职开展合规工作。三星开源项目经理Ibrahim Haddad的《企业开源合规性(Open Source Compliance in the Enterprise)》书中的详细讨论了参与实现开源合规性的个体角色和责任。
  • 开发者关系、倡导和传播者
    开源开发者的关系和传播者对于一个刚起步的开源项目办公室十分重要,因为他们可以在公司的开发者社区内为特定项目培养兴趣和热情,也可以帮助提升工程师的积极性并促进其团队合作。传播工作者通常也可以参加会议和技术交流,讲解什么是开源,如何使用它以及未来的挑战和机遇,同时还能够与开源社区分享他们的企业经验。
  • 其他
    此外,设立其他工作职位对于开源项目办公室的成功是非常重要的,包括工具管理员、培训管理人员、工具和系统集成开发者、部署支持人员、项目实施负责人和开源传播人员。例如,有必要设立工具管理员,因为工具管理员能够选择、提供和集成开发其开源项目的工程师所需的工具,同时还能确保工具符合许可要求和企业其他要求。

政策和流程的制定

现在,为了公司的开源项目办公室的构建已经计划或组装了许多其他重要的组件。从它的创建到它的构架再到人事,都已经建立完成,下一步就是要制定明确的政策和流程,实现公司开源战略实施的一致性。

这些政策应该规定在整个公司内使用开源程序的要求和规则,还应该有文档记录和可执行的程序,以确保对日常基本规则的遵守。

关键的是,它们应该尽可能降低人员开销。微软关注开源项目办公室的政策和流程,目的是尽可能让开发者和其他团队成员不显眼。方法是在审查现有的开源政策和流程时采用反复淘汰、自动化审查和委托审查的形式,使规则不断地被质疑和更新从而简化程序。这意味着我们要思考为什么政策是到位的,以及如何为用户改进政策。

“制定明确的政策很好,但最低限度的政策必须明确。否则,你会遭到来自律师、安全人士、商界人士的约束。否则,很快就会被政策束缚,也就意味着所有人都将无法逆转局面。“

Jeff McAffer – 微软开源项目办公室主任

虽然这些规则是为开源项目办公室缜密设计的,但是随着时间推移和业务的变化以及开源合作的成熟和发展,公司必须随时准备改进和修改规则与程序。

这听起来似乎又是一个艰巨的步骤,但是就像开放源代码本身一样,示例规则和流程可以从开源代码库中获得,并且可以由企业自主实施和定制,这样一来任务就轻松许多。

在这些规则制定中,谷歌是最好的例子。谷歌于2017年初发布了开源政策供审阅和免费使用, 方便其他人了解公司如何使用、发布和支持开源以及如何参与项目和社区。基于安全和隐私的考虑,部分内容已被移除,但它提供了许多关于公司如何开展开源工作的经验教训。

在制定开源政策时,需要讨论许多话题,包括:

  • 如何接受外部对开源项目的贡献
  • 如何准备开源发布会
  • 如何获批
  • 开发人员如何使用他们在 GitHub 和其他代码库上找到的开源代码
  • 如何将开源代码引入公司的程序和规则
  • 如何将传入的代码编入目录以便其他人知晓它在被使用
  • 如何在外部创建一个类似的开发者社区,保持开源的蓬勃发展
  • 确定代码应何时以开源形式发布或保存为知识产权的规则

代码发布政策

若想帮助人们成功地为开源项目贡献力量,并发布自己的开源项目,那么相关的开源准则和清单要确保开发者拥有发布自己的开源代码需要的所有东西,确保他们不会遇到许可或保密等问题。特别是对于新的开源项目贡献者,这有助于他们对开源项目贡献之前通过安全的内部审阅过程获得反馈。(请参阅我们关于参与开源社区的指南)

您的组织也应该努力采取“上游先行”的发展策略。通过首先向上游开源项目提交补丁,并将补丁整合到自己下游的产品中的方式,您将避免在每次开源发布后花费大量时间和金钱进行重新设计。

贡献接受政策

除非您的开源项目位于中立的基础之上,否则您需要为您的公司制定程序,以便获得外部开发人员对您自己的开源项目的贡献支持。

“实际上,你并不想成为对开源项目的唯一贡献者。你希望让公司外部人员为开源项目做贡献,因为你不可能聘用世界上所有最聪明的人,这是不可能的,即使Google也做不到。“

Chris Aniszczyk – 云本地计算基金会首席运营官&Twitter前开源项目负责人

当然,获得外部开发人员的贡献值也是将公司的开源代码发布到其他社区,吸引其他开发人员对您的项目产生兴趣的益处之一。因为从宏观角度而言,即使这些外部开发人员不是正式员工,同样可以拥有世界各地的人才,完善公司代码,扩展功能。这种合作对于公司是非常重要的,也是许多开源项目办公室所关注的。

开源应用促进政策

您希望鼓励他人在他们的产品和服务中使用您的代码,这对于构建生态系统是至关重要的,同时还有助于开源项目的开发和维持。开源应用政策的制定可以有多种不同的创新形式。

Red Hat有一个独特的政策。通常他们从一开始就默认开源新创建的代码。这就意味着,研发公司内部软件时,默认这些软件将以开源形式发布。这是很吸引人的,因为通常情况下,工程师对他们的代码能否作为开源发布的态度不一,而开源其他人就会看到他们的代码。由于这种审查,他们会用更好的构建方法编写开源代码,这样他们就会在工作中创建更简洁的代码,这样的代码往往有较少的或已被改进过的代码依赖关系。

内部消耗政策

其他必要政策包括:团队应如何及在何处发现关于开源软件的使用与创建的可信资源的政策,关于代码管理和程序维护的建立的政策,以及规范化项目社区互动的政策。(请参阅我们的开源代码使用指南)

开源应用政策应确保任何进入产品基地的软件(专有的、第三方的或开源的软件)都经过审查、审核和批准。这样可以保障您公司在产品送达客户之前,有计划地履行因使用多种软件组件所产生的开源许可义务。

例如,您的政策可能要求工程师在整合产品中的任何开源代码之前,获得贵组织中如开源审查委员会(OSRB)这样的机构的的审计人员的批准。政策中还可以声明,从第三方收到的软件必须经过审核,以认定其中包含的所有开放源代码,这将确保企业可以在产品发货之前履行开源许可义务。

合规政策

您还需要制定建立和规范法律合规程序的政策以及保障项目执行监督工作的政策。(请参阅我们的电子书《企业中的开源合规性》,了解详细的合规项目)

您还想计划如何通过软件工具的自动化与开发人员和贡献者的工作流程的简化,实现大部分合规性和代码测试工作。例如,Linux 基金会的 SPDX 和 OpenChain 工具在内部供应链团队的帮助下,有效保障了第三方引入代码的合规性。

现今市场上有各类开源工具(如 FOSSology)和付费工具可以帮助完成这些重要任务,而且对于大多数开源项目办公室来说,他们可以将高质量且综合的工具有机结合,而无需建立自己的定制工具。这主要归功于开源过程中的通力协作,贡献者已经创建并完善了能为企业处理这些重要任务的工具。如果这些工具不能完全满足项目需求,那么可以通过用户反馈意见修改和改进工具以获得他们所需要的功能。您的开源项目办公室将很有可能支持围绕企业工具参与开源社区。

现有的开源资源对于寻找开源项目所需的其他材料(包括贡献者许可协议(CLA)文档)来说,犹如一座潜在的金矿。贡献者许可协议(CLA)定义了知识产权对开源软件的贡献条款。采用贡献者许可协议(CLA)的项目在接受贡献之前要求贡献者,通常还有他们的公司,签署贡献者许可协议(CLA)。

许多公司已经编制了自己的贡献者许可协议(CLA),但现在已有可直接作为开源协议使用的、无需从头开始编制的通用版本。您所需的大部分协议内容都可以在模板中找到,之后您可以自定义贡献者许可协议(CLA)以涵盖所有依然存在的问题。来自其他潜在的贡献公司的律师通常会接受标准条款的重复使用。

Google 内部定期使用各种工具来执行自动化代码检查,例如使用自定义过滤器等功能来执行自动化代码检查,这些功能可扫描代码库以检查许可证、许可证兼容性和其他因素。Google 每次发布新的 Android 或其他的应用程序时,都会进行自动化检查许可证的合规性流程,从而简化公司程序。不仅如此,由于这是自动化的流程,因此可以更轻松地向工程师说明该过程是简单且无缝的,且不会对他们使用自己的应用程序带来负担。

Google 所有的新入职工程师还需要接受一个小时的开源课程培训,该课程强调把开源许可和合规性检查作为开展公司业务的一部分。该公司分享的一条重要经验是,Google 不仅应按照法律许可要求履行许可义务,还应为社区做正确的事情而履行许可义务。如果在授权或代码使用方面出现明显错误,虽然 Google 的律师可以代表公司来处理这些问题,但公司本身对上传错误代码引起的社区地位受损还是非常敏感的。

“在开源社区中激怒朋友的后果是毁灭性的。这不是我们想做的事,因为我们关心这个社区,而且我们是社区的一员。至于新加入开源的公司,我认为他们往往没有认识到这一点的重要性。” 

Will Norris – 谷歌开源办公室经理

结语

当公司决定创建开源项目办公室时,需要做很多工作,考虑很多事情,但产生的价值可能会超过实现付出的努力。找到正确的领导者来推动项目办公室的建设倡议是取得成功的关键。

“这是一项文化变革的尝试。代码显然是其中的一个重要部分,但开源社区和参与者是人与人之间的事情。如果想建立一个开源项目办公室,并试图实现这项计划,那么你需要了解这种文化,并找到能够帮助将这种文化提升到一个新高度的人。那么你的开源主管一定是一位伟大的变革推动者。” 

Jeff McAffer – 微软开源项目办公室主任

工作列表模板

如果你对构建开源项目办公室有兴趣,而且有意愿去雇佣类似的角色,我们建议你参考下来自 TODO Group 正式的工作描述模板: https://github.com/todogroup/job-descriptions 。


TODO Group

这些资源是与 TODO(公开对话,开放式开发)小组 – Linux 基金会的专业开源程序网络小组合作创建的。 特别感谢那些贡献自己的时间和知识来制作这些综合指南的开源项目经理。 参与的公司包括 Autodesk,Comcast,Dropbox,Facebook,Google,Intel,Microsoft,Netflix,Oath(Yahoo + AOL),Red Hat,Salesforce和Samsung。 要了解更多信息,请访问:todogroup.org。 我们邀请您在 GitHub 上下载或参与这些指南。

更开放的分布式事务 | Fescar 品牌升级,更名为 Seata

$
0
0

Thanks, Fescar ️

Hello, Seata 🚀

升级后,一起再出发。

近日,分布式事务 Fescar 更名为 Seata。在 GitHub 上的项目地址相应的变更成: https://github.com/seata/seata

分布式事务产生背景

随着互联网技术快速发展,数据规模增大,分布式系统越来越普及,采用分布式数据库或者跨多个数据库的应用在中大规模企业普遍存在,而一个业务活动执行过程中可能会被意外中断(比如网络超时、数据库超时、机器重启、机器宕机等),我们很难保证一个业务活动的所有操作能 100% 全部成功。因此,微服务化过程中急需一种能保证业务一致性的方案,分布式事务应运而生。 

分布式事务在阿里巴巴和蚂蚁金服的发展历程

作为覆盖金融、云计算、新零售等多重领域的阿里经济体两端,蚂蚁金服和阿里巴巴在分布式事务上共同发力,在内部技术架构的演进中沉淀实践经验,通过不断的技术迭代支撑高速增长的 618、双十一等高并发业务场景。2007 开始,蚂蚁金服自主研发分布式事务分布式事务中间件 XTS(eXtended Transaction Service),在内部广泛应用并解决金融核心场景下的跨数据库、跨服务数据一致性问题,最终以 DTX(Distributed Transaction eXtended)的云产品化展现并对外开放。与此同时,阿里巴巴中间件团队发布 TXC(Taobao Transaction Constructor),为集团内应用提供分布式事务服务,经过多年的技术沉淀,于 2016 年产品化改造为 GTS(Global Transaction Service),通过阿里云解决方案在众多外部客户中落地实施。

2019 年 1 月,基于技术积累,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback, Fescar),和社区一起共建分布式事务解决方案。Fescar 为解决微服务架构下的分布式事务问题交出了一份与众不同的答卷。而 Fescar 的愿景是让分布式事务的使用像本地事务的使用一样简单和高效。最终的目标是希望可以让 Fescar 适用于所有的分布式事务场景。

为了达到适用于更多的分布式事务业务场景的目标,蚂蚁金服加入 Fescar 社区共建,在 Fescar 0.4.0 版本中加入了 TCC 模式。 

更开放的分布式事务 

蚂蚁金服的加入引发了社区核心成员的讨论,为了达到适用于所有的分布式事务业务场景的目标,也为了社区更中立、更开放、生态更加丰富,社区核心成员们决定进行品牌升级,改名 Seata。Seata 意为:Simple Extensible Autonomous Transaction Architecture,是一套一站式分布式事务解决方案。

项目地址:https://github.com/seata/seata

Hello Seata!

分布式事务 Seata 的近期规划

Seata 目前产生于阿里巴巴和蚂蚁金服的业务需求,而市场上真实的生产情况更加多样化。我们决定建立一个完全中立的分布式事务组织,未来,希望更多的企业、开发者能够加入一起创造。

自开源以来,Seata 一直受益于社区的参与者的贡献。感谢开发者们的关注和贡献,截止目前,分布式事务 Seata 已经拥有超过 7000 的 Star ,超 55 位 Contributors,开发者们的加入,使得社区的生态更加丰富也更有活力。 

2019 年 5 月,Seata 将加入服务端 HA 集群支持,从此,Seata 可以达到生产环境使用的标准。 

欢迎对分布式事务有热情的开发者们加入社区的共建中来,为 Seata 带来更多的想象空间。

关于蚂蚁金融科技开源,点击“此处”可了解更多。

Arch-Wiki-Man:一个以 Linux Man 手册样式离线浏览 Arch Wiki 的工具

$
0
0

现在上网已经很方便了,但技术上会有限制。看到技术的发展,我很惊讶,但与此同时,各种地方也都会出现衰退。

当你搜索有关其他 Linux 发行版的某些东西时,大多数时候你会得到的是一个第三方的链接,但是对于 Arch Linux 来说,每次你都会得到 Arch Wiki 页面的结果。

因为 Arch Wiki 提供了除第三方网站以外的大多数解决方案。

到目前为止,你也许可以使用 Web 浏览器为你的 Arch Linux 系统找到一个解决方案,但现在你可以不用这么做了。

一个名为 arch-wiki-man 的工具提供了一个在命令行中更快地执行这个操作的方案。如果你是一个 Arch Linux 爱好者,我建议你阅读 Arch Linux 安装后指南,它可以帮助你调整你的系统以供日常使用。

arch-wiki-man 是什么?

arch-wiki-man 工具允许用户从命令行(CLI)中离线搜索 Arch Wiki 页面。它允许用户以 Linux Man 手册样式访问和搜索整个 Wiki 页面。

而且,你无需切换到 GUI。更新将每两天自动推送一次,因此,你的 Arch Wiki 本地副本页面将是最新的。这个工具的名字是 awmanawman 是 “Arch Wiki Man” 的缩写。

我们之前写过一篇类似工具 Arch Wiki 命令行实用程序(arch-wiki-cli)的文章。这个工具允许用户从互联网上搜索 Arch Wiki。但你需要在线使用这个实用程序。

如何安装 arch-wiki-man 工具?

arch-wiki-man 工具可以在 AUR 仓库(LCTT 译注:AUR 即Arch 用户软件仓库Arch User Repository)中获得,因此,我们需要使用 AUR 工具来安装它。有许多 AUR 工具可用,而且我们曾写了一篇关于流行的 AUR 辅助工具: Yaourt AUR helperPacker AUR helper 的文章。

$ yaourt -S arch-wiki-man

$ packer -S arch-wiki-man

或者,我们可以使用 npm 包管理器来安装它,确保你已经在你的系统上安装了 NodeJS。然后运行以下命令来安装它。

$ npm install -g arch-wiki-man

如何更新 Arch Wiki 本地副本?

正如前面更新的那样,更新每两天自动推送一次,也可以通过运行以下命令来完成更新。

$ sudo awman-update
[sudo] password for daygeek:
[email protected] /usr/lib/node_modules/arch-wiki-man
└── [email protected]

arch-wiki-md-repo has been successfully updated or reinstalled.

awman-update 是一种更快、更方便的更新方法。但是,你也可以通过运行以下命令重新安装 arch-wiki-man 来获取更新。

$ yaourt -S arch-wiki-man

$ packer -S arch-wiki-man

如何在终端中使用 Arch Wiki ?

它有着简易的接口且易于使用。想要搜索,只需要运行 awman 加搜索项目。一般语法如下所示。

$ awman Search-Term

如何搜索多个匹配项?

如果希望列出包含 “installation” 字符串的所有结果的标题,运行以下格式的命令,如果输出有多个结果,那么你将会获得一个选择菜单来浏览每个项目。

$ awman installation

详细页面的截屏:

在标题和描述中搜索给定的字符串

-d--desc-search 选项允许用户在标题和描述中搜索给定的字符串。

$ awman -d mirrors

$ awman --desc-search mirrors
? Select an article: (Use arrow keys)
❯ [1/3] Mirrors: Related articles
  [2/3] DeveloperWiki-NewMirrors: Contents
  [3/3] Powerpill: Powerpill is a pac

在内容中搜索给定的字符串

-k--apropos 选项也允许用户在内容中搜索给定的字符串。但须注意,此选项会显著降低搜索速度,因为此选项会扫描整个 Wiki 页面的内容。

$ awman -k openjdk

$ awman --apropos openjdk
? Select an article: (Use arrow keys)
❯ [1/26] Hadoop: Related articles
 [2/26] XDG Base Directory support: Related articles
 [3/26] Steam-Game-specific troubleshooting: See Steam/Troubleshooting first.
 [4/26] Android: Related articles
 [5/26] Elasticsearch: Elasticsearch is a search engine based on Lucene. It provides a distributed, mul..
 [6/26] LibreOffice: Related articles
 [7/26] Browser plugins: Related articles
(Move up and down to reveal more choices)

在浏览器中打开搜索结果

-w--web 选项允许用户在 Web 浏览器中打开搜索结果。

$ awman -w AUR helper

$ awman --web AUR helper

以其他语言搜索

想要查看支持的语言列表,请运行以下命令。

$ awman --list-languages
arabic
bulgarian
catalan
chinesesim
chinesetrad
croatian
czech
danish
dutch
english
esperanto
finnish
greek
hebrew
hungarian
indonesian
italian
korean
lithuanian
norwegian
polish
portuguese
russian
serbian
slovak
spanish
swedish
thai
ukrainian

使用你的首选语言运行 awman 命令以查看除英语以外的其他语言的结果。

$ awman -l chinesesim deepin


via: https://www.2daygeek.com/arch-wiki-man-a-tool-to-browse-the-arch-wiki-pages-as-linux-man-page-from-offline/

作者:Prakash Subramanian 选题:lujun9972 译者:Auk7F7 校对:wxy

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

在 Linux 中使用 bd 命令快速返回到特定的父目录

$
0
0

两天前我们写了一篇关于 autocd 的文章,它是一个内置的 shell 变量,可以帮助我们在没有 cd 命令的情况下导航到目录中

如果你想回到上一级目录,那么你需要输入 cd ..

如果你想回到上两级目录,那么你需要输入 cd ../..

这在 Linux 中是正常的,但如果你想从第九级目录回到第三级目录,那么使用 cd 命令是很糟糕的。

有什么解决方案呢?

是的,在 Linux 中有一个解决方案。我们可以使用 bd 命令来轻松应对这种情况。

什么是 bd 命令?

bd 命令允许用户快速返回 Linux 中的父目录,而不是反复输入 cd ../../..

你可以列出给定目录的内容,而不用提供完整路径 ls bd Directory_Name。它支持以下其它命令,如 lslnechoziptar 等。

另外,它还允许我们执行 shell 文件而不用提供完整路径 bd p/shell_file.sh

如何在 Linux 中安装 bd 命令?

除了 Debian/Ubuntu 之外,bd 没有官方发行包。因此,我们需要手动执行方法。

对于 Debian/Ubuntu 系统,使用 APT-GET 命令APT 命令来安装 bd

$ sudo apt install bd

对于其它 Linux 发行版,使用 wget 命令下载 bd 可执行二进制文件。

$ sudo wget --no-check-certificate -O /usr/local/bin/bd https://raw.github.com/vigneshwaranr/bd/master/bd

设置 bd 二进制文件的可执行权限。

$ sudo chmod +rx /usr/local/bin/bd

.bashrc 文件中添加以下值。

$ echo 'alias bd=". bd -si"' >> ~/.bashrc

运行以下命令以使更改生效。

$ source ~/.bashrc

要启用自动完成,执行以下两个步骤。

$ sudo wget -O /etc/bash_completion.d/bd https://raw.github.com/vigneshwaranr/bd/master/bash_completion.d/bd  
$ sudo source /etc/bash_completion.d/bd

我们已经在系统上成功安装并配置了 bd 实用程序,现在是时候测试一下了。

我将使用下面的目录路径进行测试。

运行 pwd 命令或 dirs 命令,亦或是 tree 命令来了解你当前的路径。

daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ pwd
或
daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ dirs

/usr/share/icons/Adwaita/256x256/apps

我现在在 /usr/share/icons/Adwaita/256x256/apps 目录,如果我想快速跳转到 icons 目录,那么只需输入以下命令即可。

daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ bd icons
/usr/share/icons/
daygeek@Ubuntu18:/usr/share/icons$

甚至,你不需要输入完整的目录名称,也可以输入几个字母。

daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ bd i
/usr/share/icons/
daygeek@Ubuntu18:/usr/share/icons$ 

注意:如果层次结构中有多个同名的目录,bd 会将你带到最近的目录。(不考虑直接的父目录)

如果要列出给定的目录内容,使用以下格式。它会打印出 /usr/share/icons/ 的内容。

$ ls -lh `bd icons`
或
daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ ls -lh `bd i`
total 64K
drwxr-xr-x 12 root root 4.0K Jul 25  2018 Adwaita
lrwxrwxrwx  1 root root   51 Feb 25 14:32 communitheme -> /snap/communitheme/current/share/icons/communitheme
drwxr-xr-x  2 root root 4.0K Jul 25  2018 default
drwxr-xr-x  3 root root 4.0K Jul 25  2018 DMZ-Black
drwxr-xr-x  3 root root 4.0K Jul 25  2018 DMZ-White
drwxr-xr-x  9 root root 4.0K Jul 25  2018 gnome
drwxr-xr-x  3 root root 4.0K Jul 25  2018 handhelds
drwxr-xr-x 20 root root 4.0K Mar  9 14:52 hicolor
drwxr-xr-x  9 root root 4.0K Jul 25  2018 HighContrast
drwxr-xr-x 12 root root 4.0K Jul 25  2018 Humanity
drwxr-xr-x  7 root root 4.0K Jul 25  2018 Humanity-Dark
drwxr-xr-x  4 root root 4.0K Jul 25  2018 locolor
drwxr-xr-x  3 root root 4.0K Feb 25 15:46 LoginIcons
drwxr-xr-x  3 root root 4.0K Jul 25  2018 redglass
drwxr-xr-x 10 root root 4.0K Feb 25 15:46 ubuntu-mono-dark
drwxr-xr-x 10 root root 4.0K Feb 25 15:46 ubuntu-mono-light
drwxr-xr-x  3 root root 4.0K Jul 25  2018 whiteglass

如果要在父目录中的某个位置执行文件,使用以下格式。它将运行 shell 文件 /usr/share/icons/users-list.sh

$ `bd i`/users-list.sh
或
daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ `bd icon`/users-list.sh
daygeek
thanu
renu
2gadmin
testuser
demouser
sudha
suresh
user1
user2
user3

如果你位于 /usr/share/icons/Adwaita/256x256/apps 中,想要导航到不同的父目录,使用以下格式。以下命令将导航到 /usr/share/icons/gnome 目录。

$ cd `bd i`/gnome
或
daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ cd `bd icon`/gnome
daygeek@Ubuntu18:/usr/share/icons/gnome$ 

如果你位于 /usr/share/icons/Adwaita/256x256/apps ,你想在 /usr/share/icons/ 下创建一个新目录,使用以下格式。

$ daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ sudo mkdir `bd icons`/2g

daygeek@Ubuntu18:/usr/share/icons/Adwaita/256x256/apps$ ls -ld `bd icon`/2g
drwxr-xr-x 2 root root 4096 Mar 16 05:44 /usr/share/icons//2g

本教程允许你快速返回到特定的父目录,但没有快速前进的选项。

我们有另一个解决方案,很快就会提出,请保持关注。


via: https://www.2daygeek.com/bd-quickly-go-back-to-a-specific-parent-directory-in-linux/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:MjSeven 校对:wxy

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

Linux 爸爸怒怼社交媒体:在座的各位都是垃圾

$
0
0

科技先锋 Linus Torvalds 表示,当今社交媒体运作的方式暗中鼓励人们的不良行为。“它们就是一种恶疾。”

让我们来数数当今社会里还有多少不对社交媒体表示“喜欢”的人。

Linus Torvalds,荷兰裔美国人,自由软件 Linux 的创始人。Linux 是一款同苹果的 MacOS 和微软的 Windows 竞争的操作系统。在本周 Linux Journal 的采访中,Torvalds 在谈到 Facebook、Twitter 和 Instagram 时并没有小心翼翼地斟酌词语,而是大胆表示它们是如今技术产业最大的毒瘤之一。

“我真的很讨厌现代的`社交媒体‘ —— Twitter,Facebook,Instagram。它们就是一种恶疾,它们鼓励人们作出不良行为。”这是他对于『在现代科技产业中你想修正什么』这个问题的回答。“那些`喜欢’和`分享‘的机制完全就是垃圾,对于内容质量的把控根本没有帮助。事实上,它起到了反效果。为了吸引更大的用户群体和尽可能多的用户点击,那些传播广泛的文章都旨在引起人们强烈的情感反应,因此它们总是打破道德底线。”

Torvlads,这位在 1994 年推出初版 Linux 的 Linux 创始人,他在技术社区里就以言行粗鲁闻名。不过他并不是唯一一个不喜欢社交媒体的人。

研究表示,人们对于社交媒体的好感度在近几年显著下降。主要是因为,它们在一定程度上促进了骚扰、不良行为甚至恐怖活动。这给 Facebook、Twitter 以及 Instagram 蒙上了一层阴影,即使它们的正常活动也受到人们猜忌。

Torvalds 认为,导致这些事故的根本原因是匿名性。

“如果你不把你的真实姓名放在你的垃圾(或者你分享 & 喜欢的垃圾)上面,那么它们就是垃圾。”反之,他认为,人们不应该在没有首先证明自己身份的情况下分享或喜欢事物。

Facebook、Twitter 和 Instagram 目前并没有回应记者的置评要求。

小白观察:微信朋友圈@好友评论互动能力全量开放

$
0
0

头图

Big News

微信朋友圈@好友评论互动能力全量开放:根据微信广告助手的最新推文,自 2019 年 4 月 8 日起,朋友圈广告@好友评论互动能力全量开放。所有朋友圈广告默认具备@好友评论互动的能力。用户收到朋友圈广告后,可以跟点赞、评论一样,在广告的评论区@好友与其进行互动。

网友评论:“平时拉黑屏蔽好友已经够烦了,还要出艾特”,“都别艾特我,买不起[doge]“

朋友圈的各种转发已经让不少人开始逃离朋友圈了,广告的 @ 评论会成为一个新的让人厌恶朋友圈的点。此外,基于广告的社交看起来更像是一个伪需求,回想一下,你上一次和朋友讨论一个广告是什么时候?

信息来源:【微信广告助手】

Quick News

  • 京东坚决淘汰三类人,开启裁员步伐:近日网络社交应用“脉脉”上爆出京东坚决裁员三类人“不能拼搏的人”、“不能干的人”、“性价比低的人”,因日热议。京东回应此为片面解读。【微博】
  • 首条 3D 刷脸地铁在济南开启运营:济南地铁一号线开启商业运营,该线路是目前国内首条采用3D人脸识别闸机的地铁线路,乘客在入站的时候对准设备进行扫描,只需要2秒就能过闸机。【站长之家】
  • 5G移动网被吐槽,信号太难找,速度不稳定:外媒 CNET 编辑 Jessica Dolcourt 对美国电信巨头 Verizon 公司的 5G 网络进行了线下的街头测试,并评价 “我特么就一个词:沮丧极了,简直疯了!(all I can honestly say after a long day is that I found it confusing. Frustrating. Absolutely insane. )”。【CNET】

如何设置 Linux 系统的密码策略

$
0
0

虽然 Linux 的设计是安全的,但还是存在许多安全漏洞的风险,弱密码就是其中之一。作为系统管理员,你必须为用户提供一个强密码。因为大部分的系统漏洞就是由于弱密码而引发的。本教程描述了在基于 DEB 系统的 Linux,比如 Debian、Ubuntu、Linux Mint 等和基于 RPM 系统的 Linux,比如 RHEL、CentOS、Scientific Linux 等的系统下设置像密码长度密码复杂度密码有效期等密码策略。

在基于 DEB 的系统中设置密码长度

默认情况下,所有的 Linux 操作系统要求用户密码长度最少 6 个字符。我强烈建议不要低于这个限制。并且不要使用你的真实名称、父母、配偶、孩子的名字,或者你的生日作为密码。即便是一个黑客新手,也可以很快地破解这类密码。一个好的密码必须是至少 6 个字符,并且包含数字、大写字母和特殊符号。

通常地,在基于 DEB 的操作系统中,密码和身份认证相关的配置文件被存储在 /etc/pam.d/ 目录中。

设置最小密码长度,编辑 /etc/pam.d/common-password 文件;

$ sudo nano /etc/pam.d/common-password

找到下面这行:

password [success=2 default=ignore] pam_unix.so obscure sha512

在末尾添加额外的文字:minlen=8。在这里我设置的最小密码长度为 8

password [success=2 default=ignore] pam_unix.so obscure sha512 minlen=8

保存并关闭该文件。这样一来,用户现在不能设置小于 8 个字符的密码。

在基于 RPM 的系统中设置密码长度

在 RHEL、CentOS、Scientific Linux 7.x 系统中, 以 root 身份执行下面的命令来设置密码长度。

# authconfig --passminlen=8 --update

查看最小密码长度,执行:

# grep "^minlen" /etc/security/pwquality.conf

输出样例:

minlen = 8

在 RHEL、CentOS、Scientific Linux 6.x 系统中,编辑 /etc/pam.d/system-auth 文件:

# nano /etc/pam.d/system-auth

找到下面这行并在该行末尾添加:

password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8

如上设置中,最小密码长度是 8 个字符。

在基于 DEB 的系统中设置密码复杂度

此设置会强制要求密码中应该包含多少类型,比如大写字母、小写字母和其他字符。

首先,用下面命令安装密码质量检测库:

$ sudo apt-get install libpam-pwquality

之后,编辑 /etc/pam.d/common-password 文件:

$ sudo nano /etc/pam.d/common-password

为了设置密码中至少有一个大写字母,则在下面这行的末尾添加文字 ucredit=-1

password requisite pam_pwquality.so retry=3 ucredit=-1

设置密码中至少有一个小写字母,如下所示。

password requisite pam_pwquality.so retry=3 dcredit=-1

设置密码中至少含有其他字符,如下所示。

password requisite pam_pwquality.so retry=3 ocredit=-1

正如你在上面样例中看到的一样,我们设置了密码中至少含有一个大写字母、一个小写字母和一个特殊字符。你可以设置被最大允许的任意数量的大写字母、小写字母和特殊字符。

你还可以设置密码中被允许的字符类的最大或最小数量。

下面的例子展示了设置一个新密码中被要求的字符类的最小数量:

password requisite pam_pwquality.so retry=3 minclass=2

在基于 RPM 的系统中设置密码复杂度

在 RHEL 7.x / CentOS 7.x / Scientific Linux 7.x 中:

设置密码中至少有一个小写字母,执行:

# authconfig --enablereqlower --update

查看该设置,执行:

# grep "^lcredit" /etc/security/pwquality.conf

输出样例:

lcredit = -1

类似地,使用以下命令去设置密码中至少有一个大写字母:

# authconfig --enablerequpper --update

查看该设置:

# grep "^ucredit" /etc/security/pwquality.conf

输出样例:

ucredit = -1

设置密码中至少有一个数字,执行:

# authconfig --enablereqdigit --update

查看该设置,执行:

# grep "^dcredit" /etc/security/pwquality.conf

输出样例:

dcredit = -1

设置密码中至少含有一个其他字符,执行:

# authconfig --enablereqother --update

查看该设置,执行:

# grep "^ocredit" /etc/security/pwquality.conf

输出样例:

ocredit = -1

RHEL 6.x / CentOS 6.x / Scientific Linux 6.x systems 中,以 root 身份编辑 /etc/pam.d/system-auth 文件:

# nano /etc/pam.d/system-auth

找到下面这行并且在该行末尾添加:

password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1

如上设置中,密码必须要至少包含 8 个字符。另外,密码必须至少包含一个大写字母、一个小写字母、一个数字和一个其他字符。

在基于 DEB 的系统中设置密码有效期

现在,我们将要设置下面的策略。

  1. 密码被使用的最长天数。
  2. 密码更改允许的最小间隔天数。
  3. 密码到期之前发出警告的天数。

设置这些策略,编辑:

$ sudo nano /etc/login.defs

在你的每个需求后设置值。

PASS_MAX_DAYS 100
PASS_MIN_DAYS 0
PASS_WARN_AGE 7

正如你在上面样例中看到的一样,用户应该每 100 天修改一次密码,并且密码到期之前的 7 天开始出现警告信息。

请注意,这些设置将会在新创建的用户中有效。

为已存在的用户设置修改密码的最大间隔天数,你必须要运行下面的命令:

$ sudo chage -M <days> <username>

设置修改密码的最小间隔天数,执行:

$ sudo chage -m <days> <username>

设置密码到期之前的警告,执行:

$ sudo chage -W <days> <username>

显示已存在用户的密码,执行:

$ sudo chage -l sk

这里,sk 是我的用户名。

输出样例:

Last password change : Feb 24, 2017
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

正如你在上面看到的输出一样,该密码是无限期的。

修改已存在用户的密码有效期,

$ sudo chage -E 24/06/2018 -m 5 -M 90 -I 10 -W 10 sk

上面的命令将会设置用户 sk 的密码期限是 24/06/2018。并且修改密码的最小间隔时间为 5 天,最大间隔时间为 90 天。用户账号将会在 10 天后被自动锁定,而且在到期之前的 10 天前显示警告信息。

在基于 RPM 的系统中设置密码效期

这点和基于 DEB 的系统是相同的。

在基于 DEB 的系统中禁止使用近期使用过的密码

你可以限制用户去设置一个已经使用过的密码。通俗的讲,就是说用户不能再次使用相同的密码。

为设置这一点,编辑 /etc/pam.d/common-password 文件:

$ sudo nano /etc/pam.d/common-password

找到下面这行并且在末尾添加文字 remember=5

password        [success=2 default=ignore]      pam_unix.so obscure use_authtok try_first_pass sha512 remember=5

上面的策略将会阻止用户去使用最近使用过的 5 个密码。

在基于 RPM 的系统中禁止使用近期使用过的密码

这点对于 RHEL 6.x 和 RHEL 7.x 和它们的衍生系统 CentOS、Scientific Linux 是相同的。

以 root 身份编辑 /etc/pam.d/system-auth 文件,

# vi /etc/pam.d/system-auth

找到下面这行,并且在末尾添加文字 remember=5

password     sufficient     pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5

现在你了解了 Linux 中的密码策略,以及如何在基于 DEB 和 RPM 的系统中设置不同的密码策略。

就这样,我很快会在这里发表另外一天有趣而且有用的文章。在此之前请保持关注。如果您觉得本教程对你有帮助,请在您的社交,专业网络上分享并支持我们。


via: https://www.ostechnix.com/how-to-set-password-policies-in-linux/

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

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


每日安全资讯:计算机科学家发布不会被黑的加密代码

$
0
0

程序员都是凡人,但数学则是不朽的。通过让编程变得更数学化,计算机科学家希望能消除向黑客敞开大门的编程错误。研究人员在 GitHub 上发布了加密工具 EverCrypt,向这个目标迈出了一大步。

就像证明毕达哥拉斯定理那样,他们能证明 EverCrypt 可完全避开多种黑客攻击。

EverCrypt 没有采用常见的编程方法编写,而是利用了形式化验证。他们首先明确代码能做什么,然后证明只能这么做,排除了代码在特殊情况下偏离的可能性。

EverCrypt 始于 2016 年,是微软研究院项目&nbsproject Everest 的一部分,当时加密库是许多软件的薄弱环节,存在大量 bug。

来源:solidot.org

更多资讯

◈ Google Chrome 等浏览器不再允许关闭点击跟踪

Chrome、Safari、Opera 和 Microsoft Edge 的新版本将不再允许用户关闭“链接审计 hyperlink auditing”的功能。链接审计是一项 HTML 标准,被用于跟踪网站链接的点击。它通过创建特定网页的 POST 请求,用户检查请求头文件就可以了解点击的源地址。

来源: solidot.org
详情: http://t.cn/E6MkXbD 

◈ 4 月编程语言排行榜:C++ 重回前三 PHP 呈下降势头

TIOBE 公布了 2019 年 4 月编程语言排行榜,总体排名变化不大,排名前十的分别是:Java、C、C++、Python、Visual Basic .NET、C#、JavaScript、SQL、PHP 和 汇编语言。不过与上期相比,依然有值得关注的亮点。

来源: cnBeta.COM
详情: http://t.cn/E6MkRBv 

◈ 英国收紧社交媒体审查 向仇恨言论等网络安全问题说不

英国政府在网络安全方面将继续采取强硬立场,近期将会成立全球首家专门负责社交媒体公司的独立监管机构。对于没有达到要求的公司不仅要面临巨额的罚款,而且公司的高管负责人因工作疏忽需要承担个人责任。

来源: 开源中国
详情: http://t.cn/E6Mk1jH 

◈ 研究人员发现中国企业简历信息泄露:涉 5.9 亿份简历

据美国科技媒体ZDNet报道,有研究人员发现,中国企业今年前3个月出现数起简历信息泄漏事故,涉及5.9亿份简历。大多数简历之所以泄露,主要是因为MongoDB和ElasticSearch服务器安全措施不到位,不需要密码就能在网上看到信息,或者是因为防火墙出现错误导致。

来源: 新浪科技
详情: http://t.cn/E6MksYr 

(信息来源于网络,安华金和搜集整理)

计算机实验室之树莓派:课程 11 输入02

$
0
0

课程输入 02 是以课程输入 01 为基础讲解的,通过一个简单的命令行实现用户的命令输入和计算机的处理和显示。本文假设你已经具备 课程11:输入01 的操作系统代码基础。

1、终端

几乎所有的操作系统都是以字符终端显示启动的。经典的黑底白字,通过键盘输入计算机要执行的命令,然后会提示你拼写错误,或者恰好得到你想要的执行结果。这种方法有两个主要优点:键盘和显示器可以提供简易、健壮的计算机交互机制,几乎所有的计算机系统都采用这个机制,这个也广泛被系统管理员应用。

早期的计算一般是在一栋楼里的一个巨型计算机系统,它有很多可以输命令的'终端'。计算机依次执行不同来源的命令。

让我们分析下真正想要哪些信息:

  1. 计算机打开后,显示欢迎信息
  2. 计算机启动后可以接受输入标志
  3. 用户从键盘输入带参数的命令
  4. 用户输入回车键或提交按钮
  5. 计算机解析命令后执行可用的命令
  6. 计算机显示命令的执行结果,过程信息
  7. 循环跳转到步骤 2

这样的终端被定义为标准的输入输出设备。用于(显示)输入的屏幕和打印输出内容的屏幕是同一个(LCTT 译注:最早期的输出打印真是“打印”到打印机/电传机的,而用于输入的终端只是键盘,除非做了回显,否则输出终端是不会显示输入的字符的)。也就是说终端是对字符显示的一个抽象。字符显示中,单个字符是最小的单元,而不是像素。屏幕被划分成固定数量不同颜色的字符。我们可以在现有的屏幕代码基础上,先存储字符和对应的颜色,然后再用方法 DrawCharacter 把其推送到屏幕上。一旦我们需要字符显示,就只需要在屏幕上画出一行字符串。

新建文件名为 terminal.s,如下:

.section .data
.align 4
terminalStart:
.int terminalBuffer
terminalStop:
.int terminalBuffer
terminalView:
.int terminalBuffer
terminalColour:
.byte 0xf
.align 8
terminalBuffer:
.rept 128*128
.byte 0x7f
.byte 0x0
.endr
terminalScreen:
.rept 1024/8 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 768/16
.byte 0x7f
.byte 0x0
.endr

这是文件终端的配置数据文件。我们有两个主要的存储变量:terminalBufferterminalScreenterminalBuffer 保存所有显示过的字符。它保存 128 行字符文本(1 行包含 128 个字符)。每个字符有一个 ASCII 字符和颜色单元组成,初始值为 0x7f(ASCII 的删除字符)和 0(前景色和背景色为黑)。terminalScreen 保存当前屏幕显示的字符。它保存 128x48 个字符,与 terminalBuffer 初始化值一样。你可能会觉得我仅需要 terminalScreen 就够了,为什么还要terminalBuffer,其实有两个好处:

  1. 我们可以很容易看到字符串的变化,只需画出有变化的字符。
  2. 我们可以回滚终端显示的历史字符,也就是缓冲的字符(有限制)

这种独特的技巧在低功耗系统里很常见。画屏是很耗时的操作,因此我们仅在不得已的时候才去执行这个操作。在这个系统里,我们可以任意改变 terminalBuffer,然后调用一个仅拷贝屏幕上字节变化的方法。也就是说我们不需要持续画出每个字符,这样可以节省一大段跨行文本的操作时间。

你总是需要尝试去设计一个高效的系统,如果在很少变化的情况下这个系统会运行的更快。

其他在 .data 段的值得含义如下:

  • terminalStart 写入到 terminalBuffer 的第一个字符
  • terminalStop 写入到 terminalBuffer 的最后一个字符
  • terminalView 表示当前屏幕的第一个字符,这样我们可以控制滚动屏幕
  • temrinalColour 即将被描画的字符颜色

terminalStart 需要保存起来的原因是 termainlBuffer 是一个环状缓冲区。意思是当缓冲区变满时,末尾地方会回滚覆盖开始位置,这样最后一个字符变成了第一个字符。因此我们需要将 terminalStart 往前推进,这样我们知道我们已经占满它了。如何实现缓冲区检测:如果索引越界到缓冲区的末尾,就将索引指向缓冲区的开始位置。环状缓冲区是一个比较常见的存储大量数据的高明方法,往往这些数据的最近部分比较重要。它允许无限制的写入,只保证最近一些特定数据有效。这个常常用于信号处理和数据压缩算法。这样的情况,可以允许我们存储 128 行终端记录,超过128行也不会有问题。如果不是这样,当超过第 128 行时,我们需要把 127 行分别向前拷贝一次,这样很浪费时间。

显示 Hellow world 插入到大小为5的循环缓冲区的示意图。

环状缓冲区是数据结构一个例子。这是一个组织数据的思路,有时我们通过软件实现这种思路。

之前已经提到过 terminalColour 几次了。你可以根据你的想法实现终端颜色,但这个文本终端有 16 个前景色和 16 个背景色(这里相当于有 162 = 256 种组合)。CGA终端的颜色定义如下:

表格 1.1 - CGA 颜色编码

序号 颜色 (R, G, B)
0 黑 (0, 0, 0)
1 蓝 (0, 0, ⅔)
2 绿 (0, ⅔, 0)
3 青色 (0, ⅔, ⅔)
4 红色 (⅔, 0, 0)
5 品红 (⅔, 0, ⅔)
6 棕色 (⅔, ⅓, 0)
7 浅灰色 (⅔, ⅔, ⅔)
8 灰色 (⅓, ⅓, ⅓)
9 淡蓝色 (⅓, ⅓, 1)
10 淡绿色 (⅓, 1, ⅓)
11 淡青色 (⅓, 1, 1)
12 淡红色 (1, ⅓, ⅓)
13 浅品红 (1, ⅓, 1)
14 黄色 (1, 1, ⅓)
15 白色 (1, 1, 1)

我们将前景色保存到颜色的低字节,背景色保存到颜色高字节。除了棕色,其他这些颜色遵循一种模式如二进制的高位比特代表增加 ⅓ 到每个组件,其他比特代表增加 ⅔ 到各自组件。这样很容易进行 RGB 颜色转换。

棕色作为替代色(黑黄色)既不吸引人也没有什么用处。

我们需要一个方法从 TerminalColour 读取颜色编码的四个比特,然后用 16 比特等效参数调用 SetForeColour。尝试你自己实现。如果你感觉麻烦或者还没有完成屏幕系列课程,我们的实现如下:

.section .text
TerminalColour:
teq r0,#6
ldreq r0,=0x02B5
beq SetForeColour

tst r0,#0b1000
ldrne r1,=0x52AA
moveq r1,#0
tst r0,#0b0100
addne r1,#0x15
tst r0,#0b0010
addne r1,#0x540
tst r0,#0b0001
addne r1,#0xA800
mov r0,r1
b SetForeColour

2、文本显示

我们的终端第一个真正需要的方法是 TerminalDisplay,它用来把当前的数据从 terminalBuffer拷贝到 terminalScreen 和实际的屏幕。如上所述,这个方法必须是最小开销的操作,因为我们需要频繁调用它。它主要比较 terminalBufferterminalDisplay 的文本,然后只拷贝有差异的字节。请记住 terminalBuffer 是以环状缓冲区运行的,这种情况,就是从 terminalViewterminalStop,或者 128*48 个字符,要看哪个来的最快。如果我们遇到 terminalStop,我们将会假定在这之后的所有字符是 7f16 (ASCII 删除字符),颜色为 0(黑色前景色和背景色)。

让我们看看必须要做的事情:

  1. 加载 terminalViewterminalStopterminalDisplay 的地址。
  2. 对于每一行:
    1. 对于每一列:
      1. 如果 terminalView 不等于 terminalStop,根据 terminalView 加载当前字符和颜色
      2. 否则加载 0x7f 和颜色 0
      3. terminalDisplay 加载当前的字符
      4. 如果字符和颜色相同,直接跳转到第 10 步
      5. 存储字符和颜色到 terminalDisplay
      6. r0 作为背景色参数调用 TerminalColour
      7. r0 = 0x7f(ASCII 删除字符,一个块)、 r1 = xr2 = y 调用 DrawCharacter
      8. r0 作为前景色参数调用 TerminalColour
      9. r0 = 字符r1 = xr2 = y 调用 DrawCharacter
      10. 对位置参数 terminalDisplay 累加 2
      11. 如果 terminalView 不等于 terminalStopterminalView 位置参数累加 2
      12. 如果 terminalView 位置已经是文件缓冲器的末尾,将它设置为缓冲区的开始位置
      13. x 坐标增加 8
    2. y 坐标增加 16

尝试去自己实现吧。如果你遇到问题,我们的方案下面给出来了:

1、我这里的变量有点乱。为了方便起见,我用 taddr 存储 textBuffer 的末尾位置。

.globl TerminalDisplay
TerminalDisplay:
push {r4,r5,r6,r7,r8,r9,r10,r11,lr}
x .req r4
y .req r5
char .req r6
col .req r7
screen .req r8
taddr .req r9
view .req r10
stop .req r11

ldr taddr,=terminalStart
ldr view,[taddr,#terminalView - terminalStart]
ldr stop,[taddr,#terminalStop - terminalStart]
add taddr,#terminalBuffer - terminalStart
add taddr,#128*128*2
mov screen,taddr

2、从 yLoop 开始运行。

mov y,#0
yLoop$:

2.1、

mov x,#0
xLoop$:

xLoop 开始运行。

2.1.1、为了方便起见,我把字符和颜色同时加载到 char 变量了

teq view,stop
ldrneh char,[view]

2.1.2、这行是对上面一行的补充说明:读取黑色的删除字符

moveq char,#0x7f

2.1.3、为了简便我把字符和颜色同时加载到 col 里。

ldrh col,[screen]

2.1.4、 现在我用 teq 指令检查是否有数据变化

teq col,char
beq xLoopContinue$

2.1.5、我可以容易的保存当前值

strh char,[screen]

2.1.6、我用比特偏移指令 lsrand 指令从切分 char 变量,将颜色放到 col 变量,字符放到 char 变量,然后再用比特偏移指令 lsr 获取背景色后调用 TerminalColour

lsr col,char,#8
and char,#0x7f
lsr r0,col,#4
bl TerminalColour

2.1.7、写入一个彩色的删除字符

mov r0,#0x7f
mov r1,x
mov r2,y
bl DrawCharacter

2.1.8、用 and 指令获取 col 变量的低半字节,然后调用 TerminalColour

and r0,col,#0xf
bl TerminalColour

2.1.9、写入我们需要的字符

mov r0,char
mov r1,x
mov r2,y
bl DrawCharacter

2.1.10、自增屏幕指针

xLoopContinue$:
add screen,#2

2.1.11、如果可能自增 view 指针

teq view,stop
addne view,#2

2.1.12、很容易检测 view 指针是否越界到缓冲区的末尾,因为缓冲区的地址保存在 taddr 变量里

teq view,taddr
subeq view,#128*128*2

2.1.13、 如果还有字符需要显示,我们就需要自增 x 变量然后到 xLoop 循环执行

add x,#8
teq x,#1024
bne xLoop$

2.2、 如果还有更多的字符显示我们就需要自增 y 变量,然后到 yLoop 循环执行

add y,#16
teq y,#768
bne yLoop$

3、不要忘记最后清除变量

pop {r4,r5,r6,r7,r8,r9,r10,r11,pc}
.unreq x
.unreq y
.unreq char
.unreq col
.unreq screen
.unreq taddr
.unreq view
.unreq stop

3、行打印

现在我有了自己 TerminalDisplay 方法,它可以自动显示 terminalBuffer 内容到 terminalScreen,因此理论上我们可以画出文本。但是实际上我们没有任何基于字符显示的例程。 首先快速容易上手的方法便是 TerminalClear, 它可以彻底清除终端。这个方法不用循环也很容易实现。可以尝试分析下面的方法应该不难:

.globl TerminalClear
TerminalClear:
ldr r0,=terminalStart
add r1,r0,#terminalBuffer-terminalStart
str r1,[r0]
str r1,[r0,#terminalStop-terminalStart]
str r1,[r0,#terminalView-terminalStart]
mov pc,lr

现在我们需要构造一个字符显示的基础方法:Print 函数。它将保存在 r0 的字符串和保存在 r1 的字符串长度简单的写到屏幕上。有一些特定字符需要特别的注意,这些特定的操作是确保 terminalView 是最新的。我们来分析一下需要做什么:

  1. 检查字符串的长度是否为 0,如果是就直接返回
  2. 加载 terminalStopterminalView
  3. 计算出 terminalStop 的 x 坐标
  4. 对每一个字符的操作:
    1. 检查字符是否为新起一行
    2. 如果是的话,自增 bufferStop 到行末,同时写入黑色删除字符
    3. 否则拷贝当前 terminalColour 的字符
    4. 检查是否在行末
    5. 如果是,检查从 terminalViewterminalStop 之间的字符数是否大于一屏
    6. 如果是,terminalView 自增一行
    7. 检查 terminalView 是否为缓冲区的末尾,如果是的话将其替换为缓冲区的起始位置
    8. 检查 terminalStop 是否为缓冲区的末尾,如果是的话将其替换为缓冲区的起始位置
    9. 检查 terminalStop 是否等于 terminalStart, 如果是的话 terminalStart 自增一行。
    10. 检查 terminalStart 是否为缓冲区的末尾,如果是的话将其替换为缓冲区的起始位置
  5. 存取 terminalStopterminalView

试一下自己去实现。我们的方案提供如下:

1、这个是 Print 函数开始快速检查字符串为0的代码

.globl Print
Print:
teq r1,#0
moveq pc,lr

2、这里我做了很多配置。 bufferStart 代表 terminalStartbufferStop 代表terminalStopview 代表 terminalViewtaddr 代表 terminalBuffer 的末尾地址。

push {r4,r5,r6,r7,r8,r9,r10,r11,lr}
bufferStart .req r4
taddr .req r5
x .req r6
string .req r7
length .req r8
char .req r9
bufferStop .req r10
view .req r11

mov string,r0
mov length,r1

ldr taddr,=terminalStart
ldr bufferStop,[taddr,#terminalStop-terminalStart]
ldr view,[taddr,#terminalView-terminalStart]
ldr bufferStart,[taddr]
add taddr,#terminalBuffer-terminalStart
add taddr,#128*128*2

3、和通常一样,巧妙的对齐技巧让许多事情更容易。由于需要对齐 terminalBuffer,每个字符的 x 坐标需要 8 位要除以 2。

and x,bufferStop,#0xfe
lsr x,#1

4.1、我们需要检查新行

charLoop$:
ldrb char,[string]
and char,#0x7f
teq char,#'\n'
bne charNormal$

4.2、循环执行值到行末写入 0x7f;黑色删除字符

mov r0,#0x7f
clearLine$:
strh r0,[bufferStop]
add bufferStop,#2
add x,#1
teq x,#128 blt clearLine$
    
b charLoopContinue$

4.3、存储字符串的当前字符和 terminalBuffer 末尾的 terminalColour 然后将它和 x 变量自增

charNormal$:
strb char,[bufferStop]
ldr r0,=terminalColour
ldrb r0,[r0]
strb r0,[bufferStop,#1]
add bufferStop,#2
add x,#1

4.4、检查 x 是否为行末;128

charLoopContinue$:
cmp x,#128
blt noScroll$

4.5、设置 x 为 0 然后检查我们是否已经显示超过 1 屏。请记住,我们是用的循环缓冲区,因此如果 bufferStopview 之前的差是负值,我们实际上是环绕了缓冲区。

mov x,#0
subs r0,bufferStop,view
addlt r0,#128*128*2
cmp r0,#128*(768/16)*2

4.6、增加一行字节到 view 的地址

addge view,#128*2

4.7、 如果 view 地址是缓冲区的末尾,我们就从它上面减去缓冲区的长度,让其指向开始位置。我会在开始的时候设置 taddr 为缓冲区的末尾地址。

teq view,taddr
subeq view,taddr,#128*128*2

4.8、如果 stop 的地址在缓冲区末尾,我们就从它上面减去缓冲区的长度,让其指向开始位置。我会在开始的时候设置 taddr 为缓冲区的末尾地址。

noScroll$:
teq bufferStop,taddr
subeq bufferStop,taddr,#128*128*2

4.9、检查 bufferStop 是否等于 bufferStart。 如果等于增加一行到 bufferStart

teq bufferStop,bufferStart
addeq bufferStart,#128*2

4.10、如果 start 的地址在缓冲区的末尾,我们就从它上面减去缓冲区的长度,让其指向开始位置。我会在开始的时候设置 taddr 为缓冲区的末尾地址。

teq bufferStart,taddr
subeq bufferStart,taddr,#128*128*2

循环执行知道字符串结束

subs length,#1
add string,#1
bgt charLoop$

5、保存变量然后返回

charLoopBreak$:
sub taddr,#128*128*2
sub taddr,#terminalBuffer-terminalStart
str bufferStop,[taddr,#terminalStop-terminalStart]
str view,[taddr,#terminalView-terminalStart]
str bufferStart,[taddr]

pop {r4,r5,r6,r7,r8,r9,r10,r11,pc}
.unreq bufferStart
.unreq taddr
.unreq x
.unreq string
.unreq length
.unreq char
.unreq bufferStop
.unreq view

这个方法允许我们打印任意字符到屏幕。然而我们用了颜色变量,但实际上没有设置它。一般终端用特性的组合字符去行修改颜色。如 ASCII 转义(1b16)后面跟着一个 0 - f 的 16 进制的数,就可以设置前景色为 CGA 颜色号。如果你自己想尝试实现;在下载页面有一个我的详细的例子。

4、标志输入

现在我们有一个可以打印和显示文本的输出终端。这仅仅是说对了一半,我们需要输入。我们想实现一个方法:ReadLine,可以保存文件的一行文本,文本位置由 r0 给出,最大的长度由 r1 给出,返回 r0 里面的字符串长度。棘手的是用户输出字符的时候要回显功能,同时想要退格键的删除功能和命令回车执行功能。它们还需要一个闪烁的下划线代表计算机需要输入。这些完全合理的要求让构造这个方法更具有挑战性。有一个方法完成这些需求就是存储用户输入的文本和文件大小到内存的某个地方。然后当调用 ReadLine 的时候,移动 terminalStop 的地址到它开始的地方然后调用 Print。也就是说我们只需要确保在内存维护一个字符串,然后构造一个我们自己的打印函数。

按照惯例,许多编程语言中,任意程序可以访问 stdin 和 stdin,它们可以连接到终端的输入和输出流。在图形程序其实也可以进行同样操作,但实际几乎不用。

让我们看看 ReadLine 做了哪些事情:

  1. 如果字符串可保存的最大长度为 0,直接返回
  2. 检索 terminalStopterminalStop 的当前值
  3. 如果字符串的最大长度大约缓冲区的一半,就设置大小为缓冲区的一半
  4. 从最大长度里面减去 1 来确保输入的闪烁字符或结束符
  5. 向字符串写入一个下划线
  6. 写入一个 terminalViewterminalStop 的地址到内存
  7. 调用 Print 打印当前字符串
  8. 调用 TerminalDisplay
  9. 调用 KeyboardUpdate
  10. 调用 KeyboardGetChar
  11. 如果是一个新行直接跳转到第 16 步
  12. 如果是一个退格键,将字符串长度减 1(如果其大于 0)
  13. 如果是一个普通字符,将它写入字符串(字符串大小确保小于最大值)
  14. 如果字符串是以下划线结束,写入一个空格,否则写入下划线
  15. 跳转到第 6 步
  16. 字符串的末尾写入一个新行字符
  17. 调用 PrintTerminalDisplay
  18. 用结束符替换新行
  19. 返回字符串的长度

为了方便读者理解,然后然后自己去实现,我们的实现提供如下:

  1. 快速处理长度为 0 的情况
.globl ReadLine
ReadLine:
teq r1,#0
moveq r0,#0
moveq pc,lr

2、考虑到常见的场景,我们初期做了很多初始化动作。input 代表 terminalStop 的值,view 代表 terminalViewLength 默认为 0

string .req r4
maxLength .req r5
input .req r6
taddr .req r7
length .req r8
view .req r9

push {r4,r5,r6,r7,r8,r9,lr}

mov string,r0
mov maxLength,r1
ldr taddr,=terminalStart
ldr input,[taddr,#terminalStop-terminalStart]
ldr view,[taddr,#terminalView-terminalStart]
mov length,#0

3、我们必须检查异常大的读操作,我们不能处理超过 terminalBuffer 大小的输入(理论上可行,但是 terminalStart 移动越过存储的 terminalStop`,会有很多问题)。

cmp maxLength,#128*64
movhi maxLength,#128*64

4、由于用户需要一个闪烁的光标,我们需要一个备用字符在理想状况在这个字符串后面放一个结束符。

sub maxLength,#1

5、写入一个下划线让用户知道我们可以输入了。

mov r0,#'_'
strb r0,[string,length]

6、保存 terminalStopterminalView。这个对重置一个终端很重要,它会修改这些变量。严格讲也可以修改 terminalStart,但是不可逆。

readLoop$:
str input,[taddr,#terminalStop-terminalStart]
str view,[taddr,#terminalView-terminalStart]

7、写入当前的输入。由于下划线因此字符串长度加 1

mov r0,string
mov r1,length
add r1,#1
bl Print

8、拷贝下一个文本到屏幕

bl TerminalDisplay

9、获取最近一次键盘输入

bl KeyboardUpdate

10、检索键盘输入键值

bl KeyboardGetChar

11、如果我们有一个回车键,循环中断。如果有结束符和一个退格键也会同样跳出循环。

teq r0,#'\n'
beq readLoopBreak$
teq r0,#0
beq cursor$
teq r0,#'\b'
bne standard$

12、从 length 里面删除一个字符

delete$:
cmp length,#0
subgt length,#1
b cursor$

13、写回一个普通字符

standard$:
cmp length,maxLength
bge cursor$
strb r0,[string,length]
add length,#1

14、加载最近的一个字符,如果不是下划线则修改为下换线,如果是则修改为空格

cursor$:
ldrb r0,[string,length]
teq r0,#'_'
moveq r0,#' '
movne r0,#'_'
strb r0,[string,length]

15、循环执行值到用户输入按下

b readLoop$
readLoopBreak$:

16、在字符串的结尾处存入一个新行字符

mov r0,#'\n'
strb r0,[string,length]

17、重置 terminalViewterminalStop 然后调用 PrintTerminalDisplay 显示最终的输入

str input,[taddr,#terminalStop-terminalStart]
str view,[taddr,#terminalView-terminalStart]
mov r0,string
mov r1,length
add r1,#1
bl Print
bl TerminalDisplay

18、写入一个结束符

mov r0,#0
strb r0,[string,length]

19、返回长度

mov r0,length
pop {r4,r5,r6,r7,r8,r9,pc}
.unreq string
.unreq maxLength
.unreq input
.unreq taddr
.unreq length
.unreq view

5、终端:机器进化

现在我们理论用终端和用户可以交互了。最显而易见的事情就是拿去测试了!删除 main.sbl UsbInitialise 后面的代码后如下:

reset$:
  mov sp,#0x8000
  bl TerminalClear
  
  ldr r0,=welcome
  mov r1,#welcomeEnd-welcome
  bl Print

loop$:
  ldr r0,=prompt
  mov r1,#promptEnd-prompt
  bl Print
  
  ldr r0,=command
  mov r1,#commandEnd-command
  bl ReadLine
  
  teq r0,#0
  beq loopContinue$
  
  mov r4,r0
  
  ldr r5,=command
  ldr r6,=commandTable
  
  ldr r7,[r6,#0]
  ldr r9,[r6,#4]
  commandLoop$:
    ldr r8,[r6,#8]
    sub r1,r8,r7
    
    cmp r1,r4
    bgt commandLoopContinue$
    
    mov r0,#0
    commandName$:
      ldrb r2,[r5,r0]
      ldrb r3,[r7,r0]
      teq r2,r3
      bne commandLoopContinue$
      add r0,#1
      teq r0,r1
      bne commandName$
    
    ldrb r2,[r5,r0]
    teq r2,#0
    teqne r2,#' '
    bne commandLoopContinue$
    
    mov r0,r5
    mov r1,r4
    mov lr,pc
    mov pc,r9
    b loopContinue$
  
  commandLoopContinue$:
    add r6,#8
    mov r7,r8
    ldr r9,[r6,#4]
    teq r9,#0
    bne commandLoop$
  
  ldr r0,=commandUnknown
  mov r1,#commandUnknownEnd-commandUnknown
  ldr r2,=formatBuffer
  ldr r3,=command
  bl FormatString
  
  mov r1,r0
  ldr r0,=formatBuffer
  bl Print

loopContinue$:
  bl TerminalDisplay
  b loop$

echo:
  cmp r1,#5
  movle pc,lr

  add r0,#5
  sub r1,#5
  b Print

ok:
  teq r1,#5
  beq okOn$
  teq r1,#6
  beq okOff$
  mov pc,lr
  
  okOn$:
    ldrb r2,[r0,#3]
    teq r2,#'o'
    ldreqb r2,[r0,#4]
    teqeq r2,#'n'
    movne pc,lr
    mov r1,#0
    b okAct$
  
  okOff$:
    ldrb r2,[r0,#3]
    teq r2,#'o'
    ldreqb r2,[r0,#4]
    teqeq r2,#'f'
    ldreqb r2,[r0,#5]
    teqeq r2,#'f'
    movne pc,lr
    mov r1,#1
  
  okAct$:
  
    mov r0,#16
    b SetGpio

.section .data
.align 2
welcome: .ascii "Welcome to Alex's OS - Everyone's favourite OS"
welcomeEnd:
.align 2
prompt: .ascii "\n> "
promptEnd:
.align 2
command:
  .rept 128
    .byte 0
  .endr
commandEnd:
.byte 0
.align 2
commandUnknown: .ascii "Command `%s' was not recognised.\n"
commandUnknownEnd:
.align 2
formatBuffer:
  .rept 256
    .byte 0
  .endr
formatEnd:

.align 2
commandStringEcho: .ascii "echo"
commandStringReset: .ascii "reset"
commandStringOk: .ascii "ok"
commandStringCls: .ascii "cls"
commandStringEnd:

.align 2
commandTable:
.int commandStringEcho, echo
.int commandStringReset, reset$
.int commandStringOk, ok
.int commandStringCls, TerminalClear
.int commandStringEnd, 0

这块代码集成了一个简易的命令行操作系统。支持命令:echoresetokclsecho 拷贝任意文本到终端,reset 命令会在系统出现问题的是复位操作系统,ok 有两个功能:设置 OK 灯亮灭,最后 cls 调用 TerminalClear 清空终端。

试试树莓派的代码吧。如果遇到问题,请参照问题集锦页面吧。

如果运行正常,祝贺你完成了一个操作系统基本终端和输入系列的课程。很遗憾这个教程先讲到这里,但是我希望将来能制作更多教程。有问题请反馈至 awc32@cam.ac.uk

你已经在建立了一个简易的终端操作系统。我们的代码在 commandTable 构造了一个可用的命令表格。每个表格的入口是一个整型数字,用来表示字符串的地址,和一个整型数字表格代码的执行入口。 最后一个入口是 为 0 的 commandStringEnd。尝试实现你自己的命令,可以参照已有的函数,建立一个新的。函数的参数 r0 是用户输入的命令地址,r1 是其长度。你可以用这个传递你输入值到你的命令。也许你有一个计算器程序,或许是一个绘图程序或国际象棋。不管你的什么点子,让它跑起来!


via: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input02.html

作者:Alex Chadwick 选题:lujun9972 译者:guevaraya 校对:wxy

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

企业开源指南:开源项目管理工具

$
0
0

最大限度优化组织中运行开源计划或启动开源项目的实践。这些资源由 Linux 基金会与 TODO Group 合作开发,代表了我们的员工、项目和成员的经验。

开放源代码的战略性应用之路,起始于一个精心策划、组织与授权的开源项目办公室,以指导和管理开源的创建、分发和使用。但这仅仅只是第一步。为了让开源项目办公室顺利运行,您需要正确的工具。这些关键的任务工具将用于追踪各部门的目标与指标,从工程部门和法律部门到行政领导部门、公关部门与营销部门,同时给予员工收集数据、提供开源软件运行快照和管理公司内部开源软件日常使用所需要的全部资源。

本指南提供了如何开始您的开源工具集建设的详细信息和场景,包括用于跟踪和管理您的开源项目的最重要工具的信息。指南中提及的许多工具已由Linux基金会和该领域的其他领导者创建并开放源代码,可以免费且便捷地为您的项目所使用。您还可以找到一个仪表盘安装程序的示例,该程序融合并展示了多种工具的信息。

本指南的撰稿人

  • Chris Aniszczyk - Aniszczyk 云原生计算基金会首席营运官
  • Jeff McAffer - 微软开源项目办公室主任

为什么您需要特殊的工具来进行开源项目管理

一旦您的开源项目办公室启动运行,就应该同时收集合适的软件工具,这些工具允许您的开发团队管理、跟踪、指导和推进其开源项目、开源贡献与开源发布。

  • 为协作和代码开发提供工作场所
  • 管理项目质量
  • 自动执行关键且重复的任务,如代码审查与跟踪,以及许可证合规性审查
  • 通常,生成数据以证明您的开源项目办公室和开源战略的投资回报率
  • 监督项目质量并确保突发问题出现时,应急防护措施是到位的

在您开始您的开放源代码之路时,使用正确的目标工具还将使开发人员和其他员工的工作更为轻松,也将提供更好的结果,并将成为公司开源项目的成功协作与沟通的基础。

“如果你正在尝试管理 100 多个代码库或是 100 个人,那你确实不能再让人用电子表格手动操作了。但显然,人们依然在这样做。不过,这样的操作方式开始用于临时应急,并且变得费时费力。这便是工具发挥作用的地方。它们允许你批量操作。” 

Jeff McAffer – 微软开源项目办公室经理

 

“归根结底,你需要工具来自动化你的生活,否则你将会浪费大量时间手动完成工作。” 

Chris Aniszczyk – 云原生计算基金会首席运营官、前 Twitter 开源项目负责人

如何选择和安排您的工具

公司所需的开源工具有哪些?早期的讨论大多认为,这取决于公司的业务、产品和服务,以及公司如何服务它的客户和员工。由于开源项目办公室制定了规划流程和战略地图,因此可以选择那些能整合进公司的目标、流程和基础架构的工具。

最终,知道您将需要使用哪些工具的唯一方法,就是了解您想要对开放源代码进行何种操作。

以下是开源项目办公室选择所需管理工具的基本步骤:

  1. 获取开发者和社区成员的认同和选择偏好。要做到这一点,您需要与开发人员和社区成员进行详细的讨论。他们可以描述什么样的工具已经或者将最适合他们。请务必认真重视这些建议和要求。认真倾听那些能让你实现目标的人的观点。他们是最可能已经使用了许多这些工具的人,因此可以从他们的经验中受益。
  2. 根据关键业务应用了解需要依赖和集成的关键软件。这意味着了解并知晓您的业务所依赖的开源软件,以便您可以跟进了解安全问题并确保软件的持续性。
  3. 研究现有的工具,并决定哪些工具您可以直接使用,或哪些工具可以继续开发以满足您的需要。不要每一个工具都从头开始开发。查看已存在于您所在的开源社区中且正在被使用的工具,并获取有关这些工具的建议和反馈。在在线开发社区中多搜寻,看看有什么有用的工具,并寻求推荐和建议。在开源会议上提问,在兴趣小组Birds-of-a-Feather中与开发人员交谈,并向那些已经实现你期望的前人学习。

这些工具一旦被选定,在落地使用之前,还需要一些额外的准备:

  1. 创建一个用来支持、管理和使用这些工具的内部基础架构。在您新建立的开源项目办公室中,指定一个人来维护和开发内部基础架构。该架构有一线上内部门户,会根据任务和特性保存和组织这些工具,并实现工具的分发。在此工具门户中,您可以将这些工具提供给所有的开发人员,或者根据他们的工作和需求,通过身份认证和权限限制开放给特定的用户。
  2. 为将使用这些工具的员工制定培训计划。只是获得工具是远远不够的。现在您必须保证您的开发人员知道如何使用它们并掌握其功能。培训可以是在线、在教室,或是在小型午餐小组中,让他们了解工具使用的益处很重要。询问您的开发人员哪种学习方法对他们最有效,并让他们选择自己想要的学习方式。
  3. 确保工具在您的组织中集中可见。要使开发人员能够轻松查找与使用它们,最好将其整合到任何现有的用于跟踪开发进程的开发人员仪表板中。同样,这也有利于您公司操作这些关键工具的组织和发布。

当您在选择工具时,实施操作有助于记忆,当然这也可能会影响您的决定。例如,具有陡峭学习曲线的工具可能需要更多的培训。

利用现有工具

在认识到达成组织的目标上你团队的需求,以及自身情况和基础架构的潜在限制之后之后,接下来要做的就是要探索并了解那些已准备就绪且可供您使用现有工具。由于大多数工具本身就是开源的,所以如果它们一开始并不能满足您的确切需求,您的开发团队可以联系这些工具的开发者,看看他们是否可以协作根据新的用途添加一些特性。

讽刺的是,许多开源项目办公室并不经常直接使用其他公司开发的工具,或与其他公司合作来开发他们管理开源项目所需的工具。通常,他们想要这样做,但包括 Facebook 和微软在内的许多企业已经拥有现有的工具套件,这些工具套件在真正成为一个合作议题之前就已经实现。由于他们已经拥有了自己的工具集并进行了投资,他们似乎并没有很大意愿采用其他公司的工具。

这就是现在才刚开始构建自己的开源项目的公司具有显著优势的地方。由于他们现在正在建立自己的开源项目办公室并进入开源领域,因此他们不必为受到这样的限制而烦恼。

相反,他们可以聪明地利用别人的成功经验与失败教训,并利用近年来领先的公司所创建的成熟工具来构建自己的开源工具箱。 Linux 基金会的开源行业组织,TODO Group,一直致力于组装一个装满工具的 “Open Source&nbsprogram Office in A Box” 入门套件,这将使公司能够通过一套紧密结合的预先组装工具开展开源工作。入门套件目前尚未开发完善,但希望最终可以让公司付出更少的初始努力,更轻松地部署和配置他们所需的工具。从事这个项目的 TODO Group 成员包括 Adobe、Capital One、Comcast、Facebook、谷歌、eBay、IBM、微软、三星和 Twitter。

创建一个仪表板

除了适当的工具之外,公司还应该有中央仪表板,以便他们实时监控和跟踪他们的开源项目和开发情况。许多公司可能已经拥有了用于现有开发工作和应用程序的仪表板,并且能够将现有仪表板与其开源工作整合在一起。否则,他们应该创建或采用新的仪表板来改进其开源部署的管理。

一个基本工具集的要素

正在出现越来越多的用于管理和报告开源项目的工具,这一趋势已经非常明显。如果您的开源项目刚刚开始,那么将您的研究集中在几个您启动和运行所需的基本工具上会更有帮助。

随着您的项目不断发展,以及使用这些工具的经验越来越丰富,您可以开始采用新的工具,来帮助自动化并简化您的流程,响应业务需求的增长。切记,新选择的工具将用于内部文化和流程的补充和支持——而不是引导它们。

以下章节列出了几个基本的工具类别,几乎所有开源项目日常使用的工具都可以划分到这些类别。这有助于您对该研究有系统性的认识。

自动化进程

自动化进程工具是您公司的开源项目中选择和使用的最重要的工具之一。这些工具的任务非常广泛,其中包括自动执行贡献者许可协议(CLA)的程序。贡献者许可协议(CLA)是一份按法律声明,声明开发人员创建了代码且不是从其他任何地方非法复制。传统上,这些协议是通过打印协议、签署并传真等一系列手动流程执行的。但在这如今电子邮件和即时通讯迅猛发展的世界里,显得不可思议。取而代之,现在可以用机器人实现自这一流程的自动化,通过使用电子签名,跟踪并处理提交的内容。

为满足公司的更多需求,自动化工具变得越来越庞大且规模化。它们可以准确地告诉您谁正在为您的项目做出贡献,并且可以帮助您消除那些减慢项目进度的程序摩擦。

据微软表示,在其开源项目办公室里,大约有 8000 个仓库在 GitHub 上托管,涉及约 11,000 名贡献者,而在 2016 年约有 40,000 个内部请求应用于开源项目。为了管理这些请求,以及所创建的代码和正在更新的代码版本,公司转而使用可以自动化解决混乱的工具。不仅如此,由于数百个项目中很可能会共用同一段代码,因此必须对其进行仔细跟踪,以便在出现安全错误时,可以快速绘制并修复所有的软件影响。在如此大规模的情况下,自动化非常关键,手动更新几乎是不可能的。

Microsoft’s Azure open source portal

管理关键任务

那些有助于管理关键任务的工具,也是需要考虑和获取的。例如用于项目管理、跟踪项目质量状况,以及确保开发人员、开源社区和其他公司内部人员之间的清晰且快速沟通的。

源代码管理

大多数通过开源项目办公室开发的企业软件项目都使用 GitHub 作为其集中托管和开发的平台。

GitHub 是一个在线源代码管理站点,它允许开源开发人员在一个中央“存储库”或存储空间中管理和存放他们的代码,参与者可以协作并开发他们的代码。如今,大约有 6400 万个开源代码项目在 GitHub 上托管,涉及大约 2300 万个开发人员。

GitHub 用户可以添加代码、查看已提交的代码、申请更改、获取并提供反馈,以及使用该服务提供项目管理。GitHub 使用 Git Version Control System,这是由 Linux 创建者 Linus Torvalds 开发的开放源代码项目,为代码和合作开源人员提供了组织机构。每位“贡献者”都有他们正在处理的项目存储库的副本,他们可以在自己计算机中的副本里进行更改,然后将其提交回项目以供未来纳入。然后,“拉取请求pull request”(示例)或代码贡献会被项目组织者审查、讨论、修改,最后批准或拒绝。

许可证合规

代码扫描和合规工具也很重要,它们有助于追踪代码起源和许可要求。关注被引入自身基础架构、产品和服务中的开放源代码以确保符合许可证的要求,对于公司来说是很重要的。

例如,您的应用程序可能包含数千个开源组件。为了保护您的公司免于法律纠纷,了解这些细节是至关重要的。在风险较高的情况下,用户必须根据其业务在风险谱中的所处位置,深入了解代码,从而深入地审核并验证他们所说的许可证。(请参阅我们关于使用和分发开放源代码的指南。)

“你必须了解你的风险状况,因为扫描最终是与风险管理相关的。你可以一头扎在沙子里,然后只管相信并期望你自己没事。或者你可以说‘如果我受到起诉,这将会破坏我的生意。’你需要非常确定。所以,你要打开包装,逐行查看代码,寻找可能存在其中的所有内容。”

Jeff McAffer – 微软开源项目办公室经理

用于管理源代码的工具

如前所述,GitHub 是服务于目前大多数开源项目办公室的专业源代码管理系统。但是 GitHub 本身并不能满足项目代码管理的所有需求——特别是当您大规模发展的时候。

开源世界中所使用的一些工具旨在通过添加欠缺的功能来改进GitHub本身,例如支持检查开发者原产地证书(DCO)语句,以确保代码可以被合法授权且应用于开源项目中。

GitHub 在代码审查方面也存在一些不足之处,所以有其他可用的工具可以自动将有问题的代码发回给创建它的贡献者,然后要求他们检查并做出必要的修改。GitHub 没有办法强迫任何人检查他们的代码,而这些聪明的工具解决了这一问题,使工作流程得以改善。

其他 GitHub 特定工具的功能用于提高 GitHub 的性能指标,这些功能通常针对特定项目,而不是提供给整个组织详细信息。对于在多个 GitHub 项目中维护许多开源代码库的公司而言,需要更好的工具来组织和汇总它们,使之有意义。亚马逊、Netflix 和微软提供了大量这样的工具来帮助完成这些任务。

以下是一些最流行和实用的源代码管理工具,可以简化并帮助您的 GitHub 运作:

源代码扫描和许可证合规性

  • Antepedia Reporter —— Reporter 是 Antepedia 的一款商业收费应用程序,用于生成报告,可以让开发人员、项目经理、法律顾问和其他人员创建关于您代码库中的开放源代码与公共和私有组件的许可证合规性审计和知识产权管理报告。
  • Black Duck Hub – 这一商业 Hub 服务,可以扫描代码以识别所有嵌入式开源组件,然后自动搜索已知漏洞并进行修复。在您的代码中发现新的漏洞时它可以发送警报。
  • Black Duck Protex – Protex 是来自 Black Duck 的一款商业收费的许可证合规性管理工具,它整合了现有工具以自动扫描、识别和清点开源软件,同时执行许可证合规性和公司政策的要求。
  • Copyright review tools - 这一系列命令行工具有助于使初始版权文件的构建与之后的审查和更新更便捷。
  • dep-checker – Linux 基金会的一款依赖性检查工具,dep-checker 执行针对代码包间的链接的完整分析。
  • FlexNet Code Insight –Flexera 于 2016 年收购了许可证合规性供应商 Palamida,提供了 FlexNet Code Insight,以帮助开发人员、法律团队和安全人员自动化企业开源应用。
  • FOSSA – 这是一款商业工具,可自动执行代码依赖性跟踪和后台许可证合规性扫描。
  • FOSSology - 作为 Linux 基金会的一个项目,FOSSology 是一个开源许可证合规性软件工具包,它可以从命令行运行许可证、版权并导出控制扫描。它还包含了一个数据库和 Web UI,这些也都可用于创建合规工作流程。FOSSology compliance tool screen shot
  • janitor.git – Code Janitor 是一款开源工具,可帮助评估源代码是否符合开源许可证。Code Janitor 来自于 Linux 基金会,可以与其他产品一同使用以检查代码。
  • LicenseFinder – 检测您项目中所使用代码的许可证,将这些许可证与用户定义的白名单进行比较,然后提供可操作的报告。
  • Protecode Enterprise Analyzer – 这款商业应用程序用于分析和识别任何目录中的所有代码, 以确定代码的所有权并根据预先确定的内部政策确保开源许可证合规性。
  • scancode-toolkit – 来自于 nexB 的 ScanCode 工具套件扫描代码的许可证、版权和依赖性,以查找、发现和清点您代码中所使用的开放源代码和第三方组件。
  • SPDX - SPDX 规范是用于描述与软件包相关的组件、许可证和版权的标准格式。SPDX 标准通过标准化开发人员和公司之间共享许可证信息的方式,帮助遵守免费和开源的软件许可证。SPDX 规范由 Linux 基金会主办的 SPDX 工作组所开发的。该工作组提供开源工具来帮助 SPDX 文档的用户。
  • WhiteSource – 通过自动且持续地扫描数十个开放源代码库,为实时管理开源组件提供授权、安全性、代码质量和报告分析。

错误跟踪

  • Bugzilla – 一款基于服务器的软件,是具有搜索记忆功能的高级查询工具,且具备集成电子邮件功能,同时也是全面的权限系统。Mozilla 使用 Bugzilla 作为其错误跟踪系统。
  • GitHub Issues – 作为GitHub自身的整合反馈和错误跟踪器,GitHub Issue 可作为 GitHub 项目托管的一部分提供给用户。
  • GitLab – 这款错误跟踪工具在单个用户界面中统一了问题跟踪、代码审查、Git 存储库管理、活动流、wikis 和其他许多内容,以协助您的开源项目。
  • JIRA – 来自于 Atlassian 的 JIRA 包含自定义过滤器、开发人员工具整合、可定制的工作流程和丰富的 API,以将 JIRA 与其他应用程序整合在一起。

归档和发布管理

  • Artifactory – 同样来自 JFrog 的 Artifactory 是一款存储库管理器,它支持以任何代码语言创建的软件包。它整合了所有主要的 DevOps、持续集成与持续交付工具。
  • Bintray – 一款来自于 JFrog 的归档工具,允许公司发布他们的代码发布档案以维护更久远和更庞大文件的存储。
  • Docker Hub – 一款基于云的注册表服务,允许用户连接到代码库并构建和测试他们的图像。它还存储手动推送的图像和链接到Docker Cloud,以便用户可以将图像部署到项目主机。Docker Hub 是一款集中式资源,用于整个开发流程中的容器映像发现、分发和变更管理、协作与工作流程自动化。
  • github-release – GitHub 的内置功能部分,它允许用户打包并编辑 GitHub 项目的发布,以便其他社区成员可以使用它们。

用于跟踪项目质量的工具

随着开源项目的发展和成熟,监控和跟踪开源项目的整体质量是企业开源项目的核心任务。为了实现这一目标,您必须收集相应的工具,这些工具应当能够反映单独的开源项目的执行过程并反映单独的开源项目在数十、数百甚至数千个项目中被它们的社区接收的过程。同时,这些工具还必须兼具转化能力, 能够将收集的数据转化为体现整个开源组合中整体项目性能的有意义的、实用的且可操作的信息。

Amazon's open source program dashboard

这其中的关键是,您收集到的数据应当可以转化为关键且有用的信息 – 而不是些无用的指标,例如详细说明项目已记录了多少“观察者”明星,自项目开始以来有多少贡献者参与了该项目,亦或是缺乏重要背景资料的其他指标。

最好的项目质量监测工具还必须帮助项目团队对支持他们工作的社区做出回应,同时鼓励贡献开发者的参与和多样化。这意味着这些工具可以帮助保持人员快速响应社区成员发布的问题或反馈,以便他们保持热情参与,且不会感到厌倦并转向其他项目。

一些开源社区有大量的贡献者,而其他一些开源社区则成员较少。项目质量监测工具需要能够适用于各种规模的项目。

“关于现有的工具和系统,我希望我们不需要自己创建任何工具或技术,就能很快就能实现公司的开源项目办公室目标。他们应该能够找到并使用现有的开源工具来管理他们的开源项目。” 

Jeff McAffer – 微软开源项目办公室经理

以下是一些最受欢迎且实用的项目数据统计和项目质量跟踪工具:

  • CatWatch - CatWatch 是来自 Zalando 的一款开源指标仪表板,可为您的 GitHub 帐户获取 GitHub 统计信息,帮助处理您的 GitHub 数据并保存在数据库中。这些数据反映了您的开源项目的受欢迎程度,您的开源项目的最活跃的贡献者,以及其他有趣的统计信息。
  • Gander - Gander 是一款为快速查看一系列开源项目生成有用指标的仪表板。 Gander 由 PayPal 创建,专为负责运行开源项目办公室或跟踪多个开源项目的人员而设计。
  • GHCrawler - 由微软创建的 GHCrawler,是一款 GitHub API 爬行程序, 用于爬取 GitHub 托管的项目并自动追踪、检索和存储其内容。GHCrawler 主要适用于尝试跟踪组织与数据存储。
  • Gittagstats – Gittagstats 是一款根据 Git 仓库的一组标签生成统计数据报告的工具。该工具由 Qualcomm 创建。
  • Grimoire Lab – Bitergia 拥有各种各样的开源工具以计量开源项目的统计数据,从邮件列表到 meetup 网站的小组。
  • OSS-dashboard –来自亚马逊的开源项目仪表板,是一款多功能仪表板,可用于一次同时查看和监视许多GitHub组织和/或用户。
  • OSS Tracker - 来自 Netflix 的 OSS Tracker,收集有关 GitHub 组织的数据,并在单个用户界面中将数据整合到该组织内的所有项目中。所有数据存储库都会被列示,度量指标也会按组织合并,但社区管理员也可以将项目组织到功能区域,并指定管理员分配管理和工程的 leads。

“目标是通过使用这些工具,生成透明数据和相关指标信息,用于指导组织实践。” 

Chris Aniszczyk – 微软开源项目办公室经理

TODO Group 还提供了一个很好的附加工具列表

  • 有助于代码审查的工具
    • mention-bot – 由 Facebook 开发,该工具为社区成员贡献的代码自动关联潜在代码审查人,以加快审核进程。
    • PullApprove – 通过同行审查改进代码质量,执行格式准则,捕获错误代码和提供代码安全检查的形式使代码贡献或拉取请求更加规范化。
    • sentinel – 这是一款存储库管理机器人,用于审查和测试代码贡献,为存储库构建一个维护者列表,并与用户沟通拉取请求的进展状态。
  • 有助于贡献者许可协议(CLA)的工具
    • CLA Assistant – 由 SAP 提供的 CLA Assistant 通过处理用户贡献的合法部分来简化工作流程。当代码贡献者提供代码时,Assistant 要求他们签署 CLA 并通过 GitHub 帐户对每个贡献者进行身份验证。它还会在贡献者同意 CLA 时更新拉取请求的状态,并自动要求用户在对 CLA 进行更改时为每个新的拉取请求重新签署 CLA。
      SAP’s CLA Assistant tool.
    • CLA Portal – 来自 VMware 的 CLA Portal 添加了一个工作流程,以使贡献者能够在 GitHub 存储库中签署关于拉取请求的贡献者许可协议。当开发人员发出拉取请求时,会提示他们在需要时签署协议。同时包括一个为 CLA 创作、CLA-to-project 绘制和协议审查建立的管理员界面。
    • DCOB – 一款开发者原产地证书(DCO)机器人,它有助于为拉取请求中的每一个代码变更执行开发者原产地证书(DCO) 的签署取舍。DCOB 按照开发者原产地证书(DCO)的要求为每一个被认可的代码变更设置状态。
  • 公司规模内的 GitHub 管理
    • hubcommander - 一款用于 GitHub 组织管理的 Slack 机器人,HubCommander 使用聊天操作或对话驱动的开发来帮助管理 GitHub 项目。它创建了一种简单的方式来完成优先的 GitHub 组织管理任务, 而无需为您的GitHub组织成员授予管理或所有者的权限
    • opensource-portal – 由微软研发的工具,旨在帮助大型企业进行大规模的 GitHub 管理操作。这是微软开源项目办公室提供的一套工具之一。
    • settings -此应用程序将 .github/settings.yml 中定义的存储库设置同步到 GitHub 中,从而启用存储库的拉取请求。
    • zappr - Zappr 是一款 GitHub 集成工具,用于促进项目工作流程。来自 Zalando 的 zappr 帮助开发人员提高生产力,同时通过消除有关拉取请求审批的瓶颈并帮助项目所有者在合并到项目主要分支之前暂停劣质拉取请求的方式,提高开源项目质量。
  • 提高项目质量的工具:
    • CII Best Practices Badging – 来自 Linux 基金会的 CII Best&nbspractices Badge 是 FLOSS 项目展示其遵循最佳实践的方式。通过使用这个 Web 应用程序,项目可以自愿进行免费的自我认证来解释他们如何遵循最佳实践。
    • CodeClimate - Code Climate 授权组织通过在整个开发流程中引入完全可配置的测试覆盖率和可维护性数据来控制其代码质量。它对开源项目是完全免费的!

用于沟通与合作的工具

当然,开源的发展并不仅仅关于代码的开发。它还需要在企业内外部从事项目工作的不同群体之间以及公司开源项目办公室的工作人员之间建立良好的沟通与合作。

为了达到上述目标,开发人员可以依靠他们可能已经应用于其他项目的工具,例如 Internet Relay Chat(IRC),开发人员可以发布与开源开发相关的问题并快速收到回复。另一个例子是 TWiki,它是一个开源企业 Wiki 和 Web 协作的平台,开发人员可以在其中讨论代码和项目及相关主题。

此外,企业还可以通过社交媒体平台,门户网站,开源项目存储库和其他能够进行输入、提问和讨论的平台促进沟通交流。

其他有用的工具还包括 Facebook 公司的 mention-bot,它可以通过自动关联潜在审查者来获得拉取请的快速输入周转以审查代码。当 GitHub 目变得太大导致社区成员无法订阅项目的所有通知时,这一工具尤其值得推荐。

然后是 Slack,这是一个在线团队项目管理与沟通平台,在这一平台中用户可以访问和共享消息和文件,管理工作流程,搜索信息等等。Slack可以通过设置接收支持请求、代码签入、错误日志和其他任务的通知。

除此之外,当谈到公司参与和支持开源时,不要忘记您公司的公关与营销人员。包括 Twitter、Reddit、Facebook、LinkedIn、Google+ 等网站在内的社交媒体帐户以及企业内外部的博客和网站的使用都是非常重要的。客户关系管理(CRM)软件以及电子邮件群发和新闻简报可以帮助公司让客户了解他们的开源进展。

用于企业规模 GitHub 管理的工具

当谈到企业为开源项目提供并应用的工具时,按理说最重要的是那些帮助企业管理自身企业规模 GitHub 操作的工具。GitHub 是一个可以提供许多操作的完美平台,但对于谷歌、微软、脸书、Twitter、LinkedIn 等大型的复杂公司而言,使用标准的 GitHub 产品可能会有很多限制。

大型企业通常需要更多的功能,包括如身份管理、设置和权限管理,安全性和双重身份验证执行,以及深入理解和跟踪代码存储库的方法。

因此,这些大型企业常需要构建专门的自动化工具来处理诸如入职、离职、安全策略执行以及给予开发人员请求的存储库访问权限等任务。

为满足自身的特殊需求,微软构建了自己的工具来处理诸如此类的任务,以简化和改进其开源项目。微软在 GitHub 上运行良好,拥有约 1,345 个存储库,迄今为止涉及约 3,580 名开发人员。

“GitHub 的运行管理是随着规模扩大而变得更重要的。你拥有一个 GitHub 组织,这是一个存储库集合,然后你拥有成员和团队。管理所有这些东西变得有点复杂,特别是如果它开始在 GitHub 上规模扩展到数百个存储库,数百人和多个组织。” 

Jeff McAffer – 微软开源项目办公室经理

微软创建了一款定制的自助服务——GitHub management and onboarding portal,用于组织其项目、存储库和团队。在其最简单的层次上,基于 Web 的门户允许开发人员将他们的微软公司ID映射到他们的GitHub ID,这可以提高系统安全性并帮助简化参与大量重要项目的大量开发人员的组织工作。

该门户还允许员工使用 GitHub 和微软进行身份验证。其创建了员工身份的一个“虚拟链接”,以便根据他们的工作角色向他们提供任务所需权限以完成工作。如果员工离开公司,可根据需要调整系统以删除或重新分类其访问权限。

门户运行在一台或多台云服务器上,并依靠缓存来帮助进行会话和减少 GitHub API 的压力。微软门户平均每天可提供约 1000 名独立用户作为其工程师的工具,这是该公司不断发展的开源工作的一部分,该工作现在包括超过 10,000 名正在使用、贡献和发布开放源代码的工程师。

结语

没有人认为使公司进入开源世界是一件简单的事情。但其他许多公司,包括微软和谷歌等巨头已经在您前面这样做了,而且已提供了详细的路线图、代码和建议等,这将使您自己的开源旅程变得更加轻松。

开源项目办公室的创建和选择一系列关键工具来开始开源工作,选择权掌握在您手中。它们很可能已经激发了开发人员的极大期望,开发人员中的许多人可能已经自发为开源项目做贡献(或在工作中,隐秘地)。

通过开源项目的合作并邀请其他人与您合作,您的公司可以获得不可估量的收益,且能通过节能和创新推动公司发展。

拥有正确的工具对于授权贵公司的开放创新至关重要。


TODO Group

这些资源是与 TODO(Talk Openly,Develop Openly)组织合作创建的, 该组织是 Linux 基金会中专业的开源网络组织。特别感谢奉献自己的时间和知识来制作这些综合指南的开源项目负责人。参与制作的公司包括 Autodesk、Comcast、Dropbox、Facebook、Google、Intel、Microsoft、Netflix、Oath(Yahoo + AOL)、Red Hat、Salesforce、Samsung 和 VMware。如想了解更多信息,请访问:todogroup.org

 

Git 十四周年:你喜欢 Git 的哪一点?

$
0
0

Git 为软件开发所带来的巨大影响是其它工具难以企及的。

在 Linus Torvalds 开发 Git 后的十四年间,它为软件开发所带来的影响是其它工具难以企及的:在 StackOverflow 的 2018 年开发者调查 中,87% 的受访者都表示他们使用 Git 来作为他们项目的版本控制工具。显然,没有其它工具能撼动 Git 版本控制管理工具(SCM)之王的地位。

为了在 4 月 7 日 Git 的十四周年这一天向 Git 表示敬意,我问了一些爱好者他们最喜欢 Git 的哪一点。以下便是他们所告诉我的:

(为了便于理解,部分回答已经进行了小幅修改)

“我无法忍受 Git。无论是难以理解的术语还是它的分布式。使用 Gerrit 这样的插件才能使它像 Subversion 或 Perforce 这样的集中式仓库管理器使用的工具的一半好用。不过既然这次的问题是‘你喜欢 Git 的什么?’,我还是希望回答:Git 使得对复杂的源代码树操作成为可能,并且它的回滚功能使得实现一个要 20 次修改才能更正的问题变得简单起来。”

Sweet Tea Dorminy

“我喜欢 Git 是因为它不会强制我执行特定的工作流程,并且开发团队可以自由地以适合自己的方式来进行团队开发,无论是拉取请求、以电子邮件递送差异文件或是给予所有人推送的权限。”

Andy Price

“我从 2006、2007 年的样子就开始使用 Git 了。我喜欢 Git 是因为,它既适用于那种从未离开过我电脑的小项目,也适用于大型的团队合作的分布式项目。Git 使你可以从(几乎)所有的错误提交中回滚到先前版本,这个功能显著地减轻了我在软件版本管理方面的压力。”

Jonathan S. Katz

“我很欣赏 Git 那种 底层命令和高层命令 的理念。用户可以使用 Git 有效率地分享任何形式的信息,而不需要知道其内部工作原理。而好奇的人可以透过其表层的命令,而发现其为许多代码分享平台提供了支持的可以定位内容的文件系统。”

Matthew Broberg

“我喜欢 Git 是因为浏览、开发、构建、测试和向我的 Git 仓库中提交代码的工作几乎都能用它来完成。它经常会调动起我参与开源项目的积极性。”

Daniel Oh

“Git 是我用过的首个版本控制工具。数年间,它从一个可怕的工具变成了一个友好的工具。我喜欢它使你在修改代码的时候更加自信,因为它能保证你主分支的安全(除非你强制提交了一段考虑不周的代码到主分支)。你可以检出先前的提交来撤销更改,这一点也是很棒的。”

Kedar Vijay Kulkarni

“我之所以喜欢 Git 是因为它淘汰了一些其它的版本控制工具。没人使用 VSS,而 Subversion 可以和 git-svn 一起使用(如果必要),BitKeeper 则和 Monotone 一样只为老一辈所知。当然,我们还有 Mercurial,不过在我几年之前用它来为 Firefox 添加 AArch64 支持时,我觉得它仍是那种还未完善的工具。部分人可能还会提到 Perforce、SourceSafe 或是其它企业级的解决方案,我只想说它们在开源世界里并不流行。”

Marcin Juszkiewicz

“我喜欢内置的 SHA1 化对象模型(commit → tree → blob)的简易性。我也喜欢它的高层命令。同时我也将它作为对 JBoss/Red Hat Fuse 的补丁机制。并且这种机制确实有效。我还喜欢 Git 的 三棵树的故事。”

Grzegorz Grzybek

“我喜欢 自动生成的 Git 说明页(这个页面虽然听起来是有关 Git 的,但是事实上这是一个没有实际意义的页面,不过它总是会给人一种像是真的 Git 页面的感觉…),这使得我对 Git 的敬意油然而生。”

Marko Myllynen

“Git 改变了我作为开发者的生活。它使得 SCM 问题从世界上消失得无影无踪。”

Joel Takvorian

看完这十个爱好者的回答之后,就轮到你了:你最欣赏 Git 的什么?请在评论区分享你的看法!


via: https://opensource.com/article/19/4/what-do-you-love-about-git

作者:Jen Wike Huger 选题:lujun9972 译者:zhs852 校对:wxy

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

小白观察:微软释放出其基于 Chromium 的 Edge 浏览器

$
0
0

Big News

微软释放出其基于 Chromium 的 Edge 浏览器:微软为了改进浏览器的兼容性以及减少前端领域的碎片化,主动发起改革,将 Edge 浏览器的内核由自家的 EdgeHTML 变为 Chromium 提供的 WebKit 内核。

对于前端来说,还真的是一个大的利好消息,当 Edge 也开始使用 Chromium 内核以后,前端开发者以后只需要兼容两种渲染引擎了,分别是 Firefox 使用的 Gecko 和 Chromium 使用的 Webkit。这当然算是一件好事情。 不过,反过来想一想,如果渲染引擎一家独大的话,那未来, HTML 标准的定制是否也需要看浏览器内核厂商的脸色呢?

信息来源:【MicrosoftEdgeInsider】

Quick News

  • 共享单车迎来涨价潮:近日,北京地区的共享单车开始实行新的收费价格表。摩拜单车新版骑行15分钟以内收费1元,超出部分每15分钟收费0.5元,骑行一小时费用为2.5元。小蓝单车则是起步价由每30分钟1元更改为每15分钟1元,超出时长后每15分钟0.5元,骑行1小时同样为2.5元。【虎嗅】
  • Windows Embedded POSReady 2009 停止服务: Windows Embedded POSReady 2009 是微软基于 Windows XP SP3 定制的为服务点(POS)设计的嵌入式操作系统,广泛适用于收银机、服务亭、电子标牌、ATM机、加油机等设备。【快科技】
  • 虚拟货币“挖矿”活动被列为淘汰产业:近日国家发改委发布的关于就《产业结构调整指导目录(2019年本,征求意见稿)》中将虚拟货币“挖矿”活动列入淘汰类产业之中。【每日经济新闻】
Viewing all 9060 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>