News stories from Tuesday 21 November, 2017

Favicon for ITeye资讯频道 09:05 高性能Elasticsearch ORM开发库bboss es 5.0.3.8发布 » Post from ITeye资讯频道 Visit off-site link

 bboss es v5.0.3.8发布。bboss elasticsearch是一套基于query dsl语法操作访问分布式搜索引擎elasticsearch的o/r mapping开发库,底层基于es restful api。使用bboss es,可以快速编写出访问和操作elasticsearch的程序代码,简单、高效、可靠、安全。bboss es对原生restful api、java orm api、elasticsearch sql都提供了很好的支持。

主要特性和新加功能:

新加功能

索引文档增删改查全部支持对json特殊字符的转义处理

主要特性

1.快速配置、快速上手

快速在工程中导入bboss elasticSearch,bboss es restful组件不依赖elasticsearch官方任何jar文件,兼容所有elasticsearch版本。

maven坐标 

dependency>
    <groupId>com.bbossgroups.plugins</groupId>
    <artifactId>bboss-elasticsearch-rest</artifactId>
    <version>5.0.3.8</version>
</dependency>

 gradle坐标 

compile "com.bbossgroups.plugins:bboss-elasticsearch-rest:5.0.3.8"

 2.快速配置es地址和认证

对应的配置文件为conf/elasticsearch.properties 

## es服务器账号和口令配置

elasticUser=elastic

elasticPassword=changeme 

## restful http地址和端口配置

集群用逗号分隔:127.0.0.1:9200,127.0.0.1:9201,127.0.0.1:9202,单机就配置一个节点即可

elasticsearch.rest.hostNames=127.0.0.1:9200,127.0.0.1:9201,127.0.0.1:9202

3.快速开发

导入组件

import org.frameworkset.elasticsearch.ElasticSearchHelper;
import org.frameworkset.elasticsearch.client.ClientInterface;

健康检查-示例

ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil();
		//返回json格式健康状态
		String heath = clientUtil.executeHttp("_cluster/health?pretty",ClientInterface.HTTP_GET);
		System.out.println(heath);

获取集群状态-示例

ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil();
		//返回json格式集群状态
		String state = clientUtil.executeHttp("_cluster/state?pretty",ClientInterface.HTTP_GET);
		System.out.println(state);
Map<String,Object> state = clientUtil.executeHttp("_cluster/state",ClientInterface.HTTP_GET,new MapResponseHandler());//返回map结构

更多使用方法参考文档:高性能elasticsearch ORM开发库使用介绍

源码地址

GitHub:https://github.com/bbossgroups/bboss-elastic

码云:https://gitee.com/bboss/bboss-elastic 

完整的demo

https://gitee.com/bboss/elasticsearchdemo

https://github.com/bbossgroups/elasticsearchdemo

 

bboss es对比直接使用es客户端的优势

https://my.oschina.net/bboss/blog/1574927

 



感谢 yin_bp 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

资讯来源:www.bbossgroups.com

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



Favicon for 开源中国社区最新新闻 08:19 人工智能,机器学习和深度学习之间的差异是什么? » Post from 开源中国社区最新新闻 Visit off-site link

如果你在科技领域,你经常会听到人工智能,机器学习,甚至是深度学习。怎样才可以在正确的时间正确的使用这些词?他们都是一样的意思吗?然而更多时候,人们总是混淆的使用它们。

Favicon for 开源中国社区最新新闻 08:19 码云周刊 | 6 个开源项目提升物联网开发效率 » Post from 开源中国社区最新新闻 Visit off-site link

今天小编推荐6个可以快速提升物联网开发效率的开源项目,希望能够对大家带来收获!

Favicon for 开源中国社区最新新闻 08:19 开源访谈 | 李栋:2.0 划时代版本后的 Apache Kylin ,前路何方? » Post from 开源中国社区最新新闻 Visit off-site link

【开源访谈】邀请到了 Kyligence 技术合伙人兼高级软件架构师李栋,解疑 2.0 划时代版本之后的 Apache Kylin ,以及基于 Kylin 的云端服务平台 KyBot 。

Favicon for 开源中国社区最新新闻 08:19 每日一博 | 阿里 Dubbo 疯狂更新,关 Spring Cloud 什么事? » Post from 开源中国社区最新新闻 Visit off-site link

最近,开源社区发生了一件大事,那个全国 Java 开发者使用最广的开源服务框架 Dubbo 低调重启维护,并且 3 个月连续发布了 4 个维护版本。

Favicon for 开源中国社区最新新闻 08:18 HGraphDB — TinkerPop 图数据库的 HBase 实现 » Post from 开源中国社区最新新闻 Visit off-site link

是一个使用 HBase 作为图数据库的客户端层, 是Apache TinkerPop 3接口的实现。

Favicon for 开源中国社区最新新闻 08:18 码云推荐 | 基于 SOA 架构的分布式商城 xmall » Post from 开源中国社区最新新闻 Visit off-site link

基于SOA架构的分布式购物电商商城,前台页面为基于Vue的独立项目。

Favicon for 开源中国社区最新新闻 08:18 Microsoft 开源用于 VS Code 的 Java Debugger » Post from 开源中国社区最新新闻 Visit off-site link

Microsoft 开源用于 VS Code 的 Java Debugger

