不想水平观看视频?谷歌的开源框架Autoflip只需点击一下就可以剪切出最好的垂直视频

选自谷歌博客

机器之心编译

参与:一鸣、思

裁剪视频不用愁,谷歌 AutoFlip 实现自动剪辑。视频尺寸、精彩内容通通自动化。

因为手机平板等各种终端设备层出不穷,制作人拍个视频还要剪裁成各种尺寸,以便分发到各种渠道。然而,如果要聚焦于核心内容,那么能追踪主体,并剪裁视频长宽尺寸的能力就必不可少了。

近日,谷歌开源了 AutoFlip 工具。这是一个开源的智能视频剪裁框架,其基于谷歌 MediaPipe 框架。

项目地址:https://github.com/google/mediapipe

在使用过程中,只需要将一段视频和目标维度(如截取的长宽比类型)作为输入,AutoFlip 会分析视频内容并提出一个优化路径和裁剪策略,最后输出一段视频。如下动图所示,我们可以选择各种剪裁长宽比与剪裁模式:

AutoFlip 是什么

AutoFlip 为智能视频调整提供了一套全自动的解决方案,它借助当前顶尖的目标检测与追踪模型理解视频内容。AutoFlip 会检测表示场景变化的构图变化,以便分离出场景进行进一步的处理。在每一个镜头中,它会使用视频分析识别重构场景之前的重要内容,其重构场景主要通过选择针对内容优化的相机模式和路径。

视频裁剪三步走,检测镜头级的视频边界、分析视频内容然后再根据需求进行剪裁。

镜头检测

视频可被视为是一段没有中断的镜头或场景序列。为了检测是否发生了镜头的变化,AutoFlip 计算每一帧的色彩值,并和前一帧进行对比。如果色值的分布发生了明显变化,则标记镜头的改变。在得出剪辑策略前,AutoFlip 会缓存整个视频,用于对整个场景进行优化。

视频内容分析

为了从视频中找到有趣的剪辑片段,AutoFlip 采用了深度学习目标检测模型。有趣的剪辑片段往往包含人和动物,但是其他元素也可以被识别出来,比如文本和广告 logo,运动中的球和动作的捕捉等。

深度学习模型对运动的人或人脸进行了识别。

剪辑

在每一帧找到了兴趣目标后,AutoFlip 自动选择优化策略——静态的、追拍或追踪的,这些取决于目标在视频中的行为。如下图所示,第一行是 AutoFlip 根据帧级的边界框追踪到的相机路径,第二行是平滑后的相机路径。经过平滑处理后,追踪效果还是比较理想的。

左图目标在画面中移动需要追踪相机路径;右图几乎固定在画面相同的位置,静态相机路径就足够了。

AutoFlip 有一个属性图,可以提供最佳效果或自定义需求的剪辑。如果覆盖所有需要的区域不能实现(如目标在一帧视频中显得太大),AutoFlip 则会自动切换到相对不那么激进的策略上。它会应用「信箱效应:letterbox effect」,在保持原始视频尺寸的同时添加屏幕黑边,让画面更自然。

对于右图要求视频囊括所有人脸,AutoFlip 会自动填充半透明黑边以满足设定的视频长宽比。

因为 AutoFlip 是 MediaPipe 的一部分,所以对于具体怎么使用,读者可查阅介绍文档

文档地址:https://github.com/google/mediapipe/blob/master/mediapipe/docs/autoflip.md

最后,和其它机器学习算法一样,AutoFlip 的性能会随着目标检测等能力的提升而大大加强,尤其是衍生出来的能力,例如采访镜头中的说话人检测或动漫中的动物脸检测等等。

当然,目前 AutoFlip 还有挺多提升的地方,尤其是当视频边缘有比较重要的文本信息等。谷歌后续也希望 AutoFlip 能进一步融合自然语言处理等技术实现更合理的视频智能剪裁。

原文地址:https://ai.googleblog.com/2020/02/autoflip-open-source-framework-for.html

Android图片框架glide(谷歌推荐)详细用法

今天讲解的是谷歌推荐的图片框架glide的详细使用方法

首先打开AS工程-Android开发环境

添加依赖

implementation 'com.github.bumptech.glide:glide:4.5.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'

添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

图片的使用

1、加载图片到imageView

Glide.with(Context context).load(Strint url).into(ImageView imageView);

2、各种形式的图片加载到ImageView


// 加载本地图片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);

// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);

// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);

// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);

3、加载带有占位图

Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);

占位图目的为在目的图片还未加载出来的时候,提前展示给用户的一张图片;

4、加载失败 放置占位符


Glide.with(this).load(url).placeholder(R.drawable.loading).error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)//关闭Glide的硬盘缓存机制
.into(imageView);

