跳转到正文
宋柏成

时间线

按时间回看我的学习、工作与技术实践记录。

2026

6 篇文章
  1. 大模型常见术语解释

    从模型与参数、Token 与上下文、生成速度与采样,到 API 计费、RAG、Agent 和微调,按使用场景解释大模型常见术语及容易混淆的概念。

    • AI
    • API
    • 大模型
  2. RAG 与 LLM Wiki:两种 AI 知识库方式怎么选

    RAG 在提问时检索资料,LLM Wiki 在资料进入时整理知识。用同一套文档解释两者的工作流程、失败原因、维护成本,以及什么时候应该结合使用。

    • AI
    • RAG
    • 知识库
  3. 大模型并行的几种切法

    DP、TP、PP、EP、CP 各自切什么?同样八张卡,DP=8、TP=8、DP=4 加 TP=2、DP=4 加 PP=2 有什么不同?从显存、通信、单请求延迟和总吞吐讲清多机多卡的取舍。

    • AI
    • LLM
    • 分布式
  4. 本地模型该用哪套运行时

    先按硬件和并发把常见模型运行时分成表,再逐个说明它解决的问题。本机看 llama.cpp、Ollama、LM Studio、GPT4All、llamafile、TextGen、LocalAI 和 MLX;多请求服务看 vLLM、SGLang、TGI、TensorRT-LLM、LMDeploy 和 Xinference;超大混合专家模型看 KTransformers;多阶段音视频看 vLLM-Omni 和 SGLang-Omni。

    • AI
    • LLM
  5. 蓝牙 AI 客服方案

    电脑只用蓝牙借用手机拨打和接听,并把通话语音交给 AI。蓝牙把电话动作和通话声音分成两条连接;程序使用系统已经建立的免提连接,不自己抢第二条。

    • Bluetooth
    • AI
  6. AI 接口常见错误码

    调用 OpenAI 兼容网关时常见的 HTTP 状态码:401、404、429、499、500、502、503。只看状态码本身代表什么,不展开某个网关怎么配。

    • AI
    • API

2025

7 篇文章
  1. 大文件上传

    文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法。 目前我们平台后管存在许多界面数据超过十几万条数据,常规的导出功能在面对如此大数据量的数据容易造成 OOM 等问题,因此需要一种新的上传方式来解决这个问题。 目前我们的导出都是通过后端使用...

    • oss
  2. Hugging Face

    学习 NLP 最优先级要学习的就是 Hugging Face,它提供了可以轻松地下载并且训练先进的预训练模型的 API 和工具。 我们要学习 Transformers 的模型、任务和设计理念,还有就是配置(configuration)、模型(model)、分词器(tokenizer)和流水线(pipeline)这几个最重要的类。 在开始之前,确保你已经...

    • Hugging Face
  3. RAG

    RAG

    • RAG
  4. uni-app

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/字节跳动/QQ/钉钉)等多个平。 这也就是他们的口号:开发一次,多端覆盖。对于想作为独立开发者来说,这无疑是非常有吸引力的,这里我借助想做一个个人小程序的契机来学习体验一下这个框架。...

    • uni-app
  5. Prompt Engineering

    随着 ChatGPT 等 LLM(大语言模型)的出现,自然语言处理的范式正在由 Pretrain-Finetune(预训练-微调)向提示工程演变。 对于具有较强自然语言理解、生成能力,能够实现多样化任务处理的 LLM 来说,一个合理的 Prompt 设计极大地决定了其能力的上限与下限。 Prompt Engineering,即是针对特定任务构造能充分发...

    • 提示工程
    • 指令工程
  6. PyTorch

    Pytorch 是一个开源的机器学习库,主要用于深度学习和自然语言处理。它提供了丰富的API和工具来构建、训练和部署神经网络模型。 使用 PyTorch 之前必须有 Python 环境,为了多个 Python 环境适应不同框架,建议使用 Anaconda 来安装 Python,类似于 NVM 一样管理本地的 Python 环境。 比如这次我们要使用 P...

    • PyTorch
  7. Redis

    Redis (Remote Dictionary Server) 是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。它支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)以及有序集合(sorted sets)。因为具有丰富的功能和高性能,现在几乎主流的 Web 项目都已经绑定了 Redis 作...

    • Redis
    • database

2024

