自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

写写代码

个人站点:orangelsk.zone/ 博客园:www.cnblogs.com/orangelsk/

  • 博客(188)
  • 收藏
  • 关注

原创 golang bilibili直播弹幕姬

虽然市面上已有很多成熟的直播姬app,但还是想自己手搓一个以获得些许的成就感(说人话就是在家闲的)。话不多说,来看看我搓的"弹幕姬"有啥好玩的。(目前基础的架子已经搭好了,添加新功能只是人力问题...对,是我懒,哇酷哇酷)ps:感兴趣的同学可以直接在此基础上二次开发,增加新功能了(就是对响应包的字段值做判断,然后调接口balabala...),具体查看bullet_girl/handle_bullet.go中的handle()函数修改配置文件 -> 启动程序 -> 手机小破站扫码登录 -> 程序运行1、首先

2022-06-29 15:48:28 1169 1

原创 【汇编语言】9~x章

目录转移指令的原理 操作符offset jmp指令 jmp指令原理 jcxz、loop 根据位移进行转移的好处 CALL和RET指令 ret 和 retf call ret 和 call 搭配使用 mul指令 模块化设计子程序 标志寄存器 ZF,零标志位 PF,奇偶标志位 SF,符号标志位 CF,进位标志位 OF,溢出标志位 adc 和 sbb cmp 检测比较结果的转移指令 串送指令(movsb、movsw) pu

2022-05-26 23:13:31 303

原创 OSTEP notes

IntroductionOperating Systems: Three Easy Pieceshttps://github.com/remzi-arpacidusseau/ostep-homeworkIndex of /~remzi/OSTEP/ChineseVirtualizationProcessescontent进程状态切换:进程数据结构 process list process control block(PCB)homeworkPROCESS_SWITCH_B

2022-05-11 16:22:30 322

原创 golang kv存储引擎

Bitcask存储模型简介Bitcask是一个kv存储的模型,它采用日志追加写的模式来记录数据。该模型包含两部分:内存部分和磁盘部分。我们都知道内存的读写速度是非常快的,痛点就是内存的易失性,所以我们必须将数据持久化到磁盘文件中。如何在磁盘中高效的读写呢?首先想要高效就必须了解磁盘读取数据的方式,传统的机械硬盘中,机械臂移动到目标磁道,然后磁盘旋转,读取该盘面上的数据,数据通过数据总线进入内存。如果要读取的数据是随机散布在硬盘中,需要消耗大量磁臂和磁盘移动时间,所以磁盘的顺序读取速度远远大于..

2022-05-07 13:22:39 1251

原创 Kinx TCP服务框架

前两天在小破站看到zinx框架的教程,于是跟着学了学,实现完了换了个名叫 Kinx hhhhh~。有意愿的可以star一波~GitHub - k-si/Kinx: tcp服务框架附一张整体架构图:设计思想tcp通信在代码层面上是非常简单的,因为几乎所有的语言都提供了套接字,套接字就是对底层操作系统通信细节的封装,只需要调用封装好的api,就可以完成复杂的通信操作。tcp通信典型的有server-client模式,对于TCP服务器来说扮演的肯定是server的角色。它通过监听端口,循环阻塞获.

2022-05-07 13:21:29 2230

原创 【汇编语言】笔记 1~8章

目录寄存器 数据在寄存器中的存储 8086CPU如何给出物理地址 CS和IP jmp 寄存器(内存访问) 数据在内存单元的存储 DS和[address] CPU的栈机制 内存段 程序的生命周期 编写 编译 连接 加载 寄存器数据在寄存器中的存储8086的CPU是16位结构,其CPU内部总线的宽度是16,这意味着CPU内部的寄存器、运算器、控制器一次能传输、存储的最大数据为16位。对于通用寄存器来说,例如ax,可以分为高位ah和低

2022-04-29 18:44:29 1025

原创 golang分布式任务调度

