FakeAmadeus's blog
前言欢迎来到我的个人网站:FakeAmadeus’s Blog。常言道“好记性不如烂笔头”,这个博客正是我践行此道的数字空间,旨在系统梳理并输出我的学习所得与技术思考。 这个站点本身也记录了我的技术演进路径:它历经多次架构重构,从最初的 Spring Boot 2 + Vue 2 动态应用,升级到 Spring Boot 3 + Vue 3,最终演变为如今基于 Hexo 静态生成,并通过 GitHub 与 CloudFlare 全球部署的形态。 第一版:从零到一的实践时间推进到大三下学期,彼时我已系统学完了前端与后端知识,主攻方向是后端技术栈。我迫切需要一个完整的项目来融会贯通所学,恰好这时在B站发现了一个技术栈完全契合的博客项目,便立刻从 GitHub 上拉取代码开始复刻。一位室友还提供了一个闲置的阿里云服务器,这让项目的落地成为可能。 这可以说是我真正意义上第一次“从零到一”独立完成一个项目:没有视频教程,也没有详细文档,只能直面代码和有限的注释。从开发、调试到最终部署上线,我完整地走完了整个流程,让这个项目真正在互联网上跑了起来。 相关文章链接 第一版博客 第二版:技术...
2025个人博客搭建指南
前言我的博客之前一直部署在个人购买的服务器上。由于前端和后端都是自己实现的,为了让前后端能够交互,确实需要一台暴露在外网的服务器。然而,个人维护服务器需要处理很多事情:代码更新后的 CI/CD、HTTPS 证书续签(从 2025 年开始每三个月就要操作一次,非常麻烦)、CDN 配置等等。最近服务器刚好到期,我便开始思考:个人博客真的需要这么复杂吗?答案是否定的。只要我接受无后端架构,市面上就有很多成熟且免费的解决方案。经过一番调研,我决定采用以下关键词来搭建新的博客:Hexo、GitHub、CloudFlare。 静态博客框架 - Hexo程序员的文章通常以 Markdown 语法为基础,市面上有很多支持 Markdown 的静态博客框架。我选择 Hexo 主要是因为其主题 Butterfly 比较符合我的审美。本文并非从零开始的部署教程,Hexo 和 Butterfly 的官方文档已经非常详细,建议直接参考它们来了解如何使用。 托管仓库 - GitHub这一点无需多言。为了实现 CI/CD,自然需要将代码和配置托管在公网上。由于后续会依赖 CloudFlar...
LeetCode - 移除元素
前言最近在复习数据结构与算法,虽然一下子就想到了题目的关键做法:双指针,但是被边界条件硬控太久了,瞄了一眼官方题解,对边界处理比较妙,故反思一下。 题目链接:27. 移除元素 第一次 AC 代码12345678910111213141516171819202122232425class Solution { public int removeElement(int[] nums, int val) { int ans = 0, left = 0, right = nums.length - 1; while (left < right) { if (nums[left] != val) { ans++; left++; } else { while (right > left &...
Spring IoC Container
前言作为一个 Java 程序员,平时打交道最多的自然是 Spring,正逢最近有空,借助源码和官方文档仔细温习一下 Spring IoC 容器。 本文中贴出的 Spring 源码均是基于 Spring 6.2.12 IoC 容器基本概念个人理解上来说应该拆分为 IoC(控制反转) 和容器: 容器:屏蔽掉所有的细节的话,可以用 Map 的概念来代指,简单来说就是我告诉你我需要什么你就给我什么。 控制反转:把对象创建和依赖管理的控制权从程序内部转移到外部容器,简单来说就是本来你(对象)自己 new 对象,现在变成别人(容器)给你 new 好送来。 IoC 容器以 Bean 为单位管理应用程序组件,为了后续解读源码方便,最先应该了解的就应该是 Bean 的生命周期。 Bean 生命周期个人理解是五个阶段:定义、实例化、依赖注入、初始化和销毁 定义:通过 BeanDefinition 定义 Bean 的基本配置信息,可以是 Class 也可以是 XML,我接触到的项目都是通过 Class 来定义的。 实例化:通过 BeanDefinition 中的配置信息来实例化 Bean,如...
Aspose 小语种渲染有误
背景客户反馈系统打印出来的 PDF 中的内容与他们提供的 Word 模板差异很大,差异主要体现在缅甸语上,经过仔细地对比,发现确实有一部分缅甸语语句完全不同。为了修复这个问题废了很大的劲,故在此做一个记录。 流程梳理根据代码分析,流程大致下图所示: flowchart TD Start([开始]) --> loadTemplate[读取 Word 模板] loadTemplate --> loadRenderParams[读取渲染参数] loadRenderParams --> poiTlRender[poi-tl 根据模板和参数渲染] poiTlRender --> asposeConvertPDF[Aspose 将渲染好的模板转换为 PDF] asposeConvertPDF --> End([结束]) 问题分析根据上述流程图可以怀疑三个地方: 读取到的 Word 模板有误:读取到之后又马上输出的内容与模板一致,排除。 poi-tl 渲染有误:将渲染好的 Word 输出到本地,发现内容与模板一致,排除。...
分布式共识算法——Raft
前言一个小而精致的Raft算法演示网站:Raft (thesecretlivesofdata.com) Raft概念Raft是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。遵从此协议的分布式集群会对某个事情达成一致的看法,即使是在部分节点故障、网络延时、网络分割的情况下。 Raft基础 一个Raft集群一般包含奇数个服务器node,通常是五个,这代表着整个系统容忍2个节点失效(2 * n + 1)代表总node数的话,n就代表能够容忍的最大宕机node数。 Raft是基于Paxos算法的,Raft拥有Paxos相同的功能,却拥有简单的理解难度和实用程度,Raft在同一个term当中只会存在一个leader,而Paxos可能存在多个leader。 Raft的过程都是在寻求集群中大多数服务器的同意,比如Leader Election,只要有半数以上的服务器同意一个服务器成为Leader,那么这个服务器就会晋升为Leader。再比如一个更新请求进入集群,只有当集群中半数及以上的服务器都能完成这个更新操作的时候才会返回操作成功。这也说明了为什么Raft集群总是要保持奇数个 ...
第一版博客
欢迎光临我的个人博客:FakeAmadeus’s Blog 🙋♂️打个招呼大家好,我是 FakeAmadeus,目前是一名准大四学生,正在向后端开发方向发展。主要使用的编程语言是 Java,同时也因 Go 语言在后端领域的流行而对其有一定了解。这个博客项目是我首次从零开始独立完成的项目,通过研究 GitHub 上的开源代码,我学习了如何设计一个合理的博客系统,并亲自完成了设计、开发、测试与部署的全过程。 💡 博客技术总结前端: Vue + Vuex + Vue Router + Axios + Vuetify + Element UI + ECharts + Nginx 后端:Spring Boot + MyBatis-Plus + MySQL + Docker + Spring Security 开发工具:IntelliJ IDEA、VS Code 服务器:阿里云 CentOS 7(1核2G配置) 本博客的后端完全由我自主开发,前端则基于风宇提供的博客模板进行了适配和修改。该项目主要用于巩固我所学的后端技术,并在实践中发现并弥补知识盲区。由于个人技术与经验尚在积累中,后端...