//DiskCacheStrategy.NONE: 表示不缓存任何内容。
//DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
//DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
//DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。

5、加载指定格式的图片–指定为静止图片


Glide.with(this)
.load(url)
.asBitmap()//只加载静态图片,如果是git图片则只加载第一帧。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);

6、加载动态图片


Glide.with(this)
.load(url)
.asGif()//加载动态图片,若现有图片为非gif图片,则直接加载错误占位图。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);

7、加载指定大小的图片


Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(100, 100)//指定图片大小
.into(imageView)

8、关闭框架的内存缓存机制


Glide.with(this)
.load(url)
.skipMemoryCache(true) //传入参数为false时,则关闭内存缓存。
.into(imageView);

9、关闭硬盘的缓存

Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE) //关闭硬盘缓存操作
.into(imageView);

10、利用Glide将图片加载到不同控件或加载成不同使用方式

//1、通过自己构造 target 可以获取到图片实例
SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
imageView.setImageDrawable(resource);
}
};

//2、将图片实例记载到指定的imageview上,也可以做其他的事情
public void loadImage(View view) {
String url = "https://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
Glide.with(this)
.load(url)
.into(simpleTarget);
}

11、还有一些需要 要求预加载图片,Glide 实现预加载


//a、预加载代码
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();

//preload() 有两种重载
// 1、带有参数的重载,参数作用是设置预加载的图片大小;
//2、不带参数的表示加载的图片为原始尺寸;

//b、使用预加载的图片
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);

12、监听 Glide 加载的状态

public void loadImage(View view) {
String url = "https://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
Glide.with(this)
.load(url)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target,
boolean isFirstResource) {
return false;
}

@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
return false;
}
})
.into(imageView);
}

需要了解、学习更多高级android知识点,请私信评论

Android 亚马逊S3上传文件详细记录-终极大法

一篇文章将带您使用Google C++测试框架Google test

一、前言

本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo工程,以及编写一个最简单的测试案例。

Google C++测试框架能帮助更好的进行C++的测试。

支持的平台:Linux,Windows,Mac

怎样算一个好的测试平台,为什么Google C++ Test会合适:

测试应该是独立的、可重复的。如果一个测试的结果依赖于其它测试用例的结果,debug起来将会非常痛苦。Google C++测试框架在不同的对象中运行每一个测试,从而使测试集隔离开来。当一次测试失败,你可以独立执行这个测试用例来快速debugging。

测试应该有好的组织结构,并且能很好的反应测试代码的结构。Google C++测试框架将相关测试分组到共享数据和子例程的测试集中。这种样式非常容易识别并且使测试易于维护。如果要切换工程,开始在新的代码库上工作,这种一致性非常有帮助。

测试应该是可移植和可重用的。开源社区有很多平台无关的代码,所以测试也应该平台无关。Google C++测试框架可运行在不同的操作系统上,用不同的编译器,用(或不用)异常,因此Google C++测试框架能通过各种配置轻松完成。

当测试失败,应该提供尽可能多的相关信息。Google C++测试框架不会停止在第一个测试用例失败的地方。取而代之的是,仅停止当前的测试,继续下一个。你可以创建一个测试,用于报告非致命失败,这样,你能一次搞定多个bug。

一个测试框架,应该让测试人员从繁琐的基础事务中解脱出来,去专注于测试内容。Google C++测试框架自动跟踪所有的测试定义,不需要使用者运行时一一进行枚举。

测试需要关注效率。Google C++测试框架,可跨测试重用共享资源,只需付出执行一次set-up/tear-down的代价,而不需要进行互相依赖。

因为Google C++测试框架基于流行的xUnit架构,如果你使用过JUnit或PyUnit,你将会发现非常容易掌握。如果没有,将花费你10分钟来学习一些基础。

接下来,会用Google Test来代替Google C++测试框架。

第一个Demo

下面我们开始建立我们的第一个Demo了,假如之前使用的VS2008编译的gtest,那么,我们在VS2008中,新建一个Win32 Console Application。接着就是设置工程属性,总结如下:

1.设置gtest头文件路径

2.设置gtest.lib路径

3.Runtime Library设置

如果是Release版本,Runtime Library设为/MT。当然,其实你也可以选择动态链接(/MD),前提是你之前编译的gtest也使用了同样是/MD选项。

工程设置后了后,我们来编写一个最简单测试案例试试,我们先来写一个被测试函数:

int Foo(int a, int b){ if (a == 0 || b == 0) { throw "don't do that"; } int c = a % b; if (c == 0) return b; return Foo(b, c);}

没错,上面的函数是用来求最大公约数的。下面我们就来编写一个简单的测试案例。

