自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 基于Milvus和BGE-VL模型实现以图搜图

最近再做项目的时候,里面有个AI检索的功能,其中一个点就是要实现以图搜图,也就是用户上传一张图,要找出相似度比较高的图,比如下面这样,第一张是原图,第二张是图中的一部分,用户上传第二张图,要能检索到第一张完整的图。

2025-07-28 18:12:05 678

原创 vscode/windsurf/trae无法识别junit的@Test注解解决办法

【代码】vscode/windsurf/trae无法识别junit的@Test注解解决办法。

2025-03-17 09:16:17 647 2

原创 利用python和gpt写一个conda环境可视化管理工具

2、中间的输入框是要安装的包名,输入完成之后,点击安装即可把包安装到对应的环境,比如我在ai312对应的输入框中输入numpy,那么就是在a312这个env下面安装numpy的包,其实背后执行的命令就是:conda install numpy -n ai312 -y。最后通过执行:pyinstaller --onefile --windowed Conda.py,打包成可执行的exe文件即可。3、下面的两个输入框,第一个是环境名称,比如ai312,第二个是python的版本,比如3.8。

2025-02-24 15:57:46 473

原创 如何利用maven更优雅的打包

最近在客户现场部署项目,有两套环境,无法连接互联网,两套环境之间也是完全隔离,于是问题就来了,每次都要远程到公司电脑改完代码,打包,通过网盘(如果没有会员,上传下载慢)或者远程工具传输,再用u盘拷贝到客户电脑,一个包400多Mb(所有的代码和依赖包以及配置文件都打在了一个jar包里面),传输一次10分钟,效率太低了,于是翻越资料找到一中更优雅的打包方式,每次只需要更新改过的包和配置文件即可,大大减少传输大小。

2025-02-05 15:42:45 1011

原创 记录jvm进程号

就是杀掉xxx相关的进程,然后启动,当然也还有其他的方式可以实现类似的功能,我就不列举了,另外呢,现在很多公司可能也都把项目上云了,大部分情况都不需要自己写脚本重启服务,这个命令中在kill前面的一大串其实就是获取xxx.jar这个服务的jvm进程号,然后传递给kill -9命令,那么除了这种方式,还有没有其他办法获取到jvm进程号呢,下面就我知道的分享一下,不喜勿喷。第一种,通过java代码获取,获取到之后,不管是输出到文件还是输出到控制台都可以,当然是建议输出到文件了,代码如下。

2024-12-25 10:09:48 587

原创 druid与pgsql结合踩坑记

目前还没找到为什么会这样,欢迎有知道原因的大佬指点。

2024-12-18 10:22:34 562

原创 记一次mybatis-plus踩坑:NullPointerException:Cannot invoke “String.split(String)“ because “v1“ is null

写在前面,其实我个人是很不喜欢用mybatis-plus的,因为我很讨厌在代码里面写sql,或者是用链式编程写sql逻辑,因为。调用方在这里:com.github.yulichang.injector.MPJSqlInjector。下面是最终完整的插件配置:搞不懂为什么mybatis-plus要读这个配置,坑了我一下午。但是新公司新项目里面用了,也只能硬着头皮用了。

2024-11-19 19:13:31 609

原创 SpringBoot时间类型参数反序列化

