type 介绍 type() 函数的语法格式有 2 种,分别如下:
type(obj) type(name, bases, dict) 这 2 种语法格式,各参数的含义及功能分别是:
第一种语法格式用来查看某个变量(类对象)的具体类型,obj 表示某个变量或者类对象。 第二种语法格式用来创建类,其中 name 表示类的名称;bases 表示一个元组,其中存储的是该类的父类;dict 表示一个字典,用于表示类内定义的属性或者方法。 第一种很简单,就不详细介绍,如:
type('abc') <class 'str'> type(100) <class 'int'> 主要讲第二中用法,如:
def say(self): print(我要学 Python!) #使用 type() 函数创建类 Python = type(Python,(object,),dict(say = say, language = Python)) #创建一个 Python 实例对象 p = Python() #调用 say() 方法和 language 属性 p.say() print(p.language) ### 运行结果: 我要学 Python! Python 注意:Python 元组语法规定,当 (object,) 元组中只有一个元素时,最后的逗号(,)不能省略。
String类常用方法 int length():返回字符串长度 char charAt(int index):返回字符串上某个索引位置的字符 boolean isEmpty():判断字符串是否为空 String toLowerCase():使用默认语言环境,将String中所有字符转换为小写 String toUpperCase():使用默认语言环境,将String中所有字符转换为大写 String trim():返回一个忽略所有空格的字符串 boolean equals(Object obj ):判断字符串是否相同 boolean equalsIgnoreCase(String anotherString):与equals()类似,忽略大小写 String concat(String str):将指定字符串连接到此字符串的结尾,等价于+ int compareTo(String anotherString):比较两个字符串的大小 String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始的子串 String substring(int beginIndex,int endIndex):返回一个子串,从beginindex到endIndex 补充2
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束 boolean startWith(String prefix):测试此字符串是否以指定的前缀开始 boolean startWith(String prefix, int toffset):测试此字符串从指定索引开始的子串是否与prefex相同 boolean contains(CharSequence s):当且仅当此字符串包含指定char值序列,返回true int indexOf(String str):返回子串在字符串中的索引 int indexOf(String str,int fromIndex):返回子串在字符串中的索引,从fromIndex处开始从左往右找 int lastIndexOf(String str):返回子串在字符串中的最右侧的索引 int lastIndexOf(String str,int fromIndex):返回子串在字符串中的最右侧的索引,从fromIndex处从右往左开始找 补充3
操作系统简介 操作系统主要功能 进程管理
内存管理
设备管理
文件管理
提供用户接口
软件访问硬件的几种方式 直接访问:由用户进程直接控制主存或 CPU 和外围设备之间的信息传送。
中断驱动:为了减少程序直接控制方式下 CPU 的等待时间以及提高系统的并行程度,系统引入了中断机制。外围设备仅当操作正常结束或异常结束时才向 CPU 发出中断请求
DMA 直接内存访问:无需cpu介入,设备控制器直接把数据传输到内存
通道控制方式:独立于 CPU 的专门负责输入输出控制的处理机,它控制设备与内存直接进行数据交换。有自己的通道指令,这些指令由 CPU 启动,并在操作结束时向 CPU 发出中断信号
Linux程序不能在Windows跑 格式不同,linux可执行程序格式elf,winfows是pe
系统api不一致,linux软中断(int 0x80),windows为库(dll)
操作系统结构 单体
分层
微内核
客户端-服务器
内核态、用户态 内核态:系统权限0、访问任何数据
用户态:系统权限3、受限访问内存
切换过程:系统调用->软中断指令->中断函数处理->内核态处理api
linux操作系统启动过程 主要分为一下过程:https://cloud.tencent.com/developer/article/1114481
开机自检
加载BIOS程序(位于CMOS芯片)
确定可启动设备->加载MBR->运行boot loader(grub)-> 加载内核
MBR位于可启动磁盘的0磁道0扇区、521字节:
type State int type CharType int const ( STATE_INITIAL State = iota STATE_INT_SIGN STATE_INTEGER STATE_POINT STATE_POINT_WITHOUT_INT STATE_FRACTION STATE_EXP STATE_EXP_SIGN STATE_EXP_NUMBER STATE_END ) const ( CHAR_NUMBER CharType = iota CHAR_EXP CHAR_POINT CHAR_SIGN CHAR_SPACE CHAR_ILLEGAL ) func toCharType(ch byte) CharType { switch ch { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': return CHAR_NUMBER case 'e', 'E': return CHAR_EXP case '.': return CHAR_POINT case '+', '-': return CHAR_SIGN case ' ': return CHAR_SPACE default: return CHAR_ILLEGAL } } func isNumber(s string) bool { transfer := map[State]map[CharType]State{ STATE_INITIAL: map[CharType]State{ CHAR_SPACE: STATE_INITIAL, CHAR_NUMBER: STATE_INTEGER, CHAR_POINT: STATE_POINT_WITHOUT_INT, CHAR_SIGN: STATE_INT_SIGN, }, STATE_INT_SIGN: map[CharType]State{ CHAR_NUMBER: STATE_INTEGER, CHAR_POINT: STATE_POINT_WITHOUT_INT, }, STATE_INTEGER: map[CharType]State{ CHAR_NUMBER: STATE_INTEGER, CHAR_EXP: STATE_EXP, CHAR_POINT: STATE_POINT, CHAR_SPACE: STATE_END, }, STATE_POINT: map[CharType]State{ CHAR_NUMBER: STATE_FRACTION, CHAR_EXP: STATE_EXP, CHAR_SPACE: STATE_END, }, STATE_POINT_WITHOUT_INT: map[CharType]State{ CHAR_NUMBER: STATE_FRACTION, }, STATE_FRACTION: map[CharType]State{ CHAR_NUMBER: STATE_FRACTION, CHAR_EXP: STATE_EXP, CHAR_SPACE: STATE_END, }, STATE_EXP: map[CharType]State{ CHAR_NUMBER: STATE_EXP_NUMBER, CHAR_SIGN: STATE_EXP_SIGN, }, STATE_EXP_SIGN: map[CharType]State{ CHAR_NUMBER: STATE_EXP_NUMBER, }, STATE_EXP_NUMBER: map[CharType]State{ CHAR_NUMBER: STATE_EXP_NUMBER, CHAR_SPACE: STATE_END, }, STATE_END: map[CharType]State{ CHAR_SPACE: STATE_END, }, } state := STATE_INITIAL for i := 0; i < len(s); i++ { typ := toCharType(s[i]) if _, ok := transfer[state][typ]; !
gRPC rpc,远程过程调用,通过计算机网络从一个节点调用另一个节点的服务,就像本地调用一样。rpc是一个协议,遵循协议实现的框架为rpc框架,比较典型的有 Dubbo、Thrift 和 gRPC
rpc调用过程 rpc框架组成 rpc和http区别 RPC 是远程过程调用,其调用协议通常包括序列化协议和传输协议。序列化协议有基于纯文本的 XML 和 JSON、二进制编码的Protobuf和Hessian。传输协议是指其底层网络传输所使用的协议,比如 TCP、HTTP。
grpc使用的传输协议就是http2.0
有名的rpc框架:go rpc、grpc、Thrift
TCP/UDP https://segmentfault.com/a/1190000038526729
https://blog.csdn.net/weixin_38586230/article/details/106604173
模型 物理层 传输0101比特流、遵循规范
数据链路层 数据链路=若干链路+协议(包含实现协议的硬件+软件)
封装成帧:最大传送单元MTU、做个首尾标记,也称为帧定界(确认帧的界限)
用什么标记做为定界符呢?不可打印的ASCII码占了33个(用这部分)
透明传输
数据部分中的部分字节的二进制代码恰好和帧的开始符与结束符一样,那么就会错误的找到帧的边界
解决方案:字符转义(俄罗斯套娃)、传给上层时删除即可
差位检测
检测数据是否出错:多数为CRC检测、但无法解决数据丢失、重复、乱序,交给传输层(tcp
点对点ppp协议(使用最广) 封装成帧
0x7E 标记开始、结束;字段A规定为0xFF,控制字段C规定为0x03
第四个为协议字段。0x0021:PPP帧的信息字段就是IP数据报。0xC021:则信息字段是PPP链路控制协议LCP的数据,而0x8021表示这是网络层的控制数据(NCP,如IPCP)。
信息字段的长度是可变的,不超过1500字节
尾部中的第一个字段(2字节)是使用CRC的帧检验序列FCS
字节填充
异步传输时,转义字符定义为0x7D(即01111101)
数据中出现帧标志字段,0x7E字节,那就转变成为2字节序列(0x7D,0x5E)
数据中出现一个转义字符,0x7D字节,则把0x7D转变成为2字节序列(0x7D,0x5D)
数据中出现ASCII码的控制字符,则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变
0比特填充
工作流程
问题描述 使用net start mysql命令后出现“MySQL ... MySQL 服务无法启动。 服务没有报告任何错误。”问题的解决办法 解决措施 管理员模式打开cmd窗口 删除下载的mysql文件夹中的data文件 在cmd窗口中将路径切换到MySQL文件夹下 cd / 切到根目录 cd mysql文件夹所在路径 然后输入 mysqld --initialize 命令,重新初始化一个新的data文件
Python 学习笔记 列表 list=[] 这样就创建了一个空列表
list[1] list[:2] list[ :-1] list[ : :-3] 与字符串的操作完全相同
添加操作 list.append(obj) 将obj添加到list的最后
list1+list2 list1.extend(list2) 可以把list2加到list1后
注意:python中列表内的数据类型不一定要求一样,也就是说可以直接形成结构体?
删除操作 remove(value) 根据元素关键字进行删除,只删除从左往右第一个,元素不存在的话会报错
Name = [1,2,3,4,5] print('------删除之前------Name=%s' % Name) Name.remove(3) print('------删除之后------Name=%s' % Name) pop() 删除最后一个元素
Name = [1,2,3,4,5] print('------删除之前------Name=%s' % Name) Name.pop() print('------删除之后------Name=%s' % Name) del() del movieName[2] 直接写del而不需要在一个列表下
注意
for i in range(len[list]) if(list[i]==obj) list.remove(obj) i-=1 print(list) 这个代码并不能实现把所有的obj全部删除(甚至会出现越界)
清除MySQL服务 步骤一 # 删除MySQL隐藏文件夹 在C盘的ProgramData下会有一个MySQL文件夹,这个文件夹要删除 ProgramData是一个隐藏文件夹,需要设置显示隐藏文件夹才能看到 步骤二 # 删除注册表项 Windows运行框(可通过同时按下Windows徽标键 + R键来调出这个运行框)中输入regedit , 打开注册表编辑窗口,逐级打开找到如下项 : HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ Eventlog \ Application \ MySQL HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet002 \ Services \ Eventlog \ Application \ MySQL HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog \ Application \ MySQL 如果找到,在MySQL项目上右键,删除,如果没有找到,则无需处理 步骤三 # 删除服务项 运行框中运行cmd打开Windows命令行窗口,执行如下命令: sc delete MySQL 服务名 (比如 mysql57, 可以在本机服务列表中查看具体名称) 步骤四 # 最后一步重启电脑
数据库CRUD封装 在一个项目中,我们会进行后台数据库的连接。所以会频繁的使用数据库的CRUD操作,所以我们能不能抽取公共部分,并形成一个工具类呢?我们来试试。
CRUD方法封装 public class CRUDUtils { /** * @Description: 增删改的sql封装 * @Param: [sql:具体的sql语句; params:字段信息(使用prepareStatement)] * @return: int */ public static int update(String sql,Object... params){ Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { //1.获取连接,DbUtil工具类的获取见末尾文章。 con = DbUtil.getConn(); //2.预处理sql语句 ps = con.prepareStatement(sql); //3.params.length 获取可变长度的长度,进行?填充 for (int i = 0; i < params.length; i++) { ps.setObject(i + 1,params[i]); } /*4.返回执行结果(int),数字是受影响的行数,如果为0表示一行数据都没有影响到,不代表数据库执行错*/ return ps.executeUpdate(); } catch (Exception e) { e.
数据库工具类 通过学习我们知道,连接一个数据库很麻烦,代码很多,而且像注册驱动这些代码我们在项目的启动后只需要执行一次。所以我们能不能写一个数据库连接的工具类呢?
** * @program: Dream * @description: 数据库工具类 * @author: stop.yc * @create: 2022-03-18 10:57 **/ public class DbUtil { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; /*配置信息,程序运行后,只要一次,就不会改变了,然后驱动加载也只需要一次,那么就是用静态代码块,程序运行后,运行一次*/ static { try { //通过字节输入流,获取文件中的配置信息. InputStream in = DbUtil.class.getClassLoader().getResourceAsStream(db.properties); //文件加载 Properties properties = new Properties(); properties.load(in); //获取 driver = properties.getProperty(driver); url = properties.getProperty(url); username = properties.