分布式文件系统fastDFS与fastDFS-nginx-module整合安装部署

  |   0 评论   |   0 浏览

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

python正则表达式

  |   0 评论   |   0 浏览

"""
正则表达式
"""
"""
re.match 函数
原形:match(pattern, string, flags=0)
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,值如下:
re.I 忽略大小写
re.L 做本地户识别
re.M 多行匹配,影响^和¥
re.S 是.匹配包括换行符在内的所有字符
re.U 根据Unicode字符集解析字符,影响\W \w \B \b
re.X 使我们以更灵活的格式理解正则表达式
参数:
功能:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回None
"""

python员工信息档案管理系统开发实例-2(改)

  |   0 评论   |   0 浏览
import os

filename = 'employee.txt'


def main():
	while True:
		menu()
		choice = int(input('请选择功能菜单:'))
		# print(type(choice),choice.isdigit(),type(choice.isdigit()))
		# if choice.isdigit():
		if choice in [0, 1, 2, 3, 4, 5, 6, 7]:
			if choice == 0:
				answer = input('你确定要退出系统吗?退出按y键,不退出按n键')
				if answer == 'y' or answer == 'Y' or answer == 'YY' or answer == 'yy':
					print('谢谢使用!再见!')
					break  # 退出系统
				else:
					continue
			elif choice == 1:
				insert()  # 录入员工信息
			elif choice == 2:
				search()  # 查找员工信息
			elif choice == 3:
				delete()  # 删除员工信息
			elif choice == 4:
				modify()  # 修改员工信息
			elif choice == 5:
				sort()  # 员工信息排序
			elif choice == 6:
				total()  # 统计员工总人数
			elif choice == 7:
				show()  # 显示所有员工信息
		else:
			print('请选择正确的序号')

python员工信息档案管理系统开发实例-1(增、删)

  |   0 评论   |   0 浏览
import os
filename = 'employee.txt'


def main():
	while True:
		menu()
		choice = int(input('请选择功能菜单'))
		# print(type(choice),choice.isdigit(),type(choice.isdigit()))
		# if choice.isdigit():
		if choice in [0, 1, 2, 3, 4, 5, 6, 7]:
			if choice == 0:
				answer = input('你确定要退出系统吗?退出按y键,不退出按n键')
				if answer == 'y' or answer == 'Y' or answer == 'YY' or answer == 'yy':
					print('谢谢使用!再见!')
					break  # 退出系统
				else:
					continue
			elif choice == 1:
				insert()  # 录入员工信息
			elif choice == 2:
				search()  # 查找员工信息
			elif choice == 3:
				delete()  # 删除员工信息
			elif choice == 4:
				modify()  # 修改员工信息
			elif choice == 5:
				sort()  # 员工信息排序
			elif choice == 6:
				total()  # 统计员工总人数
			elif choice == 7:
				show()  # 显示所有员工信息
		else:
			print('请选择正确的序号')


# if choice in [0, 1, 2, 3, 4, 5, 6, 7]:
# 	if choice == 0:
# 		answer = input('你确定要退出系统吗?退出按y键,不退出按n键')
# 		if answer == 'y' or answer == 'Y' or answer == 'YY' or answer == 'yy':
# 			print('谢谢使用!再见!')
# 			break  # 退出系统
# 		else:
# 			continue
# 	elif choice == 1:
# 		insert()  # 录入员工信息
# 	elif choice == 2:
# 		search()  # 查找员工信息
# 	elif choice == 3:
# 		delete()  # 删除员工信息
# 	elif choice == 4:
# 		modify()  # 修改员工信息
# 	elif choice == 5:
# 		sort()  # 员工信息排序
# 	elif choice == 6:
# 		total()  # 统计员工总人数
# 	elif choice == 7:
# 		show()  # 显示所有员工信息


def menu():
	print('========================================员工信息管理系统========================================\n')
	print('\t\t\t\t\t\t\t\t\t\t1.录入员工信息')
	print('\t\t\t\t\t\t\t\t\t\t2.查找员工信息')
	print('\t\t\t\t\t\t\t\t\t\t3.删除员工信息')
	print('\t\t\t\t\t\t\t\t\t\t4.修改员工信息')
	print('\t\t\t\t\t\t\t\t\t\t5.员工信息排序')
	print('\t\t\t\t\t\t\t\t\t\t6.统计员工总人数')
	print('\t\t\t\t\t\t\t\t\t\t7.显示所有员工信息')
	print('\t\t\t\t\t\t\t\t\t\t0.退出\n')


def insert():
	employee_list = []
	while True:
		employee_id = input('请输入工号如(1001):')
		if not employee_id:
			break
		employee_name = input('请输入姓名:')
		if not employee_name:
			break
		try:
			age = int(input('请输入年龄:'))
		except:
			print('输入无效')
			continue
		# 将录入的员工信息保存到字典中
		employee = {'id': employee_id, 'name': employee_name, 'age': age}
		# 将员工信息添加到列表
		employee_list.append(employee)
		answer = input('是否继续添加?y/n\n')
		if answer == 'y' or answer == 'Y':
			continue
		else:
			break
	# 调用save函数
	save(employee_list)
	print('员工信息录入完毕')