目录介绍 分析介绍Linux服务器中总是运行着诸多定时任务,任务的调度常借助Linux crontab完成。当任务变多,手工的监控日志、启停任务变得复杂。虽然市面上已有许多完善的任务调度服务,但是对于我们初学者来说,为了锻炼代码能力,尝试自行解决问题,造一造轮子,实现一些demo,也并非坏事。注:文章代码参照课程(Go语言打造分布式Crontab 轻松搞定高性能任务调度)实现,并上传至(https://github.com/k-si/crongo求个star~ otz)分析...

2022-04-15 16:45:36 4393 2

原创 AVLTree 一种自平衡的二叉查找树

什么是平衡树对于已有的二叉查找树,它最坏情况下会退化为链表,查找效率降至O(n),我们希望的是插入或者删除元素始终能使得维持成完全二叉树的样子(完全二叉树n个节点,其高度为logn)这样查找效率就能维持在logn。平衡树字面意义上就是说让树的两边看起来是均匀的,只要满足任意节点的左子树和右子树高度差不大于1,那么就称这棵树为平衡树。AVL树在平衡树的基础上还满足二叉查找树的性质,所以AVL树也称为自平衡二叉查找树。AVL树的旋转想维护一棵AVL树,必然需要在高度失衡时对节点进行调整,使得高度

2021-12-21 15:42:27 789

原创 hashtable 一种根据key值直接进行访问的数据结构

hash是什么哈希用来将很大范围的数(比如[10^-9, 109]),映射到一块较小的区间内。比如对于109,我们想让它映射到[0, 105]这块区间(也可以理解为数组)内,可以直接对109进行取余(10^9 % 10^5),然后根据余数确定该数在区间内的落点。这里的取余操作就叫做hash,取余也是常见的一种hash算法。我们使用hash就是为了节约空间,如果内存大小无限,我们直接选择开一块2 * 10^9的数据存放数据即可,但是这块内存可能有很多空闲区域。实际中内存是有限的,我们需要尽可能的将大范

2021-12-16 15:47:34 991

原创 golang分布式缓存

前言https://github.com/k-si/Janney是我模仿groupcache完成的一个分布式缓存,体积较小,适合学习分布式缓存思想。ps:仓库命名习惯用一些姓氏~groupcache的思想cache通过内存加速数据访问,如果访问的数据不在缓存中,那么就需要去别处获取该数据,方式一般有从本地数据库获取,或是请求远程节点,从别的节点去拿数据。groupcache本身想要的是每个节点存储专门的数据,比如对于一个指定的key,每次访问这个分布式集群,我都想让key的请求打到唯.

2021-12-16 00:59:32 1410

原创 single flight防止缓存击穿

什么是缓存击穿我们常说的缓存问题:缓存雪崩,缓存击穿,缓存穿透都分别指什么呢?简单来说:缓存雪崩是指缓存在同一时间全部失效,导致压力全部转移到DB上。 缓存击穿指的是某个key在失效的这一刻,有大量的请求数据,这些数据压力也转移到了DB。 缓存穿透指的是大量数据访问一个不存在的key,导致每次都必须请求DB,DB压力过大。如何减少瞬间压力像缓存雪崩这种现象,一般是由于缓存服务器宕机(key哈希失效),大量的key设置了相同失效时间导致。可以通过哈希环或者人为控制key的失效时间来避免。

2021-12-07 09:59:03 622

原创 mmap 通过地址映射读写文件

预备知识理解mmap,首先要理解什么是用户态和内核态,其次要了解虚拟内存。简单的说,用户态内核态指的就是cpu指令集的权限程度,我们用户程序并没有操作硬件的权限,于是很多操作都需要转为内核态才能被执行。我们的物理内存也是分为用户空间和内核空间的,比如32位处理器的寻址范围为4G,那么低地址的3G就是用户空间,高地址的1G是内核空间。其次是虚拟内存,虚拟内存是一种感受,我们作为os的使用者,能加载的程序大小其实可以超过物理内存,这是因为内存空间不足时,访问一个不存在于内存的数据,会触发缺页中断,进

2021-12-05 02:47:29 595

原创 一致性哈希算法

普通哈希在分布式场景下,往往涉及到负载均衡,比如分布式缓存这种应用,我们希望如果获取相同的key,尽量映射到同一台机器上,这样可以在内存中最快速的获取,如果相同的key总是打到不同的机器上,可能由于缓存淘汰导致该缓存值被替换掉,进而需要读取磁盘,这样性能就会大打折扣。基于此,我们可以获取key值的哈希值,该哈希值对应的就是机器节点,比如key和节点个数做取余运算(key%n),这样每次相同的key必然会打到同一台机器上。但是问题又出现了,分布式环境中最常见的问题就是节点宕机,如果一台节点下线了,

2021-12-04 00:09:15 972

原创 CRC 循环冗余校验

参考:循环冗余校验(CRC)算法入门引导_Ivan 的专栏-CSDN博客_crc校验CRC校验原理及步骤_D_leo的博客-CSDN博客_crc校验crc冗余校验是为了保证接收方收到数据后,能确认数据是完好无损的。crc的思想假象实际中,a向b传小纸条,b怎么知道小纸条上的数据有没有被路上的其他同学修改过呢?聪明的a和b约定好,接受的数据必须按照x进行一次运算,如果运算的结果没有余数,就可以相信纸条内容是正确的。如果a真实传输的数据,运算之后就有余数,那这种约定不久失效了吗?这时聪明.

2021-12-03 20:07:40 135

原创 LRU 一种缓存淘汰算法

LRU是什么我们知道内存中的读写速度很快,基于此很多缓存技术都喜欢将数据存在内存中,但是内存空间是有限的,到达一定量后必然需要将一些不常用的缓存数据删除或者落盘。于是顺应而生了很多缓存淘汰算法。其中比较常见的有FIFO、LFU、LRU、LRU-k、2Q算法等等...其目的都是为了高效的维护缓存数据。缓存淘汰算法当内存占用快满时,要删除哪些缓存数据呢?假如刚删除的缓存数据,下一秒就被访问到,这时只能重新去磁盘读到缓存,大大浪费了时间。所以根据合适的场景选择合适缓存算法很关键。先来看FIFO,先

2021-11-29 21:05:34 861

原创 KMP 算法步骤详解

参考:mooc浙大数据结构数据结构_浙江大学_中国大学MOOC(慕课)kmp算法的本质是:1、当指针 i 指向的 字符s[i] 和指针 j 指向的 字符p[j] 不相同时,指针 i 不回退,指针 j 回退。(对比暴力算法是,指针 i 回退到之前位置的下一个位置,指针 j 直接回退到0)2、然后根据p的相同前后缀处理出来一个数组,记录着每次不匹配时,j 指针应该回退的位置。记录指针回退位置的数组称为match数组,match[i]表示的是:字符串p中,下标从0到i这段区间内,找到最长的且相同.

2021-11-26 12:28:04 524

原创 单调栈和单调队列

单调栈和单调队列都有共同的特性,单调性。所谓单调性就是在一段区间上,这段区间的数是线性递增的,或者线性递减的。栈和队列中一直维护一串单调的数字,那么这个栈和队列就叫做单调栈和单调队列,他们可以解决什么问题呢?一般单调栈解决的是,在一串数字中,求第i个数的左边第一个比它小的数。(当然问题不是绝对的,左边或者右边都可以,第一个比它大或第一个比它小也都可以)例题:活动 - AcWing一般单调队列解决的是,求在某个滑动窗口内的最小值。例题:活动 - AcWing对于求某个区间内的最大值最小值,可

2021-11-25 13:39:58 119

原创 go 逃逸分析

我的博客搬家啦~欢迎光临:今天没吃橘子。月一orange - 博客园逃逸分析我们知道往往声明一个变量或者申请内存空间时,是需要区分内存区域的,有的可以申请栈空间,有的申请堆空间。go语言中决定变量是分配到栈还是堆,取决于go编译器对程序的逃逸分析。在程序编译时,如果发现一个变量需要后续一直使用,往往会将其分配到堆内存。看例子:func test02() *int { a := 10 return &a}func main() { test02()}a在函数.

2021-11-20 20:45:07 208

原创 go 结构体内存对齐

我的博客搬家啦~欢迎光临~月一orange - 博客园 今天没吃橘子对齐规则1、对于结构体成员变量:某个成员的偏移量 = k * min(编译器对齐系数, 该成员类型长度) k >= 12、结构体完整大小也必须满足:min(k * max(编译器对齐系数, 最大成员类型长度)) k >= 1编译器默认对齐长度和计算机一次处理的的位数有关,32位处理器对齐系数为4,64位对齐系数为8。对齐系数就是编译器默认的对齐长度。demo对于这样一个结构体:...

2021-11-20 20:43:01 623

原创 go slice扩容策略

我的博客搬家啦,欢迎光临~月一orange - 博客园 今天没吃橘子slice扩容代码在`go/src/runtime/slice.go`中,当前使用的使用的golang源码是GitHub中的master分支代码。时间是`2021-10-11`。先抛出一个问题,你觉得应该是打印多少呢?```govar b = []int64{1, 1}b = append(b, 1, 1, 1)fmt.Println("cap:", cap(b))```### 入参slice.go中...

2021-11-20 20:39:54 809

原创 静态链表 一种用数组模拟链表的数据结构

区别链表分静态链表和动态链表,工程里一般用动态链表,去new一个node,动态创建节点。静态链表一般用在刷算法题的时候,由于使用数组模拟,没有动态创建过程,并且使用数组下标代替next指针,所以静态链表的速度非常快,缺点就是非常消耗内存。两个数组静态链表中使用两个数组,分别存储节点的值和next“指针”。例如val数组存储节点的值,nex数组存放这个节点指向的下一个节点的下标,例如链表3->5->6->1->7,使用数组存储就是这样的:val: 3 5 6 1

2021-11-20 15:18:37 404

原创 SkipList 一种使用概率替代平衡树的数据结构

SkipList 一种使用概率替代平衡树的数据结构 - 月一orange - 博客园我的博客搬家啦~,来这两个地方看看吧~月一orange - 博客园今天没吃橘子

2021-11-19 18:45:21 645

原创 CPU的栈机制

内存中的一段连续空间,可以看作栈,以先进后出的方式存储信息。如果说栈是什么,最好的例子应该是手枪弹夹。这是一段连续的内存空间,由弹夹入口至弹夹底部,内存单元地址递增,假设入口处地址为10000H,每个子弹占据一块标准内存空间(1个字节),第二颗子弹起始位置就应该是10001H。假设一共有16颗子弹,那么整体占用的地址应该是从10000H~10010H。栈空间是人为想象出来的,那么CPU怎么确定栈的入口和终点?首先要明确栈顶的概念,栈顶(SP)是个指针,永远指向栈中“最高“位置处,栈顶指向的内存空间地

2021-08-30 19:32:48 1426

原创 寄存器访问内存

内存中字的存储字用来描述cpu一次性能处理的数据量,比如8086PC机的CPU是16位机型,一次可处理16位bit,那么对于该机器,一个字表示16个bit。一块内存单元存放一个字节,那么一个字需要两个内存单元。实际上,字存储在连续的两个内存单元中,这两个内存单元成为字单元。高位地址单元存放字的高位,低位地址单元存放字的低位。比如,1234H,0号单元存储34H,1号单元存储12H。寄存器的赋值前面我们学习过如何将汇编指令写入内存,让CS:IP指向命令所在内存地址,通过t命令来执行汇编指令

2021-08-30 19:32:06 335

原创 debug的使用

查看、改变寄存器内容R命令可以查看、改变寄存器的内容。通过-r,可以看到各个寄存器中的值。并且还展示了CS:IP存储的机器码和其对应的编译指令。(DOSbox是虚拟dos环境,存储的值基本都是0)-r后指定寄存器名称,就可以自定义寄存器存储的值。查看内存单元存储的值默认方式查看D命令可以查看内存空间的值。-d 默认每次展示128个内存单元的信息 右侧显示内存单元ascii码值,比如34H=52,表示的是4,对于不能表示的字符,统一用 . 代替 起始位置是当前CS:I.

2021-08-30 19:30:51 1481

原创 寄存器执行指令过程

文章中涉及的机器默认为8086CPU和8086PC机寄存器8086有14个寄存器,其中AX BX CX DX通常存放一般数据,可以简单认为他们就是变量。例如:mov ax,4E20H就是将数据存入AX。add ax,1406H就是将数据加到原有的值上。8086的寄存器有16个比特位,他可以当作两个8比特位的寄存器使用。这两个寄存器分别叫AL,AH(我猜测是low和high的缩写)。mov al,78H就是将78存入低位字节中。当使用al、ah时,ax就被视为分离的寄存器,al、ah之间独立不相互

2021-08-30 19:30:07 998

原创 CPU对存储器读写

cpu可以进行高速计算,计算需要数据,数据可以存储在内存中。那么cpu在计算时,就需要从内存中读取数据,cpu对内存读写数据是怎样进行的呢?简要来说,分为三步:获取存储单元地址 向存储单元芯片输送控制语句(读/写) 将数据返回cpu或写入内存单元cpu和存储单元交互,必然需要物理硬件支持,一个cpu有n多个线路和其他元件连接。上面三步,分别对应三种数据总线:地址总线 控制总线 数据总线让一台微机进行工作,比如cpu要获取第三号存储单元中的数据,需要向微机输入电平信息,用机器指令表示为

2021-08-30 19:29:26 2201

原创 GoLang-1 mac m1安装配置和go mod

golang横空出世,其三大特点:1、简单配置,不需要类似jdk、nodejs这样的运行环境,语言编译速度极快 2、自带协程,轻松支持高并发 3、

2021-06-20 01:42:40 4880

原创 分页存储管理方式

原理分页式存储管理的原理:假设一个进程大小1KB,我们把1KB分成若干个大小相同的块,叫做一个页面或一页;每页加以编号,从0开始。同时把内存空间分割成与页面大小相同大小的一块块,叫做块或者页框;这样将进程装入内存时,就以块为单位,将进程分为多个部分装入不相邻的物理块中。(进程的最后一页经常装不满而形成页内碎片)基本分页式存储管理(简单分页式存储管理)的原理:当一个作业需要被调入内存...

2021-06-20 00:55:31 3090

原创 docker配置mysql,redis

文章目录介绍:步骤:安装dockerdocker镜像加速安装mysql配置mysql安装redis配置redis持久化数据配置redis密码--name指定容器名字 -v目录挂载 -p指定端口映射 -e设置mysql参数 -d后台运行进入mysql房间,可以发现内部就是一个Linux环境,可以使用ls等命令查看退出房间因为有目录映射,所以我们可以直接在镜像外执行将以下内容写入my.cnf重启mysql设置myql容器在docker启动的时候启动在本机上安装redis在本机修改配置文件插入下面内容,即可打开

2021-05-27 14:53:01 173

原创 Tiree Tree

字典树的结构是多叉树,每个节点有n个出度,每个出度表示一个字符。字典树的节点分为普通节点和终止节点,如图,红色的节点即为终止节点,往字典树中插入一个单词,这个单词的最后一个字符就是终止节点。如图,字典树中包含的单词有:"abcd","abd","b","bcd","efg","hi "。在输入框自动联想、单词出现频率统计的场景上都应用到了字典树。在有巨量相同前缀的单词中,字典树的效率高于哈希表,时间复杂度固定为O(len(str)),但是字典树的构建会消耗大量空间。字典树的特点就是尽量避免相同前缀的单词

2021-04-03 12:27:54 150

原创 Jmeter实践操作——数据库数据驱动

场景:从MySQL中循环读取用户名密码,登录bugfree创建case。步骤:启动bugfree环境,在数据库中新建表,存储几条用户名密码 设置浏览器代理,启动jmeter进行录制 对录制生成的脚本进行筛选,提取关键http请求 添加JDBC配置元件,配置好参数 在Thread Group中添加JDBC请求,填写sql语句和参数名 添加查看结果树和调试取样器,运行一次,查看结果树中的信息 添加while控制器和计数器,设置循环终止条件和和计数器步长 添加if控制器,设置if条件以下是

2021-03-23 00:30:03 324 1

原创 开源测试框架期末复习

第一章:基础概念软件测试分类根据项目流程阶段划分软件测试:单元测试、集成测试、系统测试、验收测试软件测试工作中对软件代码的可见程度:白盒测试与黑盒测试软件的不同测试面:功能测试与性能测试软件测试工作的自动化程度:手工测试与自动化测试自动化测试优缺点:重点缩短软件开发测试周期,可以让产品更快投放市场。测试效率高,充分利用硬件资源。节省人力资源,降低测试成本。增强测试的稳定性和可靠性。提高软件测试的准确度和精确度,增加软件信任度。软件测试工具使测试工作相对比较容易,但能产生更高质

2020-09-08 23:48:13 241

原创 最新开源Android项目,适合新手练习!

20天,从零开始学习Android,最终完成了一个比较满意的背王理小项目,希望大家多多star哦 >_<,谢谢!sdk10.0,代码清晰,注释全面。功能支持查找备忘,手势拖动,分类备忘等等......https://github.com/k-si/Calm-Note...

2020-08-22 00:16:05 911 1

原创 Android:CardView出现点击失效

问题具体是:cardview里加入几个textview,之后点击textview所在区域时点击失效,而点击空白区域,也就是非textview区域时点击有效。这个蛋疼的问题恶心了我好久,查看textview,删去android:inputType="textMultiLine"...

2020-08-14 14:41:08 756

原创 剪绳子

2020-07-24 23:20:25 76

原创 webdriver点击登录失效问题的解决

先描述一下问题:这是登录按钮的html,在testLogin方法中整个登录流程正常执行,并且不报错。但是登录后的界面不会显示,我试着在点击登录后设置sleep五秒,事实却是在输入用户名密码后网页静止,大概五秒后,页面关闭。控制台显示测试成功。这显然是不正常的,因为如果出现不了登录后的页面,后续的测试也无法进行。click方法失效,但是却没被检测到错误,这里我不知原因,如果有知道的朋友可以留言,谢谢。解决方法:百度发现问题原因是click的时候失去了焦点,解决方式是先点击父元素,然后点击子

2020-05-22 16:35:31 1022

原创 单元格中出现input时,单元格长度变宽怎么办?

table的css中添加:table-layout: fixed;

2020-05-17 01:39:37 496 1

原创 浏览器查看.md文件强烈推荐Markdown Viewer

Markdown Viewer是一个firefox浏览器扩展插件,可以很方便的在浏览器上以markdown的形式浏览文件。展示一下它的用法:直接在浏览器输入D:进入D盘和资源管理器一样的界面和操作直接点开markdown.md文件,插件自动展示为markdown形式点击插件按钮可以设置更多的功能,代码文字高亮风格、目录、显示表情等等......

2020-04-30 18:28:01 30213 5

转载 运行selenium remotedriver时出现与NativeConstructorAccessorImpl.newInstance0错误的SessionNotCreatedException错误

转载地址:http://www.voidcn.com/article/p-ccdzafzn-bto.html报错信息:Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: Unable to create new service: ChromeDriverServiceBuild info:...

2020-04-23 20:58:38 1806

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除