【C语言】第四十二弹---一万六千字教你从0到1实现通讯录

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 目录 1、通讯录分析和设计 1.1、通讯录的功能说明 1.2、程序的分析和设计 1.2.1、数据结构的分析 1.2.2、文件结构设计 2、通讯录的结构分析 2.1、创建通讯录结构 2.1.1、静态版本 2.1.2、动态版本 2.2、用户选择 2.3、初始化通讯录 2.3.1、静态通讯录 2.3.2、动态通讯录 2.3.3、动态文件通讯录 2.4、添加联系人信息 2.5、打印联系人信息 2.6、删除联系人 2.7、 查找联系人 2.8、修改联系人 2.9、排序联系人信息 2.10、存储联系人信息到文件 2.11、销毁通讯录 3、完整代码 3.1、contact.h 3.2、contact.c 3.3、test.c 总结 前面接近四十弹内容基本都在学习C语言的基本语法,单纯的学习语法会让我们的学习比较枯燥,因此该节内容通过C语言学习的语法知识实现一个我们手机都有的通讯录功能。 1、通讯录分析和设计 1.1、通讯录的功能说明 1、通讯录中包含个人的姓名,性别,年龄,电话与地址。 2、用户可以自由进出程序。 3、用户可以自由增删查改以及排序通讯录中的数据。 程序的界面: 1.2、程序的分析和设计 1.2.1、数据结构的分析 通讯录中存储的数据有姓名,性别,年龄,电话与地址,此处会用到字符串(字符串通过字符数组进行实现),整型的结合,因此我们可以封装成一个结构体进行统一存储。根据通讯录功能的说明,我们需要对通讯录进行增删改查操作,如何才能确定需要操作的数据是哪一组呢?如何确定最终存储了多少组数据呢? 解决办法如下: 1、再创建一个结构体,该结构体的内容包括存储数据的结构体和该结构体的最大存储个数(静态版本,创建静态数组)。 2、再创建一个结构体,该结构体的内容包括存储数据的结构体、存储数据的结构体的实际存储个数以及存储数据的结构体的(容量)最大存储个数(动态版本,动态开辟数组)。 知道数据的存储之后就是创建我们常用的菜单,即前面扫雷,猜数字游戏用到的菜单,通讯录也是同样的原理,用do while循环实现此菜单,根据上面程序的界面可以知道,我们需要实现接口函数较多,因此推荐使用switch选择语句,但是switch语句的类型需要整型,单纯我们整数去实现该函数不够通俗易懂,此处的解决办法有1、通过#define定义常量 2、使用枚举类型。 如果使用#define定义常量,需要7处,代码也比较繁琐,但是如果此处使用枚举类型,可以定义一次即可(枚举类型不初始化第一个变量自动初始化为0,后面依次加+),非常满足此处的需求。 后面就是基本接口函数的实现了,在后面一一详细讲解。 1.2.2、文件结构设计 之前学习了多文件的形式对函数的声明和定义,这里我们实践⼀下,我们设计三个⽂件: test.c : 文件中写程序的测试逻辑 Contact.c : 文件中写程序中函数的实现等 Contact.h : 文件中写程序需要的数据类型和函数声明等 建议:写一些代码就测试一些代码。 2、通讯录的结构分析 2.1、创建通讯录结构 2.1.1、静态版本 静态通讯录就是在开辟空间时,给一个固定的大小,缺陷在于空间小了,不能扩容,空间大了,会造成浪费。 //常量使用#define宏定义,便于以后修改 #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 13 #define ADDR_MAX 30 #define MAX 100 //通讯录大小,存放多少人的信息 //一个人的信息 typedef struct PeoInfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }PeoInfo; //静态版本,通讯录的信息 typedef struct Contact { PeoInfo data[MAX]; int sz; }Contact; 2.

气象数据NC、grb2解析成矢量json、CMIS、MICPS及图片应用到webgis

一、基础概念 气象数据通常以多种格式存储和交换,以适应不同的应用需求和处理工具。以下是一些常见的气象数据格式及其转换方法的概述: 常见气象数据格式 1. NetCDF(Network Common Data Form):一种自描述、自包含的数据格式,广泛用于存储气象和气候模型输出、观测数据等。NetCDF支持多维度数组、属性和变量,便于跨平台共享。 2. GRIB(GRIdded Binary):主要用于气象预报产品,包括GRIB1和GRIB2两种版本。它以高效的方式存储大量的气象格点数据,如温度、风速等,是气象预报中心之间交换数据的标准格式。 3. HDF(Hierarchical Data Format):类似于NetCDF,支持复杂的数据结构,适用于大规模科学数据集的存储和分发。HDF4和HDF5是两个主要版本。 4. CSV(Comma-Separated Values):简单的文本格式,易于阅读和处理,常用于数据交换,但缺乏自描述性,不包含元数据。 5. GeoTIFF:一种地理空间图像格式,用于存储栅格数据,如卫星图像或气象地图,包含地理坐标信息。 6. BUFR(Binary Universal Form for the Representation of Meteorological Data):国际气象组织推荐的一种二进制编码格式,特别适用于气象观测数据的交换。 数据格式转换方法 1. 使用专业软件: •Panoply:NASA开发的免费软件,可以打开、查看和转换NetCDF、HDF、GRIB等格式数据。•NCAR Command Language (NCL):提供丰富的脚本语言功能,用于处理NetCDF、GRIB等气象数据。 •GDAL/OGR:开源地理空间库,提供了广泛的格式转换能力,支持NetCDF、HDF、GeoTIFF等格式的转换。 2. 编程语言库: •Python: 利用netCDF4, pygrib, h5py等库进行数据读写和格式转换。xarray库提供了更高级的数据结构,方便处理NetCDF和GRIB数据。 •MATLAB:内置了对NetCDF、HDF的读写支持,也可通过第三方工具箱处理其他格式。 •R语言:使用ncdf4、raster、rgdal等包处理NetCDF、GRIB、GeoTIFF等格式。 3. 在线转换工具: 虽然不如上述方法灵活,但存在一些在线工具,允许用户上传文件并转换为不同格式,不过这类工具在处理大型气象数据集时可能受限。进行数据格式转换时,需注意保留数据的完整性和准确性,特别是元数据信息,以确保转换后的数据在后续分析中仍然有效。 二、实践应用 关键代码实现 package com.netcdf.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import java.util.*; import static com.

