apache ignite_使用Apache Storm和Apache Ignite进行复杂事件处理(CEP)

apache ignite

在本文中, “使用Apache Ignite进行高性能内存计算”一书的作者将讨论使用Apache Strom和Apache Ignite进行复杂的事件处理。 本文的一部分摘自
书 。

术语“复杂事件处理”或CEP没有广泛或高度接受的定义。 Wikipedia的以下引用可以简要描述什么是复杂事件处理:

“复杂事件处理(CEP)主要是一个事件处理概念,用于处理多个事件,以识别事件云中有意义的事件为目标。 CEP采用的技术包括检测许多事件的复杂模式,事件相关性和抽象性,事件层次结构以及事件之间的因果关系,成员关系和时间安排以及事件驱动过程。

为简单起见,复杂事件处理(CEP)是一种用于在真实世界中永不停止或流式传输事件数据的低延迟过滤,聚合和计算的技术。 在IT环境中,原始基础结构和业务事件的数量和速度均呈指数级增长。 此外,移动设备的爆炸式增长和高速连接的普遍性加剧了移动数据的爆炸式增长。 同时,对业务流程敏捷性和执行的需求仅在增长。 这两个趋势给组织施加了压力,要求它们提高其能力以支持事件驱动的实施架构模式。 实时事件处理需要基础架构和应用程序开发环境来执行事件处理要求。 这些要求通常包括从日常使用案例扩展到极高的速度或各种数据和事件吞吐量的需求,潜在的延迟时间以微秒为单位,而不是响应时间的秒数。

Apache Ignite允许在内存中以可伸缩且容错的方式处理连续不断的数据流,而不是在数据到达数据库后对其进行分析。 这不仅使您能够关联关系并从大量数据中检测有意义的模式,还可以更快,更高效地完成此操作。 事件历史记录可以在内存中保留任何时间长度(对于长时间运行的事件序列至关重要),也可以作为事务记录在存储的数据库中。

Apache Ignite CEP可以在众多行业中使用,以下是一些一流的用例:

  1. 金融服务:执行实时风险分析,监视和报告金融交易以及欺诈检测的能力。
  2. 电信:能够执行实时呼叫详细记录以及SMS监视和DDoS攻击。
  3. IT系统和基础架构:能够实时检测故障或不可用的应用程序或服务器的能力。
  4. 物流:能够实时跟踪装运和订单处理,并报告可能的到货延迟。

还有更多的工业或功能领域,您可以在其中使用Apache Ignite处理流事件数据,例如保险,运输和公共部门。 复杂事件处理或CEP包含其过程的三个主要部分:

  1. 事件捕获或数据摄取。
  2. 计算或计算这些数据。
  3. React或行动。

第6-1章

如上图所示,数据是从不同来源获取的。 源可以是任何传感器(IoT),Web应用程序或行业应用程序。 可以直接在Ignite群集上以收集方式并发处理流数据。 另外,数据可以从其他来源丰富或过滤掉。 计算数据后,可以将计算或汇总的数据导出到其他系统以进行可视化或采取措施。

Apache Ignite Storm Streamer模块提供了通过Storm到Ignite缓存的流传输。 在开始使用Ignite流媒体之前,让我们看一下Apache Storm,以获取有关Apache Storm的一些基础知识。

Apache Storm是一个分布式容错实时计算系统。 在短时间内,Apache Storm成为分布式实时处理系统的标准,该系统使您可以处理大量数据。 Apache Storm项目是开源的,用Java和Clojure编写。 它成为实时分析的首选。 Apache Ignite Storm流媒体模块提供了一种方便的方法,可通过Storm将数据流传输到Ignite缓存。

关键概念:

Apache Storm从一端读取​​原始数据流,并将其通过一系列小型处理单元,然后在另一端输出处理后的信息。 让我们详细了解Apache Storm的主要组件–

元组 –它是Storm的主要数据结构。 这是元素的有序列表。 通常,元组支持所有基本数据类型。

第6-19章

–这是一个无界且无序的元组序列。

第6-20章

-流的来源,简单来说,壶嘴从拓扑中的源读取数据。 喷嘴可以是可靠的或不可靠的。 喷口可以与队列,Web日志,事件数据等对话。

