mmap函数

参考 https://blog.csdn.net/bhniunan/article/details/104105153 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 参数 addr:出参, 指定映射的起始地址,通常设为NULL,由内核来分配 len:入参, 代表将文件中映射到内存的部分的长度。 prot:入参,映射区域的保护方式。可以为以下几种方式的组合: PROT_EXEC 映射区域可被执行 PROT_READ 映射区域可被读取 PROT_WRITE 映射区域可被写入 PROT_NONE 映射区域不能存取 flags:入参,映射区的特性标志位,常用的两个选项是: MAP_SHARD:写入映射区的数据会复制回文件,且运行其他映射文件的进程共享 MAP_PRIVATE:对映射区的写入操作会产生一个映射区的复制,对此区域的修改不会写会原文件 fd:入参,要映射到内存中的文件描述符,有open函数打开文件时返回的值。 offset:入参,文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。 返回值 实际分配的内存的起始地址。 int munmap(void *start, size_t length) 与mmap函数成对使用的是munmap函数,它是用来解除映射的函数 参数 start:映射的起始地址length:文件中映射到内存的部分的长度 返回值 解除成功返回0,失败返回-1。 //打开文件 fd = open("testdata",O_RDWR); //创建mmap start = (char *)mmap(NULL,128,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); //读取文件 strcpy(buf,start); printf("%s\n",buf); //写入文件 strcpy(start,"Write to file!\n"); munmap(start,128); close(fd); 这段代码实现了将测试文件testdata打开,并用mmap函数将文件映射到虚拟内存中,通过指针start对文件进行读写。在终端中可看到由文件读取的数据。程序结束后,可以查看testdata文件,来查看写入的数据。

计算机基础--->数据结构(8)【B树、B+树<超详细图文>】