Springboot项目连接多数据源(MySQL和SQLServer)

前言:原本项目使用的是MySQL数据库,由于新的需求需要从SQLServer数据库拉去数据同步到MySQL中。 pom依赖 springboot版本是2.7.12 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <!--我的SQLServer使用的是2017,根据sqlserver版本指定依赖版本--> <version>7.0.0.jre8</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.19</version> </dependency> 1、配置MySQL 1.1 配置MysqlDataSourceConfig import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.web.mapper.mysql", sqlSessionTemplateRef = "mysqlSqlSessionTemplate") public class MysqlDataSourceConfig { @Primary @Bean(name = "

UE4 Unlua的快速使用

目录 Unlua的使用前言下载Unlua插件插件安装快速入门语法汇总模块导入多行字符串官方静态方法调用蓝图方法调用重载蓝图中的方法主动调用被重载的蓝图方法输入绑定动态绑定Lua脚本委托容器使用 延迟与协程的使用C++ 调用Lua 静态导出自定义类型到Lua使用网络UMG资源释放自定义加载器动画通知 Unlua的使用 前言 整理一下Unlua的整个学习流程 下载Unlua插件 我们此处使用的是腾讯的Unlua插件,打开官方的Github链接,下载对应的版本 官方链接GitHub Wiki文档 插件安装 把下载好的插件放在自己新建项目的Plugins文件夹下,编译启动 快速入门 萌新看的图文教学 老手看的文档 点击Create的时候,会根据填写的模块名字生成路径 语法汇总 模块导入 与路径对应即可 local Common = require "Core.Common" 多行字符串 官方静态方法调用 UE.类名.静态方法名字 nil代表无效值空值未定义的值 蓝图方法调用 self:XXXFunction() 输出结果:这是我的蓝图测试 重载蓝图中的方法 function M:XXXFunction()) end 输出结果:M:TestFunction 主动调用被重载的蓝图方法 self.Overridden.XXXFunction() 输出结果: 这是我的蓝图测试 M:TestFunction 输入绑定 function M:LeftMouseButton_Pressed() end 实例:绑定按键并打印它的名字 local M = UnLua.Class() local PrintString = UE.UKismetSystemLibrary.PrintString local function Print(text) PrintString(nil, text, true, false, UE.FLinearColor(1, 1, 1, 1), 100) end function M:ReceiveBeginPlay() local msg = [[ 来试试以下输入吧: 字母、数字、小键盘、方向键、鼠标 ]] Print(msg) end local function SetupKeyBindings() local key_names = { -- 字母 "

高性能Web服务器-Nginx的常用模块

文章目录 Nginx安装Nginx平滑升级与回滚平滑升级流程第1步,下载新版本第2步,编译第3步,执行make第4步,对比新旧版本第5步,备份旧nginx二进制文件第6步,模拟用户正在访问nginx第7步,替换旧的nginx二进制文件第8步,发送USR2信号第9步,发送winch信号,第10步,平滑关掉旧版本的master进程 Nginx核心配置主配置文件结构全局配置指定响应报文server首部 实现多虚拟主机root和aliaslocation配置Nginx账户认证Nginx自定义错误页面自定义错误日志检测文件是否存在 Nginx高级配置Nginx状态页Nginx第三方模块Nginx变量使用 Nginx自定义访问日志自定义默认格式日志 Nginx压缩功能Https功能Https实现过程 Rewrite相关功能Rewrite应用背景rewrite模块指令return rewrite案例:自动跳转https动态匹配跳转break和last Nginx防盗链Nginx反向代理实现Http反向代理Nginx和LVS的区别502和504的区别动静分离请求proxy_pass有无“/”的区别 Http反向代理负载均衡upstream配置参数hash调度算法 负载均衡调度算法 Nginx安装 脚本安装 #!/bin/bash # #******************************************************************** #Author: wangxiaochun #Date: 2020-12-01 #FileName: install_nginx.sh #URL: http://www.wangxiaochun.com #Description: The test script #Copyright (C): 2021 All rights reserved #******************************************************************** SRC_DIR=/usr/local/src NGINX_URL=http://nginx.org/download/ NGINX_FILE=nginx-1.20.2 #NGINX_FILE=nginx-1.18.0 TAR=.tar.gz NGINX_INSTALL_DIR=/apps/nginx CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'` . /etc/os-release color () { RES_COL=60 MOVE_TO_COL="echo -en \\033[${RES_COL}G" SETCOLOR_SUCCESS="echo -en \\033[1;32m" SETCOLOR_FAILURE="echo -en \\033[1;31m" SETCOLOR_WARNING="echo -en \\033[1;33m" SETCOLOR_NORMAL="echo -en \E[0m" echo -n "

Rust 跨平台-Android 和鸿蒙 OS

1. 安装 rustup rustup 是 Rust 的安装和版本管理工具 $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh 该命令会安装 rusup 和最新的稳定版本的 Rust;包括: rustc Rust 编译器,用于将 Rust 代码编译成可执行文件或库。 cargo Rust 的包管理器和构建工具,用于管理项目依赖、编译项目、运行测试等。 rustfmt 代码格式化工具,用于自动格式化 Rust 代码以符合官方风格指南。 clippy 静态分析工具,用于捕捉常见错误和改进代码质量。 其他工具,如rustdoc用于生成文档等。 成功后控制台会输出:Rust is installed now. Great! macOS 系统上需要安装:xcode-select --install cargo 在开发中较为常用,算是打交道最多的工具之一 2. 标准库 Rust Standard Library 标准库是 Rust 编程语言的官方库,提供了一系列预先编写好的类型和函数,用来处理常见的任务,如: 基本数据类型(比如i32, u64, f32等)。 集合类型(如Vec<T>, HashMap<K, V>等)。 输入/输出(I/O)操作,包括文件操作和网络编程。 线程和并发编程工具。 其他有用的工具,如字符串处理、日期和时间操作等。 渠道 通常情况下安装 rustup 的时候,标准库就已经安装到本地;但是 rust 有几种发布渠道,用于提供不同稳定程度的 Rust 版本,Rust 的三个主要发布渠道是:

【MySQL基础篇】概述及SQL指令:DDL及DML

数据库是一个按照数据结构来组织、存储和管理数据的仓库。以下是对数据库概念的详细解释: 定义与基本概念: 数据库是长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据库不仅仅是数据的简单堆积,而是遵循一定的规则和模式进行组织和管理的。 数据库中的数据可以包括文本、数字、图像、音频等各种类型的信息。 数据库的作用: 数据库作为计算机系统中最重要的组件之一,被广泛用于各种应用程序和业务领域。 数据库能够高效地管理和处理大量数据,提供数据的存储、查询、更新和删除等功能。 名称全称简称数据库存储数据的仓库,数据是有组织地进行存储DB数据库管理系统操纵和管理数据库的大型软件DBMSSQL操作关系型数据库的编程语言,定义了一套操作挂机呢习性数据库统一标准SQL 数据模型: 关系型数据库(RDBMS) 概念:建立在关系模型上,由多张相互连接的二维表组成的数据库。 特点: 1、使用表存储数据,格式统一便于维护 2、使用SQL语言操作,便于统一,使用方便 1、SQL通用语法 1、SQL语句可以单行或多行书写,以分号结尾。 2、SQL可以使用空格/缩进来增强语句的可读性。 3、MySQL数据库和SQL语句不区分大小写,关键字建议使用大写 4、注释: · 单行注释:--注释内容 或 # 注释内容(MySQL独有) · 多行注释:/*注释内容*/ 2、SQL分类 分类全称说明DDLDate Definition Language数据定义语句,用来定义数据库对象(数据库、表、字段)DMLDate Manipulation Language数据操作语言,用于对数据库表中的数据进行增删改DQLDate Query Language数据查询语言,用于查询数据库中表的记录DCLDate Control Language数据控制语言,用于创建数据库用户、控制数据库的访问权限 3、DDL · DDL - 数据库操作 查询: 查询所有数据库: show databases; 查询当前数据库 select database(); 创建 create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则]; 删除 drop database [if exists] 数据库名; 使用 use 数据库名;

华为笔记本电脑d盘数据丢失:原因、恢复方案与防范建议

华为笔记本电脑以其高性能和稳定的品质赢得了众多用户的青睐,但即使是如此优质的设备,也难免遭遇数据丢失的困境。本文将围绕华为笔记本电脑D盘数据丢失这一问题,探讨其常见原因、恢复方案,并提出未来防范的建议,以帮助广大用户更好地保护自己的数据。 图片来源于网络,如有侵权请告知 一、华为笔记本电脑D盘数据丢失的常见原因 误操作:在日常使用中,我们可能会因为误删除、误格式化等操作而导致D盘数据丢失。 病毒攻击:电脑病毒是数据丢失的一大元凶,它们可能会隐藏或删除D盘中的文件。 系统故障:操作系统出现故障时,可能会导致D盘数据丢失或无法访问。 硬盘损坏:硬盘老化、损坏或物理撞击等因素也可能导致D盘数据丢失。 二、华为笔记本电脑D盘数据恢复方案 方案1:使用撤销操作 华为笔记本删除的文件怎么恢复?如果您刚刚删除了文件且还没有进行其他操作,可以尝试使用“Ctrl+Z”来撤销删除操作以恢复D盘数据。 方案2:回收站恢复 如果上述方法无效,我们可以尝试在回收站中找回。Windows回收站数据恢复方法可参考以下步骤: - 在华为笔记本桌面或文件资源管理器中找到“回收站”,并双击打开。 - 在回收站中,会看到被删除的文件和文件夹的列表。浏览列表,找到误删除文件。 - 右键单击想要恢复的文件,选择“还原”选项,这将把文件恢复到其原始位置。 方案3:检查隐藏文件 如果没有删除数据,但是华为电脑D盘数据丢失怎么办?这时我们可以检查D盘是否存在被隐藏的文件。如果文件被隐藏起来了,您可以通过以下步骤显示它们: - 进入D盘管理界面,在菜单栏中点击“查看”选项。 - 勾选“隐藏的项目”来显示隐藏的文件或文件夹。 方案4:使用专业软件 如果您不确定数据怎么丢失的,在数据重要的情况下,建议尽快使用像云骑士数据恢复这样专业的软件,其具有简单易用的界面和强大的恢复功能,支持从各种存储介质(如硬盘、U盘、存储卡等)中恢复数据。 当您不确定“电脑D盘数据丢失能找回吗”,可通过它提供的免费扫描和预览功能预判可恢复性,为尽可能的找回数据,请停止对D盘的写入操作,然后参考以下步骤进行恢复: - 启动在D盘以外已正确下载安装好的软件,选择合适的恢复模式,如场景模式中的“误删除文件”,勾选D盘后点击“开始扫描”。 - 等待自动扫描结束后,根据文件名、文件大小、文件类型、文件路径等方式筛选,然后通过双击或预览模式预览内容。 - 确认预览无误后勾选上,点击“立即恢复”按钮,将数据另存到D盘以外的磁盘上即可查看恢复出来的数据。 方案5:寻求线下帮助 若存在硬盘的物理性损坏或系统不认盘等问题,自行恢复数据难度较大。此时,建议寻求信誉良好、经验丰富的线下专业公司或工程师进行恢复。选择时,确保数据恢复公司或机构在报价时透明,明确列出各种可能的服务费用。避免遇到隐藏费用或后期加价的情况。 图片来源于网络,如有侵权请告知 三、防范华为笔记本电脑D盘数据丢失建议 定期备份数据:可将数据备份到云盘、移动硬盘或其他存储设备中,以防万一。 安装杀毒软件:安装杀毒软件可以保护电脑免受病毒攻击,降低数据丢失的风险。 注意操作规范:在日常使用中,要注意操作规范,避免误删除、误格式化等操作。 检查硬盘健康:定期使用硬盘检测工具检查硬盘健康状况,及时发现并处理潜在问题。 结尾: 数据丢失是我们在使用电脑过程中难以避免的问题,但只要掌握了正确的恢复方法和防范措施,相信能够降低数据丢失的风险并较大程度地保护自己的数据。希望本文所介绍的内容能够为广大华为笔记本电脑用户提供帮助和启示,让我们共同守护好自己的数字资产。 推荐阅读: u盘插到另一台电脑上数据丢失怎么办?提供实用的解决方案 行车记录仪怎么清除内存卡数据?数据清除指南 内存卡数据移走了怎样恢复?简易步骤与解决方案

vmware安装macOS11苹果系统教程 | vmware虚拟机安装macos12 | vmware虚拟机安装macos13 | vmware虚拟机安装macos14 | 附带macOS成品压缩包!

本教程使用vmware17进行安装,需要进行unlocker解锁后方可运行。 解锁工具(MK-Unlocker + Unlocker_v3.0.3) 链接:https://pan.baidu.com/s/1lXzyW2YRui_OJzVGtOWPJA 提取码:txgp 优化卡顿工具(beamoff) 链接:https://pan.baidu.com/s/1ceag0nXeBgv-OT_CkriXaQ 提取码:y7vh macOS ISO镜像下载:(版本集合) macOS系统各版本发布日期时间及Mac系统下载集合 - 苹果系统之家https://macoshome.com/macos/7947.html 我们以安装14版本来做演示,其余版本操作步骤是一样的。如果你觉得自己安装耗费时间及精力,可以获取下方成品包,解压后,导入即可开机使用,方便快捷。 VMware17 Pro虚拟机安装macOS成品,解压即用,导入后直接开机使用!https://gf.bilibili.com/item/detail/1105455046 安装步骤: 新建虚拟机,选择典型安装 点击下一步,选择对应的ISO镜像文件 点击下一步,选择Apple Mac OS,版本选择对应ISO文件版本,我这里选择14即可 点击下一步,取一个名称,选择存储位置,可自定义。接着一直点下一步后面点完成即可,也可根据实际情况修改虚拟机硬件配置。 然后我们直接点击开启虚拟机 选择简体中文安装 点击磁盘工具 鼠标左键单击VMware Virtual SATA选中这个磁盘,然后点击抹掉 给磁盘取一个名称,可根据自己的喜欢填写,我这里直接填Data 点击抹掉 稍等片刻后,点击完成,然后左边点×关闭窗口 这个时候再选择安装macOS,点击继续 跳到许可协议后,点击同意,然后选中磁盘,这个时候就自动进行安装了,安装速度根据电脑配置而定,我的电脑一般半小时内完成,也遇到过一两个小时的,所以如果嫌时间太久太麻烦,可以下单我上面的成品包,解压后直接导入就能开机使用。 安装完成后,将自动重启,开机后进行一些系统设置。首先我们选择大陆地区,点击继续 点击继续 点击以后 点击继续 点击以后 点击稍后继续,点击跳过 点击同意 设置用户名称,及密码,点击继续 建议勾选定位功能,方便后续的一些功能选择 去掉这个勾,点击继续 选择你喜欢的外观,点击继续 到这步就算是基本完成了,我们就开启系统进入桌面了。系统已经安装完成,可以选中光盘,进行推出 推出以后我们点击左上角的vm菜单,进行vmtool的安装 点击安装vmtool 输入我们刚才设置的密码进行安装 提示需要重启才能生效,这里我们不用管,重新返回vmtool点击安装即可,安装完成后再点击重新启动 重新进入系统后,就可以跟着vmware的窗口自适应大小了 好了,到这里就安装结束了。 如果你觉得自己安装耗费时间及精力,可以获取下方成品包,解压后,导入即可开机使用,方便快捷。 VMware17 Pro虚拟机安装macOS成品,解压即用,导入后直接开机使用!https://gf.bilibili.com/item/detail/1105455046 成品包导入教程: vmware安装macOS苹果系统教程,macOS成品压缩包,解压即用,免安装!

seatunnel-web本地安装教程(超详细)

文章目录 1. 引言2. 后端打包部署2.1 打包2.2 启动SeaTunnel Zeta Engine 服务2.3 其它 3. web端打包部署3.1 初始化数据库3.2 打包配置3.2 启动服务 4. 报错汇总4.1 JWT SecretKey长度问题4.2 Cannot load driver class: com.mysql.cj.jdbc.Driver4.3 spotless校验报错4.4 maven依赖报错4.5 seatunnel无法加载源名称列表 5. 文末 1. 引言 官方安装教程:https://github.com/apache/seatunnel-web 本文为 seatunnel-web 的本地安装教程,如果直接参考官网官方的教程去安装,可能会有一些奇奇怪怪的问题,所以博主在本文详细记录安装的步骤,以便有需要的同学参考。 安装 seatunnel-web 按如下步骤执行: 编译打包 seatunnel 源码(2.3.3-release分支),启动SeaTunnel Zeta Engine服务;初始化 seatunnel-web 数据库脚本;编译打包seatunnel-web源码(main分支),配置启动参数和环境变量,启动web server以及前端。 2. 后端打包部署 首先需要打包部署后端工程,可以直接下载安装包或从源码构建: 安装包地址:https://seatunnel.apache.org/download源码地址:https://github.com/apache/seatunnel.git 为了让大家更进一步的去理解,本文使用的是源码的方式构建。 2.1 打包 首先需要打包。IDEA导入源码后,IDEA导入并切换到 2.3.3-release 稳定版分支(备注:因为seatunnel-web项目的main分支默认使用的seatunnel版本也是为2.3.3版本,所以这里使用2.3.3版本)。 进入项目根目录终端执行打包命令: mvn -U -T 1C clean install -DskipTests -D"maven.test.skip"=true -D"maven.javadoc.skip"=true -D"checkstyle.skip"=true -D"license.skipAddThirdParty" 或直接使用IDEA打包:

【全网最完整】Open CASCADE Technology (OCCT) 构建项目,QT可视化操作,添加自定义测试内容

前言 1、项目所需工具下载 2、使用CMake编译源码 3、配置项目运行环境 4、如何自定义测试项目 5、总结 前言 本文为了记录自己在实习的过程中,学习到的有关OCCT开源项目的搭建工作,旨在教会小白从0开始下载开源项目及环境搭配,以及如何添加自定义测试内容,最终结果展示如下: 1、项目所需工具下载 本项目共需要使用四个工具,分别是OCCT开源代码,QT环境,CMake构建工具,VS2019,版本也会介绍。我会把CMake、VS2019、第三方库放到Github链接里​​​​​https://github.com/shadow0fiend/OCCT-Project,OCCT源码以及QT环境需要自己下载 其中下载链接如下: OCCT(7.8或7.6或7.5皆可):Download - Open CASCADE Technology 第三方库及VS2019:GitHub - shadow0fiend/OCCT-Project: 构建OCCT项目 QT工具(5.14.2):Index of /archive/qt CMake(3.29.3):Download CMake 其中安装过程如下: OCCT:下载64位的压缩包,解压到本地即可。 QT:对于新手,建议在勾选下载内容的时候全部选上(简单粗暴,不会缺少东西) 详情下载过程请参考链接:Qt5.14.2安装、配置及测试(Win10)-CSDN博客 CMake:无脑下一步即可 详情下载过程请参考链接:Windows下Cmake安装步骤详解(图文)_windows终端安装cmake-CSDN博客 安装完以后,本地应该有以下几个内容,注意检查cmake-gui、OCCT源码、编译用的三方库(下图product)、QT环境、VS2019 2、使用CMake编译源码 步骤1:在OCCT源码中建立一个build文件夹,用于存放编译后的文件 步骤2:打开CMake-gui,第一个位置填入OCCT源码文件夹的路径,第二个位置填入刚才创建好的build文件夹的路径 步骤3:点击configure,选择配置vs2019,x64,点击finish 步骤4: 第一步,在3RDPARTY_DIR这一行,填入第三方库文件的路径,也就是product的路径。 第二步,然后勾选上BUILD_SAMPLES_QT这一行。 第三步点击config。 步骤5: 第一步,修改QT路径,这个Qt5.14.2是安装完QT以后的文件夹,自行在里面找对应的文件(如果没有找到,应该是QT安装下载的时候,有的选项没有勾上) 第二步,改完以后点击config,点击generate,点击open project 步骤7:cmake配置完毕,最终配置结果如下所示 3、配置项目运行环境 生成的项目如下所示(如果没有勾选QT,那么编译完成以后的项目是不包含Samples文件的,只有非常简陋的可视化界面): 步骤1:鼠标右击OCCTOverview,设置OCCTOverview为启动项。 步骤2:鼠标右击OCCTOverview,依次找到属性、Debugging、environment,将以下内容粘贴进去,这是配置项目环境变量的。注意:需要将路径修改为自己电脑的路径。 配置解释: CASROOT需要配置OCCT源码文件夹 CSF_OCCT都是OCCT源码文件夹里面的文件 最后一行是配置QT的bin,QT的platforms,第三方库文件freetype,freeimage CASROOT=E:\cpp\code\OCCT\OCCT-7_8_0 CSF_FPE=0 CSF_OCCTResourcePath=E:\cpp\code\OCCT\OCCT-7_8_0/src CSF_OCCTDataPath=E:\cpp\code\OCCT\OCCT-7_8_0/data CSF_OCCTSamplesPath=E:\cpp\code\OCCT\OCCT-7_8_0/samples CSF_OCCTTestsPath=E:\cpp\code\OCCT\OCCT-7_8_0/tests CSF_OCCTDocPath=E:\cpp\code\OCCT\OCCT-7_8_0/doc QT_DEBUG_PLUGINS=1 PATH=%PATH%;D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\bin;D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\plugins\platforms;E:\cpp\code\OCCT\products\freetype-2.5.5-vc14-64\bin;E:\cpp\code\OCCT\products\freeimage-3.17.0-vc14-64\bin; 步骤3:复制 D:\Qt\Qt5.14.2\5.14.2\msvc2015_64\plugins 路径下的platforms文件,粘贴到 E:\cpp\code\OCCT\OCCT-7_8_0\build\win64\vc14\bind (生成的build文件里)路径下,如果要在release下运行,则将其粘贴到 E:\cpp\code\OCCT\OCCT-7_8_0\build\win64\vc14\bin路径下。 步骤4:编译运行即可完成。

MySQL内存使用率高且不释放问题排查与总结

背景 生产环境mysql 5.7内存占用超过90%以上,且一直下不来。截图如下: 原因分析 1、确定mysql具体的占用内存大小,通过命令:cat /proc/Mysql进程ID/status查看 命令执行后的结果比较多(其他参数的含义想了解可参考这个博客:Linux 进程的 status 注解。_rssanon-CSDN博客),重点看VmRSS参数发现使用了120G左右。 看到此处有必要延申一个知识点。innodb_buffer_pool_size 一、innodb_buffer_pool_size作用 InnoDB存储引擎是MySQL中最常用的存储引擎之一,它使用内存缓存池(buffer pool)来缓存表中的数据和索引等信息。通过调整innodb_buffer_pool_size参数的大小,可以控制InnoDB存储引擎能够利用的内存空间,进而影响其缓存的数据量和索引数量。 innodb_buffer_pool_size设置的值较大时,InnoDB存储引擎能够缓存更多的数据和索引,从而减少磁盘I/O的次数,提高数据库的访问速度和性能。相反,如果缓存池设置过小,可能会导致频繁的磁盘I/O操作,影响数据库性能。 一般为物理内存的60%-70%。 二、查看当前配置的pool_size: SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; 发现结果是64G(配置文件也可查看),这里就发现问题:实际使用的内存量比配置的量多出了60G左右。 暂且把64G当成正常占用多出来的当成异常占用分析。 三、performance schema内存占用量分析 show engine performance_schema status; 查看结果中的最后一行。发现占用了200多M。 四、排查MySQL为当前session会话分配的内存 查看session级别的buffer和cache占用内存大小。 show variables where variable_name in ('binlog_cache_size','join_buffer_size','read_buffer_size','read_rnd_buffer_size','sort_buffer_size') 结果如下: 总共加起来接近800M。 里边每个值的含义和作用参考:MySQL session相关的内存设置_mysql为当前session会话分配的内存-CSDN博客 查看当前活跃的连接数 SELECT * FROM information_schema.processlist WHERE command != 'Sleep'; 结果显示差不多只有9个,加入每个都分配了全量的会话内存,则差不多就是9G。(实际分配了多少需要根据当前会话执行的SQL判断,比如有无使用到排序、有没有使用join等)。上边的算完顶多才10G,还有50多G的消耗,也就意味着还有其他的占用。 五、排查当前临时表占用内存情况 查看tmp_table_size临时表配置的内存大小: 线程级别参数,实际限制从 tmp_table_size 和 max_heap_table_size 两个变量的的值中取较小值。 show variables where variable_name in ('tmp_table_size','max_heap_table_size') 补充知识点一:临时表 如果内存中的临时表超出限制,MySQL自动将其转换为磁盘上的MyISAM表。如果要执行许多 GROUP BY查询,可以增加tmp_table_size的值(或如有必要,也可以使用max_heap_table_size)。

从万里长城防御体系看软件安全体系建设@安全历史03

长城,是中华民族的一张重要名片,是中华民族坚韧不屈、自强不息的精神象征,被联合国教科文组织列入世界文化遗产名录。那么在古代,长城是如何以其复杂的防御体系,一次次抵御外族入侵,而这些防御体系又能给软件安全行业以什么启示呢? 多层次防御,成体系建设 长城的防御体系是一个由城墙、敌楼、关城、墩堡、营城、卫所、镇城烽火台等多种防御工事所组成的完整体系,由点到线、由线到面,把长城沿线的隘口、军堡、关城和军事重镇连接成一张严密的网,来犯的敌人难以越过多层次的安全屏障,只能望“墙”兴叹。 在软件安全领域,单一的防护手段往往只能防御某一类型的威胁或攻击,而无法对所有潜在的安全风险进行有效应对,并产生大量的误报漏报。 因此,企业应采用多层次的防御体系,多种防御策略并举,组成一道道“安全城墙”,以应对多样化的网络攻击方式,系统化保障软件安全。 严密监控,迅速响应 长城的烽燧系统是古代中国用于远距离军情报警的重要设施,在防御体系中扮演着举足轻重的角色。当有敌情发生时,烽火台会立即点燃烽火或放烟进行报警,通知援军,为边疆防御提供了有力保障。 而在软件系统中,如果漏洞在产生后不能及时发现并修复,后期将对系统的安全性、稳定性及业务连续性造成很大影响。 因此,及时发现安全威胁并迅速响应至关重要,企业应建立监控机制和应急响应机制,并迅速采取修复行动,将新产生的危机扼杀在摇篮中,避免安全缺口的进一步扩大。 集中管理,分散防御 长城的关城是防线上最为集中的防御据点,而城墙、敌楼等则分散部署,打造出了一套集中管理+分散防御的模式。关城作为防线上的战略要地,将防御力量集中于这些关键点,能够更有效地抵御敌人的进攻。城墙和敌楼等分散部署的设施,将防御范围扩大,相互配合保持防御状态,减缓敌人的进攻速度,并为反击创造机会。 在安全建设中,也应采取与长城类似的集中式的安全管理与分散安全防护措施相结合的策略。DevSecOps中的流水线管理平台类似于长城防线上的关城,负责全局的安全策略制定、监控、管理和响应。而分散的安全防护措施分布在开发过程各个关键部位,高效协作,相互支援,配合防御不同类型的攻击、漏洞,打造高效、安全的研发体系。 翻开历史课本,世界奇迹万里长城纵横高山峻岭,于塞北边疆抵御外敌,保家国固若金汤。如今步入信息时代,捍卫国家安全的“长城”也不仅仅停留于“有形”。在防御理念上,长城也能给我们以深刻启发,推动企业建立牢不可摧的安全防御体系,筑造软件安全的“万里长城”。 推荐阅读 从东汉的衰亡中,我们能学到什么软件安全知识? @安全历史02 从故宫修建看「软件物料清单」的重要性 @安全历史01

RabbitMq的五大消息模型及Java代码演示

RabbitMq一共有6种消息模型,分别为: 1.基本模型(Hello World) 2.消息分发(工作队列)模型(Work queues) 3.Fanout订阅模型-消息订阅模式(Publish/Subscribe) 4.Direct订阅模型-路由模式(Routing) 5.Topic订阅模型-匹配模式(Topic) 6.RPC模式(RPC) 而其中的RPC模式,它并不完全属于消息队列(MQ)的定义,而是使用MQ的某些功能来实现RPC的效果。 所以简单的介绍下以下五种消息模型: 一.基本模型(Hello World) 1.这是个非常简单的模型,即一个生产者发送消息到一个队列,一个消费者从该队列中接收并处理消息。 2.主要适用于RabbitMq的测试和日常我们学习的场景,在需要快速搭建轻量级消息队列系统的应用中,简单模式也是个很好的选择。 代码实现: 在RabbitMq的webUI界面去创建,为了方便我直接在RabbitMq管理页面创建一个名为basic1的队列(我们也可以在Java代码中去配置queue,交换机及其绑定,为了方便展示用了管理页面) 用postMan请求,生产者发送消息 package com.org.product.controller; import com.org.product.config.MqProductCallBack; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.MessageDeliveryMode; import org.springframework.amqp.rabbit.connection.CorrelationData; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * Created with IntelliJ IDEA. * @Author: 你的名字 */ @RestController @RequestMapping("/product") @Slf4j public class PushMessageController { @Resource private RabbitTemplate rabbitTemplate; @Resource private MqProductCallBack mqProductCallBack; @GetMapping("/basic") public String basic(){ log.info("-------------消息推送开始--------------"); //创建CorrelationData对象,包含唯一id,id的作用是在回调函数中识别消息,也就是根据id跟踪这条消息 CorrelationData correlationData = new CorrelationData("

性能测试 —— Jmeter日志查看与分析

一、Jmeter日志概览 Jmeter日志文件保存在bin目录中,名称为jmeter.log。我们可以在面板中直接察看日志,点击右上角黄色标志物可以打开日志面板,再次点击收起 另外,Jmeter可以很方便地设置日志输出级别: 通过这种方式修改日志级别,只是临时修改,不会改变配置文件中的值。当Jmeter重启后,又会恢复为默认的日志级别。在Jmeter/bin 路径下打开 log4j2.xml文件,修改日志级别,这里修改是永久性修改通过修改Root level 值改变日志级别,该修改是永久性的。对Jmeter 的GUI页面运行脚本和命令模式运行脚本都会生效。 二、Jmeter自定义日志 前面所看到的都是系统日志,也就是JMeter本身所打印的日志。如果我们自己想输出一些日志,该怎么办呢?这个一般就要借助Beanshell了。 在实际项目中,将JMeter脚本部署到Linux服务器上进行压力测试,存在一些日志详情查看的不便之处: 1、吞吐量统计中包括了所有请求,包括一些辅助请求(beanshell请求),导致真正的tps统计数据不准确; 2、业务是否成功,以及具体失败原因难以排查; 这就需要用到beanshell下的自定义日志。log.info,log.error,如用log.error()打印错误信息 import org.apache.log4j.Logger; // 获取接口的响应数据 String result = prev.getResponseDataAsString(); if(result.contains("error")){ Failure=true; log.error("接口失败: " + result); } 当然,自定义日志最重要应用场景还是在Linux服务器上压测时,方便查看日志信息(因linux上无图形化界面) 比如,获取orderid时脚本 import org.apache.log4j.Logger; // 获取接口的响应数据 String result = prev.getResponseDataAsString(); // 从JSON提取器中获取code和orderId String code = vars.get("code"); String orderId = vars.get("orderId"); if(code.equals("0")){ log.info("place order success, orderId=" + orderId); }else{ Failure=true; log.error("FailureMessage: " + result); } 将该脚本上传到Linux中,顺便写个启动脚本:startup.sh #!/bin/bash jmeter_log=/home/xxx/jmeter.log if [ -f "

国内 10 款主流语言大模型综合能力测评 包括文心一言、Kimi、豆包

很多国产的语言大模型在语言运用能力方面表现出色,特别是在特殊的语境中。测评中的语言大模型包括了: 阿里的通义千问。其表现最为突出,被作者称为"吵架Top AI",不仅能生成尖锐、刻薄的回复,还能创造图像内容,展现了强大的多模态能力。 商汤的商量模型虽然没有表现出强烈的攻击性,但展现了更贴近人性的特质,。 其他模型如百度文心一言、腾讯元宝、字节豆包等也都展现出了不同程度的语言运用能力,能够理解复杂的语境并生成相应的回复 还有一个专门用于吵架的GPT模型,其表现也非常出色,被称为"阴阳怪气界的神",显示了AI在特定语言场景下的强大适应能力。 这些模型能够准确抓住对方的逻辑漏洞,并进行"阴阳怪气"的输出,展现了它们在语言理解和生成方面的高水平。 总的来说,这个实验虽然是以一种轻松幽默的方式进行,但也侧面反映了国产语言大模型在复杂语言场景下的处理能力。它们不仅能理解上下文,还能生成符合特定风格和要求的内容,展现了相当高的语言运用水平。然而文章也强调,这些AI模型的主要目的是协助用户完成任务,提供信息和解决问题,而不是制造冲突。 详细测评请查看原文:国内 10 款主流语言大模型吵架大比拼 冠军花落谁家

计算机网络课程实训:局域网方案设计与实现(基于ensp)

文章目录 前言基本要求操作分公司1分公司2总部核心交换机配置实现内部服务器的搭建acl_deny部分用户与服务器出口出口防火墙配置 前言 本篇文章是小编实训部分内容,内容可能会有错误,另外ensp对电脑兼容性及其挑剔,在使用之前一定要安装好。!!!内容仅做参考!!! 基本要求 公司有公司总部,另有两个分公司,申请到22.22.22.0/27,网关22.22.22.1的公网IP地址,总部大约有10台内部服务器,5台财务服务器,100名员工,20名财务人员;分公司1有150名员工,5名财务人员;分公司2有200名员工,8名财务人员。 要求: 1、 总部、分公司1和分公司2的员工和财务人员使用的计算机分别有独立的广播域,内部服务器和财务服务器也有独立的广播域。 2、 员工的计算机能够访问互联网,财务人员的计算机、内部服务器和财务服务器不可以访问互联网。 3、员工、财务人员使用的计算机都可以访问内部服务器和财务服务器,并且相互可以访问。 根据下面给出的整体拓扑图,规划、设计出某公司的网络,并在ENSP模拟器中给出具体的配置。 操作 分公司1 财务clinet配置IP为192.168.110.2: 员工pc1配置192.168.100.2: 1_5700的GE0/0/2配置接口vlan110 地址为192.168.110.1/24 1_5700的GE0/0/3配置接口vlan100 地址为192.168.100.1/24 1_5700的GE0/0/4配置接口vlan120 地址为10.10.10.1/30 <Huawei>system-view int vlanif 100 ip address 192.168.100.1 24 int vlanif 110 ip address 192.168.110.1 24 int vlanif 120 ip address 10.10.10.1 30 进入接口配置: int g 0/0/2 port link-type access port default vlan 110 int g 0/0/3 portlink-type access port default vlan 100 int g 0/0/4 port link-type access ​​​​​​​port default vlan 120 配置静态默认路由:

java设计模式(七)适配器模式(Adapter Pattern)

1、模式介绍: 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另外一个接口。适配器模式通常用于需要复用现有的类,但是接口与客户端的要求不完全匹配的情况。它包括两种形式:类适配器模式和对象适配器模式。 2、应用场景: 系统需要使用现有的类,而这些类的接口不符合需求。 不想修改现有的接口,而又需要复用该接口的情况。 多个类似功能的接口需要统一。 3、优点: 增加了类的透明性和复用性:将具体的实现封装在适配器中,对客户端来说是透明的,同时提高了被适配类的复用性。 灵活性好:通过适配器,可以在不改变原有代码的基础上增加新的适配器类,符合开闭原则。 4、缺点: 过多使用适配器,会让系统非常零乱。 增加系统的复杂性:因为增加了额外的适配器,可能会增加系统的理解难度 5、代码实现: /** * 适配接口 * * @author FM_南风 * @date 2024/6/27 13:53 */ public interface MediaPlayer { void play(String mediaType, String fileName); } /** * 被适配者 * * @author FM_南风 * @date 2024/6/27 13:54 */ public class AudioPlayer implements MediaPlayer{ @Override public void play(String mediaType, String fileName) { if (mediaType.equalsIgnoreCase("mp3")) { System.out.println("播放MP3文件: " + fileName); } else { System.

如何将 iPhone Mirroring (镜像) 到 Mac 电脑 - iOS 18 新功能

Apple 发布了 iOS 18 和 macOS 10.15 Sequoia 的第二个测试版,新增 iPhone 镜像功能。这个功能允许你通过 Continuity 镜像并完全控制 iPhone。 本文教你如何将 iPhone Mirroring (镜像) 到 Mac 电脑上,介绍了使用 iPhone Mirroring 功能需要注意的事项,它的操作方式和快捷键,以及该功能能做什么不能做什么,还有使用此功能时的常见问题解答 详情请查看原文:如何将 iPhone Mirroring (镜像) 到 Mac 电脑 - iOS 18 新功能

一键生成AI动画视频?Animatediff 和 ComfyUI 更配哦!

大家好我是极客菌! 之前我分享过 Animatediff 在 WebUI 中的应用,最近不是在分享 ComfyUI 嘛,那我们也来讲讲 Animatediff 在 ComfyUI 的应用。 如果从工作流和内存利用率的角度来说,Animatediff 和 ComfyUI 可能更配一些,毕竟制作动画是一个很吃内存的操作。 好了,话不多说,我们开干。 首先,我们需要在管理器中下载 Animatediff 插件,当然也可以直接导入听雨的工作流,然后在管理器的安装缺失节点中直接安装 后续用到的工作流和模型(可以文末自行扫描获取) 安装完插件以后,记得重启 ComfyUI 哦。 然后把网盘中对应的模型放入指定的文件夹目录下,v2 开头的文件放入以下文件夹下。 \ComfyUI_windows_portable\ComfyUI\custom_nodes\comfyui-animatediff\loras 然后把网盘中 models 中的文件放入以下目录: \ComfyUI_windows_portable\ComfyUI\custom_nodes\comfyui-animatediff\models 以上就是 Animatediff 在 ComfyUI 中的安装步骤了。 使用方式也很简单了,只需要导入不同的工作流就可以体验 Animatediff 的不同用法。 我们先来一个最简单的工作流。只是通过文本来生成动漫效果。 虽然可以直接无脑用工作流文件,但是我们还是把 Animatediff 相关的几个工作流节点简单介绍一下。第一个节点动态扩散组件加载器,主要就是 Animatediff 的算法模型了,里边的模型都可以选,小伙伴们可以看看不同模型的动漫效果,选择一个自己最喜欢的。 第二个节点,基本的参数,用过 WebUI 的小伙伴应该都清楚,听雨这里就不讲了,我们把 Animatediff 相关的几个参数再介绍一下。 运动模块对应的就是动态扩散组件加载器。他们是需要连接的,不过工作流里已经连接好了。 **sliding_window_opts:**自定义滑动窗口选项,这个我们后续讲另外一个配置的一起讲。 模块插入方式,选择默认就可以了。 帧数:动画总共包括的画面数量。和后续的帧率是配套使用的。 帧率:每秒多少帧。如果帧数设置为16,帧率设置为8,则单个动画的播放时长为2秒。 循环次数:循环播放几次,0 代表一直重复播放。 是否保持:是否把动画保存到本地。 格式:输出的动漫的格式。默认输出 gif 格式,如果要输出视频格式的话,需要配合 ffmpeg 使用。 纯粹文本生成的动画可控性还是蛮差的。 — 第二点,我们来讲下动态滑动窗口。 **动态滑动窗口:**能够在没有帧长度限制的情况下生成 GIF。它可以将总帧数拆分成多个批次生成,每个批次之间会有重叠的地方。主要是针对我们内存不够,但是又想要生成足够长的动画情况下使用。 上下文帧长度:每个窗口的帧数,官方建议默认 16 帧,不过模型有长度上限设置,有些模型,最高只能设置 24 帧。