2016年9月

GitHub 又发布了一年一度的章鱼猫观察报告。在这个报告中,分别对开源和社区做了一些有趣的统计,现将其中一些有趣的数据和趋势撷取出来分享给大家。完整的报告请移步此处

GitHub 上最流行的开源项目

让阿波罗 11 号登月的代码开源课程,过去十二个月中,GitHub 上又涌现了一大批开源项目。以下是最流行的(得到星标最多)项目:

最流行的开源项目

其中使用最多的开源许可证是:MITApache-2.0GNU General Public License v3.0

GitHub 上最爱用的编程语言

GitHub 上存放的开源项目使用了多达 316 种不同的编程语言,其中在过去十二月中提交的 PR( 拉取请求 Pull Request ,用于向项目提交补丁) 使用最多的前 15 种编程语言是(其中的数字是 PR 数量):

PR 中最流行的 15 种语言

PR 中最流行的语言居然是 JavaScript,是因为 JavaScript 比较容易么?而且 JavaScript、C# 和 Go 语言的 PR 增长率达到了两倍,甚至,Swift 和 TypeScript 虽然总量不多,但是增长率达到了 3.5 倍。

贡献者的活跃程度

活跃 Active ”是指有过代码提交、写了备注、被星标和 问题汇报 issue 等行为。

这十二个月以来,有 580 万以上的活跃用户、33 万以上的活跃组织、1.9 亿以上的活跃仓库、1 千万以上的活跃问题汇报。

贡献者 contributors ”是指对项目/仓库推送了代码、对打开或评论了问题和 PR 的人,按照贡献者对项目和组织进行排名:

开源贡献者最多的前十个仓库

其中贡献者最多的仓库是 Font-Awesome 项目,这是一个图标字体的项目,不太理解为何有这么多的贡献者。其次是 dockernpm

开源贡献者最多的组织

开源贡献者最多的组织是微软,超过了 Facebook、docker,以及谷歌。看来微软这一年确实是在开源方面下了死力。

被最多分支的仓库

仓库被 分支 fork 的越多代表了对它感兴趣、甚至会参与到开发中的人越多。这个排名第一的 datasharing 是个啥项目,我去看看——居然是一篇文章……好吧,让我看看第二个 Spoon-Knife,这,是章鱼猫的一个教人如何分支仓库的例子……那么第三个 ProgrammingAssignment2 ,哎,也是一个课程上用的例子……

好吧,我收回之前对分支的看法,就不能有个“正常”点的仓库嘛?

还好,第四 bootstrap 和第五 tensorflow 都是比较正常的开源项目。总之,项目流行不流行,不要看分支数量了。

被最多用户评审过代码的仓库

这里的 代码评审者 reviewers 指的是对修改过的代码进行过评论的人,这也代表贡献者对仓库的关注度。好吧。我除了对第一名 homebrew 有点不解,其它的几名都觉得还算正常。

GitHub 的新增用户

GitHub 已经有超过 520 万的用户和超 30 万的组织。这十二月以来,有超过 81 万的人发起了人生第一个 PR,更有 280 万人创造了他自己的第一个仓库。

新用户注册增长最多的国家

而中国,是新用户注册增长最多的国家,基本上翻了一番。

GitHub 上的组织

GitHub 上已经有超过 8 千万的 PR,而这些 PR 中有超过 85% 的来自于组织。在 GitHub 上以组织形式活动的除了商业性组织以外,很多大公司也在其企业的开发中采用了 GitHub Enterprise ,其中不乏财富50强里面公司。

总结

报告就解读到这里,详细的图文并茂的报告,请移步 GitHub

尽管我们对百度今年工作焦点的关注集中在这个中国搜索巨头在深度学习方面的举措上,许多其他的关键的,尽管不那么前沿的应用表现出了大数据带来的挑战。