def save(lst):
	try:
		employee_txt = open(filename, 'a', encoding='UTF-8')
	except:
		employee_txt = open(filename, 'w', encoding='UTF-8')
	for item in lst:
		employee_txt.write(str(item) + '\n')
	employee_txt.close()


def search():
	pass


def delete():
	while True:
		employee_id = input('请输入要删除的员工工号ID:')
		if employee_id != '':
			delete_warning = input(f'是否要删除工号为{employee_id}的员工信息?y/n\n')
			if delete_warning == 'y' or delete_warning == 'Y':
				if os.path.exists(filename):  # 判断文件是否存在
					with open(filename, 'r', encoding='utf-8') as file:
						employee_old = file.readlines()
				else:
					employee_old = []
				flag = False  # 标记是否删除
				if employee_old:
					with open(filename, 'w', encoding='utf-8') as w_file:
						d = {}
						for item in employee_old:
							d = dict(eval(item))  # 将字符串转成字典
							if d['id'] != employee_id:
								w_file.write(str(d) + '\n')
							else:
								flag = True
						if flag:
							print(f'id为{employee_id}的员工信息已被删除')
						else:
							print(f'没有找到ID为{employee_id}的员工信息')
				else:
					print('无此员工信息')
					break
				show()  # 删除之后重新显示所有员工信息
				answer = input('是否继续删除员工信息y/n\n')
				if answer == 'y' or answer == 'Y':
					continue
				else:
					break
			else:
				break


def modify():
	pass


def sort():
	pass


def total():
	pass


def show():
	pass


if __name__ == '__main__':
	main()

浅拷贝与深拷贝

  |   0 评论   |   0 浏览

在 Python 中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,Python 并没有拷贝这个对象,而只是拷贝了这个对象的引用,我们称之为浅拷贝。

在 Python 中,为了使当进行赋值操作时,两个变量互补影响,可以使用 copy 模块中的 deepcopy 方法,称之为深拷贝。

class Cpu:
	pass

class Disk:
	pass

class Computer:
	def __init__(self,cpu,disk):
		self.cpu=cpu
		self.disk=disk
	
#(1)变量的赋值
cpu1=Cpu()
cpu2=cpu1
print(cpu1,id(cpu1))
print(cpu2,id(cpu2))
'''
执行结果
<__main__.Cpu object at 0x00000205C5903310> 2223812653840
<__main__.Cpu object at 0x00000205C5903310> 2223812653840
'''

#(2)类的浅拷贝
print('---------------------------------------------------------')
disk=Disk()   #创建一个硬盘类的实例对象
print(disk,id(disk))
computer=Computer(cpu1,disk)    #创建一个计算机类的实例对象

#浅拷贝
import copy
computer2=copy.copy(computer)
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk)

#深拷贝
computer3=copy.deepcopy(computer)
print(computer3,computer3.cpu,computer3.disk)

执行结果:
---------------------------------------------------------
<__main__.Disk object at 0x000002299EC2EEF0> 2377780489968
<__main__.Computer object at 0x000002299EC2EF20> <__main__.Cpu object at 0x000002299EC2F6D0> <__main__.Disk object at 0x000002299EC2EEF0>
<__main__.Computer object at 0x000002299E7A7C40> <__main__.Cpu object at 0x000002299EC2F6D0> <__main__.Disk object at 0x000002299EC2EEF0>
<__main__.Computer object at 0x000002299EC6B820> <__main__.Cpu object at 0x000002299EC69B70> <__main__.Disk object at 0x000002299EC69AB0>

无标题.png

特殊方法__new__创建对象的过程 有更新!

  |   0 评论   |   0 浏览

class Person:

	def __new__(cls, *args, **kwargs):
		print('__new__被调用执行了,cls的ID为:{0}'.format(id(cls)))
		obj = super().__new__(cls)
		print('创建的对象的ID为:{0}'.format(id(obj)))
		return obj

	def __init__(self, name, age):
		print('__init__被调用了,self的ID为:{0}'.format(id(self)))
		self.name = name
		self.age = age

print('object这个对象的ID为:{0}'.format(id(object)))
print('Person这个类对象的ID为:{0}'.format(id(Person)))

# 创建Person的实例对象
p1 = Person('zhangsan', 20)
print('p1这个Person类的实例对象的ID为:{0}'.format(id(p1)))

执行结果:
object这个对象的ID为:140704941193088
Person这个类对象的ID为:2358520473904
__new__被调用执行了,cls的ID为:2358520473904
创建的对象的ID为:2358521573152
__init__被调用了,self的ID为:2358521573152
p1这个Person类的实例对象的ID为:2358521573152

