(1) 计算过去N个随机信号的均值和方差(N为常量,可设置);
(2) 计算所有历史数据中的最大值和最小值;
(3) 定时地将分析结果打包成一个新消息并通过MOM发布出去。
(1) 实时绘制过去一段时间内随机信号的折线图;
(2) 实时显示随机信号统计分析结果。
MOM(Message Oriented Middleware)是面向消息的中间件,使用消息提供者来协调消息传送操作。这种松耦合的通信机制有助于降低客户端和远程服务之间的依赖性。
生产者负责向分布式消息队列中发送消息,消费者从队列中取出消息。生产者不必关心消费者是谁,反之亦然,这降低了分布式节点之间的耦合度,提升了系统的通信效率。当消费者未上线或者消费者速度慢于生产者时,生产者可以将消息先缓存于消息队列中,待消费者上线后,消费者可以继续从队首取出消息,这种模式提高了系统的容错能力。
ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件,完全兼容JMS(Java Message Service),能够为多种编程语言提供客户端API。本实验主要基于ActiveMQ和JMS实现了题目相关要求。
(a) 随机信号发生微服务作为生产者,每隔100ms生成一个高斯分布随机值并且作为消息发布出去,主题名为RandGaussian。
(b) 信号分析微服务作为消费者,订阅主题名为RandGaussian的消息,每次从消息队列中取出一个随机信号加入自己维护的数组中,然后对数组中的元素进行处理,得到信号的统计分析结果(均值、方差、最小值、最大值等等)。与此同时,该分析器还作为生产者,每隔2s将先前得到的信号分析结果以空格隔开,打包成字符串形式的消息发布出去,主题名为AnalysisRes。
© 分析结果可视化微服务同样作为消费者。由于题目要求将过去一段时间的信号动态显示出来,也要求把信号分析结果显示出来,因此我让信号分析微服务在发送消息时,把当前的信号值也封装在消息中,这样可视化微服务只需要订阅主题为AnalysisRes的消息即可获取全部所需数据。在获取到所需数据后,我利用tablesaw可视化工具提供的折线图绘制功能将数据可视化到了网页页面中,一幅折线图中集成了当前信号值、过去N个数的均值以及历史最大最小值,且用不同颜色加以区分,可以达到一个比较好的视觉效果。
为了具体实现题目要求,我编写了3个.java文件,分别为Publisher.java、Analyzer.java和Visualizer.java,这3个模块分别负责实现随机信号产生器微服务、随机信号统计分析微服务和实时数据显示微服务。
Publisher.java文件中只有一个Publisher类。首先定义实例构造函数Pulisher(String topicName),通过该函数我们可以实例化一个新的、绑定名为topicName(本实验中即为RandGaussian)的主题的publisher对象并且启动与MOM的连接。其次,我定义了一个sendNum(double mu ,double sigma)函数,功能是根据用户输入的高斯分布的均值和方差产生一个符合该分布的随机数值,并利用producer.send()将该数值的字符形式当成消息发布出去。最后,还定义了一个sendAnalysis(int num, int N, double value, double mean, double var, double min, double max)函数,该函数负责将信号分析结果封装成以空格分隔的字符串消息并发布出去。在Publisher类的主方法中,首先需要用户输入高斯分布的均值和方差,然后程序循环生成随机数并发布,间隔100毫秒后发布下一条消息。
Analyzer.java文件中有两个类,第一个是public class Analyzer类,主要实现对消费者对象的初始化(绑定主题RandGaussian)、获取用户输入的N值以及设置消息监听器,最后启动与MOM的连接。另一个类是MyListener1,即消息监听类。在该类中我重写了onMessage函数,使其能够实现题目的要求:开辟一个动态数组,每隔一段时间从消息队列中取得一个随机数并加入该数组,然后利用该数组即可求出过去N个信号的均值和方差,也可以求出全局的最小值和最大值。在得到一次分析的所有结果后,只需实例化一个publisher2对象,再调用Publisher类提供的sendAnalysis方法即可将分析结果打包成字符串发布出去(主题设为AnalysisRes)。
Visualizer.java文件中有两个类,public class Visualizer类负责初始化消费者对象(订阅主题为AnalysisRes的消息)、设置监听器以及开启连接。另一个类是MyListener2,即消息监听类。在onMessage函数中,首先需要对得到的消息进行解包,这里我利用的是String.split(" ")函数对字符串进行分解,再将结果传入analysis数组中。解包之后,便可以将各类统计数据分别add到相应的动态数组中保存,便于后续的可视化操作。最后,设置一个Thread.sleep(2000),即实现每隔2s从消息队列中取一个随机信号进行分析。
在可视化模块,我采用的是tech.tablesaw工具包中的Plot.show(LinePlot)函数。由于我想在同一幅图中将若干统计结果一起绘制出来,则需要将各个统计结果的横轴数值数组、纵轴数值数组和类型名数组分别合并到3个大数组中,这导致有一部分的代码显得比较冗长。由于在Visualizer.java中设置了Thread.sleep(2000),因此在可视化模块中只需要不断地取出统计分析结果,即可实现每隔2s显示可视化结果。如果sleep时间设置得太短,则会导致瞬间产生很多统计图表,人眼看不过来,所以为了简洁,我将sleep时间设为了2s,可以起到接近实时的效果。
在Visualizer主类的命令行中,是实时显示的统计分析结果(过去N个信号的均值、方差和全局最小值最大值等):

浏览器页面在不断实时显示随机信号统计分析的可视化折线图,各种统计量的变化一目了然:

补充说明:可视化部分我采用的工具tablesaw在渲染HTML页面时调用的是https://cdn.plot.ly/plotly-latest.min.js提供的JavaScript代码,而该CDN节点有时存在不稳定的情况,可能导致页面渲染失败,但仍能从网页源代码处看到图表背后的数据,例如:

这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实