35 篇文章
  1. mkcert

    mkcert是由 Filippo Valsorda 开发的一款免费开源工具,专门用于生成受信任的本地 SSL/TLS 证书。

    • HTTPS
    • mkcert
  2. Java 中遇到的问题

    记录一次在项目访问公网域名 Minio 服务提示以下报错: 这是因为在 Java8 及高版本以上的版本在源应用程序不信任目标应用程序的证书,导致在源应用程序的JVM信任库中找不到该证书或证书链的报错,以下有几种解决方案: 在不同的 JDK 版本禁用方式是不同的,基本都是调整 java.security 文件中的配置。从 JDK 9 开始,Java 默认...

    • Java
  3. Nginx 基础

    Nginx七大核心应用场景:反向代理、虚拟主机、域名解析、负载均衡、防盗链、url重定向、https。 常见版本如下: 1. 这里拿 Nginx 官方开源版作为示例,首先你得需要一台 Linux 机器并下载 Nginx 二进制包。 2. 使用 `./configure --prefix=/usr/local/nginx` 执行 ```configure...

    • Nginx
  4. 网站证书

    在你想做一个正规的并且所有人都可以访问的网站的时候,再使用 ip 访问就显得没有那么方便了,这个时候就需要一个域名来访问网站。购买域名的流程在一些云服务商已经有一条龙的服务了,并且在你购买完域名就说明你已经经过了购买服务器、搭建网站、备案等流程了,而接下来的步骤就是解析 SSL 证书了。 在你购买域名的服务商界面下载系统对应的 SSL 证书,内部重要的...

    • Nginx
    • HTTPS
    • 证书
  5. LiteFlow

    很多人容易把规则引擎和流程引擎的概念混在一起,这里我们先将规则引擎和流程引擎区分开: LiteFlow适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处...

    • 规则引擎
    • Java
    • Spring
  6. 定时任务

    定时任务,定时任务,顾名思义,就是指定时执行某些特定操作或任务的功能。工作中的业务难免要定时任务打交道,网络上常见的定时任务场景有以下几种: 有一说一,一些高端的场景我倒是没有遇到过,但是思想和实现我感觉应该也是同样的基调,无非是放在哪里用是了。以下是工作中我遇到的定时任务场景。 招录组织实施系统,其中有个环节是要求考生提交个人信息进行审核,审核的规则...

    • scheduled
    • Java
  7. 深度学习

    身处 AI 的新时代浪潮里,必须奋力投身其中,才能紧跟时代步伐。作为计算机专业的普通人,我能深刻的感受到 AI 对当下生活的影响和未来无限的可能,虽然自己才疏学浅,没有在 AI 领域周边和基础领域上有任何的造诣,但我仍然选择开始步入这个全新的领域开始自己的新一轮的人生学习探索,在这里我将列出我一步步从零到一的学习过程中的优秀书籍,共勉。 大名鼎鼎的“鱼...

    • book
    • Deep Learning
  8. JSON Web Tokens

    当我步入开发的第一个项目就已经用上了 Token 令牌鉴权的方式,可当时并不清楚这个在请求头添加的 Bearer 字符串是什么,在走进 Token 之前,我们应该从它的前身 Session 来开始讲起。 在早期的 Web 服务应用阶段,为了解决 HTTP 协议无状态的特性带来的用户认证和会话管理问题。在没有 Session 之前,服务器无法识别连续的多...

    • JWT
    • Java
  9. 深度学习

    身处 AI 的新时代浪潮里,必须奋力投身其中,才能紧跟时代步伐。作为计算机专业的普通人,我能深刻的感受到 AI 对当下生活的影响和未来无限的可能,虽然自己才疏学浅,没有在 AI 领域周边和基础领域上有任何的造诣,但我仍然选择开始步入这个全新的领域开始自己的新一轮的人生学习探索,在这里我将列出我一步步从零到一的学习过程中的优秀书籍,共勉。 大名鼎鼎的“鱼...

    • book
    • Deep Learning
  10. Java 系列

    目前 Java 赛道处于一个爆满的时代,况且计算机这个行业在当下这个社会也是充满了功利的气息,各个行业的人疯狂涌入计算机,业内的人嘴上说着计算机跌落神坛可是却在疯狂内卷,确实目前看来就算计算机行业身处寒冬,这也只是和之前几年相比吧,当时可能学习完微服务之后,找的工作可能直奔“尔康”,而现在可能微服务也只能是你找到工作的门槛,当然身边的人也有从 Java...

    • book
    • Java
  11. Activiti

    工作流(workflow)就是通过计算机对业务流程自动化执行管理,它主要结局的是多个参与者之间按照某种预定义的规则自动进行传递文档、信息或者任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现。 工作流基于业务流,适用于消费品行业、制造业、电信服务业、物流服务业、物业管理、政府机构等,特别是大的企业集团公司。具体应用在关键业务流程、行政审批流程...

    • Activiti
    • 流程引擎
  12. LeetCode

    _**想起来就做一题吧!**_

    • algorithm
    • LeetCode
  13. Java 异常

    Java 异常是 Java 提供的一种识别及响应错误的一致性机制。Java 异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。 Throwable 是 Java 语言中所有错误与异常的超类,其中包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。Throwable 包...

    • Exception
    • Error
  14. 全局随机数

    在随着数据库数据单机达到瓶颈已经无法支持的时候就会出现分库分表的场景,这个时候数据库自带的自增主键或者简单组成的随机数已经不能满足需求了,这个时候就需要使用全局唯一 ID。 一个最基本的分布式 ID 需要满足下面这些要求: 除了这些之外,一个比较好的分布式 ID 还应保证: 每次从数据库批量获取一部分 ID 存放在内存中,每次需要 ID 时,从内存中获...

    • 分布式 ID
  15. 锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制,它主要用于同步并发访问共享资源的多个线程或进程,以防止数据不一致或竞争条件的发生,锁的使用场景有以下几种: 1. 多线程编程:在多线程环境中,多个线程可能同时访问和修改共享数据。使用锁可以确保在同一时间只有一个线程可以访问和修改数据,从而避免数据不一致和竞争条件。 2. 并发编程:在并发编程中,多个进...

    • 共享锁
    • 排他锁
    • 悲观锁
  16. SQL 百科

    使用合适的数据类型可以减少存储空间和提高查询速度。这个可不能小看,数据量到达一个量级,这个就能看出明显差异。 仅选择必要的列,减少数据传输量。 避免过多的 JOIN 操作,尽量减少数据集的大小。尽量使用 JOIN 或者 EXISTS 代替子查询。 使用UNION代替OR、优化ORDER BY和GROUP BY 确保 ORDER BY 和 GROUP B...

    • SQL
    • 数据库
  17. Java 17 新特性

    Java 17 是Java平台的一个重要版本,于2021年9月14日正式发布,与Java 8相比,Java 17带来了更多的新特性和改进,尤其是在性能和安全性方面。 在 17 版本之前定义 JSON 字符串方式如下: 在 17 版本之后,可以使用文本块来定义 JSON 字符串,通过三个双引号可以定义一个文本块,并且结束的三个双引号不能和开始的在同一行。...

    • Java 17 新特性
    • Optional
    • Lambda 表达式
  18. Java 21 新特性

    Java 21 新特性

    • Java 17 新特性
    • Optional
    • Lambda 表达式
  19. 字符编码

    计算机内部,所有信息最终都是二进制的数字,而计算机内部存储的字符都是通过编码表映射出来的,为了能让我们熟知的字符正常显示在屏幕上,我们需要做以下两件事情: 1. 给所有的字符一个独一无二的数字编号,做一个数字编号到汉字的 mapping 关系(即字符集) 2. 把这个数字编号能用0和1表示出来 我们通常所说的 Unicode,其实只做了第1件事情,并且...

    • UTF-8
    • GBK
    • GB2312
  20. Apache Hadoop

    Hadoop 是一个开源的分布式计算和存储框架,由 Apache 基金会开发和维护。 Hadoop 为庞大的计算机集群提供可靠的、可伸缩的应用层计算和存储支持,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集,并且支持在单台计算机到几千台计算机之间进行扩展。 Hadoop 使用 Java 开发,所以可以在多种不同硬件平台的计算机上部署和使用。其...

    • Hadoop
    • big data
  21. Java 11 新特性

    Java 11 是继 Java 8 之后的第一个 LTS 长期支持功能版本。 Java 9 中引入了增强的 HttpClient API 作为实验性功能。在 Java 11 中,现在 HttpClient 是一个标准。建议使用 Apache Http Client API 等其他 HTTP Client API 代替。它的功能非常丰富,现在基于 Jav...

    • Java 17 新特性
    • Optional
    • Lambda 表达式
  22. Java 8 新特性

    Java 8 发布于 2014 年,成为 Java 程序员最喜欢且热衷的版本之一,Java 8 引入了很多新特性,并且很多数据结构的底层实现都发生了变化,接下来我们罗列我们日常开发中常用的新特性来分享一下。 Java 8 中的接口新增默认方法(default)和静态方法(static),default 修饰的方法,是普通实例方法,可以用 this 调用...

    • Java 8 新特性
    • Optional
    • Lambda 表达式
  23. Docker

    05 年之前,项目的部署都依赖物理隔离,而到了08年之后几乎就已经大量采用虚拟化技术,通过硬件和软件的支持物理架构的重新整合运用,再发展到18年至今,云计算开始发力。 在云计算的推动下,虚拟化技术是大势所趋,Docker 是作为运维工程师及后端开发人员都应该了解的技术,简化环境搭建、节省开支、持续交付、部署和部署。 学习后我们再也不用受各种安装环境时提...

    • Docker
  24. Spring Boot Logging

    在 Spring Boot 的官方文档的核心功能部分介绍了 Spring 对日志功能的支持,Spring 并没有自己的日志框架实现,而是使用 SLF4J(Simple Logging Facade for Java)作为日志门面,在底层使用 Commons Logging 作为抽象层去识别和对接一些常见的日志框架,如 Logback、Log4j2 等。...

    • log
    • logback
  25. Code Trick

    Code Trick

    • Java
  26. Java 开发规范

    其实开发规范这个事情在协作的时候是个非常让人高血压的事情,还记得当时在第一家公司工作的时候,领导是一个对代码规范十分苛刻的领导,几乎只要有时间他就看我们写的代码,然后把个别个性的代码告诉你让你改,所以当时组里十几个人代码风格出奇的相同,而这样的带来的好处别人写了什么一目了然,而且形似的地方可以直接简单改改就用,感觉自己的“代码洁癖”应该就是在当时产生的...

    • Java
  27. Java 开发规范

    其实开发规范这个事情在协作的时候是个非常让人高血压的事情,还记得当时在第一家公司工作的时候,领导是一个对代码规范十分苛刻的领导,几乎只要有时间他就看我们写的代码,然后把个别个性的代码告诉你让你改,所以当时组里十几个人代码风格出奇的相同,而这样的带来的好处别人写了什么一目了然,而且形似的地方可以直接简单改改就用,感觉自己的“代码洁癖”应该就是在当时产生的...

    • Java
  28. 责任链模式

    责任链模式(Chain of Responsibility Pattern)它允许你构建一个对象链,每个对象都持有对下一个对象的引用,从而形成一条链。每个对象在收到请求后,可以选择处理请求或将请求传递给链中的下一个对象。 这种模式的核心思想是解耦发送者和接收者,让多个对象都有机会处理请求,而不需要显式指定接收者。请求会沿着链传递,直到有一个对象处理它为...

    • chain pattern
    • Java
  29. DDD 领域驱动设计

    领域驱动设计(Domain-Driven Design,DDD)是一种软件设计方法,是一种思想,它以领域为核心,将软件系统拆分为不同的领域,并在不同的领域中建立模型和规则。通过这种方式,可以提高软件系统的可维护性和可扩展性,并减少软件系统中的错误。 在我们以前的后端项目的开发过程当中,软件架构的设计往往是在项目开始之初就确立的,可是在实际的项目开发当中...

    • 框架设计
  30. 日常工具(Mac 版)

    刚从 Windows 换到 Mac 时,确实对这个安装软件晕得很,时间久了其实也觉得差不多,无非也是商店和官网两个下载途径,但是在苹果有了自家芯片之后,很多软件不支持这种 arm 架构,运行 X86 版本的话需要编译一版再运行,还是比较消耗算力的,有的时候甚至会出现发热或者疯狂占内存的情况,所以下载的时候除非不得已还是要下载苹果芯片的版本,查看自己目前...

    • tools
  31. 开发工具

    工欲善其事,必先利其器。其实好用的工具从来不用推荐,工具的下载量就证明了它可以胜任好自己的本职工作,下面我整理一下我自己在用的不错的开发工具给大家参考一下。 吃饭的家伙,一提到 IDEA 我就不得不说一个事情,不是吧不是吧,这都2023年了还有人在用 \b\w{7}\b 做开发吧(狗头保命)。使用正版需要订购 JetBrains 的许可证,因为是订阅型...

    • tools
  32. 内网穿透

    虽然在测试一些局域网联机的方式重新用到了内网穿透的工具,但是值得一提的是在一些特定的场合下内网穿透工具还是十分好用的,陆陆续续用了一些工具,最好用的还是 Ngrok ,并不是国内搜索到的无 token 的版本,下面这使用方式和展示效果更直观简洁。

    • 内网穿透
  33. 初始 Jenkins

    个人理解主节点的 Jenkins 因为不推荐参与构建任务,再加性能损耗小、系统调用权限更直接、复杂度降低等优点,所以应该是安装在宿主机上的,但是目前主流的方案都因为隔离性、可移植性、易于管理和更新的原因都选择容器部署,那我们也就选择容器的方式进行搭建。 便于管理和配置复用,我们这里采用 Docker Compose 的容器编排方式创建 Jenkins ...

    • Jenkins
  34. 配置转存到环境变量

    由于最近上线总是出现问题,而上线规范还要求“一包到底”,这就导致如果上线包出错会导致重新准备包将重新走一遍上线流程,而仅仅是修改配置的话这样反而显得得不偿失,所以沟通后决定将生产包中的配置和代码分离开来,每次上包只包含代码,这样配置抽离存放就有两种方案,一种是放在云平台读取,另一种就是放在环境变量中。 如果是放在微服务中来讲,将配置放在 Nacos 或...

    • Java
    • Spring MVC
  35. 切面编程

    当我第一次接触Spring框架的时候,就告诉我们 IOC(控制反转) 和 AOP(面向切面编程) 这两个最核心的知识点,IOC 作为我们工作中最经常使用的知识点大家肯定是烂熟于心,而一聊到 AOP ,脑海中想到的只有零零散散的面试题,和一些日志、缓存、事务、安全、权限等功能场景,这些场景确实主要在项目搭建阶段就已经搭建完毕了,这也导致我们很少在工作中接...

    • AOP
    • Java
    • Spring Boot

2023

43 篇文章
  1. 数据结构和算法

    一提到数据结构和算法就不的不让我想到上学时计算机的四大天书:**_《数据结构》_**、**_《计算机组成与设计》_**、**_《计算机操作系统》_**、**_《计算机网络》_**。当时根本不知道这几本书的分量,要不然也不会到现在才后悔莫及。其实每次提到数据结构和算法它们都是共同出现的,因为算法大部分都是基于大量的数据结构组合而成的,想要掌握好算法就必须...

    • book
    • data strucutre
    • algorithms
  2. Arthas(阿尔萨斯)

    Arthas 是阿里提供的一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 1. 这个类从哪个 jar 包加载的...

    • Arthas
    • Java
  3. 常用 Linux 命令

    后段开发者难免需要经常和服务器打交道,自己把经常用到的命令都统计下来方便翻阅查看。

    • Linux commands
  4. 1Panel

    在很多内网的服务器中,需要手工输入命令安装各类软件,操作起来费时费力并且容易出错,非常考验运维人员的基本功,而面向一些云服务器来说,我只是需要安装一些数据库或者运行环境,这个时候如果使用运维面板就可以一件安装,简直不要太方便。之前听过的运维面板只有宝塔,不过最近一款开源并且号称新一代的 Linux 服务器运维管理面板 1Panel 横空出世,正好手头也...

    • 1Panel
  5. 排序

    排序就是重新排列表中的元素,使表中的元素满足按关键字有序的过程。在排序的过程中,根据数据元素是否完全在内存中,可将排序排序算法分为两类,内部排序:是指在排序期间元素全部存放在内存中的排序;外部排序:是指在排序期间元素无法全部同时存放在内存中,必须在排序过程中根据要求不断的在内外存之间移动的排序。 每种排序算法都有各自的优缺点,适合在不同的环境下使用,就...

    • algorithm
    • sort
  6. 查找

    在数据集合中寻找满足某各种条件的数据元素的过程称为查找。 用于查找的数据集合称为查找表,它由同一类型的数据元素组成,可以是一个数组或链表等数据结构。对查找表的操作一般有四种: 1. 查询某个特定的数据元素是否在查找表中。 2. 检索满足条件的的某个特定的数据元素的各种属性。 3. 在擦杭州啊表中插入一个数据元素。 4. 从查找表中删除某个数据元素。 若...

    • algorithm
    • find
  7. Git 开发规范

    之前的 SVN 仓库听说是接手的上家公司的原因才保留至今的,如今在甲方要求全面推行 Git 仓库和 DevOps 平台的浪潮下,终于我们要开始使用 Git 开发了。 其实在 SVN 的日子里,刚开始接触的时候确实有点痛啊,因为 SVN 目录在设计的的时候就模仿了 Git 多分支的结构,这里其实我一直就有个问题,我接触的两家公司都是用过 SVN 的,但是...

    • Git
    • SVN
  8. Spring 中遇到的问题

    在 spirng-boot-starter-parent 2.7.3 版本中,因为有一些数据想维护在 resources 下的 yaml 文件中,数据格式大致如下: 当我们用读取配置文件的方式,即 ```@ConfigurationProperties("rate-code")``` 搭配 ```@PropertySource(value = {"cl...

    • Spring
  9. 重构接收价格前置项目

    没想到,重构这个项目的原因居然是公司开始不再使用 Tomcat 部署项目,想把之前的 war 包启动的项目都换成 jar 包部署。之前的前置项目大部分都都是“远古时期”流传下来的“毒瘤”,纯 Java 项目,各种 Thread 满天飞,规范什么的就更别提了,为了追赶上线进度,我们引用 tomcat-embed 模块实现 Java 内置 Tomcat 启...

    • Java
    • Spring Boot
  10. 并发

    提到 Java 的编译过程,我们都会想到 .java 文件到 .class 字节码文件再到汇编指令到 CPU 内执行,而 Java 的并发机制正是依赖了 JVM 的实现和 CPU 的指令,让我们从 volatile 和 synchronized 这两个关键字来配合理解一下并发的原理。 都说 volatile 是轻量的 synchronized,是因为它...

    • concurrency
    • Java
  11. 动态代理

    今天在复习微服务的时候看到 OpenFeign 使用动态代理集成调用 Ribbon 来实现负载均衡,出于兴趣我就想简单瞥一眼到底是如何调用的,可是结果非常出乎意料,搜索到的结果是:在 OpenFeign 中,Ribbon 的集成是通过使用 Feign 的 Client 接口来实现的。可能那个作者单纯是想延伸一下动态代理这一块的知识,至于到底如何调用的先...

    • proxy
    • Java
  12. 图

    图G由顶点集V和边集E组成,记为```G=(V,E)```,其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点关系的集合。注意线性表可以是空表,树可以是空树,但是图不可以是空图。 下面是图的一些基本概念和基本术语: 当E是有向边(弧)的有限集合时,则图G为无向图。若E是无向边的有限集合则图G为无向图。 一个图G如果满足不存在重复边、不存在顶...

    • picture
  13. Servlet

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 Servlet 执行以下主要任务: Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程: 1. Servlet 初始化后调用...

    • Servlet
  14. 并查集

    并查集

    • algorithm
    • Disjoint Set Union
  15. 树和二叉树的应用

    在许多应用中,树中结点常常被赋予一个表示某种意义的数值,称为该结点的**权**,从树的根结点到任意结点的路径长度与该结点上的权值的乘积,称为该结点的带权路径长。树中所有叶结点的带权路径长被称为该树的**带权路径长**(WPL)。 在含有 n 个带权叶结点的二叉树中,其中带权路径长度最小的二叉树称为**哈夫曼树**,也称为**最优二叉树**。 从上述的构...

    • tree
  16. 打包工具-Ant

    Apache Ant,在我看来称他为时代弃子也不为过,我现在都还依稀记得当时学习ant时看到的一篇文章里有那么一句话:使用 ant 作为构建工具对程序员来说是一种挑战。 对我来说,认识到ant还是因为刚步入社会的公司里总有些老旧的纯 Java 项目依然苟延残喘,第一次看见项目目录里的 build.xml 的我那时候还没有认识到问题的严重性,直到自己负责...

    • ant
  17. Pinia

    Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子,结合了 Vuex 5 核心团队讨论中的许多想法。最终,我们意识到 Pinia 已经实现了我们在 Vuex 5 中想要的大部分内容,并决定实现它 取而代之的是新的建议。 与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的规范,提供了 Composition-API 风格的...

    • Pinia
  18. 树和二叉树

    > 所有的测试代码都在博客[首页](/)中的 java-study-demo 中找到。 树是 n(n >= 0) 个结点的有限集。当 n = 0 的时候,称为**空树**,在任何一个非空树中应该满足: 1. 有且只有一个特定的称为根的结点。 2. 当 n > 1 时,其余结点可以分为 m(m > 0) 个互不相交的有限集 T1,T2,...

    • tree
  19. Vue3

    问过一些从事前端的朋友,他们大部分都还在用 Vue2,倒不是因为不想用 3,主要是公司的框架都是2,如果重新改造得不偿失,但是他们自己都是已经在使用 3 开始做项目了。学习 Vue3 之前还是建议有一些 Vue2 的基础,官网给出了 3 中我们值得关注的一些新特性: 新特性还是非常多的,其中最直观也是最重要的就是 组合式API 的出现,它取代了 Vue...

    • Vue3
  20. 单元测试

    > 单元测试(Java语言中)是对类中每个方法提供一个或多个测试的一种实践,其目的是为了有规律的测试一个类的各个部分是否具备正确的行为。 ——摘自《Java 编程思想》 刚开始工作的时候谁写测试类啊,还单元测试呢,测试我都不测试。后来到了正式一些的公司之后,不通过质量门禁则不能上线,所以 JaCoCo 这个开源的单元测试引擎就发挥作用了,它搭配 Son...

    • Spring Boot
    • Java
    • Mockito
  21. 个人图床

    Telegraph-Image,一个免费图片托管解决方案,Flickr/imgur替代品。使用 Cloudflare Pages 和 Telegraph。 1. 无限空间。 2. 开源免费。 3. 部署简单,只需要根据 README 文件几分钟就可以成功。 1. 图片大小最大为5MB。 2. 由于使用Cloudflare的网络,图片的加载速度在某些地区...

    • Image Hosting Service
    • Cloudflare
  22. Shell 脚本

    > 所有的脚本没有特殊标注都以 Linux 机器为准,有些命令可能在 AIX 机器上会失效。 可以使用 cron 来定时运行此脚本,使用 ```crontab -e``` 命令编辑当前用户的 cron 任务表,然后添加以下内容: 保存后退出,可以使用 ```crontab -l``` 查看是否添加成功。 对于声明环境变量的文件,可以用 _**expor...

    • Shell
  23. 队列

    > 所有的测试代码都在博客[首页](/)中的 java-study-demo 中找到。 队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。特性是最早进队的也是最早出队的,即先进先出(FIFO, First In First Out)。 看完以...

    • queue
  24. 串

    字符串简称串,计算机上非数值处理的对象基本都是字符串。通常用的搜索引擎、文本编辑程序、问答系统和自然语言翻译等都是以字符串作为处理对象。串是由零个或多个字符组成的有限序列,一般记为 ```S = 'a1a2a3……an'```,其中 S 是串名,单引号内的括起来的字符序列是串的值,其中 ai 可以是字母、数字或者其他字符;串中字符的个数称为串的长度,为...

    • string
  25. 数组和特殊矩阵

    矩阵在数据结构中考虑的是如何用最小的内存空间来存储同样的一组数据,所以我们应该把精力放在如何将矩阵更有效的存储在内存中,并能更方便的提取矩阵中的元素。通常矩阵在计算机语言中借助数组进行存储,我们首先认识一下数组的存储。 数组是由 n(n >= 1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在 n 个线性关系中的序号称为该...

    • arrays
    • matrices
  26. ECMAScript 6+

    ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。当然新版本的出现就是为了解决旧版本的一些问题,不过更新之后感觉 JS 更像 Java 了,哈哈哈,只能说语言之间相互取其精华,去其糟粕。话不多说直接开始。 解构赋值是对赋值运算符的扩展,针对数组或者对象进行模式匹配,然后对其中的变量进行赋值...

    • ES6+
  27. Layout 布局

    早期的布局的即把界面看作分为东南西北中五块个模块,其中每个模块的相对位置又可以分流式布局、自适应布局等,到现在网页项目逐渐趋于模块化后,现在认识到的布局更多的是指嵌套 Header、Sider、Content、Footer 和 Main 组件的界面样式,我们可以在 Element UI 的组件中看到这几个部分的排列演示: 在真正落地布局之前我们还应该需...

    • Layout 布局
  28. TypeScript + ES6+

    TypeScript 与 JavaScript 有着不同寻常的关系。TypeScript 提供了 JavaScript 的所有功能,并在这些功能之上添加了一层:TypeScript 的类型系统,所以很多人都说 TS 是 JS 的超集。更多的细节详见官网,话不多说,我们直接开始准备工作。 > 所有的测试代码都在博客[首页](/)中的 t...

    • TypeScript
  29. 栈和队列的应用

    假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序任意,只需要成对匹配即位正确,否则为不正确。 算法思想如下: 1. 初始设置一个空栈,顺序读入括号。 2. 若是右括号,则和栈顶最紧迫的期待的括号消解,如果不能成对消除则不合法,退出程序。 3. 若是左括号,则作为一个新的更紧迫的期待压入栈中。当算法结束时,栈为空,否则不合法。 表达式求值可以结...

    • queue
    • stack
  30. Web Service

    刚来公司的时候有些项目请求并不是用 Postman 发送 Http 请求,而是用 SoapUI 的工具发送 XML 请求,当时面对那个老旧版本的工具和我个人非常嫌弃的 XML 我直接从头到脚就是抵触,后来我才知道这个东西叫 Web Service。现在用 Web Service 的还多吗,当然是不多,Apache 官网维护的 Web Service 最...

    • Web Service
    • Java
  31. 栈

    > 所有的测试代码都在博客[首页](/)中的 java-study-demo 中找到。 栈(Stack)是只允许在一端进行插入或删除操作的线性表。 如上图所示,a1为栈底元素,a5为栈顶元素。根据规则,进栈次序依次为a1,a2,a3,a4,a5,而出栈依次为a5,a4,a3,a2,a1,由此可见栈的操作特性可以明显囊括为先进后出(La...

    • stack
  32. 线性表

    > 所有的测试代码都在博客[首页](/)中的 java-study-demo 中找到。 线性表是具有相同数据结构的n(n ≥ 0)个数据元素的有限序列,其中n为表长,为0即为空表。一般标识为:L=(a~1~,a~2~,a~3~,a~i~,a~i+1~,……,a~n~,),其中a~1~是唯一的第一个元素,被称为表头元素;a~n~是唯一一...

    • linear list
  33. Spring Security + JWT

    说到 JWT(JSON Web Token),我们首先要知道 Token 是什么,想要知道 Token 是什么,我们就得先谈一下早期 Session 登录的时代,下面是之前 Session 登录的大致流程。 然而,随着应用程序的复杂性和扩展性的增加,分布式系统和跨服务的场景变得更加常见。在这种情况下,使用基于 Session 会话的登录可能会面临一些挑...

    • Spring Security
    • JWT
  34. Nacos

    传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化。轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中。配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置。配置中心兼往往顾了集中管理、动态更新和版...

    • Spring Cloud Alibaba
    • Java
    • Nacos
  35. Spring Security 基础

    目前提到安全框架,Shiro 和 Spring Security 算得上是分庭抗争了,并且 Shiro 主打的是简单、轻量,但却没有 Spring Security 灵活,在 Spring Security 支持 OAuth2 之后更加贴合当前社会需求,并且我们如果使用 Spring 框架的话,学习 Spring Security 更是如鱼得水,并且是...

    • Spring Security
  36. Gateway

    网关是一个通用的概念,它在计算机网络中指的是在不同网络之间进行连接、转发和控制流量的设备或软件。而微服务网关我们通用的理解是统一对外暴露可共享的服务 API 的功能,一般这些微服务网关都与服务注册中心相配合使用,这里我们要谈的 Spring Cloud Gateway 是基于 Spring Boot 和 Spring WebFlux 构建的网关框架。它...

    • Spring Cloud Alibaba
    • Java
    • Gateway
  37. Spring Boot Admin

    Spring Boot Admin是一个用于管理和监控 Spring Boot 应用程序的开源项目。它提供了一个用户界面,可以集中管理多个 Spring Boot 应用程序,并提供有关这些应用程序的详细信息和指标。 其模式也和 Eureka 相同分为客户端和服务端相同,主要功能如下: Spring Boot Admin 可以选择和服务注册中心搭配使用,...

    • Spring Cloud Alibaba
    • Java
    • Spring Boot Admin
  38. Spring Data Redis

    Redis 作为基于内存的 NoSQL 数据库,在解决包括缓存、会话存储、排行榜、实时分析和消息队列等场景上有着不可替代的作用,所以目前几乎所有的项目都会有依赖它的需求,相比于一些传统的关系型数据库 Redis 的配置更加简单容易,所以在项目中使用非常推荐放在 common 模块当中来方便其他模块依赖,使用的时候直接注入即可,这里我也是基于这种思想来演...

    • Spring Data
    • Redis
  39. Spring Security + OAuth2

    OAuth 2.0(开放授权 2.0)是一种授权框架,用于允许用户授权第三方应用程序访问其在另一个应用程序(如社交媒体、电子邮件服务或云存储服务)上的受保护资源,而无需向第三方应用程序共享其凭据(例如用户名和密码)。其主要职责就是实现一个三方互信的功能,目前网站上支持的第三方登录就是 OAuth 协议的实现。OAuth 2.0 的核心概念包括以下角色:...

    • Spring Security
    • JWT
    • OAuth2
  40. 数据库

    相信一个合格的程序员是必须对数据库这项技术要达到熟练的地步吧,之前可能觉得要和数据库交互的往往只有后端程序员,可是后来随着各类数据库的发展,很多数据库也可以配合前端直接使用,所有掌握 SQL 和数据库进行交互也是程序员必备的技能。 听我一个朋友谈起,其实程序员很大一份就是在和数据打交道,而对于数据库中数据的处理来说,尽管大家都是在用 SQL ,但是在不...

    • book
    • database
  41. 其他技能

    提到版本控制(Version control),自从 Git 横空出世之后,Subversion 就开始逐渐退出神坛,相对于 Subversion 这种集中式的版本控制系统,分布式风格的 Git 更适合多人协作开发使用,虽然 Subversion 和我们平时使用本地文件的习惯非常相近,容易上手,但是面对更多人同时开发的场景来说,Git 拥有更多样的协作...

    • book
    • skills
  42. 观察者模式

    观察者模式也被称为发布-订阅模式或者事件-监听模式,这让我们很容易联想到 Redis、MQ 中的发布订阅模式,即主题对象(发布者)和观察者对象(订阅者)之间的关系类似于发布者发布事件,而观察者监听并响应该事件的方式,所以观察者模常用于实现对象之间的一对多依赖关系。 大多数编程语言都支持观察者模式的实现,但是大多数的场景下并不会去使用,因为其实现存在一些...

    • observer pattern
    • Java
    • Spring Boot
  43. 反射

    基本搜索 Java 学习路线,摆脱基础语法后迈入高级特性的第一步就是注解(Annotations)和反射(Reflection)。当时在学完内置注解、自定义注解、获取类信息、调用方法和访问字段之后,大概清楚这是个搭配起来简化开发的组合,但是这些场景一般都是在框架开发、动态代理、注解处理才会出现,而且使用反射还会还会在一定程度上降低性能,并且在编译时无法...

    • reflection
    • Java