文章目录 B树(B-Tree)B树的查询操作B树的几种插入删除情况 B+树B+树的主要特点插入操作删除操作 B树(B-Tree) B树(B-Tree)是一种自平衡的搜索树,又称平衡多路查找树,主要用于系统中大量数据的读和写操作。B树的特点是能保持数据有序,这使得在B树中进行查找、顺序访问、插入和删除等操作都非常高效。 B树中单一节点拥有的最多子结点的数量称为B树的阶,一个m阶B树的主要特点如下: 所有叶子节点都在同一层每个节点中的元素都按照升序排列,每个元素的左子树中的所有关键字都小于它,右子树中所有元素都大于它若根节点不是叶子节点,则至少有两颗子树(2<=子树个数<=m)除根结点和叶子节点外,节点至少有ceil(m/2)棵子树有k个孩子的非叶子节点包含k-1个元素(ceil(m/2)<=k<=m,当m=3时,2<=k<=3) 在B树中,插入和删除操作可能涉及节点的分裂和合并,以保持树的平衡性。当插入数据时,如果节点已满,会触发节点的分裂操作;当删除数据时,如果节点过于空闲,会触发节点的合并操作。 B树的查询操作 上图是一个三阶的B树,如果我们要查找元素5,需要进行如下步骤 与根节点元素9进行比较,5<9进入左子树与左子树元素2和6进行比较,发现2<5<6,进入中间子树与中间子树3和5进行比较,找到5 B树的几种插入删除情况 如果插入10,没有打破规则,直接插入 如果插入4,这时候可以看到叶子节点元素过多,超过了m-1,因此需要对节点进行分裂将ceil(m/2)位置的元素上升到父结点此时父结点的元素个数同样不满足B树规则,因此继续对父结点进行分裂 删除元素13,没有改变规则 删除元素8,剩余元素不足,相邻的兄弟节点没有多余元素,这时候就需要与相邻兄弟节点进行合并操作首先移动父结点中的元素【该元素在两个需要合并的两个结点元素之间】下移到其子结点中,然后将这两个结点进行合并成一个结点删除元素11,剩余元素不足,相邻兄弟节点有多余元素删除后,父节点(9,12)就少一个子节点。此时可以向兄弟节点“借”一个元素。但6不可以直接放在元素11的位置,需要上升到到父节点中,再把元素6和12之间的元素9移动到元素11的位置 删除2 删除元素6使用9替代6,删除9之后相邻兄弟没有多余元素,需要从父结点去借一个元素,然后进行合并 B+树 是B树的一种变体,主要用于数据库和文件系统, B+树的主要特点 有k个子树的中间节点包含k个元素(B树是k-1),每个元素不保存数据,数据都保存在叶子节点。所有的叶子节点包含了全部元素,依照元素的大小升序排列,叶子节点之间用双向指针链接所有中间节点的元素都同时存在于子结点,在子结点元素中是最大或最小元素B+树叶子节点中元素个数为(ceil(m/2)~m),添加第一个节点除外 在上图的B+树中,根节点元素8在子节点(2,5,8)中是最大元素,也是叶子节点(6,8)的最大元素;根节点元素15在子节点(11,15)中是最大元素,在叶子结点(13,15)中也是最大元素。 B+树的好处 方便进行范围查询,比如我要查询3~11区间的元素 首先自顶向下,查找区间的最小值3所在的叶子结点通过链表指针,遍历到相邻叶子节点(6,8)继续通过链表指针,遍历到相邻叶子结点(9,11) 插入操作 情况1. 若被插入元素所在的结点,其含有元素数目小于阶数 m,则直接插入 情况2. 若被插入关键字所在的结点,其含有关键字数目等于阶数 m,则需要将该结点分裂为两个结点,一个结点包含 ⌈m/2⌉ 。同时,将⌈m/2⌉的关键字上移至其双亲结点。假设其双亲结点中包含的关键字个数小于 m,则插入操作完成 情况3. 若插入的关键字比当前结点中的最大值还大,破坏了B+树中从根结点到当前结点的所有索引值,此时需要及时修正后,再做其他操作。 情况4. 在第 2 情况中,如果上移操作导致其双亲结点中关键字个数大于 m,则应继续分裂其双亲结点。插入元素20 删除操作 情况1:找到存储有该关键字所在的结点时,由于该结点中关键字个数大于⌈M/2⌉,做删除操作不会破坏 B+树,则可以直接删除。 情况2: 当删除该关键字时,导致当前结点中关键字个数小于 ⌈M/2⌉,若其兄弟结点中含有多余的关键字,可以从兄弟结点中借关键字完成删除操作。 情况3: 情况2中,如果其兄弟结点没有多余的关键字,则需要同其兄弟结点进行合并。 情况4: 当删除某结点中最大的关键字时,就会涉及到更改其双亲结点一直到根结点中所有索引值的更改。 情况5: 当进行合并时,可能会产生因合并使其双亲结点破坏 B+树的结构,需要依照以上规律处理其双亲结点。

C语言课程设计------食品仓库管理系统

篇幅较长,有些代码可能存在冗余,仅供参考。发现有问题欢迎提出。 目录 1.题目描述: 2.代码解析 (1)结构体 (2)主要设置函数 (3)主函数: (4)编写菜单: (5)添加食品信息: (6)Count (7)添加食品库存 (8)修改食品信息: (9)查找信息 (10)统计 (11)食品信息排序 (12)月报表 (13) 显示食品信息 (14)删除食品信息 (15)退出系统菜单 3.代码汇总 1.题目描述: 编写一个程序来管理食品仓库的货物,系统能实现以下功能: 食品信息输入 添加新食品信息 食品出库 修改食品信息 查询食品信息 食品排序 统计 月报表 导出食品信息 2.代码解析 首先定义我们需要的头文件: #include<stdio.h> #include<stdlib.h> # include<windows.h> # include<string.h> #include<time.h> #include<conio.h> 以及方便我们后续操作的宏定义: #define format1 "%d %s %s %d %lf %d %d %d\n" #define format2 "%d%s%s%d%lf%d%d%d\n" #define format3 "%-6d\t%-6s\t%-6s\t%-6d\t%-6.2lf\t%-6d%-2d %-2d\n" #define data1 stock[i].number,stock[i].name,stock[i].cate,stock[i].amount,stock[i].price, stock[i].year,stock[i].month,stock[i].day #define data2 &stock[i].number,&stock[i].name,&stock[i].cate,&stock[i].amount,&stock[i].price, &stock[i].year,&stock[i].month,&stock[i].day (1)结构体 我们的食品信息包含:食品号、名字、种类、库存、单价、入库时间以及入库量、出库量。所以我们可以构建结构体来完成:

jsp中文验证码简单步骤与思路

下面是创建一个包含JSP、Session和Cookie的中文验证码的步骤: 创建一个JSP页面,命名为captcha.jsp,用于生成验证码图片和展示验证码输入表单。 在captcha.jsp中使用Java代码生成中文验证码,并将验证码保存到Session中。示例代码如下: <% // 生成中文验证码 String captcha = generateCaptcha(); // 自定义生成验证码的方法 // 将验证码保存到Session session.setAttribute("captcha", captcha); %> 在captcha.jsp中,将生成的验证码图片显示给用户。可以使用<img>标签来展示验证码图片。示例代码如下: <img src="captchaImage.jsp" alt="验证码" /> 创建一个新的JSP页面,命名为captchaImage.jsp,用于生成验证码图片。 在captchaImage.jsp中,使用Java代码生成验证码图片,并将验证码图片通过响应流返回给客户端。示例代码如下: <%@ page contentType="image/jpeg" %> <% // 获取保存在Session中的验证码 String captcha = (String) session.getAttribute("captcha"); // 将验证码转换成图片并输出到响应流 generateCaptchaImage(captcha, response); // 自定义生成验证码图片的方法 %> 在captcha.jsp中,添加一个验证码输入表单,用于用户输入验证码。示例代码如下: <form action="verifyCaptcha.jsp" method="post"> <label for="captcha">请输入验证码:</label> <input type="text" id="captcha" name="captcha" required> <input type="submit" value="提交"> </form> 创建一个新的JSP页面,命名为verifyCaptcha.jsp,用于验证用户输入的验证码。 在verifyCaptcha.jsp中,获取用户输入的验证码,并与保存在Session中的验证码进行比较。如果验证码匹配,则可以执行相应的操作。示例代码如下: <% // 获取用户输入的验证码 String userCaptcha = request.getParameter("captcha"); // 获取保存在Session中的验证码 String sessionCaptcha = (String) session.

树莓派默认python版本切换

树莓派默认python版本切换 树莓派默认安装的是Python 2.7版本,但是可以通过以下步骤切换到Python 3版本: 打开终端窗口。 输入以下命令来查看当前系统中安装的Python版本: python --version 如果系统中已经安装了Python 3版本,可以直接使用以下命令来切换版本优先级: sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.x 2 其中,python3.x是你系统中安装的Python 3版本的路径,例如python3.7。 使用以下命令来选择默认的Python版本: sudo update-alternatives --config python 然后根据提示选择你想要设置为默认的Python版本的编号。 输入以下命令来验证默认Python版本是否已经切换成功: python --version 注意:在切换Python版本之前,请确保你的系统中已经安装了你想要切换到的Python版本。

使用python求信号的样本熵

要计算信号的样本熵(sample entropy),您可以使用pyentrp等库来实现。 首先,确保你已经安装了pyentrp库: pip install pyentrp 然后,使用以下Python代码计算信号的样本熵: import numpy as np from pyentrp import entropy as ent # 生成示例信号 signal = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 计算样本熵 sample_entropy = ent.sample_entropy(signal) print("Sample Entropy:", sample_entropy) 在上述代码中,我们生成了一个示例信号 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],然后使用 sample_entropy() 函数从pyentrp库中计算样本熵。样本熵是一种用来度量信号复杂度或不规则程度的指标。 注意,pyentrp库可用于计算多种熵指标,例如样本熵、近似熵等。 您可以根据您的需求选择适当的熵指标。

k8s集群部署Prometheus和Grafana

一、部署nfs-client-provisioner 参考https://zhaoll.blog.csdn.net/article/details/128155767 二、部署prometheus 创建pvc apiVersion: v1 kind: PersistentVolumeClaim metadata: name: prometheus-data namespace: devops annotations: volume.beta.kubernetes.io/storage-provisioner: master-nfs-storage spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: master-nfs-storage --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: prometheus-rules-data namespace: devops annotations: volume.beta.kubernetes.io/storage-provisioner: master-nfs-storage spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: master-nfs-storage 创建RBAC apiVersion: v1 kind: ServiceAccount metadata: name: prometheus namespace: devops labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus labels: kubernetes.