第6-21章

螺栓 –螺栓是逻辑处理单元,它负责处理数据和创建新的流。 螺栓可以执行过滤,聚合,联接,与文件/数据库交互等操作。 螺栓从喷嘴接收数据,然后发射到一个或多个螺栓。

第6-22章

拓扑 –拓扑是“喷口和螺栓”的有向图,该图的每个节点都包含数据处理逻辑(螺栓),而连接边定义数据(流)的流。

与Hadoop不同,Storm可使拓扑永久运行直到您将其杀死。 一个简单的拓扑结构从喷口开始,从源头发射流到螺栓以处理数据。 Apache Storm的主要工作是运行拓扑,并将在给定的时间运行任意数量的拓扑。

第6-23章

开箱即用的Ignite提供了Storm Bolt(StormStreamer)的实现,以将计算的数据流式传输到Ignite缓存中。 另一方面,您可以记下自定义的Strom Bolt,以将流数据提取到Ignite中。 要开发自定义的Storm Bolt,只需实现* BaseBasicBolt *或* IRichBolt * Storm接口。 但是,如果决定使用StormStreamer,则必须配置一些属性才能正确运行Ignite Bolt。 所有必填属性如下所示:

没有 物业名称 描述
1个 快取名称 将在其中存储数据的Ignite缓存的缓存名称。
2 IgniteTupleField 命名“点燃元组”字段,通过它在拓扑中获取元组数据。 默认情况下,该值为ignite。
3 IgniteConfigFile 此属性将设置Ignite弹簧配置
文件。 允许您向和发送消息和使用消息
从点燃主题。
4 允许覆盖 它将启用覆盖缓存中的现有值,默认值为false。
5 自动刷新频率 自动刷新频率(以毫秒为单位)。 从本质上讲,这是拖缆将在
尝试将到目前为止添加的所有数据提交到远程
节点。 默认值为10秒。

掌握了基础知识之后,我们来构建一些有用的工具来检查Ignite StormStreamer的工作方式。 该应用程序的基本思想是设计喷嘴和螺栓的一种拓扑,该拓扑可以处理来自交通日志文件的大量数据,并在特定值超过预定义阈值时触发警报。 使用拓扑,可以逐行读取日志文件,并且该拓扑旨在监视传入的数据。 在我们的例子中,日志文件将包含数据,例如车辆注册号,速度和来自高速公路交通摄像头的高速公路名称。 如果车辆超过速度限制(例如120km / h),Storm拓扑会将数据发送到Ignite缓存。

接下来的清单将显示我们将在示例中使用的CSV文件类型,其中包含车辆数据信息,例如车辆注册号,车辆行驶的速度和高速公路的位置。

AB 123, 160, North city
BC 123, 170, South city
CD 234, 40, South city
DE 123, 40, East city
EF 123, 190, South city
GH 123, 150, West city
XY 123, 110, North city
GF 123, 100, South city
PO 234, 140, South city
XX 123, 110, East city
YY 123, 120, South city
ZQ 123, 100, West city

以上示例的思想取自Dobbs博士的期刊。 由于本书不是为了研究Apache Storm,因此我将使示例尽可能简单。 另外,我还添加了著名的Storm单词计数示例,该示例通过StormStreamer模块将单词计数值提取到Ignite缓存中。 如果您对代码感到好奇,可以通过以下网址获得
Chapter-cep / storm 。 上面的CSV文件将成为Storm拓扑的来源。

第6-24章

如上图所示, FileSourceSpout接受输入的CSV日志文件,逐行读取数据,并将数据发送到SpeedLimitBolt以进行进一步的阈值处理。 处理完成后,如果发现有任何超过速度限制的汽车,则将数据发送到Ignite StormStreamer螺栓,然后将其提取到缓存中。 让我们深入了解Storm拓扑。

第1步:

因为这是一个Storm拓扑,所以必须在maven项目中添加Storm和Ignite StormStreamer依赖项。

<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-storm</artifactId><version>1.6.0</version>
</dependency>
<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-core</artifactId><version>1.6.0</version>
</dependency>
<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-spring</artifactId><version>1.6.0</version>
</dependency>
<dependency><groupId>org.apache.storm</groupId><artifactId>storm-core</artifactId><version>0.10.0</version><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId></exclusion><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions>
</dependency>