正如百度的欧阳剑在本周 Hot Chips 大会上谈论的,百度坐拥超过 1 EB 的数据,每天处理大约 100 PB 的数据,每天更新 100 亿的网页,每 24 小时更新处理超过 1 PB 的日志更新,这些数字和 Google 不分上下,正如人们所想象的。百度采用了类似 Google 的方法去大规模地解决潜在的瓶颈。

正如刚刚我们谈到的,Google 寻找一切可能的方法去打败摩尔定律,百度也在进行相同的探索,而令人激动的、使人着迷的机器学习工作是迷人的,业务的核心关键任务的加速同样也是,因为必须如此。欧阳提到,公司基于自身的数据提供高端服务的需求和 CPU 可以承载的能力之间的差距将会逐渐增大。

对于百度的百亿亿级问题,在所有数据的接受端是一系列用于数据分析的框架和平台,从该公司的海量知识图谱,多媒体工具,自然语言处理框架,推荐引擎,和点击流分析都是这样。简而言之,大数据的首要问题就是这样的:一系列各种应用和与之匹配的具有压倒性规模的数据。

当谈到加速百度的大数据分析,所面临的几个挑战,欧阳谈到抽象化运算核心去寻找一个普适的方法是困难的。“大数据应用的多样性和变化的计算类型使得这成为一个挑战,把所有这些整合成为一个分布式系统是困难的,因为有多变的平台和编程模型(MapReduce,Spark,streaming,user defined,等等)。将来还会有更多的数据类型和存储格式。”

尽管存在这些障碍,欧阳讲到他们团队找到了(它们之间的)共同线索。如他所指出的那样,那些把他们的许多数据密集型的任务相连系在一起的就是传统的 SQL。“我们的数据分析任务大约有 40% 是用 SQL 写的,而其他的用 SQL 重写也是可用做到的。” 更进一步,他讲道他们可以享受到现有的 SQL 系统的好处,并可以和已有的框架相匹配,比如 Hive,Spark SQL,和 Impala 。下一步要做的事情就是 SQL 查询加速,百度发现 FPGA 是最好的硬件。

这些主板,被称为处理单元( 下图中的 PE ),当执行 SQL 时会自动地处理关键的 SQL 功能。这里所说的都是来自演讲,我们不承担责任。确切的说,这里提到的 FPGA 有点神秘,或许是故意如此。如果百度在基准测试中得到了如下图中的提升,那这可是一个有竞争力的信息。后面我们还会继续介绍这里所描述的东西。简单来说,FPGA 运行在数据库中,当其收到 SQL 查询的时候,该团队设计的软件就会与之紧密结合起来。