#include <gtest/gtest.h>

TEST(FooTest, HandleNoneZeroInput){ EXPECT_EQ(2, Foo(4, 10)); EXPECT_EQ(6, Foo(30, 18));}

上面可以看到,编写一个测试案例是多么的简单。 我们使用了TEST这个宏,它有两个参数,官方的对这两个参数的解释为:[TestCaseName,TestName],而我对这两个参数的定义是:[TestSuiteName,TestCaseName],在下一篇我们再来看为什么这样定义。

对检查点的检查,我们上面使用到了EXPECT_EQ这个宏,这个宏用来比较两个数字是否相等。Google还包装了一系列EXPECT_* 和ASSERT_*的宏,而EXPECT系列和ASSERT系列的区别是:

1. EXPECT_* 失败时,案例继续往下执行。

2. ASSERT_* 失败时,直接在当前函数中返回,当前函数中ASSERT_*后面的语句将不会执行。

在下一篇,我们再来具体讨论这些断言宏。为了让我们的案例运行起来,我们还需要在main函数中添加如下代码:

int _tmain(int argc, _TCHAR* argv[]){ testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();}

“testing::InitGoogleTest(&argc, argv);” :gtest的测试案例允许接收一系列的命令行参数,因此,我们将命令行参数传递给gtest,进行一些初始化操作。gtest的命令行参数非常丰富,在后面我们也会详细了解到。

“RUN_ALL_TESTS()” :运行所有测试案例

OK,一切就绪了,我们直接运行案例试试(一片绿色,非常爽):

总结

本篇内容确实是非常的初级,目的是让从来没有接触过gtest的同学了解gtest最基本的使用。gtest还有很多更高级的使用方法,我们将会在后面讨论。总结本篇的内容的话:

1. 使用VS编译gtest.lib文件

2. 设置测试工程的属性(头文件,lib文件,/MT参数(和编译gtest时使用一样的参数就行了))

3. 使用TEST宏开始一个测试案例,使用EXPECT_*,ASSER_*系列设置检查点。

4. 在Main函数中初始化环境,再使用RUN_ALL_TEST()宏运行测试案例。

优点:

1. 我们的测试案例本身就是一个exe工程,编译之后可以直接运行,非常的方便。

2. 编写测试案例变的非常简单(使用一些简单的宏如TEST),让我们将更多精力花在案例的设计和编写上。

3. 提供了强大丰富的断言的宏,用于对各种不同检查点的检查。

4. 提高了丰富的命令行参数对案例运行进行一系列的设置。

Tensorflow 1.0,谷歌的开源机器学习框架

据外媒报道,在美国加利福尼亚州山景市举行的首届TensorFlow开发峰会上,谷歌发布了代表人工智能发展趋势的TensorFlow深度学习开源框架1.0版。谷歌宣称这一版本可以应用编程接口(API)的方式用于生产环境之中。

TensorFlow工程总监在大会上表示,还有新的工具将纳入该框架,包括人工神经网络,可先用数据训练再对新数据进行推断。现在,还增加了传统机器学习工具,包括K均值和支持向量机(SVM)。

这一版本也整合了基于Python的Keras库。Keras库的最初设计目的是增强深度学习框架Theano的易用性。Monga说,现在还有“预制的估计模块”或模型,包括可以快速上手的简单神经网络。

另外,谷歌很快就会开源将TensorFlow(尤其是谷歌Inception神经网络模型第三版)速度提升58倍的代码。TensorFlow还将支持高通骁龙(Snapdradon)820手机芯片及其Dragonboard 820c主板上的Hexagon数字信号处理器(digital signal processor,DSP)。同时,还有一个试验性质的TensorFlow编译器XLA,将图形即时(just-in-time)编译成底层计算框架所支持的汇编语言。根据1.0版本的发布说明,TensorFlow有一套试验性质的Java应用编程接口和调试器。

谷歌在2015年首次推出了TensorFlow框架,此后逐渐增加了一些功能,比如分布式训练、Hadoop分布式文件系统(HDFS)和略显诙谐的Parsey McParseFace语言解析器。谷歌提供了云机器学习服务,所以可在谷歌的云基础设施上运行TensorFlow。

工程总监表示,到2017年3月底,谷歌不仅会发布新的基准测试,展示与其它深度学习框架相比TensorFlow的总体情况如何,也会发布用于基准测试的模块。

谁在2020年Java框架排名中高居榜首?

专注于Java领域优质技术,欢迎关注

作者:Patricia Neil

诞生于1995年的Java,目前已在134,861个网站上广泛使用,包括ESPN、SnapDeal等。在其24年的成长史中,Java已经证明了自己是用于自定义软件开发的顶级通用编程语言。