在撰写本书时,仅支持Apache Storm版本0.10.0。 请注意,按照Ignite文档中的描述,您不需要任何Kafka模块即可运行或执行此示例。

第2步:

创建的Ignite配置文件(见例如,ignite.xml文件/chapter-cep/storm/src/resources/example-ignite.xml ),并确保它是可以从类路径。 Ignite配置的内容与本章的上一部分相同。

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd"><bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"><!-- Enable client mode. --><property name="clientMode" value="true"/><!-- Cache accessed from IgniteSink. --><property name="cacheConfiguration"><list><!-- Partitioned cache example configuration with configurations adjusted to server nodes'. --><bean class="org.apache.ignite.configuration.CacheConfiguration"><property name="atomicityMode" value="ATOMIC"/><property name="name" value="testCache"/></bean></list></property><!-- Enable cache events. --><property name="includeEventTypes"><list><!-- Cache events (only EVT_CACHE_OBJECT_PUT for tests). --><util:constant static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_PUT"/></list></property><!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. --><property name="discoverySpi"><bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"><property name="ipFinder"><bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"><property name="addresses"><list><value>127.0.0.1:47500</value></list></property></bean></property></bean></property></bean>
</beans>

第三步:

创建一个ignite-storm.properties文件,以添加缓存名称,元组名称和Ignite配置的名称,如下所示。

cache.name=testCache
tuple.name=ignite
ignite.spring.xml=example-ignite.xml

第4步:

接下来,创建FileSourceSpout Java类,如下所示,

public class FileSourceSpout extends BaseRichSpout {private static final Logger LOGGER = LogManager.getLogger(FileSourceSpout.class);private SpoutOutputCollector outputCollector;@Overridepublic void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {this.outputCollector = spoutOutputCollector;}
@Overridepublic void nextTuple() {try {Path filePath = Paths.get(this.getClass().getClassLoader().getResource("source.csv").toURI());try(Stream<String> lines = Files.lines(filePath)){lines.forEach(line ->{outputCollector.emit(new Values(line));});} catch(IOException e){LOGGER.error(e.getMessage());}} catch (URISyntaxException e) {LOGGER.error(e.getMessage());}}@Overridepublic void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {outputFieldsDeclarer.declare(new Fields("trafficLog"));}
}

FileSourceSpout代码具有三种重要方法

  • open():此方法将在spout的开头被调用,并为您提供上下文信息。
  • nextTuple():此方法将允许您一次将一个元组传递给Storm拓扑以进行处理,在这种方法中,我逐行读取CSV文件,并将该行作为元组发出给螺栓。
  • defineOutputFields():此方法声明输出元组的名称,在本例中,名称应为trafficLog。

步骤5:

现在创建实现BaseBasicBolt接口的SpeedLimitBolt.java类。

public class SpeedLimitBolt extends BaseBasicBolt {private static final String IGNITE_FIELD = "ignite";private static final int SPEED_THRESHOLD = 120;private static final Logger LOGGER = LogManager.getLogger(SpeedLimitBolt.class);@Overridepublic void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {String line = (String)tuple.getValue(0);if(!line.isEmpty()){String[] elements = line.split(",");// we are interested in speed and the car registration numberint speed = Integer.valueOf((elements[1]).trim());String car = elements[0];if(speed > SPEED_THRESHOLD){TreeMap<String, Integer> carValue = new TreeMap<String, Integer>();carValue.put(car, speed);basicOutputCollector.emit(new Values(carValue));LOGGER.info("Speed violation found:"+ car + " speed:" + speed);}}}@Overridepublic void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {outputFieldsDeclarer.declare(new Fields(IGNITE_FIELD));}
}

让我们再次逐行进行。