近期在做项目的时候,对于时间类型的参数,前端不同的人在写代码的时候传参格式各不一样(可能是不同的日历控件默认的格式不一样),每换一个人就要强调一遍格式,后面想了想,还是我自己在后端兼容处理一下算了。PS:如果参数类型是用的java.util.Date类型,也可以这么做,只是在定义DefaultLocalDateTimeDeserializer 的时候泛型参数改为Date就行。翻了一下笔记,发现既然在返回数据给前端的时候可以自定义序列化器(支持的时间格式:不支持的,只要在这个数组里面加就行了。

2024-09-29 09:36:54 592

原创 基于Es和智普AI实现的语义检索

语义检索是一种利用自然语言处理(NLP)和人工智能(AI)技术来理解搜索查询的语义,以提供更准确和相关搜索结果的搜索技术,语义检索是一项突破性的技术,旨在通过深入理解单词和短语的含义及上下文来提供更为准确的搜索结果。与传统的基于关键词的搜索不同,语义检索侧重于查询的意图和语境,而不仅仅是关键词的直接匹配。

2024-09-23 18:05:01 1637

原创 Java生成层级目录编码

其中最核心的就是formatNumber方法,入参是当前已经生成的编号的最大值和初始化的长度,当前编号通常是记录在缓存或者数据库里面,直接查询即可,然后转成int类型的传入,formatNumber方法的while就是在判断99,999这种临界值,如果小于临界值,最后的return就是直接返回传入的编号加1的值,一级编号的时候(初始长度为2),比如传入的是01,那么返回02,传入10,返回11,,二级编号的时候(初始长度为3),比如传入的是01,那么返回02,传入10,返回11,

2024-08-19 15:09:42 551 1

原创 java代码通过ssh上传文件到远程服务器并解压

【代码】java代码通过ssh上传文件到远程服务器并解压。

2024-04-18 12:26:46 534

原创 一份标准的logback配置文件

【代码】一份标准的logback配置文件。

2024-04-12 16:41:07 123

原创 jvm常用监控指标(记笔记)

最近项目里面要做组件监控,于是整理了一下jvm常用的监控指标记录下来,废话不多讲,直接上代码。

2024-04-12 08:40:27 543

原创 玩转Random的正确姿势

我们知道,在数学领域里面0到1之间的小数是无穷无尽的,所以如果从数学角度上来讲,要计算0到1之间某个小数出现的概率是不现实的,但是作为计算机领域的人员应该会注意到,大多数编程语言中随机数的出现是等概率的,为什么会这样呢,因为在计算机里面,是有精度限制的,所以能表示的小数范围是有限的,而不是无穷无尽的,那么各个语言在设计的时候,通过一定的设计就可以实现等概率返回某个小数,下面以java语言为例在 Java 中,

2024-03-08 17:37:00 887

原创 BIO、NIO、Netty演化总结之三(为什么netty可以支撑单机百万连接)

1、随着连接数量的增加selector.selectedKeys()返回的就绪事件可能会有很多,就会导致要循环遍历所有的事件很耗时,在遍历期间,如果有其他的连接进来的话,selector.select()无法得到及时执行,导致客户端无法连接,以及其他的socketChannel无法及时读取。2、随着连接数量的增加,开启的线程数量会越来越多,对于操作系统来说,线程是一种很宝贵的资源,再好的机器配置,能支撑的线程数量肯定也是有上限的。首先,我们先看一个问题,为什么BIO无法支撑器单机百万连接?

2024-02-20 11:06:39 809

原创 BIO、NIO、Netty演化总结之二(手撸一个极简版netty)

,里面给了一个示例AsyncNonBlockingServerWithThreadPool,最近想了想,发现这个代码跟netty的模型还是有一些出入,说是netty的雏形好像有点牵强,于是想了一下,还是决定写一个更接近netty的极简版代码,仅供交流,有不对的地方欢迎指正,不喜勿喷,直接上代码。2、每一个连接的客户端在绑定workergroup的时候实际上就是绑定了一个selector,这样每一个workergroup所负责管理的客户端连接的socket之间也相互不影响。

2024-02-18 13:49:22 688

原创 BIO、NIO、Netty演化总结

1、采用reactor模型,所有的操作均采用事件通知机制来实现(包括连接和读写数据,基于jdk的future之上做了封装,运用观察者模式和装饰器模式,避免future.get带来的程序阻塞)其中bossGroup就是mainreactor,也就是负责接收客户端的连接的,workerGroup就是subreactor,也就是专门负责读写数据的。4、一个EventLoop(可以理解为其实就是一个线程),可以绑定多个socketchannel,也就是一个线程可以同时处理多个连接的数据的读写。

2024-02-12 11:46:24 1491

原创 导致Runtime.getRuntime().addShutdownHook无法执行的场景

PS:搜索了一下windows中的结束任务和linux中kill -9的区别,14个AI大模型的回答都是一致的:linux中的kill -9比windows任务管理器中的结束任务要更凶更猛,虽然没有在linux系统去实验,但是根据这个结论,如果在linux系统使用kill -9命令来杀死jvm,那么钩子函数就不会执行了。2、在oom之后注册钩子函数:-Xmx10000k,无法执行。1、在OOM之前注册钩子函数:-Xmx10000k,正常执行。4、任务管理器结束运行:没能执行。

2024-01-31 15:56:08 727

原创 通过Builder来构建集合list和map

之前已经写过一篇通用Builder来构建示例对象的(

2024-01-26 13:25:52 972

原创 归并排序-逆序对

逆序对:给定一个数据,从左往右,从第一个数开始,它右边每一个比它小的都能和它组成一个逆序对,比如{3, 4, 1, 2},对于3来说右边比它小的只有1,2,对于4来说,比它小的也只有1,2,对于1和2来说右边没有比它们自己小的,所以最终的逆序对是4,而{3, 4, 2,1}的逆序对则是5,因为2的右边有一个1比它小。之前的文章里有写归并排序的最小和问题(

2024-01-25 16:47:57 503 1

原创 比较同一个Class不同的实例对象是否变更

【代码】比较同一个Class不同的Bean示例是否变更。

2024-01-25 14:36:46 497

原创 @EnableFeignClients原理剖析

其中最重要的一行:BeanDefinitionBuilder definition = BeanDefinitionBuilder .genericBeanDefinition(FeignClientFactoryBean.class);今天闲来无事,临时突然想看看@EnableFeignClients的实现原理,现就个人的理解,整理一下记录下来,有不对的欢迎指正,共同进步,不喜勿喷!

2023-12-29 14:01:38 1427

原创 jdbc获取mysql数据表的字段和对应的数据类型

第三种:从information_schema库去查:SELECT COLUMN_name,data_type FROM information_schema.columns where table_name='int_test_1';这种方式我在本地跑的好好的,但是到了测试环境和预生产环境会导致columns 的数据量翻倍,没找到原因。但是这种查出来的顺序与建表语句不一样,所以就没有用这种了,最终采用的是第二种方式。1、获取数据表的元数据,也就是字段名和对应的数据类型。2、查询一个样例数据(目标数据)

2023-12-21 15:45:02 604

原创 归并排序-最小和

首先澄清一下最小和的概念:给定一个数组,对于数组中的每个元素,把它前面所有比它小的元素全部加起来生成一个小和,然后把每个元素对应的小和全部加起来生成整个数组的一个小和,比如给定数组{3, 2, 2, 4, 1, 5},每个元素对应的小和是{0,0,0,7,0,12},整个数组的小和就是19。{2,2,3,4}和{1,5}合并为{1,2,2,3,4,5},局部累加和为2*1+2*1+3*1+4*1=11,因为左边的数组都比右边的数组中的5要小。2,4合并为{2,4},局部累加和是2*1,因为左边比右边小。

2023-12-15 16:08:30 182

原创 mysql中的int(1)和int(10)的区别

由此可见:int(1)和int(10)实际上没什么区别,不影响查询和计算结果,也就是说底层在存储的时候实际上还是4个字节,范围是负21亿多到正21多。2、如果在括号里面写了数值,并且建表语句用了zerofill,也没有什么影响,只是不同的客户端在处理的时候显示不一样,仅此而已。1、对于int类型括号里面的数字没有实际意义,在底层存储的时候占用的还是4个字节,特别要注意的是。再看第二个测试表:注意建表语句中多了ZEROFILL,翻译过来是0填充的意思。这个数字并不表示长度。

2023-12-15 13:44:48 461

原创 计算n的阶乘-递归与迭代之间的转换

尽管大多数情况下递归与迭代可以相互转换,但也有一些特殊情况,比如涉及到特定数据结构(如树、图)的问题,或者一些复杂的动态规划问题,它们可能更适合于使用其中的一种方法,因为另一种方法可能会导致代码变得过于复杂且难以理解。:对于递归来说,需要存在一个或多个基本的情况,在这些情况下,不需要进一步递归。总结:某些递归是可以通过迭代来实现的,那么递归和迭代能够相互转换的条件是什么呢,我们来看看不同的AI模型的回答。例如,3的阶乘表示为3!:无论是递归还是迭代,都需要一种方式将子问题的结果合并到整个问题的答案中。

2023-12-07 17:37:18 2012

原创 归并排序的非递归实现

第一种思路:用步长来切分数组,也就是我们在切分数组的时候,每个子数组里面的数据个数要等于步长,假设给定数组:[3,2,5,4],我们初始给定一个步长step=1,那么第一轮切分出来的子数组分别是[3],[2]合并得到[2,3],[5],[4]合并得到[4,5],这样第一轮步长等于1就完成了,第二轮步长等与原步长乘以2,也就是每一轮都将原步长乘以2,这样得到的子数组分别是[2,3]和[4,5],进行合并,依次类推。

2023-12-07 10:28:03 111

原创 身份证mod11-2校验规则

这几天碰到一个需求是实现身份证最后一位的校验,需求文档里面写了个公式,没看懂(数学早就还给老师了),于是各种查资料,发现网上的资料要么只给了说明,要么给了个固定的代码,但是写的不清不楚的,没有说明为什么要这么写,现在我就自己这几天搜集到的资料做一个简单的总结。最后我们准备一个数组存的是身份证号最后一位数字:static char[] checkCodes = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

2023-11-30 10:08:08 774

原创 用栈实现队列的功能,用队列实现栈的功能?

我们首先来看用栈实现队列的功能,首先大伙儿要知道队列和栈的特点其实是“相反”,那么要想用栈来实现队列的功能,一个栈肯定是做不到的,我们可以用两个栈来实现,一个push栈,一个pop栈,push栈用来添加入队数据,pop栈用来出队数据,不论是入队还是出队的时候都可以加上一个检查和迁移操作,并且迁移必须遵守原则:pop栈为空,然后从push栈往pop栈迁移数据的时候必须一次性全部完成,这样就能满足先入先出的规则了。

2023-11-24 13:23:51 110

原创 用数组实现队列和栈

【代码】用数组实现队列和栈。

2023-11-21 17:09:03 119

原创 算法与数据结构之链表

链表的定义,相信大家都知道,这里就不赘述了只是链表分单向链表和双向链表,废话不多说,直接上代码。

2023-11-05 00:06:23 358

原创 异或运算的魔法

举个例子[1,2,3,4,1,2,4],我们要找的数据是3,根据前面的结论,任何一个数异或0等于它本身,同一个数异或它自己等于,那么这个数组其实我们把它排序看看[1,1,2,2,3,4,4],所以1,2,4在与tmp异或完之后tmp等于0,最终结果就是4了。思路:用一个临时变量tmp,初始值为0,从数组开头一直异或到结尾,最后tmp就是要找的数。第二题:给定一个数组,只有一个数在其中出现了奇数次,其他的数出现偶数次,找出这个数。1、任何数与0异或,结果是这个数本身。2、任何数和它自己异或,结果是0。

2023-10-30 19:40:24 328

原创 快速排序算法

快速排序二:给定一个数组,进行排序,要求排序完成之后,小于数组最后一个元素的数据全部在它的左边,大于它的全部在它的右边,等于的全部在中间,左右两边内部不要求有序,比如原数组是[5, 6, 3, 1, 2, 3]排序完之后:[1,2,3,3,5,6 ],也就是原数组最后一个数是3,排序完之后小于等于3的全部在3的左边,大于3的全部在3的右边,等于3的全部在中间。1、我们定义一个小于目标数据的区域,它的初始位置在数组第一个元素的前面,也就是下标为-1的位置,取名为lessEquals。

2023-10-26 09:55:17 687 2

原创 排序算法之归并排序

分别有两个指针P1和P2指向两个小数组的第一个元素,然后移动两个指针,哪个数组对应的指针所指的数据小,就将它拷贝到help当中,如果有一个指针先移动结束,那么另一个数组当前指针所指的位置以及后面的数据直接拷贝到help即可。新建一个数组,长度是总数组的长度,也就是4,我们记这个数组为help。将help数组的数据还原到原数组中。

2023-10-24 16:40:30 635

原创 给定一个文件夹,不允许用递归,统计其下面的文件数量,包括子文件夹下面的文件

对于统计一个文件夹下面的文件的数量,大家第一反应肯定是递归调用来实现,现在有这么一个目录结构:root1和root2下面各有一个文件file1.txt和file2.txt,所以最终统计出来的文件数量应该是3。ps:其实这里不一定要用Stack,也可以用queue等集合都可以实现,与递归的方式相比,各有优缺点吧,如果文件夹的数量过多,递归可能会导致StackOverflow,第二种方式可能会导致oom。

2023-10-17 10:29:22 209

原创 二叉树相关算法

那么我们可以看出来,不论是哪种遍历方式,其在处理左右子节点的时候,逻辑都是一样的,都是要递归处理,前序遍历:头左右,也就是先头后左再右:1245367。中序遍历:左头右,也就是先左后头再右:4251637。后序遍历:左头右,也就是先左后右再头:4526731。不同的只是头结点的输出时机。

2023-10-16 23:51:12 326

原创 合并K个升序链表

我们利用Java自带的PriorityQueue,这个queue底层实现实际上是通过数组实现的小根堆(小顶堆,名字无所谓怎么叫啦),反正就是加进去的数据可以自动排序,所以我们可以利用所有有自动排序的功能的集合来实现这个功能,只是队列用起来方便一点,像treeset等有序集合要一边加一边删有点麻烦,至于说能不能用java自带的这些工具,这个题目的重点不是让你实现排序,所以我觉得是可以的,当然要自己实现一个排序的集合,其实也不难。给你一个链表数组,每个链表都已经按升序排列。

2023-10-13 14:34:15 96

原创 用位运算实现加减乘除法

除法:除法是乘法的反向推导,比较绕,比如15/5=3,意思就是5*2+5*1=15,其中2就是2的一次方,1就是2的0次方,也就是说一个数a除以b,那么a一定可以表示为:b*2的0次方+b*2的1次方+....,我们说乘法实际上是加法实现的,那么除法其实就是减法的实现过程,比如15/5,也就是从15中不断地减去5,直到不够减或者为0为止,也就是:15-5*2-5*1=0,其中2就是2的一次方,1就是2的0次方,那么15/5实际上就是2的0次方加上2的一次方。减法:有两种方式,一种是跟加法一样,通过借位。

2023-10-12 14:50:20 437

原创 判断一个整数是否回文

回文数字的定义:第一位和最后一位相等,第二位和倒数第二位相等...一次类推,比如1221,12321等等,也就是说一个数字如果是回文,那么将它。解法三:一个数字如果是回文,那么它的前半部分和后半部分的反转一定相等,相当于是在解法二的基础上的优化,减少了循环的次数。解法一:投机取巧,用Java的StringBuilder的reverse方法。解法二:将数字反转,得到反转之后的值与原值相比较。反转之后,一定和原来的值相等。

2023-10-09 16:57:55 121

原创 验证NIO的非阻塞模型

可以看到accept并不会像NIO一样阻塞,而是直接返回-1,write(2, "\346\262\241\346\234\211\346\226\260\347\232\204\345\256\242\346\210\267\347\253\257\350\277\236\346\216\245.....", 32) = 32。我们再把两个选项都回复到false,然后丢到linux系统去运行,看看系统调用的情况(如何查看系统调用情况,之前有一篇BIO模型的文章。

2023-09-28 15:41:01 571

基于Milvus和BGE-VL模型实现以图搜图

bgevl模型文件

2025-07-28

空空如也

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

TA关注的人

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