Java广泛应用于科学教育、金融、法律和政府等行业。在下面的饼图是Java语言在各个行业中的使用情况。

这种开源编程语言是面向对象的,其目的是给予应用程序开发人员编写一次代码就能够在任何地方运行(WORA)的自由。这能够让编译后的Java代码在每个支持Java的平台上都能运行。

最新版本的Java 13于2019年9月发布。根据TOIBE排行榜(基于排名最高的25个搜索引擎计算),Java位列第一。

以下是2019年11月和2018年11月的编程语言排名榜单:

Java始终排在第一位,这使它成为有史以来最享负盛誉的软件编程语言之一。及时的更新和新版本的发布使它成为一种充满活力的、有竞争力的编程语言。

但是,仅仅为你的下一个web应用程序开发项目选择这门顶级语言是不够的。在选择Java web框架时,你仍需要做出正确的选择。那么,你是否想知道如何为项目选择一个恰当的 Java框架呢?

实际上,这并不容易,而且需要深入了解为特定行业业务选择特定java框架进行软件开发的优缺点。

现在,让我们一起来详细研究一下2020年这9大顶级Java框架。

1:Spring

Spring排在第一位,是由于它能够开发以高性能著称的复杂web应用程序的出色能力。它能够使Java开发人员轻松地创建企业级应用程序。

Web应用程序开发人员可以担保Spring框架的能力。这也是Spring成为Java开发人员的最爱的原因。下面的数据进一步证明了这一点。以下是选择Java作为首选的三种编程语言之一的开发者们对Java框架的看法:

在开发人员的选择中,Spring MVC和Spring Boot远远领先于其他Java技术。对于开发人员来说,这里的一大优势是他们可以不受其他模块约束并专注于一个模块,因为spring利用了控制反转(IoC)。

这个框架的其他优点是:它提供了一个全面的配置模型,支持传统数据库和现代数据库,如NoSQL,并通过支持面向方面的编程实现了内聚开发。它提供了一些模块,如Spring MVC、Spring Core、Spring Boost、SpringTransaction等。

2:Hibernate

作为一个对象关系映射(ORM)数据库,Hibernate改变了我们以前查看数据库的方式。虽然它不是一个完整的全栈框架,但是它能够为多个数据库轻松转换数据。

它支持多个数据库的能力使得无论应用程序的大小或用户数量如何,都很容易进行扩展。此外,它速度快、功能强大、易于扩展、修改和配置。

3:Struts

该框架能够帮助自定义软件开发人员创建易于维护的企业级应用程序。这个框架的USP就是它的插件。它们是JAR包,这意味着它们是可移植的。

Hibernate 插件和spring 插件分别可以用于对象关系映射和依赖注入。使用此Java框架开发应用程序可以减少处理时间,因为它提供了组织良好的Java、JSP和Action类。

4:Play

像领英、三星、卫报、威瑞森等顶尖公司都在应用这个框架,但这只能说明它的可信赖度。该框架提供了速度、可伸缩性和性能。

它的用户界面非常简单,能够使移动应用程序开发人员快速上手。它主要用于开发需要统一内容创建的应用程序。

5:Google web Toolkit

这个框架用于客户端开发,类似Javascript。它是一个开源的Java框架,这意味着它是免费的。Google广泛使用这个框架,旗下的许多产品如AdSense、谷歌钱包、AdWords都是使用它编写的。

借助GWT代码,可以轻松地开发和调试Ajax应用程序。Java开发人员更喜欢这个框架来编写复杂的应用程序。它的一些特性包括书签、跨浏览器可移植性、历史记录和管理。

6:Grails

这个开源框架在Enterprise Java Beans(EJB)中非常流行。它可用于为内容管理系统、Restful web服务和电子商务网站创建健壮的、可伸缩的应用程序。

它可以与Java Spring、Hibernate、quartz、EE容器和SiteMesh等其他Java技术相协调。它的一些优点包括:简单的GORM,灵活的配置文件,高级的插件系统,带有多个插件,简单的对象映射库,以及一个支持和响应社区。

7:Blade

任何自定义应用程序开发人员都可以在一天内快速理解这个框架。于2015年推出的Java Blade以简单和轻量级著称。这个框架最大的亮点是它能够快速创建web应用程序的能力。

它是一个全栈web开发框架,提供了一个简单而简洁的编码结构。Blade基于Java 8,它提供了RESTful风格的路由接口,同时支持webjar资源和插件扩展。

8:JavaServer Faces

这个java框架是由Oracle开发的,可用于创建企业应用程序、本机应用程序和web应用程序开发。它具有将表示层与应用程序代码轻松连接起来的优势。