RabbitMQ系列(19)--实现在RabbitMQ宕机的情况下对消息进行处理

前言:在生产环境中由于一些不明原因,导致RabbitMQ重启的情况下,在RabbitMQ重启期间生产者投递消息失败,生产者发送的消息会丢失,那这时候就需要去想在极端的情况下,RabbitMQ集群不可用的时候,如果去处理投递失败的消息。 1、在config包里新建一个名为ConfirmConfig的类用于编写配置交换机、队列、routingkey的代码 代码如下: package com.ken.springbootrqbbitmq.config; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ConfirmConfig { //交换机 public static final String EXCHANGE_NAME = "confirm_exchange"; //队列 public static final String QUEUE_NAME = "confirm_queue"; //routingkey public static final String ROUTING_KEY = "confirm"; //声明交换机 @Bean("confirmExchange") public DirectExchange confirmExchange() { return new DirectExchange(EXCHANGE_NAME); } //声明队列 @Bean("confirmQueue") public Queue confirmQueue() { return QueueBuilder.durable(QUEUE_NAME).build(); } //绑定交换机和队列 @Bean public Binding queueBindingExchange(@Qualifier("confirmQueue") Queue confirmQueue, @Qualifier("confirmExchange") DirectExchange confirmExchange) { return BindingBuilder.

如何在服务器上安装miniconda

官网下载 官网下载 linux下的第一个版本,下载到本地文件以.sh结尾Miniconda3-latest-Linux-x86_64.sh 安装miniconda 在服务器中找到想要放miniconda安装包的位置,也可以直接新建 1.用cd进入指定文件夹 2. 按照这个指南直接安装 ubuntu服务器安装Miniconda使用教程 注意:安装是的相对路径,是以目前的文件夹作为依据,并在此基础上创建的 例如:目前的文件夹是home/miniconda 如果在文件配置中新建location 那么最终miniconda的配置文件被放在home/miniconda/location

Next.js 13.4 版本 App Router与 Turbopack基础

Next 已经发布13.4稳定版本 详细官方文档:Building Your Application: Routing | Next.js 13.4 (nextjs.org) 新特性 App Router(稳定版) : React 服务器组件嵌套路由和LayoutSimply Data fetching流渲染(Streaming)和回退(Suspense)内置 SEO 支持 Turbopack(beta版) :让你的本地开发服务更快,更稳定 Server Action(Alpha版) :在服务器上使用 JavaScript 直接更改数据,实现“零客户端”. 一、App Router Next.js 基于文件系统的路由设计模式,是其核心特性之一。该设计模式使得在 Next.js 项目中创建和管理路由变得非常简单和直观。 1. Nextjs路由设计原则 零配置,使用文件系统作为API只有JavaScript,一切皆是函数自动服务器渲染和代码拆分数据获取由开发人员决定 2. 旧版本路由模式 页面级路由:在 pages 目录下创建文件来定义页面级路由。每个文件对应一个页面,并且文件名确定了该页面的路由路径。例如, pages/index.js 对应根路径 / , pages/about.js 对应 /about 。动态路由:处理具有动态参数的路由。通过在文件名中使用方括号包裹参数名称,可以在路由路径中指定动态片段。例如, pages/post/[id].js 可以匹配类似 /post/1 或 /post/2 这样的路由。嵌套路由:创建具有父子关系的页面结构。通过在 pages 目录中的文件夹内创建文件,可以实现嵌套路由。例如, pages/blog/index.js 对应 /blog ,而 pages/blog/post.js 对应 /blog/post 。客户端路由:Next.js 使用内置的客户端路由器来处理客户端导航。您可以使用 next/link 组件或 router 对象来实现客户端路由导航。此模式允许您在不重新加载整个页面的情况下进行导航和页面切换。API 路由:Next.

代码!= null 判空,其它写法

例一 在函数方法中 以前写法 public String getCity(User user) throws Exception{ if(user!=null){ if(user.getAddress()!=null){ Address address = user.getAddress(); if(address.getCity()!=null){ return address.getCity(); } } } throw new Excpetion("取值错误"); } JAVA8写法 public String getCity(User user) throws Exception{ return Optional.ofNullable(user) .map(u-> u.getAddress()) .map(a->a.getCity()) .orElseThrow(()->new Exception("取指错误")); } 例二 比如,在主程序中 以前写法 if(user!=null){ dosomething(user); } JAVA8写法 Optional.ofNullable(user) .ifPresent(u->{ dosomething(u); }); 例三 以前写法 public User getUser(User user) throws Exception{ if(user!=null){ String name = user.getName(); if("zhangsan".equals(name)){ return user; } }else{ user = new User(); user.

vscode快捷键

vscode快捷键 1、注释: a) 单行注释:[ctrl+k,ctrl+c] 或 ctrl+/ b) 取消单行注释:[ctrl+k,ctrl+u] (按下ctrl不放,再按k + u) c) 多行注释:[alt+shift+A] d) 多行注释:/* */ <!-- --> 2、移动行:alt+up/down 3、显示/隐藏左侧目录栏 ctrl + b 4、复制当前行:shift + alt +up/down 5、删除当前行:shift + ctrl + k 6、控制台终端显示与隐藏:ctrl + ~ 7、查找文件/安装vs code 插件地址:ctrl + p 8、代码格式化:shift + alt +f 9、新建一个窗口: ctrl + shift + n 10、行增加缩进: ctrl + [ 11、行减少缩进: ctrl + ] 12、裁剪尾随空格(去掉一行的末尾那些没用的空格) : ctrl + shift + x 13、字体放大/缩小: ctrl + ( + 或 - ) 14、拆分编辑器 :ctrl + 1/2/3 15、切换窗口: ctrl + shift + left/right 16、关闭编辑器窗口: ctrl + w 17、关闭所有窗口 : ctrl + k + w 18、切换全屏 :F11 19、自动换行: alt + z 20、显示git: ctrl + shift + g 21、全局查找文件:ctrl + p 22、显示相关插件的命令(如:git log):ctrl + shift + p 23、选中文字:shift + left / right / up / down 24、折叠代码: ctrl + k + 0-9 (0是完全折叠) 25、展开代码: ctrl + k + j (完全展开代码) 26、删除行 : ctrl + shift + k 27、快速切换主题:ctrl + k / ctrl + t 28、快速回到顶部 : ctrl + home 29、快速回到底部 : ctrl + end 30、格式化选定代码 :ctrl + k / ctrl +f 31、选中代码 : shift + 鼠标左键 32、多行同时添加内容(光标) :ctrl + alt + up/down 33、全局替换:ctrl + shift + h 34、当前文件替换:ctrl + h 35、打开最近打开的文件:ctrl + r 36、打开新的命令窗:ctrl + shift + c

