- 博客(414)
- 资源 (7)
- 收藏
- 关注
原创 方便的 Kubernetes API 参考文档
http://k8s.mybatis.tk关注过 K8s 的人可能都看过官方的 API 参考文档:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13这个文档的形式如下图所示:如果你真正参考过这个文档,你会发现这个文档特别不好用,想要逐级查看属性信息时,经常在锚点之间跳转,无法从整体上看到完整的结构,非...
2019-02-24 19:30:15 5713 5
原创 《MyBatis 从入门到精通》
我在CSDN博客写了不少和MyBatis相关的博客,2015年时觉得自己写的太零散,不够系统全面,所以在GitBook创建了一本名为MyBatis最佳实践的开源电子书,当时写好了目录大纲,由于维护好几个开源项目,业余时间几乎都被占用,最终也只写了MyBatis Generator部分,也就是博客中的MyBatis Generator 详解。2016年3月份时,博文视点的孙奇俏编辑和我联系,然后就开始
2017-06-21 20:46:33 99434 65
原创 Spring AI 连续对话
在前面中我们只调用了一次请求,返回了一个结果,我们见过的各种 chat 都是支持连续对话的,AI 需要记住我们的上下文才能让对话连贯起来,通过 API 调用的时候每次对话都是一次无状态的独立请求,想要实现连续对话就需要我们自己记住对话的历史,在每次调用 API 的时候将对话历史传递给 API。本文就简单实现连续对话,并且引申一些相关的扩折或者优化。
2024-03-28 08:30:00 591
原创 Spring AI Function 的实现原理?
在前面中介绍了 Chat 中的 Function 用法,我很好奇这个 Function 是如何被调用的,就在下面代码中加了断点看执行:执行过程中进入了这个方法,并且符合 Request 类型的参数,这是如何实现的?就像魔法一样神奇,这是 Spring AI 的功能还是 OpenAI 的功能?好奇心引导我必须深入看看。
2024-03-25 08:00:00 836
原创 Spring AI Embeddings 和 Vector 入门
文本嵌入(Embeddings)将文本转换为数值数组或向量,使人工智能模型能够处理和理解语言数据。这种从文本到数字的转换以及反向转换,是人工智能如何与人类语言互动和理解它的关键要素。对于探索人工智能的 Java 开发者来说,没有必要理解这些向量表示背后复杂的技术原理或是具体实现细节。只要基本了解它们在人工智能系统中的作用和功能就足够了,尤其是在将人工智能功能集成到应用程序中的时候。文本嵌入在诸如检索增强生成 (RAG) 模式等实际应用中尤为重要。
2024-03-22 08:15:00 973
原创 谷歌 Colab:学习 Python 和大模型的利器
谷歌 Colab,又称 Colaboratory,是一个基于 Jupyter 笔记本的免费在线平台,可让您在浏览器中编写和执行 Python 代码。它无需配置,即可轻松访问 GPU 和 TPU 等强大硬件,并支持丰富的文本、代码、图像、视频等格式,非常适合学习 Python 和大模型。网址:https://colab.research.google.com/谷歌colab更简洁,打开后直接新建笔记本使用,也可以使用教程、github等网站写好的笔记本使用。
2024-03-18 08:00:00 363
原创 Spring AI Chat 简单示例
官方文档地址: https://docs.spring.io/spring-ai/reference/index.htmlSpring AI 可以方便 Java 开发者在代码中集成 AI 的功能,通过 Spring 提供的抽象,可以方便的切换不同的AI提供商,Spring AI 是对 AI 的使用,并不涉及 AI 的训练。Spring AI 目前还很不稳定,官方文档还有大量错误,API 也会变动导致不兼容,当前文章示例使用的 0.8.1 版本。
2024-03-16 08:30:00 665
原创 编码技巧:多条件判断拼接字符串
在写代码业务逻辑的时候,有时候需求稍微变化一下都让代码变的很麻烦,如果只在现有代码基础上硬改,可能会让可读性降低,本文通过一个例子来演示字符串拼接的变化。后来连上面这种写法中如果不满足,前面就是"",此时如果后面条件满足,拼接时会额外带上and导致语法错误,如果不嫌麻烦把and这样倒是能实现功能了,但是不易于阅读,看着就很乱。我们来看看GitHub Copilot会如何解决上面的变化。
2024-03-15 08:00:00 246
原创 GitHub Copilot - Elasticsearch 和 MySQL 单表查询耗时比对
当单表数据库超过百万后,数据库查询明显变慢,为了对比 Elasticsearch 的效果,将百万级的测试数据导入到 Elasticsearch 中对比看看效果。导入和查询 Elasticsearch 的过程完全通过辅助编码。
2023-12-13 11:45:00 381
原创 WSL 配置 Docker 内存和 CPU 资源限制
我用的电脑一共有40G内存,最近发现电脑重启后,VmmemWSL 进程很快就会占用一多半的内存(20+G),电脑中有多个停止运行的容器,正常启动状态的只有一个 MySQL 服务,通过。Docker Desktop 早期版本可以直接配置内存使用,改成 WSL 方式后需要去调整 WSL 的资源使用,参考。查看占用内存也不多,不知道为什么会占用这么多内存,但是必须限制一下。上面配置限制内存和交换内存都是 8G,可以根据自己内存进行调整。),然后启动 WSL 和 Docker,此后占用内存就很少了。
2023-12-06 08:15:00 1014
原创 Windows 系统配置 GraalVM 的 native-image 环境
使用官方文档链接下载的,这个工具安装的 VS CODE 2019 版本,安装的cl.exe版本低,会报下面的错误:Error: On Windows, GraalVM Native Image for JDK 21 requires Visual Studio 2022 version 17.1.0 or later (C/C++ Optimizing Compiler Version 19.31 or later).?
2023-11-30 07:45:00 809
原创 混淆技术研究笔记(八)扩展yGuard实现签名
中我们使用 hutool 的工具类实现了私钥加密的方法,我们这里直接用,首先添加 hutool 的依赖,在。
2023-10-25 10:04:25 325
原创 混淆技术研究笔记(七)Ant扩展介绍
如果你需要在配置好的对象上进行后续处理,可以使用这个方法,如果想在配置前处理,可以选择前两种方式。当你嵌套的对象需要复杂的创建方式时,可以采用这种方式,这种方式适合初始化对象。对象注入进来了,而且此时该对象是空的,还没有被赋值,这种情况下的参数(如这里的。同时存在时不一定会调用哪一个方法,当你方法中存在逻辑时,就无法保证处理一致。方法,该方法采用带有无参数构造函数的 Object 类型的单个参数。,否则后续无法获取该值。这里返回该对象后,这个对象会被赋值,在后续执行。,实际上不继承也可以,定义一个。
2023-10-19 08:30:00 251
原创 混淆技术研究笔记(六)如何基于yGuard实现?
如果一上来就想着如何设计,万一最后行不通就白费了,而且设计没有尽头,想要完美的设计可能需要纠结很久才有结果,在这种重构调整比较容易的情况下,先动手,后设计。准备工作都已经好了,接下来就该动手实现了,此时我还有一个问题,yguard中是如何创建对象的,xml和类是如何结合的,于是我找到了。这里会使用改后的文件名,那么改后文件名的生效肯定是在这里,这里可能会有写入jar的操作,这非常关键,但是我们先回到前面继续查找。就可以写入文件,而且也不必存在已有的文件,直接加个新的也可以,在。
2023-10-13 09:00:00 229
原创 混淆技术研究笔记(五)混淆后如何反篡改?
有了上一节的基础工具后,接下来要考虑如何反篡改。本文采用的是对混淆后的代码,针对某些关键包的字节码数据计算md5值,对所有类计算完成后对md5值进行排序,排序后拼接字符串再次计算md5值,最后通过私钥对md5进行RSA对称加密,加密后的内容要放到核心的jar包中。
2023-10-12 09:00:00 284
原创 混淆技术研究笔记(四)反篡改介绍
前面我们已经对代码进行了混淆,想修改代码是很难的,如果我们打包包含的代码很多,为了功能的完整性,我们可能会要求核心代码不允许被覆盖,被混淆的代码通过某些工具还是可以改名的,比如把超长的名字改短,然后再覆盖代码,有很多手段能绕过,为了再增加一些难度,本文考虑使用RSA对称加密对混淆后的代码进行加密,不允许修改混淆后的类名,不允许修改文件内容。使用文件校验和:可以使用文件校验和算法(如MD5或SHA-256)计算JAR包的校验和,并将校验和值保存在可信任的位置(如服务器)。混淆后的代码更难被篡改和逆向工程。
2023-10-11 09:00:00 250
原创 混淆技术研究笔记(三)多模块混淆
虽然这里很简单,但是我实际要处理的这个项目有4级多模块,总共能打包七十几个模块,而且要和旧版打包方式接近,因此耗时很久,最难的就是上一节介绍的,如果有多种混淆配置(能配置多个,比如 a 依赖 b,b 依赖 c 的情况,如果配置到 a 中,在 a 中对a,b,c进行混淆,确实能实现对 jar 包内容的混淆,但是当执行。发布时,Maven会根据模块依赖顺序计算构建的顺序,第一个构建的模块会走完全部的生命周期后,再对第二个模块进行相同的处理,依次执行完全部的模块。中添加a,b,c的依赖,保证最后执行,在。
2023-10-10 09:00:00 178
原创 混淆技术研究笔记(二)yGuard入门
可以配置多个,但是maven执行的机制导致这里能被有效混淆的只能有1个,后续实现的多模块混淆是利用了Maven生命周期的一些特点实现的。,这个明显没有对应的 jar,这种写法是无法自动解析为对应jar包的,使用Maven时需要注意,官方示例和文档中也有类似的错误。进行了排除,如果你的混淆配置更复杂,优先级无法确定时,上面的配置粒度仍然不够小,应该把。上面相当于两部分规则,第一部分是完全混淆的代码,第二部分是完全保留的代码,当配置多块时,配置,一般情况下不需要细致的具体的方法进行配置,通过。
2023-10-09 09:00:00 480
原创 混淆技术研究笔记(一)常见工具介绍
第一节先来点简单的内容,下面是通过 AI 生成的几款常见的混淆工具简介及对比。├─module-a├─module-b└─module-c一般只能分别对a,b,c进行混淆,我称这种为单模块混淆。模块之间如果存在调用关系,就要把需要暴露的接口配置为不混淆,否则混淆后互相不认识就无法调用了,这是单模块混淆的最大特点,如果需要被调用,一定会暴露入口。多模块。
2023-10-08 19:30:00 835
原创 虚拟线程最佳实践
虚拟线程的数量众多,赋予了虚拟线程强大的力量:通过允许服务器同时处理更多请求,它们可以更有效地运行以每个请求线程风格编写的服务器应用程序,从而提高吞吐量并减少硬件浪费。我们应该有多少个虚拟线程的问题变得显而易见,就像我们应该使用多少个字符串在内存中存储一组用户名的问题一样显而易见:虚拟线程的数量始终等于并发任务的数量在您的应用程序中。尽管您可以将平台线程池视为处理从队列中提取的任务的工作人员,并将虚拟线程视为任务本身,在它们可以继续之前被阻塞,但计算机中的底层表示实际上是相同的。
2023-09-20 21:17:27 687 2
原创 Virtual Threads 虚拟线程
平台线程被实现为操作系统 (OS) 线程的薄包装器。平台线程在其底层操作系统线程上运行 Java 代码,并且平台线程在平台线程的整个生命周期内捕获其操作系统线程。因此,可用平台线程的数量仅限于操作系统线程的数量。平台线程通常具有大型线程堆栈和由操作系统维护的其他资源。它们适合运行所有类型的任务,但资源可能有限。
2023-09-20 20:56:14 290
原创 Linux环境Runtime如何运行子进程?
这是一个Linux环境特定的问题,最简单避免的方式就是在Linux环境制作Linux的安装包。如果遇到类似问题,可以查看jres中所有可执行程序是否有执行的权限。
2023-09-06 08:45:00 249
原创 git fsmonitor--daemon 占用目录,导致无法修改
这个守护进程是一个长时间运行的进程,用于监视单个工作目录并维护最近更改的文件和目录的列表。git status 之类的命令如果只要求对工作目录的更改进行汇总并且可以避免扫描磁盘,则可以提高性能。(或者PowerToys) 发现占用该目录的进程,右键打开。为什么会有大量 git 占用目录呢?右键增加命令行列后如上图所示,大量。此时就可以修改文件名了。
2023-05-22 18:30:00 750 7
原创 MyBatis游标Cursor在Oracle数据库上的测试
除了上面的列出的几种情况下,还试过多种不同的配置,耗时没有比2.5更好。除了MySQL中需要通过作为标记开启流式传输外,其他数据库都是正常的用法,通过控制fetchSize大小来减少内存占用和数据库交互次数。
2023-03-27 23:59:08 987
原创 MyBatis游标Cursor的正确用法和百万数据传输的内存测试
很早以前为了处理大量数据想过使用Cursor,当时发现没有效果,就没有继续深入。这次为了搞清楚Cursor是否真的有用,找些资料和源码发现是有效果的,只是缺了必要的配置。
2023-03-25 23:23:48 6306 4
原创 多种工具协同创建一个基于CentOS,包含最新版本sysstat的镜像
服务器上部署了sysstat,通过sar可以保留系统监控记录,从服务器下载数据在别处分析时,不是很方便,因此考虑构建一个方便使用的Docker镜像辅助工作。
2023-03-23 12:29:55 391
原创 MySQL JDBC 中 tinyint(1) 处理为Boolean 的代码逻辑
MySQL JDBC 中tinyint(1)类型,在查询时默认会被处理为Boolean类型。
2023-02-16 19:30:00 2864 2
原创 2022 年博客总结
时间过的飞快,孩子也快4岁了,1号带孩子去玩雪,发生了一件有趣的事,发个视频。带孩子玩雪我拉着闺女,闺女拉着儿子,忽略了力的作用,我以为只有我在使劲,实际上闺女需要需要更大的力拉着儿子。走着走着,突然一轻,然后闺女被拽了出去,摔个屁股墩,儿子直接滑了下去。闺女爬回圈中被我带了上去。
2023-01-02 14:53:40 2437 2
原创 事务性发件箱模式:解决数据库事务和消息的一致性
事务性发件箱模式是一种解决数据库事务和消息的一致性问题的方法。它的基本思想是,将消息的发送操作与数据库的更新操作绑定在一起,保证这两个操作是原子性的,要么都成功,要么都失败。在传统的数据库应用中,数据库事务与消息的发送是独立的两个操作,如果数据库事务因为某种原因失败了,消息可能已经被发送出去了,这就导致了数据的不一致性。事务性发件箱模式的目的就是解决这个问题。事务性发件箱模式的实现方式有多种,其中一种是将消息的发送操作与数
2022-12-07 21:00:00 1290
原创 logback 集成 logstash
到这里可以看到,上面提供的完整配置中,没有介绍常见的控制台输出,其他都是必要的配置。input {tcp {}}output {}stdout {}}上面的配置会为每个appname创建对应的索引,在 Kibana 中的 DavaView 可以配置app*索引来查看所有应用的日志。
2022-11-26 12:17:21 2956 5
原创 实时输出Java8 HashMap数据结构
看过 Java 8 HashMap 源码的知道底层数据结构是数组、链表和红黑树实现的,从Debug调试或者序列化输出的都是K,V值,没法直观的看到上述的数据结构,为了直观的看到数据结构存储方面的变化,本文通过动图演示HashMap的结构变化。下面开始,当链表长度超过8时,会转换树,转换树时会判断 table数组的长度是否超过64,由于此时长度为16,会先通过。等到下一次的时候,链表长度超过8,数组到了64,链表就转换为了红黑树(树形结构中B为黑,R为红)。链表长度10的时候,由于数据大小32,会先。
2022-11-23 19:08:16 946
原创 WSL2 中 docker volume 的位置
想通过file/tail方式收集Docker日志,在linux没找到docker的容器目录,docker inpsect显示的位置也不存在,搜索了一些资料也不对,最后在找到了答案。按照nvRelax的回复,找到了该位置。
2022-11-09 21:30:00 1070
原创 Java Process:另一个程序正在使用此文件,进程无法访问
debug过程中,修改 getCommands 中的 fileName 时也能成功,有时候修改就不能成功,有时候文件名短的时候能经常性的成功,偶尔会有长文件名的时候也能成功。,错误已经很直接了,但是由于在 Mac 和 Linux 环境没有问题,因此觉得类似的代码在 Windows 上也不存在问题。” 时,这个文件大概率就是你操作的文件,如果找不到其他被使用的地方,可能就是你自己重复使用了同一个文件。最近处理奇怪的问题时,犯了个低级错误,浪费了不少时间,甚至都看了 jdk 底层的 c 代码。
2022-09-28 20:36:18 5165
原创 Java 泛型的读写规则:PECS
PECS 是 “Producer Extends Consumer Super” 的缩写,是 Java 泛型中的重要用法。PECS 就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用 。当需要往某个类型的集合添加类和子类实例时,集合相当于消费者,此时泛型使用 。对 Java 泛型 PECS 的讲解中,大多是从参数使用的角度来的,本文结合调用传值和参数使用对比来看 PECS 的两种情况。当我们想要遍历读取某个集合时,需要使用 ,用上面类型为例,为了方便查看编译时的错误,直接上截图:
2022-09-26 19:30:00 1077
原创 nginx反向代理location和proxy_pass的映射关系
配置nginx反向代理时,总是需要尝试多次才能配置成功,通过本文做个记录,方便以后查看。
2022-09-04 08:15:00 1547 3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人