  • execute():这是实现螺栓的业务逻辑的方法,在这种情况下,我用逗号分隔行并检查汽车的速度限制。 如果给定汽车的速度限制高于阈值,则我们将从该元组创建新的树图数据类型,并将该元组发送到下一个螺栓,在本例中,下一个螺栓将是StormStreamer。
  • defineOutputFields():此方法类似于FileSourceSpout中的clarifyOutputFields()方法,它声明将返回Ignite元组以进行进一步处理。

请注意,元组名称IGNITE在这里很重要, StormStreamer将仅处理名称为Ignite的元组。

步骤6:

现在是时候创建我们的拓扑来运行我们的示例了。 拓扑将喷口和螺栓绑在一张图中,该图定义了数据如何在组件之间流动。 它还提供了Storm在创建集群中组件实例时使用的并行提示。 要实现拓扑,请在src \ main \ java \ com \ blu \ imdg \ storm \ topology目录中创建一个名为SpeedViolationTopology.java的新文件。 使用以下内容作为文件的内容:

public class SpeedViolationTopology {private static final int STORM_EXECUTORS = 2;public static void main(String[] args) throws Exception {if (getProperties() == null || getProperties().isEmpty()) {System.out.println("Property file <ignite-storm.property> is not found or empty");return;}// Ignite Stream Iboltfinal StormStreamer<String, String> stormStreamer = new StormStreamer<>();stormStreamer.setAutoFlushFrequency(10L);stormStreamer.setAllowOverwrite(true);stormStreamer.setCacheName(getProperties().getProperty("cache.name"));stormStreamer.setIgniteTupleField(getProperties().getProperty("tuple.name"));stormStreamer.setIgniteConfigFile(getProperties().getProperty("ignite.spring.xml"));TopologyBuilder builder = new TopologyBuilder();builder.setSpout("spout", new FileSourceSpout(), 1);builder.setBolt("limit", new SpeedLimitBolt(), 1).fieldsGrouping("spout", new Fields("trafficLog"));// set ignite boltbuilder.setBolt("ignite-bolt", stormStreamer, STORM_EXECUTORS).shuffleGrouping("limit");Config conf = new Config();conf.setDebug(false);conf.setMaxTaskParallelism(1);LocalCluster cluster = new LocalCluster();cluster.submitTopology("speed-violation", conf, builder.createTopology());Thread.sleep(10000);cluster.shutdown();}private static Properties getProperties() {Properties properties = new Properties();InputStream ins = SpeedViolationTopology.class.getClassLoader().getResourceAsStream("ignite-storm.properties");try {properties.load(ins);} catch (IOException e) {e.printStackTrace();properties = null;}return properties;}
}

让我们再次逐行进行。 首先,我们阅读ignite-strom.properties文件以获取所有必要的参数,然后再配置StormStreamer螺栓。 风暴拓扑基本上是一个Thrift结构。 TopologyBuilder类提供了一种简单而优雅的方法来构建复杂的Storm拓扑。 TopologyBuilder类具有setSpout和setBolt的方法。 接下来,我们使用“拓扑”构建器构建Storm拓扑,并添加了带有名称spout和1执行程序的并行提示的spout。

我们还将SpeedLimitBolt定义为具有1个执行程序的并行提示的拓扑。 接下来,我们使用shufflegrouping设置StormStreamer螺栓, shufflegrouping订阅该螺栓,并在StormStreamer螺栓的各个实例之间平均分配元组(限制)。

出于开发目的,我们使用LocalCluster实例创建本地集群,并使用SubmitTopology方法提交拓扑。 将拓扑提交到集群后,我们将等待10秒钟,等待集群计算提交的拓扑,然后使用LocalCluster的 shutdown方法关闭集群。

步骤7:

接下来,首先运行Apache Ignite或集群的本地节点。 构建maven项目后,使用以下命令在本地运行拓扑。

mvn compile exec:java -Dstorm.topology=com.blu.imdg.storm.topology.SpeedViolationTopology

该应用程序将产生很多系统日志,如下所示。

第6-25章

现在,如果我们通过ignitevisior验证了Ignite缓存,我们应该将以下输出输出到控制台中。

第6-26章

输出显示结果,这是我们期望的。 从我们的source.csv日志文件中,只有五辆车超过了120 km / h的速度限制。

这几乎是对Ignite Storm Streamer的实用概述的总结。 如果您对Ignite Camel或Ignite Flume Streamer感到好奇,请参阅“使用Apache Ignite进行高性能内存计算”一书 。 您也可以与作者联系以获取该书的免费副本,该书可以免费分发给学生和教师。

翻译自: https://www.javacodegeeks.com/2016/10/complex-event-processing-cep-apache-storm-apache-ignite.html

apache ignite

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tpm php,TPM系列

近来一直在整理资料&#xff0c;刚好看到有比较详细的介绍&#xff0c;就发扬一下“拿来主义”吧&#xff1a;)顺便鄙视一下某安全网站转载我的博客很乱&#xff1a;(1、安装环境准备1.1内核Linux内核2.6.12版本及以上&#xff0c;提供了对tpm芯片的支持&#xff0c;下载地址&a…

zookeeper 日志查看_每天使用的注册中心zookeeper,流量暴涨怎么办?

通过本文能学习什么&#xff1f;初步了解zookeeper监控如何运用tcpdump Wireshark抓包分析Dubbo在zookeeper上节点设计如何查看zookeeper节点快照背景zookeeper作为dubbo的注册中心&#xff0c;承载着服务的基础信息(方法名&#xff0c;分组&#xff0c;版本等)&#xff0c;服…

javaone_JavaOne 2016 Essentials:您不应该错过的7个事件和会话

javaone参加JavaOne吗&#xff1f; 确保您不会错过这些活动 又到了每年的这个时候。 旧金山一年一度的Java假期即将来临&#xff0c;全市各地举行了超过400场会议和活动。 随着所有这些丰富的内容和新体验同时发生&#xff0c;很容易就无法跟踪正在发生的事情。 在这篇文章中…

python比较两张图片是否一样_opencv_判断两张图片是否相同

python金融风控评分卡模型和数据分析微专业课&#xff08;博主亲自录制视频&#xff09;&#xff1a;http://dwz.date/b9vv本文为原创,转载请注明&#xff0c;作者 231469242qq.com OpenCV介绍 OpenCV是一个基于BSD许可&#xff08;开源&#xff09;发行的跨平台计算机视觉库&a…

bat 存储过程返回值_为什么不推荐使用存储过程?

之所以有这个题目&#xff0c;我既不是故意吸引眼球&#xff0c;也不想在本文对存储过程进行教科书般论述。最近项目中遇到的存储过程问题&#xff0c;让我想起了去年在武汉出差时一位同事的发问&#xff1a;我觉得存储过程挺好用的&#xff0c;为什么你不建议用&#xff1f;当…

Mac下载JDK/安装JDK/卸载JDK

文章目录下载JDK安装JDK配置环境变量卸载JDK下载JDK 访问这个地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java18 进入下载JDK的界面后&#xff0c;下拉界面到下图所示的位置&#xff1a; 或者访问这个地址&#xff1a;https://www.oracle.com/cn/…

kettle 只有一个输入记录期待设置变量并且至少已经收到2个变量._OPNET学习笔记2...

双击主机网络打开对应的节点模型&#xff0c;从图中可以看到网络的分层&#xff1a;应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;链路层&#xff1b;其中在传输层中我们用到的主要是UDP&#xff08;对实时性要求比较高&#xff09;&#xff0c;网络层又包括IP封装层…

python tkinter控件_Python3 tkinter基础 Label pack 设置控件在窗体中的位置

? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdown ? 普通布局 code """ Author : 行初心 Date : 18-10-1 Blog : www.cnblogs.com/xingchuxin GitHub : github.com/GratefulHeartCoder ""…

oracle的mins,分钟的英文缩写,10min还是10mins!

请问,分钟的英文缩写是min,小时的英文缩写是h,还是hr?秒的..._知乎[图文]时间分钟的英文缩写是什么minutes 10 minutes意思是十分钟的&#xff0c;比如说路程 10minutes就是十分钟 没有10minutes这种表达[图文]分钟 min【minute】 超过多少分钟就用介词past表示超过 还差几分钟…

postman测试工具,如何对参数使用md5加密

先创建环境变量password&#xff0c;并定义了变量值&#xff08;例如&#xff1a;123456&#xff09;访问登录接口通常是post提交登录用户名称和登录密码&#xff0c;且以json格式提交&#xff0c;所以在body-raw-json&#xff0c;填写json串如下图所示&#xff1a; 接着在pre-…

开源java性能分析工具_Java性能监控:您应该知道的5个开源工具

开源java性能分析工具鲜为人知但有用&#xff1a;开源应用程序性能监视的状态 对于任何应用程序来说&#xff0c;最重要的事情之一就是性能。 我们要确保用户获得他们能获得的最佳体验&#xff0c;并想知道我们的应用已启动并正在运行。 这就是为什么我们大多数人至少使用一种…

cmd编译可以通过执行没有结果_Go语言是如何完成编译的

Go语言是一门需要编译才能运行的编程语言&#xff0c;也就说代码在运行之前需要通过编译器生成二进制机器码&#xff0c;随后二进制文件才能在目标机器上运行&#xff0c;如果我们想要了解Go语言的实现原理&#xff0c;理解它的编译过程就是一个没有办法绕过的事情。预备知识想…

如何通过postman测试需要登录授权的接口

思路 请求需要登录授权的接口&#xff0c;就意味着你要传token给接口&#xff0c;所以请求接口&#xff08;要测试的接口&#xff09;之前就要先获取token&#xff0c;因为登录成功后服务端才会返回token&#xff0c;而token又设置了时效&#xff0c;所以每次请求接口&#xf…

wordpress linux 目录,快速搭建WordPress(Linux)

作者&#xff1a;彭济环境要求一、配置LAMP(LinuxApacheMysqlPHP)1、安装apachesudo apt-get install apache2 //安装apache2apache2 -v //查看版本网页访问本机ip地址&#xff0c;查看是否安装成功2、安装phpsudo apt-get install php //安装phpphp -v //查看版本sudo apt-get…

atheros蓝牙设备驱动 小米_小米Air 13笔记本黑苹果WiFi蓝牙硬件改装方案二

该方案适合小米笔记本Air 13初代&#xff0c;适合小米笔记本PRO等型号&#xff0c;适合通用的预留有M.2 PCIE通道SSD卡槽的电脑。也是作者极力推荐的终极改造方案。总体方案: 使用笔记本主板上的M.2 nvme通道 SSD硬盘接口进行拓展。使用BCM943602CS专用的M.2[NGFF]转接卡进行改…

python实现局域网攻击_通过python实现DNS欺骗

假设在一个的局域网内有两个人&#xff1a;Bob和Eve。Eve想让Bob访问他创建的恶意网页&#xff0c;这样她就可以通过隐藏性的下载给Bob的计算机上安装恶意软件&#xff0c;或者可能展示一个欺骗性的站点来试图窃取Bob的认证信息。&#xff08;图片来自以上提供的链接&#xff0…

背景区域为负样本什么意思_词向量-skipgram与负采样

大纲&#xff1a;1. onehot vs 分布式表示2. 分布式表示的全局泛化能力3. how to learn word2vec - intuition4. SkipGram5. SkipGram Negative Sampling6. 评估词向量7. CBOW与SkipGram对比1. onehot vs 分布式表示Onehot表示:V (apple, going, I, home, machine ,learing)ap…

嵌入式linux应用程序实例,嵌入式Linux应用程序访问物理地址的实例

前言  按照Linux分层驱动思想&#xff0c;外设驱动与主机控制器的驱动不相关&#xff0c;主机控制器的驱动不关心外设&#xff0c;而外设驱动也不关心主机&#xff0c;外设访问核心层的通用应用程序接口进行数据传输&#xff0c;主机和外设之间可以进行任意的组合。这样思想要…

线程同步 线程安全_同步装饰器来替换线程安全类

线程同步 线程安全您知道什么是线程安全吗&#xff1f; 如果没有&#xff0c;下面是一个简单的示例。 所有类都必须是线程安全的&#xff0c;对吗&#xff1f; 并不是的。 其中一些必须是线程安全的&#xff1f; 又错了。 我认为它们都不必是线程安全的&#xff0c;而它们都必须…

forge开发_使用Forge,WildFly Swarm和Arquillian开发微服务

forge开发在这篇文章中&#xff0c;我们将看到如何使用WildFly Swarm和Forge开发微服务&#xff0c;以及如何使用Arquillian和Rest Assured对其进行测试。 WildFly Swarm提供了一种创新的方法来打包和运行Java EE应用程序&#xff0c;方法是将它们与足够的服务器运行时一起打包…