欧阳提到了一件事,他们的加速器受限于 FPGA 的带宽,不然性能表现本可以更高,在下面的评价中,百度安装了 2 块12 核心,主频 2.0 GHz 的 intl E26230 CPU,运行在 128G 内存。SDA 具有 5 个处理单元,(上图中的 300MHz FPGA 主板)每个分别处理不同的核心功能( 筛选 filter 排序 sort 聚合 aggregate 联合 join 分组 group by

为了实现 SQL 查询加速,百度针对 TPC-DS 的基准测试进行了研究,并且创建了称做处理单元(PE)的特殊引擎,用于在基准测试中加速 5 个关键功能,这包括 筛选 filter 排序 sort 聚合 aggregate 联合 join 分组 group by ,(我们并没有把这些单词都像 SQL 那样大写)。SDA 设备使用卸载模型,具有多个不同种类的处理单元的加速卡在 FPGA 中组成逻辑,SQL 功能的类型和每张卡的数量由特定的工作量决定。由于这些查询在百度的系统中执行,用来查询的数据被以列格式推送到加速卡中(这会使得查询非常快速),而且通过一个统一的 SDA API 和驱动程序,SQL 查询工作被分发到正确的处理单元而且 SQL 操作实现了加速。

SDA 架构采用一种数据流模型,加速单元不支持的操作被退回到数据库系统然后在那里本地运行,比其他任何因素,百度开发的 SQL 加速卡的性能被 FPGA 卡的内存带宽所限制。加速卡跨整个集群机器工作,顺便提一下,但是数据和 SQL 操作如何分发到多个机器的准确原理没有被百度披露。

我们受限与百度所愿意披露的细节,但是这些基准测试结果是十分令人鼓舞的,尤其是 Terasort 方面,我们将在 Hot Chips 大会之后跟随百度的脚步去看看我们是否能得到关于这是如何连接到一起的和如何解决内存带宽瓶颈的细节。


via: http://www.nextplatform.com/2016/08/24/baidu-takes-fpga-approach-accelerating-big-sql/

作者:Nicole Hemsoth 译者:LinuxBars 校对:wxy

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

MySQL 开发团队于 12 日宣布 MySQL 8.0.0 开发里程碑版本(DMR)发布!

可能有人会惊奇 MySQL 为何从 5.x 一下跳跃到了 8.0。事实上,MySQL 5.x 系列已经延续了很多年,从被 Oracle 收购之前就是 5.1,而收购之后一直维持在 5.x,比如 5.5,5.6,5.7 等等。其实,如果按照原本的发布节奏,可以把 5.6.x 当成 6.x,5.7.x 当成 7.x。所以,只是换了版本命名方式而已。

不过这次发布的 MySQL 8.0.0 开发版本还是有不少亮点的。

MySQL 8.0.0 亮点

  • 事务性数据字典,完全脱离了 MyISAM 存储引擎
    真正将数据字典放到了 InnoDB 中的一些表中,从此不再需要 FRM、TRG、PAR 文件啦!Information Schema 现在以数据字典表的一个视图出现。原则上可以完全不需要 MyISAM 数据表类型了,所有的系统表都可以放到 InnoDB 之中。
  • SQL 角色
    角色是一系列权限的集合。可以创建角色,给某个用户授予和去除角色。这对于权限管理很方便。
  • utf8mb4 字符集将成为默认字符集,并支持 Unicode 9
    默认字符集将从 latin1 改为 utf8mb4,默认 定序 collation 将从latin1_swedish_ci 改为 utf8mb4_800_ci_ai
  • 不可见索引
    可以将一些索引设置为不可见,这样 SQL 优化器就不会用到它,但是它会继续在后台保持更新。当有需要时,可以随时恢复可见。
  • 对二进制数据可以进行位操作
    不仅仅可以对 BIGINT进行位操作,从 8.0 开始也支持对 [VAR]BINARY/[TINY|MEDIUM|LONG]BLOB进行位操作了。
  • 改进了对 IPv6 和 UUID 的操作
    INET6_ATON()INET6_NTOA() 现在可以进行位操作了,因为INET6_ATON()现在返回的是VARBINARY(16) 数据类型(128 位)。改进了 UUID 操作,引入了三个新的函数 UUID_TO_BIN(), BIN_TO_UUID()IS_UUID() 。MySQL 并没有特殊的 IPv6 和 UUID 数据类型,而是以VARBINARY(16) 数据类型保存的。
  • 持续性的全局变量
    可以用 SET PERSIST 来设置持久性的全局变量,即便服务器重启也会保持下来。
  • 性能数据库 Performance Schema 的改进
    比如对性能数据库增加了 100 多个索引,可以检索更快。
  • 重构 SQL 分析器
    持续不断的逐步改进 SQL 分析器。旧的分析器由于其语法复杂性和自顶向下的分析方式从而有严重的限制,导致难以维护和扩展。
  • 成本模型
    InnoDB 缓冲区现在可以估算主内存缓存区中的有多少表和索引,这可以让优化器选择访问方式时知道数据是否可以存储在内存中还是必须存储到磁盘上。
  • 直方图 Histograms
    通过使用直方图,用户或 DBA 可以对数据分布进行统计,这可以用于查询优化以寻找优化的查询方案。
  • 改进扫描性能
    改进了 InnoDB 范围查询的性能,可提升全表查询和范围查询 5-20% 的性能。
  • 重构 BLOB
    重构 BLOB 加速了片段读取/更新操作,可以加速 JSON 数据的操作。
  • 持久化自增值
    InnoDB 会持久化保持自增序列的最大值到 redo 日志中。这个改进还修复了一个非常老的 199 号 bug。
  • 临时表
    取消对压缩临时表的支持,并存储临时表的元数据到内存中。

其它的更多重要改进和细节,请参考 MySQL 8.0.0 发布公告这里

下载

目前 8.0.0 还是开发版本,如果你希望体验和测试最新特性,可以从 dev.mysql.com 下载各个平台的安装包。不过,MySQL 软件包是越来越大了,Linux 平台上的二进制打包后就将近有 1 GB。如果在产品环境中使用,在 8.0 没有进入稳定版本之前,请继续使用 5.7 系列,当前最新的版本是 5.7.15 GA 版本——这只有 600 M 多。

最新的源代码放在 GitHub 上,感兴趣的朋友可以去看看,其中有不少是中国人的贡献。

这是 Apple 开源 Swift 之后首次发布的重大版本。Swift 3 是一个重要版本,包含了多达上百项的主要改进,包括对语言核心和标准库的改进,Linux 版本增加了核心库,并首次发布了 Swift 包管理器

Swift 3 不兼容于之前发布的 2.2 和 2.3,也就是说,之前为 2.2 和 2.3 开发的代码,需要经过修改才能运行在 3.0 上。具体的不兼容情况和迁移信息请参见: SE-0005SE-0006迁移指南。这些改变主要来自对标准库 API 的命名,也完全改变了导入 Objective-C API 到 Swift 的方式。不过 Xcode 8.0 代码迁移工具能自动处理许多必要的源代码变化。

Swift 3.0 的文档也相应更新了,更多语言细节可以参考这里,或免费的 iBook。

平台支持方面,Linux 版本现在包括了 Swift 核心库Swift 包管理器。Ubuntu 14.04 和 15.10 用户可以下载官方发布的二进制版本。而对 Mac 平台, Swift 3.0 会作为 Xcode 8.0 的一部分出现。

源代码也可以在 GitHub 上下载到:

今日关注

以界面优美而著称的 elementary OS 0.4 “Loki” 在经过了两个 Beta 版本之后发布了正式版,原本我们以为还会放出 RC 版的。“Loki” 基于 Ubuntu 16.04 LTS,由于是 LTS 版本,会支持到 2021年。

Cody Garver 在发布公告中说,“Loki 是 elementary OS 的最新版本,它是个以设计为导向的开源 Linux 操作系统,用于桌面计算机和笔记本电脑。它接替了发布于 2015 年 4 月的 Freya,它已经下载多达 120 万次 。”

elementary OS 0.4 “Loki” 最引人注目的地方是其重新打造的系统指示器,包括音乐、电源、蓝牙、日期与时间、网络等等,以及新的提示中心、多个应用菜单改进、重新设计的系统设置面板、更好的隐私保护、更加安全可靠。

图文摘要

Linux Mint 18 "Sarah" KDE 版正式发布。它是基于 Ubuntu 16.04 LTS 的,同样会支持 5 年。

每年都在一个欧洲城市举办的 GUADEC 2017 会议定于英国的 曼彻斯特 Manchester 召开。因此,按照去年召开的 GUADEC 2015 的规定,GNOME 3.26 的开发代号也将叫做“Manchester”。GNOME 3.24 将于明年 3 月正式发布,而 3.26 则计划在 9 月发布,再过几天 GNOME 3.22 就要发布了。

Greg Kroah-Hartman 宣布 Linux LTS 内核 3.14 结束了其支持周期,强烈建议使用该系列内核的用户马上升级到 4.4 LTS 或最新稳定版 4.7.3。

VirtualBox 5.1.6 发布,首次支持最新的 Linux 4.8 内核。

LFS 和 BLFS 发布 7.10,不再支持 Qt4 和 KDE4 。

四月份,我们宣布了对 HTTP/2 服务端推送技术的支持,我们是通过 HTTP 的 Link 头部来实现这项支持的。我的同事 John 曾经通过一个例子演示了在 PHP 里支持服务端推送功能是多么的简单。

我们想让现今使用 Node.js 构建的网站能够更加轻松的获得性能提升。为此,我们开发了 netjet 中间件,它可以解析应用生成的 HTML 并自动添加 Link 头部。当在一个示例的 Express 应用中使用这个中间件时,我们可以看到应用程序的输出多了如下 HTTP 头:

本博客是使用 Ghost(LCTT 译注:一个博客发布平台)进行发布的,因此如果你的浏览器支持 HTTP/2,你已经在不知不觉中享受了服务端推送技术带来的好处了。接下来,我们将进行更详细的说明。

netjet 使用了带有定制插件的 PostHTML 来解析 HTML。目前,netjet 用它来查找图片、脚本和外部 CSS 样式表。你也可以用其它的技术来实现这个。

在响应过程中增加 HTML 解析器有个明显的缺点:这将增加页面加载的延时(到加载第一个字节所花的时间)。大多数情况下,所新增的延时被应用里的其他耗时掩盖掉了,比如数据库访问。为了解决这个问题,netjet 包含了一个可调节的 LRU 缓存,该缓存以 HTTP 的 ETag 头部作为索引,这使得 netjet 可以非常快的为已经解析过的页面插入 Link 头部。

不过,如果我们现在从头设计一款全新的应用,我们就应该考虑把页面内容和页面中的元数据分开存放,从而整体地减少 HTML 解析和其它可能增加的延时了。

任意的 Node.js HTML 框架,只要它支持类似 Express 这样的中间件,netjet 都是能够兼容的。只要把 netjet 像下面这样加到中间件加载链里就可以了。

var express = require('express');
var netjet = require('netjet');
var root = '/path/to/static/folder';

express()
  .use(netjet({
    cache: {
      max: 100
    }
  }))
  .use(express.static(root))
  .listen(1337);

稍微加点代码,netjet 也可以摆脱 HTML 框架,独立工作:

var http = require('http');
var netjet = require('netjet');

var port = 1337;
var hostname = 'localhost';
var preload = netjet({
  cache: {
    max: 100
  }
});

var server = http.createServer(function (req, res) {
  preload(req, res, function () {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/html');
      res.end('<!doctype html><h1>Hello World</h1>');
  });
});

server.listen(port, hostname, function () {
  console.log('Server running at http://' + hostname + ':' + port+ '/');
});

netjet 文档里有更多选项的信息。

查看推送了什么数据

访问本文时,通过 Chrome 的开发者工具,我们可以轻松的验证网站是否正在使用服务器推送技术(LCTT 译注: Chrome 版本至少为 53)。在“Network”选项卡中,我们可以看到有些资源的“Initiator”这一列中包含了Push字样,这些资源就是服务器端推送的。

不过,目前 Firefox 的开发者工具还不能直观的展示被推送的资源。不过我们可以通过页面响应头部里的cf-h2-pushed头部看到一个列表,这个列表包含了本页面主动推送给浏览器的资源。

希望大家能够踊跃为 netjet 添砖加瓦,我也乐于看到有人正在使用 netjet。

Ghost 和服务端推送技术

Ghost 真是包罗万象。在 Ghost 团队的帮助下,我把 netjet 也集成到里面了,而且作为测试版内容可以在 Ghost 的 0.8.0 版本中用上它。

如果你正在使用 Ghost,你可以通过修改 config.js、并在production配置块中增加 preloadHeaders 选项来启用服务端推送。

production: {
  url: 'https://my-ghost-blog.com',
  preloadHeaders: 100,
  // ...
}

Ghost 已经为其用户整理了一篇支持文档

总结

使用 netjet,你的 Node.js 应用也可以使用浏览器预加载技术。并且 CloudFlare 已经使用它在提供了 HTTP/2 服务端推送了。


via: https://blog.cloudflare.com/accelerating-node-js-applications-with-http-2-server-push/

作者:Terin Stock 译者:echoma 校对:wxy

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