首页 文章 精选 留言 我的

精选列表

搜索[零点击],共10000篇文章
优秀的个人博客,低调大师

从零开始玩人工智能—人脸 API—01

说实话,边学AI边学Python挺酸爽的。可这阻止不了我尝试学习AI的热情,哈哈。并且,如果我能搞出来,看到文章的您肯定也不在话下。 人脸API是Azure上AI及认知服务的一项,应该是从计算机视觉分出来的吧,针对人脸的特点单独做了特定的人工智能机器学习及API封装。由于是基于Azure的云端服务,所以针对人脸的一些功能封装的很好,只需要使用HTTP的几类方法 (GET \ PUT\ POST\ PATCH\ DELETE) 提供数据然后调用即可。 首先,在Azure订阅中添加人脸API的服务。和其他的认知服务一样,也有免费的定价,也是通过Key来访问这个服务。所以,开始学习代码之前,先复制人脸API服务的Key。 应该说,Azure认知服务的页面给的链接还是不错的,后续大部分需要的内容,通过这些链接都能找到信息。最近的文档配图增加了,不过和其他产品的文档一样,感觉组织有点纷乱。这和云转型以及大量引入不同的开源、Linux、不同语言可能相关吧。 我们的目标是通过示例代码尽快的了解人脸API服务是如何工作的。所以文档和不多的示例代码非常有用。第一个快速了解Face API机制的示例代码可以在这里查看:https://docs.microsoft.com/en-us/azure/cognitive-services/face/quickstarts/python 代码其实不复杂。首先,按照API的要求,使用订阅的服务Key和数据类型作为header,按照要求和需要,提供特定的参数params和指定格式的内容body,构造特定的URL字串,然后用指定的方法通过HTTPS请求Azure上的人脸API服务。 看看Detect这个API。通过提交一张照片,就能够利用人工智能检测照片中的人脸,进行分析和提取特征。通过示例代码,我们可以学习到挺多东西的。 首先,如图中的body,实际上是提供一张照片给AI。除了这里的JSON模式的数据之外,也可以使用octet-stream模式的数据,比如从本地提供照片。 对于Detect的API来说,很重要的一点是params里面说明了人脸检测返回的三个重要的数据:FaceID,FaceLandmarks (面部特征) 和 FaceAttributes (面部属性)。FaceID后面再说,先看面部属性。面部属性会返回AI对人脸的判断,例如性别,年纪,戴没戴眼镜,什么眼镜,头发怎样,啥颜色,什么表情之类。需要返回哪些属性,可以在params里指定。原示例代码给的是一位美女的照片,我换成了伟大的爱因斯坦的照片~ 从返回的结果看,照片里的爱因斯坦有一点点 (0.003) 的不开心啊哈哈。七情六欲,表情属性正好七个。 这些属性可以做很多的事情,例如通过表情判断人的情绪,进而改进服务、应用或者AI的交互体验。想象一下,每天到办公室开机,Cortana会说,今天你不太开心啊,路上辛苦了,我给你讲个笑话吧。是不是比你女朋友 (if girlfriend.get(): ) 还体贴? 另一个很重要的返回,是面部特征。我们国家的人脸识别技术非常领先,Azure使用的技术很多应该也来自于我们的微软亚洲研究院。人脸API中,对人脸进行的抽象是27点面部取样。 按照这27点取样,计算各点对应关系,就能够让人工智能判断人脸特点,进行识别。在这里:https://docs.microsoft.com/en-us/azure/cognitive-services/face/face-api-how-to-topics/howtodetectfacesinimage对这部分做了简要说明。 参考 API的说明:我猜由于目前还不是个Global的服务,所以构造认知服务调用的URL的时候,需要按照服务所在站点填写。而四类不同的API调用,每个API要求的URL也不尽相同。如前文所说,实际上API的实现,都是构造这些URL然后使用不同的HTTP方法完成。 API参考和其他认知服务一样,除了说明,还给出了不同常见语言的示例。通过示例代码能够很快了解如何使用这些服务。此外,对输入和输出的数据类型、格式以及限制也给出了详细的说明。我想说的是,即使没有编程基础,也真的不难。 对于已经熟悉API的用户,当然也可以直接使用封装好的SDK。可以在GitHub获得:https://github.com/Microsoft/Cognitive-Face-Python 而文档也给出了使用SDK的示例代码:https://docs.microsoft.com/en-us/azure/cognitive-services/face/tutorials/faceapiinpythontutorial 本文转自HaoHu 51CTO博客,原文链接:http://blog.51cto.com/haohu/2071650,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark Streaming kafka实现数据零丢失的几种方式

