Java+Swing+dat文件存储实现学生选课管理系统

Java+Swing+dat文件存储实现学生选课管理系统 一、系统介绍二、系统展示1.用户登陆、注册2.课程信息查询3.添加课程4.选课5.退课 三、系统实现四、其他1.其它系统2.获取源码 一、系统介绍 功能展示:用户注册、用户登陆 课程管理:课程信息的查询、添加、删除 我的选课:查询、退课 二、系统展示 1.用户登陆、注册 2.课程信息查询 3.添加课程 4.选课 5.退课 三、系统实现 StudentClient.java package course; import java.awt.Dimension; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.JTextField; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import course.MainPanel; public class StudentClient { // 定义布局 BorderLayout mainLayout = new BorderLayout(); CardLayout layout = new CardLayout(); JFrame bamFrame; MainPanel mainPanel = new MainPanel();// 主面板 JPanel upPanel = new JPanel();// 主面板中的---上面板 JPanel downPanel = new JPanel();// 主面板中的---下面板 CourseDao coursedao = new CourseDao(); AddCoursePanel addCoursePanel = new AddCoursePanel();//添加课程页面 final Object[] columnNames = {"

当zerotier遇到ipv6

使用zerotier已经相当长一段时间了,之前网络有时不够稳定,后来自己购买了一台云服务器搭建了moon,稍稍稳定了一些。 最近云服务器到期,也没再续期,所以把moon也撤了,似乎对自己的zerotier网络也没什么影响。 但最近发现,从家里笔记本电脑向办公室的ping包延时达到280ms,其他节点之间的网络倒是正常的20-30ms。查看peers时,发现家里的这个节点是需要转发的。 后来似乎想明白一个问题,家里的笔记本是接入了ipv6的,而其他的节点并没有接入ipv6,有ipv6的节点,首先选择的是ipv6网络,这个从listpeers可以看到,而其他节点的公网ipv4怎么可能直接和ipv6的节点通信呢?只能转发。 然后把ipv6协议取消,等待一段时间之后再进行ping测试,延时马上到了20-30ms的正常水平。看来要好好使用zerotier,各个节点最好都在纯ipv4的网络中,ipv4和ipv6的节点,就需要转发了,如果节点都是ipv6网络,组建的网络应该可以直连的,但如果节点都是ipv6了,似乎可以不用zerotier了吧。

【存储数据恢复】esx vmfs的互斥导致存储数据丢失的数据恢复案例

存储数据恢复环境: 某公司的一个信息管理平台,3台ESX SERVER的虚拟机共享一台存储设备,供企业内部使用,存储了公司大量的重要数据文件。 存储故障: 管理员为该存储通过网络连接了一台Windows2003服务器后,这台存储就无法使用了。管理员对存储进行故障检查时发现存储的虚拟磁盘和分区表丢失,重启该存储后故障依旧。由于存储中的数据十分重要且没有备份,管理员不敢擅自进行尝试修复,于是联系我们数据恢复中心进行数据恢复。 存储数据恢复分析: 1、数据恢复工程师对该故障存储中的硬盘进行检测,发现所有硬盘状态正常,没有任何物理故障。 2、经过详细检测以及和管理员的沟通,数据恢复工程师最终确定:导致存储崩溃的原因是通过网络连接的那台Windows2003服务器对storage的独享操作导致存储的VMFS卷损坏。 3、数据恢复工程师分析存储的底层数据发现分区表被清零,有55AA的有效结束标志,有硬盘ID标志。 4、继续分析发现存储中有一个没有数据的N TFS卷,数据恢复工程师分析该卷的BITMAP,发现内容的大小与整个存储占用空间的大小相差无几,在几个不同位置都占有一部分空间,但总占用空间不超过100M。 5、经过仔细分析后,数据恢复工程师发现存储里原来有两个分区:其中第一个分区占80%,第二个分区是第一个分区的扩展分区。在ntfs分区对存储中的数据进行破坏时并没有影响到第二个分区。所以需要数据恢复的主要是第一个分区。 存储数据恢复过程: 1、对存储所有硬盘进行镜像备份; 2、直接连接存储的两个VMFS分区,按照分区的组织方式可以直接提取出vmdk文件和配置文件; 3、提取出文件后通过nfs回迁数据即可进行数据恢复结果自检; 4、自检确认数据没有问题后让管理员来现场亲自进行数据恢复结果验证; 5、管理员验证数据后确认恢复出来的数据没有问题,移交数据。 数据恢复总结: 本案例存储数据丢失原因就是因为光纤环境互斥不当导致了卷在Windows系统下重新做了分区,并且格式化了NTFS和进行了删除分区的操作。由于esx vmfs的互斥是独立于硬件而只依赖于操作系统的,在这里提醒大家:将存储网络接入其他服务器时要注意存储分配权限,以免造成数据丢失。

Dubbo学习之SPI机制

相关阅读 Dubbo学习之自动配置Dubbo学习之PostProcessorDubbo学习之负载均衡策略 简介 本文基于Spring Boot 2.6.6,dubbo-spring-boot-starter 3.0.6环境。 SPI全称为Service Provider Interface,是一种服务发现机制。SPI的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过SPI机制为我们的程序提供拓展功能。 SPI机制在第三方框架中也有所应用,比如Dubbo就是通过SPI机制加载所有的组件。不过,Dubbo并未使用Java原生的SPI机制,而是对其进行了增强,使其能够更好的满足需求。 本文将从以下角度介绍SPI机制; Java SPI;Dubbo SPI;Dubbo SPI自适应拓展; Java SPI 示例 首先定义一个接口demo.spi.Person,代码如下: public interface Person { void saySomething(); } 然后定义两个实现类,demo.spi.Student、demo.spi.Teacher,代码如下: public class Student implements Person { @Override public void saySomething() { System.out.println("I'm a student"); } } public class Teacher implements Person { @Override public void saySomething() { System.out.println("I'm a teacher"); } } 接下来,在项目META-INF/services/目录下创建一个文件,文件名为接口Person的全限定名demo.spi.Person,文件内容为实现类的全限定名,具体如下: demo.spi.Student demo.spi.Teacher 准备好以上内容后,便可以编写代码进行测试Java SPI机制,测试代码如下: public class SpiTest { public static void main(String[] args) { ServiceLoader<Person> serviceLoader = ServiceLoader.

使用 Anaconda 安装 Pytorch

PyTorch介绍: PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。其运行环境已兼容Windows (CUDA,CPU)、MacOS (CPU)、Linux (CUDA,ROCm,CPU)。 PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口,它是由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。 PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。 安装PyTorch: 本文是在电脑安装了 Anaconda 的情况下安装 Pytorch,关于 Anaconda 的安装请参见博文:Anaconda 的安装及使用。 打开 Anaconda Prompt ,先切换镜像源为国内清华镜像源,这样安装包的时候下载速度会快一些,也容易成功一些。 在 Anaconda Prompt 命令行依次输入以下四条命令切换到清华镜像源。 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --set show_channel_urls yes conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ 这个镜像源的配置只要一次,之后无需再配置,配置截图如下。 如果想要切换回默认的镜像源,可以使用如下命令。 conda config --remove-key channels 接下来创建一个名为pytorch的环境,并在环境中安装版本为3.8的python,命令如下(这里安装的python版本根据自己的需要,毕竟 Anaconda 擅长的就是这个)。 conda create --name pytorch python=3.8 在这里停顿后输入 y 即可继续安装。 完成后再次输入下面的命令来查看已有的 Conda 环境信息。 conda info -e 显示结果如下图,可以看到 pytorch 环境已经添加成功了。

pytorch中torchvision.transforms.functional模块中pad函数的使用

torchvision.transforms.functional模块中pad函数的使用 载入torchvision.transforms.functional模块 import torchvision.transforms.functional as tf tf.pad函数包含三项主要参数,分列如下: img:该参数需要输入tensor类型变量,为padding操作的对象padding:该参数指定padding操作的维度,以元组形式输入,从左到右分别对应的padding位置分别为(左,上,右,下)padding_mode:该参数共有四种模式,分别为(constant,edge,reflect,symmetric) 下面将分别对四种padding模式进行代码运行结果展示: import torchvision.transforms.functional as tf import torch t=[[2,3,4],[5,6,7]] #此处需将t的数据类型转为tensor类型 ten = torch.tensor(t) constant mode constant mode代表进行padding操作的tensor变量上进行补零操作 tf.pad(img=ten,padding=(1,1,1,1),padding_mode="constant") edge mode 将边缘的元素进行镜像扩充 tf.pad(img=ten,padding=(1,1,1,1),padding_mode="edge") reflect mode 将第二列以第一列为对称轴进行镜像对称,第二行以第一行为对称轴进行镜像对称,反之,同理。 tf.pad(img=ten,padding=(1,1,1,1),padding_mode="reflect") symmetric mode “Symmetric padding of N-D tensors are not supported yet”

Redis学习之Redisson布隆过滤器

相关阅读 Redis学习之基础知识Redis学习之事件驱动模型Redis学习之Redisson分布式锁看门狗 简介 本文基于Spring Boot 2.6.6、redisson 3.16.0简单分析Redisson布隆过滤器的使用。 布隆过滤器是一个非常长的二进制向量和一系列随机哈希函数的组合,可用于检索一个元素是否存在; 使用场景如下: 解决Redis缓存穿透问题;邮件过滤; 使用 建立一个二进制向量,所有位设置0;选择K个散列函数,用于对元素进行K次散列,计算向量的位下标;添加元素:将K个散列函数作用于该元素,生成K个值作为位下标,将向量的对应位设置为1;检索元素:将K个散列函数作用于该元素,生成K个值作为位下标,若向量的对应位都是1,则说明该元素可能存在;否则,该元素肯定不存在; Demo Demo 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.0</version> </dependency> 测试代码 public class BloomFilterDemo { public static void main(String[] args) { Config config = new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379"); RedissonClient redissonClient = Redisson.create(config); RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("bloom-filter"); // 初始化布隆过滤器 bloomFilter.tryInit(200, 0.01); List<String> elements = new ArrayList<>(); for (int i = 0; i < 200; i++) { elements.

scala安装与配置

目录 一、window系统安装Scala 1.下载安装 二、linux系统安装Scala 1.下载文件scala-2.13.2.tgz 2.解压文件 3.配置环境变量 4.验证 三、IDEA安装scala插件 一、window系统安装Scala 1.下载安装 下载地址:https://www.scala-lang.org/download/all.html 版本:2.13.2 下载msi格式,可以直接安装,然后双击运行,直至安装成功,此时查看环境变量会发现path路径里面已经自动配置了 scala的bin目录 验证打开cmd命令行,输入scala 二、linux系统安装Scala 1.下载文件scala-2.13.2.tgz 本地导入虚拟机 2.解压文件 tar -zxvf scala-2.13.2.tgz 3.配置环境变量 [root@hadoop conf]# vim /etc/profile.d/scala.sh SCALA_HOME=/usr/soft/scala PATH=$PATH:$SCALA_HOME/bin export SCALA_HOME PATH [root@hadoop conf]# source /etc/profile.d/scala.sh 4.验证 三、IDEA安装scala插件 IDEA版本:IntelliJ IDEA 2021.2.3 (Ultimate Edition) 需要考虑scala与idea版本兼容性问题 1.找到与IntelliJ IDEA对应的scala版本直接安装 如图,在File下找到Settings 在弹出的对话框中点击Plugins,然后点击Install JetBrains plugin 2.重启IEDA 3.测试 新建一个项目,下一步 第一次要选择scala SDK位置,选中scala安装位置,会自动出现scala SDK 创建scala类 选择object 编写第一个程序 package scala.com object HelloWorld { def main(args: Array[String]): Unit = { print("

使用Nacos搭建集群并过Nginx反向代理实现负载均衡步骤

使用Nacos搭建集群如图所示: Nacos节点需要实现数据共享,所以每个节点都访问MySQL集群, MySQL集群通过MySQL主从复制实现读写分离; 请求发送到Nacos集群之前通过Nginx负载均衡分发到不同的Nacos节点。 注:这里通过Nacos端口号的不同区分不同的Nacos节点(实际生产环境应为不同IP地址),MySQL集群暂未搭建,使用单数据库演示。 搭建集群的具体步骤: 搭建数据库,初始化数据库表结构 Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库。官方推荐的最佳实践是使用带有主从的高可用数据库集群。 首先新建一个数据库,命名为nacos,而后导入下面的SQL: CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) DEFAULT NULL, `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `c_desc` varchar(256) DEFAULT NULL, `c_use` varchar(64) DEFAULT NULL, `effect` varchar(64) DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `c_schema` text, PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_aggr */ /******************************************/ CREATE TABLE `config_info_aggr` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) NOT NULL COMMENT 'group_id', `datum_id` varchar(255) NOT NULL COMMENT 'datum_id', `content` longtext NOT NULL COMMENT '内容', `gmt_modified` datetime NOT NULL COMMENT '修改时间', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_beta */ /******************************************/ CREATE TABLE `config_info_beta` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_tag */ /******************************************/ CREATE TABLE `config_info_tag` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `tag_id` varchar(128) NOT NULL COMMENT 'tag_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_tags_relation */ /******************************************/ CREATE TABLE `config_tags_relation` ( `id` bigint(20) NOT NULL COMMENT 'id', `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `nid` bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = group_capacity */ /******************************************/ CREATE TABLE `group_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = his_config_info */ /******************************************/ CREATE TABLE `his_config_info` ( `id` bigint(64) unsigned NOT NULL, `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `data_id` varchar(255) NOT NULL, `group_id` varchar(128) NOT NULL, `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL, `md5` varchar(32) DEFAULT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `src_user` text, `src_ip` varchar(50) DEFAULT NULL, `op_type` char(10) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = tenant_capacity */ /******************************************/ CREATE TABLE `tenant_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; CREATE TABLE `tenant_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `kp` varchar(128) NOT NULL COMMENT 'kp', `tenant_id` varchar(128) default '' COMMENT 'tenant_id', `tenant_name` varchar(128) default '' COMMENT 'tenant_name', `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; CREATE TABLE `users` ( `username` varchar(50) NOT NULL PRIMARY KEY, `password` varchar(500) NOT NULL, `enabled` boolean NOT NULL ); CREATE TABLE `roles` ( `username` varchar(50) NOT NULL, `role` varchar(50) NOT NULL, UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE ); CREATE TABLE `permissions` ( `role` varchar(50) NOT NULL, `resource` varchar(255) NOT NULL, `action` varchar(8) NOT NULL, UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE ); INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); 下载并配置Nacos

主存储器(一)

主存储器(一) 一、主存储器技术指标1.主存容量2.存储器存取速度3.主存带宽 二、主存储器的基本操作1.读/取操作2.写/存操作 三、读/写存储器1.预备知识2.SRAM3.DRAM4.动态RAM和静态RAM的比较 四、存储器的分类1.按存储介质2.按工作性质/存取方式3.按信息的可更改性4.按信息的可保存性5.按在计算机中的作用 五、例题 一、主存储器技术指标 1.主存容量 容量单位:位(bit)、字节(Byte)(1B=8b) 存储字(Word) ➢ 一个二进制数由若干位或字节组成,当这个二进制数作为一个整体存入或取出时,这个数称为存储字。 存储单元 ➢ 存放存储字或存储字节的主存空间称为存储单位或主存单元 ➢ 由计算机的结构确定 ➢ 是CPU对主存可访问操作的最小存储单位 编址方式 以字或者字节为单位表示的主存储器存储单元的总数。 ➢ 字节编址:以字节数表示 ➢ 字编址:字数×字长(bit) 例如:设机器按字节编址,设地址线24根(每根地址线可以传入0或1两种数据,24根有 2 24 2^{24} 224种01组合的情况) 按字节寻址: 寻址范围 2 24 2^{24} 224 个* 1B = 16MB 按字寻址: 若字长为16位 寻址范围8MW 若字长为32位 寻址范围4MW 主存中存储单元地址的分配 例题: 注意:1K= 2 10 2^{10} 210;1M= 2 20 2^{20} 220;1G= 2 30 2^{30} 230; 解答:32K= 2 15 2^{15} 215故地址线为15根,16位代表需要16根数据线。 例题:某计算机系统,内存按字节编址,有28根地址总线,字长为32位(数据总线为32根),分别求出按字节寻址和按字寻址时可寻址的单元个数。 答:因为按字节编址,所以每个地址对应一个字节(8位二进制数)。 按字节寻址时,28根地址线,可以表示 2 28 2^{28} 228个(256M个)单元,即0~ 2 28 2^{28} 228-1。

numpy.lib.stride_tricks.as_strided的使用

as_strided函数的使用 numpy.lib.stride_tricks.as_strided是numpy包中一个用以形成子矩阵的函数。 它可以从原矩阵中生成子矩阵,而且子矩阵可以交叉。 主要用于对矩阵进行卷积运算,如用2 * 2 矩阵对 4 * 4的矩阵进行卷积,如果stride为1,那么卷积结果为一个3 * 3的矩阵,该函数就可以用来生成一个3 * 3 * 2 * 2 的张量,即需要卷积的3 * 3个输入矩阵的 2 * 2 的子区域。 函数API numpy.lib.stride_tricks.as_strided(x, shape=None, strides=None, subok=False, writeable=True) 通过给定的shape和strides,生成一个原矩阵的view Parameters: x:ndarray: 用以生成新张量的矩阵 shape:一个int的序列(注:如元组,数组),可选项 需要生成的新的张量的shape,默认为x.shape strides: 一个int的序列(注:如元组,数组),可选项 需要生成的新的张量的跨度,默认为x.strides subok:bool,可选项 v 1.10新增如果为True则保存生成的新张量(默认只是原矩阵的一种view) writeable: bool,可选 v 1.12新增如果设为False那么返回的张量将只读,否则如果原矩阵可写,生成的张量也可写。推荐设为False Return: view:ndarry 参数解析 shape shape即为最终生成的张量的shape。 如对于卷积操作,我们想要得到的输出的shape 可以通过计算公式得到: 假设:输入的图像为W * H 的矩阵,卷积核为w * h 的矩阵,stride为s,不考虑padding(因为padding和生成子矩阵无关,应该在先前提前填充),那么输出的w,h分别为 w o = W − w s + 1 , h o = H − h s + 1 w_o = \frac{W - w}s + 1,\quad h_o = \frac{H - h}s + 1 wo​=sW−w​+1,ho​=sH−h​+1

Java保留小数点后两位方法(推荐使用NumberFormat)

就是 DecimalFormat返回的是String类型,考虑到使用场景一般使用NumberFormat 废话不多说,直接上代码。 /** * 两数相除保留小数点后两位 */ public static String getMathDivide(int a,int b){ NumberFormat numberFormat = NumberFormat.getInstance(); numberFormat.setMaximumFractionDigits(2); String num = numberFormat.format((float) a / (float) b * 100); return num; }

Cron表达式学习:每天十二点执行一次:0 0 12 * * ?

首先推荐大家一个CRON表达式在线生成网站 http://cron.qqe2.com/ 1.cron表达字符含义 cron表达式:* * * * * *,其实就是一个字符串, 字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,其中常用为六个域。 corn从左到右(用空格隔开)分别是:秒 分 小时 月份中的日期 月份 星期中的日期 年份 字段允许值允许的特殊字符秒(Seconds)0~59的整数, - * / 四个字符分(Minutes)0~59的整数, - * / 四个字符小时(Hours)0~23的整数, - * / 四个字符日期(DayofMonth)1~31的整数(但是你需要考虑你月的天数),- * ? / L W C 八个字符月份(Month)1~12的整数或者 JAN-DEC, - * / 四个字符星期(DayofWeek)1~7的整数或者 SUN-SAT (1=SUN), - * ? / L C # 八个字符年(可选,不常用)(Year)1970~2099, - * / 四个字符 2.corn各个字段的含义 (1):表示匹配该域的任意值。假如在Minutes域使用, 即表示每分钟都会触发事件。 (2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。 (3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次 (4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.

【Linux】程序的编译

今天我们来介绍一下程序的编译过程 以及 一些相关的知识 目录 1. 程序环境2. 编译与链接2.1 编译2.2.1 预编译(预处理)2.2.2 编译2.2.3 汇编 2.2 链接 3. 预处理3.1 预定义符号3.2 #define3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 # 与 #\#3.2.5 宏参数的副作用3.2.6 宏与函数的对比3.2.7 关于宏的一些练习 3.3 #undef3.4 命令行定义3.5 条件编译3.6 文件包含3.6.1 头文件被包含的方式3.6.2 嵌套文件包含 3.7 其他预处理命令 1. 程序环境 在 ANSI C的任何一种实现中,存在两个不同的环境。 第一种是翻译环境,在这个环境之中源代码被转化为可执行的机器指令 第二种是执行环境,它用于实际的执行代码 其中翻译环境可以分为 编译过程 和 链接过程。 编译可以分为 预处理,编译 ,汇编过程。接下来我们会对每一步进行比较详细的介绍。 2. 编译与链接 我们先创建一个文件test.c: 2.1 编译 2.2.1 预编译(预处理) gcc test.c -E > test.i 我们可以打开test.i来看一下,我们发现多出了许多内容,这是为什么? 其中有两部分比较值得我们注意: 在预处理阶段: 完成了头文件的包含#define 定义的符号和宏会被替换删除注释 2.

Python中如何获取用户的输入,你一定要知道,学Python必看

文章目录 欢迎关注公众号【Python开发实战】,免费领取Python、PyCharm安装教程和Python学习电子书!输入函数input处理input输入内容 欢迎关注公众号【Python开发实战】,免费领取Python、PyCharm安装教程和Python学习电子书! 输入函数input 在Python中,使用input函数可以获取用户的输入,input函数能够让程序暂停运行,等待用户输入一些内容,然后将用户输入的内容保存为一个字符串。注意,input函数的返回值是一个字符串类型,比如用户输入一个数字6,input函数返回的也是字符串 ‘6’,而不是整数6。因此,在使用input函数获取用户输入的数字时,要在input函数之后做类型转换,这个要注意。下面通过几个示例对input函数做一下演示。 input函数可以传入一个字符串,作为给用户的输入提示。当用户输入完成后,按回车enter键即可。type函数是Python的内置函数之一,可以查看变量的类型。 示例1:输入字符串 # 示例1 name = input('请输入你的姓名:') print(name) print(type(name)) 输出: 在示例1中,提示输入姓名,并将输入的姓名内容赋值给了name变量,后面就可以通过访问变量name来查看输入的姓名。可以看到,变量name的类型为str字符串类型。 示例2:输入数字 # 示例2 age = input('请输入你的年龄:') print(age) print(type(age)) 输出: 在示例2中,提示输入年龄,我们都知道年龄应该是一个数字类型,但是输入数字28之后,变量age却是被赋值为字符串28。因此,为了防止程序后面会用到变量age,这里应该做一个类型转换,下面会介绍。 示例3:输入为空字符 # 示例3 address = input('请输入你的住址:') print('>>>', address, '<<<') 输出: 在示例3中,提示输入住址,然后这里我们什么都没有输入,直接enter。可以发现,input函数获取到的是一个空字符串。 示例4:输入中含有空白 # 示例4 hobby = input('请输入你的爱好:') print('>>>', hobby, '<<<') 输出: 在示例4中,提示输入爱好,但是在输入内容的前后多按了一些空格,而input函数并不会处理这些空白。 从上面的几个示例中,可以发现,不管用户输入什么,input函数都会原封不动地获取并转为字符串。因此,为了避免不合理的输入内容造成程序报错,一般都需要对用户的输入做一些处理,下面介绍一些常见的处理用户输入内容的操作。 处理input输入内容 将输入的字符串类型转换为数字类型 将输入的内容转换为数字类型,可以在input获取到输入内容之后,直接进行类型转换。 age = input('请输入你的年龄:') age = int(age) # 将字符串str转化为整数int print(age) print(type(age)) if age >= 18: print("年满18岁") else: print("

Flutter中如何判断当前运行模式是Debug还是Release

说这个之前,我们先来回顾一下 Flutter的四种运行模式:Debug、Release、Profile和test ,在实际开发中,我们往往需要根据当前运行模式的不同,选择不同的操作,比如在Debug模式启用Log、在生产模式关闭Log。 如果你是一名Android开发者,肯定对于这个不陌生,在Android中,有一个根据gradle配置自动生成的BuildConfig类来判断当前的运行模式。同样的,在Flutter里面也是有方法来判断的,我们需要用到 dart.vm.product 环境标识位,具体使用方法为: const bool inProduction = const bool.fromEnvironment(“dart.vm.product”); 当App运行在Release环境时,inProduction为true;当App运行在Debug和Profile环境时,inProduction为false。 Release:const bool.fromEnvironment(“dart.vm.product”) = true; Debug:assert(() { …; return true; });断言语句会被执行; Profile:上面的两种情况均不会发生。 ———————————————— 版权声明:本文为CSDN博主「吉原拉面」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/yumi0629/article/details/83007315

教你一招解决pycharm启动慢、卡顿的问题,亲测有效

欢迎关注【Python开发实战】,免费领取Python学习电子书! 教你一招解决PyCharm启动慢、卡顿 如果你在启动PyCharm或者在使用PyCharm时,感觉PyCharm运行并不流畅,会有启动慢或卡顿的情况。那么这篇文章能够帮助你,一招解决PyCharm启动慢、卡顿的问题。 首先,找到PyCharm安装路径,并打开PyCharm安装路径下的bin文件夹,找到pycharm64.exe.vmoptions文件,双击打开,进行编辑。 在打开的pycharm64.exe.vmoptions文件内容中,要修改两个变量的值。 **Xms:**表示PyCharm启动时可用的内存大小。**Xmx:**表示PyCharm运行时可用的内存大小。 当这个两个变量的值较小时,就会出现PyCharm启动慢,卡顿的情况,因此,根据自己电脑的内存大小,可以适当调大这两个变量的值,加速PyCharm的启动,避免出现卡顿的情况。 **切记根据你自己电脑的内存大小,适当调大!否则可能会适得其反。**我这里演示的是12G内存的电脑,调整为如图所示。 赶快试一试吧!

SPI和I2C的对比

I2C是半双工,SPI是全双工。 I2C支持多主多从模式,而SPI只能有一个主机。 从GPIO占用上来看,I2C占用更少的GPIO,更节省资源。 I2C有应答响应机制,数据可靠性更高,SPI没有应答机制。 I2C速率不会太高,最高速率3.4Mbps,SPI可以达到很高的速率。 I2C通过器件地址来选择从机,从机数量的增加不会导致GPIO的增加,而SPI通过CS选择从机,每增加一个从机就要多占用一个GPIO。 SPI协议在SCLK边沿进行数据采样,I2C在SCL高电平期间进行数据采样。 两者大多都应用于板内器件短距离通讯。

web学习——JavaScript(1)

1.js的调用方式与执行顺序 使用方式 HTML页面中的任意位置加上<script type="module"></script>标签即可。 常见使用方式有以下几种: 直接在<script type="module"></script>标签内写JS代码。 例如: 在.html文件中: <body> <script type="module"> let x = 3; console.log("x=" + x); </script> </body> 直接引入文件:<script type="module" src="/static/js/index.js"></script>。 例如: index.js的内容为: console.log("Hello World!"); 在.html的head标签或者body标签都可以引入script标签,被引入的js文件就会自动执行 <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="module" src="/static/js/index.js"></script> </head> <body> <script type="module" src="/static/js/index.js"></script> </body> 控制台: 将所需的代码通过import关键字引入到当前作用域。 例如: /static/js/index.js文件中的内容为: let name = "acwing"; function print() { console.log("Hello World!"); } export { name, print } <script type="

Dubbo学习之自动配置

相关阅读 Dubbo学习之监听器Dubbo学习之DubboConfigInitEventDubbo学习之PostProcessorDubbo学习之DubboReference 简介 本文基于Spring Boot 2.6.6,dubbo-spring-boot-starter 3.0.6环境。 引入dubbo-spring-boot-starter包,就会引入其依赖dubbo-spring-boot-autoconfigure,该依赖实现了Dubbo自动配置功能,其spring.factories文件内容如下: org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.apache.dubbo.spring.boot.autoconfigure.DubboRelaxedBinding2AutoConfiguration dubbo-spring-boot-autoconfigure会引入依赖dubbo-spring-boot-autoconfigure-compatible,该依赖也存在一个spring.factories文件,其内容如下: org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.apache.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration,\ org.apache.dubbo.spring.boot.autoconfigure.DubboRelaxedBindingAutoConfiguration,\ org.apache.dubbo.spring.boot.autoconfigure.DubboListenerAutoConfiguration org.springframework.context.ApplicationListener=\ org.apache.dubbo.spring.boot.context.event.WelcomeLogoApplicationListener org.springframework.boot.env.EnvironmentPostProcessor=\ org.apache.dubbo.spring.boot.env.DubboDefaultPropertiesEnvironmentPostProcessor org.springframework.context.ApplicationContextInitializer=\ org.apache.dubbo.spring.boot.context.DubboApplicationContextInitializer 综上可知,dubbo-spring-boot-autoconfigure引入的自动配置类如下: org.apache.dubbo.spring.boot.autoconfigure.DubboRelaxedBinding2AutoConfiguration;org.apache.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration;org.apache.dubbo.spring.boot.autoconfigure.DubboRelaxedBindingAutoConfiguration;org.apache.dubbo.spring.boot.autoconfigure.DubboListenerAutoConfiguration; DubboAutoConfiguration DubboAutoConfiguration是Dubbo自动配置的核心类,代码如下: // 默认开启,除非指定dubbo.enabled=false @ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true) @Configuration // 在DubboRelaxedBindingAutoConfiguration之后配置 @AutoConfigureAfter(DubboRelaxedBindingAutoConfiguration.class) // 因为配置属性类DubboConfigurationProperties @EnableConfigurationProperties(DubboConfigurationProperties.class) // 开启Dubbo @EnableDubboConfig public class DubboAutoConfiguration { // 存在dubbo.scan.base-packages属性,且存在"dubbo-service-class-base-packages" Bean,则引入后置处理器ServiceAnnotationPostProcessor,用于解析DubboService注解 // Sprin Boot 2.6.6环境下,BASE_PACKAGES_BEAN_NAME由DubboRelaxedBinding2AutoConfiguration完成注入 // Spring Boot 1.x环境下,BASE_PACKAGES_BEAN_NAME由DubboRelaxedBindingAutoConfiguration完成注入 @ConditionalOnProperty(prefix = DUBBO_SCAN_PREFIX, name = BASE_PACKAGES_PROPERTY_NAME) @ConditionalOnBean(name = BASE_PACKAGES_BEAN_NAME) @Bean public ServiceAnnotationPostProcessor serviceAnnotationBeanProcessor(@Qualifier(BASE_PACKAGES_BEAN_NAME) Set<String> packagesToScan) { return new ServiceAnnotationPostProcessor(packagesToScan); } } 核心功能为: