- 博客(53)
- 收藏
- 关注
原创 飞书Aily全功能实操操作手册
1. 路径:飞书Aily → 开发应用 → 飞书妙搭,支持图片生成、粒子特效、全栈数据库搭建,数据可从多维表格一键导入。3. 开发后台可独立新建专属知识空间,配套配置术语库、专属名词库、检索规则,适配数据运营场景。2. 右键消息快捷操作:钉住消息、独立窗口打开、标记内容、三点菜单加急推送、添加标签。导入模式:切片颗粒更小,适配图表、复杂图文素材,可作为知识库备份;2. 基础配置:设置开场白、预设问答、配置快捷指令,复制链接可直达对应工作流。1. 组件市场:插入各类基础组件、调整页面基础风格;
2026-07-01 15:22:19
1888
原创 公司内网linux服务器环境搭建 - JDK + Nginx + MySQL
本文档用于记录在 UOS Server 20 操作系统上部署 Java 运行环境及 Web 服务环境的完整流程,包括 JDK 21、MySQL 5.7、Nginx 的安装、配置和验证方法。CREATE USER '用户名'@'访问范围' IDENTIFIED BY '密码';localhost:仅服务器本机可登录(安全最高)10.217.%:仅公司内网网段可登录:任意IP均可登录实操示例:# 创建用户,自定义密码。
2026-07-01 15:17:38
351
原创 vector如何保证元素的连续存储
这意味着在内存中,vector 的所有元素都被放置在一个连续的内存块中。3内存管理策略:vector 通常使用“倍增”(1.5倍或者2倍)策略来扩容,即每次扩容时将容量增加到当前的两倍(或者按照特定的增长因子增加)。这个过程包括分配一个更大的内存块、将现有元素复制到新的内存块中,并释放旧的内存块。4连续性的好处:由于所有元素都存储在连续的内存块中,vector 能够提供快速的随机访问。●图形处理:在处理图像或图形时,像素或顶点数据可以存储在 vector 中,以利用其快速随机访问的优势。
2026-04-18 16:30:39
258
原创 vector容器和它的特点
●动态数据集合:当你需要一个可以根据数据量动态调整大小的数组时,vector是一个很好的选择。在实际应用中,选择正确的数据结构往往是优化程序性能的关键。2随机访问:就像数组一样,vector支持随机访问,这意味着你可以通过索引直接访问任何元素,访问时间是常数时间复杂度(O(1))。●性能敏感的应用:由于其元素紧密排列在连续的内存块中,vector通常提供高效的内存访问性能,适合用于性能敏感的应用。●需要快速访问的数据:由于vector支持随机访问,它非常适合于需要频繁读取元素的情况,比如查找或排序算法中。
2026-04-18 16:29:26
37
原创 项目《基于Linux下的mybash命令解释器》(一)
那么,这也就是我们改进的方向,就是写入自己的环境变量 ,调用自己实现的程序实现MyBash命令解释器(就是将自己实现的命令放入mybin下)。实际上,我们已经自己实现了3个命令了,分别是mycp、mykill、myps。下面,我们还将实现一些其他的命令。在实现之前,我们在存放mybash.c的路径mkdir mybin这个目录存放我们自己完成的命令,和系统的user/bin进行区分。在上述代码中,我们普通命令的实现都是依靠系统完成的,也就是/user/bin里的二进制可执行程序(在标准路径下找到的)。
2026-04-15 16:54:22
77
原创 项目《基于Linux下的mybash命令解释器》(一)
大家还记得小编曾经在哪一篇文章里介绍过bash呢?小编带领大家回顾一下,在《Linux(九)fork复制进程与写时拷贝技术》中,小编曾经介绍过shell。在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。我们就是通过命令解释器(称为shell)(bash是命令解释器中的一种)和内核和系统进行交互的。
2026-04-14 14:15:24
458
原创 Linux(十四)进程间通信(IPC),管道
一、进程间通信(一)系统介绍进程间通信进程间通信(IPC)介绍小编插入的这篇文章详细介绍了进程间通信的一些内容,大家可以一起学习。(二)进程间通信的方法1、管道2、信号量3、共享内存4、消息队列5、套接字接下来的几篇文章,小编就会按照顺序介绍这几种方法(加粗的为重点内容),今天首先要学到的是管道。二、管道关于管道这个词,其实我们在之前有过一点点了解,不知道大家还是否记得。在Linux(四)基础命令2中,| 代表管道,当时是和grep(过滤)搭配使用。
2026-04-14 14:15:17
514
原创 Linux(十三)fork + exec进程创建
也就是说,上面5个都是调用的execve,不过都是把参数放进数组,然后把数组传递给这个系统调用execve;//arg后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数 (exec系列中包含l 的,eg:execl,execlp,execle)//前五个是库函数,最后一个是系统调用,所以本质上上面5个都是通过第6个系统调用实现的。//arg:传给新程序主函数的第一个参数,一般为程序的名字。fork+exec()是Linux上创建新进程的方式;//pathname:新替换的程序的路径 + 名字。
2026-04-13 20:03:11
579
原创 Linux(十三)fork + exec进程创建
通过上图,我们可以发现,3次ps -f的父进程(PPID)都是一样的(图上为3520),又可以发现这个PPID和bash的PID是一样的;执行了3次ps -f,ps -f的父进程的ID都是一样的,即是bash。那我们回顾一下写时拷贝技术的定义“就是fork的时候,子进程直接把父进程的页表复制过来,子进程发生写入(修改)的时候才分配内存复制,然后进行相应的页表修改”。在这里,我们要注意,原来的程序替换成了ps程序,但PCB没有改变,但是PCB里面的有些值被修改了,比如PCB中程序的名字换成了新的名字。
2026-04-13 20:03:03
588
原创 Linux(十二)信号
int main()//这里不是调用,这里是作约定while(1)sleep(1);exit(0);(2)将默认改为忽略int main()//这里不是调用,这里是作约定while(1)sleep(1);exit(0);
2026-04-12 18:28:42
571
原创 Linux(十)僵死进程及文件操作
首先,让我们使用man 2 open打开帮助手册open的重载,两个参数用于打开一个已经存在的文件;三个参数的用于新建一个文件,并设置访问权限;pathname:文件的路径和名称;flags:文件的打开方式;mode:文件的权限,如"0600”;open的返回值为int,称为文件描述符;文件描述符:文件打开以后,内核给文件的一个编号;(>0的整数)open的返回值是int,称之为“文件描述符”;
2026-04-11 20:14:29
510
原创 Linux(九)fork复制进程与写时拷贝技术
一、printf隐藏的缓冲区首先,大家一起思考一个问题:为什么会有缓冲区的存在呢?因为屏幕是一个硬件设备,是由操作系统来管理的,因此printf打印的时候需要调用操作系统的接口才能完成,这个时候我们需要从用户态切换到内核态,这个开销是比较大的。所以先刷新到缓冲区,当缓冲区满时,打印到屏幕上,这样在不需要时回到缓冲区即可,减少开销;程序结束就再次刷新缓冲区。那我们为什么感觉不到缓冲区的存在呢?
2026-04-11 20:14:15
523
原创 Linux(八)静态库,共享库与计算机基础知识
一、库文件1、库文件的概念库是一组预先编译好的方法的集合(也就是我们生成的.o文件);Linux系统存储库的位置一般在/lib和/usr/lib(64位系统/usr/lib64)库的头文件放在/usr/include2、库的分类静态库:libxxx.a(命名规则)共享库:libxxx.so(命名规则)下面我们就要学习静态库和共享库了,大家可以和小编一起准备下面这几个文件,用于静态库和共享库的练习。二、静态库1、静态库的生成与使用1)将需要的库文件的所有.c文件编译成.o文件;
2026-04-09 10:15:23
490
原创 Linux(七)进程管理、用户管理和文件压缩命令
【回顾补充】在(六)中,小编也是和大家一起学习了很多干货啊,其中就包含一个非常重要的知识点——gcc;在安装环节,小编向大家介绍了gcc和g++。那么,在这里呢,小编还有一些要补充的内容,也就是gcc和g++的区别,补充了解即可。让我们从一个例子开始,现在有两个文件分别为main.c和main.cpp(分别用C语言和C语言写的),如果要用gcc编译,我们应该怎样做?对于main.c来说很简单,就是(六)gcc -o main main.c;那么,对于main.cpp我们应该怎么做呢?
2026-04-09 10:15:15
726
原创 Linux(六)编译链接、gcc和gdb
大家可以想一下,为什么我们执行ls 、pwd这些命令(本质也是人写的程序)可以不用加路径,这是因为它们在bin目录里,也就是它们的路径为/user/bin,我们在(二)中学习目录结构时,让大家记住过bin目录的作用是存放常用的命令(二进制可执行程序),当我们把程序放在这个路径下,就可以直接输入可执行文件名进行执行啦。链接就是将所有的.o文件,.a文件(静态库文件),.lib文件,.obj文件链接起来,生成.out文件(ELF格式的可执行文件 )(在Windows系统是生成.exe文件)
2026-04-08 22:16:47
633
原创 Linux(五)文件查看和编辑命令
【回顾】10.find:查找11、grep:过滤12、管道 |13、wc:统计文件中的个数14、su:切换用户($普通用户 #管理员)15、关机与重启16、runlevel:查看系统的运行级别一、文件查看命令1、catcat 文件名合并文件:cat 文件名1 文件名2 > 文件名3往文件中写入数据,(Ctrl+d结束输入);cat > 文件名2、moremore 文件名3、lessless 文件名。
2026-04-08 22:16:30
662
原创 Linux(四)基础命令2
回顾】上节课,小编和大家一起学习了基础命令其中的9个,让我们一起复习一下吧!1、pwd:显示当前位置的绝对路径;2、cd:切换目录,cd的参数表示要切换的位置,可以使用绝对路径或者相对路径;3、Is:显示目录中的文件(l a i)4、man:帮助手册,用来查看命令,系统调用,库函数等帮助信息5、touch:创建普通文件(不存在则创建,存在则修改文件的属性信息:最后的修改时间)6.mkdir:创建目录文件(-p递归创建)7、rmdir:删除空目录,不能删除非空目录8、cp:拷贝文件。
2026-04-07 01:55:33
356
原创 Linux(二)文件类型和权限
对于多用户stu1 stu2,具体的用户的家目录为/home/stu1,比如,stu1登录上系统后所处的位置在/home/stu1;在(一)基本介绍中,小编和大家一起学习了Linux系统的一些基本内容,并且提醒大家要适应使用命令执行系统。那么,对于一个文件来说,操作它的用户可以分为三类:所有者,同组用户,其他用户。(大家在使用命令进入家目录时可以使用/home/stu 也可以使用~,因为/home/stu等价于~)要注意的一点,大家是不能访问其他用户的家目录,更不能修改其他用户家目录中的文件;
2026-04-06 16:44:55
574
原创 Linux(一)基本介绍
使用快捷键:Ctrl+Alt+T,如图3,此时默认路径为家目录:/home/stu(即~)(2)终端界面介绍,如图6图6(3)终端的配置:右上角点击菜单键——配置文件首选项——未命名——修改字体大小或者修改背景颜色等设置(4)简单命令操作切换管理员:(在终端输入命令)sudo su退出终端:exit关闭虚拟机:init 0在这里,小编提醒大家,由于Linux主要使用命令行操作系统的,所以大家要渐渐习惯所有事情使用命令。
2026-04-06 16:44:46
385
原创 力扣 21.合并两个有序链表
思路:因为题目示例中没有头结点,创建头指针确定头结点,创建尾指针处理比较后剩余的单一链表,分别遍历两个链表,并用循环逐一比较。
2026-04-04 17:48:02
33
原创 力扣 LCR 084.全排列||
next_permutation,可对数据进行全排列,调用这个函数,可获取下一组排列值,数据全部排列完成后返回false。利用C++标准库中的vector容器和全排列函数next_permutation很方便。遍历排序前先sort快排成有序。
2026-04-04 17:47:50
195
原创 数据结构|链表 刷题
快指针走到环入口需要走m的距离,而慢指针从相遇点出发,因为m+n=c×(y−2x),所以慢指针走m的距离后也会到达环入口(因为m的距离和相遇点到环入口的距离n的关系满足上述等式)思路:两个快慢指针p q ,求出相遇点,然后q从头出发,p从相遇点出发,同频,p q一定会在入环点再次相遇。数学证明:相遇时,慢指针 p走了m+n+c*x(x为圈数),快指针q走了m+n+c*y(y圈)因为快指针速度为慢指针2倍,得到等式2*(m+n+c*x)=m+n+c*y。化简得到m=c*(y-2x)-n。
2026-04-03 12:56:14
326
原创 数据结构|链表 刷题
想要通过函数的某个参数带出某个链表结点的地址,可借助指针的指针或者引用的方式达成。要有交点肯定成Y字型,不可能交叉,因为链表只能有一个前驱一个后继。
2026-04-03 12:56:00
131
原创 数据结构——编程实现中缀表达式转成后缀表达式
计算机运算过程:计算机逐个遍历,直到遍历到运算符,遍历到运算符后将该运算符的前两个操作数(双目运算符)进行运算。3 4 2 *+2 1 1 +/ -5+下一步为3 8 + 2 2 / - 5 +举例:3+4*2-2/(1+1)+5=3+8-1+5=15。转成后缀表达式为:3 4 2 *+2 1 1 +/ -5+后缀表达式:运算符在操作数的后面 例如3 4+,3 4*中缀表达式:运算符在操作数中间 例如3+4,3*4。中缀表达式 :3+4*2-2/(1+1)+5。把运算符放在对应括号的后面。
2026-04-02 21:21:57
75
原创 软件开发通用工程性问题
做什么: 认证身份(JWT/OAuth2/Session/mTLS),鉴权权限(RBAC/ABAC/策略)。- 产出: 测试用例与覆盖率、流水线、/health 与 /metrics、发布策略(蓝绿/金丝雀)。- 认证与鉴权: OAuth2/OIDC、JWT/Session、RBAC/ABAC、CSRF/CORS。- 产出: 配置分层(dev/stage/prod)、DI 容器、配置中心/环境变量规范。- 部署与运维: CI/CD、容器/Docker、K8s、滚动发布/回滚、健康检查。
2026-04-02 21:21:48
193
原创 数据结构|基数排序
一、基数排序基数排序是一种非比较型整数排序算法,也称桶排序,它的基本思想是通过对数据的每一位进行排序,低位优先,从最低位到最高位依次进行进桶出桶操作,循环count次(count为最大值的位数),最终实现整个数据序列的有序排列。桶排序不能处理负数。1.算法思想算法原理基数排序是基于桶排序的思想,将整数按位数切割成不同的数字,然后按每个位数分别进行排序。对于每个位数,使用稳定的排序算法(如计数排序)将元素分配到不同的桶中,然后再按顺序收集桶中的元素。
2026-04-01 19:03:12
49
原创 数据结构|排序算法(三)归并排序
三、归并排序1.算法思想归并排序的基本思想是将一个数组分成两个子数组,对每个子数组进行排序,然后将排序好的子数组合并成一个排序好的数组。这个过程是递归进行的,直到子数组的长度为 1,此时子数组已经是有序的。1.分解:将待排序的数组不断地分成两半,直到每个子数组只有一个元素。可以使用递归实现这一步骤。2.合并:将两个已经排序好的子数组合并成一个排序好的数组。在合并过程中,比较两个子数组的元素,将较小的元素依次放入一个临时数组中,直到其中一个子数组的元素全部被放入临时数组。
2026-04-01 19:03:03
94
原创 数据结构|排序算法(三)选择排序
在每一轮迭代中,从未排序部分中选择最小(或最大)的元素,将其与未排序部分的第一个元素交换位置,从而将该元素添加到已排序部分的末尾。此时,前两个位置的元素是有序的,已排序部分包含两个元素,未排序部分包含剩余的元素。从整个序列中选择最小的元素,将其与第一个位置的元素交换。此时,第一个位置的元素就是整个序列中最小的元素,已排序部分包含这一个元素,未排序部分包含剩余的元素。重复上述步骤,每次都从未排序部分中选择最小的元素,并将其与未排序部分的第一个位置的元素交换,直到未排序部分只剩下一个元素。
2026-03-31 15:30:05
44
原创 数据结构|排序算法(二) 冒泡排序
三、冒泡排序1.算法思想基本思想是:相邻两两比较,大的往后排比较与交换:从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,就将它们交换位置。这样,每一次比较和交换都会将当前未排序部分的最大元素 “浮” 到最后面。多次遍历:对数组进行多次遍历,每一次遍历都会将未排序部分的最大元素放到合适的位置上,直到整个数组都被排序。2.代码实现。
2026-03-30 19:04:42
180
原创 数据结构|排序算法(二) 希尔排序
加快元素移动速度:希尔排序将原始数据分成多个子序列,每个子序列的元素间隔较大。随着间隔逐渐缩小,子序列的长度逐渐增加,而之前已经排好序的子序列能为后续更大规模的排序提供一定的有序基础,充分利用了数据的局部有序性,提高排序效率。随着排序的进行,逐渐减小子序列的元素间隔,直到间隔为 1,此时整个序列基本有序,再进行一次普通的插入排序即可完成排序。希尔排序通过间隔式排序,使数组在初始阶段就接近有序状态,当间隔逐渐减小时,数组已经基本有序,此时再进行插入排序,就可以避免最坏情况的发生,其平均时间复杂度介于O(n)
2026-03-30 19:04:28
989
原创 数据结构|排序算法(二)插入排序
一、插入排序1.算法 思想插入排序(Insertion Sort)是一种简单的排序算法,其基本思想是:将待排序的元素插入到已经有序的序列中,从而逐步构建有序序列。具体过程如下:把待排序的数组分为已排序和未排序两部分。初始时,已排序部分只有第一个元素,即数组的第一个元素被认为是已经有序的。从第二个元素开始,也就是未排序部分的第一个元素,将其与已排序部分的元素从后往前依次比较(因为从后往前越来越有序,则越快)。
2026-03-29 17:51:12
214
原创 Linux|fork命令及其使用的写时拷贝技术
例如,当多次调用printf输出少量数据时,这些数据会先在缓冲区中积累,直到缓冲区满或者遇到特定的条件(如换行符\n),才会将缓冲区中的内容一次性输出。在父进程中,返回值是子进程的进程 ID;简单来说:fork是把已有的进程复制一份,把对应父进程的PCB也复制了一份,然后申请一个PID,子进程,子进程的PID=父进程的PID+1;分配新的进程控制块:内核为新进程分配一个新的进程控制块(PCB),用于存储进程的相关信息,如进程 ID、状态、寄存器值、内存指针等。同时,内核为子进程分配一个唯一的进程 ID。
2026-03-29 17:50:17
196
原创 C++|对象的拷贝构造和赋值
默认拷贝构造函数会逐个成员进行复制,也就是浅拷贝,默认的完成分内的事情(1.为每个成员变量分配内存,2.每个成员变量赋值),当类包含动态分配的资源(像指针)时,浅拷贝可能会引发问题,这时你就需要自己定义拷贝构造函数来进行深拷贝。如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。第一个参数必须是类本身的对象的const 引用.可以有其它的参数,但其它参数必须有默认值,注意一般都只有一个参数.●拷贝构造函数 (如果没有,会出现浅拷贝)
2026-03-27 13:52:15
213
原创 位运算的应用
负数,存放补码,即绝对值取反+1,例如-1:绝对值为1=0000 0001->1111 1110->1111 1111。构造k个1,x&((1<<k)-1);解释下为什么要-1,类比十进制下1000-1=999,二进制下1000-1=111。1和其他数字(1位)| 时,该数字变成1;0和其他数字(1位)| 时,该数字不变。1和其他数字(1位)&时,该数字不变;0和其他数字(1位)&时,该数字变成0。1和其他数字(1位)^时,该数字取反;0和其他数字(1位)^时,该数字不变。左移一位再或1(x<<1)|1。
2026-03-26 19:00:16
158
原创 数据结构——编程实现中缀表达式转成后缀表达式
计算机运算过程:计算机逐个遍历,直到遍历到运算符,遍历到运算符后将该运算符的前两个操作数(双目运算符)进行运算。3 4 2 *+2 1 1 +/ -5+下一步为3 8 + 2 2 / - 5 +举例:3+4*2-2/(1+1)+5=3+8-1+5=15。转成后缀表达式为:3 4 2 *+2 1 1 +/ -5+后缀表达式:运算符在操作数的后面 例如3 4+,3 4*中缀表达式:运算符在操作数中间 例如3+4,3*4。中缀表达式 :3+4*2-2/(1+1)+5。把运算符放在对应括号的后面。
2026-03-26 18:57:26
303
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