设计模式——构建者模式 提高可读性:通过方法链的方式设置参数,使得代码更加清晰易读。处理多参数:优雅地处理大量参数,特别是当有些参数是可选的时候。保证不可变性:一旦对象被创建,就不能被修改,这在并发编程中特别有用。分离构建过程:将复杂对象的构建过程与其表示分离,同样的构建过程可以创建不同的表示。控制构建步骤:可以更好地控制构建步骤,例如可以添加一些验证逻辑。构建者模式特别适用于创建复杂对象,尤其是当对象有多个可选参数或构建步骤时。它可以大大提高代码的可读性、可维护性和灵活性。
设计模式——工厂模式 解耦:将对象的创建与使用分离,客户端代码不再依赖于具体类。封装变化:将可能变化的部分(对象的创建)封装起来。简化客户端代码:客户端不需要知道对象创建的细节。集中管理:对象的创建逻辑集中在一处,便于维护和修改。提高扩展性:添加新的产品类型时,只需要修改工厂类,不需要修改客户端代码。这些优势在大型项目或需要频繁修改的系统中尤为明显,可以大大提高代码的可维护性和灵活性。
Spring中Bean创建过程中各个阶段的作用 这种分层方法允许开发者在 Bean 生命周期的不同点进行干预,提供了极大的灵活性和可扩展性。虽然关于Spring中Bean的创建过程的资料很多,但却很少说为什么要划分这些阶段,以及这些阶段划分处理后在开发中可以用来做什么。这必须在最后执行,以确保它能捕获到所有可能的方法调用,包括在之前阶段添加的方法。自定义初始化方法提供了更大的灵活性,允许开发者定义特定的初始化逻辑,而不需要实现。可以访问环境配置,从而根据不同的地区应用不同的业务逻辑,如税收计算方式。中,因为它是特定于应用的逻辑,而不是通用的初始化。
C++完美转发【gpt】 在 C++ 中,完美转发允许你将参数以及它们的类型从一个函数传递到另一个函数,同时保持参数的原始类型,而不需要进行额外的拷贝或变换。这时,你可以把家具的描述(参数类型)告诉搬家具的人(函数),然后让他们根据描述(参数类型)自行决定如何搬运。直接搬运:你(编写的代码)告诉搬家具的人(函数)需要搬哪些家具(参数),然后他们(函数)就按照你指示的方式把家具搬过去。假设你有一个房子(函数),你想把家具(参数)从一个房间(函数)搬到另一个房间(函数)。好的,让我用非常通俗易懂的方式解释一下 C++ 中的完美转发。
就业的二三事 虽然在CV领域中相对不卷,但从了解的情况来看,门槛也不低,需要有顶会。而现在资本下行,企业缩招,这个情况下,走这个方向也有点危险。而想用C++作后端的公司主要追求C++的高性能,对技术的要求将会很高;先说一下当前本人的情况:双非本一,研二在读,一篇图像处理方面的sci一区(二作),日常工作语言为python,有过一段开源实习。音视频方向了解的不多,但在boss直聘、leetcode上搜索出来的岗位很少,需要进一步了解;从牛客的帖子上来看,很多人并不推荐双非走C++相关方向,而JAVA是一个更加可取的方向;
网络通信过程的一些基础问题 回顾网线水晶头的结构,网线一般都有八根线芯,根据T568B的标准,相对应网线颜色分为1橙白,2橙,3绿白,4蓝,5蓝白,6绿,7棕白,8棕。在正常情况下,如果接收方的处理速度跟不上发送方的速度,接收方的TCP窗口大小会减小,甚至变为0。双方通过TCP的三次握手过程能协商出一个初始的窗口大小,之后在数据传输过程中,接收方会通过ACK报文将自己当前的窗口大小告知发送方,以便发送方能根据这个窗口值调整数据发送量。在 TCP 中,数据传输是双向的,也就是说,连接的两端(即端口)都可以同时接收和发送数据。
ELF文件信息初步探索 之前一直想把自己的学习过程记录在个人博客网站上,但这个要自己维护,上传图片什么的比较麻烦。关键是没有人互动,自己也没有怎么去看,慢慢的就遗忘了。准备开个专栏,记录《从零开始实现链接器》的学习过程,先占个坑。
网络路径跟踪 通过这种方法,tracert就能得知数据包经过的每一跳的信息。换句话说,即使在tracert命令运行期间,google.com被解析为不同的IP地址,也不会更改初始的目标,即第一次解析出的IP地址仍是tracert命令的目标。总之,这次traceroute过程显示了你的数据包是如何从你的本地计算机一直到达google.com服务器的每一步,包括国内网络环境,海底光缆,以及Google的内部网络。但是网络是动态变化的,会不会在跟踪的时候,tracert前一次发送的ICMP数据包所走的路径和后一次完全不同呢?
多线程中的单例模式 在这个单例类中, 定义了静态(static)成员变量instance_,这意味着无论创建多少个类的对象,该静态成员都只有一个副本。后,x的值应该为100,所以thread2的的输出结果为100。,假设thread2后执行,则由于先执行的thread1激活了锁,导致thread2被锁阻塞,thread1进入的则进行第二次检查,发现。在这种情况下,thread2的输出x的结果可能为原先的值,即0。为防止出现编译优化引发的问题,在前面实现的多线程单例模式中,对。正常情况下,在threa1中,执行完。
在Lichee RV Dock上的不成功的烧录尝试 要完成这个任务,需要将程序烧录到sd卡上,板子通电后先执行bootloader程序,再跳转去执行sd卡上的程序,而bootloader程序是机器自带的,所以不用更改。要做的就是写好程序并烧录到sd卡上。不过我了解到了另一种方式,直接在DDR内存中跑编写的.bin文件,通过FEL程序将bin文件烧录到DDR上(可惜似乎不能用FEL程序烧录sd卡),相关教程见。,刚好手里有块RISC RV Dock 的板子,所以在学了基础的"hello, world"程序后,想着能不能把这个程序烧录到板子上,简单的做个实验。
域名和hostname 这里的感觉挺有趣的,我们上网的时候地址中常常不会出现具体的ip地址,而是使用便于记忆的域名。这种情况下,首先需要经过dns服务器对域名进行解析,得到对应的ip地址,再根据这个ip地址从客户端向服务器发起网络连接。比如访问,首先是浏览器会在后台请求dns服务器或从本地缓存中获取它具体的ip地址。我们可以采用github.com在本地的主机中,我们也可以设置一个ip地址的hostname,这个hostname和域名类似。比如在linux中通过在/etc/hosts文件中设置127.0.0.1。
正则表达式整理(BRE、ERE、PCRE) 学完正则表达式后,发现vscode的查找替换功能支持正则表达式,经常在vscode上实践,用得也越来越顺手,一度觉得自己的正则表达式玩的挺溜的。但每每在grepfindvim这些工具中使用正则表达式时,却总有各种问题,在vscode上正常工作的正则表达式突然不起作用,甚至还给报错,不禁让人怀疑人生。直到今天才发现,这些差异是grep等工具所支持的正则表达式与vscode不同引起的。总的来说,正则表达式可以分为三个不同的类别,其中BRE只支持基本的正则表达式,特殊规则需要使用转义符才能使用;ERE在。
使用bpftrace监测程序中函数的使用情况 在上一次实验中,通过profile工具获取了进程的火焰图,在火焰图中有大量的函数符号,所以这次实验想用bpftrace来监测程序中某个函数的使用情况。这个程序使用使用open调用读写文件,并输出进程的pid,每0.1s重复一次。先通过得到可执行文件test,再使用bpftrace很奇怪的是,列出的函数挂载点中,并没有open函数,这是为什么呢?先使用nm发现用bpftrace列出的符号都位于,这些符号是确定的静态符号;再观察下面的,发现opengetpidprintf这些符号都在这里。
ubuntu22.04静态ip设置(桥接模式、only-host+NAT模式) DHCP服务器会检查IP地址池中是否有可用的IP地址,并为虚拟机分配一个新的IP地址,而且是随机地址,这在有些情况下会造成不便。比如我想通过ssh来连接一台虚拟机,如果地址变动的话,那我每次连接虚拟机的时候,还得先去看一下虚拟机的新ip地址,然后再进行连接。(当我们关闭DHCP后,ip地址池是由我们自己管理的,所以在分配地址时,注意子网中的ip地址不能重复)。在创建一台虚拟机后,默认的方式往往是通过DHCP动态的进行分配,DHCP服务器会告知创建的虚拟机分配到的ip地址,网关地址等信息。
docker镜像大小 此时就会出现一个奇怪的情形,这个镜像中新增了一个100MB的文件,随后又删掉了,按理说镜像的大小应该和ubuntu:22.04镜像的大小相同,但实际上却要多出100MB,这是因为docker image中保留了构建过程的每一层。时,这条命令会创建一个100MB大小的文件file.txt,此时docker image会增加一层。所以在编写dockerfile时,需要特别注意命令的执行顺序和方式,避免镜像太大。执行结束后镜像才会添加新的一层,而这一层的大小为0。,docker image中会再增加一层。