SpringBoot配置文件加载顺序

面试的时候面试官问了我一个问题,bootstrap.yml 和application.yml文件在一个文件夹中的加载顺序。 正确顺序是bootstrap.yml先加载,基于这个我又联想了很多,如果这四种配置文件在一个文件夹中他们的加载顺序是什么样的。仔细了解过后,我得出了下面的答案: 首先,Spring Boot会尝试加载 bootstrap.properties 或 bootstrap.yml 文件。这些文件主要用于外部配置,并且会在任何其他配置文件之前被加载。通常情况下,bootstrap 配置文件用于配置应用程序上下文之外的属性,例如连接到远程配置服务器的属性。 接下来,Spring Boot会加载 application.properties 或 application.yml 文件。这些文件包含了应用程序的一般配置属性。它们覆盖了 bootstrap 配置文件中相同属性的值。 如果存在多个 application 配置文件,它们将按照以下顺序进行加载: 具体的配置文件(例如:application-dev.properties 或 application-prod.properties)将按照指定的配置文件顺序加载。通用配置文件(例如:application.properties 或 application.yml)将在最后加载,覆盖之前已经加载的配置。 总结起来,加载顺序为:bootstrap.properties>bootstrap.yml> application.properties > application.yml>具体的配置文件 > 通用配置文件。 需要注意的是,这里提到的文件名和文件格式仅作为示例,实际的文件名和格式可以根据项目的需求进行自定义。同时,Spring Boot还支持使用环境变量、命令行参数等方式来配置应用程序,这些配置方式可以覆盖配置文件中的属性值。

