
数据星河专注大数据与人工智能领域最新技术以及产品分享
人工智能之机器学习主要有三大类:1)分类;2)回归;3)聚类。今天我们重点探讨一下CART算法。 我们知道十大机器学习中决策树算法占有两席位置,即C4.5算法和CART算法,可见CART算法的重要性。下面重点介绍CART算法。 不同于ID3与C4.5,CART为一种二分决策树,是满二叉树。CART算法由Breiman等人在1984年提出,它采用与传统统计学完全不同的方式构建预测准则,它是以二叉树的形式给出,易于理解、使用和解释。由CART模型构建的预测树在很多情况下比常用的统计方法构建的代数学预测准则更加准确,且数据越复杂、变量越多,算法的优越性就越显著。 CART算法既可用于分类也可用于回归。CART算法被称为数据挖掘领域内里程碑式的算法。 CART算法概念: CART(Classification andRegression Tree)分类回归树是一种决策树构建算法。CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。 CART算法既可以处理离散型问题,也可以处理连续型问题。这种算法在处理连续型问题时,主要通过使用二元切分来处理连续型变量,即特征值大于某个给定的值就走左子树,或者就走右子树。 CART算法组成: CART算法组成如下: 1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;自上而下从根开始建立节点,在每个节点处要选择一个最好(不同算法使用不同指标来定义"最好")的属性来分裂,使得子节点中的训练数据集尽量的纯。 2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。这里用代价复杂度剪枝CCP(Cost-Complexity Pruning)。 决策树的生成就是通过递归地构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择,生成二叉树。 CART决策树生成: 1)回归树生成 回归树采用均方误差作为损失函数,树生成时会递归的按最优特征与最优特征下的最优取值对空间进行划分,直到满足停止条件为止,停止条件可以人为设定,比如当切分后的损失减小值小于给定的阈值ε,则停止切分,生成叶节点。对于生成的回归树,每个叶节点的类别为落到该叶节点数据的标签的均值。 回归树为一棵二叉树,每次都是按特征下的某个取值进行划分,每一个内部节点都是做一个对应特征的判断,直至走到叶节点得到其类别,构建这棵树的难点在于如何选取最优的切分特征与切分特征对应的切分变量。 回归树与模型树既可以处理连续特征也可以处理离散特征。 回归树生成算法如下: 输入:训练数据集D={(x1,y1),(x2,y2),…,(xN,yN)} 输出:回归树T 1)求解选择切分特征j与切分特征取值s,j将训练集D划分为两部分,R1与R2,依照(j,s)切分后如下: R1(j,s)={xi|xji≤s}R2(j,s)={xi|xji>s} c1=1N1∑xi∈R1yi c2=1N2∑xi∈R2yi 2)遍历所有可能的解(j,s),找到最优的(j*,s*),最优的解使得对应损失最小,按照最优特征(j*,s*)来切分即可。 Min{∑(yi–c1)^2+∑(yi–c2)^2} j,s xi∈R1 xi∈R2 3)递归调用1)和2),直到满足停止条件。 4)返回决策树T。 回归树主要采用了分治策略,对于无法用唯一的全局线性回归来优化的目标进行分而治之,进而取得比较准确的结果,但分段取均值并不是一个明智的选择,可以考虑将叶节点设置为一个线性函数,这便是所谓的分段线性模型树。实验表明:模型树效果比回归树的效果要好一些。模型树只需在回归树的基础上稍加修改即可,对于分到叶节点的数据,采用线性回归的最小均方损失来计算该节点的损失。 2)分类树生成 分类树是CART中用来分类的,不同于ID3与C4.5,CART分类树采用基尼指数来选择最优的切分特征,而且每次都是二分。 基尼指数是一个类似与熵的概念,对于一个有K种状态对应的概率为p1,p2,…,pK的随机变量X,其基尼指数Gini定义如下: Gini(X)=∑pk(1?pk)=1?∑kp2k k k 在已知特征A条件下集合D的基尼指数: Gini(D,A)=(|D1|/|D|)*Gini(D1)+(|D2|/|D|)*Gini(D2) Gini(D,A)取值越大,样本的不确定性也越大,这一点与熵类似,所以选择特征A的标准是Gini(D,A)的取值越小越好。 更多好文请关注数据星河公众号(bdg-store)
大家在通过对Ruby的学习后,都知道,Ruby on Rails是一款性能非常优越的Ruby Web开发框架。但是其他的Ruby Web开发框架又有多少人知道一二呢? 迅速掌握Ruby文件锁概念 Ruby操作文件权限技巧分享 Ruby will_paginate知识堂 详细解读Ruby输出文件信息实现方式 Ruby元编程构造简单优雅解决方案 Rails尽人皆知,有人甚至可能听说过Merb和Camping,但是否有人知道Nitro、Ramaze、Sinatra、IOWA或者Cerise?本文对这些框架进行一个快速浏览,并试图解读他们为业内人士欣赏(或忽视)的原因。 之前我们讨论过Merb,这也许是完成度最高的Rails替代者。Merb项目的活跃程度非常高,并且在一些情况下得到了实际使用。可以说它是与Rails最为接近的Ruby Web开发框架。 Camping将自己定义为一个代码量保持在4k字节大小以下的Web开发框架。这个项目已创建了22个月,并由whytheluckystiff维护。一个完整的web应用可以在单一文件中定义,同时遵循MVC框架(这使得web应用以后更易于移植到Rails之上)。Camping使用ActiveRecord作为ORM解决方案;模板系统使用Markaby。Camping的开发一直以稳定的步伐向前推进。 Nitro是一个有三年历史的“Web 2.0”框架。在一段时间销声匿迹之后,开发者George K.Moschovitis又开始活跃起来。Nitro应用的服务器端以Ruby写成,客户端以Javascript开发。Urubatan最近对其进行了评价。与Rails注重按照习惯编程相反,Nitro更加灵活。Nitro支持开发基于Model-View-Controller的应用,同时支持非MVC、php风格的应用开发。Nitro使用xhtml文件,并定制的Ruby标签作为模板系统。 Nitro还使用了它自己的持久层,名为Og(ObjectGraph)。Og允许arbitrary Ruby对象的序列化。在attr_accessor中标记为Object(或Array或Hash)之后,引擎会序列化对象的YAML转储堆。Og同时支持任意对象图。Og提供自动化数据库进化功能:当Ruby类变更后,Og会进行自动检测,同时改变对应的数据库。有些人总是会忘掉ActiveRecord的Migration功能。 Ramaze是一个存在了6个月的轻量级Ruby Web开发框架。它在构建时基于下列广为人知的Ruby Web开发框架原则: ◆KISS原则(Keep It Super Simple) ◆POLS原则(最小惊讶原则:Principle Of Least Surprise) ◆模块化设计 ◆最小化依赖 ◆文档 ◆开放式开发 ◆BDD开发/实例 Ramaze是MVC Web开发框架,使用自己名为Ezamar的模板系统。但是你同样可以使用Markaby、HAML、Liquid或ERB来替代Ezamar。Ramaze不提供默认的ORM(对象-关系映射),你可以使用你自己的选择:ActiveRecord、Og...它支持诸如Cache等高级使用,web应用可以通过Mongrel或Evented Mongrel来搭建。你可以在Ramaze wiki上发现更多细节。 Sinatra是一个刚开发了一个月的DSL web开发框架。Ron Evans对其进行了简要评价。它与Rails的主要差别在于它不是基于Model-View-Controller模式的框架。Sinatra是基于最小化的DSL语法开发的,它的小型基础核心中不包括诸如ActiveRecord这样的模块。通过使用get/post action定义,Sinatra具备动态路由定义功能。Ron指出,Sinatra不是为Robust web应用开发的,而是为了用来搭建小型的原型,其中的混合业务逻辑和展示层并不是问题。 那这样做有什么好处呢?API实现、快速的最小化应用以及那些不需要Rails中的功能(比如ActiveRecord)的web应用开发。可以用来对面板最小应用进行控制,或者是widget。 与其他框架相比,IOWA在近三年的时间里都不活跃。Cerise有一年的时间都没有活跃,因此我们不会深入探讨它们。 像Rails一样,Nitro有其自己的完整核心,其他Ruby Web开发框架试图越小越好,并允许用户自由使用他们喜欢的ORM、模板系统等等。即使这些框架可能缺乏文档,甚至有些框架不具备这么多的功能、流行程度、对Rails的使用等,它们仍然值得一看。
对于Java程序员来说,内存是由JVM自动管理的,所以一旦出现内存泄漏或溢出的问题,不了解JVM的内存结构和各个内存区域的工作职责,将对解决问题带来很大的麻烦,本文参照周志明的《深入理解Java虚拟机》,介绍JVM内存结构,比较枯燥,但对知其然,不知所以然的编码人员来说还是有一定帮助的。 按照Java虚拟机规范的规定,JVM自动管理的内存将会包括以下几个运行时数据区域。 程序计数器 程序计数器(Program Counter Register)是JVM中一块较小的内存区域,保存着当前线程执行的虚拟机字节码指令的内存地址。Java多线程的实现,其实是通过线程间的轮流切换并分配处理器执行时间的方式来实现的,在任何时刻,处理器都只会执行一个线程中的指令。在多线程场景下,为了保证线程切换回来后,还能恢复到原先状态,找到原先执行的指令,所以每个线程都会设立一个程序计数器,并且各个线程之间不会互相影响,程序计数器为"线程私有"的内存区域。 如果当前线程正在执行Java方法,则程序计数器保存的是虚拟机字节码的内存地址,如果正在执行的是Native方法(非Java方法,JVM底层有许多非Java编写的函数实现),计数器则为空。程序计数器是唯一一个在Java规范中没有规定任何OutOfMemory场景的区域。 虚拟机栈 虚拟机栈(Java Virtual Machine Stacks)和线程是紧密联系的,每创建一个线程时就会对应创建一个Java栈,所以Java栈也是"线程私有"的内存区域,这个栈中又会对应包含多个栈帧,每调用一个方法时就会往栈中创建并压入一个栈帧,栈帧是用来存储方法数据和部分过程结果的数据结构,每一个方法从调用到最终返回结果的过程,就对应一个栈帧从入栈到出栈的过程。 虚拟机栈是一个后入先出的数据结构,线程运行过程中,只有一个栈帧是处于活跃状态的,被称为"当前活动帧栈",当前活动帧栈始终是虚拟机栈的栈顶元素。 本地方法栈 本地方法栈(Native Method Stack)和虚拟机栈的作用相似,不过虚拟机栈是为Java方法服务的,而本地方法栈是为Native方法服务的。 方法区 方法区(Method Area)是用于存储类结构信息的地方,包括常量池、静态变量、构造函数等类型信息,类型信息是由类加载器在类加载时从类文件中提取出来的。 方法区同样存在垃圾收集,因为用户通过自定义加载器加载的一些类同样会成为垃圾,JVM会回收一个未被引用类所占的空间,以使方法区的空间达到最小。 方法区中还存在着常量池,常量池包含着一些常量和符号引用(加载类的连接阶段中的解析过程会将符号引用转换为直接引用)。 方法区是线程共享的。 堆 堆(heap)是存储java实例或者对象的地方,是GC的主要区域,同样是线程共享的内存区域。 案例分析一 案例分析二 上面main方法中运行的程序过程如下: (1)用户创建了一个Student对象,运行时JVM首先会去方法区寻找该对象的类型信息,没有则使用类加载器classloader将Student.class字节码文件加载至内存中的方法区,并将Student类的类型信息存放至方法区。 (2)接着JVM在堆中为新的Student实例分配内存空间,这个实例持有着指向方法区的Student类型信息的引用,引用指的是类型信息在方法区中的内存地址。 (3)在此运行的JVM进程中,会首先起一个线程跑该用户程序,而创建线程的同时也创建了一个虚拟机栈,虚拟机栈用来跟踪线程运行中的一系列方法调用的过程,每调用一个方法就会创建并往栈中压入一个栈帧,栈帧用来存储方法的参数,局部变量和运算过程的临时数据。上面程序中的stu是对Student的引用,就存放于栈中,并持有指向堆中Student实例的内存地址。 (4)JVM根据stu引用持有的堆中对象的内存地址,定位到堆中的Student实例,由于堆中实例持有指向方法区的Student类型信息的引用,从而获得add()方法的字节码信息,接着执行add()方法包含的指令。 总结 1、所有线程共享的内存数据区:方法区,堆。而虚拟机栈,本地方法栈和程序计数器都是线程私有的。 2、存放于栈中的东西如下: 2.1每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象)。对象都存放在堆区中。 2.2每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。 2.3方法的形式参数,方法调用完后从栈空间回收 2.4引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC 3、存放于堆中的东西如下: 3.1存储的全部是对象,每个对象包含一个与之对应的class信息 3.2 Jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身 4、存放于方法区中的东西如下: 4.1存放线程所执行的字节码指令 4.2跟堆一样.被所有线程共享.方法区包含:所有的class和static变量 4.3常量池位于方法区中,见如下图示说明
用户现在不仅需要更复杂和灵活的分析,还需要更及时的信息——数据必须全天候可用,并且在许多业务中用户要求在事件发生的几小时内(在某些情况下,几分钟甚至几秒)内可以访问支持决策的数据。公司还意识到,许多不同的流程需要使用相同的数据,因此需要使用不同的配置文件。 理想情况下,公司应在功能中立的数据模型中以尽可能小的形式保留详细数据,这可以让商业公司可以从广泛的观点和流程中提出任意数量的问题。基本前提是:始终可以聚合明细数据,但永远不能分解摘要数据。这并不意味着你永远不应使用摘要表;相反,它意味着您不应仅用摘要数据替换明细数据。 如果所需分析需要明细数据,则无论技术如何,仅使用摘要表将会失败。实施者和用户必须共同努力,以了解业务需求及其驱动因素;然后他们需要使用最低侵入性的过程来满足这些要求。 构建摘要表,添加索引,强制执行优先级和非规范化数据的主要原因是提高性能。如果您可以使用任意数量的数据来提出任何问题,并获得即时响应,那么您将永远不需要构建摘要或索引。 这些结构可以作为其他限制情况的解决方法。它们的存在需要更多的空间、数据管理以及事件发生和采取有效行动之间的时间。问题是:如何在提高性能、最小化数据复制和数据管理之间取得平衡。 优化的七个步骤 一、从中性数据模型开始,该模型被规范化并且不特定于任何函数或组 l 提供支持业务目标所需的最低级别的详细信息 l 通过定义的详细程度解决未来需求 l 使用定义详细信息表的视图以获得安全性和并发性 l 启用访问视图,允许对正在更新的表进行选择(无意图读取)以避免锁定问题 二、实现视图以简化导航 l 帮助工具使用第三方工具和操作视图以创建更好的结构化查询语言(SQL) l 提供前端工具可能需要的结构,以创建优化的SQL并消除对前端工具的依赖,了解市场上的每个数据库 l 在视图中嵌入优化的连接技术 l 为表格集成一层安全性 l 为每个业务部门提供其自己的逻辑功能化- 以用户希望看到的方式呈现数据 l 允许数据存储一次,然后通过视图转换,减少数据冗余,确保一致性并简化数据管理 三、添加索引,范围从简单的技术(如二级索引)到复杂的结构(如覆盖索引,连接索引或聚合索引) l 提供一个主要优点,因为系统与基础数据表在同时维护它们 l 为索引附加一些开销,因此要知道影响和权衡,并在成本与收益分析中识别它们 四、使用数据库优先级框架强制确定优先级,以便在必要时使用资源保护关键的工作负载 l 优化SQL后,优化索引和视图结构 l 提供更佳的可用容量使用,但不能提供更多容量 l 提供对工作负载的更好理解 l 系统拥挤时吸引人注意;在拥挤时代,要有优先级 l 让商业公司提供优先方向 五、只有当对更高性能的需求超过分析灵活性时,才进行理性总结和非规范化 l 遵循共存而非替换的策略,保留详细信息表以进行扩展分析,同时添加非规范化结构 l 满足多种需求,可以为各种用户和部门提供服务,证明管理成本合理 l 满足用户社区的更大利益而不要坚持功能目的 l 数据量和波动率的结果在成本效益分析中起着重要作用 六、考虑“非理性”摘要和非规范化来定制特定业务流程或报告的数据模型 l 当期望的性能超过灵活分析的需求时,需要结构来解决单个功能时 l 在考虑成本效益分析时,包括更高的数据管理和资源成本 l 通过维护基础细节数据来最小化影响;当条件在未来发生变化时,这种不合理的结构可以在几乎没有影响的情况下消除 如果您还没有达到预期的性能,那么还有一个步骤。但是,它的成本相对较高。因此,在继续之前,请确保预期的业务价值将超过使提取的数据与明细数据保持一致所需的额外数据移动和管理的成本。 七、探索,扩展和导出 l 探索答案集的业务使用情况,并验证业务成果的变化是否会推动预期的收入增长或成本降低,具体取决于应用程序。企业用户是否愿意支持这些期望,并且增强的性能是否能够证明成本合理? l 展开当前平台。性能要求是否至关重要,以确保新容量? l 将数据从主数据仓库导出到特定于应用程序的平台。在这种情况下,专门针对其应用调整的专用环境将提供对单个应用程序的更多控制。请记住重复数据的所有成本,增加时间延迟,以及需要管理和支持的新平台、软件环境的成本。 反证以上步骤 采取这七个步骤需要了解每个步骤所涉及的成本以及这样做带来的好处。它还需要做出支持长期和短期需求的决策。在某些情况下,您可以创建摘要表或添加后来会丢弃的非规范化数据模型。只要丢弃表不会导致中断或大量应用程序更改,这是可以接受的。确保这一点的一种方法是尽可能避免使用汇总或非规范化表作为更多下游应用程序的输入。 在应用这七个步骤时,对每个提议的步骤执行成本效益分析,包括物理方面,例如磁盘空间,管理结构的资源以及由于时间延迟而导致维护机会丢失。 可以从下面几处考虑改进: l 查询性能和响应速度 l 用户并发率 l 吞吐量 l 用户满意度和生产力 l 利用第三方工具 l 用于执行查询的资源消耗
访问区块链会议并关注区块链新闻时,不可避免地,您会遇到Linux基金会的Hyperledger。理解像比特币、以太坊这样的加密货币还算相对容易的,Hyperledger却不然。但如果你多研究研究,你会发现一些令人兴奋的非货币、工业区块链的应用项目。 什么是Hyperledger? 让我们从Hyperledger不是什么开始。首先,它不是公司、不是加密货币、不是区块链。Hyperledger更像是开放式工业区块链开发的枢纽。Hyperledger网站上有解释: “Hyperledger是一项旨在推动跨行业区块链技术的发展的开源项目。由Linux基金会在2015年12月主导发起该项目,成员包括金融,银行,物联网,供应链,制造和技术领域的领导者。” Hyperledger不支持比特币或其他任何加密货币。但该平台对区块链技术感到非常兴奋。该网站称,因为网络本身,“有一项技术,承诺比区块链技术更广泛,更具根本性的革命。” 区块链有可能“构建新一代的交易应用程序,在其核心建立信任、责任和透明度的同时简化业务流程和法律约束。” 所以我们许下很多承诺- 我们有Hyperledger。有了它,Linux基金会旨在创建一个软件开发人员和公司协调构建区块链框架的环境。Linux基金会于2015年12月创建了该平台。2016年2月,它宣布了第一批创始成员,2016年3月又有10位成员加入。 今天,Hyperledger拥有超过100名令人印象深刻的成员名单。该清单涵盖了广泛的知名行业领导者。它包括空客和戴姆勒等移动技术巨头,IBM,富士通,SAP,华为,诺基亚,英特尔和三星等IT公司,德意志交易所,美国运通,摩根大通,BBVA,法国巴黎银行和富国银行等金融机构。像Blockstream,Netki,Lykke,Factom,bloq和Consensys这样的区块链创业公司。许多世界上最大的技术和金融公司在Hyperledger会见了一些最热门的区块链创业公司。 Hyperledger的“执行政府”都是各行各业的领军人物。这10多位高管大多数拥有数十年的开源经验以及与多个行业的紧密联系。您将找到Apache Foundation和W3C Consortium的领导者以及IBM的工程师等。Hyperledgers的一些成员,如Richard Brown和Tamas Blumer,已经与Blockchain合作多年。对于其成员,Hyperledger不仅提供技术知识和软件框架,还提供与行业和开发人员的各种联系。 在Hyperledger历史的早期阶段,必须有所舍弃。执行董事Brian Behlendorf被问到是否会有一个“Hyperledger币”——一个在Hyperledger区块链上运行的货币单位。Behlendorf回答说,Hyperledger项目本身永远不会建立自己的加密货币。 “你永远不会看到Hyperledger币,”他说,“通过不推货币,我们避免了必须保持全球货币一致的诸多政治挑战。” 这一决定坚定了Hyperledger的战略目标,即建立区块链技术的工业应用,并将其与通常从基于货币的区块链发展而来的致富计划完全分离。可能有点儿无聊,但对Hyperledger直面技术。 此外,“章程”概述了Hyperledger的目标,好比任务指南。据此,该平台旨在“创建企业级,开源分布式分类帐框架和代码库”,并创建、推广和维护开放式基础架构。 这种说法不知何故,还是有点儿含糊不清。它概述了某种程序,但没有回答关乎痛点的大问题:所有这些世界领先的公司和领导者在Hyperledger做了什么?他们推进了哪些项目?有谁参加? 项目 Hyperledger的“伞形策略”孵化并推广了一系列业务区块链技术、框架、库、接口和应用程序。目前,Hyperledger是以下项目的主持人: 1. Hyperledger Sawtooth:这是由英特尔开发的模块化区块链套件,它使用一种称为Proof of Elapsed Time(PoeT)的新共识算法。 2. Hyperledger Iroha:Iroha是几家日本公司的一个项目,旨在创建一个易于合并区块链框架的项目。 3. Hyperledger Fabric:这是IBM的项目。Fabric是一种插件,可以实现区块链技术,作为开发具有灵活权限的高级区块链程序的基础。 4. Hyperledger Burrow:该项目沿着以太坊的规范开发了一个有权限的智能合约机。 除了这些框架项目,Hyperledger还有几个工具项目,目的在于使区块链的访问和开发更容易,更有效。这是Cello,一种区块链即服务部署模型,Composer,一种用于构建区块链业务网络的工具,一种用于查看、查询和部署区块链上的事务和相关数据的资源管理器,以及Indy,一系列工具、库和其他基于区块链的数字身份组件。 Hyperledger显然参与了大量非货币区块链项目。我们仔细研究两个最突出的项目:Sawtooth和Fabric。这两个项目都是由大公司- 英特尔和IBM创建的- 并将Hyperledger作为开源代码提供。通过Hyperledger,公司继续推进他们的区块链项目,同时邀请其他人参与。 英特尔的Sawtooth Sawtooth Lake是英特尔的模块化区块链套件。它是用Python编写的,专为从物联网到财务等许多领域的用例而设计。Sawtooth Lake的主要特征是它支持许可和无权限的应用和部署,并且它使用新开发的PoET的一致性算法。 PoET使用新的安全CPU指令,英特尔构建的新处理器中也常使用这种CPU。通过这些指令,PoET可确保安全随机地选择所谓的“领导者”。这可以与比特币采矿进行比较,其中矿工竞争一次性访问以编写区块链。除了比特币的证明算法,PoET不需要专门的挖掘硬件。 要成为领导者,每个“验证器” - 等同于节点或矿工- 需要使用安全CPU指令来请求等待时间。具有最短等待时间的验证器将被选为领导者。算法PoET的工作方式就像彩票一样,价格可以获得对区块链的写入权限。 除了加密货币之外,对领导者没有任何奖励。它只是运行软件的一部分。因此,没有像加密货币那样激烈的竞争。每个节点都可以使用它的CPU - 只要它是一个新的模型,并且可能来自英特尔- 就可以免费参与让领导选择。什么是比特币挖掘,只是Sawtooth Lake软件的非侵入性部分。 Sawtooth Lake的另一项创新是交易的建立和传播。客户端构建事务并将其提交给验证器。这包括他们在批处理中获得的事务并将它们完全提交。这是一个类似但不完全相同的过程,因为当加密货币“矿工”将交易包装到一个区块时,通过这种批处理,Sawtooth解决了安全验证相互依赖的问题。 迄今为止,Sawtooth已在多种应用中进行了测试。经过测试记录了从海洋到餐桌的海鲜之旅,使用物联网传感器,从渔民到超市,追踪整个供应链的所有权,拥有权和参数。买家可以访问整个海鲜活链的完整且非加密的记录。区块链越来越多地讨论供应链和产品历史中的这种用例。 Sawtooth也经过测试简化了转让债券的过程。开发人员创建了用于跟踪和转移债券的用户界面。有了这个,用户可以管理区块链上的整个债券组合。目前测试的Sawtooth的另一个用例是数字资产。开发人员构建了一个平台,用于管理Sawtooth区块链上的数字资产所有权,该平台可以管理大范围的数字资产。 应用程序之间的连接点Sawtooth似乎是构建在区块链中的任何类型的数字资产的市场,并且已经为用户提供了图形界面。
Scala是一种强大的语言,很快就成为许多开发人员的最爱。然而,语言只是一个起点 - 并非每个函数都将由语言核心覆盖。Scala还创建了一些厉害的框架。接下来看看Scala的4个强大框架以及其优点和缺点。请记住,框架的最佳选择总是应符合您特定项目的要求——因此,请酌情考虑我们的推荐,根据您自己的项目要求决定最适合您的项目。 Play Framework ——Java和Scala的高速Web框架 Play Framework是一个开源的Scala框架,于2007年首次发布。它目前由Lightbend,Zengularity及其用户开发人员社区开发。该框架的核心功能基于利用JVM及其相关库来构建RESTful应用程序。它目前被一些相当大的名称网站使用,包括LinkedIn,三星的IoT Artik平台和教育网站Coursera。在撰写本文时,Play 2.6是Play的当前版本,已在开发中取代了Play 1。 优点 1. 与JVM密切相关,因此,Java开发人员会发现它很熟悉且易于使用。 2. 广泛支持各种工具集和IDE系统。 3. 它完全基于函数式编程概念,并促进了API优先的RESTful设计实践。 4. Play 2是被动的,允许并行远程呼叫。这意味着它适用于WebSockets和其他相关的以服务器为中心的方法。 5. 它为资产汇编、格式处理、数据库集成等提供了广泛的框架支持结构 6. Play是开源的,它使采取者获得更高的安全性和持续审查的代码库。 缺点 1. 社区中有许多很棒的插件,当然,但它们的稳定性和实用性并不总能得到保证。 2. Play 2使用SBT构建系统。虽然它非常强大,但有些人对使用implicits,通配符导入以及其他使基础设施开发和集成极其困难的“怪癖”提出了担忧。 Finch ——用于构建Finagle HTTP服务的Scala组合器库 Finch是一个HTTP原语的模块化系统,它协同工作以形成HTTP API。整个框架以可组合性的概念为中心,因此,它是一个高度模块化、可定制的系统。 “Finch是Finagle顶层的一层纯功能基本块,用于构建可组合的HTTP API。它的任务是为开发人员提供简单而强大的HTTP原语,使其尽可能接近裸机Finagle API。” 优点 1. Finch利用功能块来构建其框架,因此它非常模块化。 2. 话虽如此,它提供了一些相当强大的HTTP原语,这使其非常适合快速开发和测试。因此,Finch非常适合小型项目和初创公司。 3. 由于其模块化的性质,它对于各种系统来说非常快速且功能强大。 缺点 1. 主要缺点在于,其结构化更多是最小单位的实现,虽然允许进一步的实现和开发迭代,但不被视为全栈解决方案。 Akka HTTP ——Akka HTTP模块在akka-actor和akka-stream之上实现完整的服务器和客户端HTTP堆栈 Akka HTTP是Scala的高度模块化和极其强大的Akka实现。它是在“框架”中发展创建的,其中预先形成的菜单和功能指引。 Akka HTTP被创建为“非框架”形式,提供了许多开发工具,而不会强迫开发人员做出任何选择。正如文档所描述的那样,“它不是一个Web框架,而是一个更通用的工具包,用于提供和使用基于HTTP的服务。虽然与浏览器的交互当然也在范围内,但它并不是Akka HTTP的主要关注点。” 优点 1. Akka HTTP的最大好处是它与Akka功能集成在一起。与Akka一样,它支持许多可以执行并行命令和高级计算处理的系统。 2. Akka HTTP拥有强大的开发人员和贡献者支持,所有这些都在Lightbend下进行。此外,它还具有出色的文档和易于理解的支持中心。 缺点 1. Akka HTTP比这个前面2个实现方式都要慢,因此,虽然它可以有效扩展,但它已经开始落后了,可以这么说。 2. Lightbend是一个伟大的社区,但是相对于其他社区来说,陷入单一供应商可能会令人十分担忧。供应商锁定可能很昂贵且难以破解,因此在采用该解决方案之前应考虑这点。 Chaos ——用于在Scala中编写REST服务的轻量级框架 Chaos是Mesosphere的框架。它专为RESTful开发而设计,也是开发人员之前在Java Framework空间中使用Dropwizard和Twitter Commons的经验之谈。他们将Chaos设计为Play的简化版。Chaos指的是在希腊创世神话中,宇宙创造之前的无形或虚无状态。同样,Chaos(框架)先于创建服务“宇宙”。 优点 1. Chaos易于使用,特别是对于那些熟悉使用Scala的用户来说。 2. 它所使用的所有库都经过了充分测试和良好支持,提供了大量的文档和知识库,可用于测试,迭代和开发。 缺点 1. 不幸的是,Chaos本质上是一个轻量级框架,虽然它做了一些有趣的事情,但它从根本上受到这种方法的限制。 2. 正如创作者所说,它确实做得很好 - REST。如果您没有构建RESTful服务,或者您正在构建一个必须集成一些“怪癖”设计的服务,那么Chaos中的默认库可能不是您要求的最佳集成。
金钱无处不在。 无论在银行应用程序、电子商务网站还是证券交易所平台,我们每天都在与金钱互动。我们也越来越依赖技术来处理问题。 然而,关于如何以编程处理货币价值尚无共识。虽然金钱是现代社会中普遍存在的概念,但相较于日期和时间之类的东西,它并不是任何主流语言中的一流数据类型。结果,每一种软件都有自己的处理方式,且伴随着陷阱。 陷阱#1:金钱是数字? 当你需要代表钱时,你的第一直觉可能是使用一个数字。 金钱只不过是一个数值,对吧? 错了。 货币价值的一部分与另一对象有关:货币。没有10“钱”,应该是“10美元,10欧元,10比特币”......如果你想用不同的货币添加两个货币值,你需要先转换它们。如果你想比较它们也是如此:如果你只有一个金额,你就无法进行准确的比较。金额和货币谁也离不开谁。 陷阱#2:让人烦恼的小数点 大多数现代货币额都是以小数形式出现,或根本没有子单位。这意味着当货币有子单位时,主单位中这些单位的数量是10的幂。例如,一美元有100美分——10的2次幂。 使用十进制系统具有优势,但在编程方面有一个问题。计算机使用二进制系统,因此它们不能原生地表示十进制数。有些语言提出了自己的解决方案,如Java中的BigDecimal类型或C#中的小数类型。JavaScript只有Number类型,可以用作整数或双精度浮点数。因为它是基础10系统的二进制表示,所以当你尝试进行数学运算时,最终会得到不准确的结果。 使用浮点来存储货币价值是一个坏主意。 当你计算更多值时,难以察觉的精度误差会导致更大的差异。这不可避免地导致最终的四舍五入问题。 陷阱#3:百分比与分期 有时你需要计算分期,但百分比总是或增加或减少付款数。 想象一下,你需要支付999.99美元,首付50%。这可以通过一些简单的数学来完成。一半是499.995美元,但是你不能再分一分钱,所以你可能会把结果分成500美元。问题是,当你付尾款时,你最终会获得相同的结果并且额外付一分钱。 分期有时候会遇到除不尽的情况。天然气价格可能显示超过两位数,但它只是象征性的:你最终总是支付一个四舍五入的价格。 编程人员应该怎么办? 幸运的是,软件工程师Martin Fowler提出了一个解决方案。在企业应用程序架构模式中,他描述了货币价值的模式: 属性 方法 数学:加,减,乘,除 比较:等于,大于,大于或等于,小于,小于或等于。 由此,你可以创建满足大部分货币需求的价值对象。 “金额+货币”作为数据结构 金钱的行为与简单的数字不同,因此应区别对待。第一个也是最重要的是:它应该始终由金额和货币组成。 你可以将货币金额一起添加,检查它们的值是否相对应,并将它们格式化为你需要的任何内容。这可以通过对象的方法完成。在JavaScript中,任何返回对象的函数都可以解决问题。 以美分计额 有几种方法可以解决JavaScript中的浮点问题。 你可以使用像Decimal.js这样的库来将浮点数作为字符串。这不是一个糟糕的解决方案,当你必须处理大数字时,它会派上用场。然而,它以增重依赖性为代价,导致性能降低。 你可以在计算之前将浮点数乘以整数,然后将它们分开。 这是一个很好的解决方案,但需要在对象构造或每次操作时进行额外的计算。这不一定会影响性能,但仍然需要更多的流程工作。 第三种方法是直接以美分为单位存储相对于单位的值。如果你需要存储10美分,则不会存储0.1,而是10.这允许你仅使用整数,这意味着安全计算(直到你遇到大数字)和出色的性能。 Dinero.js:一个用于创建、计算和格式化货币价值的不可变库 从以上观察中,我创建了一个JavaScript库:Dinero.js。 Dinero.js遵循Fowler的模式更多一点儿。它允许你在JavaScript中创建、计算和格式化货币值。你可以进行数学运算、解析和格式化对象,甚至向他们提问,使你的开发过程更加轻松。 该库设计为不可变和可链接的模式。它支持全局设置,具有扩展格式选项,并提供本机国际化支持。 为什么不可变? 不可变库更安全,更好预测。可变操作和引用副本是许多错误的来源。选择不变性能够避免了这些错误。 使用Dinero.js,你可以执行计算而无需担心更改原始用例。在以下Vue.js示例中,调用priceWithTax时不会更改Price。如果用例是可变的,它将会更改价格。 可链接性 优秀的开发人员努力使他们的代码更简洁,更易于阅读。当你想要在单个对象上连续执行多个操作时,链接提供了优雅的符号和简洁的语法。 全球设置 当你处理大量货币价值时,你可能希望其中一些人分享一些属性。如果你使用德语制作网站,你可能希望以德国货币格式显示金额。 这是全球设置派上用场的地方。你可以声明将应用于所有新对象的选项,而不是将它们传递给每个用例。 原生国际化支持 传统意义上,库使用区域设置文件进行国际化。 区域设置文件也很难维护。Internationalization API是原生的,并且得到了很不错的支持。除非你必须使用过时的或不知名的浏览器,否则toFormat可以安全使用。 格式化 对象很适合存储数据,但在显示数据时却没那么有用。Dinero.js提供了各种格式化方法,包括toFormat。它为Number.prototype.toLocaleString提供了直观而简洁的语法。将它与setLocale配对,你将能够以任何语言将任何Dinero对象显示为正确的格式。这对多语言电子商务网站特别有用。 接下来做什么? 大家广泛认同Fowler模式是一个不错的解决方案。它激发了许多语言的同步实现。如果你正在DIY,我推荐它和本文的观察结果作为起点。或者你可以选择Dinero.js:一种现代,可靠,经过全面测试的解决方案,已经可以使用。
Docker是一个开发人员容纳和轻松发布软件的平台。它有助于消除配置环境以运行软件的开销,实质上是将环境与代码一起运送。 我们通常使用装运容器类比来解释。货运公司负责将集装箱从A运输到B,他们不关心您放入集装箱的货物,但他们确实关心您是否以正确的格式将货物交给他们。 将您的开发人员视为将软件打包到容器的创造者。他们构建的内容可能会因特殊库、优化或配置而变得复杂。一旦他们准备好运送的软件,就该把它交给一家知道如何从A到B的货运公司。幸运的是,现在它采用标准化格式,DevOps可以轻松地将其转移到生产中。他们甚至可以自动化这个过程,以便将来更容易。 在本文中,我们将举例说明Docker的业务用例,概述如何构建Docker化的微服务,使用Amazon的弹性容器服务(ECS),并概述使用Docker能带来的的商业利益。 Docker和微服务架构的用例 假设您的Web应用程序有一个资源密集型的用户注册页面。在每月月初 新用户会蜂拥而至。为了处理负载,您的服务器基础结构正在几个大型负载平衡服务器上运行(如下所示)。不幸的是,这种处理规模一年中只有12天。这意味着您的公司将为大部分时间都没有使用的资源付费。 现在,假如一个关键功能在注册过程中发生了变化:出于法律原因,用户需要被置于二级报告系统中。目前,您的注册代码隐藏在应用程序的剩余部分中,将此修复程序移至生产意味着整个系统的完全重新部署。开发人员和基础设施将在本周末加班工作,以执行这一更新。最糟糕的是,这仅仅是一个相对较小的变化! 在Docker化的世界中,这是小case。注册过程可以与主应用程序分离,并使用滚动更新推送到生产环境。你可以星期一做,甚至不需要把网站关闭。无人不为之喝彩,因为这意味着软件可以快速安全地投入生产。 为了达到这一点,开发人员可以通过构建REST服务来启动解耦注册过程。一旦Web前端和注册服务的代码分离,它们就可以进行Docker化。开发人员可以将所有代码、库和配置打包到Docker Images中并移交给DevOps。Docker Swarm,Amazon ECS或Red Hat的OpenShift等集群工具将使DevOps能够托管Docker容器。他们可以用这些系统在需求高时扩大规模,在需求低时缩小规模。以经济有效的方式利用资源又反过来解决了我们的第一个问题。 使用Docker和微服务架构解决可扩展性和解耦代码 让我们用我们的示例项目来说明这个容器化的基础设施。此代码包含Web前端和注册后端。您可能会注意到这些被分成两个单独的代码仓库。没关系,在面向服务的体系结构中,这些服务相互了解的越少越好。 在下图中,我们可以看到生活在Amazon ECS群集内的Web和注册容器。用户注册请求将到达Web前端,然后可以向任何注册服务询问进行响应。 让我们开始克隆示例项目。 确保安装了Docker和Gradle,以便我们可以构建项目和图像。 您可以运行以下命令来查看Docker引擎中的图像。 请注意,我们现在有两个图像加上它们构建的基本图像。只是为了好玩,让我们启动网络应用程序并访问。获取Docker Web映像并将其作为在本地虚拟机上运行的容器启动。 我们让托管机器访问8080端口上的容器。使用以下命令,我们现在可以看到它正在运行。 使用亚马逊的弹性容器服务 要真正了解这些Docker图像的优势,我们需要一个可扩展的基础架构来运行它们。出于本演示的目的,Amazon ECS会做得很好。要将图像输出到Amazon云,您需要安装AWS命令行界面。 亚马逊提供了一个很棒的向导来帮助简化这个过程。在其中,您将执行以下操作 创建一个Docker存储库来托管您的图像 将图像上传到云端(见下文) 创建运行映像的EC2实例集群 将您的图像分组到服务Service中 要将Docker图像推送到云端,您需要先登录。 上面的命令生成一个“docker login”,它将Docker主机指向远程仓库。这将授予对每个AWS账户附带的默认AWS注册表的访问权限。 请注意,上述注册表可以包含许多存储库。存储库包含图像的版本。对于此项目,您将需要两个存储库。一个用于我们的Web图像,一个用于注册图像。 为了将图像发送到远程仓库,需要对其进行适当标记。像这样使用您的AWS仓库的URL。 现在让我们将它们推送到AWS。 使用Docker容器扩展ECS 在上一节中,您使用向导创建了一个EC2实例群集。我们创建了两个代码仓库来保存我们的图像并将其上传到那里。我们来看一下。 您还可以看到我的群集在其已完成状态下有3台服务器,其上运行4个Docker镜像(参见上图)。 上面还列出了我们从群集配置的服务。服务允许您对Docker容器进行分组并指定选项,例如您想要多少个选项,以及如何平衡它们之间的流量。 如果您正确配置了Load Balancer,则可以在浏览器中访问它。请求将分发到群集中的活动容器数。 这是我们建立的注册服务的手动请求。回想一下,该服务在端口8081上运行,以免与端口8080上的注册服务冲突。Load Balancer负责将所有这些隐藏起来。我们可以通过端口80从注册服务获得结果。 Docker的未来 这个快速概述仅涉及Docker和微服务架构如何用于为您的团队和产品进行重大改进。以下是采用此架构时可以看到的一些明显的好处。 1. 降低成本 2. 加快发展 3. 更快,更一致的部署 4. 松散耦合的代码和团队 5. 更易于维护和扩展 6. 更可靠的基础设施 如果您希望在更大的环境中利用Docker,那么我们建议您考虑使用Spring Netflix和OpenShift等解决方案。这些解决方案适用于更大的Docker生态系统,可以使部署和开发更加轻松。 本文转载自数据星河平台:https://www.bdgstore.com.cn/portal/article/index/id/179.html
我们的首次测试 让我们来写首个测试。我们首先需要使用shallowMount手动挂载我们的组件,并将其存储在我们将执行断言的变量中。我们还可以通过propsData属性传递道具作为对象。 已安装的组件是一个对象,它有一些实用方法: 然后,我们可以写第一个断言: 让我们来分析一下这里发生了什么。首先,我们使用Jest的expect函数,它将我们想要测试的值作为参数。在我们的例子中,在父级上用findAll方法来获取具有活动类的所有元素。这将返回一个WrapperArray,包含Wrappers数组的对象。 一个WrapperArray有两个属性:父级(包含的Wrappers)和长度(Wrappers的数量)。后者是我们需要拥有预期数量的stars。 expect函数还返回一个对象,我们可以在其上调用方法来测试传递的值。这些方法称为匹配器。在这里,我们使用toEqual匹配器并将其作为参数传递给期望值。该方法返回一个布尔值(boolean),这是测试通过或失败的原因。 总而言之,在这里,我们期望在父级中找到的具有活动类的元素的总量应等于3(我们分配给等级道具的值)。 在您的终端中,运行您的测试: 你应该看到它通过。 模拟用户输入 Vue Test Utils可以轻松模拟真实用户最终在实际中所做的事情。在我们的用例中,用户可以点击stars来切换它们。我们可以在测试中使用触发器方法伪造它,并调度各种事件。 在这里,我们首先用findAll获取第四颗star,它在传递的索引(从零开始的编号)中从WrapperArray返回一个Wrapper。然后,我们模拟它上面的点击事件- 我们模仿点击第四颗star的用户行为。 由于我们将prop等级设置为3,因此在我们点击之前,第四个star应该处于非活动状态,因此click事件应该使其处于活动状态。在我们的代码中,这由一个活动类表示,我们仅在它们被激活时附加在star上。我们通过调用star上的classes方法来测试它,它将类名作为字符串数组返回。然后,我们使用toContain匹配器来确保活动类在这里。 设置和拆解 由于我们触发了对组件的点击,我们已经改变了它的状态。问题是我们在所有测试中使用相同的组件。如果我们改变测试顺序并将其移到第一个位置会发生什么?然后第二次测试将失败。 在测试时,你不想依赖诸如命令这样的脆弱的东西。测试套件应该是强大的,并且除非您破坏API,否则理想情况下现有测试应该不会改变。 我们希望确保始终有一个可预测的父级来执行断言。我们可以通过设置和拆卸功能实现这一目标。这可以帮助我们在运行测试之前初始化,然后进行清理。 在我们的例子中,有一种方法可以是在每次测试之前创建我们的父级并在之后销毁它。 正如他们的名字所暗示的那样,beforeEach和afterEach分别在每次测试之前和之后运行。通过这种方式,我们可以100%确定每当我们运行新测试时,我们都能使用新的父级。 测试的特殊标识符 将选择器与样式和其他目的(例如测试钩子)混合绝不是一个好主意。 如果更改标签名称或类怎么办? 如果您在要测试的元素上没有特定的标识符,例如计数器,该怎么办? 您不想使用无用的类污染您的生产代码。为测试提供专用钩子会更好,例如专用数据属性,但仅限于测试期间。这样就不会在最终构建中留下一团糟。 处理此问题的一种方法是创建自定义Vue指令。 Vue实例有一个指令方法,它接受两个参数- 一个名称,以及在DOM中注入时组件生命周期的钩子函数。如果您不关心特定的钩子,也可以传递单个函数。 让我们在src /中创建一个名为directives的新目录,并添加一个test.js文件。我们将在我们的指令中导出我们想要传递的函数。 一个指令钩子可以带几个参数,在我们的例子中,我们只需要前两个:el和binding。el参数引用指令绑定的元素。binding参数是一个对象,它包含我们在指令中传递的数据。这样我们就可以按照自己的意愿操纵元素。 我们将一个对象传递给我们的指令,因此我们可以从data-test-开始生成数据属性。在处理函数中,我们绑定的每个属性,并在元素上设置一个基于名称和值的数据属性。 我们将一个对象传递给我们的指令,因此我们可以从data-test-开始生成数据属性。在处理函数中,我们反复绑定每个binding属性,并在元素上设置一个基于名称和值的数据属性。 现在我们需要注册我们的指令,以使用它。我们可以在全球范围内进行,但在我们的情况下,我们只会在本地注册- 就在我们的Rating.vue组件中。 我们的指令现在可以在v-test名称下访问。尝试在计数器上设置以下指令: 现在使用开发人员工具检查浏览器中的HTML。你的面板应该是这样的: 开始工作了!现在,我们在开发模式和构建项目时都不需要这个。此数据属性的唯一目的是能够在测试期间定位元素,因此我们只想在运行它们时进行设置。为此,我们可以使用Webpack提供的NODE_ENV环境变量,这是为我们的项目提供动力的模块捆绑器。 当我们运行测试时,NODE_ENV被设置为'test'。因此,我们可以使用它来确定何时设置测试属性。 在浏览器中刷新您的应用并再次检查计数器:数据属性已消失。 现在我们可以对我们需要定位的所有元素使用v-test指令。让我们从前面开始测试: 我们用[data-test-id =“star”]替换了.star选择器,它允许我们在不破坏测试的情况下更改类以用于演示目的。这也是单一责任原则和松散耦合的好处之一 。 我们是否还应该为我们测试的类使用这些钩子? 在将此指令设置为要测试的目标元素之后,您可能想知道是否还应该使用它们来替换我们主动查找的类。让我们看看第一次测试的断言: 我们应该对具有活动类的元素使用v-test,并在断言中替换选择器吗?好问题。 单元测试都是关于一次测试一件事。it函数的第一个参数是一个字符串,我们用它来描述我们从消费者的角度做的事情。 包装我们断言的测试表示渲染一个类活动等于prop.grade的star列表。这是消费者的期望。当他们将数字传递给grade属性时,他们希望获得相同数量的活跃或选定的star。然而,在我们组件的逻辑中,活动类正是我们用来定义这个特征的东西。我们根据具体情况进行分配,因此我们可以在视觉上区分活跃的stars。在这里,这个特定类的存在正是我们想要测试的。 因此,在决定是否应该使用已有的选择器或设置v-test指令时,请问自己一个问题:我在测试什么,并且使用此选择器对业务逻辑透视图有意义吗? 它与功能或端到端测试有何不同? 首先,单元测试组件可能看起来很奇怪。为什么要对UI和用户交互进行单元测试?这不是功能测试吗? 在测试组件的公共API(也就是从消费者的角度来看)和从用户角度测试组件之间存在着根本但微妙的差异。首先,让我们强调一些重要的东西:我们正在测试定义良好的JavaScript函数,而不是UI。 当您查看单个文件组件时,很容易忘记组件编译成JavaScript函数。我们没有测试底层的Vue机制,它从这个函数中导致了面向UI的副作用,比如在DOM中注入HTML。这就是Vue自己的测试已经解决的问题。在我们的例子中,我们的组件与任何其他函数没有区别:它接受输入并返回输出。这些原因和后果是我们正在测试的,而不是其他任何东西。 令人困惑的是,我们的测试与常规单元测试略有不同。通常,我们写的东西如下: 这里没有争论。输入和输出数据,这就是我们所关心的。对于组件,我们期望呈现视觉的东西。我们正在通过虚拟DOM并测试节点的存在。这也是您使用Selenium或Cypress.io等工具进行功能或端到端测试的方法。那有什么不同呢? 通过单元测试,我们正在测试单独的行为。通过功能或端到端测试,我们正在测试场景。单元测试可确保程序单元的行为符合预期。它面向组件的消费者- 在软件中使用该组件的程序员。功能测试从用户角度确保功能或工作流的行为符合预期 。 本文转载自数据星河 www.bdgstore.com.cn
首先,为什么要单元测试组件? 单元测试是持续集成的关键。通过专注于小的、独立的实体,确保单元测试始终按预期运行,使代码更加可靠,你可以放心地迭代你的项目而不必担坏事儿。 单元测试不仅限于脚本。可以独立测试的任何东西都是可单元测试的,只要你遵循一些好的做法。这些实例包括单一责任、可预测性和松散耦合。 作为我们应用程序的可重用实体,Vue.js组件是单元测试的理想选择。我们将用不同的输入和交互测试做好的单个单元,并确保它始终按照我们的预期运行。 在开始之前 Vue CLI 3发布了。Vue Test Utils-官方的Vue.js单元测试实用程序库-已经成长为beta版。在第一篇教程中,我们使用了webpack-simple,一个不包含测试功能的原型模板。出于这些原因,最简单的方法是“擦干净黑板”并将项目从教程迁移到更新后的Vue.js安装。 我从第一个教程重新创建了项目,因此您可以直接从GitHub下载它。然后导航到解压缩的目录并安装依赖项。 注意:确保在继续之前安装Node.js: 运行项目: Vue Test Utils和Jest 在本教程中,我们将使用Vue Test Utils——官方Vue.js测试工具包,以及Jest,一个由Facebook支持的JavaScript测试运行器。 Vue Test Utils允许您单独安装Vue组件并模拟用户交互。它有测试单个文件组件所需的所有实用程序,包括使用Vue Router或Vuex的实用程序。 Jest是一个功能齐全的测试运行器,几乎不需要配置。它还提供了一个内置的断言库。 Vue CLI 3(我用它来生成样板文件)允许您选择自己喜欢的测试运行器,并设置好它。如果要使用其他测试运行器(如Mocha),请安装Vue CLI 3并生成自己的启动项目。然后,您可以从我的样板中直接迁移源文件。 我们应该测试什么? 单元测试的一种常见方法是仅关注公共API(也称为黑盒测试)。通过忽略实现细节,您可以在不必调整测试的情况下进行内部更改。毕竟,您要做的是确保您的公共API不会中断。在“引擎盖”下发生的事情是被间接测试的,但重要的是公共API保持可靠。 这也是Vue Test Utils指南的官方建议。因此,我们只测试我们可以从组件外部访问的内容: 交互 道具变化 我们不会直接测试计算属性、方法或钩子(hooks)。这些将通过测试公共接口进行隐性测试。 设置spec文件 与常规测试一样,每个组件都有一个spec文件,用于描述我们要运行的所有测试。 规范是JavaScript文件。按照惯例,JavaScript与它们正在测试的组件具有相同的名称,加上.spec后缀。 继续创建一个test/unit/Rating.spec.js文件: 我们已经导入了Rating组件和shallowMount。后者是Vue Test Utils的一个功能,它允许我们挂载我们的组件而不挂载它的子组件。 describe函数调用包含了我们即将编写的所有测试-它描述了我们的测试套件。它有自己的地域,可以自己包装其他嵌套套件。 好了,让我们开始编写测试。 确定测试方案 当我们从外部看评级时,我们可以看到它在执行以下操作: 它呈现的stars列表等于用户传递的maxStars道具的属性; 它为每个star添加一个活动类,其索引值小于或等于用户传递的stars属性; 当用户点击它时,它会切换star上的活动类别,并在下一个stars上移除它; 当用户点击一个star时,它会切换图标star和star-o; 如果用户将hasCounter prop设置为true,则呈现计数器,如果将其设置为false,则隐藏它,并显示表示当前活动的最大stars数量的文本; 请注意,我们只关注组件从外部执行的操作。我们不关心点击star执行率的方法,还是内部stars数据属性发生的变化。我们可以重命名这些,但这不应该破坏我们的测试。
数据无疑是当今数字经济中的新货币,但要跟上企业数据变化和递增的业务信息需求,仍然是非常艰难。这也就解释了公司将数据从传统基础构架中迁移至云中,以衡量数据驱动决策的原因。这可确保公司宝贵资源——数据——受到监管,值得信任,方便管理和访问。 虽然企业也认可:基于云的技术是确保跨企业间的数据管理、数据安全、隐私和流程合规性的关键,但关于如何更快地处理数据仍然存在一个有趣的争论。那就是批处理与流处理之间的PK。 每种处理方法都有其优缺点,但如何选择还是依据具体的业务需求。下面会深入探讨哪些用例需要使用批处理,又有哪些用例需要使用流处理。 批处理和流处理之间有什么区别? 批次是在特定时间间隔内组合在一起的数据点集合。通常用于此的另一个术语是数据窗口。流处理,用于处理连续数据,是将大数据转换为快速数据的关键。这两种模型都很有价值,每种模型都可用于解决不同的用例。他们甚至可以“融合”,可以在数据流中做数据窗口,也就是微批量。 虽然批处理模型需要时间段内收集的一组数据,但流处理需要将数据送入分析工具中,通常以实时微批量方式送入。处理来自传统架构的大量数据或数据源时经常使用批处理,而在流中直接处理数据是不可行的。根据定义,批处理数据还需要将批处理需要的所有数据加载成某种类型的存储、数据库或文件系统,然后才进行处理。有时,在开始分析阶段之前,IT团队可能会无所事事地等待,直至所有数据加载完成。 流处理也可以用于处理大量数据,但是当您不需要实时分析时,批处理工作效果最佳。由于流处理负责处理运动中的数据并快速提供分析结果,因此它可以用Apache Spark和Apache Beam等平台生成近乎即时的结果。 例如,Talend最近发布的Talend Data Streams是一款免费的亚马逊市场应用程序,由Apache Beam提供支持,可简化并加速大量数据,摄取各种实时数据。 批处理一定比流处理好吗? 无论您喜欢批处理还是支持流处理,两者“融合“时会更好。虽然流处理最适合时间很重要的用例,批处理在收集所有数据时运行良好,但这不代表哪一个比另一个好-这实际上取决于您的业务目标。 然而,我们看到试图利用流处理的公司发生了重大转变。最近对超过16,000名数据专员的调查显示,数据科学面临的最常见挑战包括脏数据、整体访问、或数据可用性等各方面。不幸的是,由于数据处于运动状态,流式传输往往会加剧这些挑战。在“跳槽”至实时的流处理之前,解决这些可访问性和数据质量问题是关键。 当我们与企业讨论他们如何收集数据并加速创新时,他们通常回答说:“想要实时的数据”,我们再问:“实时对您意味着什么?” 商业用例可能会有所不同,但实时取决于事件创建或数据创建相对于处理时间的比例,可能是每小时,每五分钟或每毫秒。 公司为何将数据批处理转换为数据流处理?下面我打一个比方。想象一下,你刚刚从你最喜欢的啤酒厂订购了一批啤酒,客人已准备好喝酒了。但在你能喝酒之前,你必须根据啤酒花的味道对啤酒进行评分,并编辑在线评论对每种啤酒进行评分。如果你知道每换一种啤酒喝就要完成相同的、重复的过程,那么从一种啤酒到另一种啤酒需要相当长的时间。对于一个企业来说,啤酒相当于管道数据。不是等到你所有的数据后进行处理,而是你可以在几秒或几毫秒内微批量处理它(这意味着你可以更快地喝啤酒!)。 为什么选流处理? 如果你长时间没使用过流处理,你可能会问:“为什么我们不能像以前一样批处理?”你当然可以,但如果你有大量的数据,何时需要提取数据很简单,但何时需要使用它很难。 公司将实时数据视为游戏规则改变者。但如果没有适当的工具,实现这一目标仍然是一个挑战,特别是因为企业需要处理递增的数量、种类和数据类型,它们来自众多不同数据系统(如社交媒体)的。在Talend,我们看到企业通常希望拥有更灵活的数据处理,以便他们能够加速创新,并更快地应对竞争威胁。 例如,来自风力涡轮机上的传感器始终开启着。因此,数据流不间断地流动。由于没有数据的启动或停止,因此典型摄取或处理此数据的批处理方法已过时。这是一个使用流处理的完美用例。 大数据争论 很明显,企业正在将实时分析/流处理的优先级转移到实时收集可操作的信息。虽然过时的工具无法应对分析数据所涉及的速度或规模,但今天的数据库和流处理应用程序已经准备好应对当今的业务问题。 以下是大数据争论中的重要内容:仅仅因为你有锤子并不意味着这是工作的正确工具。批处理和流处理是两种不同的模型,它不是二选一的游戏,它是关于如何确定哪一种更适合您的用例的判断。
用户现在不仅需要更复杂和灵活的分析,还需要更及时的信息——数据必须全天候可用,并且在许多业务中用户要求在事件发生的几小时内(在某些情况下,几分钟甚至几秒)内可以访问支持决策的数据。公司还意识到,许多不同的流程需要使用相同的数据,因此需要使用不同的配置文件。 理想情况下,公司应在功能中立的数据模型中以尽可能小的形式保留详细数据,这可以让商业公司可以从广泛的观点和流程中提出任意数量的问题。基本前提是:始终可以聚合明细数据,但永远不能分解摘要数据。这并不意味着你永远不应使用摘要表;相反,它意味着您不应仅用摘要数据替换明细数据。 如果所需分析需要明细数据,则无论技术如何,仅使用摘要表将会失败。实施者和用户必须共同努力,以了解业务需求及其驱动因素;然后他们需要使用最低侵入性的过程来满足这些要求。 构建摘要表,添加索引,强制执行优先级和非规范化数据的主要原因是提高性能。如果您可以使用任意数量的数据来提出任何问题,并获得即时响应,那么您将永远不需要构建摘要或索引。 这些结构可以作为其他限制情况的解决方法。它们的存在需要更多的空间、数据管理以及事件发生和采取有效行动之间的时间。问题是:如何在提高性能、最小化数据复制和数据管理之间取得平衡。 优化的七个步骤 一、从中性数据模型开始,该模型被规范化并且不特定于任何函数或组 l 提供支持业务目标所需的最低级别的详细信息 l 通过定义的详细程度解决未来需求 l 使用定义详细信息表的视图以获得安全性和并发性 l 启用访问视图,允许对正在更新的表进行选择(无意图读取)以避免锁定问题 二、实现视图以简化导航 l 帮助工具使用第三方工具和操作视图以创建更好的结构化查询语言(SQL) l 提供前端工具可能需要的结构,以创建优化的SQL并消除对前端工具的依赖,了解市场上的每个数据库 l 在视图中嵌入优化的连接技术 l 为表格集成一层安全性 l 为每个业务部门提供其自己的逻辑功能化- 以用户希望看到的方式呈现数据 l 允许数据存储一次,然后通过视图转换,减少数据冗余,确保一致性并简化数据管理 三、添加索引,范围从简单的技术(如二级索引)到复杂的结构(如覆盖索引,连接索引或聚合索引) l 提供一个主要优点,因为系统与基础数据表在同时维护它们 l 为索引附加一些开销,因此要知道影响和权衡,并在成本与收益分析中识别它们 四、使用数据库优先级框架强制确定优先级,以便在必要时使用资源保护关键的工作负载 l 优化SQL后,优化索引和视图结构 l 提供更佳的可用容量使用,但不能提供更多容量 l 提供对工作负载的更好理解 l 系统拥挤时吸引人注意;在拥挤时代,要有优先级 l 让商业公司提供优先方向 五、只有当对更高性能的需求超过分析灵活性时,才进行理性总结和非规范化 l 遵循共存而非替换的策略,保留详细信息表以进行扩展分析,同时添加非规范化结构 l 满足多种需求,可以为各种用户和部门提供服务,证明管理成本合理 l 满足用户社区的更大利益而不要坚持功能目的 l 数据量和波动率的结果在成本效益分析中起着重要作用 六、考虑“非理性”摘要和非规范化来定制特定业务流程或报告的数据模型 l 当期望的性能超过灵活分析的需求时,需要结构来解决单个功能时 l 在考虑成本效益分析时,包括更高的数据管理和资源成本 l 通过维护基础细节数据来最小化影响;当条件在未来发生变化时,这种不合理的结构可以在几乎没有影响的情况下消除 如果您还没有达到预期的性能,那么还有一个步骤。但是,它的成本相对较高。因此,在继续之前,请确保预期的业务价值将超过使提取的数据与明细数据保持一致所需的额外数据移动和管理的成本。 七、探索,扩展和导出 l 探索答案集的业务使用情况,并验证业务成果的变化是否会推动预期的收入增长或成本降低,具体取决于应用程序。企业用户是否愿意支持这些期望,并且增强的性能是否能够证明成本合理? l 展开当前平台。性能要求是否至关重要,以确保新容量? l 将数据从主数据仓库导出到特定于应用程序的平台。在这种情况下,专门针对其应用调整的专用环境将提供对单个应用程序的更多控制。请记住重复数据的所有成本,增加时间延迟,以及需要管理和支持的新平台、软件环境的成本。 反证以上步骤 采取这七个步骤需要了解每个步骤所涉及的成本以及这样做带来的好处。它还需要做出支持长期和短期需求的决策。在某些情况下,您可以创建摘要表或添加后来会丢弃的非规范化数据模型。只要丢弃表不会导致中断或大量应用程序更改,这是可以接受的。确保这一点的一种方法是尽可能避免使用汇总或非规范化表作为更多下游应用程序的输入。 在应用这七个步骤时,对每个提议的步骤执行成本效益分析,包括物理方面,例如磁盘空间,管理结构的资源以及由于时间延迟而导致维护机会丢失。 可以从下面几处考虑改进: l 查询性能和响应速度 l 用户并发率 l 吞吐量 l 用户满意度和生产力 l 利用第三方工具 l 用于执行查询的资源消耗
虹膜是眼睛的一部分,眼睛通过它控制入光量,几个世纪以来一直是心理学关心的主题。从生理学、文学到诗歌,眼睛被用于神经语言程序设计(NLP),其关注人体的相互作用,虹膜运动和位移。基本上,NLP专注于评估人类行为和心理活动。最近,机器学习(ML)也进入了与心理学相关的领域。 本文源自马来西亚Universiti Teknologi的计算机科学学者的一项研究,他们使用ML进行虹膜位置分类。他们应用SVM的特定ML算法对虹膜位置进行分类,然后将算法结果与根据视觉、听觉和动觉(VAK)学习标准索引的人格特征相匹配。 使用神经语言程序设计 在心理学中,有许多理论和方法可以评估人类行为或个性,具体而言,这取决于许多因素,如年龄、情绪平衡和身体健康等。在研究中选择NLP的原因是它在正确建立行为因素方面的有效性。NLP擅长分析个人的学习风格分析行为。它依赖于三个关键因素-神经学、语言和编程。神经学部分指的是人体的实际心理系统,而语言和程序设计部分分别包括与其他人的交流方面和对世界的感知。简单来说,它是语言对身心,身体和行为的影响。 NLP与另一种称为视觉,听觉和动觉(VAK)理论的人格理论相结合,该理论在心理学得到了广泛的应用。事实证明,VAK能够最有效地展示个人的学习风格。作为该研究的一部分,眼睛的虹膜位置作为预测人类行为的视觉线索。此外,这些虹膜图像将是使用SVM进行图像分类的关键。 用SVM分析 眼睛图像,特别是虹膜图像,形成了本研究的数据。在这些图像上使用SVM来分类虹膜位置。下图显示了研究中遵循的研究方法: 从上面的图片可以看出,一旦从用户收集数据(眼睛的图像),就使用图形用户界面(GUI)对它们进行图像预处理。为此,图像要求9,000像素,以实现SVM分类的最佳性能。为了从图像中提取特征,使用图像处理中的直方图均衡。此外,Sobel边缘检测用于检测眼睛边缘以及形态过滤和二值化。所有这些功能都保存为文本文件,并设置为进行培训和测试。MATLAB是用于实现该算法的软件环境,其内核是SVM中的Standard Gaussian Kernal(SGK,在MATLAB中称为径向基函数)。 算法的准确性 对该研究中五个标准虹膜位置进行了测试和培训: 1.左上 2.右上 3.中间 4.中偏右 5.中偏左 样本数据是215个眼睛图像。当使用SVM检查样本的准确性时,发现在检测这些位置时大约80%准确(用于训练),误差约为20%(在测试中)。这个因素将有助于快速匹配VAK理论(图中提到)的行为。选择径向基函数的逻辑是实现更高的精度。 结论 这项研究只是机器学习技术中的沧海一粟。分类本身有很多方法,例如反向传播,k-最近邻和感知器等。这方面的进展是巨大的。在早些年,虹膜检测仅用于安全系统中以进行身份验证。但在如今,它在多方面得到了应用,ML和人工智能应用依赖于虹膜和其他相关的面部特征来实现自动化。最终,它将具有实际实施功能的应用生成,为ML提供了丰富的成果。
本周TensorFlow推出了一个新的模型优化工具包。这套技术同时适用于新老开发员以优化机器学习模型,特别是运行TensorFlowLite的开发人员。任何现有TensorFlow模型均适用。 什么是TensorFlow中的模型优化? TensorFlowLite转换工具新支持训练后量化。理论上,这可以使数据中的压缩率提高四倍,相关机器学习模型的执行速度提高三倍。 在量化它们所使用的模型时,功耗也降低。 启用训练后量化 此量化技术已集成到TensorFlowLite转换工具中。启动非常容易。构建TensorFlow模型后,您可以在TensorFlowLite转换工具中简单地启用“post_training_quantize”标志。如果模型被保存并存储在saved_model_dir中,则可以生成量化的tfliteflatbuffer。 有一个说明性的教程解释了如何做。TensorFlowLite当前不支持在平台上使用此技术部署,但计划将其合并到通用TensorFlow工具中。 训练后量化的优势 这种量化技术的好处包括: l模型尺寸减少约四倍。 l在主要由卷积层组成的模型中执行速度提高10-50%。 l是RNN模型速度的三倍。 l由于减少了内存和计算要求,大多数模型的功耗也会降低。 下图显示了使用单核在GooglePixel2手机上几个模型的模型尺寸减小,执行时间加速。我们可以看到优化后的模型几乎小了四倍。 加速和模型尺寸的减小不会对精度产生太大影响。启动时小尺寸的模型可能会遭受更大的损失。这是一个比较: 它是如何工作的? 在幕后,它以减少参数精度(神经网络权重)的方式来运行优化。从训练时间32位浮点表达至更小更有效的8位整数表达中缩减模型尺寸。 这些优化在结果模型中用固定和浮点算数混合的内核粗略地操作,以确保配对。这能够快速执行最重的计算,但精度较低。但是,最敏感的数据仍然是以高精度计算的,准确性较高。
C4.5算法在数据挖掘中用作决策树分类器,可用于基于特定数据样本(单变量或多变量预示变量)生成决策。 因此,在我们直接深入研究C4.5之前,让我们先讨论一下决策树以及它们如何用作分类器。 决策树 决策树如上图所示。假设您想计划今天的活动,但您面临一些可能影响最终决定的不同条件。 在上图中,我们注意到影响决策的主要因素之一是父母到访(Parent Visiting)。如果确实如此,那么我们会做出快速决定--选择去电影院。如果他们不来怎么办? 这开辟了一系列其他可能。现在,如果天气晴朗(Sunny)或多雨(Rainy),我们要么去打网球(Play tennis),要么待在家里(Stay in)。但是,如果外面多风(Windy),我会检查我拥有多少钱。如果我很有钱(Rich),我会去购物(Shopping),或者去看电影(Cinema)。 树根始终是具有成本函数最小值的变量。在这个例子中,父母访问的概率是50%,无须多虑,一半一半是很容易的决策。但是如果选择天气作为“根”呢?那么将有33.33%的可能性发生某种结果,这可能会增加我们做出错误决定的机会,因为需要考虑更多的测试用例。 如果我们通过信息增益和熵的概念,那将更容易理解。 信息增益 如果您已经获得了加班信息,这有助于您准确预测某些事情是否会发生,那么您预测的事情信息就不是新信息。但是,如果情况有变并且出现了意想不到的结果,那么它就算是有用和必要的信息。 类似的是信息增益的概念。 您对某个主题了解得越多,您就越不了解它的新信息。更简洁:如果你知道一个事件是非常可能的,那么当事件发生时就不足为奇了,也就是说,它提供的实际情况信息很少。 从上面的陈述中我们可以表明,获得的信息量与事件发生的概率成反比。我们还可以说随着熵增加,信息增益减少。这是因为熵指的是事件的概率。 假设我们正在看抛硬币。猜中双面平整的硬币任何一面的概率为50%。如果硬币是不平整的,那么获得某面(头或尾部)的概率是1.00,然后我们说熵是最小的,因为目前没有任何类型的试验可以预测我们硬币投掷的结果。 在下面的绘制图中,我们注意到由于特定事件的最大不确定性而获得的最大信息量是当每个事件的概率相等时。这里,p=q=0.5 E=系统事件的熵 p=头部作为结果的概率 q=尾部作为结果的概率 在决策树的情况下,必须使节点对齐,所以熵随着向下分裂而减小。这基本上意味着更多的分裂是适当的,做出明确的决定变得更容易。 因此,我们针对每种分裂可能性检查每个节点。信息增益比是观测值与观测总数之比(m/N=p)和(n/N=q),其中m+n=N且p+q=1。在分裂之后,如果下一个节点的熵小于分裂之前的熵,并且如果该值与用于分裂的所有可能测试用例相比最小,则该节点被分裂成其最纯的成分。 在我们的例子中,我们发现与其他选项相比,父母访问以更大的比例减少熵。因此,我们选择这个选项。 修剪 我们原始示例中的决策树非常简单,但是当数据集很大并且需要考虑更多变量时,情况并非如此。这是需要修剪的地方。修剪是指,在我们的决策树中删除那些我们认为对我们的决策过程没有显着贡献的分支。 让我们假设我们的示例数据有一个名为“车辆”的变量,当它具有值“富裕”(Rich)时,它与条件“钱”(Money)相关或是其衍生。现在,如果车辆可用,我们将通过汽车购物(shopping),但如果没有,我们可以通过任何其他交通方式购物。但最终我们去购物。 这意味着“车辆”变量没有多大意义,可以在构造决策树时排除。 修剪的概念使我们能够避免过度拟合回归或分类模型,以便对于少量数据样本,在生成模型时摒除测量误差。 虚拟代码 C4.5优于其他决策树系统的优势: 1.该算法固有地采用单通道修剪过程来减轻过度拟合。 2.它可以与离散数据和连续数据一起使用 3.C4.5可以很好地处理不完整数据的问题 4.也许C4.5并不是最好的算法,但在某些情况下确实有用。
人们如何做出决定?在日常生活中,情绪往往是第一动力。但当人们需要承担长期后果时,不可能纯靠冲动行事。聪明者只会在心里有数后才会靠直觉做出决定。 如今市场上有数十种发送消息的技术,无数ESB和近100家iPaaS供应商。当然,如何挑选就成为了一个问题。需要批发一堆技术吗?还是对症下药?那么,正确的工具应该是什么? 这篇文章正是想给那些“无头苍蝇”们一些简单直接的建议,就从如今最时尚最受欢迎的RabbitMQ开始吧!两者都有自己的起源故事,设计意图,闪光点,集成功能和开发人员的切身体验。起源揭示了本软件的整体设计意图o。重要的是,本文中的目的是比较两者围绕消息中介的重叠用例,而不是Kafka擅长的“事件存储/事件源”用例。 起源 RabbitMQ是一个“传统”消息中介,可以实现各种消息传递协议。它是首批实现大量功能,客户端库,开发工具和质量文档的开源消息中介之一。RabbitMQ最初是为实现开放式线路协议AMQP而开发的。虽然Java具有像JMS这样的消息传递标准,但它对于需要分布式消息传递的非Java应用程序没有帮助,因为它严重限制了集成场景,微服务。随着AMQP的出现,跨语言的灵活性成为开源消息中介的真实存在。 建筑与设计 RabbitMQ作为通用的消息中介,采用点对点的方式,请求/回复各类通信样式。它使用智能中介/ “沉默的消费者”模型,专注于向消费者提供一致的消息传递,消费者的消费速度与中介跟踪消费者状态的速度大致相似。RabbitMQ是成熟的,在得到正确配置时表现良好,得到很多支持(客户端库Java,.NET,node.js,Ruby,PHP和更多语言),并且有许多可用的插件可以将它扩展到更多的用例和集成场景。 RabbitMQ中的通信可以根据需要同步或异步。发布者向中间站发送消息,消费者从队列中检索消息。通过交换将生产者与队列分离,可确保生产者不会受到硬编码决策的影响。RabbitMQ还提供了许多分布式部署方案(并且确切要求所有节点都能够解析主机名)。可以将多节点群集设置为群集联合,并且不依赖于外部服务(但某些群集形成插件可以使用AWS API,DNS,Consul等)。 要求和用例 RabbitMQ是一种通用的消息传递解决方案,通常用于允许Web服务器快速响应请求,而不是在用户等待结果时强制执行复杂的过程。它还可以将消息分发给多个接收者以供消费,或者在高负载(20k + / sec)下平衡负载。当您的需求超出吞吐量时,RabbitMQ可提供许多功能:可靠的交付,路由,联合,HA,安全性,管理工具和其他功能。让我们来看看RabbitMQ的最佳场景,例如: 您的应用程序需要使用现有协议的任意组合,如AMQP 0-9-1,STOMP,MQTT,AMQP 1.0。 您需要基于每个消息(死信队列等)进行更精细的一致性控制/保证。但是,Kafka最近添加了更优的支持。 您的应用程序需要点对点,请求/回复、发布/订阅,具有消息传递的多样性 至消费者复杂的路由,使用强大的路由逻辑集成多个服务/应用程序 在其他软件的帮助下,RabbitMQ还可以有效地解决上面几个Kafka强大的用例。当应用程序需要访问流历史时,RabbitMQ通常与Apache Cassandra一起使用,对于需要“无限”队列的应用程序,RabbitMQ通常与LevelDB插件一起使用,但这两种功能都不附带RabbitMQ本身。 开发经验 RabbitMQ正式支持Java,Spring,.NET,PHP,Python,Ruby,JavaScript,Go,Elixir,Objective-C,Swift - 通过社区插件与许多其他客户端的devtools一起支持。RabbitMQ客户端库已经成熟并且文档齐全。
Spring框架,是用于开发Java Web的应用程序的。最近,其开发人员修补了三个漏洞,其中包括可用于远程代码执行的关键漏洞。 最严重的缺陷位于spring-messaging模块,它允许应用程序通过内存中的STOMP代理在WebSocket端点上公开STOMP(简单文本导向消息传递协议)。攻击者可以通过向代理发送特制的消息,利用该问题来获取远程代码执行。 该漏洞被命名为CVE-2018-1270,它影响了Spring Framework版本4.3.x和5.x,以及不再支持旧版本。强烈建议用户升级到新发布的Spring Framework 5.0.5或4.3.15。 第二个高级漏洞CVE-2018-1271,影响了用Spring MVC去服务静态资源如Windows上的文件系统里的CSS,JS的应用。该漏洞允许攻击者通过向特制URL发送请求来执行目录浏览,以访问受限资源。 凡是未使用Tomcat或WildFly作为其服务器的应用程序,或者未使用Windows文件的不受影响。 在Spring Framework 5.0.5和4.3.15,CVE-2018-1272中修补的第三个漏洞可能导致权限提升,但由于利用需要额外的攻击媒介,因此评级较低。 “当Spring MVC或Spring WebFlux服务器应用程序(服务器A)从远程客户端接收输入,然后使用该输入向另一个服务器(服务器B)发出多部分请求时,它可能会受到攻击,其中一个额外的多余部分插入服务器A的请求内容,导致服务器B对其预期的部分使用错误的值,“Spring开发人员指出。 但是,为了能成功,攻击者“必须能够猜测服务器A为服务器B的多部分请求选择的多部分边界值,这要求攻击者具有控制服务器或查看服务器的能力。” Spring具有模块化架构,很受应用程序开发人员的欢迎,尤其是在企业领域。根据2016年对2040名参与者的调查结果,Spring MVC和Spring Boot是Java开发人员中最受欢迎的两个Web框架,分别被43%和29%的受访者使用。
魔术师善于寻找盲点、感知上的脆弱点和限制点,才可以在人们没有意识的情况下达到魔术效果。 产品经理好比魔术师,在争夺流量的比赛中,有意识或无意识地触及人们的心理弱点。 他们是如何做到的? 01操控选项 虽然我们崇尚自主、自由地选择,但与其说自由,我们其实在从菜单项中选择。 我们没有意识到菜单里的选项早已被操纵。魔术师亦如此,为人们提供自由选择的幻觉(经典魔术台词:从扑克牌中任意选一张),同时设计好菜单项给观众。 当我们拿到菜单时,我们很少会问: 有什么选项不在菜单上? 为什么你们会提供这些选项?而不是其他选项呢? 菜单供应商的目标时什么? 这个菜单是否符合我的初始需求?还是说只是让我分心? 这个场景你应该很熟悉 (是小编本编了): 周六晚上和朋友一起出去,见面后掏出手机打开高德/美团/大众点评以查找附近的酒吧,并浏览弹出来的菜单。你们仔细对比每家酒吧,比较哪家的鸡尾酒更好喝。 这个菜单是否与你和朋友的原始愿望相关? 你们觉得大众点评上的菜单相对完整。低头查看手机的时候,你看不见街对面的公园有乐队正在演奏现场音乐,你看不见街尽头有一家画廊正在展出名画,并供应甜点咖啡。因为这些没有出现在大众点评的菜单上。 app在我们生活中几乎每个领域提供的选择越多,我们就越肯定地认为他们能提供给我们最有用的选项,是吗? 最受欢迎的app不代表最全面的选项。 通过定制菜单,技术用新选择蒙蔽了我们内心的选择。如果我们越仔细关注这些选项,我们就会意识到那些选项并不符合我们的真实需求。 02害怕错过 你有1%的可能性错过重要信息,这是技术腐蚀思想的另一种方式。 如果你正在追《延禧攻略》,你可能不自主地打开了爱奇艺的推送,生怕错过了每天按时播放的新集。 “如果我错过了热点怎么办?我不知道同事们在聊啥怎么办?”这种焦虑让你随时都想刷微博。 我们越紧张错过就愈加害怕:当我们取消某些app提醒时,我们一定会错过重要的信息。 令人惊讶的是,一旦我们放下恐惧,我们就会从幻想中醒来。一天不带手机,取消订阅通知-我们曾担心的“错过”实际上没有发生。 我们不会错过没看到的东西。 03社会认同 我们都渴求社会认同。归属感,认同感和崇拜感是人类赖以生存的基本动力。但现在,三者之一的认同感被科技公司牢牢掌控着。 在微博上,想@的人可能不是有意识地@,而是微博自动建议功能,顺手选的一个。 Facebook上,每当用户更新头像时,就会被安排长期靠前,任人评论或点赞。每当有人评论或点赞时,就会收到提醒,拉回相应界面。 青少年群体比其他群体更易受到“不被认同”的影响。 04礼尚往来 我帮了你,你可别忘了啊? 说好了互粉你却悄悄关注了别人。 某些情况下,科技公司正在操纵我们正常体验应用程序的过程。 LinkedIn是最典型的例子。LinkedIn利用了感知的不对称性。当你收到某人要求关注的邀请时,你会想象那个人是有意识地选择邀请;实际上,他们可能无意识地回应了LinkedIn的建议联系人列表。 换句话说,LinkedIn将你的无意识冲动(“添加”一个人)转变为数百万人认为有义务偿还的社会义务。他们从人们花费的时间中获利。 想象一下,数以百万计的人在这一天中被这样的“人情互关”打断,互相往来。所有这些都是由从中获利的公司设计的。 这是社交媒体。 05自动播放下一条 “ 康奈尔大学BrianWansink教授在他的研究中发现:可以通过给人们一个无底的碗诱骗人们继续喝汤,这些碗在他们快喝完的时候会自动补充。有了无底碗,人们比拿正常碗的人多食用73%的卡路里。 ” 科技公司很聪明地利用相同的原则。 新闻源专门设计为自动重新填充,以便让您滚动,并故意避开能让您暂停、重新考虑或离开的任何设计。 这也是为什么像Netflix,YouTube或Facebook这样的视频和社交媒体网站在倒计时后自动播放下一个视频,而不是等待你做出有意识的选择(以防万一你停止浏览)。这些网站上的大部分流量都是通过“自动播放下一条”获得的。 科技公司经常声称,“当我们为用户利益服务时,我们只是让用户更容易看到他们想要观看的视频”。你不能责怪他们,因为增加留存时长是他们竞争的筹码。 06即时中断 立即打断人们的消息比让异步发送的消息(如电子邮件或延迟的收件箱)更能说服人们做出响应。 微信更愿意设计他们的消息系统以立即中断收件人(并显示聊天框),而不是帮助用户尊重彼此的注意力。 提高紧迫感和社会互惠性也符合他们的利益。例如,Facebook会在您“看到”他们的消息时自动告诉发件人,而不是让您避免披露您是否阅读了该消息。此时便会产生互惠压力:“现在您知道我已经看过该消息,我觉得更有义务回复。” 换句话说,中断对抓取注意力有利。 问题是,以业务之名强化“中断”会造成公共悲剧,破坏全球注意力,每天造成数十亿次不必要的干扰。 07利益导向 抓取你访问app的理由,将之与app的商业缘由联系起来,最大化消耗用户的时间。 例如,超市中最受欢迎的两个类别是零食和牛奶。但超市经理希望最大化人们购买的数量,因此他将零食和牛奶“藏”在商店后面。 换句话说,杂货店使客户想要的东西(牛奶、零食)与超市想要的东西紧密关联。如果超市有心方便人们购物,他们会把最受欢迎的商品放在最显眼的位置。 科技公司以同样的方式设计他们的网站。例如,当你想要查看今晚发生的Facebook事件时(你的理由),Facebook应用程序禁止你在没有首先登陆新闻源(他们的原因)的情况下访问它,Facebook是故意的。Facebook希望将您使用Facebook的每一个理由转化为他们所用。 08别扭的选择 科技公司总是很淡然地表示: “如果你不喜欢,你完全可以用不同的产品” “如果你不喜欢,你可以取关” “如果你太沉迷,你随时可以卸载我们的app” 企业自然希望你做他们喜欢的事儿,不希望做他们不喜欢的事儿。魔术师做同样的事情:让观众更容易选择你想要他们选择的事物,并且更难选择你不喜欢的事物。 例如,《纽约时报》允许您“自由选择”取消您的数字订阅。但是,当您点击“取消订阅”时,它们不会仅仅执行此操作,而是通过拨打仅在特定时间打开的电话号码取消帐户。 手机重度用户也会发现:订阅容易取订难。一键订阅,二十键才能取消订阅。 您是否对技术操控感到不安?想象一下,数以万计的产品经理每天都在努力创造新方法来吸引你。 最终的自由是思想自由,我们需要技术来帮助我们自由地生活、感受、思考和行动。我们需要智能手机和网络浏览器作为我们的思想、价值观形成的外壳。人们的时间很宝贵。我们应该像隐私和其他数字版权一样保护它、珍惜它。 ——前谷歌设计师TristanHarris
Google于上周二(9/4)释出了最新的Chrome69,其中有一个介面的变更是移除了网址列上的子网域,包括www及m,因此,当用户以Chrome69造访www.bdgstore.com.cn时,网址上只会出现bdgstore.com.cn,此一变更遭到安全研究人员的质疑,认为它将更容易导致网钓攻击。 Google的动机不难理解,此一变更应是奠基在力求建立简洁Chrome介面的概念下,然而,安全研究人员却认为这是个错误的设计,因为隐藏了子网域之后,两个看起来一样的网址可能是连向不同的网页。 举例而言,m.bdgstore.com与www.bdgstore.com就是不同的网页,但在Chrome69上看起来都一样是tumblr.com。另一名ISP业者则说,他们经常教育用户有或没有www的网址可能导向不同的网页,现在这一切都白费了。 不过,一名Chromium开发人员回应,当用户在编辑网址时,子网域就会出现,即可输入正确的网址,只是在稳定状态时消失,因为在大多数的情况下,这并非用户需要关心的问题。而且在同一个网域中,把具备www及未具备www的网页指向不同的网页看起来就像是不适当的作法,因为人们很容易就造访到错误的目的,与Chorme介面的变更无关。
Spring框架推出5.0,其中包含了WebFlux,与过去我们所知的SpringWebMVC的差异是什么?开发者们准备好接受另一套模型了吗?新版Spring的一大特色,就是ReactiveWeb方案的WebFlux,这是用来替代SpringWebMVC的吗?或者,只是终于可以不再基于Servlet容器了? 基于Servlet容器的WebMVC 身为Java开发者,对于Spring框架并不陌生。它最初起源于2002年,是RodJohnson的著作“ExpertOne-on-OneJ2EE设计与开发”中的界面框架。到了2004年,推出Spring1.0,从XML到3.0之后,开始支援JavaConfig设定;进一步地,在2014年时,除了Spring4.0之外,首次发表了SpringBoot,最大的亮点是采用自动组态,令基于Spring的快速开发成为可能。 对Web开发者来说,Spring中的WebMVC框架,也一直随着Spring而成长,然而由于基于Servlet容器,早期被批评测试不易(例如:控制器中包含了ServletAPI)。 不过,从实作Controller介面搭配XML设定,到后来的标注搭配JavaConfig,WebMVC使用越来越便利。如果愿意,也可采用渐进的方式,将基于ServletAPI的Web应用程序,逐步重构为几乎没有ServletAPI的存在(可参考先前专栏文章<筛选框架必要功能>),在程式码层面达到屏壁ServletAPI的效果。 由于不少Java开发者的Web开发经验,都是从Servlet容器中累积起来的,在这个时候,WebMVC框架基于ServletAPI,就会是一项优点。因为,虽然运用WebMVC撰写程式时,可做到不直接面对ServletAPI,然而,也意味着更强烈地受到Spring的约束,有时则是无法在庞杂设定或API中找到对应方案,有时也因为心智模型还是挂在Servlet容器,经验上难以脱离,在搞不出的HttpSession,ServletContext的对应功能时,直接从HttpSession中,ServletContext的下手,毕竟也是个方法。 撰写程式时,就算没用到ServletAPI,WebMVC基于Servlet容器仍是事实,因为,底层还是得借助Servlet容器的功能,例如SpringSecurity,本质上还是基于Servlet容器的过滤器方案。 然而在今日,Servlet被许多开发者视为陈旧,过时技术的象征,或许是因为这样,在JavaEE8宣布推出的这段期间,当我在某些场合谈及Servlet4.0之时,总会听到有人提出「WebFlux可以脱离Servlet了」之类的善心建议。 实现ReactiveStreams的Reactor WebFlux不依赖Servlet容器是事实,然而,在谈及WebFlux之前,我们必须先知道Reactor专案,它是由Pivotal公司,也就是目前Spring的拥有者推出,实现了ReactiveStreams规范,用来支援Reactive编程的实作品。 既然是实现了ReactiveStreams规范,开发者必然会想到的是RxJava/RxJava2,或者至是Java9的FlowAPI。这也意道着,在能使用WebFlux之前,开发者必须对于ReactiveProgramming典范,有所认识,如果你从未接触过这些玩意儿,可以参考先前专栏。 开发者这时有疑问了,Spring为何不直接基于RxJava2,而是打造专属的ReactiveStreams实作呢? 就技术而言,Reactor是在Java8的基础上开发,并全面拥抱Java8之后的新API,像是Lambda相关介面,新日期与时间API等,这意谓着,专案如果还是基于Java7或更早版本,就无法使用电抗器。 在API层面,RxJava2有着因为历史发展脉络的原因,不得不保留一些令人容易困惑或混淆的模态或操作,而Reactor在这方面,都有着明确的对应API来取代,然而,却也提供与RxJava2(甚至是FlowAPI)间的转换。 另一方面,Reactor较直觉易用,例如最常介绍的Mono与Flux,实现了ReactiveStreams的发布者介绍,并简化了讯息发布,让开发者在许多场合,不用处理Subscriber和Subscription的细节(当然,这些在Reactor也予以实现)。而在SpringWebFlux中,Mono与Flux也是主要的操作对象。想知道如何使用Mono与Flux,可以参考<使用Reactor进行反应式编程>(https://goo.gl/vc2fGc)。 又一个的Web框架? 到了春天5,在Reactor的基础上,新增了WebFlux作为ReactiveWeb方案,我们在许多介绍文件的简单范例,例如<使用Spring5的WebFlux开发反应式Web应用>(https://goo.gl/G5uotZ),就看到当中使用了Flux,Mono来示范,而且,程式码看起来就像是SpringMVC。 这是因为WebFlux提供了基于Java标注的方式,有许多WebMVC中使用的标注,也拿来用于WebFlux之中,让熟悉WebMVC的开发者也容易理解与上手WebFlux,然而,这不过就是新的网络框架吗? 实际上,当然不是如此.WebFlux并非依赖WebMVC,而且它是基于Reactor,本质属于非同步,非阻断,ReactiveProgramming的心智模型,也因此,如果打算将WebFlux运行在Servlet容器之上,必须是支援Servlet3.1以上,因为才有非阻断输入输出的支援,虽然WebFlux的API在某些地方,确实提供了阻断的选项,若单纯只是试着将基于WebMVC的应用程式,改写为套用WebFlux,并不会有任何益处,反而会穷于应付如何在WebFlux实现对应的方案。 例如,SpringSecurity显然就不能用了,毕竟是Spring基于Servlet的安全方案,开发者必须想办法套用SpringSecurityReactive;而且,在储存方案上,也不是直接采用SpringData,而不是SpringData反应等。 就算能套用相关的设定与API,要能获得WebFlux的益处,应用程式中相关的元件,也必须全面检视,重新设计为非阻断,基于ReactiveProgramming方式,这或许才是最困难,麻烦的部份。 除了基于Java标注的方式,让熟悉WebMVC的开发者容易理解之外,WebFlux还提供了基于函数式的设计与组态方式。 实际上,在运用RxJava2/Reactor等ReactiveStreams的实作时,我们也都必须熟悉函数式的思考方式,才能充分掌握,这点在WebFlux并不例外。 可以脱离的Servlet容器了? Servlet容器是个旧时代的象征,如果能够屏蔽Servlet容器或相关API,许多开发者应应都会很开心,可以少一层抽象,不必使用肥肥的Servlet容器,当然会是使用WebFlux时附带的优点,然而,如果只是为了屏蔽的Servlet,其实,早就有其他技术选择存在。 基于Servlet一路发展过来的WebMVC,虽然目前在某些地方可以安插一些函数式的设计,然而,本质上不变的部分在于,在技术堆叠中所隐含的,仍是一个基于同步,阻断式,命令式的心智模型。如果在这样的堆叠中,开发者老是因为想要实现非同步,非阻断,Reactive,函数式而感到不快,WebFlux也许才会是可考虑的方案,而不单只是用来作为脱离Servlet容器,WebMVC的替代品。 整体而言,WebFlux还算是新技术,也还有待时间验证可行性,如果只是为了想用WebFlux来取代WebMVC,或甚至更小一点的野心,只是想要能脱离Servlet容器,最好在采取行动之前,全面检视一下,确认自身或团队成员是否准备好接受WebFlux的心智模型,或者真的存在着对应的应用场景吧!
这篇文章探讨成为区块链工程师的必备门槛外,也说说区块链的未来!会不会哪天产业垮台,就失业了? 区块链是不是假议题? 我常常跟别人说区块链会变得更好,大家都不信?因为区块链有太多无法解决的问题了。 那为什么你相信AI会听得懂人话? AI产业最早开始于1950年,中间历经了几次衰败,至今仍然每隔几年继续被讨论著。而每一次的讨论因为电脑基础建设的更新,而采用AI的可能性、普及性越高,甚至Google已经推出变态的真人电话客服了,打电话给你的人是一个假人。 因此我们以这样的观点来看区块链,区块链确实也给了科技更多的想像,但碍于许多技术限制,区块链势必还要几波曲折,而我们现在可能还处在第一个或第二个波折而已。再过几年,区块链的基础建设会更完备,每秒能处理的交易量可以更高,更多的生活应用会直接落地出来。 应该具备的知识? 一个区块链工程师「自学」能力一定要有的,因为这个领域不论是在前后端,还是在链的本身,每三天就有一个新的东西出来,工程师必需要在短期内掌握到状况。甚至那些东西都是最硬的,我的意思是,没有中文,没有别人整理。 这个领域是一群世界上最聪明的人在玩的,而我们必须要像他们一样够聪明。(话是这样讲,但也不用太紧张啦,请10个西西,刚好抵销一个V神)而根据你的公司属性不同,你需要有各种不同的电脑科学掌握度: 你们公司自己开一条链,那你要对「算法」很熟 你们公司要做DApp应用,那你要对「智能合约」熟 你们公司要做交易所,那你要对每条「链」都熟 区块链的应用程式都需要一个前后端与他互动,例如:需要一个网页介面登入交易所,或是来玩Fomo3D。因此在这领域混,懂一点前后端是必须的。你不用特别专精,但你总要和前后端人员沟通吧?(备注:一个交易所,有前后端,有交易所跟每条链介接的部份。这篇文章所注重的都是「区块链」的部分) 好,那我该学习哪条链? 根据上面的观察,端看您的志向是什么!有不同的学习方式,但如果您还没有概念,我建议您先从Ethereum开始。 Ethereum以太坊,是最早有智能合约的「公链」,为什么会推荐它让您学呢? 最早开始搞,最稳定,网络上教学资源最多。 智能合约入门容易,且直观。 以太基金会庞大,13位研究员。 现在已经有众多DApp应用在上面落地。 最容易上手,也比较直观(安装Metamask不用五分钟,就有地址了) 您可以透过以太坊,完整且扎实地明白智能合约与区块链的关系,明白挖矿、交易、手续费这些区块链原理,知道原来智能合约的概念这么78。虽然以太坊目前的每秒处理交易量大约才30~50笔,但过几年之后,以太坊会更好。(其他的公有、私有链我不觉得他们会那么稳定下去,所以我不推荐) 网络有哪一些资源? 以太僵尸—智能合约教学 完整以太智能合约教学网站 TaipeiEthereumMeetup以太坊社群专栏 如何应征,有哪些诀窍? 企业会最先采用区块链,而且是后端。你看以往任何新科技都是从企业先采用开始的:云端,AI。为什么会这样?因为初期投入成本高,研究人员不好找,很贵。再来是,大企业做出来,直接用在自己的通路上。小企业要自己做区块链,做出来根本没有场域试验,现在谁还会相信两个工程师写出来的程式? 因此挑选公司时,应该要找中企业,已经在这领域做出一点点成绩了。你找大企业:银行、外商,他们碍于体制限制,走的不一定最快。而中企业,最适合,因为创办人或产品已经有少许知名度,内部团队技术还不错,肯一起学习,这里最适合你发展! 千万不要找一些原本没有在做区块链,而突然跳下来做的。104打开,征招区块链工程师的职缺很多,部分都需要以太坊,但很多很雷的。不管是产品雷,还是商业模式雷,请您应征前记得要问一下!
CryptoKitties 在区块链上交易、持有者热点图 科技巨头如何面对区块链发展一直都是众人相当关注的,Google 近日又有了 新动作 ,将以太坊导入旗下数据分析平台 BigQuery。 Google 考量到在系统架构,以太坊类似于比特币,主要用于记录不可变的交易。两者本质上都是 OLTP 数据库,但几乎不提供 OLAP(分析)功能。但是,以太坊数据明显有系统分析管理的需求性。 然而以太坊坊点对点软件有针对常用功能的API(像是查看交易、钱包状态、查询余额)但没有简易能获得所有链上储存数据的API 终端,另外, API 终端无法浏览总体的区块链数据。 BigQuery 藉由提供的视觉化服务让企业更易于进行商业决策,综观以太坊应用现况、评估系统运行是否接近极限,决定是否开发以太坊架构。 Google 在文章中以日前热门的 dApp 游戏 CryptoKitties 向大家展示 BigQuery 如何产生可视化的流量资料。目前BigQuery 主要提供三种分析服务,主流智能合约、区块链代币交易现况(每日交易量、交易总额)、智能合约功能分析,假设今天你想打造一款类似CryptoKitties 的dApp 游戏机制,可以透过工具查询所使用到类似的智能合约。 Google 认为目前已有其他平台能够提供用户查看区块链交易纪录、智能合约等资料,不过仍缺乏一个系统性的工具可对以太坊的各项指标进行统计与分析,继先前将比特币纳入BigQuery后,Google 见证到以太坊相较前者除了去中心化、不可篡改之特性,更因智能合约上得以更广泛的运用。 举例来说,藉由分析工具你可以查看交易最多的智能合约是 CryptoKitty 游戏,目前使用了 230 多万次 CryptoKitties 交易、持有者被纪录在区块链上资料的可视化图可在 BigQuery 查看 Google 以 OmiseGO 为例 2017 年 9 月 13 日,$ OMG 接收数大幅增加,是来自空投活动
电商老板,经理都可能需要爬自己经营的网站,目的是监控网页,追踪网站流量,寻找优化机会等。 对于其中的每一项,均可以通过离散工具,网络抓取工具和服务来帮助监控网站。只需相对较少的开发工作,就可以创建自己的站点爬网程序和站点监视系统。 构建自定义的爬虫站点和监控程序, 第一步是简单地获取网站上所有页面的列表。本文将介绍如何使用Python编程语言和一个名为Scrapy的整洁的Web爬网框架来轻松生成这些页面的列表。 你需要一个服务器,Python和Scrapy 这是一个开发项目。需要安装Python和Scrapy的服务器。还需要通过终端应用程序或SSH客户端对该服务器的命令行进行访问。还可以从Python.org的文档部分获取有关安装Python的信息。Scrapy网站还有很好的安装文档。请确认您的服务器已准备好安装Python和Scrapy。 创建一个Scrapy项目 使用像Putty for Windows这样的SSH客户端或Mac,Linux计算机上的终端应用程序,导航到要保留Scrapy项目的目录。使用内置的Scrapy命令startproject,我们可以快速生成所需的基本文件。 本文将抓取一个名为Business Idea Daily的网站,因此将该项目命名为“bid”。 生成一个新的Scrapy Web Spider 为方便起见,Scrapy还有另一个命令行工具,可以自动生成新的Web Spider。 scrapy genspider -t crawl getbid businessideadaily.com 第一个术语,scrapy,参考Scrapy框架。接下来,有genspider命令告诉Scrapy我们想要一个新的web spider,或者,如果您愿意,还想要一个新的网络爬虫。 -t告诉Scrapy我们想要选择一个特定的模板。genspider命令可以生成四个通用Web Spider模板中的任何一个:basic,crawl,csvfeed和xmlfeed。直接在-t之后,我们指定了想要的模板。在这个例子中,我们将创建被Scrapy称为CrawlSpider的模板。 “getbid”这个词就是spider的名字。 该命令的最后一部分告诉Scrapy我们想要抓取哪个网站。框架将使用它来填充一些新spider的参数。 定义Items 在Scrapy中,Items是组织我们spider爬行特定网站时收集东西的方式/模型。虽然我们可以很容易地完成我们的目标- 获取特定网站上所有页面的列表- 不使用Items,但如果我们想稍后扩展我们的爬虫,则不使用Items可能会限制我们。 要定义一个Item,只需打开我们生成项目时创建的Scrapy的items.py文件。在其中,将有一个名为BidItem的类。类名基于我们为项目提供的名称。 class BidItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() pass 将pass替换为名为url的新字段的定义。 url = scrapy.Field() 保存做好的文档 构建Web Spider 接下来打开项目中的蜘蛛目录,查找生成的新Spider Scrapy。 在这个例子中,这个蜘蛛叫做getbid,所以文件是getbid.py。 在编辑器中打开此文件时,您应该看到如下所示的内容。 # -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from bid.items import BidItem class GetbidSpider(CrawlSpider): name = 'getbid' allowed_domains = ['businessideadaily.com'] start_urls = ['http://www.businessideadaily.com/'] rules = ( Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True), ) def parse_item(self, response): i = BidItem() #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract() #i['name'] = response.xpath('//div[@id="name"]').extract() #i['description'] = response.xpath('//div[@id="description"]').extract() return i 我们需要对为我们生成的代码Scrapy进行一些小的更改。 首先,我们需要在规则下修改LinkExtractor的参数。删除括号中的所有内容。 Rule(LinkExtractor(), callback='parse_item', follow=True), 通过此更新,我们的spider将在起始页面(主页)上找到每个链接,将单个链接传递给parse_item方法,并按照指向网站下一页的链接来确保我们获取每个链接页面。 接下来,我们需要更新parse_item方法。 删除所有注释行。这些线条只是Scrapy为我们提供的例子。 def parse_item(self, response): i = BidItem() return i 我喜欢使用有意义的变量名。 所以我要将i更改为href,这是HTML链接中属性的名称,如果有的话,它将保存目标链接的地址。 def parse_item(self, response): href = BidItem() return href 现在奇迹发生了,我们捕获页面URL为Items。 def parse_item(self, response): href = BidItem() href['url'] = response.url return href 这就对了。 新Spider已经准备好爬行了。 抓取网站,获取数据 从命令行,我们想要导航到我们的项目目录。 进入该目录后,我们将运行一个简单的命令来发送我们的新蜘蛛并获取一个页面列表。 scrapy crawl getbid -o 012916.csv 该命令有几个部分。 首先,我们参考Scrapy框架。 我们告诉Scrapy我们想爬行。 我们指定要使用getbid蜘蛛。 -o告诉Scrapy输出结果。 该命令的012916.csv部分告诉Scrapy将结果放在带有该名称的逗号分隔值(.csv)文件中。 在示例中,Scrapy将返回三个页面地址。 我为这个例子选择这个网站的原因之一是它只有几页。 如果你在一个有数千页的网站上瞄准一个类似的蜘蛛,它将需要一些时间来运行,但它会返回一个类似的响应。 urlhttps://businessideadaily.com/auth/loginhttps://businessideadaily.com/https://businessideadaily.com/password/email 只需几行代码,您就可以为自己的站点监控应用程序奠定基础。 本文由数据星河原创内容