微软推出的免费的跨平台代码编辑器Visual Studio Code(称为VS Code) 为9月份发布的 Java Debugger 开源代码。VS Code 在推出时就支持原生的 JavaScript,TypeScript 和 Node.js,并且可以扩展到支持各种其他语言(例如C ++,C#,Java,Python,PHP,Go),但是就语言的使用的广泛程度来讲, Java是使用最广泛的编程语言。

去年,Red Hat 弥补了这个遗憾,他们发布一个提供对Java语言支持的VS Code扩展。今年9月份红帽一经宣布,就已经有超过一百万的用户下载了这个扩展,仅在一个月内,下载的用户就已经达到160多万。红帽感谢用户和贡献者,也提醒人们期待另一个调试器—来自老朋友的。

这个“朋友”竟然是微软,Microsoft紧随红帽其后宣布,宣称它们正在发布 Java Debugger 和一个Java扩展包,将所有这些Java支持扩展捆绑到一个下载包中。

一个月后,Microsoft 的 Java 工具和服务项目经理Xiaokai He 宣称:调试器是“本月最受关注的扩展”,已经有超过125,000次的下载,Microsoft 开源 Java Debugger Extension和后端的Java Debug Server。并将这两个项目都放在 Github 上

Xiaokai He 告诉 InfoQ,VS Code团队的目标不仅是使其成为新的,偶尔开发的或熟悉多中开发语言的Java开发人员的开发工具,更是专业的全职Java开发人员的开发工具,专业的 Java 开发人员喜欢代码编辑器提供的其他功能。由于这个原因,我们可以期待更多的VS Code的Java扩展,例如支持 JUnit 的 Java 扩展。

Xiaokai He 指出,开源Java扩展是非常有意义的,因为VS Code本身就是开源的,而且Java Debugger也依赖于其它的开源项目(即Eclipse JDT Language Server)。He 补充说,开源过程既有助于团队投身于Java社区中,又能加强与 Red Hat 在创建扩展上的合作。

编译自:www.infoq.com/news/2017/11/JavadebuggerForVSCode

Favicon for 开源中国社区最新新闻 08:18 微软认为:人工智能面临的最大障碍是部署速度不够快 » Post from 开源中国社区最新新闻 Visit off-site link

微软认为:人工智能面临的最大障碍是部署速度不够快

微软战略政策顾问戴夫海纳(Dave Heiner)表示,如果只有少数几家公司在运行人工智能,那么它很难被广泛应用。人工智能面临的最大的困难就是它不能够在人类的所有领域都足够快地进行部署。

海纳在悉尼举行的微软峰会上表示:“人工智能对任何一个领域都是会有帮助的。但是如果只是由四五家公司运营,它很难被广泛部署。”

他还指出,尽管AI更喜欢使用“智能计算”这个词,但其目的是在教育,医疗和政府等行业作出贡献,而不是让人类变得多余。

微软公司首席讲师兼总经理史蒂夫·克莱顿(Steve Clayton)也持有相似的观点,他说公司正敦促企业领导者“用制造者和创造者的思维来取代节省劳动力和自动化的心态”。

同时,根据微软Azure公司副总裁Julia White的说法,“人工智能将取代人类”的说法是建立在人类不学习,不成长和不适应的基础上。

AI的发展首先需要确保消费者完全信任AI这项技术。

“我们需要消费者的信任,因为人工智能系统...依赖于数据,如果我们想用人工智能来帮助人们,比如了解谁有心脏病发作的风险,谁应该得到器官移植,那样的事情,首先我们需要得到关于人们的数据,“Heiner在微软峰会上表示。“如果人们不相信他们的数据会被很好地使用,他们就不会分享数据,如果人们不相信 AI,他们也不会使用 AI。那么人工智能就应该解决一系列的社会问题,例如系统的可靠性,与数据相关的隐私和系统的公平性及透明度来解释它是如何工作的。”

上个星期,澳大利亚竞争与消费者委员会(ACCC)指出,人工智能可以在不违背法律的情况下减少市场竞争。

ACCC已采取措施解决与AI有关的潜在的反竞争风险,根据2010年竞争和消费者法案引入新的规定,Sims认为可以通过部署机器学习算法来帮助确定利润最大化的下游价格并进行利润率缩减,来防止公司具有强大的市场支配力。

本月早些时候,联邦议员布里奇特•麦肯齐(Brian Bridget McKenzie)和埃德•赫斯(Ed Husic)表示,澳大利亚各界人士就AI的发展和需要建立的界限进行外交讨论

外交,国防和贸易立法委员会主席麦肯齐参议员说,如果像霍金和伊隆·马斯克这样的聪明人如果没有得到适当的监督和监管都可以对人类造成巨大的威胁,那么对于 AI 我们不应该只是警告而已。

“这不是关于对技术的恐惧,而是关于理性的关注和真正理解这种技术的潜力,这个技术的潜力在于,它不仅仅是一个听命令的机器人。 ..这是一个能够思考的机器人。”

数字经济 Shadow Minister Ed Husic 表示,澳大利亚有机会“支持这一技术”,并补充说,关于人工智能的初步发展不需要关注监管。

其他人,如瑞士神经科学家,Starmind Pascal Kaufmann创始人,相信“真正的人工智能”还不存在,因为公司正在将人脑比作电脑。但是,人的大脑不像电脑那样处理信息,检索知识或存储记忆。

考夫曼今年早些时候告诉ZDNet,在“大脑代码被破解”之前,AI仍然是一个停滞不前的技术领域。

考夫曼说,就像今天这样,人工智能通常只是“程序员凝聚在源代码中的人类智慧”,直到我们通过神经科学理解自然智能,我们才能够建立真正的人工智能。

人工智能近期发展状况:

微软利用人工智能为残障人士提供帮助

人工智能方面的问题确实需要仔细考虑,但是这不应该抑制人们能帮助残疾人兴奋感。

大数据和机器学习算法会增加共谋风险:ACCC

Rod Sims主席说,竞争与消费者法案新增的规定将使ACCC能够应对未来机器反竞争(anti-competitive)的行为。

不要惊慌,但你可能理解错了AI

这不仅仅是语义。了解什么是人工智能将帮助您预测您的行业(以及世界)的变化。

为什么阿里巴巴在双十一需要人工智能达到$ 25.3B(TechRepublic)

人工智能,机器学习和云计算等高科技在双十一为阿里巴巴带来了巨大的收入。

编译自:ZDNet

Favicon for 开源中国社区最新新闻 08:17 OSChina 周二乱弹 ——同桌男孩子动手动脚,我该怎么办 » Post from 开源中国社区最新新闻 Visit off-site link

天冷了,老妈给我寄了一大袋衣服。。。都是羽绒服。。。老妈,我的卫衣呢。。。 这就是你妈觉得你冷系列。

Favicon for 开源中国社区最新新闻 08:17 阿里开源容器技术 Pouch 和 P2P 文件分发系统“蜻蜓” » Post from 开源中国社区最新新闻 Visit off-site link

11月19日,阿里巴巴在《中国开源年会》上正式宣布开源容器技术“Pouch”和P2P文件分发系统“蜻蜓”。

这样,阿里巴巴开源和维护的开源项目已经超过150个,涵盖中间件、开发框架、数据库和各种工具类软件。

正如阿里巴巴CTO行癫所说:“开源和阿里巴巴都根植于互联网,有了互联网技术平台之后,开源和商业将在未来相当长的时间内保持平衡的发展。”

今天,在开源的这条路上,阿里正越走越快。

开源容器技术Pouch

开源的Pouch是基于阿里集团大规模电商实践推出的容器孵化项目,其中提供了容器和虚拟化集成的一些特性,适用于注重安全隔离场景的一些客户。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

Pouch是阿里巴巴业务封装的基础技术,帮助阿里集团大幅提高数据中心资源利用率,从而降低基础设施成本。

与此同时,Pouch孵化项目在兼容容器运行时标准的基础上,提供了多种特性。2017年双11期间,Pouch容器规模达到百万级,其稳定性、可靠性可见一斑。

明年3月份,Pouch会发布第一个可用版本。未来阿里云容器服务也会提供支持Pouch的容器技术实现。

通用文件分发系统蜻蜓

蜻蜓是基于智能P2P技术的通用文件分发系统,能解决大规模文件分发场景下分发耗时、成功率低、带宽浪费等难题,大幅提升发布部署、数据预热、大规模容器镜像分发等业务能力。

在阿里内部,蜻蜓的月均分发次数突破20亿次,分发数据量3.4PB,已经成为阿里的基础设施之一。

同时,从电商等集群规模大、业务发布频繁的企业来看,“蜻蜓”高效、快速、安全的文件分发能力,可以急速部署业务,大幅提高业务响应能力。

容器技术给运维带来了便利,但同时给镜像分发带来了巨大挑战:就是分发效率。蜻蜓支持Docker,Pouch等多种容器技术,使用蜻蜓后,镜像分发比原生方式提速可高达57倍,数据源网络出口流量降低99.5%以上。蜻蜓能为企业节省带宽资源,提升运维效率,并降低运维成本。

未来,蜻蜓的文件分发能力也会嵌入在阿里云容器镜像服务中。

阿里全面拥抱开源

阿里一直积极拥抱开源。

除了Pouch和蜻蜓,在刚刚结束的杭州云栖大会上,阿里宣布的多款顶级开源项目,更是引发了行业的关注。

它们包括:

OpenMessaging

OpenMessaging是将互联网业务对消息的需求进行抽象,形成了一套能满足大多数业务场景的标准模型,并提供连接大数据和流计算平台的能力,逐步发展一个消息规范。

ApsaraCache

ApsaraCache是在社区2.8 版本基础上开始维护的分支,并 backport 了部分3.0 分支的功能。与Redis相比,ApsaraCache的显著特点是与场景有关、与数据规模无关;并且在短连接、内存满时的回收、耗时指令执行等场景下表现优秀。

AliOS Things

这是一款轻量级物联网嵌入式操作系统,具备极简开发、云端一体、丰富组件、安全防护等关键能力,可广泛应用在智慧城市、智能家电、智能家居、新出行等领域,实现物联网设备快速上云。

阿里巴巴Java开发规约插件

该插件在扫描代码后,将不符合规约的代码按Blocker/Critical/Major三个等级显示在下方,甚至在IDEA上,还基于Inspection机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。

在杭州云栖大会开源峰会上,多位全球开源界的大神到场。他们也对阿里在开源方面做出的贡献表示了赞赏。

目前,阿里已经加入了包括自由软件基金会、Apache软件基金会、Linux基金会、MariaDB基金会和CNCF在内的多家国际知名开源组织。

开源和维护的开源项目超过也150个,涵盖中间件、开发框架、数据库和各种工具类软件。

Alibaba在GitHub上Star数超过170,000,组织排名前十。

转自:阿里云

Favicon for 开源中国社区最新新闻 08:12 HHVM 3.23 发布,高速的 PHP 执行引擎 » Post from 开源中国社区最新新闻 Visit off-site link

HHVM 3.23 已发布,此版本包含新功能、错误修复、性能改进和支持未来改进的工作。

有以下值得关注的更新:

  • optional shape fields 现在与 nullable shape fields 不同,有关帮助迁移的详细信息和工具,请参阅 3.22 发布公告

  • 支持 VSCode 语言服务器协议,这将很快被 Nuclide 的 Hack 整合使用

  • 函数可能不再命名为 using(),因为这将与即将到来的 using 特性相冲突

  • 支持使类型检查器完全忽略某些文件;这是通过 ignored_paths .hhconfig 实现的,其中包含一个正则表达式数组 - 例如,ignored_paths = [ "vendor/.*tests?/"

  • 现在支持元组常量

  • 方法调用现在支持括号表达式

  • 修复了一些需要中断(Ctrl-C) hh_client的情况

  • 支持针对 OpenSSL 1.1 进行构建,例如 Debian Stretch,Ubuntu Zesty 和 Ubuntu Artful

  • Hack 的实验性 bytecode emitter 替代方案

即将到来的变更:

Call-Time Pass-By-Reference

HHVM 3.24 将要求引用参数在调用点处标记 - 例如:

function foo(array<string> $bar): void {
  sort(&$bar);
}

3.23 中的 Hack 允许使用这种语法,但不需要这种要求。可以通过在 .hhconfig 中将 safe_pass_by_ref 添加到 enable_experimental_tc_features 来选择加入这种要求。

Lambda 类型推断

在 HHVM 3.24 中,将使用预期的 lambda 类型来改进它们;例如,下面的代码没有错误:

<?hh // strict
class MyClass {}
class MyClosureRunner<-T> {
  public function __construct(private (function(T): string) $closure) {}
}
function expectsMyClosureRunnerMyClass(
  MyClosureRunner<MyClass> $x,
): MyClosureRunner<MyClass> {
  return $x;
}
function getThing1(): MyClosureRunner<MyClass> {
  $var = expectsMyClosureRunnerMyClass(
    new MyClosureRunner(
      function(/* MyClass */ $arg) {
        $arg->missing_method();
        return "ok";
      },
    ),
  );
  return $var;
}

在 3.24 中,或者在 .hhconfig 中使用 enable_experimental_tc_features=contextual_inference,typechecker 会引发以下错误:

test.php:19:15,28: Could not find method missing_method in an object of type MyClass (Typing[4053])
  test.php:10:19,25: This is why I think it is an object of type MyClass
  test.php:3:7,13: Declaration of MyClass is here

更新内容较多,详情请查看发布主页

目前,3.23 的最新修正版 3.23.2 也已发布。

Favicon for 开源中国社区最新新闻 08:08 奇虎 360 正式宣布将停止 StartCom 数字证书业务 » Post from 开源中国社区最新新闻 Visit off-site link

该证书颁发机构原本为360旗下的沃通提供中级证书,同时还帮助沃通建立PKI设施和指导通过国际安全审计。

意外的是2016年下半年奇虎360通过控股公司完全并购了StartCom并将其部分PKI设施迁移到了奇虎服务器

由于牵涉安全问题 360 的秘密收购在行业里引起轩然大波,同时沃通公司还被发现故意签发违规的数字证书

此后沃通以及StartCom的证书均被主流操作系统和浏览器屏蔽,可以说最终这项收购案已完全变得得不偿失。

奇虎360正式宣布将停止StartCom数字证书业务

360突然宣布停止StartCom的业务:

目前沃通公司的数字签名由波兰的证书颁发机构提供, 同时该公司已经宣布变更英文名称以及LOGO标识等

现在360似乎也确实没有什么必要继续运行 StartCom 的业务, 毕竟被收购后其整体名声已经变得糟糕不堪。

360称将会在2018年1月1日停止从StartCom继续签发证书, 未来两年里也将会把现存的根证书直接吊销掉。

转自:蓝点网

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 面向微软合作伙伴和客户的Azure应用托管正式可用 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

面向微软合作伙伴和客户的Azure应用托管正式可用。

By Steef-Jan Wiggers Translated by 薛命灯
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 使用自选择创建团队 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

在企业中,自选择用于在团队间重新分配员工。使得开发人员有机会参与到战略决策中,并很好地理解业务需求。使用自选择,将赋予员工去承担困难的权利,并告知他们具体的决策情况。那么无论决策是多么艰难,员工都会积极主动参与其中。

By Ben Linders Translated by 盖磊
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 Realm发布Realm .NET,扩展支持.NET技术栈 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

继去年夏天Realm引入对.NET Core的支持,使开发者可以用C#来构建移动应用之后,Realm发布了Realm .NET。Realm .NET是一个可以让开发者更好地集成他们的.NET技术栈的新组件集。

By Sergio De Simone Translated by 张健欣
Favicon for 开源中国社区最新新闻 07:58 Hazelcast Jet 0.5 发布,分布式数据处理引擎 » Post from 开源中国社区最新新闻 Visit off-site link

Hazelcast Jet 0.5 已发布,Hazelcast Jet 是一个分布式计算平台,专为高性能大数据的流处理和快速批处理而构建。它在内存数据网格(IMDG)中嵌入Hazelcast,以提供轻量级的处理器包和可扩展的内存存储。这是 Hazelcast 最新的开源项目。

Hazelcast Jet 具有以下特性:

  • 低延迟和分布式的通用数据处理框架,具有高吞吐量

  • 高并行和分布式的数据流和批处理

  • 分布式  java.util.stream API 支持 Hazelcast 数据结构,如 IMap 和 IList

  • 连接器允许从 Apache Kafka, HDFS, Hazelcast IMDG, sockets 和本地数据文件(如日志或 CSV)高速获取数据

  • 自定义连接器的 API

  • 针对内部部署和云部署的动态节点发现

  • 通过 Docker, Apache jclouds, Amazon Web Services, Microsoft Azure, Consul, Heroku, Kubernetes, Pivotal Cloud Foundry 和 Apache ZooKeeper 进行虚拟化支持和资源管理

官方表示在许多方面这都是一个大版本的更新,带来了许多新功能,集中在下面这几个方面:

  • Fault Tolerant Stream Processing

  • Hazelcast Map Event Journal

  • Hazelcast Map Predicate and Projections

  • Custom source support for java.util.stream

详细更新内容请参阅发布说明:https://blog.hazelcast.com/jet-0-5-released/

使用

<dependency>
    <groupId>com.hazelcast.jet</groupId>
    <artifactId>hazelcast-jet</artifactId>
    <version>0.5</version>
</dependency>

源码下载

Favicon for 开源中国社区最新新闻 07:46 Futhark 0.2.0 发布,小型全新的函数式编程语言 » Post from 开源中国社区最新新闻 Visit off-site link

Futhark 0.2.0 已发布,与第一个版本相比,该版本没有添加主要的编译器优化特性,相反,该版本专注于各种提升使用体验的改进,具体更新如下:

Added

  • Run-time errors due to failed assertions now include a stack
    trace.

  • Generated OpenCL code now picks more sensible group size and count
    when running on a CPU.

  • scatter expressions nested in maps may now be parallelised
    ("segmented scatter").

  • Add num_bits/get_bit/set_bit functions to numeric module
    types, including a new float module type.

  • Size annotations may now refer to preceding parameters, e.g:

    let f (n: i32) (xs: [n]i32) = ...

  • futhark-doc: retain parameter names in generated docs.

  • futhark-doc: now takes -v/--verbose options.

  • futhark-doc: now generates valid HTML.

  • futhark-doc: now permits files to contain a leading documentation
    comment.

  • futhark-py/futhark-pyopencl: Better dynamic type checking in
    entry points.

  • Primitive functions (sqrt etc) can now be constant-folded.

  • Futlib: /futlib/vec2 added.

Removed

  • The built-in shape function has been removed. Use length or
    size parameters.

Changed

  • The from_i32/from_i64 functions of the numeric module type
    have been replaced with functions named i32/i64. Similarly
    functions have been added for all the other primitive types
    (factored into a new from_prim module type).

  • The overloaded type conversion functions (i32f32bool,
    etc) have been removed. Four functions have been introduced for
    the special cases of converting between f32/f64 and i32:
    r32r64t32t64.

  • Modules and variables now inhabit the same name space. As a
    consequence, we now use x.y to access field y of record x.

  • Record expression syntax has been simplified. Record
    concatenation and update is no longer directly supported.
    However, fields can now be implicitly defined: {x,y} now creates
    a record with field x and y, with values taken from the
    variables x and y in scope.

Fixed

  • The != operator now works properly on arrays (#426).

  • Allocations were sometimes hoisted incorrectly (#419).

  • f32.e is no longer pi.

  • Various other fixes.

发布主页完整更新日志

Futhark 是一个小型全新的函数式编程语言,可编译为高性能的 GPU 代码。使用静态类型、并行数据以及纯函数数组语言。该语言对编译器提前进行重度的优化,通过 OpenCL 生成 GPU 代码。Futhark 并非为图形编程而设计,通过使用 GPU 来加速并行的数组计算,支持常规嵌套的数据并行化处理。

Futhark 使用 Haskell 语言开发。

下载地址:

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 07:40 你不得不看的六篇知识图谱落地好文 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

知识图谱是基于图的数据结构,它的存储方式主要有两种形式:RDF 存储格式和图数据库 (Graph Database)。事实上,大部分开放的知识图谱,都是以 RDF 形式对外开放。那么什么是 RDF?RDF 有什么优点?这篇 AI 前线的公开课总结解答了这些问题。

By 杜小芳
Favicon for 开源中国社区最新新闻 07:39 Kubernetes v1.8.4 发布,容器集群管理系统 » Post from 开源中国社区最新新闻 Visit off-site link

Kubernetes v1.8.4 已发布,自 1.8.3 以来的变更:

  • Cluster Autoscaler 1.0.3 (#55947@aleksandra-malinowska)

  • Add PodSecurityPolicies for cluster addons

    • Remove SSL cert HostPath volumes from heapster addons

  • Fix session affinity issue with external load balancer traffic when ExternalTrafficPolicy=Local. (#55519@MrHohn)

  • Addon manager supports HA masters. (#55782@x13n)

  • ScaleIO persistent volumes now support referencing a secret in a namespace other than the bound persistent volume claim's namespace; this is controlled during provisioning with the secretNamespace storage class parameter; StoragePool and ProtectionDomain attributes no longer defaults to the value default (#54013@vladimirvivien)

  • Allow HPA to read custom metrics. (#54854@kawych)

  • Add masquerading rules by default to GCE/GKE (#55178@dnardo)

  • kubeadm now produces error during preflight checks if swap is enabled. Users, who can setup kubelet to run in unsupported environment with enabled swap, will be able to skip that preflight check. (#55399@kad)

  • GCE: provide an option to disable docker's live-restore on COS/ubuntu (#55260@yujuhong)

  • Fix hyperkube kubelet --experimental-dockershim (#55250@ivan4th)

  • ScaleIO driver completely removes dependency on drv_cfg binary so a Kubernetes cluster can easily run a containerized kubelet. (#54956@vladimirvivien)

需要了解其他更新请点此查看

下载地址:

此外,v1.10.0-alpha.0 和 v1.9.0-beta.0 也已发布,暂未发现更新内容。

Kubernetes 1.8 被定位为稳定版本,社区主要投入在稳固已有的功能上。稳定性提升主要集中在几个方向。应用负载相关功能已经迁移到 apps/v1beta2,意味着功能已经基本趋于稳定,很有可能会直接成为 v1 版本。安全相关的核心功能 RBAC 升级至 v1,并且高级审计功能升级至 beta,日趋成熟。节点层面在 1.8 中持续集中在提高底层稳定性,尽管同时有部分新功能推出。

Favicon for 开源中国社区最新新闻 07:31 Neo4j 3.2.8 发布,包含关键的安全修复 » Post from 开源中国社区最新新闻 Visit off-site link

Neo4j 3.2.8 已发布,Neo4j 3.2.8 是一个维护版本,包含关键的安全修复和其他重要的改进。

值得关注的更新

  • Causal Clustering: introducing a new cache for in-flight Raft entries

  • Cypher: important fixes for pattern matching under particular conditions

  • Packaging: Fixed broken service installation for paths with spaces on Windows

详细的变更

  • 有关所有更改的完整列表,请参阅更新日志

升级

  • 当从 Neo4j 3.2.0 升级到 Neo4j 3.2.8 时,需要完全关闭或者确保在升级期间完全不做更新。支持从 Neo4j 3.2.1 和更高版本到 3.2.8 的滚动升级。

发布说明下载地址

源码下载:https://gitee.com/mirrors/neo4j/tree/3.2.8

Neo4j 是流行的图形数据库,已被数千个组织采用。它是一个高性能图形存储,具有成熟和强大的数据库的所有功能,如友好的查询语言和 ACID 事务。它将结构化数据存储在网络上而不是表中,在享有灵活的数据结构的同时,还能有企业级数据库的所有优势。对于多数应用来说,Neo4j 和关系型数据库相比提供了数量级的性能优势。

Favicon for 开源中国社区最新新闻 07:24 RocksDB 5.8.6 发布,可持久化 key-value 存储系统 » Post from 开源中国社区最新新闻 Visit off-site link

RocksDB 5.8.6 已发布,RocksDB 是一个来自 Facebook 的可嵌入式的支持持久化的 key-value 存储系统,也可作为 C/S 模式下的存储数据库,但主要目的还是嵌入式。RocksDB 基于 LevelDB 构建。

更新内容如下:

Bug 修复

  • 修复使用 Windows 时,出现 aligned_alloc 的问题

5.8.1 (10/23/2017)

新特性

  • Add a new db property "rocksdb.estimate-oldest-key-time" to return oldest data timestamp. The property is available only for FIFO compaction with compaction_options_fifo.allow_compaction = false.

源码下载:

Favicon for 开源中国社区最新新闻 07:19 Puma 3.11.0 发布,Ruby 的 Web 服务器 » Post from 开源中国社区最新新闻 Visit off-site link

Puma 3.11.0 ("Love Song") 已发布,该版本包含了 2 个新特性,9 个 bug 修复以及 2 个其他的变更。详细如下:

071711_E4Bv_2720166.png

  • 2 features:

    • HTTP 103 Early Hints (#1403)

    • 添加 421/451 状态码 (#1435)

  • 9 bugfixes:

    • Environment config files (/config/puma/.rb) load correctly (#1340)

    • Specify windows dependencies correctly (#1434#1436)

    • puma/events required in test helper (#1418)

    • Correct control CLI's option help text (#1416)

    • Remove a warning for unused variable in mini_ssl (#1409)

    • Correct pumactl docs argument ordering (#1427)

    • Fix an uninitialized variable warning in server.rb (#1430)

    • Fix docs typo/error in Launcher init (#1429)

    • Deal with leading spaces in RUBYOPT (#1455)

  • 2 other:

点此查看完整更新日志

源码下载:

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 07:16 文章: gRPC线程模型分析 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo-tosca-1511195869780.jpg

gRPC的线程模型主要包括服务端线程模型和客户端线程模型,本文详细介绍了它的线程模型。

By 李林锋
Favicon for 开源中国社区最新新闻 07:12 XWiki 9.10 发布,Java 编写的开源 wiki 和应用平台 » Post from 开源中国社区最新新闻 Visit off-site link

XWiki 开发团队宣布推出 XWiki 9.10。XWiki 是一个用 Java 编写的开源 wiki 和应用平台。它的开发平台特性允许创建协作式 Web 应用,同时也提供了构建于平台之上的打包应用(第二代 wiki )。

第一代 wiki 是用于内容协作。第二代 wiki (又名应用程序 wiki )可用于创建协作式 Web 应用程序。xwiki 既可以用于第一代 wiki 也可以用于第二代 wiki。

这主要是一个重点改进新的通知功能的版本,以使其在年底之前(即在周期结束之前和选择新的 LTS 发行版之前)尽可能地打磨和使用。

已改进的通知界面 UI

070921_UtDd_2720166.png071146_UdhF_2720166.png

可以看到,通知菜单现在更加清晰,当点击日期时,每个事件的详细信息中都会有一个链接,以查看发生了什么变化。

已改进的通知邮件布局

071038_hYzE_2720166.png

通知的邮件布局已经完全重新设计

像往常一样,这个版本也包含了错误修复。

更新内容较多,详情请参阅发布说明 和 发布主页

下载地址

Favicon for 开源中国社区最新新闻 07:00 Apache Apex Malhar 3.8.0 发布,统一流和批处理引擎 » Post from 开源中国社区最新新闻 Visit off-site link

Apache Apex 是一个企业级的统一流和批处理引擎。提供高度可伸缩、高性能、容错、有状态、安全和分布式的大数据处理,同时操作起来非常简单容易。

Apache Apex Malhar 是一个开源的 operator 和编解码器库,可与 Apache Apex 平台一起构建实时流媒体应用程序。 使用户能够快速提取价值,Malhar 运营商可以实时获取数据,分析数据。 除了运算符之外,该库还包含许多示例应用程序,演示 operator 的功能和特性。

除了错误修复之外,Apache Apex Malhar 3.8.0 版本还改进了对 Flume 运算符的支持,对 bucketing 的 bloom 过滤器支持,在 kafka 输入运算符和多 Hbase 表输出运算符等方面有更好的故障处理。

此版本的新功能包括对 Kudu 的支持,除了增强一些示例应用程序外,还支持在 Windowed Operator 中的分类累积。

完整版更新内容请查看更新日志

下载地址:

http://apex.apache.org/downloads.html
http://www.apache.org/dyn/closer.lua/apex/apache-apex-malhar-3.8.0/apache-apex-malhar-3.8.0-source-release.tar.gz

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 06:58 文章: Apache Pulsar中的地域复制,第1篇:概念和功能 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
cloud-1511201258245.jpg

本文介绍了Apache Pulsar中的一项企业级功能:地域复制。该功能为当今企业提供了必不可少的防灾和恢复策略。大部分其他消息系统只能依赖两个数据中心之间的复制,而Pulsar可按需进行无限规模的伸缩。此外本文还将介绍Pulsar支持的两种地域复制类型:同步复制和异步复制,以及每种类型的适用场景。

By Sijie Guo Translated by 大愚若智
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 06:53 文章: 什么是“云原生”数据,以及为什么它很重要? » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
cloud-header-1509665408632.jpg

我们都知道云原生应用。但它们所依赖的数据服务呢?本文中,我们将了解云原生数据的特征以及意义。

By Richard Seroter Translated by 张斌
Favicon for 开源中国社区最新新闻 06:50 Sequelize 4.22.9 发布,Node.js 的 ORM » Post from 开源中国社区最新新闻 Visit off-site link

Sequelize 4.22.9 已发布,Sequelize.js 提供对 MySQLMariaDBSQLite 和 PostgreSQL 数据库的简单访问,通过映射数据库条目到对象,或者对象到数据库条目。简而言之,就是 ORM(Object-Relational-Mapper)。Sequelize.js 完全是使用 JavaScript 编写,适用于 Node.js 的环境。

这次更新的主要内容是 Bug 修复。

4.22.9 (2017-11-20)

Bug 修复:

  • 当使用 hooks 选项定义时,不会添加钩子代理 (#8664) (2afd48a)

点击查看更新内容和详细地址:

https://github.com/sequelize/sequelize/releases/tag/v4.22.9

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 06:15 视频访谈: 周恒:付钱拉交易系统架构演进与思考 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
zhouzheng270-1510569942981.jpg

我们现在正在ArchSummit全球架构师峰会,2017深圳站的现场,我们很荣幸的邀请到了付钱拉的高级架构师周恒老师来接受我们的采访,谈一谈付钱拉的 业务发展。

By 周恒

News stories from Monday 20 November, 2017

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 17:18 专访Niclas Hedhman:Apache欢迎什么样的开源项目? » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

11月18日,由开源社主办的中国开源年会COSCon17在上海召开。前Apache基金会副总裁Niclas Hedhman在大会上分享了《Apache软件基金会的故事》以及《The Evolution of Homo Nerdis-软件宅神进化史》,在会上,InfoQ记者对他进行了采访。

By 徐川
Favicon for 开源中国社区最新新闻 17:02 JavaBaas 2.0.0 正式版发布:增加数据原子操作 » Post from 开源中国社区最新新闻 Visit off-site link

JavaBaas 2.0.0 正式发布了,版本更新内容如下:

  • 增加数据原子操作

  • 集成 Swagger 接口测试工具

  • 集成短信相关功能

  • 增加手机号注册功能

  • 统一应用配置管理

  • 统一返回值结构

JavaBaas 是基于 Java 语言开发的后台服务框架,其核心设计目标是实现移动客户端、网页应用的后台数据存储、物理文件存储、消息推送等功能,极大的降低后台开发难度,实现快速开发。使用 JavaBaas 提供的工具进行简单的配置,即可完成后台搭建。后台搭建成功后,即可使用 RestAPI、iOS/Android-SDK 进行数据的增删改查等操作。

更多信息,参见项目主页:www.javabaas.com
项目地址:码云

Favicon for 小众软件 - Appinn 16:40 天梯图 – 桌面/手机 CPU、桌面/笔记本 显卡「性能对比图」 » Post from 小众软件 - Appinn Visit off-site link

天梯图 是驱动之家一直在持续更新的一个专题类内容,针对 手机 CPU 性能、桌面 CPU 性能、桌面显卡性能 以及 笔记本显卡性能,做出了一个非常直观的性能对比图标,称作 天梯图。@Appinn

感谢设备家 @bigman945 给青小蛙发来的天梯图。

在很久没有关注硬件市场后,其实青小蛙也不太了解当前计算机硬件发展到哪个水平了,于是很多时候朋友来问买电脑之类的,只能先做功课。

而这个天梯图就非常直观了,越上面的性能越好,并且根据不同系列、不同厂家都做了分类,当然唯二的遗憾是没有视频手机浏览…

随便点击哪个型号,都能看到具体的参数列表,非常的方便。

另外一个遗憾是,笔记本显卡性能天梯图的更新停在了 2016 年 4 月份,青小蛙已经发了邮件询问是否还会更新,不过其他几份天梯图都更新到了 2017 年 10 月份,非常及时。

下面是具体链接:


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 开源中国社区最新新闻 14:44 Lettuce 5.0.1 发布,Redis Java 客户端 » Post from 开源中国社区最新新闻 Visit off-site link

这是Lettuce 5发布的第一个修补程序版本,包含20个 tickets 修复和相关性升级。

更新内容:

改进:

  • Add SocketAddressOutput to directly parse SENTINEL get-master-addr-by-name output #644

修复

  • Lettuce doesn't fail early & cleanly with a host in protected mode #608 (Thanks to @exercitussolus)

  • CommandHandler.rebuildQueue() causes long locks #615 (Thanks to @nikolayspb)

其他:

  • Upgrade to netty 4.1.17.Final #646

  • Upgrade to Spring Framework 4.3.12 #648

文档:

参考文档: https://lettuce.io/core/5.0.1.RELEASE/reference/.
JavaDoc文档: https://lettuce.io/core/5.0.1.RELEASE/api/.

下载地址:

Favicon for 开源中国社区最新新闻 14:29 jsoup 1.11.2 发布,Java 的 HTML 解析器 » Post from 开源中国社区最新新闻 Visit off-site link

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。

jsoup的主要功能如下:

  1. 从一个URL,文件或字符串中解析HTML;

  2. 使用DOM或CSS选择器来查找、取出数据;

  3. 可操作HTML元素、属性、文本;

jsoup是基于MIT协议发布的,可放心使用于商业项目。

此次更新内容:

改进

  • Added a new pseudo selector :matchText, which allows text nodes to match as if they were elements. This enables finding text that is only marked by a brtag, for example.

  • Change: marked Connection.validateTLSCertificates() as deprecated.

  • Normalize invisible characters (like soft-hyphens) in Element.text().

  • Added Element.wholeText(), to easily get the un-normalized text value of an element and its children.

bug 修复

  • Bugfix: in a deep DOM stack, a StackOverFlow exception could occur when generating implied end tags.

  • Bugfix: when parsing attribute values that happened to cross a buffer boundary, a character was dropped.

  • Bugfix: fixed an issue that prevented using infinite timeouts in Jsoup.Connection.

  • Bugfix: whitespace preserving tags were not honoured when nested deeper than two levels deep.

  • Bugfix: an unterminated comment token at the end of the HTML input would cause an out of bounds exception.

  • Bugfix: an NPE in the Cleaner which would occur if an <a href> attribute value was missing.

  • Bugfix: when serializing the same document in a multiple threads, on Android, with a character set that is not ascii or UTF-8, an encoding exception could occur.

  • Bugfix: removing a form value from the DOM would not remove it from FormData.

  • Bugfix: in the W3CDom transformer, siblings were incorrectly inheriting namespaces defined on previous siblings.

下载地址:

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 11:30 京东虚拟商品系统的高可用架构设计 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

今天双11零点战争开启,截至凌晨2点,京东累计下单金额突破950亿元,在高流量高并发的情况下,电商系统如何做好技术攻关?各互联网企业又是如何做好容量评估、性能优化、稳定性等方面的?

By 李东辉
Favicon for 开源中国社区最新新闻 11:00 商城系统 DBShop V1.1 Release 20171118 发布 » Post from 开源中国社区最新新闻 Visit off-site link

DBShop 电子商务网店系统,采用PHP官方框架 ZendFramework 2 开发而成。在网上建立自己的店铺、自己的销售网站的不二之选。强大的后台管理及简单的操作流程,让您一见倾心。严谨的功能结合、贴心的提示提醒、全面的学习教程,让您一用放心。
更新内容

-------------------------------------------------

新增 cdn可加入动态处理样式(cdn服务商支持的情况下)
新增 本地上传图片调用时动态设置显示宽度(针对前台商品详情页面内的商品图片)
新增 七牛和阿里云存储的样式调用
修正 将属性值对应的组进行修改时,当属性为 单选、多选、复选 ,添加或者编辑商品选择对应的属性组不显示
修正 插件在更新时的一个小问题
修正 仿小米、健康绿、Dbmall 模板中商品列表添加高级规格商品到购物车的问题
优化 去除支付宝旧通知接口,强制使用新通知接口
优化 当编辑器未载入时,如果提交了,判断是否存在

DBShop 的下载地址:点击下载

Favicon for 开源中国社区最新新闻 10:18 下拉选择框的替换方案 SelectPage v2.15 完善 i18n » Post from 开源中国社区最新新闻 Visit off-site link

下拉分页选择器 SelectPage v2.15发布了,更新内容:

  • $.fn.selectPageText() 获得选中项目的文本增加对多选模式的支持

  • 增加 json 数据模式中 searchField 对指定字段进行搜索的功能,ajax 数据模式已支持

  • 完善国际化功能,将所有固定文本资源都替换为国际化处理

  • 解决原始输入框(input)在隐藏状态或是父容器是隐藏的状态下,宽度获得为0,导致插件变形的问题

  • 调整多选模式下,控制区域的展现方式和位置

  • 增加多选模式下,控制区的按钮功能描述文本显示区域

  • 修改 selectToCloseList 参数设置默认值为 false,即为在多选模式下,默认选择项目后不关闭列表

  • 修复 selectToCloseList 设置为 false,且有初始选中的项目时,初始化完成后,会自动打开窗口的问题

插件简介:

使用入门、实例、文档请访问:

中文官网

插件预览:

Favicon for ITeye资讯频道 10:15 数百种编程语言,而我为什么要学 Python? » Post from ITeye资讯频道 Visit off-site link
引用
如果让你从数百种的编程语言中选择一个入门语言?你会选择哪一个?

是应用率最高、长期霸占排行榜的常青藤 Java?是易于上手,难以精通的 C?还是在游戏和工具领域仍占主流地位的 C++?亦或是占据 Windows 桌面应用程序半壁江山的 C#?……

我想,每个人可能会根据工作要求的必然条件、兴趣爱好的充分条件,做出相应不同的选择。也有很多工程师在学习一门新的技术时,都会担心自己所学的技术是否会越来越流行,尽量去避免学习了一个非常小众和冷门的技术。这种担忧是可以理解的,毕竟,一门技术使用的人越多,对于早期学习这门技术的工程师来说,就有越多的好处和优势。与此同时,如果学习了一门冷门的技术,不但英雄无用武之地,而且,在求职市场上也没有什么优势。要问我的入门编程语言选择,我首选一定是 Python,其具体原因可以引用一位网友的回答,「学完 Python,可以上天」。
996e007e-c805-357a-bc82-894bf2df2280.png

图片来源于网络

Python 流行度

如果大家身处互联网,一定能够切身地感受到 Python 语言的流行程度。Python 语言由于其简单易学、语法优美、应用领域广泛等诸多优点,俘获了大批的粉丝。但是,拿不出确切的证据,很多开发者也无法说服自己静下心来学习。接下来我们就用数据来说话。

编程语言排行榜

首先,我们了解一下近期编程语言排行榜中,Python 语言排名的变化。TIOBE 每个月发布的编程语言排行榜是编程语言流行趋势的一个指标,每个月更新。这份排行榜排名基于互联网上有经验的工程师、课程和第三方厂商的数量,使用搜索引擎进行计算而得,一定程度上反应了编程语言的热度。
59fc4950-44ab-3b3a-8304-1871cee9ea08.png

2017年9月TIOBE编程语言排行榜

4e958f7d-0731-3f11-aa0c-fa793912f5d0.png

2017年10月TIOBE编程语言排行榜

446f4cb0-f70a-38a3-b531-3710f4f26848.png

2017年11月TIOBE编程语言排行榜

从近三个月的排行看,Python 一直稳定在排行榜的前五名。但编程语言排行榜仅能反应 Python 语言当下的流行程度,并不能回答 Python 是否越来越流行这个问题。不过,我们可以从 TIOBE 发布的历史数据中找到一些线索。在 2015 年 2 月份发布的 TIOBE 编程语言排行榜中,Python 还排在第 8 名的位置,短短两年半的时间,Python 语言已经蹿升到第 4 名,其上升速度不可谓不快。

Google trends

既然 TIOBE 的编程语言排行榜是根据搜索引擎得到的数据,那么,我们也可以通过搜索引擎得到 Python 的搜索指数,通过搜索指数来查看 Python 语言热度的变化。图1.1 给出了最近 4 年,Python 这个关键词的 Google 搜索指数。
706abc99-7d6b-3432-9296-f479b98aec73.png

图 1.1 Python 的 Google 搜索指数

图1.1中可以看到,从全球范围来看,Python 语言是越来越流行的,其热度超过了以往任何时候。从中国的搜索指数来看,Python 语言已经不是越来越流行这么简单了,而是出现了爆发式的增长。2014 年以前,Python 在中国都属于小众语言,从 2014 年开始,Python 在中国越来越火爆。一个有趣的事实是,在图 1.1 给出的 Python 搜索指数中,Python 在中国的搜索每年都会有一个非常明显的、向下的尖刺。这个尖刺所在的时间正好与春节的时间吻合,说明春节对所有中国人都是一个重要的节日,在春节期间,很少有人还在专研技术了。

微信搜索指数

我们再来看一下最新发布的微信搜索指数中,Python 语言的热度如何。图 1.2 给出了Python、Java、PHP 和 Ruby 的微信搜索指数对比图。
95865ff4-a018-374b-a935-fc97e7ca4b64.png

图 1.2 Python的微信搜索指数

由于微信最多支持 4 个关键词进行比较,因此,我们选择了 Java、PHP、Ruby 与 Python 进行比较。选择 Java 是因为它是一门比 Python 使用更加广泛的编程语言;选择 PHP 是因为它被认为是“世界上最好的”编程语言;选择 Ruby 是因为,它是所有编程语言中,与 Python 定位最近接近的编程语言。从图中可以看出,Python 语言和 Java 语言的微信搜索指数遥遥领先,并且,Python 语言的微信搜索指数比 Java 语言还要略高一点。

基于以上的编程语言排行榜、Google 搜索指数和微信搜索指数这几个不同的数据来源,检视了 Python 语言的流行程度。现在,我们可以非常明确的得出一个结论——Python 语言越来越流行,而且现在非常火。

那么为什么 Python 语言会越来越流行呢?

原因诸多,如越来越多的工程师使用 Python 进行大数据处理;科研工作者开始使用 Python 来进行数据分析;系统管理员使用 Python 管理 Linux 系统;开源的云计算平台 OpenStack 使用 Python 语言开发;很多编程爱好者使用 Python 进行爬虫等。但是,笔者认为,Python 语言之所以越来越流行,使用越来越广泛,主要还是得益于其自身的诸多优点。

对 Python 的爱与恨:那些不得不说的优缺点

显著的优点

Python 语言拥有诸多的优点,这其中,以下几个优点特别显著:
  • 简单易学: Python 语言相对于其他编程语言来说,属于比较容易学习的一门编程语言,它注重的是如何解决问题而不是编程语言的语法和结构。正是因为 Python 语言简单易学,所以,已经有越来越多的初学者选择 Python 语言作为编程的入门语言。例如,在浙江省 2017 年高中信息技术改革中,《算法与程序设计》课程将使用 Python 语言替换原有的 VB 语言。
  • 语法优美: Python 语言力求代码简洁、优美。在 Python 语言中,采用缩进来标识代码块,通过减少无用的大括号,去除语句末尾的分号等视觉杂讯,使得代码的可读性显著提高。阅读一段良好的 Python 程序就感觉像是在读英语一样,它使你能够专注于解决问题,而不用太纠结编程语言本身的语法。
  • 丰富强大的库: Python 语言号称自带电池(Battery Included),寓意是 Python 语言的类库非常的全面,包含了解决各种问题的类库。无论实现什么功能,都有现成的类库可以使用。如果一个功能比较特殊,标准库没有提供相应的支持,那么,很大概率也会有相应的开源项目提供了类似的功能。合理使用 Python 的类库和开源项目,能够快速的实现功能,满足业务需求。
  • 开发效率高: Python 的各个优点是相辅相成的。例如,Python 语言因为有了丰富强大的类库,所以,Python 的开发效率能够显著提高。相对于 C、C++ 和 Java 等编译语言,Python 开发者的效率提高了数倍。实现相同的功能,Python 代码的文件往往只有 C、C++ 和 Java 代码的 1/5~1/3。虽然 Python 语言拥有很多吸引人的特性,但是,各大互联网公司广泛使用 Python 语言,很大程度上是因为 Python 语言开发效率高这个特点。开发效率高的语言,能够更好的满足互联网快速迭代的需求,因此,Python 语言在互联网公司使用非常广泛。
  • 应用领域广泛: Python 语言的另一大优点就是应用领域广泛,工程师可以使用 Python 做很多的事情。例如,Web 开发、网络编程、自动化运维、Linux 系统管理、数据分析、科学计算、人工智能、机器学习等等。Python 语言介于脚本语言和系统语言之间,我们根据需要,既可以将它当做一门脚本语言来编写脚本,也可以将它当做一个系统语言来编写服务。
不可忽视的缺点

毫无疑问,Python 确实有用很多的优点,每一个优点看起来都非常吸引人。但是,Python 并不是没有缺点的,最主要的缺点有以下几个:
  • Python 的执行速度不够快。当然,这也不是一个很严重的问题,一般情况下,我们不会拿 Python 语言与 C/C++ 这样的语言进行直接比较。在 Python 语言的执行速度上,一方面,网络或磁盘的延迟,会抵消掉部分 Python 本身消耗的时间;另一方面,因为 Python 特别容易和 C 结合起来,因此,我们可以通过分离一部分需要优化速度的应用,将其转换为编译好的扩展,并在整个系统中使用 Python 脚本将这部分应用连接起来,以提高程序的整体效率。
  • Python 的 GIL 锁限制并发: Python 的另一个大问题是,对多处理器支持不好。如果读者接触 Python 时间比较长,那么,一定听说过 GIL 这个词。GIL 是指 Python 全局解释器锁(Global Interpreter Lock),当 Python 的默认解释器要执行字节码时,都需要先申请这个锁。这意味着,如果试图通过多线程扩展应用程序,将总是被这个全局解释器锁限制。当然,我们可以使用多进程的架构来提高程序的并发,也可以选择不同的 Python 实现来运行我们的程序。
  • Python 2 与 Python 3 不兼容: 如果一个普通的软件或者库,不能够做到后向兼容,那么,它会被用户无情的抛弃了。在 Python 中,一个槽点是 Python 2 与 Python 3 不兼容。因为 Python 没有向后兼容,给所有的 Python 工程师带来了无数的烦恼。
如何上手?

了解了 Python 的整体趋势及优缺点,接下来自然是如何学习 Python?在此笔者的建议是:
  • 找一本浅显易懂比较好的教程,无须多种选择,仅精选一本,从头到尾看完。将教程中的案例自己亲手实践一遍。
  • 通过实际项目练手。如果仅是纸上谈兵,可能过目就忘,所以最好是要有真实的项目做。注意,真实项目不一定非要是商业项目,例如自己动手搭建网站,其关键是要核心功能完整。
  • 最好能找到一个已经会 Python 的人。问他一点学习规划的建议,然后在遇到卡壳的地方找他指点。这样会事半功倍。但是,要学会搜索,学会如何更好地提问。
以下,本文也整理了一些有关 Python 学习及指导资料:
一小时入门 Python 3 网络爬虫
从 500 万条的微博语料对鹿晗、关晓彤微博的热门评论进行情感分析
国庆去哪里人最多?用 Python 抓取的热力图告诉你!
用不到 50 行的 Python 代码构建最小的区块链
最后,在选择使用哪一门编程语言之前,我还想提醒读者的是——“世界上只有两种编程语言,一种是天天被人吐槽但却被广泛使用的编程语言,一种则是无人问津没有存在感的编程语言”。Python 语言作为排名第一的动态类型语言,自然有它的道理。如果我们充分了解它的优缺点,在使用的时候,取其精华去其糟粕,那么,Python 一定是工程师解决问题的一把利剑。

而你为什么学 Python 呢?欢迎在下方留言,分享你的独特见解,也希望能为程序员界的后起之秀一些编程语言抉择的方向。

引用
作者:赖明星,资深云平台开发工程师、数据库内核开发工程师和高级运维工程师,现就职于腾讯CDG(企业发展事业群),曾就职于网易,网易云数据库MySQL云平台、MongoDB云平台的核心开发人员,网易大规模MySQL系统运维的负责人,独立完成MySQL存储引擎的TNT自动化研发和测试。出版作品《Python Linux系统管理与自动化运维》。
整理:苏宓。


感谢 jihong10102006 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



Favicon for 小众软件 - Appinn 10:07 手机视频里有一瞬间觉得自己特别美,请问怎么存成照片? » Post from 小众软件 - Appinn Visit off-site link

来自微信与小众好友 @SM君要做女王大人 最近有个问题,大家一起来帮忙解决:

简单来说,手机视频里有个瞬间觉得自己特别美,我要把这一秒种存为照片。

嗯,这个要求很简单,群里有同学推荐了不少工具,不过青小蛙觉得这个问题很具有普遍性,大家有其他更好的意见么?

另外,妹子使用 iPhone,当然推荐 Android 应用也是没问题的。

题图来自 iMovie 官网宣传图片。


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 开源中国社区最新新闻 09:24 DOClever 4.2.5 发布,增强了文档的markdown功能 » Post from 开源中国社区最新新闻 Visit off-site link

接口管理平台 DOClever 是一个商业化开源产品,完全免费。无论你是前端工程师,还是后端工程师,接口永远都是两者交互的桥梁,所以 DOClever 专为中小型团队量身打造,旨在解决接口的管理,测试与数据生成,实现真正的一体化解决方案。

4.2.5 版本值得关注的亮点包括:

  1. 修复了部分bug

  2. 修复了swagger的导入问题

  3. 增强了markdown的展示

下个版本发布计划:

下个版本是一个大的版本,界面重构,用户体验将全部进行提升,预计11月底推出,敬请期待~

DOClever,让接口更懂你!

Favicon for 开源中国社区最新新闻 08:15 码云本周更新汇总,附件容量升级至 1G ! » Post from 开源中国社区最新新闻 Visit off-site link

码云本周更新汇总,附件容量升级至 1G !

新增功能:

  • 上线活动:感恩节,一起来码云领福利啦! 去参与

  • 码云企业版新增项目及用户列表 详情

  • ApiV5 增加通知以及私信相关的接口 查看

优化功能:

  • PullRequest 调整为只可以单人进行审核或测试。

  • 文件查看界面按“L”可以快捷跳到某一行。

  • 项目附件的容量 从 512M 提高到 1G 。

  • 调整个人贡献度动态列表,默认显示最近动态。

  • 关闭 PullRequest 增加弹窗二次确认。

想要更流畅的开发体验吗?马上戳 >>> 码云 https://gitee.com/ 体验吧!

Favicon for 开源中国社区最新新闻 08:15 Pygit2 0.26.1 发布,libgit2 的 Python 绑定 » Post from 开源中国社区最新新闻 Visit off-site link

Pygit2 0.26.1 已发布,Pygit2 是一组通过 Python 绑定到 libgit2 的共享库,libgit2 实现 Git 管道。Pygit2 支持 Python 2.7,3.3,3.4,3.5,3.6 和 PyPy 2.6。

更新如下:

详情请查看更新日志

源码下载:

Favicon for 开源中国社区最新新闻 08:15 Apache Toree — Apache Spark 的远程交互和访问 » Post from 开源中国社区最新新闻 Visit off-site link

Apache Toree 是为了响应我们的需要而设计的,因为我们需要能够与 Apache Spark 进行交互和远程的应用程序

Favicon for 开源中国社区最新新闻 08:14 码云推荐 | 基于Nutz的微服务解决方案 NutzBoot » Post from 开源中国社区最新新闻 Visit off-site link

简称NB,基于Nutz的微服务解决方案。

Favicon for 开源中国社区最新新闻 08:14 谷歌浏览器 VS 火狐量子:哪一个更快呢? » Post from 开源中国社区最新新闻 Visit off-site link

Firefox网页浏览器有一个很有趣的特性,就是它会运行你想要的所有的标签。但是,它碰到了一个厉害的竞争对手-Google的Chrome浏览器。

Chrome浏览器自2008年发布以来,就已经成为了很多用户的首选浏览器。这是之前属于Firefox的荣耀,但是随着时间的推移,由于Firefox的运行速度和极度臃肿,Chrome 在某些意义上已经代替了 Firefox。

火狐量子的发布就是为了扭转这种局势。它最大的优势就是它的速度,火狐声称它的运行速度是一些浏览器的两倍。

我们决定在配备Intel Core i5 2500k处理器和8GB内存台式电脑上测试一下,并在MacBook Air上记录了我们的测试视频。

每个 Web 浏览器都使用默认设置进行测试,没有扩展或附件。这两个浏览器都没有启用广告拦截器也没有下载任何功能。浏览记录,缓存和Cookie也事先被清除。每个测试进行三次。

测试 Ares-6 

Ares-6 测量浏览器运行 Javascript 函数的速度,包括一些数学函数。你可以点击这里查看的细节。

得分较低代表运行速度快。



如你所见,当涉及到复杂的Javascript函数的运行速度时,Chrome比Firefox快。 

优胜者:谷歌浏览器

JetStream 测试

JetStream 1.1测试浏览器运行高级Web应用程序的能力。它可以测试包括3D立方体旋转,整数数学运算和库解析。点击这里查看完整的列表。

得分越高的浏览器越好。



这一次,Firefox超过Chrome,但不是太多。这应证了 JetStream 的说法,它更适合“高级工作负载和编程技术”。  

获胜者:Firefox Quantum

Speedometer 测试

Speedometer 模拟用户在Web应用程序上的操作(具体来说,将项目添加到 to-do 列表中)并测量他们所花费的时间。在这里测试一下。 

得分越高的浏览器越好。



优胜者:谷歌浏览器

Chrome仍然是胜利者

不幸的是,对于Mozilla来说,Chrome至少在现在看起来仍然是领先者。 

但实际上,量子浏览器不是金属块。这是一个功能强大,速度快的浏览器,有创新的书签功能和一个充满创意插件的库。经过 Mozilla 的开发人员在未来几个月内对 Quantum 改进,它有可能赶上Chrome。 

编译自:mashable

Favicon for 开源中国社区最新新闻 08:14 每日一博 | 如何 7 步实现源码包创建 rpm 包 » Post from 开源中国社区最新新闻 Visit off-site link

同样存在一种情况即你想要创建一个你自己开发的自定义的RPM包。这篇指南解释了如何提高源码来创建一个rpm包。

Favicon for 开源中国社区最新新闻 08:12 GitHub 将警告开发者流行软件库的漏洞 » Post from 开源中国社区最新新闻 Visit off-site link

今天的软件项目通常有大量的依赖库,而上游库的漏洞将会影响到下游软件。现在最大的开源软件开发平台 GitHub 宣布了安全警告服务,将搜索依赖寻找已知漏洞然后通过开发者,以便帮助开发者尽可能快的打上补丁修复漏洞。GitHub 将会识别所有使用受影响依赖的公开项目,使用私有库的项目则需要选择加入才能使用安全警告服务。

当你启用你的依赖关系图后,检测到您的某个依赖关系中的漏洞,GitHub 会提醒你修复已知的程序漏洞。

如何使用安全警报

无论您的项目是私有还是公共,安全警报都会为团队中的人员提供重要的漏洞信息。

启用您的依赖关系图

公共存储库将自动启用依赖关系图和安全警报。对于私人存储库,您需要在存储库设置中选择安全警报,或者允许访问存储库“Insights”选项卡的“依赖关系”图表部分。

设置通知首选项

启用依赖关系图后,管理员将默认收到安全警报。管理员还可以在依赖关系图中,设置将团队或个人添加为安全警报的收件人。

回应警报

当 GitHub 检测出您潜在的漏洞时,GitHub将显示建议更新的依赖关系。如果存在已知的安全版本,我们将选择一个使用机器学习和公开可用的数据,并将其包含在我们的建议中。

漏洞覆盖

具有CVE ID的漏洞(来自国家漏洞数据库的公开披露的漏洞)将包含在安全警报中。但是,并非所有漏洞都具有CVE ID,甚至许多公开披露的漏洞也没有。随着安全数据的增长,我们将继续更好地识别漏洞。

这是使用世界上最大的开源数据收集的下一步,可以尽量帮助您保持代码安全。依赖关系图和安全警报目前支持JavaScript和Ruby,并在2018年提供Python支持。

详细了解安全警报

编译自:GitHub

Favicon for 开源中国社区最新新闻 08:12 OSChina 周一乱弹 ——程序猿亲属:他们不为人知的一面! » Post from 开源中国社区最新新闻 Visit off-site link

听说深圳降温了,是的,又到了你妈让你穿秋裤的季节了。

Favicon for 开源中国社区最新新闻 08:12 区块链真的可以改变一切,甚至房地产业 » Post from 开源中国社区最新新闻 Visit off-site link


“这改变了一切。”这就是苹果公司在 2007 年推出的最初 iPhone 时所说的话。现在也可以用在区块链技术上了,区块链有在各个行业实现变革性创新的能力。

区块链技术主导型创新在银行和金融服务部门以及网络安全方面运用最为成熟,同时在供应链管理,保险和医疗保健方面也很有建树。

但是它很少涉及的领域是房地产行业,房地产行业是一个不透明的行业,它致力于自我保护,而不是保护消费者的利益。区块链如果得到法律的支持,不仅可以加强已经建立的流程,还可以创新模式,使住房更加便宜更加便捷。

区块链将从透明交易,增加租户的所有权,分割财产所有权的市场,明晰产权,放开资本等方面对房地产业进行创新。

编译自:VB

Favicon for 开源中国社区最新新闻 08:11 微软和 Databricks 等开源数据库建立“连接” » Post from 开源中国社区最新新闻 Visit off-site link

在 Connect 2017 期间,微软与 Databricks,Cassandra 和其他开源项目合作,希望成为企业开发人员云提供商的首选。

细数微软对开源作出的贡献。在纽约举行的Connect 2017会议上微软推出了新的Visual Studio工具, 期待人工智能能提供给开发人员更多的发展机会。

微软继续在Connect上发布大型开源通告,宣布将通过推出新版 Azure Databricks 服务(一种基于Apache Spark的大数据分析平台)的预览版来支持开源。Microsoft承诺开源 .NET Core,并加入Linux基金会

微软计划实施 Azure Databricks,企业部执行副总裁Scott Guthrie在博客中说到:“Azure Databricks 结合了 Databricks 和 Azure 的优点,通过一键安装,精简的工作流程和交互式工作空间帮助客户加速创新” 。

“与 Azure SQL 数据仓库,Azure 存储,Azure Cosmos DB 和 Power BI 的本地化集成,简化了现代数据仓库的创建,使企业能够通过企业级性能的关系数据和非关系数据提供自助式分析和机器学习能力“,Guthrie写道。

那些已经在Apache Cassandra数据库中完成大数据项目的开发人员,微软发布了一个预览API(应用程序编程接口),可以让他们无缝地定位到 Cosmos DB。

Cassandra 是一个开源的分布式数据库管理系统,可以部署在商品服务器上。Guthrie说,新的API将允许开发人员重新使用现有的代码,并使用全球分布的 Cosmos DB NoSQL 服务作为“Cassandra-as-a-service” 实现的基础。

该公司已经成为 MariaDB 基金会的白金会员。MariaDB 是由 MySQL 的创建者开发的关系数据库管理系统。MariaDB和MySQL创始人Monty Widenius在11月15日发布声明中说:“微软在 MariaDB 生态系统中学习也作出了贡献,MariaDB基金会支持微软实现这一目标。”

除了向社区提供一些技术专长之外,微软也正在致力于开发基于开源数据库的云服务,简称为 MariaDB 的Azure 数据库。想了解更多信息请点击这里

微软公司副总裁Brian哈利称:“微软已经与GitHub合作,将Git虚拟文件系统(GVFS)扩展到领先的代码库和项目管理平台,并将其移植到Mac和Linux操作系统上。”

不仅如此,微软在 Visual Studio Team Services 中使用的技术也被 Altassian 和 Bitbucket 采用。就 Git 客户端软件解决方案方面,gmaster和Tower Git 都支持GVFS。

编译自:Eweek

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 从大脑视觉皮层获得灵感,初创公司Vicarious利用AI破解了CAPTCHA的安全性 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

Vicarious利用称为“RCN(Recursive Cortical Network,递归皮质网络)”的新型网络布局改进了能够解决CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart,全自动公共图灵测试,以区分计算机和人类)挑战的神经网络。 与一般的神经网络在训练之前不具有任何知识相反,RCN带着与轮廓和表面相关的知识开始学习。 这种预备知识有利于模型的建立和推广。

By Roland Meertens Translated by 姚佳灵
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 SoundCloud的产品开发流程 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

2017年5月,SoundCloud公司的CTO Artem Fishman在内部的工程师年度聚会上,分享了SoundClou在的产品开发流程上面临的挑战和应对办法。

By 麦克周
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 Faiss:Facebook开源的相似性搜索类库 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

Facebook开源的Faiss(Facebook AI Similarity Search)的项目, 提供了一个相似性搜索的类库,能够快速从多媒体文档中搜索出相似的条目。Facebook 人工智能实验室(FAIR)基于十亿级别的数据集构建了最近邻搜索算法的实现,这比已知的最快算法还快大约8.5倍,因此创造了新的记录,包括第一个基于十亿高维向量构建的k最近邻图。

By Matthijs Douze, Jeff Johnson, He Translated by 杨振涛
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 Node.js 8.9 LTS版本发布 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

Node.js 8.9版本刚刚发布,成为首个开始享受长期支持状态的8.x版本。它将保持长期支持状态,直到2019年12月份。Node 9也刚刚发布。

By David Iffland Translated by 张健欣
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 Microsoft开源用于VS Code的Java Debugger » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

Visual Studio Code开源了发布于九月的Java Debugger代码。

By Tim Hodkinson Translated by 盖磊
Favicon for 开源中国社区最新新闻 07:59 ​微软的 Visual Studio Tools for AI 现已提供使用 » Post from 开源中国社区最新新闻 Visit off-site link

微软宣布新的 Visual Studio Tools for AI 现在可以下载使用,这是用于微软 Visual Studio 的一个扩展。

Visual Studio Tools for AI 扩展用于构建、测试和部署深度学习/AI 解决方案。

075820_wNqa_2720166.png

075949_piR0_2720166.png

微软发布 AI 套件:开发者可利用 Visual Studio 开发 AI 模型

它与 Azure 机器学习服务(Azure Machine Learning)无缝集成,提供强大的实验功能,包括但不限于将数据准备和模型训练作业透明地提交给不同的计算目标。此外,它还提供对自定义指标的支持和运行历史跟踪,从而实现数据科学的可重用性和审计。

其中,它的企业级协作让你可以安全地与其他人共同完成项目。

要注意的是,该工具不支持 32 位操作系统。

点此获取 Visual Studio Tools for AI

Favicon for 开源中国社区最新新闻 07:49 Tails 3.3 发布,内建因特网匿名访问的 Linux 发行版 » Post from 开源中国社区最新新闻 Visit off-site link

Tails 3.3 已发布,该版本修复了许多安全问题,建议用户尽快升级。Tails(The Amnesic Incognito Live System) 是基于 Debian 的自启动光盘或 USB 发行,其目标是为用户提供完整的因特网匿名功能。

该版本更新如下:

升级和变更

  • 升级 Tor 至 0.3.1.8,可在启动时节省带宽的使用

  • 升级 Tor Browser 至 7.0.10

  • 升级 Thunderbird 至 52.4.0

  • 升级 Linux Kernel 至 4.13.0

修复的问题

  • 通过使用 Universal USB Installer 修复U盘对 UEFI 支持的问题 (#8992)

  • 修复在启动 Tails Installer 之前,当插入目标U盘时,Tails Installer 中的文件系统创建错误 (#14755).

  • 修复 Debian sid 和 udisks2 最新版本上的 Tails Installer (#14809)

  • 在 Tor Browser 和 Thunderbird 中修复屏幕阅读器和屏幕键盘 (#14752#9260)

  • 启动会话时,使键盘布局的配置更稳定 (#12543)

有关更多更新详情,请查看更新日志

查看发布主页,可了解已知的问题和下载地址。

预计 2018 年 1 月 16 日发布 Tails 3.5。

Favicon for 开源中国社区最新新闻 07:30 GNU nano 2.9.0 发布,全功能且易用的文本编辑器 » Post from 开源中国社区最新新闻 Visit off-site link

GNU nano 2.9.0 已发布,代号"Eta"。新版主要是引入了记录和回放“击键”的功能,如记录宏和回放宏。具体如下:

GNU nano 2.9.0 "Eta" introduces the ability to record and replay keystrokes (M-: to start and stop recording, M-; to play the macro back), makes ^Q and ^S do something useful by default (^Q starts a backward search, and ^S saves the current file), changes ^W to start always a forward search, shows the number of open buffers (when more than one) in the title bar, no longer asks to press Enter when there are errors in an rc file, retires the options '--quiet' and 'set quiet' and 'set backwards', makes indenting and unindenting undoable, will look in $XDG_CONFIG_HOME for a nanorc file and in $XDG_DATA_HOME for the history files, adds a history stack for executed commands (^R^X), does not overwrite the position-history file of another nano.

此外,还修复了部分 bug。

发布主页:https://www.nano-editor.org/news.php

073049_JFfD_2720166.png

nano 是 Unix 和类 Unix 系统中的一个文本编辑器,是 Pico 的复制品。nano 的目标是类似 Pico 的全功能但又易于使用的编辑器。nano 是遵守GNU通用公共许可证的自由软件,自从 2.0.7 版发布,许可证从 GPLv2 升级到 GPLv3。

Favicon for 开源中国社区最新新闻 07:16 Visual Studio Code 1.18.1 发布,修复了部分问题 » Post from 开源中国社区最新新闻 Visit off-site link
Favicon for 开源中国社区最新新闻 07:05 SparkyLinux 4.7 稳定版发布,基于 Debian "Stretch" » Post from 开源中国社区最新新闻 Visit off-site link

SparkyLinux 4.7 稳定版已发布,代号"Tyche"。该版本带来了一个小更新 —— 使安装介质与上游 Debian 软件库保持同步。SparkyLinux 4.7 基于 Debian 9 'Stretch',没有什么大的变化,新的 ISO 镜像提供了所有已安装软件包的更新。

值得关注的已升级的软件包:

– Linux kernel 4.9.0-4 (4.9.51)
– Xfce 4.12.3
– LXDE 0.99.2
– Openbox 3.6.1
– Firefox ESR 52.5.0
– Thunderbird 52.4.0
– Pidgin 2.12.0
– HexChat 2.12.4
– VLC 2.2.6
– DeaDBeeF 0.7.2
– LibreOffice 5.2.7
– Transmission 2.92
– Calamares 3.1.8

有关更多信息和升级说明可以在项目的发布说明中找到。

SparkyLinux 是轻量级的、快速的、简单的 Linux 发行,它被设计为既适合老旧的也适合新式的计算机,并以定制的 Enlightenment 和 LXDE 桌面为特色。它基于 Debian GNU/Linux。

070525_tWwX_2720166.png

下载地址:https://sparkylinux.org/download/stable/

Favicon for 开源中国社区最新新闻 06:52 KaOS 2017.11 发布,引入 Elisa 作为默认音乐播放器 » Post from 开源中国社区最新新闻 Visit off-site link

KaOS 2017.11 已发布。除了使用最新的 Plasma Desktop(版本 5.11.3)之外,KaOS 2017.11 还引入了 Elisa 作为默认的音乐播放器。此版本将 Elisa 作为默认音乐播放器。KaOS 用户在最近一次调查中选择了这个选项。已经有几年了,但 Juk 音乐播放器终于移植到了 KF5,将能在 KaOS 库中再次可用。

064300_hoiS_2720166.png

Elisa 音乐播放器

Plasma 5.11.3 的亮点包括:

  • 在 KWallet 被禁用的情况下确保所有用户的密码能被存储

  • 同步 XWayland DPI 字体到 Wayland dpi

  • 通知可选择存储历史中错过和过期的通知

  • 新的 Plasma Vault 以对用户友好的方式提供强大的加密功能

  • 窗口标题逻辑已经在 X 和 Wayland 窗口之间统一,在 Wayland 默认的 X 字体 DPI 为 96

  • 全部构建于 Qt 5.9.2 上

已知的问题:

  • 目前不能在 RAID 或 LVM 上进行安装

发布主页下载地址

KaOS 是一份桌面 Linux 发行,其特色在于最新版本的 KDE 桌面环境及其他流行的使用 Qt 工具包的软件程序。它最初基于 Arch Linux,但从 2013 年四月起,开发者们开始创建他们自己的软件包,现在这些软件包可以从 KaOS 自己的软件仓库里获得。KaOS 采用滚动发布开发模式,并且只面向 64 位计算机系统。

Favicon for 开源中国社区最新新闻 03:51 Gogs 0.11.33 发布,自助 Git 托管服务 » Post from 开源中国社区最新新闻 Visit off-site link

Gogs 0.11.33 发布了,可选升级。

Bug 修复

  • 部分安全修复

  • 合并请求后发送的 Web 钩子推送内容包含错误的提交 ID #4442

  • HTML 标签 go-import 未响应正确的值 #4832

新增特性

  • 添加钉钉 Web 钩子支持 #4773

  • 支持合并请求前先进行衍合操作 #4798

功能改进

  • 在 LDAP BindDN 中支持使用 ‘%s’ 作为用户名占位符 #2526

  • 允许通过环境变量指定 Docker 容器内 git 用户的 UID #3520

  • 添加仓库设置以便在检查合并请求冲突时忽略空白符的差异 #4834

其它变更

  • 添加新语种支持:斯洛伐克语

下载地址:https://github.com/gogits/gogs/releases/tag/v0.11.33

Favicon for 异次元软件世界 03:43 [来自异次元] 相册飞船 - 无线快速备份传输手机照片视频到电脑 (WiFi 代替数据线) » Post from 异次元软件世界 Visit off-site link

xcfc_banner.jpg

如果你热爱用手机拍照或拍视频,一定经常会遇手机空间不足的烦恼。所以为了腾出空间,我们经常都需要将手机里的照片和视频传输到电脑上保存。

异次元介绍过 AirDoridSyncthingAirMore 等应用都能帮助你快速在手机和电脑之间无线传输文件(照片视频文档等)。今天介绍的「相册飞船」同样也是一款专门用来无线传输和备份手机照片/视频到电脑去的实用工具,而且它完全免费,可以完完全替数据线……

[ 马上前往围观.... ]


异次元还有这些值得一看:

异次元正版数字商城  |  异次元首页  |  iPc.me  |  新浪微博  |  软件精选

Favicon for 开源中国社区最新新闻 03:05 Hikyuu 1.0.6 发布,量化交易研究框架 » Post from 开源中国社区最新新闻 Visit off-site link

Hikyuu 1.0.6 已发布,这是一款量化交易研究框架。该版本更新如下:

  1. 完善Python帮助,以便在Shell中直接使用 help(cmd) 查询

  2. 修改数据驱动,支持直接使用Python编写数据驱动。实现使用 pytdx 作为K线数据驱动的示例,详见安装目录下“data_driver\pytdx_data_driver.py”。如有需要使用MySQL、CSV等存储K线数据的,可参考该示例自行实现。

  3. 优化了初始化过程,可不使用ini文件进行初始化,如实现自己的客户端,可参考“interactive.interactive.py”中初始化过程。

  4. 简化了数据配置文件如安装了1.0.5及其之前的版本,需要重新运行 python hku_config.py 进行配置,或手工修改配置文件 

  5. 修复Bug,TradeManager::getProfitCurve未对长度为0的dates进行保护

  6. 修正系统止损策略部件的缩写不一致问题

Hikyuu 是一款基于 C++/Python 的开源量化交易研究框架,用于策略分析及回测(目前用于国内股票市场)。与其他量化平台或回测软件相比,其独特性在于:将完整的策略分解为不同的组件,通过重用不同的方面策略,最大化的减轻编写策略的负担,如常见的止损和资金管理策略,只需要简单指定已有的止损或资金管理策略等,即可完成不同的策略组合;同时,可自由遍历所有股票,对策略效果进行综合的统计分析。如下面的示例,简单更好不同的资金管理策略,并查看相应的收益效果:

http://nbviewer.jupyter.org/github/fasiondog/hikyuu_examples/blob/master/007-SystemDetails.ipynb?flush_cache=True

更多信息,参见项目主页:http://hikyuu.org

Favicon for 开源中国社区最新新闻 00:05 热爱开源 感谢分享 » Post from 开源中国社区最新新闻 Visit off-site link

感恩节快到了,码云(Gitee.com)早就备好礼物等你了!邀请好友玩码云,感恩福利一起领

码云感恩节活动之二在这里参与噢

我们都是开源项目的受益者,感谢开源,成就了更好的我们。动一动手指,说说心里话,就有机会获得感恩节丰厚大奖哦~

活动规则:用户在评论区,贴上自己喜欢的开源项目在码云的地址,发表自己在感恩节想说的话,感谢自己喜爱的开源作者或者开源项目。活动截止11月23日24:00,评论得到点赞数排名前十的用户,将由码云送出价值300元的感恩大礼包一份。

示例https://gitee.com/jfinal/jfinal 简化传统 web 开发中各种配置极大提高了开发效率,超赞的框架,感谢jfinal这个强大的开源项目,给我在工作带来了很多便利与帮助。

活动时间:2017年11月20日——2017年11月23日

News stories from Sunday 19 November, 2017

Favicon for 小众软件 - Appinn 10:35 AOMEI PE Builder – 制作自己的 Windows PE 系统恢复环境 » Post from 小众软件 - Appinn Visit off-site link

AOMEI PE Builder 是一款用来创建自己的 Windows PE 环境的工具,支持从 Windows XP 到 Win 10,以及从 Windows Server 2003 ~ 2016 的所有系统版本,并且自带了十来个常用小工具。@Appinn

上图是青小蛙测试后成功运行了这个 PE 系统后的桌面,上面集成了一些常用工具,比如有 7zip、cpuz、Notepad2、SumatraPDF、Recuva 以及网络工具、磁盘功能等等。

PE 系统可以让你在真身系统崩溃,无法进入系统的时候紧急启动,做一些修复工作,当然最重要的工作其实是抢救数据。

毕竟系统可以重装,丢了的文档没了可就真没了。

AOMEI PE Builder 在安装过程中还需要下载运行环境,大概有 300 MB 左右,而最后得到的 PE 有 400M 左右。

除了内置的一些工具,还可以自定义你需要的文件或者启动器,这才是自定义的核心:

可能很多人要问,这和平时下载的 PE 系统有什么区别?

呃,青小蛙的感受是,尝试过几次,下载回来的 PE 系统要么不能用,要么乱七八糟不敢用,而 AOMEI PE Builder 是青小蛙一次就成功的系统 😂

真是要感慨这么多年了,江湖还是那样的险恶。

下载地址: https://www.aomeitech.com/pe-builder.html


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 开源中国社区最新新闻 08:36 PhpStorm 2017.3 Public Preview 包含许多重大改进 » Post from 开源中国社区最新新闻 Visit off-site link

083029_4rWB_2720166.png

PhpStorm 2017.3 Public Preview 已发布,PhpStorm 2017.3 也是 PhpStorm 的下一个主要更新版本。

下面介绍一些值得关注的更新:

REST Client

  • New REST client interface

  • Support for environment variables

  • Compare your requests

PHP Language

  • Performance improvements

  • Support for nullability in refactoring

  • Improved code templates

Bring exceptions under control

  • Unhandled exception inspection and quick fixes

  • Redundant @throws tag inspection and quick fixes

  • Redundant catch clause inspection and quick fixes

Testing

  • Create new Codeception and PHPSpec tests

  • Test method generation

  • Undefined PHPUnit data provider

Twig

  • Injections in Twig templates

  • Improved Twig formatting

请参阅问题跟踪器,以查看已修复的 PHP 相关问题的完整列表,以及来自当前 EAP 版本的发布说明

PhpStorm 2017.3 还对 Web 技术的支持进行了重大改进,例如改进了对 Vue.js 的支持,改进了 JavaScript 和 DOM API 的代码完成和文档,Pull Member Up 重构等等。

PhpStorm 2017.3 Public Preview 的特性概览下载地址

来自:https://blog.jetbrains.com

Favicon for 开源中国社区最新新闻 08:35 OpenR — 分布式模块化路由平台 » Post from 开源中国社区最新新闻 Visit off-site link

OpenR 是 Facebook 内部设计和开发的路由协议/平台。最初于 2016 年发布,作为所有运行于Terragraph上的硬件的软件基础,提供了一个测试更快、更有效的新型路由程序的框架,引导数据的高速流转,给予开发者们充分的灵活性。

Favicon for 开源中国社区最新新闻 08:27 码云推荐 | 模拟浏览器方式 Ratel » Post from 开源中国社区最新新闻 Visit off-site link

Ratel基于urllib和selenium实现request方式和模拟浏览器方式。

News stories from Saturday 18 November, 2017

Favicon for 小众软件 - Appinn 21:09 9.9.9.9 – 安全可靠,IBM 带来公共 DNS 的新选择 » Post from 小众软件 - Appinn Visit off-site link

9.9.9.9,这个极其特殊的 IP,是 IBM 免费推出的名为 Quad9 的公共 DNS 服务器地址,可以阻止恶意网址、钓鱼网站、恶意软件等由 the IBM X-Force 经过分析得出的黑名单列表,并且还有 18 个安全合作伙伴,可谓阵容强大。@Appinn

著名的 IP 向来有提供公共服务的先例,比如著名的 8.8.8.8、8.8.4.4,114.114.114.114 这些好记又漂亮的地址。

9.9.9.9 也足够好记,并且设置简单,直接提供本地的 DNS 地址就行了:

虽然,9.9.9.9 使用了 Anycast 任播技术,并且拥有全球 70 多个节点提供服务,不过目前并没有中国节点,据说 2018 年要增加至 160 个节点,但…到时候再说吧。

现在就使用,可能会导致一些国内的 CDN 变慢,不过会避免一些垃圾网站、恶意软件的攻击。而在国内还能避免 DNS 投毒,所以,自己决定吧。

而 @Ben Lamb‏ 则分享了其他几个极品 IP 地址的归属:

  • 1.1.1.1 – APNIC 亚太互联网络信息中心
  • 2.2.2.2 – 法国电信/ Orange
  • 3.3.3.3 – 通用电气
  • 4.4.4.4 – Level3 通信
  • 5.5.5.5 – E-Plus(德国第三大的手机运营商)
  • 6.6.6.6 – 美国陆军
  • 7.7.7.7 – 未使用的理论上属于美国国防部
  • 8.8.8.8 – 谷歌
  • 9.9.9.9 – IBM

©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 小众软件 - Appinn 13:08 Morning Routine – 扫码才能解锁闹钟,支持 Tasker [ANdroid] » Post from 小众软件 - Appinn Visit off-site link

Morning Routinemorning-routine 是一款已经 2 年没有更新,但看起来依旧没有过时的闹钟应用,支持多种解锁方式以及闹钟结束后调用 Tasker 等操作。@Appinn

感谢 @Taylor@TI 的推荐。

Morning Routine 为扫码爱好者们提供了两种扫码方式:

  • 随意扫码:无论二维码还是条形码,随意扫一个即可
  • 指定扫码:只能扫描某一个码才能解锁

青小蛙第一次玩的时候不知道该扫那个码,无奈重启了手机 😢

Morning Routine 还能设置闹钟后打开网页、app 或者直接调用 Tasker,基本上能作为一个智能闹钟来使用了。

解锁页面还会显示天气,不过在青小蛙这里显示 unknow,还不知道为何。

Morning Routine 的设计也不显得落后,青小蛙非常喜欢从左侧滑动屏幕进入设置页面的折叠效果,来看视频:

不过,唯一的遗憾是 Morning Routine 已经很久没有更新了,而从开发者网页中看起来,似乎是弃坑了,虽然用起来没什么问题,但…你们看着办吧 😂


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

News stories from Friday 17 November, 2017

Favicon for 小众软件 - Appinn 18:19 Zyl, the smart gallery – 智能归类相似照片,并创建相册 [iOS] » Post from 小众软件 - Appinn Visit off-site link

Zyl, the smart gallery 是一款通过 AI 自动识别同类照片,并创建相册的应用,还支持扫描并删除重复照片等功能。@Appinn

青小蛙拍照的时候,基本上是指管拍照不关分类的。于是正常情况下要找照片,只能通过时间线来寻找,首先回忆事件,然后推算发生的日期,最后翻相册…

而 Zyl, the smart gallery 能帮你自动分类并创建相册,至于如何分类的,青小蛙感觉是通过时间、地点、人物来决定的。但他们说有 AI 加持,于是就很聪明的总是能将需要的照片归为一类。

当然这也不是万能的,如果你的手机里有不少下载的照片,那么 AI 就混乱了 😂

去重功能倒是方便,Zyl 还会自动挑选看起来更好的那张,然后删掉重复的。

对于青小蛙这样的连拍爱好者尤其有用…


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for ITeye资讯频道 17:32 大促场景下热点数据写(库存扣减)技术难题解决方案 » Post from ITeye资讯频道 Visit off-site link

《大促场景下热点数据写(库存扣减)技术难题解决方案》

 

已经很久没有足够的时间让自己安静下来撰写一篇技术文章,确实近年来,大部分都花在了工作和2017年的新作品上。今天难得自己给自己打了瓶100ML的鸡血,出一篇前段时间针对交易系统大促场景下热点数据写优化的相关案例。当然,不同的企业有不同的解决方案和实现,但是万变不离其宗,还是那句话,对于大型网站而言,其架构一定是简单和清晰的,而不是炫技般的复杂化,毕竟解决问题采用最直接的方式直击要害才是最见效的,否则事情只会变得越来越糟

 

在大部分情况下,商品库存都是直接在关系型数据库中进行扣减,那么在限时抢购活动正式开始后,那些单价比平时更给力、更具吸引力的热卖商品大家肯定都会积极踊跃的参与抢购,这必然会产生大量针对数据库同一行记录的并发更新操作。因此数据库为了保证原子性,InnoDB引擎缺省会对同一行数据记录进行加锁,把前端的并发请求变成串行操作来确保数据更新时的一致性。

 

一、在RDBMS中扣减商品库存

先来看看如果是直接在数据库中扣减库存,应该如何避免商品超卖呢?在生产环境中我们可以通过乐观锁机制来避免这个问题,所谓乐观锁,简单来说,就是在item表中建立一个version字段。假设某一个热卖商品的实际库存为n,处于性能考虑对于查询库存操作是不建议加for update的,那么在并发场景下,必然会导致多个用户拿到的stock和version都一样。因此当第1个用户成功扣减商品库存后,则需要将item表中的version加1,这样一来,当第2个用户扣减库存时,由于version不匹配,那么为了提升库存扣减的成功率,可以适当进行重试,如果库存不足,则说明商品已经售罄,反之扣减库存后version继续加1。关于在数据库中使用乐观锁扣减库存的伪代码,如下所示:

 

public void testStock(int num) {
if (version不一致时的重试次数阈值) {
    SELECT stock,version FROM item WHERE item_id=1;
if (如果查询的指定商品存在) {
if (判断stock是否够扣减) {
             UPDATE item SET version=version+1,stock=stock-1 WHERE 
                          item_id=1 AND version="+ version +";
if (扣减库存失败) {
/* version不一致时开始尝试重试 */
testStock(--num);
} else {
logger.info("扣减库存成功");
}
} else {
logger.warn("指定商品已售罄");
}
}
}
}

 

如果系统前端不配合做限流消峰等处理,随意放任大量的并发更新请求直接在数据库中扣减同一热卖商品的库存数据,这将会导致线程之间相互竞争InnoDB的行锁,由于数据库中针对同一行数据的更新操作是串行执行的,那么某一个线程在未释放锁之前,其余的线程将会全部阻塞在队列中等待拿锁,并发越高时,等待的线程也就会越多,这会严重影响数据库的TPS,从而导致RT线性上升,最终可能引发系统出现雪崩。

 

二、在Redis中扣减库存
InnoDB的行锁特性其实是一把利与弊都同样明显的双刃剑,在保证一致性的同时却降低了可用性,那么究竟应该如何保证大并发更新热点数据不会导致数据库沦为瓶颈这其实是秒杀、抢购场景下最核心的技术难题之一。可以尝试将热卖商品的库存扣减操作转移至数据库外,由于Redis的读/写能力要远胜过任何类型的关系型数据库,因此在Redis中实现库存扣减将会是一个不错的替代方案,这样一来,数据库中存储的商品库存可以理解为实际库存,而Redis中存储的商品库存则为实时库存。

 

在Redis中扣减热卖商品的库存,或许有同学会有疑问,Redis如何保证一致性呢?如何才能做到不超卖和少买呢?答案就是Redis提供的Watch命令来实现乐观锁,和基于MySQL的乐观锁机制一样,并发环境下,通过Watch命令对目标Key进行标记后,当事务提交时,如果监控到目标Key对应的值已经发生了改变,那么也就则意味着版本号发生了改变,因此这一次的事务提交操作就失败,如图1所示:

图1 利用Redis乐观锁扣减商品库存 

 

Redis中扣减热卖商品的库存主要是出于以下2个目的:

1、首先是为了避免在RDBMS中,多线程之间相互竞争InnoDB引擎的行锁导致RT上升,TPS下降,最终引发雪崩的问题;

2、其次是能够利用Redis与生俱来的高效读/写能力来提升系统的整体吞吐量。

 

三、利用“分裂”技巧巧妙地提升库存扣减成功率

这里跟大家分享一个笔者公司的业务场景,由于特务特点,我们整点的限时抢购往往是爆款+大库存(几万至十几万不等的库存数),我们都知道限时抢购的峰值其实就是秒杀,并且还伴随的大库存。相对于普通的秒杀场景而言,由于库存并不多,如果上游系统配合交易系统做好扩容、限流保护、隔离(业务隔离、数据隔离,以及系统隔离)、动静分离、localCache等措施,秒杀场景下就能够将绝大多数流量挡在系统上游,让用户流量像漏斗模型一样逐层减少,让流量始终保持在系统可处理的容量范围之内。

 

由于“变态”的业务特点,业务系统除了要承受亿级流量的冲击,交易系统还要想办法提升下单时的库存扣减成功率,这对于我们来说确实是一次挑战,因为在生产环境中,一次的不小心,将会带来灾难性的后果。我们都知道架构的意义是有序的对系统进行重构,不断减少系统的“熵”,让其不断进步,但架构调整的失误,将会是不可逆的,尤其是那些成熟且用户规模较大的网站。

 

我们都知道,秒杀活动开始后,能够抢购到心仪的产品,是非常不容的一件事情,因为在同一个单位时间内,除了你之外,还有别的用户也在下单,那么针对同一个爆款的WATCH碰撞概率将会被无情放大,成功率自然降低。如果是小库存,直接返回商品已经售罄即可,但是多大十几万的库存,让用户看得到,买不到,心里痒痒的似乎不太友好,并且运营策略上也希望能够快速消完这些库存好制造噱头。

 

你不用指望能够利用某一种数据库就能够即提升吞吐量又提升成功率,首先你需要搞明白的是,这是一个实打实的单点问题,要保证一致性,就必然会牺牲成功率,这个矛盾点,该怎么解决呢?我们目前采用的做法是在Redis中,将某一个SKU的Key,拆分成N个对应的subKeys,库存服务在扣减库存的时候,通过轮询路由策略路由到不同的subKey上来降低WATCH碰撞概率,达到大幅度提升下单成功率的目的,如图2所示:

图2 将parentKey分裂为n个subKeys

 

分裂的概念相信大家都已经清楚了,接下来笔者再跟大家分享关于分裂操作的具体细节和一些注意事项。支撑分裂操作的主要由2部分构成,首先是嵌入在库存服务中的路由组件,其次是分裂管理服务,路由组件的任务很简单,订阅配置中心的分裂规则,然后轮询路由到不同的subKeys上做扣减即可。而分裂管理服务则相对复杂,parentKey的分裂操作就由它负责,并且它还需要处理一些相关的库存聚合(subKeys库存聚合)和下拉(重新划分库存给subKeys)任务。

 

分裂了,必然需要对分裂信息进行管理,比如:运营后台对某一个parentKey进行大库存扣减、调整某一个parentKey的分裂数量,以及删除某一个parentKey的分裂规则。这些操作全都包含着以下2个动作:
1、库存聚合(subKeys库存聚合),并将subKey库存设置为0;
2、然后将聚合后的库存归还给目标parentKey;

 

由于聚合和归还并不在同一个事物中,如果因为某些原因导致执行异常,那就悲剧了。比如聚合库存的时候成功了,这时subKeys的库存已经被设置为0,用户是无法正常下单的,但还库存给parentKey这个动作失败了,将会导致商品少卖,所以需要依靠以下2点来尽量保证商品不少卖:
1、业务上增大Redis的重试次数;
2、如果Redis故障,告警后人工介入归还库存;

 

为什么要区分普通用户扣减库存和运营后台扣减库存?因为这是2个截然不同的概念,因为用户扣减库存,往往会受限于业务(比如限制1个用户1次能够购买的商品数量),但运营后台则不同,有时候可能因为人为原因导致库存设超,因此需要扣减大量的库存,但是如果扣减的库存数量大于每一个subKey持有的有效库存数,则无法完成扣减操作,所以针对运营后台的扣减我们提供有单独的扣减方法,首先会聚合subKeys的库存并将subKey持有的库存数设置为0,将扣减后的库存还给parentKey,再等待重新下拉分配库存给subKeys。在此大家需要注意,如果一个商品特别爆,用户并发越大,聚合再分配的时间窗口期就会越长。

 

有时候,subKeys之间的库存数可能存在不均匀的情况,那么当某一个subKey持有的库存被扣减完,且无回流库存以便下拉重新分配时,只要路由到这个subKey的库存扣减动作都会是失败的,用户就会存在看得到,买不到的不友好体验,因此可以在路由组件上做动作,当某一个subKey的库存已经消完后,本地需要做剔除动作,下次不路由到这个subKey上。

 

最后给大家一点建议,如果parentKey的分裂数量越多,库存扣减的成功率就会越大,当然分裂数量也不是越多越好,一般来说一个parentKey分裂为10-20个subKey就够了,相对以前已经拥有了10-20倍的下单扣减成功率提升。

转发前,请询问我,3Q!



感谢 gao_xianglong 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



Favicon for 小众软件 - Appinn 17:16 静音 3.0 – 保持专注和平静,带番茄钟的白噪音应用 [iOS/Android] » Post from 小众软件 - Appinn Visit off-site link

静音 是一款帮助你保持专注和平静的白噪声白噪音应用,青小蛙在一年前介绍过他们的早期版本,相比起来,新版本漂亮许多了,并且新增了壁纸、格言、番茄钟、数据统计等功能,并且新增了 Android 版本。@Appinn

新版本更加清新漂亮了,主体操作没有变化,依旧用圆盘的形式来选择不同的音效,包括:

  • 森林
  • 海洋
  • 沙滩
  • 时钟
  • 雷雨
  • 小雨

可以点击不同的音效进行组合,长按还能调整单个音效的音量。

而在右上角则是新增的番茄钟,和倒计时在一起。

壁纸更换格言设置时间统计均藏在左上角的菜单中。内置了 10 来种壁纸,但并不支持自定义壁纸。

时间统计会分别统计番茄钟和倒计时:

静音 3.0 还能内购解锁更多的音效,喜欢白噪音的同学可以试试。


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 异次元软件世界 17:12 [来自异次元] 杀手已死:噩梦版 - 日式动画风炫丽的剑术系动作游戏 PC » Post from 异次元软件世界 Visit off-site link

killer_is_dead.jpg

国外知名游戏促销网站 Humblebundle 又来限时免费送游戏了!这次是《杀手已死 - 噩梦版》(Killer is Dead – Nightmare Edition) ,赠送的同样是 Steam 激活码,原价 ¥68 元。 《杀手已死》是一款风格独特的日式剑术系动作游戏,其画风十分特别,人设也不错,在 Steam 上的评价较好。最初是由 PS 平台独占的,后……

[ 马上前往围观.... ]


异次元正版数字商城  |  异次元首页  |  iPc.me  |  新浪微博  |  软件精选

Favicon for 小众软件 - Appinn 14:53 SDelete – 安全的、不可恢复的删除文件和擦除剩余空间 [Windows] » Post from 小众软件 - Appinn Visit off-site link

SDelete 是著名的微软 Sysinternals 免费工具集软件之一,用来安全的、不可恢复的删除文件,以及多次擦除剩余空间。@Appinn

呃,没错,这是一个没啥美感的命令行工具。

小众软件介绍过非常多的 Sysinternals 工具,各个都属于小巧实用性工具。

对于熟悉命令行的同学来说,SDelete 用起来很容易:

对于文件与文件夹:

sdelete64.exe demo.txt 直接删除 demo.txt 文件

sdelete64.exe -p 5 demo.txt 直接删除 demo.txt 文件,并且进行 5 次覆盖

sdelete64.exe -s c:\folders 删除 c:\folders 以及子文件夹

对于剩余空间

sdelete64.exe -c c: 安全的清除 C 盘剩余空间,不影响已有文件。

sdelete64.exe -c -p 5 c: 安全的清除 5 次 C 盘剩余空间

sdelete64.exe -z c: 对 C 盘剩余空间写零,适合虚拟磁盘优化

注意上面的 sdelete64 也可能是 sdelete,请根据你的操作系统 32、64 位而定。

下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete

一个小技巧

另外青小蛙还在这里发现一个小技巧,非常实用。

在资源管理器的任意路径下,直接在地址栏输入 cmd 即可在当前路径下打开命令提示符。


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for ITeye资讯频道 10:34 如何为微服务选择数据库 » Post from ITeye资讯频道 Visit off-site link
引用
原文:How to choose a database for your microservices
作者:Jeff Carpenter, InfoWorld
译者:Jackyrong

你的微服务架构需要多种数据模型。你是应该选择混合持久化呢还是多模型数据库?
cff9be28-e2df-34cd-8286-b7e668920cae.jpg

在过去的十年,大规模的分布式系统呈现爆炸式增长。这一趋势促使在数据库领域产生了一股巨大的创造力,这在软件业的历史上无疑是没有先例的。其结果是诞生了一个健康和充满竞争的数据库市场,我们可以因此在大量的平台中各取所需。但是我们应该如何抉择?

在本文中,我们将探讨如何为根据应用程序去选择核实的数据库模式。(是的,可以有一个以上的选择!),我们也会看看对数据模式的选择可以帮助确定在数据层中将选用哪些技术。

云架构,NoSQL 和微服务架构

随着开发人员开始创建可扩展的Web应用,历史上在数据架构上占主导地位的关系型数据库,开始显示出很大的压力。我们开发了非常流行的社交应用,并开始将越来越多的设备连接到物联网(IoT)。用户大量的读取和写入数据导致了必须扩展数据层,从而出现了新型的数据库来满足这些高可扩展性需求。

在许多情况下,这些新的数据库“NoSQL”或“非关系”的解决方案,所基于的数据模型和传统的关系数据库模型不同。NoSQL数据库包括有文档型、键值对型(key-value)、列式数据库甚至图数据库。通常来说,这些数据库牺牲了一些关系数据库的常见的的特性,如强一致性、ACID事务特性和join连接。

与此同时,和数据库技术的变革一样,在本世纪初的SOA(面向服务的架构),正逐渐演变为微服务架构的体系架构,许多企业也开始逐渐抛弃重量级的SOA体系架构如企业服务总线(ESB),并倾向使用“去中心化”的架构方法。微服务架构的魅力在于其开发、管理和扩展服务都是相对独立的。这给了我们很多在实施方面的灵活性,包括基础架构技术,如数据库。

举个例子,我们假设正在为微服务架构做开发工作,并期待着大规模的可扩展性的需求。无论这个项目是一个新的应用还是对现有应用的重构,我们都有机会针对数据库做出新的选择。

混合持久化(Polyglot persistence)

微服务架构风格的一个关键的好处,是持久性的封装。我们可以根据每个服务的需要,去选择不同的持久化技术。根据每种数据类型的特点而去选择数据存储的方法,被称为混合持久化,这一术语起初是由Martin Fowler等人推广起来的。混合持久化和微服务架构可谓是天作之合。

下图中,展示了一系列的微服务,以及我们如何为每个服务选择不同的数据模式。我不想在本文中,为每种类型的数据库去选择合适的用例。我的意图是要突出各类型数据库的优势,以及为什么混合持久化的方法是值得称道的.
6179081d-5e49-3285-8782-b504eafe4477.jpg

其中,开发服务A的团队,因为该服务是基于大规模数据管理的核心应用,可能使用如Apache Cassandra这样的表格模型数据库。例如,一个零售应用库存应用,可能很适合使用Apache Cassandra。Cassandra提供了一系列协调机制工具,如可调一致,批处理和轻量级的事务机制,可以作为完整ACID事务机制的替代。

服务B支持用众所周知的关键字查找值的方式,例如针对产品目录的描述性数据。对于键值存储模型来说,这是一个很好的例子,在这里,我们通过一个众所周知的键值(如产品ID)查找一系列的数据。很多内存缓存都使用键值对数据模式去支持大规模的快速读取。

服务C可能主要关注半结构化内容,例如Web站点的表单或页面,而文档存储可能非常适合该类型数据。文档存储与键值存储有许多相似之处,但是一个关键的区别是文档型数据支持数据上增加结构,例如对特定属性进行索引以支持快速检索。

服务D可能涉及数据之间的复杂关系导航,例如客户数据和与组织中各部门的客户联系历史数据。这可能涉及其他服务所拥有的数据类型之间的关系。这是一个有趣的案例,因为它开始与上面提到的服务有各自的数据类型的约束相反。在这种情况下,你可以选择为你的服务创建一个具有对底层表的只读访问的图,然后通过这个“前门”处理所有的变化——即通过这个“前门”去调用那些“拥有”这些数据类型的其他服务的API。

最后,我们可能还有一个使用关系数据库技术的遗留系统或服务,或者我们有一个服务来管理那些数据量较少,或者不经常变更的数据。关系数据库可能完全适合于这些场景。

单个服务是否应该使用混合持久化?

也有可能的是,我们可以设计一个服务,这个服务需要多种数据库支撑。例如,我们可以创建一个使用键值存储模式作为索引的酒店服务,在酒店名称和ID之间实现映射,而存将关于酒店的描述性数据存储在Cassandra中。
b33a7c54-0d89-38e1-a245-20cd417991fe.jpg

注意,名称映射到ID可以在Cassandra中采用规范化的设计方法去实现,其中一个单独表去维护名称至ID的映射关系。这使用了更多的存储空间,但降低了管理单独键值存储的操作复杂性。

这是我推荐的做法- 针对某个微服务,只要可行,就应该坚持使用单一数据模型(数据库)。如果你发现一种情况,认为单个服务需要两个不同数据库支撑,那么请考虑该服务的粒度是否可能变得太大。你可能需要考虑将该服务拆分为较小的服务。

混合持久化局限性的权衡

混合持久化的主要缺点在于支持多种技术的成本,无论是在最初的开发阶段和将来的运营方面。

主要的开发成本,是在需要培训每个开发人员去掌握每个新的数据库技术。这是非常重要的,尤其是在开发人员频繁流动团队中。

另一个成本是支持多个数据库的操作成本。这会成为一个问题,尤其是当数据库是集中管理,并且团队必须在多种技术的掌握上维持高水平,但这在DevOps环境下,该问题并不会太突出,因为开发团队需要支持他们在生产环境中选择的数据库。

多模型数据库(Multi Model Databases)

作为另外的选择方案或混合持久化模式的补充, 数据库厂商已经开始建立和推广多模型的数据库。术语“模型”指的是数据存储所提供的核心抽象,如表(关系和非关系)、列存储、键值、文档或图。我们可以将一个多模型应用程序看作一个使用多个数据存储类型的应用程序,而多模型数据库是支持多个抽象模型的数据库。

DataStax企业版(DSE)是多模型数据库的典型例子,它核心支持Cassandra的分区行存储(表格)模型,同时也支持基于在其之上的图的抽象层(DSE图)。DSE在核心模型之上构建对应的键值和文档模型也是很简单的,如下图所示。这样,我们可以修改上面的混合持久化的方法,从而利用一个基础数据库引擎为我们所有的服务提供对应的服务,而使用单独的Cassandra keyspaces在不同服务拥有的数据间维护清晰的边界。
c4fa2028-0165-34b7-b2b8-611ad5d90ea6.jpg

下面是它能实现的功能:
[list]表格:我们主要的应用服务A可以通过Cassandra的查询语言(CQL)直接和DSE的数据库打交道。 键值对:虽然Apache和Cassandra的分布式版本DataStax都没有提供明确的键值对API,但是象服务B可以通过表设计去支持单个键值和列的方法,去访问     Cassandra,例如:
CREATE TABLE hotel.hotels (key uuid PRIMARY KEY,value text); // 或者选择blob类型
文档型:Cassandra通过使用JSON文件支持文档型风格的数据,这可以用在服务C中。注意因为Cassandra需要针对表定义schema模式,所以不能插入新增任意的JSON列,这是一个可能通常和文档型数据库有关的特性。 图:对于象服务D那样相关度很高的数据,DSE的图是一个高度可扩展的图形数据库,它构建于DSE数据库之上。DSE图支持来自Apache tinkerpop项目中强大的功能和表现力的Gremlin API。[/list] 多模型数据库的优点和限制

在考虑是否投资使用多模型数据库(或你已经在使用的数据库的多模型的特性)时,你要考虑我们前文讨论的关于混合持久化中,同样的开发和运营成本的问题。

使用多模型数据库可以让运营变得简单。即使不同的开发团队使用不同的API和不同的交互模式和后端数据库平台打交道,我们也只需要管理一个平台而已,从而提高了效率。

在选择多模型数据库时要考虑的一个问题是如何支持各种模型。一种常见的方法,是基于单一的原生的基础模型的数据库引擎,而其他模型都是构建在其之上。分层数据模型更能展现底层基本模型的特性。

例如,ThoughtWorks技术雷达第16期中,讨论了基于Cassandra构建的DSE图数据库的特性,并且也提到其中需要权衡的内容:
引用
基于Cassandra 构建的DSE图数据库定位是大规模的数据集,相比之下我们长期喜爱的Neo4j开始表现出一定的局限性。这是需要取舍的;比如,你会失去了ACID的事务特性和Neo4j运行时的模式自由的特性,但却可以访问Cassandra的基础表,以及针对分析工作负载和Spark的整合,还有强大的TinkerPop/Gremlin查询语言可以使用,这的确是一个值得考虑的选择。

如果考虑Web应用中的各种数据类型,你可能会发现不同的数据类型对一致性有不同的需求,而且实际需要立即一致性的数据类型数量相对较少。

上面引用的ThoughtWorks的观点中,还提到了在考虑多模型数据库中另一个重要的因素 - 在不同的模型和数据引擎间的整合和交互问题,以及为访问数据的各种操作和分析的用例。DSE支持通过Spark(DSE分析)访问图数据以进行数据分析,并且DSE搜索引擎提供了针对DSE数据库中的数据创建各种查询索引的能力。

微服务数据模型操作的四个步骤

既然我们已经探讨混合持久化和多模型两种方式的优缺点,我们应该如何去决定哪些数据模型适用于大规模可扩展的微服务应用呢?可以按照以下步骤:

1、 识别你的应用程序中主要的数据类型,为其中每种类型创建一个服务,并让每个服务掌控相应的持久层。在可能的情况下,为所有服务都使用多模型数据库,允许服务在与数据交互的模型中是不相同的。

2 、用Tabular(例如DSE数据库)作为网络水平的可扩展性和可用性的主要模型,然后根据需要在此之上构建分层的键值对和文档数据模型。请务必考虑在操作和分析用例中访问数据的各种方法,以便提前计划如何将搜索索引和复制等特性用于数据分析中心。

3、用图的方法去表示(即DSE图)高度关联的数据,特别是在实体之间的关系有多个或多个属性,并且数量比实体自己的属性多的时候,或者需要在相同的实体之间捕捉多对多的关系的时候。

4、在不需要变更的情况下,保留关系数据库技术中的遗留投资。例如,当你的案例是需要大规模、低延迟和高可用性的时候,那就使用传统的关系型数据库吧。

我希望本文为读者提供了一个有用的框架,来考虑在应用程序中如何和怎么样去支持多数据模型,以及何时考虑使用多模型数据库。

Jeff Carpenter是在DataStax公司的技术传道者,他利用自己在系统架构、微服务和Apache Cassandra的知识去帮助开发者和运营工程师去构建可扩展的、可靠的,安全的分布式系统。Jeff是<< Cassandra:权威指南 第二版》的作者。


感谢 jihong10102006 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



News stories from Thursday 16 November, 2017

Favicon for 小众软件 - Appinn 20:17 Go谷歌安装器 – 为国产安卓手机一键安装「谷歌框架」 » Post from 小众软件 - Appinn Visit off-site link

Go谷歌安装器 是一款简单易用的谷歌安装器,无需 root,一键安装 Google 框架、服务、商店,让游戏不再闪退。@Appinn

Android 上有大量的优秀应用与有趣游戏,其中还是相当部分并没有专门为中国市场优化,于是出现了不少应用、游戏由于需要 Google 框架导致无法运行的情况。

传统做法,你需要安装 Google 的一系列工具,繁琐不说,想到就烦躁。

Go谷歌安装器 就容易太多了,只需要一键就能安装全套服务。

如果你的手机已经 root,会通过 Gapps 的形式安装。而非 root 设备则只需一键,就能搞定,已经适配多个国产手机品牌,部分品牌适配不完美,具体请安装后查看。

之后,你的手机就能正常使用来自 Google Play 商店的应用游戏了。Go谷歌安装器在酷安可以下载


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 异次元软件世界 18:09 [来自异次元] FireFox Quantum 火狐量子浏览器中文版 - 性能狂飙的全新版本!(免费开源 / 跨平台) » Post from 异次元软件世界 Visit off-site link

firefox_quantum_banner.jpg

火狐浏览器 FireFox 是一款先进、优秀且免费开源的老牌网络浏览器,是很多高手们极度热爱的产品。近年来版本更新非常迅速,在速度性能、安全性、兼容性方面均表现优异!

虽然现在 ChromeVivaldiWin10 自带的 Edge 等对手日益强大,但 FireFox 凭借着强劲的性能、丰富的插件扩展+稳定安全的浏览体验+跨平台支持电脑和手机,始终牢牢抓住大量用户的心!火狐拥有性能强悍的 Gecko 内核引擎,支持硬件加速,简洁可定制的界面、可分组管理的标签页、同步功能、反追踪隐私保护、支持HTML5等,这一切无疑让 Firefox 在众多浏览器中脱颖而出……

[ 马上前往围观.... ]


异次元还有这些值得一看:

异次元正版数字商城  |  异次元首页  |  iPc.me  |  新浪微博  |  软件精选

Favicon for 小众软件 - Appinn 16:58 用著名开源代码编辑器 Atom 的插件 Teletype 实现「多人实时编程」 » Post from 小众软件 - Appinn Visit off-site link

Atom 是一款由著名的「交友网站」Github 发布的开源代码编辑器,支持插件、主题、命令行等非常程序员式的操作,最近通过插件 Teletype 实现了多人实时编程功能,非常有趣。@Appinn

来自 tg 好友 @Fzhe 同学的推荐。

多人实时编辑文档早在很多年前就实现了,目前越来越多的在线文本编辑器都支持了这个功能。而多人协作代码编辑器则比较少见,毕竟每个人的风格不同,大家一起写会不会出现混乱,或者说还是适合一人编写多人围观的状况。

青小蛙录了一段视频,用起来还是很容易的。

安装起来也简单,直接搜索名为 Teletype 的插件,然后安装即可,需要登录 GitHub 账号。

之后一端分享,其他端加入。

一些细节:使用 WebRTC,初始需要连接 GitHub 服务器,所有数据经过加密后对等连接,目前仅能传输文本。

另外,@Fzhe 还提到昨天 Visual Studio 也出了类似的功能:Introducing Visual Studio Live Share


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for ITeye资讯频道 09:59 如何快速入门网络基础知识(TCP/IP 和 HTTP) » Post from ITeye资讯频道 Visit off-site link
引用

前言

在写之前,先给这篇文章做一个明确定位,读完这篇文章后,希望你能够:
  • 对于计算机网络有初步的认识和了解,了解一些经典专业术语,如三次握手、四次挥手、DNS解析的含义。
  • 了解一些应用层协议,如传统的HTTP、HTTPS协议,以及业界近几年开始逐步普及的HTTP2、QUIC协议。
  • 通过实际生产环境下的例子,了解网络优化在项目中的实际意义以及带来的效果。

课前准备

为了能够更好地理解这篇文章的内容,建议阅读之前做以下几个准备:
  • 了解TCP/IP的基本概念,推荐去阅读《TCP/IP协议详解》中的第3章和第17章,这里给大家一个链接,可以免费下载,传送门
  • 其次希望在学习的过程中,为了能够更好地看到效果,请下载抓包工具,这里推荐的是WiresharkCharles,大家可以下载后,结合文章内容并尝试抓包,更容易理解整个网络转发过程。
网络模型

在学习具体知识前,搞清楚它所在的知识体系和模型是非常重要的,对于网络知识亦是如此,目前公认的网络模型有两种,一种是OSI七层模型,另一种则是TCP/IP五层模型,请看下图:
0864ec89-a19e-39eb-a95b-db1459deae17.png

可以看到,OSI七层模型和TCP/IP五层模型存在一个对应关系,并且传输层以下的完全一致(TCP模型中的网络接口层就是数据链路层和物理层的集合),因此可以说将OSI模型中的会话层、表示层与应用层合并为TCP/IP模型中的应用层后,二者基本一致。

上述两个网络模型都属于通用网络模型,相对来说,TCP/IP模型更为普遍一些,所以我们也主要以TCP/IP模型为网络模型开展论述,这也是为什么这节课的名字TCP/IP的由来。

那么每一层都对应哪些协议呢?请看下图:
1cca9752-f62d-3c0d-afb5-b27780e2ad82.png

可以看到,我们熟知的一些协议,IP协议位于网络层,TCP协议位于传输层,而HTTP协议则位于应用层,其余还有比较熟悉的DNS协议,FTP协议等等,都有其所属的层级。
975ee150-3aa4-3755-8f9d-4a1c4887bad2.png

我们可以通过Wireshark抓包验证这一点,随便抓取一个HTTP报文:
e2f5af79-2c02-3d9e-9f38-d3f840fddd11.png

从上往下依次是Frame帧头、以太帧头、IP协议头、TCP协议头和HTTP协议头,最后的一行则是本次请求的数据,其格式为JSON

三握四挥

所谓三握四挥是指三次握手和四次挥手,也就是TCP协议建立连接和断开连接的过程,之所以叫做三次握手,是因为建立连接的双方需要经过三次数据交互以后才能完成连接的建立,同样的,四次挥手是指在断开连接时需要四次数据交互,其交互过程图如下:
0593793b-23cc-3316-aa58-c6498f086bd1.png

举个简单的例子,两个人小S和小C打电话,他们的三次握手建立连接过程就是:

小S:喂,是小C么? 小C:嗯嗯是的,你是小S么? 小S:是的是的,咱们开始愉快的聊天吧!

而四次挥手的过程则是:

小S:喂,小C,我有点累啦,今天要不就这样吧 小C:好呀,你休息下,我再说两句 小C:哎呀,我也好累呀,今天就到这里吧 小S:好,那就到这吧,886

然后小S和小C就挂了电话,我们注意到,在四次挥手的过程中,小S先提出了断开连接,但实际上他们的对话并没有结束,后面小C确认这个消息后,并没有立马断开连接,而是继续对话,这是因为TCP协议具备全双工特性,简单点说就是一个连接,存在小C——小S和小S到小C两条线路,而小S提出并由小C确认关闭的只是小S——小C这条线路,因此小C还可以继续向小S发消息,直到小C也觉得要关闭连接并由小S确认后,两人的所有连接才彻底关闭。

那么你肯定会问啦,为什么TCP要这么设计呢,这是因为TCP是一个全双工的协议,全双工(Full Duplex)是通讯传输的一个术语。通信允许数据在两个方向上同时传输,我们在上面的例子也提到了在一次TCP交互中,需要维持两条线路,因此无论是在建立和断开的时候,都要确保两条线路的状态正确。

上面的阐述还是建立在理论阶段,为了能更好地巩固知识,我们利用Wireshark在实际生产环境下抓包看下:

    客户端IP为:10.2.203.93 服务端IP为:10.108.21.2

客户端和服务端建立连接时的抓包情况:
fc807296-cb4f-351e-8992-8e6e1bdd79bc.png

可以看到由客户端首先发SYN报文,服务端收到并回应SYN ACK报文,客户端最后再回一个ACK报文,连接就算建立完毕了。

再来看看断开连接时的情况:
8abbe204-f1e2-3541-b995-6cd9821a2d46.png

和建立连接时不同,断开连接的发起者是服务端,可以看到服务端发送FIN报文,然后客户端再发ACK报文,此时服务端便不再向客户端传输数据,而客户端在完成数据传输后,也发送FIN报文到服务端,在收到服务端的Last ACK报文后正式断开连接。

关于TCP连接建立和断开时的三握四挥就先讲到这里,再附上一张TCP的状态迁移图,对了解整个TCP协议有很大的帮助:
b8b74673-36f2-31ed-9de9-0836e1b0e5c4.png

DNS解析

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。

这是来源于百度百科的一段描述,简单点说DNS解析做的工作就是,让我们把能记住的,比较好记的域名转换为IP地址的一个系统,下面我们就借助Wireshark来看看它到底是怎么工作的。

我们在浏览器中输入www.baidu.com时,会向服务器发送DNS请求报文,当服务器端处理完这个请求以后,就会发送DNS响应报文,其中就包含我们关心的IP地址,可以看到我们抓到两个报文,前者我们称之为DNS请求报文,后者称之为DNS响应报文,注意我们的筛选条件,通过UDP端口来过滤更加方便:
9dfada40-16a7-3317-86dc-51303f7316ee.png

先来看DNS请求报文:
3f8069f1-e7e8-313a-9e9f-40325fc9ae63.png

可以看到DNS的传输层协议是UDP,而不是TCP,并且其端口号为53。紧接着的是Transaction ID(2字节),这个ID可以作为DNS请求的一个唯一ID来使用,也就是说对于一个请求和应答报文,这个ID是相同的,因此也可以借助这个ID来查找请求报文相对应的应答报文。

Flags字段长度也是2字节,可以看到,16bit被分成了以下几部分,依次为:
  • Response(1比特),该值为0则说明是一个DNS请求报文,为1则说明是DNS响应报文
  • opcode(4比特):定义查询或响应的类型(若为0则表示是标准的,若为1则是反向的,若为2则是服务器状态请求)。
  • AA(1比特):授权回答的标志位。该位在响应报文中有效,1表示名字服务器是权限服务器
  • TC(1比特):截断标志位。1表示响应已超过512字节并已被截断
  • RD(1比特):该位为1表示客户端希望得到递归回答
  • RA(1比特):只能在响应报文中置为1,表示可以得到递归响应。
  • zero(3比特):不说也知道都是0了,保留字段。
  • rcode(4比特):返回码,表示响应的差错状态,通常为0和3,各取值含义如下: 0 无差错 1 格式差错 2 问题在域名服务器上 3 域参照问题 4 查询类型不支持 5 在管理上被禁止 6 -- 15 保留
紧接着Flags下面的几个字段分别是:queries、answers、authr、addrr,其相应的中文含义为问题数、资源记录数、授权资源记录数和额外资源记录数,它们的长度都是2字节,一般来说queries为1,其余的字段值为0。

接下来就是报文的正文部分,这里包括要查询的域名,查询类型和相应的查询类,这里的域名的格式比较特别,在这里的域名是www.baidu.com,而标记为蓝色的部分则是报文中的表示,可以看到,03是代表3个字节,而紧跟着3个77,如果转换为ASIC码的话,就是0x77,因此对于www.baidu.com,首先是以“.”为分隔符,分成3个部分后,用相应的段长度再加上域名段的ASIC组成一个段,这样就构成了一个完整的域名。
78e06c07-5c57-3c64-b940-f52983a95e0b.png

后续的两个字段分别是Type和Class,在这里两个字段都为1,其中Type为A则代表此次请求类型是通过域名获取IP地址,也是最为常见的一种DNS请求形式。而Class字段为1,则代表这里查询的数据是internet数据,也是最为常见的一种形式。

介绍完了请求报文,接下来再看一下响应报文:
6392a3d0-6af3-3073-a05a-dbb1b09f0908.png

响应报文和应答报文相同的部分就不再赘述了,可以看到Flags中的Response值为1,就说明这是一个响应报文,同时Transaction ID也和请求报文中的ID一致,说明这就是上面那个请求报文所对应的响应报文。

请求报文正文中最主要的部分就是Answers字段,这里面包括了我们想要的IP地址,但是我们也注意到,对于www.baidu.com这一个域名,响应字段居然有3条,那么究竟以哪一条为准呢?我们一条条来看。

首先是第1条Answer,这里的Type类型为CNAME,这里的CNAME表示这个回应是请求报文中查询的域名的一个别名,也就是此处返回的将是www.baidu.com的一个别名,也就是www.a.shifen.com,紧接着后面两个Answer,Type类型为A,代表返回值将是一个IPV4地址,其他的比较常见的Type类型还有AAAA——IPV6地址,PTR——IP地址转换为域名,NS——名字服务器。

可以看到,对于同一个域名,可以返回多个IP地址,在上面的响应报文中,返回了2个IP地址,分别是61.135.169.125和61.135.169.121,这就是我们最终想要的结果,为了防止其中某个IP地址出现异常,因此通常对于一个域名,都会有两个甚至以上的IP地址与其对应,这样便可以起到一个主备容灾效果,当其中一个IP地址无法连接时,还可以切换到另一个IP进行访问。在浏览器中输入 或61.135.169.121,也可以正常访问页面:
ae4b023b-96e9-3afa-8fc4-e89c2a832733.png

对于使用chrome浏览器的同学,可以输入chrome://net-internals/#dns 来查看浏览器DNS解析列表:
9acdc6e0-eb85-30e8-b5ab-7a117dfce8e1.png

在这里可以看到你访问过的网站,以及相应的解析记录,这里还有一栏TTL,代表域名解析结果的生存时间,简单点说就是当我们解析完毕一个域名以后,会将其记录缓存起来,在TTL时间之内的访问,我们都直接从缓存中获取,而不再去进行DNS解析,这样带来的好处就是减少DNS解析时间,加快网页访问速度,但同时带来的影响就是如果TTL值过大,那么如果服务器的域名解析发生变化,也需要很长时间才能在客户端生效,所以TTL要根据实际生产环境需求来调整

关于DNS的解析暂时将到这里,建议大家参照上面的抓包过程去实践一把,相信可以对整个过程有更深入的理解!

应用层协议

介绍完TCP协议和DNS协议之后,我们就要开始介绍处于TCP/IP模型中最上层的应用层协议了。应用层协议也是和用户交互最密切的,因此对用户感知影响也是最直接的,下面就以此介绍几种比较常见的应用层协议。

HTTP

HTTP(HyperText Transport Protocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。

上面是关于HTTP的权威描述,HTTP可以说是整个互联网当中最普遍也是最重要的一个协议了,包括你现在能看到我写的这篇文章,也是利用HTTP进行数据传输的,那么纠结是如何进行工作的呢?这次我们借助另外一款抓包神器——Charles来进行抓包分析。

当我们利用浏览器访问http://www.csdn.net/时,浏览器会在我们输入地址并敲下回车后在页面显示:
abe26da1-7a7d-3538-a36e-5f19bb4020f4.png

这是一个在平常不过的操作了,此时我们用Charles进行抓包,得到下面的结果:
5e7f1c0c-a73c-3ba9-9456-96fa6d3087e7.png

上面是整个完整的交互,实际上包含了两部分,首先是HTTP request请求,也就是上面中上半部分,可以看到,在request请求中几个关键点是GET、HTTP/1.1、Host、User-Agent、Accept以及Cookie,这些关键字构成了一个request请求的报文头,代表客户端想通过本次请求得到服务端的哪些数据,服务端在收到request后,作出的回应便是HTTP response报文,也就是上图中下半部分,因为我们访问的是csdn的主页,并且在Accept里也指定了html是一种请求数据,所以response报文返回的数据里便包含了HTML数据,当然,response报文也有其它组成部分,如下图所示:
e1beb4fa-c276-3bc6-89e0-c71b26cbccea.png

这里面就包括了服务端对于本次请求的回应数据,其中最关键的便是200 OK这个字段,这是响应状态码,最常见的就是200,也就是表明请求OK,还有比较常见的就是404和502,前者代表客户端非法请求,后者代表服务端响应失败,比如说我们输入http://www.csdn.net/test123时,页面就会提示:
0fc5a00a-aa3e-3105-9ddd-4c6e9ea61acb.png

HTTPS

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)

从上面的阐述中我们可以得到HTTPS = HTTP + TLS这样一个简单的结论,也就试试哦HTTPS是比HTTP更加安全的协议,并且目前已经有不少网站开始支持HTTPS了。比如说百度:
6c853dfa-a016-31cc-b613-5eef58f0dbd2.png

可以看到,使用的是HTTPS协议,同时浏览器会提示安全,我们再看另外几个例子:
1c4bfde6-9bdb-3a34-9134-2a8fd3b0a3f9.png

上图是工行的登陆界面,可以看到也使用了HTTPS协议,如果使用的仍然是HTTP协议,浏览器便不会有安全字样的提示:
37886cfc-7da6-3d6e-b57c-6e6b2e840844.png

哈,建行主页竟然还没有使用HTTPS协议,那是不是就说明建行不安全了呢?

其实不然,我们点击登陆按钮:
15230695-384f-378a-967e-21fe5658a56b.png

可以看到使用的协议还是HTTPS协议,这说明我们的登陆操作依然是有安全保障的,大大降低了账号信息被盗用的可能

HTTP2

HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),简称为h2(基于TLS/1.2或以上版本的加密连接)或h2c(非加密连接)[1],是HTTP协议的的第二个主要版本,使用于万维网。

HTTP/2是HTTP协议自1999年HTTP 1.1发布后的首个更新,主要基于SPDY协议。它由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。[2]该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论[3],于2015年2月17日被批准。[4]

HTTP/2标准于2015年5月以RFC 7540正式发表。[5]HTTP/2的标准化工作由Chrome、Opera、Firefox[6]、Internet Explorer 11、Safari、Amazon Silk及Edge等浏览器提供支持。[7]

多数主流浏览器已经在2015年底支持了该协议。[8]此外,根据W3Techs的数据,在2017年5月,在排名前一千万的网站中,有13.7%支持了HTTP/2。

可以看到HTTP2协议已经在互联网占有一席之地,那么它究竟比HTTP强在哪里呢?总结了一下,大致有以下几点。相比 HTTP/1.x,HTTP/2 在底层传输做了很大的改动和优化:
  • 二进制传输:HTTP2 采用二进制格式传输数据,而非 HTTP 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能
  • 多路复用:HTTP2 做到了并发请求。同时,流还支持优先级和流量控制。
  • 服务端push:服务端能够更快的把资源推送给客户端
  • 首部压缩:首部压缩使得整个HTTP2数据包小了很多,传输也就会更快
QUIC

QUIC是一种新的传输 方式,与TCP相比可以减少延迟。 表面上,QUIC与在UDP上实现的TCP + TLS + HTTP / 2非常相似。由于TCP是在操作系统内核和中间件固件中实现的,所以对TCP进行重大改变几乎是不可能的。但是,由于QUIC是建立在UDP之上的,所以没有这样的限制。

QUIC相比于上述介绍的HTTP、HTTPS和HTTP2协议最大的不同就在于,其传输层采用的是UDP协议而不是TCP协议,因此其具备的特性有以下几点:
  • 0-RTT 建联(首次建联除外)
  • 类似TCP的可靠传输
  • 类似TLS的加密传输,支持完美前向安全
  • 用户空间的拥塞控制,最新的BBR算法
  • 支持h2的基于流的多路复用, 但没有TCP的HOL问题
  • 前向纠错FEC
  • 类似MPTCP的Connection migration
那在实际环境中,如何知道哪些访问使用了HTTP2、哪些访问使用了QUIC协议呢?

这里就要提到chrome的一个插件——HTTP/2 and SPDY indicator,当下载该插件并成功访问后,我们就可以看到浏览器地址栏右侧会多一个⚡️标志:
7872a081-62e3-3c26-9c9d-a4eca7c2ad5f.png

访问百度时,这个⚡️标志是白色的,当我们访问YouTube时:
282cba8d-01be-3f95-aed1-6f4eaa4e6ead.png

会发现标志变为蓝色,鼠标移到该标志时,提示HTTP2已经使能,这说明在YouTube上面已经开始使用HTTP2协议了,在chrome浏览器中输入chrome://net-internals/#http2就可以看到具体哪些网站使用了HTTP2和QUIC:
82007429-c9db-3d66-beec-83cfe447b932.png

总结

本期的内容到这里也就告一段落了,希望读完本篇文章后,可以让你对网络有更深入的了解,并且能够在实际生活中,去留意这些知识,尤其是抓包分析网络问题,可以说是学习网络知识和分析网络问题的最大利器。

后续我会在这一期的基础上,再推出一期网络知识进阶篇,敬请期待!

感谢 jihong10102006 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

资讯来源:GitChat

已有 2 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



Favicon for ITeye资讯频道 09:15 Java8中流的性能 » Post from ITeye资讯频道 Visit off-site link
引用
原文:Performance With Java8 Streams
作者:Arun Pandey
翻译:雁惊寒

摘要:本文介绍了Java8中流的几个特性,以告诫开发者流并不是高性能的代名词,需谨慎使用流。以下是译文。

流(Stream)是Java8为了实现最佳性能而引入的一个全新的概念。在过去的几年中,随着硬件的持续发展,编程方式已经发生了巨大的改变,程序的性能也随着并行处理、实时、云和其他一些编程方法的出现而得到了不断提高。

Java8中,流性能的提升是通过并行化(parallelism)、惰性(Laziness)和短路操作(short-circuit operations)来实现的。但它也有一个缺点,在选择流的时候需要非常小心,因为这可能会降低应用程序的性能。

下面来看看这三项支撑起流强大性能的因素吧。

并行化

流的并行化充分利用了硬件的相关功能。由于现在计算机上通常都有多个CPU核心,所以在多核系统中如果只使用一个线程则会极大地浪费系统资源。设计和编写多线程应用非常具有挑战性,并且很容易出错,因此,流存在两种实现:顺序和并行。使用并行流非常简单,无需专业知识即可轻松处理多线程问题。

在Java的流中,并行化是通过Fork-Join原理来实现的。根据Fork-Join原理,系统会将较大的任务切分成较小的子任务(称之为forking),然后并行处理这些子任务以充分利用所有可用的硬件资源,最后将结果合并起来(称之为Join)组成完整的结果。

在选择顺序和并行的时候,需要非常谨慎,因为并行并一定意味着性能会更好。

让我们来看一个例子。

StreamTest.java:
package test;
import java.util.ArrayList;
import java.util.List;
public class StreamTest {
 static List < Integer > myList = new ArrayList < > ();
 public static void main(String[] args) {
  for (int i = 0; i < 5000000; i++)
   myList.add(i);
  int result = 0;
  long loopStartTime = System.currentTimeMillis();
  for (int i: myList) {
   if (i % 2 == 0)
    result += i;
  }
  long loopEndTime = System.currentTimeMillis();
  System.out.println(result);
  System.out.println("Loop total Time = " + (loopEndTime - loopStartTime));
  long streamStartTime = System.currentTimeMillis();
  System.out.println(myList.stream().filter(value -> value % 2 == 0).mapToInt(Integer::intValue).sum());
  long streamEndTime = System.currentTimeMillis();
  System.out.println("Stream total Time = " + (streamEndTime - streamStartTime));
  long parallelStreamStartTime = System.currentTimeMillis();
  System.out.println(myList.parallelStream().filter(value -> value % 2 == 0).mapToInt(Integer::intValue).sum());
  long parallelStreamEndTime = System.currentTimeMillis();
  System.out.println("Parallel Stream total Time = " + (parallelStreamEndTime - parallelStreamStartTime));
 }
}

运行结果:
820084320
Loop total Time = 17
820084320
Stream total Time = 81
820084320
Parallel Stream total Time = 30

正如你所见,在这种情况下,for循环更好。因此,在没有正确的分析之前,不要用流代替for循环。在这里,我们可以看到,并行流的性能比普通流更好。

注意:结果可能会因为硬件的不同而不同。

惰性

我们知道,Java8的流有两种类型的操作,分别为中间操作(Intermediate)和最终操作(Terminal)。这两种操作分别用于处理和提供最终结果。如果最终操作不与中间操作相关联,则无法执行。

总之,中间操作只是创建另一个流,不会执行任何处理,直到最终操作被调用。一旦最终操作被调用,则开始遍历所有的流,并且相关的函数会逐一应用到流上。中间操作是惰性操作,所以,流支持惰性。

注意:对于并行流,并不会在最后逐个遍历流,而是并行处理流,并且并行度取决于机器CPU核心的个数。

考虑一下这种情况,假设我们有一个只有中间操作的流片段,而最终操作要稍后才会添加到应用中(可能需要也可能不需要,取决于用户的需求)。在这种情况下,流的中间操作将会为最终操作创建另一个流,但不会执行实际的处理。这种机制有助于提高性能。

我们来看一下有关惰性的例子:
StreamLazinessTest.java:
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamLazinessTest {
 /** Employee class **/
 static class Employee {
  int id;
  String name;
  public Employee(int id, String name) {
   this.id = id;
   this.name = name;
  }
  public String getName() {
   return this.name;
  }
 }
 public static void main(String[] args) throws InterruptedException {
  List < Employee > employees = new ArrayList < > ();
  /** Creating the employee list **/
  for (int i = 1; i < 10000000; i++) {
   employees.add(new StreamLazinessTest.Employee(i, "name_" + i));
  }
  /** Only Intermediate Operations; it will just create another streams and 
   * will not perform any operations **/
  Stream < String > employeeNameStreams = employees.parallelStream().filter(employee -> employee.id % 2 == 0)
   .map(employee -> {
    System.out.println("In Map - " + employee.getName());
    return employee.getName();
   });
  /** Adding some delay to make sure nothing has happen till now **/
  Thread.sleep(2000);
  System.out.println("2 sec");
  /** Terminal operation on the stream and it will invoke the Intermediate Operations
   * filter and map **/
  employeeNameStreams.collect(Collectors.toList());
 }
}

运行上面的代码,你可以看到在调用最前操作之前,中间操作不会被执行。

短路行为

这是优化流处理的另一种方法。 一旦条件满足,短路操作将会终止处理过程。 有许多短路操作可供使用。 例如,anyMatch、allMatch、findFirst、findAny、limit等等。

我们来看一个例子。

StreamShortCircuitTest.java:
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamShortCircuitTest {
 /** Employee class **/
 static class Employee {
  int id;
  String name;
  public Employee(int id, String name) {
   this.id = id;
   this.name = name;
  }
  public int getId() {
   return this.id;
  }
  public String getName() {
   return this.name;
  }
 }
 public static void main(String[] args) throws InterruptedException {
  List < Employee > employees = new ArrayList < > ();
  for (int i = 1; i < 10000000; i++) {
   employees.add(new StreamShortCircuitTest.Employee(i, "name_" + i));
  }
  /** Only Intermediate Operations; it will just create another streams and 
   * will not perform any operations **/
  Stream < String > employeeNameStreams = employees.stream().filter(e -> e.getId() % 2 == 0)
   .map(employee -> {
    System.out.println("In Map - " + employee.getName());
    return employee.getName();
   });
  long streamStartTime = System.currentTimeMillis();
  /** Terminal operation with short-circuit operation: limit **/
  employeeNameStreams.limit(100).collect(Collectors.toList());
  System.out.println(System.currentTimeMillis() - streamStartTime);
 }
}

运行上面的代码,你会看到性能得到了极大地提升,在我的机器上只需要6毫秒的时间。 在这里,limit()方法在满足条件的时候会中断运行。

最后要注意的是,根据状态的不同有两种类型的中间操作:有状态(Stateful)和无状态(Stateless)中间操作。

有状态中间操作

这些中间操作需要存储状态,因此可能会导致应用程序的性能下降,例如,distinct()、sort()、limit()等等。

无状态中间操作

这些中间操作可以独立处理,因为它们不需要保存状态,例如, filter(),map()等。

在这里,我们了解到,流的出现是为了获得更高的性能,但并不是说使用了流之后性能肯定会得到提升,因此,我们需要谨慎使用。

感谢 jihong10102006 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



News stories from Wednesday 15 November, 2017

Favicon for 异次元软件世界 22:50 [来自异次元] 黑五限时 Mac 软件促销包: PDF Expert / Toast / WALTR 等 » Post from 异次元软件世界 Visit off-site link

mac_bundle.jpg

虽然国内双十一的大战才刚刚结束,但国外的黑色星期五又马上准备要来了!当然,异次元比较关注的还是在软件这一块的优惠。 StackSocial 刚刚上架了一个黑色星期五的 The Black Friday Mac Bundle (正版软件促销包),可以以超低的 2.8 折优惠价格购买到 8 款优质的 Mac 正版软件授权。 Black Friday Mac Bundle 黑五……

[ 马上前往围观.... ]


异次元正版数字商城  |  异次元首页  |  iPc.me  |  新浪微博  |  软件精选

Favicon for 异次元软件世界 21:06 [来自异次元] Fedora 27 正式版下载 - 更新快,自由开放的 Linux 发行版操作系统 » Post from 异次元软件世界 Visit off-site link

fedora_banner.jpg

Fedora 是一款非常流行且非常广泛的 Linux 发行版之一!它基于 Fedora Project(由红帽资助,旨在取代 Red Had Linux 在个人领域的应用),并由全球范围的社区志愿者和开发人员构建和维护。

相比 UbuntuCentOS、RedHat 等发行版,Fedora 最大的特色是追求并吸纳最新的技术,一些前沿技术和最新版本的软件往往是 Fedora 第一个使用起来的,加上开发社区人气兴旺,Fedora 相比其他发行版对编程工作者或者热爱尝鲜的技术爱好者有着更大的魅力……

[ 马上前往围观.... ]


异次元还有这些值得一看:

异次元正版数字商城  |  异次元首页  |  iPc.me  |  新浪微博  |  软件精选

Favicon for ITeye资讯频道 16:40 Go语言如何实现遗传算法 » Post from ITeye资讯频道 Visit off-site link
引用
原文:Go with Genetic Algorithms
作者:5280incode
翻译:Diwei

出于好玩的心态,我决定学习一下Go语言。我认为学习新语言最好的方法就是深入学习,并且尽可能多犯错误。这样做虽然可能会很慢,但是可以确保在后面的过程中再也不会出现编译的错误。

Go语言与我习惯的其他语言不同。Go更喜欢自己单独实现,而其他像Java这类语言更喜欢继承。其实在Go语言里面根本没有继承这种概念,因为它压根就没有对象这一说法。比如说C语言,它有结构体,但是没有类。但是这样它还是可以有像“构造者”这样的常见思想和设计模式(一种在这种情况下有序地产生结构体的方式)。

Go语言坚决拥护组合(composition),同时也很反对继承的做法,在网络上引起了强烈的讨论,同时也让人们重新思考了语言该往哪个方向发展。所以,从这个角度来看,Go语言与其它语言的差别可能也没有那么大。

本文将重点介绍如何用Go语言实现遗传算法。如果你还没有参加过GoLang Tour,我还建议你快速看一下这门语言的介绍。

话不多说,让我们开始从代码说起吧!第一个例子与我以前做过的很类似:找到一个二次的最小值。
type GeneticAlgorithmSettings struct {
  PopulationSize int
  MutationRate int
  CrossoverRate int
  NumGenerations int
  KeepBestAcrossPopulation bool
}

type GeneticAlgorithmRunner interface {
  GenerateInitialPopulation(populationSize int) []interface{}
  PerformCrossover(individual1, individual2 interface{}, mutationRate int) interface{}
  PerformMutation(individual interface{}) interface{}
  Sort([]interface{})
}

我立马定义了一组设置,以便在稍后启动的算法中用到。

第二部分的GeneticAlgorithmRunner这个看起来有点奇怪。GeneticAlgorithmRunner是一个接口,询问如何生成初始种群,执行corssovers和mutataions,并对答案进行排序,以便在Population中保持最好的个体,这样下一代才会更加优秀。我认为这看起来很奇怪,因为“接口”通常用于面向对象的语言,通常会要求对象实现某些特性和方法。这里没有什么差别。这一小段代码实际上是在说,它正在请求一些东西来定义这些方法的细节。我是这样做的:
type QuadraticGA struct {}

func (l QuadraticGA) GenerateInitialPopulation(populationSize int) []interface{}{
  initialPopulation := make([]interface{}, 0, populationSize)
  for i:= 0; i < populationSize; i++ {
    initialPopulation = append(initialPopulation, makeNewEntry())
  }
  return initialPopulation
}

func (l QuadraticGA) PerformCrossover(result1, result2 interface{}, _ int) interface{}{
  return (result1.(float64) + result2.(float64)) / 2
}

func (l QuadraticGA) PerformMutation(_ interface{}, _ int) interface{}{
  return makeNewEntry()
}

func (l QuadraticGA) Sort(population []interface{}){
  sort.Slice(population, func(i, j int) bool {
    return calculate(population[i].(float64)) > calculate(population[j].(float64))
  })
}

更奇怪的是,我从来没有提到过这些方法的接口。请记住,因为没有对象,也没有继承。QuadraticGA结构体是一个空白对象,隐式地作为GeneticAlgorithmRunner。每个必需的方法都在括号中绑定到该结构体,就像Java中的“@ override”。现在,结构体和设置需要传递给运行该算法的模块。
settings := ga.GeneticAlgorithmSettings{
   PopulationSize: 5,
   MutationRate: 10,
   CrossoverRate: 100,
   NumGenerations: 20,
   KeepBestAcrossPopulation: true,
}

best, err := ga.Run(QuadraticGA{}, settings)

if err != nil {
   println(err)
}else{
   fmt.Printf("Best: x: %f  y: %f\n", best, calculate(best.(float64)))
}

很简单,对吧?“QuadraticGA {}”只是简单地创建了该结构的一个新实例,其余的则由Run()方法完成。该方法返回搜索结果和发生的任何错误,因为Go不相信try / catch——另一场战争作者采取了严格的设计立场。

现在来计算每个项的性能,以求二次函数求出的二次函数来求出一个新的X值的方法:
func makeNewEntry() float64 {
   return highRange * rand.Float64()
}

func calculate(x float64) float64 {
   return  math.Pow(x, 2) - 6*x + 2 // minimum should be at x=3
}

既然已经为二次实现创建了接口,那么GA本身需要完成:
func Run(geneticAlgoRunner GeneticAlgorithmRunner, settings GeneticAlgorithmSettings) (interface{}, error){

   population := geneticAlgoRunner.GenerateInitialPopulation(settings.PopulationSize)

   geneticAlgoRunner.Sort(population)

   bestSoFar := population[len(population) - 1]

   for i:= 0; i < settings.NumGenerations; i++ {

      newPopulation := make([]interface{}, 0, settings.PopulationSize)

      if settings.KeepBestAcrossPopulation {
         newPopulation = append(newPopulation, bestSoFar)
      }

      // perform crossovers with random selection
      probabilisticListOfPerformers := createStochasticProbableListOfIndividuals(population)

      newPopIndex := 0
      if settings.KeepBestAcrossPopulation{
         newPopIndex = 1
      }
      for ; newPopIndex < settings.PopulationSize; newPopIndex++ {
         indexSelection1 := rand.Int() % len(probabilisticListOfPerformers)
         indexSelection2 := rand.Int() % len(probabilisticListOfPerformers)

         // crossover
         newIndividual := geneticAlgoRunner.PerformCrossover(
            probabilisticListOfPerformers[indexSelection1],
            probabilisticListOfPerformers[indexSelection2], settings.CrossoverRate)

         // mutate
         if rand.Intn(101) < settings.MutationRate {
            newIndividual = geneticAlgoRunner.PerformMutation(newIndividual)
         }

         newPopulation = append(newPopulation, newIndividual)
      }

      population = newPopulation

      // sort by performance
      geneticAlgoRunner.Sort(population)

      // keep the best so far
      bestSoFar = population[len(population) - 1]

   }

   return bestSoFar, nil
}

func createStochasticProbableListOfIndividuals(population []interface{}) []interface{} {

   totalCount, populationLength:= 0, len(population)
   for j:= 0; j < populationLength; j++ {
      totalCount += j
   }

   probableIndividuals := make([]interface{}, 0, totalCount)
   for index, individual := range population {
      for i:= 0; i < index; i++{
         probableIndividuals = append(probableIndividuals, individual)
      }
   }

   return probableIndividuals
}

很像以前,一个新的人口被创造出来,人口的成员将会世代交配,而他们的后代可能携带突变。一个人的表现越好,就越有可能交配。随着时间的推移,算法收敛到最好的答案,或者至少是一个相当不错的答案。

那么当它运行时,它返回了什么呢?
Best: x: 3.072833 y: -6.994695

不坏!由于人口规模只有5、20代,而且输入的范围被限制在[0 100],这一搜索就钉在了顶点上。

现在,您可能想知道为什么我定义了所有的接口方法来返回“接口{}”。这就像Go和generics一样。没有对象,因此没有对象类型返回,但是没有描述的大小的数据仍然可以在堆栈上传递。这本质上也是这个返回类型的含义:它传递一些已知的和类似的类型的对象。有了这个“泛型”,我就可以将GA移动到它自己的包中,并将相同的代码移到多个不同类型的数据上。

我们有两个输入的3D二次方程,而不是一个二维二次方程的单个输入。接口方法只需要很小的改变:
type Quad3D struct {
   x, y float64
}
func makeNewQuadEntry(newX, newY float64) Quad3D {
   return Quad3D{
      x: newX,
      y: newY,
   }
}

func calculate3D(entry Quad3D) float64 {
   return math.Pow(entry.x, 2)- 6 * entry.x + math.Pow(entry.y, 2)- 6 * entry.y + 2
}

type Quadratic3dGA struct {
}

func (l Quadratic3dGA) GenerateInitialPopulation(populationSize int)[]interface{}{

   initialPopulation := make([]interface{}, 0, populationSize)
   for i:= 0; i < populationSize; i++ { initialPopulation = append(initialPopulation, makeNewQuadEntry(makeNewEntry(), makeNewEntry())) } return initialPopulation } func (l Quadratic3dGA) PerformCrossover(result1, result2 interface{}, mutationRate int) interface{}{ r1Entry, r2Entry := result1.(Quad3D), result2.(Quad3D) return makeNewQuadEntry((r1Entry.x + r2Entry.x) / 2, (r1Entry.y + r2Entry.y) / 2,) } func (l Quadratic3dGA) PerformMutation(_ interface{}) interface{}{ return makeNewQuadEntry(makeNewEntry(), makeNewEntry()) } func (l Quadratic3dGA) Sort(population []interface{}){ sort.Slice(population, func(i, j int) bool { return calculate3D(population[i].(Quad3D)) > calculate3D(population[j].(Quad3D))
   })
}

func quadratic3dMain(){
   settings := ga.GeneticAlgorithmSettings{
      PopulationSize: 25,
      MutationRate: 10,
      CrossoverRate: 100,
      NumGenerations: 20,
      KeepBestAcrossPopulation: true,
   }

   best, err := ga.Run(Quadratic3dGA{}, settings)
   entry := best.(Quad3D)

   if err != nil {
      println(err)
   }else{
      fmt.Printf("Best: x: %f  y: %f  z: %f\n", entry.x, entry.y, calculate3D(entry))
   }
}

而不是到处都是float64s,任何地方都可以通过Quad3D的条目;每一个都有一个X和一个Y值。对于创建的每个条目,都使用contructor makeNewQuadEntry创建。Run()方法中的代码都没有更改。

当它运行时,我们得到这个输出:
Best: x: 3.891671 y: 4.554884 z: -12.787259

很接近了!

哦,我忘了说走快了!在Java中执行此操作时,即使使用相同的设置,也会有明显的等待时间。在一个相对较小的范围内求解二次方程并不是很复杂,但它对一个人来说是值得注意的。

Go是本地编译的,比如C。当二进制执行时,它似乎马上就吐出一个答案。这里有一个简单的方法来度量每次运行的执行时间:
func main() {
   beforeQuadTime := time.Now()
   quadraticMain()
   afterQuadTime := time.Since(beforeQuadTime)
   fmt.Printf("%d\n", afterQuadTime)

   before3dQuadTime := time.Now()
   quadratic3dMain()
   after3dQuatTime := time.Since(before3dQuadTime)
   fmt.Printf("%d\n", after3dQuatTime)
}

边注:我能说我很高兴我们是一个开发者社区,让他们从过去的错误中走出来,并把综合的时间模块和包构建成一种语言吗?Java 8 +拥有它们,Python拥有它们,并拥有它们。这使我开心。

现在的输出:
Best: x: 3.072833 y: -6.994695
136,876
Best: x: 3.891671 y: 4.554884 z: -12.787259
4,142,778

那“近乎瞬间”的感觉是我想要传达的,现在我们有了很难的数字。136,876看起来很大,但要在纳秒内报告时间。

重申一遍:纳秒。不是几毫秒,我们都习惯了在互联网时代或者其他像Python和Java这样的通用语言;纳秒。1/1,000,000毫秒。

这意味着我们在不到一毫秒的时间里找到了一个使用遗传算法来搜索答案的二次方程的答案。这句话,“该死的瞬间”似乎很合适,不是吗?这包括打印到终端。

那么,要计算更密集的东西呢?在我展示一种寻找好的梦幻足球lineups的方法之前,我在Fanduel上使用。这包括从电子表格中读取数据,制作和过滤lineups,并进行更复杂的交叉和突变。强制寻找最佳解决方案可能需要超过75,000年(至少使用我当时使用的Python)。

我不需要再检查所有的细节,你可以自己去看代码,但我会在这里显示输出:
Best: 121.409960:, $58100
QB: Aaron Rodgers - 23.777778
RB: Latavius Murray - 15.228571
RB: DeMarco Murray - 19.980000
WR: Kelvin Benjamin - 11.800000
WR: Stefon Diggs - 14.312500
WR: Alshon Jeffery - 9.888889
TE: Connor Hamlett - 8.200000
D: Philadelphia Eagles - 10.777778
K: Phil Dawson - 7.444444
16,010,182

哦,是的!现在看来这是一个很好的阵容!它只需要16毫秒就能找到。

现在,这个遗传算法可以改进了。与C一样,当将对象传递给方法时,将在堆栈上复制对象(读取数据)。随着对象大小的增长,最好不要反复复制它们,而是要在堆中创建它们,并在周围传递指针。目前,我将把它作为未来的工作。

Go也被用coroutines和信道的原生支持编写,利用多个内核来解决一个问题,比过去简单多了,相比于单核时代的其他语言来说,这是一个巨大的优势。我想要增强这个算法来使用这些工具,但这也必须留给以后的工作。

我很享受学习的过程。对于我来说,用组合而不是继承来考虑工程解决方案是很困难的,因为我已经习惯了8年以上的时间,也是我学会编程的方式。但是每种语言和方式都有各自的优点和缺点;每一种语言在我的工具中都是不同的工具。对于任何担心尝试的人,不要。有一个驼峰(更像是一个减速带),但你很快就会克服它,走上成功之路。

还有一些我喜欢的东西,我喜欢其他语言,主要是一组基本的函数方法来操作数据。我需要一个lambda函数和方法来映射、减少和筛选数据的数组或部分。设计人员反对功能实现的理由是,代码应该总是简单、易于阅读和编写,并且这与for循环是可实现的。我认为,映射、过滤和减少通常更容易读和写,但这是一场已经在肆虐的战争中的争论。

尽管我与一些开发人员的观点存在分歧,以及我必须考虑解决问题的不同方式,但Go真的是一种很好的语言。我鼓励大家在学习一两门语言后再试一试。它很快就成为了最流行的语言之一,有很多原因可以解释为什么。我期待着在未来更多地使用它。

感谢 jihong10102006 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



Favicon for ITeye资讯频道 10:07 如何简单实现接口自动化测试(基于 python) » Post from ITeye资讯频道 Visit off-site link
引用

一、简介

本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势,然后简单讨论了一下接口测试框架的要点,最后介绍了一下我们目前正在使用的接口测试框架pithy。期望读者可以通过本文对接口自动化测试有一个大致的了解。

二、引言

为什么要做接口自动化测试?

在当前互联网产品迭代频繁的背景下,回归测试的时间越来越少,很难在每个迭代都对所有功能做完整回归。但接口自动化测试因其实现简单、维护成本低,容易提高覆盖率等特点,越来越受重视。

为什么要自己写框架呢?

使用requets + unittest很容易实现接口自动化测试,而且requests的api已经非常人性化,非常简单,但通过封装以后(特别是针对公司内特定接口),再加上对一些常用工具的封装,可以进一步提高业务脚本编写效率。

三、环境准备

确保本机已安装python2.7以上版本,然后安装如下库:

pip install flask
pip install requests

后面我们会使用flask写一个用来测试的接口,使用requests去测试。

四、测试接口准备

下面使用flask实现两个http接口,一个登录,另外一个查询详情,但需要登录后才可以,新建一个demo.py文件(注意,不要使用windows记事本),把下面代码copy进去,然后保存、关闭。
接口代码
#!/usr/bin/python
# coding=utf-8
from flask import Flask, request, session, jsonify

USERNAME = 'admin'
PASSWORD = '123456'

app = Flask(__name__)
app.secret_key = 'pithy'


@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != USERNAME:
            error = 'Invalid username'
        elif request.form['password'] != PASSWORD:
            error = 'Invalid password'
        else:
            session['logged_in'] = True
            return jsonify({'code': 200, 'msg': 'success'})
    return jsonify({'code': 401, 'msg': error}), 401


@app.route('/info', methods=['get'])
def info():
    if not session.get('logged_in'):
        return jsonify({'code': 401, 'msg': 'please login !!'})
    return jsonify({'code': 200, 'msg': 'success', 'data': 'info'})

if __name__ == '__main__':
    app.run(debug=True)

最后执行如下命令:
python demo.py

响应如下:
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat

大家可以看到服务已经起来了。

接口信息

登录接口
  • 请求url
  • 请求方法
  • 请求参数
参数名称 参数类型 参数说明
username String         登录名称
password String         登录密码
响应信息
参数名称 参数类型 参数说明
code Integer 结果code
msg String 结果信息

详情接口
  • 请求url
  • 请求方法
  • 请求cookies
    参数名称  参数类型 参数说明
   session String session
响应信息
   参数名称 参数类型 参数说明
    code Integer 结果code
    msg String 结果信息
   data String 数据信息

五、编写接口测试

测试思路
  • 使用requests [使用链接] 库模拟发送HTTP请求。
  • 使用python标准库里unittest写测试case。
脚本实现
#!/usr/bin/python
# coding=utf-8
import requests
import unittest


class TestLogin(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.login_url = 'http://127.0.0.1:5000/login'
        cls.info_url = 'http://127.0.0.1:5000/info'
        cls.username = 'admin'
        cls.password = '123456'

    def test_login(self):
        """
        测试登录
        """
        data = {
            'username': self.username,
            'password': self.password
        }

        response = requests.post(self.login_url, data=data).json()

        assert response['code'] == 200
        assert response['msg'] == 'success'

    def test_info(self):
        """
        测试info接口
        """

        data = {
            'username': self.username,
            'password': self.password
        }

        response_cookies = requests.post(self.login_url, data=data).cookies
        session = response_cookies.get('session')
        assert session

        info_cookies = {
            'session': session
        }

        response = requests.get(self.info_url, cookies=info_cookies).json()
        assert response['code'] == 200
        assert response['msg'] == 'success'
        assert response['data'] == 'info'

六、优化
封装接口调用

写完这个测试登录脚本,你或许会发现,在整个项目的测试过程,登录可能不止用到一次,如果每次都这么写,会不会太冗余了? 对,确实太冗余了,下面做一下简单的封装,把登录接口的调用封装到一个方法里,把调用参数暴漏出来,示例脚本如下:
#!/usr/bin/python
# coding=utf-8
import requests
import unittest
try:
    from urlparse import urljoin
except ImportError:
    from urllib.parse import urljoin


class DemoApi(object):

    def __init__(self, base_url):
        self.base_url = base_url

    def login(self, username, password):
        """
        登录接口
        :param username: 用户名
        :param password: 密码
        """
        url = urljoin(self.base_url, 'login')
        data = {
            'username': username,
            'password': password
        }

        return requests.post(url, data=data).json()

    def get_cookies(self, username, password):
        """
        获取登录cookies
        """
        url = urljoin(self.base_url, 'login')
        data = {
            'username': username,
            'password': password
        }

        return requests.post(url, data=data).cookies

    def info(self, cookies):
        """
        详情接口
        """
        url = urljoin(self.base_url, 'info')
        return requests.get(url, cookies=cookies).json()


class TestLogin(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.base_url = 'http://127.0.0.1:5000'
        cls.username = 'admin'
        cls.password = '123456'
        cls.app = DemoApi(cls.base_url)

    def test_login(self):
        """
        测试登录
        """
        response = self.app.login(self.username, self.password)
        assert response['code'] == 200
        assert response['msg'] == 'success'

    def test_info(self):
        """
        测试获取详情信息
        """
        cookies = self.app.get_cookies(self.username, self.password)
        response = self.app.info(cookies)
        assert response['code'] == 200
        assert response['msg'] == 'success'
        assert response['data'] == 'info'

OK,在这一个版本中,我们不但在把登录接口的调用封装成了一个实例方法,实现了复用,而且还把host(self.base_url)提取了出来,但问题又来了,登录之后,登录接口的http响应会把session以 cookie的形式set到客户端,之后的接口都会使用此session去请求,还有,就是在接口调用过程中,希望可以把日志打印出来,以便调试或者出错时查看。

好吧,我们再来改一版。

保持cookies&增加log信息

使用requests库里的同一个Session对象(它也会在同一个Session 实例发出的所有请求之间保持 cookie),即可解决上面的问题,示例代码如下:
#!/usr/bin/python
# coding=utf-8
import unittest
from pprint import pprint
from requests.sessions import Session
try:
    from urlparse import urljoin
except ImportError:
    from urllib.parse import urljoin


class DemoApi(object):

    def __init__(self, base_url):
        self.base_url = base_url
        # 创建session实例
        self.session = Session()

    def login(self, username, password):
        """
        登录接口
        :param username: 用户名
        :param password: 密码
        """
        url = urljoin(self.base_url, 'login')
        data = {
            'username': username,
            'password': password
        }

        response = self.session.post(url, data=data).json()
        print('\n*****************************************')
        print(u'\n1、请求url: \n%s' % url)
        print(u'\n2、请求头信息:')
        pprint(self.session.headers)
        print(u'\n3、请求参数:')
        pprint(data)
        print(u'\n4、响应:')
        pprint(response)
        return response

    def info(self):
        """
        详情接口
        """
        url = urljoin(self.base_url, 'info')
        response = self.session.get(url).json()

        print('\n*****************************************')
        print(u'\n1、请求url: \n%s' % url)
        print(u'\n2、请求头信息:')
        pprint(self.session.headers)
        print(u'\n3、请求cookies:')
        pprint(dict(self.session.cookies))
        print(u'\n4、响应:')
        pprint(response)
        return response


class TestLogin(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.base_url = 'http://127.0.0.1:5000'
        cls.username = 'admin'
        cls.password = '123456'
        cls.app = DemoApi(cls.base_url)

    def test_login(self):
        """
        测试登录
        """
        response = self.app.login(self.username, self.password)
        assert response['code'] == 200
        assert response['msg'] == 'success'

    def test_info(self):
        """
        测试获取详情信息
        """
        self.app.login(self.username, self.password)
        response = self.app.info()
        assert response['code'] == 200
        assert response['msg'] == 'success'
        assert response['data'] == 'info'

大功告成,我们把多个相关接口调用封装到一个类中,使用同一个requests Session实例来保持cookies,并且在调用过程中打印出了日志,我们所有目标都实现了,但再看下脚本,又会感觉不太舒服,在每个方法里,都要写一遍print 1、2、3... 要拼url、还要很多细节等等,但其实我们真正需要做的只是拼出关键的参数(url参数、body参数或者传入headers信息),可不可以只需定义必须的信息,然后把其它共性的东西都封装起来呢,统一放到一个地方去管理?

封装重复操作

来,我们再整理一下我们的需求:
  • 首先,不想去重复做拼接url的操作。
  • 然后,不想每次都去手工打印日志。
  • 不想和requests session打交道。
  • 只想定义好参数就直接调用。
我们先看一下实现后,脚本可能是什么样:
class DemoApi(object):

    def __init__(self, base_url):
        self.base_url = base_url

    @request(url='login', method='post')
    def login(self, username, password):
        """
        登录接口
        """
        data = {
            'username': username,
            'password': password
        }

        return {'data': data}

    @request(url='info', method='get')
    def info(self):
        """
        详情接口
        """
        pass

调用登录接口的日志:
******************************************************
1、接口描述
登录接口

2、请求url
http://127.0.0.1:5000/login

3、请求方法
post

4、请求headers
{
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "keep-alive",
    "User-Agent": "python-requests/2.7.0 CPython/2.7.10 Darwin/16.4.0"
}

5、body参数
{
    "password": "123456",
    "username": "admin"
}

6、响应结果
{
    "code": 200,
    "msg": "success"
}

在这里,我们使用python的装饰器功能,把公共特性封装到装饰器中去实现。现在感觉好多了,没什么多余的东西了,我们可以专注于关键参数的构造,剩下的就是如何去实现这个装饰器了,我们先理一下思路:
  • 获取装饰器参数
  • 获取函数/方法参数
  • 把装饰器和函数定义的参数合并
  • 拼接url
  • 处理requests session,有则使用,无则新生成一个
  • 组装所有参数,发送http请求并打印日志
因篇幅限制,源码不再列出,有兴趣的同学可以查看已经实现的源代码。

源代码查看地址:https://github.com/yuyu1987/pithy-test/blob/master/pithy/api.py

七、扩展

http接口请求的姿势我们定义好了,我们还可以做些什么呢?
  • [x] 非HTTP协议接口
  • [x] 测试用例编写
  • [x] 配置文件管理
  • [x] 测试数据管理
  • [x] 工具类编写
  • [x] 测试报告生成
  • [x] 持续集成
  • [x] 等等等等
需要做的还是挺多的,要做什么不要做什么,或者先做哪个,我觉得可以根据以下几点去判断:
  • 是否有利于提高团队生产效率?
  • 是否有利于提高测试质量?
  • 有没有现成的轮子可以用?
下面就几项主要的点进行一下说明,限于篇幅,不再展开了。

测试报告

这个应该是大家最关心的了,毕竟这是测试工作的产出;

目前python的主流单元测试框均有report插件,因此不建议自己再编写,除非有特殊需求的。
  • pytest:推荐使用pytest-html和allure pytest。
  • unittest:推荐使用HTMLTestRunner。
持续集成

持续集成推荐使用Jenkins,运行环境、定时任务、触发运行、邮件发送等一系列功能均可以在Jenkins上实现。
测试用例编写

推荐遵守如下规则:
  • 原子性:每个用例保持独立,彼此不耦合,以降低干扰。
  • 专一性:一个用例应该专注于验证一件事情,而不是做很多事情,一个测试点不要重复验证。
  • 稳定性:绝大多数用例应该是非常稳定的,也就是说不会经常因为除环境以外的因素挂掉,因为如果在一个测试项目中有很多不稳定的用例的话,测试结果就不能很好的反应项目质量。
  • 分类清晰:有相关性的用例应写到一个模块或一个测试类里,这样做即方便维护,又提高了报告的可读性。
测试工具类

这个可以根据项目情况去做,力求简化一些类库的使用,数据库访问、日期时间、序列化与反序列化等数据处理,或者封装一些常用操作,如随机生成订单号等等,以提高脚本编写效率。

测试数据管理

常见的方式有写在代码里、写在配置文件里(xml、yaml、json、.py、excel等)、写在数据库里等,该处没有什么好推荐的,建议根据个人喜好,怎么方便怎么来就可以。

八、pithy测试框架介绍

pithy意为简洁有力的,意在简化自动化接口测试,提高测试效率。
目前实现的功能如下:
  • 一键生成测试项目
  • http client封装
  • thrift接口封装
  • 简化配置文件使用
  • 优化JSON、日期等工具使用
编写测试用例推荐使用pytest,pytest提供了很多测试工具以及插件,可以满足大部分测试需求。

安装

pip install pithy-test
pip install pytest

使用

一键生成测试项目
>>>  pithy-cli init
请选择项目类型,输入api或者app: api
请输入项目名称,如pithy-api-test: pithy-api-test
开始创建pithy-api-test项目
开始渲染...
生成 api/.gitignore                   [√]
生成 api/apis/__init__.py             [√]
生成 api/apis/pithy_api.py            [√]
生成 api/cfg.yaml                     [√]
生成 api/db/__init__.py               [√]
生成 api/db/pithy_db.py               [√]
生成 api/README.MD                    [√]
生成 api/requirements.txt             [√]
生成 api/test_suites/__init__.py      [√]
生成 api/test_suites/test_login.py    [√]
生成 api/utils/__init__.py            [√]
生成成功,请使用编辑器打开该项目

生成项目树:
>>> tree pithy-api-test
pithy-api-test
├── README.MD
├── apis
│   ├── __init__.py
│   └── pithy_api.py
├── cfg.yaml
├── db
│   ├── __init__.py
│   └── pithy_db.py
├── requirements.txt
├── test_suites
│   ├── __init__.py
│   └── test_login.py
└── utils
    └── __init__.py

4 directories, 10 files

调用HTTP登录接口示例
from pithy import request

@request(url='http://httpbin.org/post', method='post')
def post(self, key1='value1'):
    """
    post method
    """
    data = {
        'key1': key1
    }
    return dict(data=data)

# 使用
response = post('test').to_json()     # 解析json字符,输出为字典
response = post('test').json          # 解析json字符,输出为字典
response = post('test').to_content()  # 输出为字符串
response = post('test').content       # 输出为字符串
response = post('test').get_cookie()  # 输出cookie对象
response = post('test').cookie        # 输出cookie对象

# 结果取值, 假设此处response = {'a': 1, 'b': { 'c': [1, 2, 3, 4]}}
response = post('13111111111', '123abc').json

print response.b.c   # 通过点号取值,结果为[1, 2, 3, 4]

print response('$.a') # 通过object path取值,结果为1

for i in response('$..c[@>3]'): # 通过object path取值,结果为选中c字典里大于3的元素
    print i

优化JSON、字典使用
# 1、操作JSON的KEY
from pithy import JSONProcessor
dict_data = {'a': 1, 'b': {'a': [1, 2, 3, 4]}}
json_data = json.dumps(dict_data)
result = JSONProcessor(json_data)
print result.a     # 结果:1
print result.b.a   # 结果:[1, 2, 3, 4]

# 2、操作字典的KEY
dict_data = {'a': 1, 'b': {'a': [1, 2, 3, 4]}}
result = JSONProcessor(dict_data)
print result.a     # 1
print result.b.a   # [1, 2, 3, 4]

# 3、object path取值
raw_dict = {
    'key1':{
        'key2':{
            'key3': [1, 2, 3, 4, 5, 6, 7, 8]
        }
    }
}

jp = JSONProcessor(raw_dict)
for i in jp('$..key3[@>3]'):
    print i

# 4、其它用法
dict_1 = {'a': 'a'}
json_1 = '{"b": "b"}'
jp = JSONProcessor(dict_1, json_1, c='c')
print(jp)

更多使用方法

点击查看

九、总结

在本文中,我们以提高脚本开发效率为前提,一步一步打造了一个简易的测试框架,但因水平所限,并未涉及测试数据初始化清理、测试中如何MOCK等话题,前路依然任重而道远,希望给大家一个启发,不足之处还望多多指点,非常感谢。

作者简介

孙彦辉,饿了么软件测试工程师,主要负责大物流蜂鸟商家版的测试工作。

参考:



感谢 jihong10102006 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

资讯来源:gitbook

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



News stories from Tuesday 14 November, 2017

Favicon for ITeye资讯频道 16:11 TIOBE 11 月编程语言排行榜:iOS 开发真没人要了?OC、Swift 接连下滑 » Post from ITeye资讯频道 Visit off-site link
曾经有一段时间,动态语言,即脚本语言,因其易于编写和易于运行的特性,被预测在未来将发展强大。因此,Perl、Python、PHP 和 Ruby 等语言在当时非常流行。

今天看来,似乎只有 Python 的发展很强势。相比 TIOBE 10 月排行榜而言,Python 超过了 C# ,荣登排行榜第四名。而 Perl、PHP 排名均有所下滑,其他脚本语言也逐渐走出前 20 名,甚至传说中最文青的语言 Haskell 被踢出 Top 50,那么它们身上究竟发生了什么呢?

脚本语言中的大多数错误都是运行时发生的,在程序运行时显示。 尽管可以编写所有类型的单元测试来弥补这些错误。但如果在生产中运行应用程序时发生这样的错误,就会很快陷入危险的境地。

由于质量要求越来越高,现在几乎没有人敢用脚本语言编写一个关键的大型软件系统。 甚至像 JavaScript 这样的脚本语言,在网页编程中也无法避免错误的发生,所以不得不演变成更安全的语言。 微软就推出了一个名为 TypeScript 的 JavaScript 类型化版本,并开发了各种类型的框架,如 Angular 和 React,以保护语言(并增加额外的功能)。

另一方面,面对脚本语言存在的威胁,静态类型语言对它们在类型方面的繁琐操作进行了简化:它们都以 C# 中的“var”关键字开始,接着是 Java 中的类型推断和 C++ 中的自动指定符。而大型语言之所以能在激烈竞争中保持自己的地位,就是因为,它们会吸收对手语言的优秀特性,再完善优化成自己的优势。

11 月编程语言排行榜 TOP20 榜单
c3752799-2294-3011-9bb9-b070404da21d.jpg

另一方面,今年年初,Swift 语言在 TIOBE 指数排行榜中曾一度进入前十名。然而近期,Swift 却不断下滑,从上个月的第 16 名掉到了如今的历史最低第 20 名,继续发展之后,大有走出 Top 20 之势。作为 iOS 开发的另一主流语言,Objective-C 也难逃厄运,从上个月的第 17 名跌落至第 19 名。

Top 10 编程语言 TIOBE 指数走势(2002-2016)
266c1f14-61cc-3de8-b87c-c26096e2c894.jpg

其他编程语言排名

第 21-50 名如下,可能存在遗漏:
143f677a-2c83-353a-aaa0-d04d4de094ee.png
7929ec05-1c4c-329f-9366-79154b5c7db5.png

第 51-100 名如下,由于它们之间的数值差异较小,仅以文本形式列出(按字母排序):
  • 4th Dimension/4D, ABC, ActionScript, APL, Arc, AutoLISP, Bash, bc, Bourne shell, C shell, CFML, CL (OS/400), Clipper, Common Lisp, Elixir, Euphoria, F#, Forth, Haskell, Icon, IDL, Inform, Io, J, Korn shell, Ladder Logic, Maple, ML, MOO, MQL4, MUMPS, NATURAL, NXT-G, OCaml, OpenCL, OpenEdge ABL, Oz, PL/I, PostScript, PowerShell, Q, REXX, Ring, Scheme, Smalltalk, SPARK, SPSS, Standard ML, Stata, Tcl
历史排名(1987-2017)

注: 以下排名位次取决于 12 个月的平均值。
ab45a342-cd6b-3410-864e-d81cf4469902.png

编程语言“名人榜”( 2003-2016)   

“年度编程语言”获奖名单如下图所示,该奖项授予一年中评分最高的编程语言:
2d9b0680-5d3d-3b65-8341-ff7fae3881db.png

【说明】

TIOBE 编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如 Google、MSN、Yahoo!、Wikipedia、YouTube 以及 Baidu 等)进行计算。请注意这个排行榜只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。

这个排行榜可以用来考查你的编程技能是否与时俱进,也可以在开发新系统时作为一个语言选择依据。

感谢 jihong10102006 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