在使用Spark streaming消费kafka数据时,程序异常中断的情况下发现会有数据丢失的风险,本文简单介绍如何解决这些问题。 在问题开始之前先解释下流处理中的几种可靠性语义: 1、At most once - 每条数据最多被处理一次(0次或1次),这种语义下会出现数据丢失的问题; 2、At least once - 每条数据最少被处理一次 (1次或更多),这个不会出现数据丢失,但是会出现数据重复; 3、Exactly once - 每条数据只会被处理一次,没有数据会丢失,并且没有数据会被多次处理,这种语义是大家最想要的,但是也是最难实现的。 Kafka高级API 如果不做容错,将会带来数据丢失,因为Receiver一直在接收数据,在其没有处理的时候(已通知zk数据接收到),Executor突然挂掉(或是driver挂掉通知executor关闭),缓存在内存中的数据就会丢失。因为这个问题,Spark1.2开始加入了WAL(Write ahead log)开启 WAL,将receiver获取数据的存储级别修改为StorageLevel.MEMORY_AND_DISK_SER,使用代码片段如下: 1 2 3 4 5 6 valconf= new SparkConf() conf.set( "spark.streaming.receiver.writeAheadLog.enable" , "true" ) valsc= new SparkContext(conf) valssc= new StreamingContext(sc,Seconds( 5 )) ssc.checkpoint( "checkpoint" ) vallines=<span class = "wp_keywordlink_affiliate" ><adata-original-title= "ViewallpostsinKafka" href= "https://www.iteblog.com/archives/tag/kafka" title= "" target= "_blank" >Kafka</a></span>Utils.createStream[String,String,StringDecoder,StringDecoder](ssc,kafkaParams,topicMap,StorageLevel.MEMORY_AND_DISK_SER).map(_._2) 但是开启WAL后,依旧存在数据丢失问题,即使按官方说的设置了WAL,依旧会有数据丢失,这是为什么?因为在任务中断时receiver也被强行终止了,将会造成数据丢失,提示如下: 1 2 3 ERRORReceiverTracker:Deregisteredreceiver for stream 0 :Stoppedbydriver WARNBlockGenerator:CannotstopBlockGeneratorasitsnotintheActivestate[state=StoppedAll] WARNBatchedWriteAheadLog:BatchedWriteAheadLogWriterqueueinterrupted. 在Streaming程序的最后添加代码,只有在确认所有receiver都关闭的情况下才终止程序。我们可以调用StreamingContext的stop方法,其原型如下: 1 defstop(stopSparkContext:Boolean,stopGracefully:Boolean):Unit 可以如下使用: 1 2 3 sys.addShutdownHook({ ssc.stop( true , true ) )}) WAL带来的问题 WAL实现的是At-least-once语义。如果在写入到外部存储的数据还没有将offset更新到zookeeper就挂掉,这些数据将会被反复消费。同时,因为需要把数据写入到可靠的外部系统,这会牺牲系统的整个吞吐量。 Kafka Direct API Kafka direct API 的运行方式,将不再使用receiver来读取数据,也不用使用WAL机制。同时保证了exactly-once语义,不会在WAL中消费重复数据。不过需要自己完成将offset写入zk的过程。调用方式可以参见下面: 1 2 3 4 5 6 7 messages.foreachRDD(rdd=>{ valmessage=rdd.map(_._2) //对数据进行一些操作 message.map(method) //更新zk上的offset(自己实现) updateZKOffsets(rdd) }) 本文转自里冲51CTO博客,原文链接:http://blog.51cto.com/coollast/1887077 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

从零开始玩人工智能—人脸 API—02

前文介绍了人脸API,但没有一个完整的功能实现,各个功能的API始终如散开的珍珠一样,不能串成珠链。到底这套API是如何工作的呢?Person、Person Group、FaceList、Face这些不同的对象是怎么发生联系的呢? 于是,我决定写一个相对完整的简单程序,完成一个对人脸进行识别的功能。 仔细看了看文档,琢磨了一下。为了实现人脸识别,需要实现以下几个步骤: 1、创建一个Person Group。人需要通过组来进行管理组织。每个组最多有1000个人,免费的每个订阅最多1000人,S0订阅的每个组10000人,每个订阅上限1M组、100M人。 2、创建一个Person。人是Face的拥有着。每个人最多有248张脸的图片。和人关联的脸是持久化的persistedFace,而使用detect等api读取的是非持久的Face。 3、为Person提供几张不同的Face。除了Face,还有FaceList对象,但更多用于分辨类似的脸。我估计要进行人脸识别,用Face对象就可以。 4、对提供的几张Face进行训练。人工智能需要对输入进行训练,利用认知服务进行分析并得到结果。理论上提供训练的数据越多,结果越准确。 5、提供一张用于比对的Face。上传一张图片,让人工智能判断是不是同一个人。 开始之前我要首先熟悉一下示例代码。前文提供的示例代码和Face API的示例代码使用了不同的模块。示例代码引入了requests这个库,使用它可以更灵活的完成有关HTTP的各类方法特别是传递数据。所以: pip install requests 因为有两种不同的数据headers提交方式json和octet-steam,所以分开写了两个不同的headers头部定义。为了便于使用,把订阅的Key和访问的基础链接分别使用变量进行提供。 正式开干~首先是创建Person Group。和别的对象不同,PersonGroup的名字和ID都是字符串,只接受小写英文字符和‘-’、‘_’,不多于64个字符。 其他对象的ID都是类似GUID的形式。通常在创建对象的时候由服务返回。由于Person Group是首先创建的,所以其ID由用户指定也很合乎情理。创建Person Group之后,就可以在组里面创建人了。 每一部我都是用了print来输出获得的json数据。由于添加Face需要提供Person ID,所以在这里我从json里面取出了personId的数据。 Python里面处理json可以用dump、dumps、load、loads不同的方法。loads能够把获得的json数据转成dict或者list,这在我踩过list的坑之后才想明白。一旦json中的数据分层了,转化出来的就是list了,这时就需要逐层处理数据。可以参考Python的手册: 18.2.json— JSON encoder and decoder:https://docs.python.org/2/library/json.html 有了personId,就可以为特定的人添加Face了。官方示例代码给的是通过json传递一个图片的url。有很多人在下面问,怎么使用本地的照片呢?其实利用文件,然后使用octet-steam发送给Azure就可以了。经过一番对requests.request()参数的猜测和对文件的尝试,果然就能够把图片传上去了。persistedFaceId其实后面没有直接使用,为了学习我还是把它提取出来了。 为了训练机器,继续传了几张我的帅照…… 当一个人有了几分脸面之后……哈哈,我们应该训练人工智能了。直接POST特定URL即可。 到了关键的时候了,我们要检验认知服务的效果了。先使用Detect方法输入一张照片。 这里其实不需要所有参数,只需要返回faceId就可以。所以把params里面的数据删了也无所谓。不过我想看看完整的输出是怎样的,就全写出来了。 于是就遇到了前面说的坑,使用dict的方法,没法获得list里面的数据。要是一层一层分析…好麻烦啊,转念一想,输出的格式是固定的,因此偷了个懒,直接用list的下标获取faceId的dict,然后再get出faceId。 最后,就是调用Verify方法,确认提供的照片是不是我们之前使用几张照片训练过的人的了。这句话好长去…… 为了容易体现结果,我还特意用了中文…… 按照文档说的,高于0.5的评分就可以视作通过,所以属性isIdentical的值为True,直接拿来做条件。 照片是我本人吗?当然,是。 利用Azure的Face API,完成一个人脸识别,很简单吧。 本文转自HaoHu 51CTO博客,原文链接:http://blog.51cto.com/haohu/2072179,如需转载请自行联系原作者

优秀的个人博客,低调大师

零基础搭建Hadoop大数据处理-环境

由于Hadoop需要运行在Linux环境中,而且是分布式的,因此个人学习只能装虚拟机,本文都以VMware Workstation为准,安装CentOS7,具体的安装此处不作过多介绍,只作需要用到的知识介绍。 VMware的安装,装好一个虚拟机后利用复制虚拟机的方式创建后面几个虚拟机,省时省力,需要注意的是需要修改每个虚拟机的IP与主机名。 所有虚拟机采用NAT模式上网,而且要保证与物理主机的IP互相能访问。 需要注意的几个问题。nat如果上网首先需要查看物理机(pc机)这个服务器已经启动。上网的原理:流量是走的物理网卡,但是它的ip,却是和物理机没有关系的。也就是说,无论你怎么更换网络环境,你的虚拟机都不需要做改变。这就是它的优点。 首先在安装VMware 之后,我们会看到多了两个网卡 这个如果经过网络配置的折磨,应该能找到着两个网卡:vmnet1和vmnet8,这里讲的是vmnet8。 重点看右侧第三图你会看到ip地址,这个ip地址,因个人而异,也就是说不同网络,不同环境,这个ip变化的概率是很大的。可能是192.168.0.1等等。这里也相当于我们编程的一个变量,这里是需要你根据你的环境来赋值的,建议vmnet1到vmnet8分别设置192.168.10.1到192.168.80.1,好作区分。 上面我们通过看到的虚拟机网卡的ip,为了避免混肴,上面的虚拟网卡和本地网络适配器处于同一界面。如下图: 而下面则是在打开虚拟机之后,通过菜单弹出 弹出之后,我们在看一下虚拟机的(交换机)vmnet8. 可以看到vmnet8子网ip和虚拟机网卡是出于同一个网段的。 同时在右侧net设置界面,我们可以看到网关为:192.168.106.2,改成192.168.80.2 虚拟机的设置会用到。 Linux基础知识 Linux的学习也是一个过程,因为可能你连最简单的开机和关机命令都不会,更不要谈配置网络。这里面给大家提供刚开始学习所查阅的资料和经验总结。 首先我们需要使用一些命令,进行网络配置,但是在网络配置中,这里面又必须懂得虚拟机的一些知识,所以前面的虚拟机知识需要掌握扎实一些。 在此注意CentOS7与CentOS6的命令有些不同,会一些常用命令是必备,每次开机或启动解压安装授权都是最基本的知识,其它的可以暂时不用学。 CentOS中安装java环境 下载对应32或64位jdk,设置好JDK环境变量PATH,具体的配置可自行Google。 环境准备 修改机器名,每个系统中都要修改成这样。 打开终端,切换到root用户下修改机器名称。 $sudosu $vim/etc/sysconfig/network 在其中添加“HOSTNAME=H32” 添加每个服务器IP对应的机器名 三个ip地址都添加到各自的/etc/hosts文件中 每个系统中都要修改成这样 #编辑hosts vim/etc/hosts 关闭SELinux #编辑SELinux配置文件 vim/etc/selinux/config #改状态 SELINUX=disabled SSH设置 进入H30,查看ssh是否安装,如果有,继续,没有安装下。 rpm-qa|grepssh 时间服务器安装 这里需要安装时间服务器,其他的服务器通过这个来进行多机器时间的同步,分布式部署时机器时间不一致会导致数据错误或组件内通讯错误。 安装httpd服务 httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。 安装yum-utils yum install yum-utils 用于在线yum安装 它是基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。(需要机器能访问外网) 准备资源和环境 下载Centos 7.2 的iso安装镜像,jdk1.8 for Linux压缩包,hadoop2.7.3压缩包(本来用hadoop3,发现后面不兼容hive的最新版本) Java基础知识 由于Hadoop框架源码都是以java来写,因此最好都以java作为开发的最佳语言,虽然说有些用C#做了封装,但性能已大打折扣。(这就是为什么说Java的学大数据有很大的优势,其它语言的还需要重新学习Java) Eclipse IDE使用 Linux和Windows下源码编译技术 还有最重要的是你的网速要好,因为安装过程中会下载依赖包,网不好会卡到你怀疑人生。 最后还需要有耐心,每台机子的环境都不一样,而且每个人下载的包的版本也有可能不一样 会导致各种问题,此时就需要耐心的去看日志,不停的尝试和仔细的对比安装步骤,可能就是少了个变量 或大小写错误或是要重启。 环境准备就这么多,下一章开始讲如何安装Hadoop集群。 本文作者:欢醉 来源:51CTO

优秀的个人博客,低调大师

零基础搭建Hadoop大数据处理-初识

在互联网的世界中数据都是以TB、PB的数量级来增加的,特别是像BAT光每天的日志文件一个盘都不够,更何况是还要基于这些数据进行分析挖掘,更甚者还要实时进行数据分析,学习,如双十一淘宝的交易量的实时展示。 大数据什么叫大?4个特征: 体量化 Volume,就是量大。 多样化 Variety,可能是结构型的数据,也可能是非结构行的文本,图片,视频,语音,日志,邮件等 快速化 Velocity,产生快,处理也需要快。 价值密度低 Value,数据量大,但单个数据没什么意义,需要宏观的统计体现其隐藏的价值。 可以看出想只要一台强大的服务器来实时处理这种体量的数据那是不可能的,而且成本昂贵,代价相当大,普通的关系型数据库也随着数据量的增大其处理时间也随之增加,那客户是不可能忍受的,所以我们需要Hadoop来解决此问题。 优点: Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。它主要有以下几个优点: 高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。 高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。 高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。 高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。 低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。 Hadoop得以在大数据处理应用中广泛应用得益于其自身在数据提取、变形和加载(ETL)方面上的天然优势。Hadoop的分布式架构,将大数据处理引擎尽可能的靠近存储,对例如像ETL这样的批处理操作相对合适,因为类似这样操作的批处理结果可以直接走向存储。Hadoop的MapReduce功能实现了将单个任务打碎,并将碎片任务(Map)发送到多个节点上,之后再以单个数据集的形式加载(Reduce)到数据仓库里。 Hadoop在各应用中是最底层,最基础的组件,所以其重要性不言而喻。 框架结构 Hadoop主要由HDFS ( 分布式文件系统)和MapReduce (并行计算框架)组成。 Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS(对于本文)的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。 HDFS 对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS 的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 的一个缺点(单点失败)。 存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小(通常为 64MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/IP 协议。 单节点物理结构 主从结构 主节点,只有一个: namenode 从节点,有很多个: datanodes namenode负责:接收用户操作请求 、维护文件系统的目录结构、管理文件与block之间关系,block与datanode之间关系 NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。 datanode负责:存储文件文件被分成block存储在磁盘上、为保证数据安全,文件会有多个副本 MapReduce MapReduce是处理大量半结构化数据集合的编程模型。编程模型是一种处理并结构化特定问题的方式。例如,在一个关系数据库中,使用一种集合语言执行查询,如SQL。告诉语言想要的结果,并将它提交给系统来计算出如何产生计算。还可以用更传统的语言(C++,Java),一步步地来解决问题。这是两种不同的编程模型,MapReduce就是另外一种。 MapReduce和Hadoop是相互独立的,实际上又能相互配合工作得很好。 主从结构 主节点,只有一个: JobTracker 从节点,有很多个: TaskTrackers JobTracker负责:接收客户提交的计算任务、把计算任务分给TaskTrackers执行、监控TaskTracker的执行情况 TaskTrackers负责:执行JobTracker分配的计算任务 Hadoop能做什么? 大数据量存储:分布式存储 日志处理: Hadoop擅长这个 海量计算: 并行计算 ETL:数据抽取到oracle、mysql、DB2、mongdb及主流数据库 使用HBase做数据分析: 用扩展性应对大量的写操作—Facebook构建了基于HBase的实时数据分析系统 机器学习: 比如Apache Mahout项目 搜索引擎:hadoop + lucene实现 数据挖掘:目前比较流行的广告推荐 大量地从文件中顺序读。HDFS对顺序读进行了优化,代价是对于随机的访问负载较高。 数据支持一次写入,多次读取。对于已经形成的数据的更新不支持。 数据不进行本地缓存(文件很大,且顺序读没有局部性) 任何一台服务器都有可能失效,需要通过大量的数据复制使得性能不会受到大的影响。 用户细分特征建模 个性化广告推荐 智能仪器推荐 扩展 实际应用: Hadoop+HBase建立NoSQL分布式数据库应用 Flume+Hadoop+Hive建立离线日志分析系统 Flume+Logstash+Kafka+Spark Streaming进行实时日志处理分析 酷狗音乐的大数据平台 京东的智能供应链预测系统 Hadoop的学习不仅仅是学习Hadoop,还要学习Linux,网络知识,Java、还有数据结构和算法等等,所以万里长征才开始第一步,希望Hadoop学习不是从了解到放弃。 本文作者:欢醉 来源:51CTO

优秀的个人博客,低调大师

浅谈Android应用保护(零):出发点和背景

近几年来,无线平台特别是Android平台的安全逐渐成为各厂商关注的重点。各种新的思路和玩法层出不穷。所以,笔者基于前一段时间的学习和整理,写了这系列关于Android应用安全和保护的文章。 这5篇文章主要关注客户端代码和数据的保护,介绍了几种针对Android应用的逆向分析、攻击和防护的方法。内容比较浅显,适合没有Android安全研究背景的同学入门和科普阅读。 无线端应用对抗的出发点和背景 根本上来说,手机客户端是完全控制在使用者手上的,是不可信的,不应该依靠客户端来实现任何安全、逻辑、业务相关的控制。客户端应该是极“瘦”的,不做任何安全相关的逻辑上的操作和判断,不存储敏感信息,甚至像浏览器一样简单,所有逻辑都由服务端处理然后下发结果。 1.为了用户体验,本地必须保存登陆者的认证信息,避免每次打开都需要输入密码登录 2.为了用户体验和减少服务器负载,展示给用户的页面大多需要本地绘制 3.有一部分安全逻辑必须由本地控制,如本地手势密码的设置和验证 所以必须要赋予本地客户端部分安全相关和逻辑控制相关的功能。而这些功能和逻辑一旦在本地客户端实现,就一定会面临着请求伪造、逻辑篡改、代码泄露等的风险。(可以类比于B/S架构中的以Js为代表的本地脚本:Js在本地运行,可能会被修改、注入、绕过,Js代码会被攻击者直接看到)。 不过好在安全本身就不是绝对的,是和场景和价值结合起来讨论的。如果能通过一些方法,让应用分析者分析应用的难度提升到一个非常高的水平,或者说让应用分析者分析的过程消耗的资源大于其成功之后获得的回报,再或者说是让应用逆向分析、攻击者获得的成果对用户的资金和安全感的造成的影响很小到可以忽略的话,我们也可以认为是安全的。 无线客户端分析和保护的出发点就是基于上述背景。实现逻辑的控制和绕过,敏感数据的加密和窃取等。在应用攻防中,双方各有优劣。无线应用因为自身所能做的事情有限,在防御中是处于劣势地位。 攻防 攻击者可以使用root权限,可以使用特殊构造的操作系统(TaintDroid等),可以获取并修改应用的动态代码(Xposed,cydia substrate)、系统的环境(Xposed),可以修改重打包应用的静态代码(smali/baksmali/dex2jar)。 而在在防御中,开发者为了保护自己的应用,也相应采取了各种方法,把自己应用的安全性寄托在了各种地方。 1.寄托于破坏攻击者的工具。 2.寄托在java层代码逆向、调试、阅读的难度和java自身的机制上。 3.寄托在Native层(c/c++)代码逆向、调试、阅读的难度上。 这就分别对应了无线客户端攻防的三个维度。 一般而言,对于无线客户端的安全攻防上,企业或开发者由于精力有限可能无法满足应用的安全需求,如鲠在喉般的遏制着应用的健康发展。 阿里聚安全开放平台,拥有移动安全、数据风控、内容安全、实人认证等产品解决方案,其中移动安全方案中的应用加固及安全组件功能,可以让您的应用拥有金融级的安全防护。 文章分类 技术研究 安全资讯 安全报告 安全漏洞 病毒分析 活动沙龙 社区热门 技术研究 安全资讯 安全报告 安全漏洞 阿里巴巴直播防控中的实人认证技术2.6k 细数iOS上的那些安全防护5.8k Android安全开发之通用签名风险5.3k 拥有300万安装量的应用是如何恶意推广刷榜的?6.1k Android安全开发之ZIP文件目录遍历5.6k 标签 短信 积分兑换 仿冒应用 漏洞分析 漏洞预警 年度报告 安全报告 病毒分析 阿里聚安全 友情链接 阿里巴巴集团 阿里云计算 淘宝网 天猫 支付宝 钱盾 E安全 应用更安全,用户更放心! 立即登录

优秀的个人博客,低调大师

这个勒索软件即服务已经实现零编码需求

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 一新发现的勒索软件家族通过勒索软件即服务(RaaS)商业模式提供,让网络罪犯们得以轻松定制自己的恶意软件。 该勒索软件家族由安全研究员Xylitol发现,命名为“撒旦(Satan)”,由于只需创建账号即可使用,任何有意的罪犯都能用。勒索收益仅需给作者抽成30%,让该RaaS颇具吸引力。 事实上,该RaaS有意让使用者不用投入太多精力,因为它会处理赎金支付和新功能的添加。不过,成为会员得收点发行费,但开发者宣称,成功的案例会奖励更高的赎金支付提成。 “撒旦”RaaS站点的欢迎页面上写有该服务的说明,注册用户能访问一个控制台,通过多个页面设置他们自己的勒索软件。这些设置页面包括:恶意软件、释放器、翻译、账户、通知和消息。 “恶意软件”页面上,属意罪犯可自定义他们自己的勒索软件:设定赎金数额、赎金保持不变的天数、过期增长率。“释放器”页面辅助会员打造恶意微软Word宏或CHM安装程序,通过垃圾邮件或其他方式投送恶意软件。 会员可在“翻译”页面扩展用于勒索信的语言,在“账户”页面跟踪被感染受害者的数量、已支付数和其他信息。“通知”页面用于显示来自RaaS开发者的消息,而“消息”页面则是为“客户服务”请求所设。 “撒旦”运营者会专门要求会员不要与VirusTotal共享下载勒索软件样本,降低安全厂商遇到该变种的可能性。该服务目前在地下论坛上打广告,恶意载荷和盈利模式都有介绍。 为规避分析,“撒旦”勒索软件内置了很多虚拟化检查,只要觉得自身运行在虚拟机里,立马终止进程。如果检查通过,该恶意软件会将自身注射进TaskHost.exe进程,然后开始加密被感染计算机上的文件。 该勒索软件目前针对350多种文件类型,安全研究人员还在分析其加密算法。他们现在所知道的,是该恶意软件会在被加密文件的文件名后添加上.stn后缀,而不是在编码该文件名之前。 加密过程中,“撒旦”会在每个包含有被加密文件的文件夹中,释放出一个名为“HELP_DECRYPT_FILES.html”的勒索信。加密完所有文件后,它会运行cipher.exe程序,清除C盘上未使用空间的所有数据。 “撒旦”的勒索信包含有***的受害者ID和一条通向TOR匿名支付站点的URL,以及用户恢复被加密文件应遵循的指令。勒索信还宣称使用了AES-256和RSA-2048加密算法,不过,这一点尚有待证实。

优秀的个人博客,低调大师

从零学React Native之06flexbox布局

前面我们接触了好多React Native代码, 并没有介绍RN中的组件具体是如何布局的,这一篇文章,重点介绍下flexbox布局。 什么是flexbox布局 React中引入了flexbox概念,flexbox是属于web前端领域CSS的一种布局方案,是2009年W3C提出了一种新的布局方案,可以简便、完整、响应式地实现各种页面布局。你可以简单的理解为flexbox是CSS领域类似Android中 LinearLayout的一种布局,但是要比 LinearLayout要强大的多。 React Native中对Web端的FlexBox进行了阉割,以用来适应移动设备。 RN利用flexBox模型布局, 也就是在手机屏幕上对组件进行排列.利用flexBox模型,开发者可以开发出动态宽高的自适应的UI布局。 我们前面介绍过View,Text等组件的一些属性设置了,RN强大的UI布局能力主要是通过各个不同组件的样式(style)属性中的各个键的设置来实现的。大部分组件的style都支持flexbox布局。 下面就是我们常见的布局的写法: ... class AwesomeProject extends Component { render() { return ( <View style={styles.container}> //根View <View style={styles.test1}/> // 子View <View style={styles.test2}/> // 子View </View> ); } } const styles = StyleSheet.create({ container: { //根View样式 flex: 1, backgroundColor: '#F5FCFF', }, test1:{ // 子View样式 width:360, height:60, backgroundColor:'red' }, test2:{ //子View样式 width:40, height:40, backgroundColor:'blue' } }); flexbox中的样式主要有以下几类: 1. 位置及宽、高相关的样式键 2. 容器属性,决定子组件排列规则的键 3. 元素属性,决定组件显示规则的键 4. 边框、空隙与填充 位置及宽、高相关的样式键 位置主要是postion、 top 、bottom、 left、 right 几个属性 首先讨论position键。它是字符串类型,取值包括 relative(默认)或者absolute,表示当前描述的位置是相对定位还是绝对定位. top 、bottom、 left、 right 四个键是数值类型. 当position的值为absolute时,描述就指的是当前组件的位置距离父组件最上(下、左、右)有多少pt. 当position的键为relative时,不可以使用bottom和right,top和left键默认值为0.top和left表示当前组件距离上一个同级组件的最上(左)有多少pt 宽高包括: width、height、maxHeight、maxWidth、minHeight、minWidth 都是数值类型,因为使用flexbox布局,组件的款和高是可以动态改变的,所以可以设置宽和高的最大和最小值 容器属性,决定子组件排列规则的键 flexDirection: flexDirection键决定了组件内部的子组件是如何排列的, 取值可以为: row,column,类似Android中LinearLayout的orientation属性. row:横向排列,主轴为水平方向; column:竖直排列,主轴为垂直方向。 flexWrap: flexWrap字符串类型,可选wrap和nowrap(默认值) 水平或垂直布局时,如果子View放不下,则自动换行, 默认为’nowrap’(不换行) justifyContent: 设置子布局在主轴方向位置 alignItems: 定义了View组件中所有子组件的对齐规则. 有4种可能的字符串类型的值: 1. flex-start 顶部对齐 2. flex-end 底部对齐 3. center 中部对齐 4. stretch 拉长对齐 元素属性,决定组件显示规则的键 flex: 权重,类似Android中weight。 flex键的类型是数值,取值为0或者1,默认值是0,当它的值为1时,子组件将自动缩放以适应父组件剩下的空白空间. 开发者使用flex键时一定要小心,它的自动缩放意味着不仅可以改变自己的宽、高与位置,还可以通过挤压改变与它同级的其他组件的位置。 设置了flex:1的组件不是只能扩展,如果同级别固定宽高的组件在执行宽高增加了,那么设置flex:1的组件就会缩小来适应同级组件的宽和高变化. alignSelf: alignSelf键有5种可能的字符串类型值:auto、flex-start、flex-end、center、stretch.其用途是让组件忽略它的父组件样式中的alignItems的取值,而对该组件使用alignSelf键对应的规则。当它取值为auto时,表示使用父View组件的alignItems值。 边框、空隙与填充 边框borderWith, 填充 padding, 组件空隙margin, 接触过Android的同学看一眼下面的图应该就了解了。 组件多样式声明与动态样式声明 组件可以有多种样式,可以把相同的样式抽取出去,方便复用。 写法如下: style={[styles.container,styles.aStyle,styles.bStyle]} 在多种样式中,如果对某一个键有重复定义,那么后面的样式定义的键将覆盖前面的. 在UI设计中,有些组件的样式在应用运行中是需要改变的,这时我们需要直接在描述组件的JSX代码中写入需要变化的样式. 示例代码: ... <Text onPress={this.onTextPress} style={[styles.aStyle,{color:this.state.appColor1}]}> ... ... onTextPress(){ this.setState({ appColor1:'red' }) } 更多精彩请关注微信公众账号likeDev,公众账号名称:爱上Android。

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册