JSF提供了一个用于表示和管理UI组件的API集。它具有清晰的体系结构,可以区分应用程序逻辑和表示形式。此外,JSF使用XML进行视图处理,而不是使用Java。

9:Vaadin

这是一个用于精简Java开发的优秀平台。你可以使用它来获得自定义的web开发服务。此框架的一大优点是能够保证服务器和浏览器之间的顺畅通信。

Vaadin提供了从Java虚拟机直接访问DOM的功能。在最新发布的版本中,它被分成了两部分。Vaadin Flow,一个允许服务器端通信和路由的轻量级框架。

10、小结

在阅读了所有顶级的Java框架之后,希望能够给你一个更清晰的认识。了解顶级框架都有哪些并不算什么困难,但是如何找到最佳匹配需求的框架才是一个充满挑战性的抉择!

因此,我总是建议大家咨询专业的Java开发人员,并与他们沟通所有的需求和目标。Java本身就是一种很有前途的编程语言。毫无疑问,选择正确的Java框架可以创造一个奇迹。

最后,说一下你心目中的顶级框架排行吧!


现在人工智能非常火爆,给大家推荐一个非常适合小白入门的教程,点下面链接即可跳转。

前言

来源:https://urlify.cn/ammaYj

谷歌的开源跨平台移动用户界面框架fluent

Flutter是Google推出的跨平台开源移动 UI 框架,支持iOS、Android系统开发构建高质量用户界面,UI框架,包括UI控件、渲染逻辑甚至开发语言。渲染引擎依靠跨平台的Skia图形库来实现,依赖系统的只有图形绘制相关的接口,可以在最大程度上保证不同平台、不同设备的体验一致性,逻辑处理使用支持AOT的Dart语言,支持 Android Studio、Visual Studio Code 和 IntelliJ。所有功能都可以通过组合多个Widget来实现,包括对齐方式、按行排列、按列排列、网格排列甚至事件处理等等。

开源派红包福利

打开支付宝首页搜索“556850443” 立即领红包

微信订阅号:开源派 (opensourcepie)

↓点击阅读原文,查看下载链接

Google开发了一个框架,使C++更容易与Python交互

Google内部构建了一个开源项目,该项目能让开发者为C++程序生成Python的接口包装器。这个项目叫CLIF,新的框架自动为多种语言生成C++库绑定,默认支持Python2和Python3。

CLIF包含四个组成部分,解析器、匹配器、生成器和运行时。它使用LLVM编译框架来把C++ API接口描述转化为一种语言无关内部格式。为了搜集类型信息,框架使用Clang解析必要的头文件。

除了解析和匹配类型信息,CLIF还能够使用生成器生成包装器代码,生成的包装器被用来在运行时中做类型转换。

渐渐变智能

Google之前已经释放出了一些组件,如protobuf(CLIF中内部进程间通信的工具)和CMake构建系统。未来,该框架在处理继承等关系时会变得更加智能。后续版本中有计划对不同语言的异常类型进行映射转换。

现在,你可以在Github上获取到该项目的代码。项目地址是:https://github.com/google/clif

英文原文:https://opensourceforu.com/2017/05/google-develops-framework-bring-c-closer-python/

译者:诗书塞外

谷歌的开源量子算法框架Criq有望找到量子计算机的真正用途

2018年3月,谷歌推出由超导电路制成的72个量子比特的Bristlecone芯片,超过了IBM的50量子比特和英特尔的49量子比特,成为迄今为止最大的量子芯片。

Bristlecone 是谷歌的最新量子处理器(左图)。右侧是这个芯片的结构示意图,每一个「X」代表一个量子比特,相邻最近的量子比特之间是相连的。

不少学者曾表示,量子计算机获得50-100个量子比特就能实现“量子霸权”,在一些领域有传统计算机所不具有的能力,比如在化学和材料学里模拟分子结构,还有处理密码学、机器学习的一些问题。

谷歌的Bristlecone给了我们这样的期待。但是,硬件具备,只欠东风。目前量子计算并没有真正地解决一个传统计算机无法解决的问题。

雷锋网获悉,为了让量子计算机真正发挥效用,谷歌在近日推出了用于量子计算机的开源框架Cirq,以便公众可以为量子计算机开发有用的算法。

Google AI Quantum团队在博文中写道,“Cirq专注于眼前问题,帮助研究人员了解NISQ量子计算机是否能够解决具有实际重要性的计算问题。”

量子比特相比传统计算机比特更强大,是由于两个独特的量子现象:叠加(superposition)和纠缠(entanglement)。量子叠加使量子比特能够同时具有 0 和 1 的数值,可进行“同步计算”(simultaneous computation)。量子纠缠使分处两地的两个量子比特能共享量子态,创造出超叠加效应:每增加一个量子比特,运算性能就翻一倍。比方说,使用五个纠缠量子的算法,能同时进行 25 或者 32 个运算,而传统计算机必须一个接一个地运算。理论上, 300 个纠缠量子能进行的并行运算数量,比宇宙中的原子还要多。

