- 博客(98)
- 收藏
- 关注
原创 transformer初探
这里有一个很关键的点是,在encoder中只有self-attention,因为是一次性输入所有的token,计算每个token之间的关联性,得到一个编码后的输出。但是decoder是一个一个输入,每输入一个产生一个输出,虽然说这一步也可以用矩阵并行计算,其原理就是masked-attention。值得注意的是,在decoder中mask-attention后的输出,还会和encoder的输出再作一次attention,这被称为cross-attention。,这三个矩阵就是需要训练的参数。
2024-07-06 11:17:28
923
原创 qml下拉条实现
Rectangle里面嵌套一个Flickable,然后下面是一个Rectangle,作为滑动的区域,给最外层的Rectangle的y加一个属性动画。滑动区域写好onPressed和Onrelease即可。
2024-05-21 16:19:21
182
原创 qml之DropArea和Drag
Drag.active不是Rectangle的属性,但是实际使用的时候,都是这样使用的,官方例子也是这样,貌似任何项目都可以使用Drag来实现拖放。借鉴这个思想,后面考虑如何拖动添加卡片。
2024-05-09 20:37:24
239
原创 qml拖动交换之Gridview
移动的时候,会不断触发onPositionChanged,将btnIcon对象的左上角坐标,转换成gridview下的坐标,根据这个坐标计算是在gridview中的哪一格,以此来判断是否需要交换。如果需要交换,就将之前记录的那个索引dragIndex对应的元素,移动到新的idx对应的元素那里。我们拖动的是那个元素里面的一个子元素!这是btnIcon在btnIconArea中的相对位置,然后将btnIcon的parent换成btnIconArea,这一步很重要!
2024-05-09 15:39:08
486
原创 协程——uthread学习
调度器包括主函数的上下文main,包含当前调度器拥有的所有协程的vector类型的threads,以及指向当前正在执行的协程的编号running_thread.如果当前没有正在执行的协程时,running_thread=-1.ctx保存协程的上下文,stack为协程的栈,栈大小默认为DEFAULT_STACK_SZIE=128Kb.你可以根据自己的需求更改栈的大小。最重要的点:我感觉恢复上下文的时候,是恢复到下一行!func为协程执行的用户函数,arg为func的参数。更详细的介绍,请查看我的中文博客。
2024-04-29 18:00:34
486
原创 I/O模型的一些理解
异步:把事情推到以后去做阻塞:专心做一件事情同步阻塞:马上专心做一件事情同步非阻塞:一边做一件事情,一边做另一件事情(一心二用)异步阻塞:把问题推到以后专心处理异步非阻塞:把问题推到以后时不时处理一下。
2024-03-28 16:29:49
1221
原创 Bert的一些理解
BERT 模型的训练数据集通常是以预训练任务的形式来构建的,其中包括两个主要任务:Masked Language Model (MLM) 和 Next Sentence Prediction (NSP)。下面简要介绍这两个任务在数据集中的格式:举个例子举个例子:对于每一个训练样例,我们在语料库中挑选出句子A和句子B来组成,50%的时候句子B就是句子A的下一句(标注为IsNext),剩下50%的时候句子B是语料库中的随机句子(标注为NotNext)。接下来把训练样例输入到BERT模型中,用[CLS]对应的
2024-03-19 17:17:16
600
原创 记忆化搜索
的矩阵 ,要求选择一个起点,然后选择上下左右四个相邻方向之一开始行走,并且要保证行走的点的值比当前点小,即找一条单调递减的路径,要求这条路径最长。偏序关系其实就是代表了状态转移的方向,例如上面只允许值大的往值小的方向走,这就是一种偏序关系;今天每日一题可以用dp做,但是看答案有人用记忆化搜索,以前也经常听到这个名词,so今天好好来学一下,什么是记忆化搜索。因为在递归计算的时候,我们必须保证传入参数的合法性,所以这一步是必要的,比如坐标为负数之类的判断;的值,而不需要使用额外的变量。时,我们可以直接修改。
2024-03-15 17:35:25
766
原创 关于c++右值的一些理解
在测试程序中getObj()的返回值就是一个将亡值,也就是说是一个右值,在进行赋值操作的时候如果=右边是一个右值,那么移动构造函数就会被调用。移动构造中使用了右值引用,会将临时对象中的堆内存地址的所有权转移给对象t,这块内存被成功续命,因此在t对象中还可以继续使用这块内存。将亡值:与右值引用相关的表达式,比如,T&&类型函数的返回值、 std::move 的返回值等。,其生命周期与右值引用类型变量的生命周期一样,只要该变量还活着,该右值临时量将会一直存活下去。右值引用就是对一个右值进行引用的类型。
2024-03-04 14:20:39
927
原创 最小生成树Prim + Kruskal
通过这个例子可以看到,t.join(1, 3);还是t.join(3, 1);最后判断t.isSame(1, 3)都会是true。这里不能直接将isSame抽象出来,在join里面调用,必须寻根以后再。通过模板,我们可以知道,并查集主要有三个功能。这里直接用carl给的模板。
2024-02-28 18:33:50
359
原创 LFU算法
大致就是说LFUCache类维护一个存放node的map,同时维护两个双向链表,注意这个双向链表里面又包含了两个双向链表,访问的频率是first最大,last最小。其余的就是正常的双向链表的操作了(插入,删除)Leetcode有原题,之前手写过LRU,数据结构还是习惯于用java实现,实现是copy的评论题解。Least Frequently Used(最不频繁使用)
2024-01-24 17:07:33
394
原创 正向代理和反向代理
事实上,正向代理和反向代理的作用都是进行请求和转发,但是为了区别正向代理,所以后出现的就成为反向代理。生活中最常见的例子:1、正向代理: 卖票的黄牛2、反向代理: 出租房的二手东。
2024-01-16 17:39:31
837
原创 Linux高性能服务器编程——学习笔记①
当发送端使用send或write向一个TCP连接写入数据的时候,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。 第二,ARP请求和应答是从以太网驱动程序发出的,而并非像图中描述的那样从ARP模块直接发送到以太网上,所以我们将它们用虚线表示,这主要是为了体现携带ARP数据的以太网帧和其他以太网帧(比如携带IP数据报的以太网帧)的区别。如何将机器的域名转换成IP?
2024-01-13 16:33:58
1052
原创 virtualbox共享文件夹
home/zyt/win_workspace/ : 虚拟机的文件夹。shared_file : 共享文件夹的昵称。对应于D:\Workspace。
2023-12-27 16:21:55
540
原创 C++线程同步之条件变量
看这块的时候,可以结合c里面的条件变量一起看,机制都一样,函数不一样罢了。条件变量是C++11提供的另外一种用于等待的同步机制,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时时,才会唤醒当前阻塞的线程。条件变量需要和互斥量配合起来使用,C++11提供了两种条件变量:std::mutexnotify_one()或者唤醒一个或者所有被阻塞的线程。
2023-12-22 11:19:52
154
原创 python删除空文件夹
这种方式只能删除树上,最底层的空文件夹,如果某个文件夹内部只有一个空文件夹,那么上述代码执行以后,该文件夹最后也会变成一个空文件夹,但是不会被删除掉。
2023-12-17 04:17:07
99
原创 UDP特性之广播
发送的ip统一填广播地址,比如10.82.254.255接收方的bind的ip要么INADDR_ANY要么具体的ip(这个好像不行,留个疑问)直接不填也行。
2023-12-14 14:33:49
205
原创 (important)关于socket的一些理解
因为之前都是统一指定的ip为127.0.0.1 一直只是尝试本机通信,明白上述三点以后,seraddr.sin_addr.s_addr到底应该填多少,相信大家心里都会清楚。然后再调用bind函数,表示服务端程序,允许任何本地IP地址接受连接,(因为可能有多个网卡,多个ip地址),同时绑定本地的9999端口。客户端的端口号应该是操作系统自动分配的。至于其他的通信函数,可以看之前写的文章。
2023-12-13 18:32:42
378
原创 基于UDP的套接字通信
udp是一个面向无连接的,不安全的,报式传输层协议,udp的通信过程默认也是阻塞的。UDP通信不需要建立连接,因此不需要进行connect()操作UDP通信过程中,每次都需要指定数据接收端的IP和端口,和发快递差不多UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息UDP对接收到的数据报不回复确认信息,发送端不知道数据是否被正确接收,也不会重发数据。如果发生了数据丢失,不存在丢一半的情况,如果丢当前这个数据包就全部丢失了。
2023-12-13 14:37:19
108
原创 IO多路转接之epoll
epoll 全称 eventpoll,是 linux 内核实现IO多路转接/复用(IO multiplexing)的一个实现。IO多路转接的意思是在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。
2023-12-11 16:37:48
60
原创 IO多路转接之poll
从上面的测试代码可以得知,使用poll和select进行IO多路转接的处理思路是完全相同的,但是使用poll编写的代码看起来会更直观一些,select使用的位图的方式来标记要委托内核检测的文件描述符(每个比特位对应一个唯一的文件描述符),并且对这个。一点自己的思考:现在写的一些通信方式,都是基于固定大小的数组,是理想的情况,如果数组比较小,多次write或者多次read怎么解决?内核会根据第二个参数传递的值对参数1数组中的文件描述符进行线性遍历,这一点和select也是类似的。指定poll函数的阻塞时长。
2023-12-11 10:28:30
35
原创 关于read函数阻塞的问题
末尾提到了一点,服务端读取每次是读取10个字节的,如果超过10个字节,需要读取多次,但是客户端只会read一次,第二次read的时候,直接阻塞了。
2023-12-08 17:58:45
178
原创 IO多路转接之select
但是上面的客户端代码有个问题,就是服务端多次写入的时候,客户端只能收到前面10个字节的数据,但是如果循环调用read,客户端read会阻塞,因为这里服务端是不会主动发送数据的,只是把客户端传过来的数据重新传回去。在select()函数中第2、3、4个参数都是fd_set类型,它表示一个文件描述符的集合,类似于信号集 sigset_t,这个类型的数据有128个字节,也就是1024个标志位,和内核中文件描述符表中的文件描述符个数是一样的。IO多路转接也称为IO多路复用,它是一种网络通信的手段(机制),
2023-12-08 16:27:15
228
原创 套接字通信类的封装
/ 创建监套接字return -1;printf("套接字创建成功, fd=%d\n", fd);return fd;// 绑定本地的IP和端口return -1;printf("套接字绑定成功, ip: %s, port: %d\n",return ret;// 设置监听return -1;printf("设置监听成功...\n");return ret;// 阻塞并等待客户端的连接elsereturn -1;
2023-12-07 19:51:53
77
原创 TCP数据粘包的处理
关于数据包的包头大小可以根据自己的实际需求进行设定,这里没有啥特殊需求,因此规定包头的固定大小为4个字节,用于存储当前数据块的总字节数。但是这种叫法不太对的,本身TCP就是面向连接的流式传输协议,特性如此,我们却说是TCP这个协议出了问题,这只能说是使用者的无知。多个数据包粘连到一起无法拆分是我们的需求过于复杂造成的,是程序猿的问题而不是协议的问题,TCP协议表示这锅它不想背。因为数据的传输是基于流的所以发送端和接收端每次处理的数据的量,处理数据的频率可以不是对等的,可以按照自身需求来进行决策。
2023-12-07 16:39:11
268
原创 Linux进程间通信——共享内存
共享内存不同于内存映射区,它不属于任何进程,并且不受进程生命周期的影响。通过调用Linux提供的系统函数就可得到这块共享内存。使用之前需要让进程和共享内存进行关联,得到共享内存的起始地址之后就可以直接进行读写操作了,进程也可以和这块共享内存解除关联, 解除关联之后就不能操作这块共享内存了。在所有进程间通信的方式中共享内存的效率是最高的。共享内存操作默认不阻塞,如果多个进程同时读写共享内存,可能出现数据混乱,共享内存需要借助其他机制来保证进程间的数据同步,比如:信号量,共享内存内部没有提供这种机制。
2023-12-04 15:48:11
71
原创 Linux进程通信——内存映射mmap
如上图所示:磁盘文件数据可以完全加载到进程的内存映射区也可以部分加载到进程的内存映射区,当进程A中的内存映射区数据被修改了,数据会被自动同步到磁盘文件,同时和磁盘文件建立映射关系的其他进程内存映射区中的数据也会和磁盘文件进行数据的实时同步,这个同步机制保障了各个进程之间的数据共享。使用内存映射区除了可以实现进程间通信,也可以进行文件的拷贝,使用这种方式拷贝文件可以减少程序猿的工作量,我们只需要负责创建内存映射区和打开磁盘文件,关于文件中的数据读写就无需关心了。
2023-12-04 15:07:17
80
原创 Linux进程间通信方式——管道
不管是有血缘关系还是没有血缘关系,使用有名管道实现进程间通信的方式是相同的,就是在两个进程中分别以读、写的方式打开磁盘上的管道文件,得到用于读管道、写管道的文件描述符,就可以调用对应的read()、write()函数进行读写操作了。匿名管道是管道的一种,既然是匿名也就是说这个管道没有名字,但其本质是不变的,就是位于内核中的一块内存,匿名管道拥有上面介绍的管道的所有特性,额外的我们需要知道,第一步: 在父进程中创建了匿名管道,得到了两个分配的文件描述符,fd3操作管道的读端,fd4操作管道的写端。
2023-12-01 18:04:19
57
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人