1.工具软件
1.1 过孔向导工具:Via Wizard3.1
1.2 ANSYS软件版本:2022 R1
2. 叠层信息
说明:
2.1 此叠层是一个实际PCB设计项目的叠层
2.2 叠层中DK值,是板厂根据自己的工艺及经验得到的值,跟板材的Datasheet是对不上的,个人认为在有板厂提供的叠层时,使用板厂的
2.3 DF是根据Datasheet中得出,或者是随意填上去的,这里单针对过孔仿真来说,个人认为这不是重要的,仿真过孔主要是评估其阻抗,
如果需要提取S参数,进行链路仿真,DF还是要根据实际值填入 3. 使用ViaWizard向导工具,填入参数
3.1 设置叠层"Stackup"
3.2 设置过孔焊盘参数
3.3 设置过孔位置
3.4 设置Options选项卡中的参数
4. 确认求解类型为"Terminal"
5. 修正差分线的空气间距
6. 以仿真Stub的影响为例,设置差分信号过孔背钻变量。可以根据需要仿真反焊盘、回流地孔位置、差分过孔间距的影响,设置参考如下
7. 建立差分对
8. 设置扫描参数
9.验证检查是否通过
10. 点击开始仿真
11. 参看仿真结果,参数根据需要填入
12. 增加Mark点,以便更好的观察
总结:
1. 过孔向导工具中的参数一定要正确,其直接影响后面的仿真结果
2. 进入HFSS后,一定要修改差分线对内的空隙间距
3. 如果要进行变量参数扫描,在其值一栏最好都用变量,否则结果中多条曲线,完全重叠在一起,这是不对的
4. 如果出现仿真结果不对,参数又设置都是正常时,可尝试将软件重新打开试试
5. 为了更为准确,可根据实际情况对过孔的介质填充进行选择
前言
车牌识别的目的是交通牌照识别系统,用于交通违法拍照,停车缴费等交通应用场景,车牌识别的流程可分为车牌定位和字符识别两个部分,传统的车牌定位算法常采用二值化分割加上边缘提取,然后进行目标晒选,常采用连线法和车牌宽高比确定真实车牌,定位到车牌位置后再进行OCR字符分割,为了高精度的车牌定位和字符识别,目前引入了深度学习算法进行精准识别和处理。但是,本文所要讲述的是一种基于stm32单片机的车牌识别实现,使用上述高级算法和复杂计算是不现实的,因此,总结出一套可行的,能简单进行车牌定位和字符分割识别的算法,供大家参考和学习。
1.车牌识别基本原理
本文讲述的是基于stm32单片机的车牌识别原理,包括车牌图像定位,字符分割,字符归一化处理,以及模板匹配等操作,当然如果芯片处理性能足够还可以加入旋转矫正,多车牌处理等,本文尽量采用最简单易懂的方法进行图像分割处理,同时加快处理速度。
首先,讲一讲网络上大部分stm32F103车牌识别的硬件和软件实现,硬件采用的是stm32f103rct6+OV7670&FIFO+16bit并口LCD屏;72M主频,不支持浮点运算等操作;
软件实现过程大致如下:
(1)OV7670带FIFO摄像头图像采集,采用GPIO模拟摄像头时序,通过读取FIFO输出值将图像直接显示在LCD屏上
(2)LCD屏相当于一个图像缓存,同时也做显示,通过读取LCD屏上的像素值进行图像处理;
(3)车牌定位处理,车牌定位常用二值化分割,腐蚀膨胀处理,连通域计算等操作,显然这些算法在stm32f1上实现是很困难的,且处理速度太慢,因此,采用RGB转HSV颜色空间变换和阈值选择进行车牌定位,然后将车牌定位区域进行二值化处理,不是蓝色车牌的部分就是字符区域;
(4)车牌字符分割处理,字符分割先采用行统计加列统计的方式,确定每行和每列的有效像素和,进一步确定字符区域;然后进行横向统计分割,通过每一列的像素和阈值判断字符的分界线和个数;
(5)车牌归一化处理,归一化处理先将每个字符提取出来,然后按照像素值进行横向和纵向压缩,最终处理成模板一样大小的字符;并在液晶屏上保存字符的数据;
(6)模板匹配,将归一化之后的字符,与模板中的字符通过像素值一一比较,确定相似度最高的字符就是目标值;
上述方法简单有效,但是对于图像模糊,杂色较多以及光照条件不同的情况下,识别效果会很差。
2.基于stm32的车牌识别算法
2.1基本硬件
硬件采用stm32f407vet6(168M主频,192KB RAM)+OV7670无fifo+SPI-LCD(采用F407及以上具有DCMI数字摄像头接口的主芯片);处理速度和内存都比F103强太多,因此不用采用读取像素值的方式,甚至不用液晶屏显示也能进行识别处理。
2.2识别算法流程
将车牌识别分为四个步骤,分别是双HSV颜色阈值定位,车牌旋转矫正,字符分割和提取,以及最终的车牌字符识别,全部采用的是传统图像处理算法,适合单片机运行。
(1)基于双阈值HSV颜色空间的车牌定位
首先,我们的车牌区域是具有双阈值特性的,蓝牌车具有蓝底白字的特性,绿牌车具有绿底黑字的特性,这种特性使得基于颜色空间进行定位分割是非常方便的(虽然受环境光照影响可能阈值不太准确,但是这种方法是最简单且有效的),通过颜色阈值分割之后,再根据车牌长宽比进行真实车牌目标的定位。
(2)基于霍夫变换的车牌矫正
对于定位之后的车牌,再进行二值化处理和边界计算,可以得到车牌的边界线,根据霍夫变换寻找车牌边界上的最长线段,计算线段的偏转角度进行车牌旋转矫正,矫正之后的车牌区域再进行字符分割,能增加准确率。通过矫正之后,建议先将车牌图像进行归一化处理,即,将车牌区域进行剪裁和缩放到固定大小,便于后续处理。
(3)字符分割和提取
首先对二值化的车牌进行滤波处理,去除一些杂质,然后根据线段分割法,计算车牌水平和垂直方向投影的像素线段长度,可以分割出每个字符所在的区域,但是由于车牌的边缘固定件,车牌污渍的影响,此时需要做非字符区域去除,首先去除车牌固定件影响的区域,通过水平投影线计算车牌的上下界限,将车牌外部的边缘排除出去,然后进行局部边缘滤波,去除污渍,最后车牌部分分割,并提取出来进行下一步处理;
常用简单滤波方法有,中值滤波,局部均方差滤波,高斯滤波,盒子滤波,拉普拉斯边缘增强等等,边缘提取算法有sobel算子,pewrit算子,canny算子等,可在车牌字符区域处理过程中综合运用
(4)字符识别
将车牌部分字符提取出来后,先将字符做归一化处理,采用图像缩放算法进行字符大小调整到统一尺寸,然后做字符指纹图转换(将8bit转换成1bit,便于字符指纹比对),最后采用模板匹配算法计算目标字符与模板的相似度,这里可以采用逐一像素比对法,也可以采用余弦距离计算,最后将相似度最高的模板做标记,车牌的全部字符处理完成可得到最终的结果。
2.3 图像处理算法
以下讲述几种可用于车牌图像处理的算法,其中LAB颜色阈值处理可比HSV颜色阈值精准度更好一些,可做参考
(1)RGB转LAB颜色空间
直接查表法最快最简单,这里直接引用openmv中的算法,具体可以在openmv 的github上查看。
#define COLOR_RGB565_TO_R8(pixel) \ ({ \ __typeof__ (pixel) __pixel = (pixel); \ __pixel = (__pixel >> 8) & 0xF8; \ __pixel | (__pixel >> 5); \ }) #define COLOR_RGB565_TO_G8(pixel) \ ({ \ __typeof__ (pixel) __pixel = (pixel); \ __pixel = (__pixel >> 3) & 0xFC; \ __pixel | (__pixel >> 6); \ }) #define COLOR_RGB565_TO_B8(pixel) \ ({ \ __typeof__ (pixel) __pixel = (pixel); \ __pixel = (__pixel << 3) & 0xF8; \ __pixel | (__pixel >> 5); \ }) int8_t imlib_rgb565_to_l(uint16_t pixel) { float r_lin = xyz_table[COLOR_RGB565_TO_R8(pixel)]; float g_lin = xyz_table[COLOR_RGB565_TO_G8(pixel)]; float b_lin = xyz_table[COLOR_RGB565_TO_B8(pixel)]; float y = ((r_lin * 0.
以太网 Author:onceday date:2022年7月20日
1.引言 局域网是一种使用广播信道的数据链路层网络,以太网是其最典型的代表。
具有以下特点:
具有广播功能便于系统的扩展和逐渐演变提高了系统的可靠性、可用性。生存性。 以太网是一种共享介质的局域网技术,多个站点链接到同一个共享介质上,同一时间只能有一个站点发送数据,这种链路连接着多个终端,就是多路访问。
冲突域是连接到同一个导线的所有节点的集合:所有的节点都共享带宽,就会发生冲突,且一个节点发出的报文(无论是单播、组播、广播)其余节点都可以收到。
广播域:网络中能接收任一设备发出的广播帧的所有设备的集合。简单的说如果站点发出一个广播信号,所有能接收收到这个信号的设备范围称为一个广播域。传统的二层交换机所有端口都属于一个广播域。
以太网包含以下三种帧:
单播帧(unicast),一对一,收到帧的MAC地址与本站硬件地址相同。广播帧(broadcast),一对全体,发送给本局域网上所有站点的帧,地址全1。多播帧(multicast),一对多,发送给本局域网上一部分站点的帧。 以太网适配器借助集线器进行组网,有以下三种形式:
星形网,集线器在中间,其它设备都连上。环形网,设备连在一个圆上。总线网,所有设备连在一个线上,总线两端匹配电阻可吸收能量。 集线器工作在物理层,只是简单的转发比特,不进行碰撞检测。
以太网需要考虑如何共享信道,有以下两种大类:
静态划分信道,如FDMA、CDMA、TDMA。动态媒体接入控制,如随机接入和受控接入。 随机接入包含MA、CSMA、CSMA/CD、CSMA/CA。
受控接入包含预约、轮询、令牌传递。
信道划分协议代价高昂,不适合局域网使用。
轮询协议中要求其中一个结点为主节点,然后以循环的方式遍历整个网络,优点是提高了效率,缺点是引入了轮询时延,且主节点一旦故障,网络将失去瘫痪。
令牌传递协议,协议中没有主节点,一个令牌的特殊帧在节点之间以某种固定的次序进行交换。
随机接入协议,每个节点能以信道的全部速率进行发送,当碰撞时 ,每个节点反复的重发它的帧,直到改帧通过为止。最常用的有ALOHA协议(检测到冲突不会停止发送)和载波监听多点接入(CSMA)协议。
以太网使用的是CSMA/CD协议,但新的以太网由于引入了以太网交换机,已经不共享信道了,也就不要碰撞检测了。
2.以太网的标准 1982年的DIX Ethernet V2是第一个正式以太网标准。第一个是1983年IEEE 802委员会定义的IEEE 802.3标准。两者的帧有些许不同,但大致算兼容。
IEEE 802委员会曾把局域网的数据链路层拆分成逻辑链路控制LLC子层和媒体接入控制MAC子层。
但LLC子层逐渐已经被废弃了。对于这种结构,物理层的内容都放在MAC子层了,即MAC子层以下对LLC子层是完全透明的。
3.CSMA/CD 协议 最早的以太网把所有的站点连到一根总线上:
采用无连接的模式,不对帧编号,也不用确认。提供尽最大服务的交付,如果收到校验错误帧,就直接丢弃帧。同一时间只允许一台计算机发送数据。 以太网使用曼彻斯特编码,因而无需提供长度信息。
协议全称:载波监听多点接入/碰撞检测。
多点接入,说明这是总线型网络。载波监听,不停检测信道是否空闲。碰撞检测,边发送边监听,如果信号电压服务超过了门限值,可以认为总线上至少有两个站在发送数据。 电磁波在总线上以有限的速率传播,在1km电缆的传播时延约为5us。
将总线上单程端到端传播时延即为e。
那么A站点至少需要2e的时间知道自己数据与B站点发送的数据有无冲突。即A数据到达B站点时,B站点也发出了数据,然后到达A站点。
实际情况时,要按最坏的情况考虑 ,即最远的两个端点。
CSMA/CD协议不支持同时发送和接收,所以工作在双向交替通信(半双工通信)。
在A站点发送数据的到B站点前,即0-e时间内:
B站可能发送数据,因为它检测到信道空闲。检测到A站数据后,B站停止发送数据。最迟2e时,A站知道B站也发了数据,此时已发送的数据无效。2e后,A站未检测到碰撞,则数据可以放心发送。 因此,0-2e这段时间也叫争用期(碰撞窗口)。
当检测到碰撞时,使用截断二进制指数退避算法确定重发时机:
规定基本争用期为2e。从离散集合[0,(2^k-1)]中随机选出一个整数,记录为r,重传推后的时间就是r*e。当重传次数不超过10次时,k=重传次数。超过10次重传,k=10。当重传到达16次时,还不能成功,就丢弃该帧,并向高层报告。 如果帧很短,发送时间小于2e,那么很有可能在发送完成后,发生碰撞,但又无法检测到,那么该帧就丢失了。
因此,以太网规定了一个最短帧长64字节。
对于10 Mbit/s以太网,发送512 bit需要51.2us,所以争用期可以固定为51.2us:
检测到碰撞就会停止发送,因此小于64字节的帧都是异常中止的无效帧,应丢弃。e=51.2/2=25.6us,则以太网端到端长度最大约为25.6us/5us*1km=5km。 因此,实用的以太网都能在争用期51.2us内检测到可能发生的碰撞。
此外还有强化碰撞信号,让其他用户能知道现在已经发生了碰撞。
一般发送32比特或48比特的人为干扰信号。
接收成功之后,还需等待一个帧间最小间隔9.6us(96bit),使刚接收到数据帧的站点的接收缓存来得及清理。
当总线式以太网的利用率达到30%时,就已经处于重载情况了,此时很多网络容量被碰撞消耗掉了。
CSMA/CD发送数据帧流程图:
4.以太网的MAC地址 OUI: Organizationally unique identifier,代表网络硬件制造商编号,他由IEEE统一分配
目录
静态广播
1.首先在这边创建广播接收器
2.在AndroidManifest.xml中写入静态接收名
3.在主方法把广播发送给静态广播接收者
4.在广播接收器里面接收广播
动态广播:
1.创建广播继承BroadcastReceiver
2.在主方法注册动态广播
3.发送给动态广播
4.反注册
BroadCast Receiver是四大组件之一,是一个全局的监听器
BroadCast Receiver有两大功能,广播发送者,广播接收者
BroadCast Receiver分为静态广播和动态动态广播
静态广播 1.首先在这边创建广播接收器 2.在AndroidManifest.xml中写入静态接收名 <receiver android:name=".MyStaiticReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="wzk" /> </intent-filter> </receiver> 3.在主方法把广播发送给静态广播接收者 btn_sendstatic=findViewById(R.id.btn_sendstatic); btn_sendstatic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //发送广播给静态广播接收者 Intent intent=new Intent(); //在Android8.0以上就不支持静态广播了,需要加一个这个 intent.setPackage(getPackageName()); intent.setAction("wzk"); intent.putExtra("info","你好"); sendBroadcast(intent); } }); btn_sendstatic=findViewById(R.id.btn_sendstatic); btn_sendstatic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //发送广播给静态广播接收者 Intent intent=new Intent(); intent.setPackage(getPackageName()); intent.setAction("wzk"); intent.putExtra("info","你好"); sendBroadcast(intent); } }); 4.
文章目录 1. 概述2. CWRU数据集简介2.1. 试验设施简介2.2. 试验数据简介 3. 轴承数据初步探索4. 轴承的故障特征频率探索 1. 概述 在完成了振动信号处理的基础篇与高级篇后,不少读者建议采用真实数据对各类振动信号算法进行剖析。经过几个月的搜集与积累,笔者决定从公开的凯斯西储大学(CWRU)轴承数据入手,以新南威尔士大学Robert B. Randall教授数十年多篇论文为切入点,继续与大家探索隐藏在振动信号中的奥秘。
本系列第一篇文章,是对CWRU数据集进行一个简介,同时为大家提供了相关数据的下载地址和数据初识。
2. CWRU数据集简介 基于振动信号的滚动轴承故障诊断经过多年的发展,已经成为一个较为成熟的领域,但目前相关研究人员仍在不断开发新的故障诊断算法,提升相关技术。而对于新的故障诊断算法,若没有公认的基准,很难合理有效地评估其性能。在过去的十年中,来自凯斯西储大学(CWRU)轴承数据中心的数据已经成为测试这些算法的参考标准。数据下载地址
2.1. 试验设施简介 凯斯西储大学(CWRU)轴承数据中心试验台的基本布局如图2.1所示。它由2马力伺服电机直驱,驱动轴尾部安装了测功仪,用于模拟负载。同时在驱动轴上还安装了扭矩测量装置(扭矩传感器与编码器),可将采集到的扭矩信息反馈给控制系统,从而调整测功仪的功率,进而控制负载。
图2.1 实验设施示意图 2.2. 试验数据简介 在测试中,使用电火花加工(EDM),在电机的驱动端和风扇端轴承(SKF深沟球轴承:6205-2RS JEM和6203-2RS JEM)上植入直径为0.007 - 0.028英寸(0.18 - 0.71 mm)的故障,故障分别被设置在滚动体、内圈和外圈上。每种故障轴承均被以同样的状态安装在试验台上,然后在0到3马力的电机负载下(大约电机转速为1797到1720 rpm)以恒速运行。
在每次测试中,测量驱动端轴承壳体(DE)垂直方向上的加速度,在一些测试中也测量风扇端轴承壳体(FE)和电机支撑底板(BA)垂直方向上的加速度。某些测试使用的采样率为12 kHz,其他测试使用的采样率为48 kHz。通过测试共计获得161组数据,各数据对应的具体工况如下图所示:
图2.2 数据集简介 3. 轴承数据初步探索 提取125DE数据,结果如图3.1(相关代码如下),信号时域部分较为平稳(信号峰度为3.04),但其频谱图中存在较多特征线谱,特别是在11-14 kHz波段。
图3.1 125DE信号 from scipy.io import loadmat import numpy as np from scipy import signal, fftpack, stats import matplotlib.pyplot as plt # 从.mat文件中解析数据 def get_data(source, fs): for i, key in enumerate(source.
(二)vsftpd服务配置多用户多目录权限 1,安装vsftpd服务 # 关闭SELINUX sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config && setenforce 0 # 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld # 时间同步 ntpdate 0.asia.pool.ntp.org # 安装服务 yum install vsftpd -y #此目录是配置文件目录 cd /etc/vsftpd/ && ls # 启动 systemctl start vsftpd # 开机自启 systemctl enable vsftpd 2,场景化 搭建应用部FTP服务器,要求: 每位员工拥有独立根目录在自己目录下可见应用部公共目录publish(只读)、其他部门共享目录share(读写)在自己目录下有独立的日志(工作日报)目录,可写、可删除权限,但目录本身员工不可删除禁锢虚拟用户的主目录,同时禁止访问除主目录之外的目录开启日志,记录登录、上传、下载、删除信息 目录规划 应用部共享目录:/home/vsftpuser/share(任何用户可删除可上传可下载)
应用部公共目录:/home/vsftpuser/publish (任何用户可下载,特殊用户可上传下载删除)
员工个人独立目录:/home/vsftpuser/app/{xxx} (只能当前用户才能上传下载删除)
mkdir -p /home/vsftpuser/publish mkdir -p /home/vsftpuser/share mkdir -p /home/vsftpuser/app/zhangsan mkdir -p /home/vsftpuser/app/lisi 调整 vsftpd.conf 配置 vim /etc/vsftpd/vsftpd.
一、 Kafka介绍 Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
主要应用场景是:日志收集系统和消息系统。
Kafka主要设计目标如下:
以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。同时支持离线数据处理和实时数据处理。支持在线水平扩展 有两种主要的消息传递模式:点对点传递模式、发布-订阅模式。大部分的消息系统选用发布-订阅模式。Kafka就是一种发布-订阅模式。
对于消息中间件,消息分推拉两种模式。Kafka只有消息的拉取,没有推送,可以通过轮询实现消息的推送。
Kafka在一个或多个可以跨越多个数据中心的服务器上作为集群运行。Kafka集群中按照主题分类管理,一个主题可以有多个分区,一个分区可以有多个副本分区。每个记录由一个键,一个值和一个时间戳组成。 Kafka具有四个核心API:
Producer API:允许应用程序将记录流发布到一个或多个Kafka主题。Consumer API:允许应用程序订阅一个或多个主题并处理为其生成的记录流。Streams API:允许应用程序充当流处理器,使用一个或多个主题的输入流,并生成一个或多
个输出主题的输出流,从而有效地将输入流转换为输出流。Connector API:允许构建和运行将Kafka主题连接到现有应用程序或数据系统的可重用生产者
或使用者。例如,关系数据库的连接器可能会捕获对表的所有更改。 二、Kafka优势 高吞吐量:单机每秒处理几十上百万的消息量。即使存储了许多TB的消息,它也保持稳定的性能。高性能:单节点支持上千个客户端,并保证零停机和零数据丢失。持久化数据存储:将消息持久化到磁盘。通过将数据持久化到硬盘以及replication防止数据丢失。 零拷贝顺序读,顺序写利用Linux的页缓存 分布式系统,易于向外扩展。所有的Producer、Broker和Consumer都会有多个,均为分布式
的。无需停机即可扩展机器。多个Producer、Consumer可能是不同的应用。可靠性 - Kafka是分布式,分区,复制和容错的。客户端状态维护:消息被处理的状态是在Consumer端维护,而不是由server端维护。当失败
时能自动平衡。支持online和offline的场景。支持多种客户端语言。Kafka支持Java、.NET、PHP、Python等多种语言。 三、 Kafka应用场景 日志收集:一个公司可以用Kafka可以收集各种服务的Log,通过Kafka以统一接口服务的方式开放给各种Consumer;
消息系统:解耦生产者和消费者、缓存消息等;
用户活动跟踪:Kafka经常被用来记录Web用户或者App用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到Kafka的Topic中,然后消费者通过订阅这些Topic来做实时的监控分析,亦可保存到数据库;
运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告;
流式处理:比如Spark Streaming和Storm。
四、基本架构 1、消息和批次 Kafka的数据单元称为消息。可以把消息看成是数据库里的一个“数据行”或一条“记录”。消息由字节数组组成。
消息有键,键也是一个字节数组。当消息以一种可控的方式写入不同的分区时,会用到键。
为了提高效率,消息被分批写入Kafka。批次就是一组消息,这些消息属于同一个主题和分区。
把消息分成批次可以减少网络开销。批次越大,单位时间内处理的消息就越多,单个消息的传输时间就越长。批次数据会被压缩,这样可以提升数据的传输和存储能力,但是需要更多的计算处理。
2、模式 消息模式(schema)有许多可用的选项,以便于理解。如JSON和XML,但是它们缺乏强类型处理能力。Kafka的许多开发者喜欢使用Apache Avro。Avro提供了一种紧凑的序列化格式,模式和消息体分开。当模式发生变化时,不需要重新生成代码,它还支持强类型和模式进化,其版本既向前兼容,也向后兼容。
数据格式的一致性对Kafka很重要,因为它消除了消息读写操作之间的耦合性。
3、主题和分区 Kafka的消息通过主题进行分类。主题可比是数据库的表或者文件系统里的文件夹。主题可以被分为若干分区,一个主题通过分区分布于Kafka集群中,提供了横向扩展的能力。
4、生产者和消费者 生产者创建消息。消费者消费消息。
一个消息被发布到一个特定的主题上。
生产者在默认情况下把消息均衡地分布到主题的所有分区上:
直接指定消息的分区根据消息的key散列取模得出分区轮询指定分区。 消费者通过偏移量来区分已经读过的消息,从而消费消息。
消费者是消费组的一部分。消费组保证每个分区只能被一个消费者使用,避免重复消费。
5、broker和集群 一个独立的Kafka服务器称为broker。broker接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker为消费者提供服务,对读取分区的请求做出响应,返回已经提交到磁盘上的消息。单个broker可以轻松处理数千个分区以及每秒百万级的消息量。
每个集群都有一个broker是集群控制器(自动从集群的活跃成员中选举出来)。
控制器负责管理工作:
将分区分配给broker监控broker 集群中一个分区属于一个broker,该broker称为分区首领。
一个分区可以分配给多个broker,此时会发生分区复制。
分区的复制提供了消息冗余,高可用。副本分区不负责处理消息的读写。
五、核心概念 1、Producer 生产者创建消息。
该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的 segment 文件中。
一般情况下,一个消息会被发布到一个特定的主题上。
默认情况下通过轮询把消息均衡地分布到主题的所有分区上。在某些情况下,生产者会把消息直接写到指定的分区。这通常是通过消息键和分区器来实现的,分区器为键生成一个散列值,并将其映射到指定的分区上。这样可以保证包含同一个键的消息会被写到同一个分区上。生产者也可以使用自定义的分区器,根据不同的业务规则将消息映射到分区 2、Consumer 消费者读取消息。
一、SSH介绍 SSH是Secure Shell Protocol的简写,用于加密两台计算机之间的通信,并且支持各种身份验证机制。SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全。
SSH是安全的加密协议,用于远程连接linux服务器。SSH默认端口是22,安全协议版本SSHv2,除了2之外还有SSHv1(有漏洞)。SSH服务端主要包含两个服务功能SSH远程连接和SFTP服务。Linux SSH客户端包含ssh远程连接命令,以及远程拷贝scp命令等。 而SSH 的软件架构是服务器-客户端模式(Server - Client)。在这个架构中,SSH 软件分成两个部分:向服务器发出请求的部分,称为客户端(client),OpenSSH 的实现为 ssh;接收客户端发出的请求的部分,称为服务器(server),OpenSSH 的实现为 sshd。
二、SSH登录 1、基本用法 SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。
# user指的是你远程主机的名字,host指的是ip或者局域网的主机名 ssh user@host # 如果本地用户名与远程用户名一致,登录时可以省略用户名。 ssh host #SSH的默认端口是22,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口,注意端口开放。 ssh -p 2222 user@hostSSH 2、口令登录 SSH之所以能够保证安全,原因在于它采用了公钥加密。整个过程是这样的:
远程主机收到用户的登录请求,把自己的公钥发给用户。用户使用这个公钥,将登录密码加密后,发送回来。远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。 这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。
ssh user@host 第一次登录对方主机,系统会出现一个警告提示,意思是无法确认远程主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?经过用户的考虑后接受,之后进行口令的输入,如果密码正确,就可以登录了。当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
3、公钥登录 使用密码登录,每次都必须输入密码,非常麻烦。SSH还提供了公钥登录,可以省去输入密码的步骤。
所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:
#程序会询问一系列问题,然后生成密钥,默认rsa算法 ssh-keygen #通常做法是使用-t参数,指定密钥的加密算法 ssh-keygen -t dsa 执行ssh-keygen命令以后,会出现第一个问题,询问密钥保存的文件名,默认是~/.ssh/id_rsa文件,这个是私钥的文件名,对应的公钥文件~/.ssh/id_rsa.pub是自动生成的。用户的密钥一般都放在主目录的.ssh目录里面。生成密钥以后,公钥必须上传到服务器,才能使用公钥登录。
手动上传公钥
OpenSSH 规定,用户公钥保存在服务器的~/.ssh/authorized_keys文件。你要以哪个用户的身份登录到服务器,密钥就必须保存在该用户主目录的~/.ssh/authorized_keys文件。只要把公钥添加到这个文件之中,就相当于公钥上传到服务器了。每个公钥占据一行。如果该文件不存在,可以手动创建。
ssh-copy-id命令:自动上传公钥
OpenSSH 自带一个ssh-copy-id命令,可以自动将公钥拷贝到远程服务器的~/.ssh/authorized_keys文件。如果~/.ssh/authorized_keys文件不存在,ssh-copy-id命令会自动创建该文件。
#需要把工作目录切换到~/.ssh/下 ssh-copy-id -i id_rsa user@host 上面命令中,-i参数用来指定公钥文件,user是所要登录的账户名,host是服务器地址。如果省略用户名,默认为当前的本机用户名。执行完该命令,公钥就会拷贝到服务器。
#SSH 就会自动采用密钥登录,不再提示输入密码。 ssh user@host 从此ssh登录,为了安全性就不需要密码登录了,具体方法就是打开服务器 sshd 的配置文件/etc/ssh/sshd_config,将PasswordAuthentication这一项设为no,最后重启sshd。
文章目录 进阶学习在Liunx安装MySQL1.卸载MySQL查看是否有MySQL开始卸载 2.安装MySQLMySQL的4大版本下载MySQL指定版本Linux系统下安装MySQL的几种方式Linux系统下安装软件的常用三种方式:方式1:rpm命令方式2:yum命令用yum安装MySQL8版本方式3:编译安装源码包 在Ubuntu安装安装MySQL APT配置包安装MySQL Server启动MySQL服务查看MySQL服务是否自启动 登录MySQL数据库卸载命令修改MySQL密码 3.MySQL登录关闭防火墙Linux下修改配置 4.MySQL8的密码强度评估4.1 MySQL不同版本设置密码4.2 MySQL不同版本设置密码MySQL8的安全策略修改安全策略4.3密码强度测试4.4 卸载插件、组件 进阶学习在Liunx安装MySQL 安装并启动好两台虚拟机: CentOS 7
掌握克隆虚拟机的操作
mac地址
主机名
vim /etc/hostname
修改i,退出Esc,然后:wq,表示保存并退出
修改完需要重启主机
reboot
ip地址和UUID
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改完需要网络重启 systemctl restart network
远程连接有 Xshell 和 Xftp 等访问CentOS系统的工具
通常要上传安装的软件放在opt文件夹下
CentOS6和CentOS7在MySQL的使用中的区别
防火墙:6是iptables,7是firewalld
启动服务的命令:6是service,7是systemctl
1.卸载MySQL 查看是否有MySQL 查看MySQL版本
mysqladmin --version ```sql 如果你是用rpm安装, 检查一下RPM PACKAGE: ```sql rpm -qa | grep -i mysql # -i 忽略大小写 不存在mysql-lib的版本: root@zzz-Latitude-3410:/# rpm -qa | grep -i mysql root@zzz-Latitude-3410:/# 开始卸载 关闭服务
使用流程: 1.先在main.js中创建总线(中间者) new Vue({ render: h => h(App), beforeCreate() { Vue.prototype.$bus = this } }).$mount('#app') //$bus(可以任意命名) 2.接收数据的组件: methods:{ getson(data){ this.newObj=data; this.showList.unshift(this.newObj); }, }//自定义方法 mounted() { this.$bus.$on('submit',(data)=>{this.getson(data)}); this.$bus.$on('quit',this.quit) }, //销毁 beforeDestroy() { this.$bus.$off('submit') this.$bus.$off('quit')}, 在mounted(){}中定义事件
数据更新就会触发该生命钩子函数)
this.$可以任取的名字.$on('标识名',(数据data)=>{this.getson(data)}); 使用箭头函数直接执行事件或者调用事件 3.发送数据的组件: methodes:{ submit1() { var d =new Date(); var obj = { cityNum: this.input1, city:this.input2, jingdu:this.jingdu, weidu:this.weidu, time:d.getFullYear()+'-0'+d.getMonth()+'-'+d.getDate()+' '+d.getHours()+'-'+d.getMinutes()+':'+d.getSeconds(), }; //这是个对象 this.$bus.$emit('submit',obj); this.$bus.$emit('quit','') // 调用方法数据可以为空 }, } 在methodes中的方法中调用中间者($bus) this.$bus.$emit('标识名',数据); 数据可以是对象和其他任意类型
转自:微点阅读 https://www.weidianyuedu.com
(方法汇总于网络,仅供参考)
目录
⊙如何用系统命令设置定时关机
⊙两款定时关机软件,小而好用,功能强大
⊙如何用任务计划程序设置
⊙常用的电脑软件如何设置,包括360安全卫士、迅雷
1
定时关机设置方法
方法一:用系统命令设置 1.鼠标右击【开始菜单】选择【运行】或在键盘上按【Win+R】快捷键打开运行窗口。
2.输入shutdown -s -t 1200 后点击【确定】。
(说明:输入每个完整代码后别忘记打空格, -s表示关机, -t 表示多长时间后关机,以秒为单位。如果你需要将电脑设置10分钟后关机,把1200改为600即可 )
3.如果想取消自动关机指令,只要在运行窗口中输入shutdown -a 点击【确定】。
4.指定时间关机的设置方法:
“at”命令安排在特定日期和时间运行命令和程序 。
“23:00”处指定了运行命令的时间,格式为24小时制。
“shutdown”为系统内置的一个命令,我们可以配合它的参数对系统进行关机、重启等操作。
.例如:设置上午12点整自动关机:
at 12:00 shutdown -s
5.如何取消?
cmd中输入 at 空格 /delete (然后问你是否全清), 输入Y 回车如下图 6.如果你有兴趣的话,可以再看看其他命令,如下:
shutdown -a 取消关机 shutdown -s 马上关机 shutdown -f 强行关闭应用程序 shutdown -m \\计算机名 控制远程计算机 shutdown -i 显示“远程关机”图形用户界面,但必须是Shutdown的第一个参数 shutdown -l 注销当前用户 shutdown -r 关机并重启 shutdown -s -t 100 设置100秒后自动关机 shutdown -h 休眠
QTextStream txtOutput( &file ); txtOutput.setGenerateByteOrderMark(true); txtOutput.setCodec(QTextCodec::codecForName("utf-8")); 加入后面两句即可!
1 window步骤: a. 新建一个chrome快捷方式,右键“属性”。
b. “快捷方式”选项卡里选择“目标”,添加 --args --disable-web-security --user-data-dir
2、mac步骤: open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --ignore-certificate-errors --user-data-dir=/Users/${此处完成用户名}/MyChromeDevUserData/
一、环境配置
1.1 python环境配置 1.1.1 python安装
1.1.2 flask安装
pip3 install flask 1.1.3 gunicorn安装
pip3 install gunicorn 1.2 nginx环境配置
1.2.1 nginx安装
二、部署案例
2.1 准备python flask项目
2.1.1 flsk文件 app.py from flask import Flask app = Flask(__name__) @app.route("/", methods=['GET']) def home(): ''' flask 测试内容 :return: ''' return "你好,三兑空空" if __name__ == '__main__': app.run() 2.1.2 wsgi文件 wsgi.py
from app import app if __name__ == "__main__": app.run() 2.2 配置nginx配置文件
进入nginx配置目录并打开配置文件nginx.conf
cd /etc/nginx/ vim nginx.conf 在80的server增加一个localtion---映射到127.0.0.1:8888
问题描述 [Errno 2] No such file or directory
FileNotFoundError: [Errno 2] No such file or directory: 原因分析: 绝对路径:从根目录为起点到某一个目录的路径,文件在硬盘上真正存在的路径
相对路径:相对于自己的目标文件位置
二者区别:绝对路径是实际存在于硬盘中的路径;相对路径是与自身相关的位置。
绝对路径优点:如果网页位置改变,里面的链接还是指向正确的URL;缺点:易被人盗取你网站内容。 相对路径的优点:容易移动内容,可以整个目录移动;缺点是容易被人大面积采集抄袭。
回到error,找不到文件的话,就把路径写完整,改为绝对路径
————————————————
原文链接:https://blog.csdn.net/m0_54721895/article/details/122849936
解决方案: os.path.join(path,i)
def readexcel(path): for i in os.listdir(path): j=os.path.join(path, i) a=pd.read_csv(j,encoding="utf-8",on_bad_lines='skip') print(a['']==0) # with open(i,'r',encoding="utf-8")as ii: # read=csv.reader(ii) # for index,info in enumerate(read): # print(info[:]) # print(a.head(0)) # print(a[:5]) # print(a[0:5]) # print(a.tail(3)) # print([a['T']==1]) # print(b) # print(a[['']]) readexcel(r'D:\Flu副本')
1.参考内容 整体流程参考:
Typora 如何上传图片? - 知乎 (zhihu.com)
安装smms插件准备工作参考:
PicGo + smms 构建图床-CSDN博客
安装smms插件参考:
Typora-PicGo-core-SMMS图床踩坑记-CSDN博客
smms插件下载
GitHub - xlzy520/picgo-plugin-smms-user: a plugin for picgo for SM.MS
Node下载
下载 | Node.js 中文网 (nodejs.cn)
Node下载后Python环境配置
设置Python环境变量-CSDN博客
2.Typaro图片自动上传设置 (1)打开偏好设置 打开Typora,文件 -> 偏好设置。记住以下四个编号代表的选项,后面以编号代替。
(2)安装PicGo-Core插件 点击①,选中PicGo-Core。点击②自动下载最新版插件。
(3)配置PicGo-Core 1)注册 smms 网站账号 smms官网:https://sm.ms/
在smms官网注册一个账号。
账号:fenger9902
2)获取 Secret Token 注册完成后,登录账号,在右上角点击User -> Dashboard,进入个人界面。
生成自己的Secret Token。
3)修改 PicGo-Core 配置文件 点击③,打开配置文件。
在 { } 内粘贴以下代码。
"picBed": { "current": "smms-user", "uploader": "smms-user", "smms-user": { "
1.安装一个包---rpm -ivh 包地址 (到这里查看版本http://nginx.org/packages)
我这里是:
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 2.查看当前安装的软件的信息---yum info
yum info nginx 3.安装---yum install
yum install nginx 4.修改配置
4.1打开配置文件
vim /etc/nginx/nginx.conf 4.2 修改配置
user nginx; 改成 user root;
4.3 添加自己的服务
我这里只添加一个80的http服务,关于配置文件会另外有文章讲解
server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } } 5.验证文件是否正确
nginx -t 6.启动nginx服务
service nginx start 7.常用指令
service nginx start #启动 service nginx stop #停止 nginx -t #检测配置文件是否正确 nginx -s reload #重载配置文件
遇到问题:最近在做一个情感分析聚类方面的项目,使用电脑中安装的 pycharm ,解释器为python 3.10 运行一个python文件时,出现了 ModuleNotFoundError: No module named 'snownlp' 的报错,需要安装 snownlp 库。
而当使用 win+R 快捷键打开 cmd,输入 pip install snownlp 命令时,却得到 Requirement already satisfied: snownlp in e:\anaconda\lib\site-packages\snownlp-0.12.3-py3.9.egg (0.12.3) 的提示,告诉我已经有 snownlp 存在于 e:\anaconda\lib\site-packages 路径中,但是我们在 pycharm 中运行 python 文件时还是缺少 snownlp 库。
分析原因,是因为已经存在的 snownlp 库是存在于 e:\anaconda\lib\site-packages 路径中,而我们使用的 python 解释器安装在 E:\python3.10.1 文件夹下,目前 E:\python3.10.1\Lib\site-packages 路径中是不存在 snownlp 库的,所以运行 python 文件会报错。所以我们需要将 snownlp 库安装在对应路径下,才可以正常运行该 python 文件。 解决方法:在 cmd 中使用 pip install --target=目标路径 工具包名字 的命令去安装所需要的库。例如,我使用 pip install --target=E:\python3.10.1\Lib\site-packages snownlp 这个命令去安装 snownlp 库,就可以成功安装。
前言 在聊天服务器项目中实现了集群,在这里根据该项目来讲解一下单机、集群与分布式理论。
文章目录 前言单机服务器集群服务器分布式系统 单机服务器 图示:
单机服务器的性能瓶颈:
所能承受的用户并发量受限于硬件资源,32位Linux最多支持两万并发量。运维困难,任意模块的修改都需要整个项目的重新编译、部署。系统中,有些模块属于CPU密集型,有些模块属于I/O密集型的。造成各模块对硬件资源的需求是不同的。 集群服务器 集群:每一台服务器独立运行一个工程的所有模块。
优点:
性能提升了,用户的并发量提升了;部署方式简单(扩充多台服务器)。
缺点:
项目代码还是需要重新编译,而且需要多次部署。后台管理模块用户本来就不多,所以根本不需要高并发,但却部署在了多台服务器上。 分布式系统 分布式:一个工程拆分了很多模块,每一个模块独立部署运行在一个服务器主机上,所有服务器协同工作共同提供服务,每一台服务器称作分布式的一个节点,根据节点的并发要求,对一个节点可以再做节点模块集群部署。
分布式系统解决了单机服务器的缺点:
解决了并发能力,而且如果想要在提升并发量的话,可针对性的改良,比如对如图所示的分布式结点1进行扩充多台服务器。运维方便,某个业务出现bug,只需要对相对应的结点进行重新编译、部署。有些业务属于CPU密集型,有些属于I/O密集型,可以将CPU密集型的业务部署在CPU性能强的机器上,其他资源可以相对弱一些;I/O密集型的业务部署在内存和磁盘性能强的机器上。这样的设计,系统和成本都得到了优化。 问题:
4. 大系统的软件模块该怎么划分?因为各模块可能会出现大量重复代码。
5. 各模块之间怎么访问?机器1上的模块怎么调用机器2上的模块的一个业务方法?机器1上的一个模块进程1怎么调用机器1上的模块进程2里面的一个业务方法呢?
如图:针对于这两个server之间的桥梁,就是需要实现的分布式网络通信框架。在后面的项目学习中会解决这些问题。
二进制小数转十进制 实数部分:
小数部分:
十进制小数转二进制 乘2,直到小数部分为0,如果实数部分大于1还是取1,不为1取0.
实数部分的1取走之后就不在了
IEEE754小数存储方法(32 位 float 型的二进制存储) 在线计算验证:http://www.styb.cn/cms/ieee_754.php
举例:
先转2进制,再套用公式,最后排布二进制数