在谷歌看来,过去几年里,量子计算在量子硬件的构建、量子算法方面都有明显的发展,随着Noisy Intermediate Scale Quantum(NISQ)计算机的出现,开发用于理解这些机器功率的算法变得越来越重要。然而,在NISQ处理器上设计量子算法时的一个常见问题是如何充分利用这些有限的量子器件 ,集中资源来解决难题,而不是损耗在算法与硬件之间不良映射上。此外,一些量子处理器具有复杂的几何约束和其他细微差别,忽略这些将会导致错误的量子计算,或者导致修改和次优的计算。

雷锋网了解到,NISQ这个概念由美国人John Preskill提出,是是嘈杂中型量子(Noisy Intermediate-Scale Quantum) 的简称。拥有50-100量子比特、以及高保真量子门 (Quantum Gate) 的计算机,便可称为NISQ计算机。

谷歌开发出的具有72个量子比特的Bristlecone芯片便是NISQ。谷歌希望借助NISQ在五年内实现商业化。 据了解,该框架尚未在真正的量子计算机上运行(只是模拟一个),但有望帮助量子计算机找到一些用途。

Cirq支持在模拟器上运行算法,如果将来有了量子计算机,或者更大的模拟器,也很容易通过云,把设备和算法集成起来。

此外,Cirq为用户提供了对量子电路的精确控制、经过优化的数据结构,可用于编写和编译这些量子电路,从而使用户能够充分利用NISQ架构。 Cirq支持在模拟器上本地运行这些算法,可以通过云,与量子计算机或者更大的模拟器集成。

谷歌还同时发布了Criq的应用示例—— OpenFermion-Cirq。 OpenFermion是一个开发化学问题量子算法的平台。OpenFermion-Cirq则是一个开源库,它将量子模拟算法编译成Cirq。新库利用最新进展为量子化学问题构建低深度量子算法,使用户能够从化学问题的细节转变为高度优化的量子电路,定制为在特定硬件上运行。例如,该库可用于轻松构建量子变分算法,以模拟分子和复杂材料的特性。

谷歌表示,如果要实现其全部潜力,量子计算将需要强大的跨行业和学术合作。在构建Cirq时,我们与早期测试人员合作,以获得对NISQ计算机算法设计的反馈和见解。

以下是与早期采用者的Cirq合作示例:

Quantum Benchmark提供的本质上是量子诊断工具,可以告知最终用户量子处理器中的错误率,并帮助抑制这些错误。

QCWare的首席执行官马特约翰逊表示,谷歌模拟器的一个优势是用户最终能够在其上运行大规模问题,该公司的软件允许客户在多个硬件平台上运行量子算法。 “这将使我们的客户能够利用那些在功率方面肯定会成为领先硬件系统的产品。”

谷歌称,Google AI Quantum团队正在使用Cirq创建在Google的Bristlecone处理器上运行的电路。将来,谷歌计划在云中提供此处理器,而Cirq将成为用户为此处理器编写程序的界面。与此同时,谷歌希望Cirq能够提高各地NISQ算法开发人员和研究人员的工作效率。

NISQ是一个令人充满期待的术语,谷歌的Bristlecone也让人看到了量子比特数量不断增加的希望。然后,对于量子计算机的应用,很多专家并不“兴奋”。

MIT的Seth Lloyd教授认为,想要开发出有用的应用,系统至少应该有超过100个量子位。

Intel 高级副总裁、首席技术官兼 Intel 研究院院长 Michael Mayberry曾告诉雷锋网,虽然他看好量子计算的前景,但他也坦承这一技术还有漫长的道路要走;实际上,量子计算离真正地实现大规模商用还需要有 10 年时间。不仅如此,即使量子计算进入到商用阶段,它也不会让经典的计算方法变得过时(比如说当下基于 CPU 的计算),不管是深度学习还是人工智能,都不会因为量子计算的崛起和发展而变得过时——当然,量子计算可以解决很多目前常规计算能力无法解决的问题,比如说模拟材料、模拟药品、后量子时代的加密算法等。

看来,量子计算机的发展道阻且长。借助于谷歌的NISQ计算机和基于此的Criq算法,更多的探索和想象或将发生。

详细解释Google如何构建web框架

我们都知道,Google使用一个单一的代码库分享全部二十亿行代码,并且采用的是主干开发模式。

毫无疑问,这是世界上最大的单一代码库之一。

