- 博客(83)
- 收藏
- 关注
原创 【K8s】什么是K8s?
Kubernetes(K8s)是谷歌开源的一款容器集群管理系统,基于其内部Borg系统技术。它提供容器化应用部署维护、负载均衡、集群调度、自动伸缩等功能,支持无状态和有状态服务,并具备良好的扩展性。K8s简化了容器管理,适用于跨机器和跨地区的应用部署场景。
2025-09-16 12:16:54
284
原创 大模型-微调
微调是对通用大模型进行领域适配的关键技术,其核心在于调整模型的行为模式而非知识储备。通过特定领域数据训练,微调可实现输出格式标准化(如客服话术)、行业术语适配(医疗/法律)、任务性能优化(分类/摘要)、降低提示词依赖性,以及保障数据隐私(企业内循环)。这种技术使大模型能更精准地满足垂直场景需求,在保持基础能力的同时实现深度定制化。
2025-08-28 01:04:47
150
翻译 【AI Agent】Openai的function calling解读
文章摘要:OpenAI的函数调用功能允许模型与外部服务交互,通过定义函数模式实现数据获取和操作执行。示例展示了天气查询和邮件发送的函数调用流程,包括定义函数、模型响应、执行代码和整合结果。最佳实践建议编写清晰的函数描述、应用软件工程原则、减轻模型负担并限制函数数量以提高准确性。整个过程分为五个步骤:调用模型、获取函数调用、执行代码、返回结果和模型整合回复。
2025-08-24 13:58:42
113
原创 AI-agent【MCP协议】简单介绍
MCP协议是一种标准化应用程序与大型语言模型(LLMs)交互的开放协议,类似AI应用的"USB-C接口"。它提供了统一的数据源和工具连接方式,支持代理和复杂工作流构建。MCP采用客户端-服务器架构,包含主机应用、客户端、服务器等组件,既能连接本地数据源,也能集成远程服务。其优势包括丰富的预置集成、灵活的LLM切换能力以及数据安全保障,为AI应用开发提供了标准化解决方案。
2025-07-31 16:02:13
341
原创 【idea】工具使用报错记录
IDEA运行测试时报错"No tests found",原因是测试运行配置问题。将Run tests using选项从Gradle改为IntelliJ IDEA后解决。具体操作:在IDEA设置中找到Build Tools下的Gradle,将测试运行方式切换为IntelliJ IDEA即可正常运行测试用例。
2025-06-12 21:10:22
432
1
原创 服务器静态文件防篡改
本文调研了对CDN静态资源进行篡改的几种攻击手段,针对每种攻击手段,也调研了相应的防护手段,对于这些防护手段,思考服务器端有哪些可以做的防护措施。篡改CDN静态资源的几种常见攻击手段。
2024-06-19 20:50:44
1273
原创 生成能够精确匹配原字符串的正则表达式
需要将不同的公司名称归一化比如namecheap, NAMECHEAP. INC. 等表示同一含义,但是规则不,需要归一化为同一个文本含义。同本文使用java语言实现了由一串字符串自动生成正则表达式,并介绍了归一化不同表达方式的公司为同一个公司的方案。
2024-04-26 13:54:55
1125
原创 使用Spring进行文件的上传和下载
本文主要介绍在Spring框架下面调用微服务的dubbo rpc接口进行文件的上传和下载,以及记录在实现过程中遇到的一些容易出错的地方。我们构建的RPC接口采用的是dubbo框架,最初始的接口设计,将HttpServletResponse作为接口的参数类型传参,结果报错。HttpServletResponse不能被dubbo作为接口参数序列化,于是转而求其次,将可序列化的类型byte[]作为传输流的参数。
2024-04-17 17:46:23
1406
原创 JavaMail实现邮件的回复
实现回复邮件,实际上就是实现邮件的发送,在邮件发送的基础上加上要回复邮件的信息,发送邮件的实现中存在一些坑,在后文中会有说明。
2024-01-26 15:14:20
988
1
原创 NIO原理浅析(三)
epoll在内核中使用红黑树这个数据结构来保存文件描述符,红黑树这个数据结构的增删改的时间复杂度为O(logn),select/poll每次监听套接字,都需要将套接字列表整个复制到内核态,而epoll使用epoll_ctl,每次将一个监听套接字复制到内核态,这明显减少了用户空间到内核态的大量数据拷贝和内存分配。:本函数用于监控事件的发生,当epoll监控的事件中存在已经发送的事件,那么就可以将此事件收集起来。如果为0,表示已经超时;返回值:如果成功,返回epoll专用的文件描述符,如果失败,则返回-1。
2023-09-05 10:54:44
715
1
原创 NIO原理浅析(二)
IO分类阻塞和非阻塞阻塞IO:用户空间引发内核空间的系统调用,需要内核IO操作彻底完成之后,返回值才会返回到用户空间,执行用户的操作。阻塞指的用户空间程序的执行状态,用户空间程序需要等到IO操作彻底执行完毕。java中,默认创建的socket是阻塞的。非阻塞IO:用户空间引发内核空间的系统调用,不需要等待内核IO操作彻底完成,内核立即给用户返回一个返回值。用户空间程序继续执行用户的操作,处于非阻塞的状态。有兴趣,也可以参考java中关于Socket这个类的同步和异步。
2023-08-30 17:14:58
626
原创 先加密后签名还是先签名后加密?
先说结论,签名算法计算出来的签名是为了验证消息的完整性,签名算法有比如HMAC-SHA256,加密算法则是为了保证消息的机密性,类似AES-GCM、AES-CBC,这两种加密算法的安全性并不一致。GCM的填充方式更加的安全,CBC则不然。如果先加密的话,因为加密之后值会随着随机因子的变化而变化,此时去校验加密之后密文的完整性是没有意义的,因为你只能校验加密之后密文的完整性,而加密之后密文的完整性是可以通过解密的过程来校验的。那谁来校验加密之前的消息的完整性呢?假设是先加密后签名,会发生什么事情?
2023-08-24 15:40:12
3871
原创 NIO原理浅析(一)
IO的定义,Input/Output,输入和输出,通常指数据在存储器或者其他周边设备之间的输出和输入,输入是系统接收到信号或者数据,输出则是从系统发送的信号或数据。
2023-08-24 12:18:59
461
原创 零知识证明技术概述
零知识证明又被称为零知识协议,利用数学知识在双方不需要直接传递信息本身的前提下来验证信息的正确性。这个思想首先被发表在1985年出版的MIT的论文里。
2023-08-06 17:32:13
1110
2
原创 RSA原理
M *(1 + N的倍数)^{k} + N的倍数^d。= M^{kφ(N) + 1} + N的倍数^d。= M * M^{kφ(N)} + N的倍数^d。= M * M^{φ(N)K} + N的倍数^d。攻击者要破解C得到M,必须要知道d,攻击者只能拿到N、e、C。= M^{ed} + N的倍数^d。C^d = (M^e + N的倍数)^d。-> 要知道φ(N),必须要知道P、Q。
2023-07-16 22:33:46
574
原创 RestfulAPI接口设计指导
互联网的兴起,研究者思考如何开发以网络为基础的软件。Fielding提出了解决这个问题的软件架构原则:REST(Representational State Transfer),表现层状态转化。符合REST原则的架构,被称为RESTful架构,是目前互联网最流行的一种软件架构。REST的主语是Resource,即资源的表现层转化。资源:是网络上的具体信息,可以是文本、图片、歌曲、服务等,使用URI指向它,一般也把资源称为对象。
2023-07-11 20:32:56
378
原创 Java中ThreadLocal简要介绍
在这篇文章中,我们将会介绍ThreadLocal在java.lang这个包中是如何被构造的。ThreadLocal提供了在当前线程中单独存储数据,并能将特殊类型的对象保存在ThreadLocal里面的能力。
2023-07-09 20:14:06
351
原创 Java多线程--什么是线程安全?
也就是保证在多线程环境下,共享的、可修改的状态的正确性,这里的状态反映到程序中就是数据。线程安全是一个多线程环境下正确性的概念。
2023-07-03 19:56:19
179
原创 redis相关基础知识
redis默认有16个数据库,默认使用第0个数据库可以使用select进行数据库的切换用显示数据库的大小dbsize查看数据库所有的key,通过get方法可以得到所有的值keys *清除当前数据库flushdb清除数据库所有的内容flushallredis是单线程的!redis是基于内存操作的,CPU不是redis的性能瓶颈,redis的瓶颈是根据机器的内存和网络带宽redis单线程还这么快?
2023-05-17 00:20:56
377
原创 【回溯法】-----求一个集合的子集问题
首先这个问题,是一个求子集的问题,求子集问题可以联想到组合问题和分割问题,如果把求解后两个问题的遍历过程形式化为树,我们可以认为组合问题和分割问题是求整棵树的叶子节点的过程。子集问题也可以认为是组合问题和分割问题,但是在求得整棵数的叶子节点之后,在求集合的并集时,需要去掉重复的子集,这个过程时间复杂度有点高,可以规避。按照此方法取出的节点,最终得到的集合中的子集是不会重复的。本题给出的nums里面的元素是。
2023-04-16 15:55:19
436
原创 go语言实现指令集和解释器
指令集和解释器Java虚拟机指的是一台虚拟的机器,字节码就是运行在这台虚拟机器上的机器码。每个类或者接口都会被Java编译器编译成一个class文件,类或者接口的方法信息放在class文件的method_info结构中,如果方法不是抽象方法,也不是本地方法,方法的Java代码就会被编译器编译成字节码,存放在method_info结构体的Code属性中。每条字节码指令是以一个单字节的操作码(opcode)开头,这就是字节码名称的由来。
2023-03-20 00:11:03
268
原创 Java虚拟机的运行时数据区-go语言实现
线程私有的区域包括了PC(程序计数器)和java虚拟机栈,Java虚拟机栈又由栈帧构成,帧保存了局部变量和操作数栈信息。一类时多线程共享的,一类时线程私有的。对于Java虚拟机栈,我们常用链表数据结构来实现,这样栈就可以按需使用内存空间,而且弹出来的帧可以被Go的垃圾收集器回收。虚拟机栈可以时连续的空间,也可以时不连续的,可以时固定大小,也可以时在运行时动态扩展。多线程共享的区域包括类和实例对象,实例对象保存在堆中,类保存在方法区中,其中类数据包含了类的方法、字段、方法字节码还有常量池信息。
2023-03-05 17:30:22
529
原创 解析Java中的class文件
解析class文件需要把class文件当成文件流来处理,定义ClassReader结构体go语言中的reslice语法可以跳过已经读过的数据。ClassFile结构体如实反映了Java虚拟机规范定义的class文件格式。class文件的魔数为0xCAFEBABE占四个字节minorVersion为class文件的次版本号majorVersion为class文件的主版本号constantPool为常量池acessFlags为class的可访问标识。
2023-02-22 13:00:10
552
原创 Go语言实现搜索class文件工具
答:不同虚拟机的实现,决定了不同的搜索方法,Oracle的Java虚拟机实现根据类路径(class path)来搜索类。ZipEntry类表示ZIP或者JAR文件形式的类路径,该类的初始化方法中,打开ZIP文件,然后遍历ZIP压缩包文件,然后找到class文件,将class内容读出来。所有的类都实现了Entry这个接口,该接口有两个方法,readClass方法根据类路径访问类和字节数组,String方法返回类的名字。ClassPath类里面有三个成员变量,分别存放三种路径,通过Parse函数初始成员变量。
2023-02-06 00:25:04
505
原创 Go语言处理命令行参数
java命令行的选项可以分为两种:标准选项和非标准选项。标准选项比较稳定,不会轻易变动,非标准的选项以-X开头。非标准选项中有一部分是高级选项,以-XX开头。go语言的os包中定义了一个Args变量,用来存放传递给命令行的全部参数。如果给出了-jar选项,则第一个非选项参数表示JAR文件名,java命令必须从这个JAR文件中寻找主类。javaw和java命令唯一的区别在于,javaw显示命令行窗口后不会堵塞,会继续执行接下来的命令。选项由减号(-)开头,第一个非选项名给出了主类的完全限定名。
2023-01-27 22:27:54
495
原创 【ECDH java后端和javaScript前后端互通实现】
Elliptic-curve Diffie-Hellman(ECDH)是一种通过两方达成密钥协商的密钥生成算法,每一方都有一个椭圆双曲线的公私钥对,双方在不安全的通信通道间传递信息达成密钥生成协议。在初始时刻,Alice和Bob共享了些域的参数(p a,b,G,n,h),Alice在整数范围[t,n-1]中随机选择一个私钥d,并通过计算(Q=d·G)web前端和后端之间的通信不一定可靠,如果不方便使用预共享密钥的方式完成身份的确认,那么可以使用ECDH密钥协商算法在前端和后端进行密钥间的协商。
2022-12-12 00:33:59
1696
原创 工厂模式相关总结和使用
工厂方法模式对于Pizza的创建方式进一步解耦,如果orderPizza发生变化,比如需要订购不同种类的pizza,不会改变pizza的实现,如果需要改变Pizza的创建构成,也不需要改变orderPizza方法,满足对修改关闭,对扩展开放的开闭原则。简单工厂模式中,Pizza作为一个接口,里面包含了多种功能,包括prepare、bake、cut、box,Pizza被实现成多个产品。工厂方法模式将产品的实现从使用中解耦,如果需要增加产品或者改变产品的实现,创建接口creator相关代码不需要做任何改变。
2022-09-06 00:57:33
395
原创 单调栈的性质和使用场景
单调栈即需要保证入栈的元素是保持递增或者递减的。如果有违反递增或者递减的原则,那么就需要通过弹出栈的方式来保持单调栈的性质。单调栈常被用来解决滑动窗口中元素最大值和最小值的问题。.........
2022-08-26 23:47:55
433
原创 C++ signed int 在计算机内部表示
数字化的世界都是由现实的世界转换而来,这个转换过程需要媒介,电压的高低能很好的表示0和1两种状态,满足离散化和编码两种能力,由于计算机设备本身的硬件限制,只能离散化数据,对数据取样。编码则是需要通过制定一定的规则来模拟还原现实信息。采用二进制有如下好处:1、状态稳定,只有0、1两种状态。2、二进制编码简单,对于机器实现来说计算简单。3、0、1和逻辑命题真、假对应,与逻辑门契合。..................
2022-08-10 20:59:37
673
原创 JAVA中的异常体系详解
一般异常可以分成如下几类:1、用户输入的错误用户不可预期的输入内容2、设备错误IO设备的错误,硬盘损坏等等3、物理限制磁盘的空间满了4、代码错误引用了空指针。有四种场景抛出受查异常:1、调用一个抛出受查异常的方法2、程序运行时抛出错误,使用throw语句抛出异常3、程序出现错误4、Java虚拟机和运行库出现的内部错误异常抛出后,Java 会使用new方法在堆上创建一个异常对象。当前的执行路径会被终止,从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个异常处理
2022-06-15 23:10:40
374
翻译 《对服务设计的思考(2)》--- 翻译自《Considerations for Service Design》
避免意外API可能因为不恰当的使用而以不可预知的方式运行。一些微妙的设计决策往往会造成下游开发者雪崩式的影响。为此应该遵循以下所示的规则:应该规避polymorphism(多态性),特别是在response中,为了避免SDk动态运行时产生意想不到的问题,一个endpoint应该使用单一的类型。应该使用一个单一类型(homogeneous collection),除非有非常好的理由,否则不要返回异构集合。如果你感觉到异构集合是必须的,请与你的API reviewer来讨论需求。应该支持服务器端的分
2022-05-16 23:45:37
147
翻译 《对服务设计的思考(1)》--- 翻译自《Considerations for Service Design》
对服务设计的思考本文主要是一份读书笔记,摘抄博文作者在该篇文章中重要的部分。原文链接简介为了避免设计的API对于使用者造成困扰,需要满足以下三个原则:从服务的第一个已发布版本开始实施API版本控制确保客户的工作负载不会被中断确保客户在实施新的服务或者集成SDK时,不需要修改原有的代码从开发者经验开始一个好的API通常是开始于深思熟虑和良好设计的服务。你的服务需要被定义为一系列容易理解的概念名,只要一提到你的这些概念名就能想起你这个服务。这些抽象概念之间必须有明确的关系。为了让你能够针对
2022-05-15 16:33:51
169
原创 数据库中的事务
什么是事务?事务是指数据库中一系列数据库语句的集合,在mysql中,通常以start transaction;作为一个事务的语法开头,commit;作为事务的结尾,一则事务要么全部执行,要么全部不执行。我们可以将事务作为数据库中一个逻辑执行单元(不可分割)来理解。类似于操作系统的中将一条指令作为不可分割的单位。事务的出现主要被用来解决数据库在并发场景下存在的数据不一致性问题。事务的性质ACID:Atomic:(原子性):不可分割的特性Concurrent(一致性):状态转移的一致性Isolat
2022-03-16 00:17:25
1843
原创 一条SQL语句的执行是什么样的?
1、执行步骤总览客户端JDBC、ODBC触发一条sql语句的运行。2、具体架构2.1 连接器身份认证和权限相关部分的管理。如果用户名密码通过校验,会去权限表里查询该用户的权限。后续只要连接不断开,即使管理员修改了用户的权限,用户权限也维持刚开始查询时的状态。2.2 查询缓存连接建立后,执行查询语句的时候,会先查询缓存,MySQL 会先校验这个 sql 是否执行过,以 Key-Value 的形式缓存在内存中,Key 是查询预计,Value 是结果集。如果缓存 key 被命中,就会直接返回给客户端
2022-03-07 00:32:55
397
原创 如何判断设计数据库是否合理?
摘要本文讲述如何判断设计的数据库是否合理(设计的数据库表符合第一范式、第二范式、第三范式等)前置知识超码、候选码、主码超码关系的超码是一个或者多个属性的集合,这些属性上的取值保证可以唯一识别出关系中的元组。举个例子,有属性为<学号,身份证,姓名,年龄,班级>这样的一个表,其中学号、身份证或者<学号,身份证>都能唯一识别出关系中的元组。那么学号、身份证以及<学号,身份证>都被称为超码。候选码候选码是一个最小的超码,它是一组构成超码的属性集,但是这组属性的任意
2021-09-21 23:11:16
1121
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