- 博客(224)
- 收藏
- 关注
原创 Docker相关命令与入门
此时c1 和c2 挂载到了c3上,c3挂载到了宿主机上,本质上是c1、c2、c3都挂载到了宿主机的同一个位置。镜像是只读的,但是Docker可以加载一个可读写的文件系统作为容器,再整成新的镜像。进入容器后就可以直接登录mysql,并进行mysql的相应操作了。通过多个容器挂载相同的数据卷,可以实现容器之间的数据交互。外部机器就可以通过访问宿主机的端口,从而访问容器的服务。可以将容器中提供服务的端口映射到宿主机的端口上。Docker容器删除后,容器中产生的数据就。当容器中的网络服务需要被外部机器访问时,
2023-08-05 15:04:55 760
原创 unittest.mock中的Mock与MagicMock
类都被用于创建一个模拟对象,并设置了一个方法的返回值。然后调用该方法,并断言方法是否被正确调用。类只能模拟已经存在的属性和方法。因此,在大多数情况下,建议使用。因此,当需要模拟一个对象的属性和方法时,建议使用。也不会出现问题,而且访问不存在的方法。不会出现问题,但是访问不存在的方法。类可以自动模拟任何属性和方法,而。在上面的示例中,首先创建了一个。类可以自动模拟任何属性和方法。对象,并分别设置了一个属性。然后分别访问这些属性和方法。对象中,访问已经存在的属性。对象中,访问已经存在的属性。
2023-08-05 10:57:09 661
原创 Python中的多线程编程和多进程编程--入门
例如图像处理、科学计算等,原因是CPU密集型任务CPU一直被占用,切换线程只会浪费更多的CPU资源,因此CPU并没有空闲。,例如网络通信、文件读写等,原因是I/O任务等待时间较长,通过切换线程可以最大程度的减小因为等待造成的资源浪费问题。需要注意的是,多线程编程和多进程编程都可以实现并发执行,但是它们的实现方式和使用场景有所不同。模块是 Python 中用于创建和管理线程的标准库。模块是 Python 中用于创建和管理进程的标准库。同时,多线程编程和多进程编程都需要注意线程安全和进程间通信等问题。
2023-08-05 10:50:47 186
原创 使用Anaconda创建虚拟环境并添加到Jupyter notebook内核
将当前Python环境的kernel写入Jupyter的kernel。:查看当前拥有的conda环境列表。的虚拟环境,使用的解释器为。窗口:依次执行下面的命令。
2023-07-26 21:07:34 2814 1
原创 ①在本地创建仓库并上传代码到远程仓库||②第一次clone一个远程仓库的代码,创建本地分支并将该分支推送到远程仓库的操作流记录
命令在已经设置了origin为远程仓库地址的别名时等价于。将会报错,因此需要先设置当前分支的默认上游分支。设置远程仓库别名的方式上文已经指出。(也即当前分支的默认推送分支)设置完之后就可以在当前分支直接。到远程仓库的对应分支了。
2023-07-22 23:30:25 271
原创 2分钟完成Github配置ssh密钥
配置ssh密钥的目的是为了可以在自己的本地开发环境可以顺利拉取和推送代码到Github上的远程仓库本机是Ubuntu 16.04环境,已安装ssh。
2023-07-06 20:19:59 3238
原创 C语言中的字符串输入(gets_s、fgets、scanf、fscanf)与相关内存分配知识
执行到相应的程序段时才会去申请内存,而不是像静态内存分配一样提前申请好。指的是在编译时确定数组等数据类型的大小,然后由计算机分配好,通常是存在栈上的数据。:如果读取数据且没有发生错误,将会在紧随读入的字符数据后写入空终止字符。微软实现的该函数,但是GCC没有实现该函数,详细原因未知。因此可以知道,gets_s函数读入的是一个C风格的字符串。例如:在声明数组时,需要显示的指明数组的大小。所指向的数组,并在读取完后写入空终止字符。所指向的空间中,当函数读取字符遇到。导致的结束读取,该函数将会把换行符。
2023-06-28 22:38:24 896
原创 杂谈---名言警句记录
我们总喜欢拿顺其自然来敷衍人生道路上的荆棘与坎坷,却很少承认真正的顺其自然其实是竭尽所能之后的不强求,而并非两手一摊的不作为.
2023-02-02 21:30:39 473 1
原创 提高学习效率方法论:十步学习法—John Z. Sonmez
根据全局调研结果合理的指定学习计划,广泛的抓取相关主题的学习资料,指定精细具体的小目标,然后浅尝辄止学习足以动手操作的知识;针对动手操作所产生的疑问进行针对性的学习,由此开始滚雪球式学习,直到完成了自己的学习目标,同时要学会用主动输出的方式加强自己对知识的掌握
2022-12-08 22:15:37 679 3
原创 使用Qt 中的QTableWidget控件在Qt中实现输入任意大小的矩阵
使用Qt 中的QTableWidget控件在Qt中实现输入任意大小的矩阵
2022-11-16 18:20:44 1272
原创 2023届C/C++软件开发工程师校招面试常问知识点复盘Part 8
52、vector是怎么存储的?53、epoll的底层原理53.1 对比select和poll53.2 ET和LT的工作模式54、进程、线程、协程的理解和他们的通信方式54.1 进程的含义54.2 线程的含义54.3 协程的含义54.4 进程间通信IPC54.5 线程间通信方式55、define宏定义的用法防止一个头文件被重复包含求两个数的最大值和最小值返回数组元素的个数得到一个变量的地址从指定的地址获取一个字节或者int将一个字母转换为大写字母
2022-10-25 19:02:36 1132
原创 2023届C/C++软件开发工程师校招面试常问知识点复盘Part 7
46、C++类的成员变量初始化顺序及拓展47、强制转换类型操作符号48、const 成员函数–常成员函数与常量对象49、volatile关键字50、赫夫曼树51、前缀树
2022-10-25 18:52:35 508
原创 2023届C/C++软件开发工程师校招面试常问知识点复盘Part 6
41、 DHCP协议(动态主机配置协议)42、STL中的allocate、deallocate43、虚函数表、虚函数表指针子类和父类的虚函数表是独立的吗?44、左值与右值的相关内容45、二叉堆的实现1、二叉堆2、利用二叉堆实现优先级队列3、利用二叉堆实现堆排序
2022-10-25 18:36:01 1587
原创 2023届C/C++软件开发工程师校招面试常问知识点复盘Part 5
36、细讲一下智能指针37、用简洁的方式描述一下死锁?38、map相关的方法的含义和用法:39、10大排序算法40、解决hash冲突的方式
2022-10-25 18:25:49 521
原创 2023届C/C++软件开发工程师校招面试常问知识点复盘Part 4
31、memcpy()、strcpy()、strcmp()31.1 strcpy()31.2 strncpy()31.3 strcmp()31.4 strncmp()31.5 memcpy()31.6 memcmp()32、C++内联函数1、内联函数解决了什么问题?2、注意3、语法上的细节33、给一个结构体计算大小34、static的作用35、内存分区
2022-10-25 18:19:12 929
原创 2023届C/C++软件开发工程师校招面试常问知识点复盘Part 3
21、QT的信号槽机制22、野指针与悬空指针23、MFC中的`SendMessage()`与`PostMessage()`的区别24、Float是怎么存储小数的?25、New与malloc26、Switch与if else的区别27、怎么实现在main()函数之前运行函数28、STL中容器了解哪些29、Map底层是什么 —— 红黑树30、红黑树原理是什么
2022-10-25 17:01:03 1068
原创 2023届C/C++软件开发工程师校招面试常问知识点复盘Part 2
10、函数指针、指针函数、回调函数10.1、函数指针10.2 指针函数10.3 回调函数11、TCP和UDP区别?12、TCP中的超时重传是在哪一层实现?13、怎么解决粘包问题?14、帧头是怎么写的?怎么实现的区分帧头每一帧数据?15、写一个socket服务端需要那些步骤?16、用过C和C++的混编吗?`extern "C"`的作用和存在意义?17、int型数组:int arr[10];那么sizeof(arr)是多少?用一个指针指向这个数组,sizeof这个指针大小是多少?
2022-10-25 16:56:12 1497
原创 2023届C/C++软件开发工程师校招面试常问知识点复盘Part 1
1、类A其中有一个函数,函数功能只是打印“hello world”,如果:A p = new A();之后delete了这个p然后使用p指向这个函数会发生什么?2、纯虚函数3、C++11新特性?4、内存泄漏5、智能指针一定不会造成内存泄漏吗?使用的时候要注意什么?6、有一个很多数据的大数组,我想拿到前十个最大的,怎么拿7、堆排序的时间复杂度?时间复杂度的定义、概念8、右值引用9、构造函数可以是virtual吗?原因?析构呢
2022-10-25 16:18:58 1178
原创 (四)Windows网络模型之完成端口模型详解
完成端口模型是重叠IO模型的升级版,它解决了重叠IO模型中线程过多导致效率下降的问题。在完成端口模型中,我们新创建一个完成端口变量,并将所有的socket(包括服务器socket和客户端通信socket)都绑定到完成端口上。然后使用AcceptEx()、WSARecv()、WSASend()函数异步投递相应的任务,等任务完成后操作系统将完成通知放进通知队列中。之后程序员创建合理数目的线程,在线程函数中取出通知队列的头部,然后分析并分类处理。该模型所有函数执行部分都是异步的,而且不存在线程滥用问题
2022-08-08 16:00:16 1213
原创 (二)Windows网络模型之异步选择模型(基于消息机制)
Windows处理用户行为的方式之一。消息机制的核心是消息队列,所有用户的操作都可以被认为是一个消息,当某些用户动作发生后,其对应的消息就会进入操作系统维护的消息队列;程序员负责将消息队列中的消息取出,并根据消息类型进行分类处理;消息队列是由操作系统维护的;因此消息机制是有序地处理消息队列中的所有消息,早产生的消息早处理!......
2022-08-07 13:50:44 410
原创 (三)Windows网络模型之重叠IO模型(事件通知和完成例程)
基本的C/S模型,到处都是阻塞的,accept()函数傻等阻塞、recv()函数傻等阻塞、recv()和send()函数均存在的执行阻塞select模型通过FD_SET这样的socket集合,主动查询哪些socket是有信号、有动作的,它解决了accept()和recv()傻等阻塞的问题,但是select()函数本身的执行阻塞也是一个大问题,如果socket非常多,访问量非常高,select模型就非常糟糕了事件选择模型是基于事件机制的select模型的升级版,其通过将事件对象event、socket.
2022-08-06 23:30:07 1018
原创 (一)Windows网络模型之select模型和事件选择模型
所谓网络模型的不断优化,其本质就是在解决函数调用过程中的阻塞问题(傻等阻塞与执行阻塞)select模型解决的是基本C/S模型中的傻等阻塞(accept和recv)accept函数在没有客户端前来连接的时候会一直阻塞等待,也就是傻等阻塞recv函数进行通信,在对端没有发来数据的时候也就一直阻塞等待,也就是傻等阻塞但是select函数本身也是阻塞的,这属于执行阻塞,recv和send在执行的时候造成的阻塞也是执行阻塞,比如数据有点多,在发送和接收数据时就会执行阻塞通常在实际应用中。............
2022-08-04 01:46:26 949
原创 LVS+Nginx实现LVS-DR负载均衡---基于CentOS 7
LVS是4层的负载均衡(ip+端口号的负载均衡);Nginx是7层的负载均衡(基于请求报文的负载均衡);因此LVS的负载能力要比Nginx更高,通常LVS可以做为Nginx集群的调度者,LVS通常只接收请求,不响应请求;......
2022-07-22 23:09:37 768
原创 线程同步---信号量以及与互斥锁构建生产者消费者模型
信号量是用在多线程多任务同步的,通过信号量的资源数来决定是否阻塞线程。信号量可以在没有资源时阻塞线程,也可以主动去增加某个线程所用到的资源数如果信号量的资源数充足,则可能发生多个线程同时访问共享资源,因此需要配合mutex一起使用,进行线程同步...
2022-07-09 20:13:33 223
原创 线程同步---条件变量以及结合互斥锁构建生产者消费者模型
条件变量是进行线程阻塞的一种机制,经常和`互斥锁`结合起来处理生产者消费者模型条件变量给多线程提供了一个会合的场所。条件变量与互斥锁一起使用时,允许线程以无竞争的方式等待特定的条件发生条件变量只有满足特定条件(如,任务队列已满或已空)时才会阻塞线程;如果条件不满足,多个线程可以同时进入临界区,同时读写共享资源,因此还是会造成共享资源的混乱;因此条件变量通常要和互斥锁一起使用,利用互斥锁保证线程同步。...
2022-07-09 20:09:43 245
原创 线程同步---互斥锁的升级版:读写锁
读写锁的读锁锁定临界区之后,线程对临界区的访问是并行的,读锁是共享的;多个线程可以同时访问被读锁锁定的区域读写锁的写锁锁定临界区之后,线程对临界区的访问是串行的,读锁是独占的;类似互斥锁,写锁被锁定时,其他的线程无法获取锁使用读写锁,同时对两个临界区加了读锁和写锁,两个线程需要同时访两个临界区,此时访问写锁临界区的线程优先执行,因为其优先级高于读锁.........
2022-07-09 19:51:39 187
原创 线程同步---互斥锁和用锁不当造成的死锁现象
所谓互斥锁,其实是附加了一个条件,也就是在获得锁的条件下才能运行锁住的代码锁应该是多个线程的共享资源,这样才能起到避免竞争的作用二、死锁1.什么是死锁?死锁:是因为线程在加锁时使用不当,造成的所有的线程都被阻塞的情况,并且线程的阻塞无法被打开,属于无解状态,就是死锁2.死锁场景①加锁之后忘记解锁②重复加锁,造成死锁③程序中有多个共享资源,因此有很多锁,随意加锁,导致互相被阻塞(互锁).........
2022-07-09 19:40:23 1933
原创 线程同步与线程同步的必要性
线程同步非常重要,常用的线程同步方式就是加锁。锁是一种非强制机制,每一个线程在访问数据或资源之前都应该获取锁(或者说上锁、lock),并在访问结束之后释放锁(或者说解锁、unlock)。在锁被别的线程占用时,当前线程就需要等待也即是阻塞,直到锁被释放,然后当前线程抢到锁了,才能继续执行。.........
2022-07-09 16:57:04 481
原创 在VS和Qt中使用动态链接库.dll---以显式链接的方式
在VS和Qt中使用动态链接库.dll(显式链接)编译输出,会生成和,将拷贝到Qt项目目录使用Qt自带的类QLibrary,加载并使用相关的参考文献:
2022-07-07 09:44:56 1420
原创 在Qt和VS中使用动态链接库.dll文件----以隐式链接的方式
①用代码方式或IDE方式导入文件,如上所述 ②添加并包含 ③正常使用注意:有.lib文件的动态库的使用和静态库使用非常相似,区别仅仅在于,使用动态库时,需要将dll文件拷贝到.exe的同级目录或环境变量中同样的,也可以在Qt上隐式调用......
2022-07-07 09:39:25 2687
原创 VS中创建.dll动态链接库、dll中函数与类的导出用__declspec(dllexport)
正确做法:使用进行导出dll函数,编译构建后生成2个文件,一个是,一个是。再结合对应了dll隐式链接调用的三件套:文件、、错误做法:如果不使用而直接编译构建dll库,仅生成,不生成,这是错误的导出方式,将导致无法使用生成方式:注意:在创建动态链接库时,主要是为了适配QLibrary中中,如果用C++编译器编译C代码时的情况............
2022-07-07 09:17:07 1622
原创 Qt中使用静态库.lib(和VS一样,仅仅是操作方式略有差异)
本篇文章我们讲在Qt中使用静态库①导入库—②添加头文件—③包含头文件—④正常使用注意:当把库文件移除后,也即没有上述的第1步(导入库),会出现无法解析的外部符号等错误①代码形式导入库(绝对路径)—②添加头文件—③包含头文件—④正常使用......
2022-07-07 09:05:35 7721 1
原创 设计模式中的几个原则
抽象和复用是软件设计中的金科玉律依赖通常指的是编译时依赖,如A依赖B,即表示A模块编译时,B模块必须存在依赖倒置原则(DIP)高层模块(稳定)不应该依赖低层模块(易变化),二者都应该依赖于抽象抽象模块(稳定)不应该依赖于实现细节(易变化),而应依赖于抽象(如抽象基类)开放封闭原则(OCP)对扩展开放,对更改封闭类模块应该是可扩展的,但却是不可修改的单一职责原则(SRP)一个类应该仅仅有一个引起他变化的原因变化的方向隐含着类的责任Liskov原则(LSP).
2022-05-21 20:43:41 86
原创 常量指针与指针常量
常量指针与指针常量如何记忆呢?只要看const 与 * 的位置关系即可如果const在*的前面const int * p 或 int const * p表明const修饰的是 *p,也即const修饰的是值,是指针p指向的那个值,所以指向的内容不能被修改,p是一个指针常量(指针指向常量)如果const在*的后面int * const p表明const修饰的是p,也即const修饰的是指针p,所以p不能再指向其他的位置,p是一个常量指针(常量的指针)如何对应常量指针和指针常量呢
2022-05-21 17:54:32 241 1
空空如也
关于gets_s函数在linux环境中无法使用,但是可以在VS2019中正常使用
2023-06-28
TA创建的收藏夹 TA关注的收藏夹
TA关注的人