虽然这让人吃惊,也觉得有悖于常理,但对公司之外的众多开发者来说,它确实运行得不错。(以上文章提供了一个很好的例子,我在此不再重复。)

Google的代码库为全世界几十家办事处和超过25,000名Google软件开发者提供了共享服务。他们可以在正常工作日内对代码库进行16,000次修改。

只有单一的版本

如果您在单一代码基中使用主干开发模式,那么所有东西都是单一版本。这一点非常明显,但是仍然需要特别指出,它意味着Google的FooBar不会有AngularDart2.2.1和2.3.0两个版本。

Google的员工有时会说,他们所有的软件都在行业的前沿,并且采用最新的技术。

假如你突然想喊出“危险!”也可以理解。的确,仅仅依赖于产品代码库中的主干(git中的“master”),这听起来确实很危险。但是不要着急,前面有个情节转折点。

每每个提交前的7.4万次测试

分析目标定义了1601个测试。不过,当您在Google代码库中修改AngularDart代码时,还可以对使用这个框架的Google雇员进行测试。现在一次提交大约要做74000个测试(这要看修改的程度,而系统会自动跳过不受影响的测试)。

考试时间越长越好。

举例来说,我做了一个小更动(在这个if语句中添加了&&random.lxtDouble()>.05),让它显示的时间只有5%,以便在算法中模拟变更检测和验证竞态条件。在运行之后,它没有开始1601个测试,而是开始了客户机测试。

其真正价值在于对实际应用程序进行测试。他们不仅数量巨大,而且反映了开发人员是如何使用框架的(不仅仅限于框架作者)。要点:框架作者并非总能正确评估框架的使用情况。

它还可以帮助生产中的应用获得每月数十亿美元的资金。构架开发人员在空闲时间完成的演示应用程序,以及几十、几百人从事多年开发的实际应用程序之间仍存在很大的差别。若未来网络是紧密相连的,我们需要更好的支持后者的发展。

因此,如果框架破坏了某些应用程序,会发生什么呢?

谁破坏,谁修复

假如AngularDart的框架作者引入了一个破坏性的变化,那么他们就得为用户来修正。因为Google使用一个单一的代码库,很容易找到破坏程序,并且能够立即修复。

对于AngularDart,以及所有依赖Google的应用程序的修改,都是破坏性的。所以,在通过相关人员检查代码之后,破坏和修复将同时进入代码库。

举个具体的例子:当AngularDart团队中有人对AdWords应用程序的代码做了一些更改,他们会检查这个应用程序的源代码,然后对其进行修复。在修复期间,他们可以运行AdWords现有的测试,也可以添加新的测试。随后,他们将所有这些都放入变更列表,并要求代码评审。因为更改列表与AngularDart和AdWords的代码有关,所以系统会自动要求这两个团队进行代码审查。只能通过双方同时提交更改。

显然,它可以阻止框架开发过程中,不需要任何激励就可以自由地执行。开发AngularDart框架的人可以访问他们自己平台上构建的数以百万计的代码,并且因为他们经常接触到这些代码,所以他们不需要想象其他人如何使用他们的框架。(值得注意的是,他们只看到了Google内部使用这个框架者的代码,并没有看到世界上所有人都在使用它。)

更新用户的代码还会降低开发速度,并没有您想象的那么大(你可以看看AngularDart十月份以来的进展),但是总而言之,开发进度会有所下降。最后是好是坏是坏是坏是坏。我们待会再谈谈这个问题。

所以,下一次,你会明白为什么Google会有人说,某个库的Alpha版本是稳定的,并且可以应用于产品。

大规模改动

假如AngularDart需要做一个大的改变(假设版本从2.x升级到3.0),会不会影响74,000次测试?小组是否解决了所有问题?难道他们要修改成千上万的源文件吗?甚至大部分源文件都没有?

回答是Yes。

“类安全系统”(soundtypesystem)可以使一切变得更高效、更简单。举例来说,在Dart类安全系统中,工具可以是某个变量的特定类型。修改这些变量之一,可以自动应用到所有相同的类型,而不需要开发者手工改变。

如果Foo上的一种方法从bar()更改为baz(),您可以创建一个工具,遍历整个Google代码库,查找Foo类及其子类的所有实例,并将所有bar()更改为baz()。在Dart类安全系统的帮助下,你不会影响到其他部分。如果没有类安全系统,一个简单的修改就会带来很多麻烦。

只要按一次键,你的代码就可以按照Dart的风格设置。实际上,指南中提到:“正式的Dart空白处理规则是由dart_style执行的。”