python继承 有更新!

  |   0 评论   |   0 浏览

**类(Class): **用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
**方法:**类中定义的函数。
**类变量:**类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
**方法重写:**如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
**局部变量:**定义在方法中的变量,只作用于当前实例的类。
**实例变量:**在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
**继承:**即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
**实例化:**创建一个类的实例,类的具体对象。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

python标识符&关键字

  |   0 评论   |   0 浏览

在程序中自定义的类名、函数名、变量等符号和名称,叫做标识符

Python中,标识符由字母、数字、下划线(_)组成,不能以数字开头,区分大小写,不能与python关键字重复

'''

No_12 = 13           #合法标识符
age$#=18             #不合法的标识符,不能包含¥特殊符号
12name = "ali"     #不合法的标识符,不能以数字开头
type = "name"      #不合法的标识符,type是python关键字

VM虚拟机centos stream 9 里的KVM虚拟机 创建桥接物理机 (双层虚拟化)

  |   0 评论   |   0 浏览

1.创建网桥

nmcli conn add type bridge con-name br0 ifname br0

2.配置IP地址

nmcli connection modify br0 ipv4.addresses '192.168.50.10/24' ipv4.gateway '192.168.50.1' ipv4.dns '202.103.24.68' ipv4.method manual

3.为网桥关联物理接口

nmcli conn add type ethernet slave-type bridge con-name br0-ens192  ifname ens192  master br0
nmcli conn up br0    //启动网桥

HCIP-PIM-1 有更新!

  |   0 评论   |   0 浏览

PIM(Protocol Independent Multicast)称为协议无关组播。这里的协议无关指的是与单播路由协议无关,即PIM不需要维护专门的单播路由信息。作为组播路由解决方案,它直接利用单播路由表的路由信息,对组播报文执行RPF(Reverse Path Forwarding,逆向路径转发)检查,检查通过后创建组播路由表项,从而转发组播报文。

HCIP-VxLAN 有更新!

  |   0 评论   |   0 浏览

VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网)是一种网络虚拟化技术,可以改进大型云计算在部署时的扩展问题,是对VLAN的一种扩展。VXLAN是一种功能强大的工具,可以穿透三层网络对二层进行扩展。它可通过封装流量并将其扩展到第三层网关,以此来解决VMS(虚拟内存系统)的可移植性限制,使其可以访问在外部IP子网上的服务器。

HCIP-SDN

  |   0 评论   |   0 浏览

软件定义网络(Software Defined Network,SDN)是由美国斯坦福大学clean-slate课题研究组提出的一种新型网络创新架构,是网络虚拟化的一种实现方式。其核心技术OpenFlow通过将网络设备的控制面与数据面分离开来,从而实现了网络流量的灵活控制,使网络作为管道变得更加智能,为核心网络及应用的创新提供了良好的平台。

HCIP-IPsec2 有更新!

  |   0 评论   |   0 浏览

1.创建安全提议及安全策略
对数据加密和认证的一个方案(认证算法、加密算法、以及隧道封装模式、IKE版本、认证密码等)
AH:只能用来做认证和校验
ESP:既可以用来做认证、校验也能用来做数据加密

HCIP-IPsec 有更新!

  |   0 评论   |   0 浏览

IPSec协议族是IETF(Internet Engineering Task Force)制定的一系列协议,它为IP数据包提供了高质量的、可互操作的、基于密码学的安全性。特定的通信双方在IP层通过加密与数据源认证等方式,来保证数据报在网络上传输时的私有性、完整性、真实性和防重放。

IPSec通过认证头AH(Authentication Header)和封装安全载荷ESP(Encapsulating Security Payload)这两个安全协议来实现上述目标。因特网密钥交换协议IKE(Internet Key Exchange)为IPSec提供自动协商交换密钥、建立和维护安全联盟的服务,以简化IPSec的使用和管理。

HCIP-GRE

  |   0 评论   |   0 浏览

通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。

GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一种三层隧道封装技术,使报文可以通过GRE隧道透明的传输,解决异种网络的传输问题。

HCIP-BGP路由反射器

  |   0 评论   |   0 浏览

为保证IBGP对等体之间的连通性,需要在IBGP对等体之间建立全连接关系。假设在一个AS内部有n台设备,那么建立的IBGP连接数就为n(n-1)/2。当设备数目很多时,设备配置将十分复杂,而且配置后网络资源和CPU资源的消耗都很大。在IBGP对等体间使用路由反射器可以解决以上问题。

HCIP-BGP属性 有更新!

  |   0 评论   |   0 浏览

在BGP路由表中,到达同一目的地可能存在多条路由。此时BGP会选择其中一条路由作为最佳路由,并只把此路由发送给其对等体。BGP为了选出最佳路由,会根据BGP的路由优选规则依次比较这些路由的BGP属性。