ubuntu开机停留在(initramfs)页面

偶然发现Ubuntu开机停留在(initramfs)页面,是因为文件系统出现了问题。我尝试了下面的步骤之后,问题就解决了。 第一步:在(initramfs)后面输入 fsck /dev/sda5 -y 等待 FIEL SYSTEM WAS MODIFIED 出现后开始第二步 第二步:在(initramfs)后面输入 exit 稍等片刻,就可以正常启动Ubuntu了。

QWebEngine应用---执行javascript

我们都知道现代前端技术是基于html、css和javascript进行显示交互的,其中html和css属于静态界面显示,辅以javascript使页面交互更丰富。浏览器作为前端页面显示的基石,提供一套显示、交互、调试的东西。QWebEngine同样也提供了这些功能,比如调起开发者页面,QWebEngine还提供接口执行javascript,这方便我们修改页面的显示和交互。 在介绍QWebEngine注入javascript之前,我们先来了解一个前端知识,即jquery和JavaScript。 jquery和JavaScript之间的联系和区别: JavaScript是用于Web客户端开发的脚本语言jQuery是js的框架,基于js语言。功能:集合Ajax技术开发出来的js库,封装js和Ajax的功能,提供函数接口,简化js的操作 为什么要了解这个呢? 是因为Qt提供的demo使用的是jquery,jquery使用起来比原生的javascript更简单,当然使用原生的javascript也是没问题的。 我们以Qt提供的例子进行讲解。 1、加载jquery库 在前端页面开发中,jquery一般是在head标签引入名为jquery.min.js的jquery库。所以如果页面没有引入jquery的库,我们需要先引入。demo中把jquery.min.js加载出来并用一个qt变量进行封装,jquery.min.js的文件在demo的资源里面,在页面加载完成后调用runJavaScript注入到页面中。 2、执行jquery语句 使用qt.jquery执行jquery语句 void MainWindow::highlightAllLinks() { QString code = QStringLiteral("qt.jQuery('a').each( function () { qt.jQuery(this).css('background-color', 'yellow') } )"); view->page()->runJavaScript(code); } 这个是遍历所有a标签的背景色改为黄色 用法是很简单的,需要主意的是,因为每个页面用自己的jquery库,所以如果页面重新加载了是需要重新引入jquery的库。 3、javascript写法 针对上面的修改背景的效果,也可以使用原生javascript,效果是一样的 QString code = "var _lis=document.getElementsByTagName(\"a\");for (var i=0;i<_lis.length;i++){_lis[i].style.background='yellow'}"; view->page()->runJavaScript(code); 4、调试javascript 正常来看,写Qt的一般不熟悉web前端技术,对js写前端的交互不会特别熟练,所以通过启动程序来调js代码效率会很低。我们可以使用浏览器的开发者模式进行js的调试。在浏览器中打开对应的页面,按快捷键F12,进入开发者模式,进入控制台,可以在控制台执行js代码。 输入js代码后回车运行代码,这样就方便我们调试出能用的代码了。 最后,用法及基本原理就这些,剩下的就是发挥你们的聪明才智写出想要的javascript代码了。

Flutter开发常见问题,解决小技巧

1.Android Studio 4.0 以上打包编译报错; Execution failed for task ':app:lintVitalRelease'. > Could not resolve all artifacts for configuration ':app:debugRuntimeClasspath'. > Failed to transform libs.jar to match attributes {artifactType=processed-jar, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}. > Execution failed for JetifyTransform: E:\FlutterSpace\xxxx\build\app\intermediates\flutter\debug\libs.jar. > Transform's input file does not exist: E:\FlutterSpace\xxxx\build\app\intermediates\flutter\debug\libs.jar. (See https://issuetracker.google.com/ issues/158753935) * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

【分布式应用】Zabbix监控6.0

目录 一、Zabbix简介1.1监控软件的作用1.2zabbix是什么1.3zabix监控原理1.4 Zabbix6.0新特性1.4.1 Zabbix server高可用防止硬件故障或计划维护期的停机:1.4.2 Zabbix 6.0 LTS新增Kubernetes监控功能,可以在Kubernetes系统从多个维度采集指标: 1.5 Zabbinx6.0功能组件1.5.1 Zabbix Server1.5.2 数据库1.5.3 Web 界面1.5.4 Zabbix Agent1.5.5 Zabbix Proxy1.5.6 Java Gateway 二、Zabbix 6.0 部署2.1部署zabbix服务端2.1.1关闭 selinux 与防火墙2.1.2 部署 Nginx + PHP 环境并测试2.1.3 部署数据库 2.2 编译安装 zabbix Server 服务端 一、Zabbix简介 作为一个运维,需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等,利用监控系统的数据去了解网站上线发布的结果和健康状态。 1.1监控软件的作用 通过一个友好的界面进行浏览整个网站所有的服务器状态可以在 Web 前端方便的查看监控数据可以回溯寻找事故发生时系统的问题和报警情况 1.2zabbix是什么 zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。zabbix 由 2 部分构成,zabbix server 与可选组件 zabbix agent。通过 C/S 模式采集数据,通过 B/S 模式在 Web 端展示和配置。zabbix server 可以通过 zabbix agent,SNMP协议,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在 Linux 等平台上。zabbix agent 需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU 等信息的收集。 1.

SQL对表中字段的增删改查操作

修改表名 rename ALTER TABLE 旧表名 RENAME [TO] 新表名; alter: 修改 rename: 重命名 添加字段 add ALTER TABLE 表名 ADD 字段名 数据类型 [属性] 修改字段 change ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型 [属性]; 删除字段 drop ALTER TABLE 表名 DROP 字段名; 删除表: drop table 表名; 删除数据 :drop database test1; 对表中字段的属性值操作:添加设置额外属性等 primary key 给字段添加唯一键主键属性(不可重复,且不为空) alter table 表名 add constraint 字段名 primary key 表名(字段名); primary key : 唯一的,主键。 add constraint: 添加 约束 给表添加外键字段 外键, FOREIGN KEY。 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段) REFERENCES 关联表名(关联字段); FOREIGN KEY: 外键 ADD CONSTRAINT: 添加 约束 REFERENCES :关联 引用 (添加外键: 是需要你这个外键 字段的类型一致, 且字段属性不能为空的not null,设置成主键!) 练习: #对一个表中字段增删改查的操作练习。 alter table 来操作一个表的修改 #先创建一个表。 CREATE TABLE mybook(id INT ,bookname VARCHAR(40),money INT); #先给我们的mybook表改名为book ALTER TABLE mybook RENAME book; #给book 表添加一个字段,作者author ALTER TABLE book ADD author VARCHAR(40) NOT NULL; #删除book表中 author 这个字段。 drop ALTER TABLE book DROP author; DML语句,对表中的数据进行操作。 添加数据: 添加数据: insert into 表名 values(字段对应数据1,字段对应数据2,……); 注意: 表名,后面可以添加字段名,表示要往对应字段下面添加数据。 字段名可以是多个,用逗号隔开。添加的值,也要和字段数量一一对应。 添加多条数据: 当我们要给一个表中添加多条数据的时候。 insert into 表名 values(一条数据),(第二条数据),(第三条数据);…… 如何修改:修改数据,和数据里面的约束。change 改变字段。 delete 删除字段,之后在重新创建,后边会学习专门对属性操作。 从原表中选择数据,添加到新表中。 方法1: INSERT INTO 新表(字段1,字段2……)SELECT字段1,字段2……FROM 原表; 方法2: CREATE TABLE 新表(SELECT 字段1,字段2 …… FROM 原表); 更新数据: update : update 表名 set 字段名=字段值, 字段名=字段值,字段名=字段值 where 条件。 删除数据: DELETE FROM 表名 [WHERE条件]; delete from 表名; (后边不跟条件的话,就删除所有表中内容) 添加了auto_increment 这个属性的字段,具备自增的属性。 当你删除了,中间的一些列表内容的内容的时候,就会产生自增列表断开的问题。 我们想要数据删除后,现在剩下的数据,仍然给我保持一个序列排序,且序号连续。 TRUNCATE TABLE 表名; 这个属性字段,可以给我们把自动增长的属性字段,重新排序。 聚合函数 : avg() :求平均数 count() :计算数量的 sum() : 求和的 min() 求最小值 max () 求最大值 字符串函数: 注意:在所有mysql字符串操作中,最开始的索引是从1开始的。 CONCAT(str1,str1.