Dart_style(用于Dart的默认格式化程序)是另一个可以帮助进行大规模修改的利器,Google所有的Dart代码都通过这个工具格式化。在您的代码被提交给审查者时,它已自动将dart_style应用于格式设置,因此再也没有“新行不需要放在这里”这样的问题了。它同样适用于大规模代码重构。

性能指标

正如上面提到的,AngularDart能够从子产品的测试中获益,而不仅仅是测试。Google对其应用程序的性能进行了严格的评估,所以大多数(可能是所有)产品的应用都有基准测试套件。

更改发布之前,Google内部已经知道AngularDart团队引入了一个新的修改,使得AdWords的载入速度降低了1%。十月份,研究小组称,AngularDart应用程序的规模从八月份开始下降了40%,但是速度提高了10%。它们并不在谈论像TodoMVC这样的小应用,而是在现实世界中处理关键任务、拥有数百万用户群和上兆字节的业务逻辑代码。

旁注:封闭的构建工具

您如何知道在AngularDart引入这个脆弱的Bug之后,您应该在这个庞大的内部存储库中做哪些测试呢?无法人工选择74万个测试,也无法在Google内部运行所有测试,这是肯定的。这个问题的答案叫Bazel。

以此代码规模,您无法构造出用于编译的shell脚本来序列。第一是易受攻击,第二是非常缓慢。您需要一个封闭的构建工具。

"pure"一词很类似于函数中的"pure"。构建步骤不能有副作用(如临时文件、改变PATH路径等等),它们必须是确定的(也就是说,相同的输入必须是相同的输出)。这样,您可以在任何时候,在任何机器上运行构建和测试,以确保输出的一致性。您不必使用makeclean。所以,您可以发送编译/测试来构建服务器,并使其并行运行。

Goolgood花了几年时间来开发这个构建工具,并在去年以Bazel的形式开源。

通过这个基础设施,内部测试工具可以自己决定构建/测试的影响范围,并在适当的时候运行。

这一切意味着什么?

在开发大型Web应用程序时,AngularDart的目标很明确,即获得最佳的生产率、性能和可靠性。这篇文章只讨论最后一部分——可靠性,以及为什么像AdWords和AdSense这样的重量级应用程序会使用这个框架。团队并非夸耀自己的用户,正如上面所提到的,拥有大量的内部用户使得AngularDart不太可能引入一些使框架更可靠的表面改变。

如果这些听起来太过商业化,你可以看看我的AngularDart非商业化项目,比如AutomaticDonaldTrump(Markovto)或者PriyFinder。

如果您正在寻找的框架需要在几个月内进行重大修改或功能升级,AngularDart绝对不适合您。即便团队想要以这种方式构建一个框架,本文也清楚地告诉您这是不可能的。但是我们真诚地相信,一个不合乎潮流,却又特别可靠的构架,还有它的存在空间。

依我看,一个开放源码技术组合能否获得长期维护和支持,最好的预测方法是看它是否是主要维护者公司业务的重要组成部分。比如Android,dagger,MySQL或者git。因此,我很高兴Dart最终拥有了一个首选的Web框架(AngularDart)、一个首选组件库(AngularDartComponents)和一个首选的移动框架(Flutter),所有这些都被用来构建Google在商业上的关键应用。

在华为手机(如mate30/P40)上一键安装Google play框架

  • 方案:下载光速虚拟机APP(必须要1.1.5版本以上;百度搜索光速虚拟机官网下载),设置-谷歌服务框架设置-点击开启即可。

对比全网各种复杂的教程,尤其是华为手机的用户,是否有被这个一键解决的方案惊吓到?

  • 原理:使用google play必须要安装Google Play服务框架、Google Play商店、Google Play服务、Google Play账号管理程序。俗称谷歌三件套,或者四件套。

传统方法是分别去网上找对应的4个软件来进行安装,这种安装方法可能由于软件版本之间的不兼容问题导致最终无法正常进入Google Play商店。在这里说一句,如果要在真机上正常运行google play,翻遍全网教程没有一个可以一劳永逸或者最简便的解决所有人问题的方案,因为安卓不同的系统版本,所以谷歌框架装起来非常容易出现兼容性问题。

而在光速虚拟机内,华为P40系列、Mate 30系列、Nova7系列、Mate Xs、P30系列、畅享20系列、荣耀30系列、荣耀X10、荣耀V30系列、荣耀Play4系列、荣耀30S、荣耀Play4T系列等均可一键开启谷歌商店。

光速虚拟机是作为一个安卓虚拟机类APP,本身带了手机环境可以把以上所有复杂的流程提前解决,这是任何其他工具所不具有的条件。亲测虚拟机和真机是一样流畅,而且可以做到一键划动就能切换真机和虚拟机。

所以可以做到一键开启

设置-谷歌服务框架设置

立即重启

安装成功