python求信号的模糊熵

要计算信号的模糊熵,您可以使用以下Python代码: import numpy as np def fuzzy_entropy(signal, m, r): N = len(signal) B = 0.0 C = 0.0 A = 0.0 # 将信号向量化 signal = np.array(signal) # 遍历每一个子序列,计算模糊熵 for i in range(N - m): for j in range(N - m): if i != j: max_diff = np.max(np.abs(signal[i:i + m] - signal[j:j + m])) if max_diff <= r: B += 1 # 检查下一个子序列是否也符合匹配条件 if i != N - m - 1: for k in range(m): if signal[i + m + k] !

Flutter 仿抖音、豆瓣、知乎、番茄小说的评论弹窗开发实践

最近用flutter做了一个评论弹窗的功能,本来以为很简单的烂大街的一个功能,结果却遇到了不少的问题,而且这些问题我觉得很有意义,以至于我觉得我如果分享出来可能会对其他人很有帮助。 要做一件事情可能会很容易,但做好一件事情却很难~ 常见产品 粗略的截了一些图:抖音、豆瓣、知乎、番茄小说 这些产品的评论功能基本都是这种弹窗或者说是滑动面板的模式: 抖音/豆瓣 知乎/番茄小说 交互细节 当认真的体验了这几款产品后,发现有这些特点: 列表与下拉手势联动面板顶部下拉手势查看更多回复弹起键盘抖音支持支持点击展开滚动定位豆瓣支持支持点击展开评论框顶部显示内容知乎支持不支持跳转新页面无处理番茄小说支持支持跳转新页面滚动定位 大概梳理总结这么几点: 这个弹窗并不是一个简单的dialog,其实是一个带有手势交互的滑动面板手势向上可以正常滑动列表,手势向下滑动列表到顶部后可触发下拉手势关闭弹窗即使列表向上滚动一段距离后,仍然可以滑动顶部触发下拉手势关闭弹窗点击列表某一项弹起键盘后,普遍是将要回复的那一条定位到评论框的上方查看更多回复,抖音/豆瓣是直接在当前页面展开,知乎/番茄小说是一个跳转到新页面 我相信这几款产品基本都是用android原生去写的,那么flutter是否实现和它们一样的用户体验呢? 其实我最初想到的就是用showModalBottomSheet去从底部弹一个窗出来,但是BottomSheet本身并没有处理与列表的滑动交互问题,如果凑合着其实也还行,就是缺少了下拉手势的交互。 所以我在flutter社区找到了sliding_up_panel,这是一个很受欢迎的库,我打算基于这个库来实现评论功能 至于实现效果,最终是选择了番茄小说的交互效果: 列表与下拉手势联动面板顶部下拉手势查看更多回复弹起键盘番茄小说支持支持跳转新页面滚动定位 实现效果 那些基本的代码就不细讲了,一顿操作下来,基本功能成型: 接下来说的难点解决暂时也不贴具体的源码了,以讲思路为主,部分是真实的,部分是伪代码 最终的源码我会贴到文章末尾~ 难点解决 1. 面板中存在多个列表时,下拉手势异常(局部路由存在多个页面引起) 看一下官方文档的说明: PropertiesDescriptionpanelBuilder [beta]NOTE: This feature is still in beta and may have some problems. Please open an issue on GitHub if you encounter something unexpected.Provides a ScrollController to attach to a scrollable object in the panel that links the panel position with the scroll position. Useful for implementing an infinite scroll behavior.