# 司机带你开车 > 技术无国界, 折腾无止境 ## Article List - [pev-init](https://blog.dong4j.site/posts/13e613ba.md): null - [Ubuntu 使用备忘录:好记性不如烂笔头](https://blog.dong4j.site/posts/91f73d3b.md): 本文是一个关于Ubuntu操作系统的使用备忘录,主要内容包括系统优化建议、系统克隆方法、KVM虚拟机管理、Cockpit管理工具的使用以及软件更新时遇到磁盘空间不足问题的解决方法。通过这些备忘录,用户可以更高效地管理和维护Ubuntu服务器,避免重复查询资料,节省时间。 - [使用 Cloudflare 增强公网服务安全性的实践](https://blog.dong4j.site/posts/5fa20a9e.md): 本文介绍了如何使用 Cloudflare 的代理功能来增加暴露到公网服务的安全性。作者通过配置 Cloudflare,成功地将家中的 NAS 服务通过自定义域名安全地暴露在外网,并隐藏了真实的公网 IP 地址。文章详细描述了配置过程,包括端口转发、代理设置、Cloudflare Rules 以及 SSL 证书的配置。此外,还探讨了 Cloudflare Workers 的使用,并总结了作者对 Cloudflare 的初步体验。 - [Ubuntu 系统下 LCD4Linux 的安装与配置指南](https://blog.dong4j.site/posts/b0f649a0.md): 本文介绍了如何在Ubuntu系统上安装和配置LCD4Linux,以实现在LCD屏幕上显示系统监控信息。文章首先介绍了LCD4Linux的背景和功能,然后详细讲解了安装过程,包括必要的硬件连接和软件安装。随后,文章重点介绍了LCD4Linux的配置过程,包括屏幕配置、显示部件的定义和布局的指定。此外,还提供了一些常用插件的使用示例,如内存插件、系统状态插件和启动时间插件。最后,文章通过参考资料为读者提供了进一步学习的途径。通过本文的指导,读者可以轻松地在Ubuntu系统上使用LCD4Linux来展示系统信息。 - [树莓派与移远EC20 4G网卡集成及自动拨号方案解析](https://blog.dong4j.site/posts/c78c58c7.md): 本文详细介绍了如何在树莓派上集成移远EC20 4G网卡,并实现自动拨号。首先,文章展示了EC20模块及其相关配件的实物图片,并指导如何检查USB设备中是否存在4G模块。接着,文章介绍了如何获取4G模块的USB转串口终端,并提供了使用wvdial进行PPP拨号上网的详细步骤。此外,文章还探讨了使用qmi_wwan进行拨号的方案,并对比了两种拨号方式的优缺点。最后,文章提供了一个自动拨号脚本的示例,并解释了如何配置开机自启动。通过本文的指导,读者可以轻松地在树莓派上使用EC20 4G网卡进行网络连接。 - [使用 TTL 连接到树莓派 Zero 2W 的详细指南](https://blog.dong4j.site/posts/b13a9376.md): 本文详细介绍了如何使用TTL(串行通信)连接到树莓派Zero 2W。首先,简要介绍了串口通信的基本概念,包括RS-232和TTL两种类型。接着,指导读者如何在树莓派上开启串口功能,并在macOS系统上安装CH340X驱动。文章还介绍了如何使用screen命令进行串口通信,并提供了处理连接问题和会话管理的具体步骤。最后,通过图片展示了USB端和设备端的连接方式,并提供了相关参考链接。 - [Hexo 部署利器:GitHub Actions 实现自动化发布](https://blog.dong4j.site/posts/a754e8c8.md): 本文介绍了如何使用 GitHub Actions 自动化部署 Hexo 静态网站到 GitHub Pages。文章首先分析了传统使用 hexo-deploy-git 插件部署时遇到的问题,如 Jekyll URL 解析错误等,并提出了使用 GitHub Actions 作为替代方案。文章详细讲解了如何修改 GitHub Pages 配置以禁用 Jekyll,并添加自定义的 GitHub Action 工作流配置文件,以实现从 deploy 分支部署静态内容。此外,文章还提供了一整套部署命令,包括初始化 .deploy_git 目录、添加远程仓库、创建部署分支、拷贝编译后的 public 文件夹内容、添加 GitHub Actions 配置以及强制推送等步骤。最后,文章总结了使用 GitHub Actions 部署 Hexo 的优势,如简化流程、减少部署时间,并指出该方案避免了 Jekyll 兼容性问题带来的困扰。 - [捡垃圾的快乐:因为一张显卡组装了一台服务器](https://blog.dong4j.site/posts/ded15d16.md): 本文详细介绍了如何将一块 Tesla P40 显卡从公司服务器带回家,并在家庭实验室环境中重新利用的过程。文章首先介绍了显卡的基本情况和市场价值,然后逐步讲解了硬件配置、魔改指南、系统安装与升级、网络配置、以及安装 Docker、Node.js 和 pm2 等开发工具。重点介绍了如何解决网卡问题、配置 WiFi 和有线网络,以及如何安装和配置 NVIDIA 显卡驱动和 CUDA 工具包。此外,文章还分享了如何安装和验证 CuDNN 库,以及如何使用 PyTorch 进行简单的 GPU 性能测试。最后,文章总结了整个过程的收获和参考资料,为读者提供了宝贵的实践经验和知识。 - [探索在线封面生成工具:打造专属博客封面的捷径](https://blog.dong4j.site/posts/cd1cca40.md): 本文介绍了几款优秀的在线封面生成工具,包括针对开发者设计的CoverView、灵活调整的Cover-Image-Generator、简洁实用的PicProse、个性化定制的imgsrc等。这些工具各具特色,如无水印的Free Open Graph Generator、模板丰富的OG Image Maker、专注网站展示的Open Graph Image Generator等,都能帮助用户快速打造专业且吸引人的博客封面。无论是开发者、设计师还是普通博主,这些工具都能满足不同需求,为博客内容增添视觉魅力。 - [从零开始开发一个 Hexo 插件:以 hexo-plugin-llmstxt 为例](https://blog.dong4j.site/posts/b902d8fd.md): 从零开始开发一个 Hexo 插件,以 hexo-plugin-llmstxt 为例,涵盖了 llms.txt 的定义、背景、规范,Hexo 插件开发基础,包括插件类型、基本结构和命名规范。详细讲述了开发 hexo-plugin-llmstxt 的步骤,从初始化项目、编写 package.json 到实现核心功能、处理文章内容、文件生成等。还提到了开发过程中的注意事项、测试和发布方法,以及总结和参考资料。旨在帮助开发者理解 Hexo 插件开发流程,为文档处理提供实用工具。 - [Lazydocker:终端中的懒人 Docker 管理神器](https://blog.dong4j.site/posts/edfbbdc9.md): Lazydocker 是一款基于终端的 Docker 管理工具,它以简洁的 UI 设计和一键式操作著称,为开发者提供了高效的管理体验。本文全面介绍了 Lazydocker 的核心功能,包括一站式容器管理、快捷操作与调试、以及自定义与扩展性。文章还提供了详细的安装指南,支持 Linux、macOS 和 Windows 等多平台。通过实战技巧的分享,展示了如何使用 Lazydocker 实时监控容器状态、快速调试服务异常以及批量管理资源。最后,文章对 Lazydocker 的优缺点进行了分析,并推荐给那些希望简化 Docker 管理流程的开发者。尽管存在一些功能局限和偶发的 Bug,但 Lazydocker 凭借其轻量高效和跨平台支持的特点,成为日常开发和调试的利器。 - [哪吒面板配置指南:自托管与安全防控详解](https://blog.dong4j.site/posts/adc3ac9e.md): 本文详细介绍了如何自托管哪吒面板(Nezha Dashboard),并对公网暴露的监控面板进行了安全防控设置。文章首先概述了哪吒面板的功能和组件,然后讲解了如何通过源码方式部署 Dashboard 和 Agent,并同步后台前端资源。重点介绍了如何对前端页面进行修改,包括添加统计服务、隐藏公网登录入口、页面整体放大等。此外,文章还分享了如何通过 Nginx 配置限制接口访问,以及如何使用 pm2 进行一键部署和自动化更新。最后,文章总结了安全配置的注意事项,并提供了相关命令行操作示例和参考资料链接,以帮助读者顺利完成哪吒面板的自托管和安全防控。 - [自建服务:使用 AI 生成文章摘要并使用 Kokoro TTS 生成语音播报](https://blog.dong4j.site/posts/66ccb3f1.md): s本文探讨了替换博客摘要生成服务的想法和实施过程。作者一直使用TianliGPT生成博客摘要,但由于其语音播报服务不可用,且DeepSeek-R1的流行降低了LLM API的价格,作者决定替换为自建的AI API。文章已实现使用Node.js开发数字名片并集成Chat服务,现需将LLM API替换为自建的one-api,以增强安全性并灵活控制Token。同时,计划使用Kokoro TTS生成文章摘要的语音播放功能。整体改动简单,只需修改one-api配置,无需重新部署博客。 - [使用 PM2 守护 Flask 应用:从安装到配置详解](https://blog.dong4j.site/posts/ba2a34a5.md): 本文详细介绍了如何使用 PM2 来守护一个基于 Flask 的 Python 应用。首先,文章讲解了安装 Node.js 和 PM2 的步骤,并验证了安装是否成功。接着,文章指导读者准备 Flask 应用,包括生成依赖文件、配置虚拟环境以及编写启动脚本。为了提高性能,文章还介绍了使用 gunicorn 来运行 Flask 应用的方法,并提供了配置示例。文章的核心部分讲解了如何使用 PM2 来守护 Flask 应用,包括直接启动、使用自定义脚本以及通过配置文件进行管理。此外,文章还提供了一份 PM2 命令列表,方便读者快速查找和使用。最后,文章总结了一些常见问题及其解决方案,如 PM2 找不到的问题、文件监控的问题以及用户权限问题,帮助读者顺利部署和管理 Flask 应用。 - [使用 Node.js 开发数字名片并集成 Chat 服务](https://blog.dong4j.site/posts/bb4018e9.md): 这篇文章主要介绍了如何使用 Node.js 开发一个数字名片,并集成了一个使用 one-api 对接多家 LLM 接口的 Chat 服务。文章首先介绍了如何获取和使用各大厂商提供的 free-api,然后详细介绍了如何将这些 free-api 接入到 one-api 中。最后,文章还讨论了如何进行安全防控和性能调优。文章首先介绍了如何获取和使用各大厂商提供的 free-api。free-api 是各大厂商提供的免费 API,可以用于获取各种信息,如天气、新闻、股票等。文章详细介绍了如何注册并获取 free-api,以及如何使用这些 API 获取信息。接下来,文章介绍了如何将这些 free-api 接入到 one-api 中。one-api 是一个统一的 API 接口,可以对接多家 LLM 接口。文章详细介绍了如何配置 one-api,以及如何使用 one-api 调用 free-api。最后,文章讨论了如何进行安全防控和性能调优。文章介绍了如何使用防火墙和安全组进行安全防控,以及如何使用负载均衡和缓存进行性能调优。 - [从零开始开发 VSCode 插件:从 Hello World 到图片处理工具](https://blog.dong4j.site/posts/621bb677.md): 在这篇博客中,我们将从最简单的 Hello World 插件开始,一步步学习如何开发 VSCode 插件,并最终实现一个实用的图片处理工具。我们会详细介绍插件的基础结构、命令和菜单的配置、如何添加配置支持以及进阶功能。此外,我们还将分享一些开发技巧和注意事项,并通过对一个实战案例的开发过程,展示如何将一个 VSCode 插件从概念变为现实。希望这篇教程能够帮助初学者开始 VSCode 插件开发之旅,并为经验丰富的开发者提供一些新的思路和灵感。 - [Chrome 插件开发实战:从零开始开发一个图片上传工具](https://blog.dong4j.site/posts/af11d9f5.md): 在这篇博客中,我们将从零开始学习如何开发一个 Chrome 插件——图片上传工具。这个插件旨在帮助博主快速处理和上传图片,支持一键上传、自动压缩、格式转换、多语言支持、自定义配置以及即时反馈等功能。通过这个实战项目,你将学习到 Chrome 插件开发的基础知识和实战技巧,包括插件的核心组件、重要的 Chrome API、用户界面设计、国际化支持、开发技巧和最佳实践、调试技巧以及发布流程。此外,你还可以在 GitHub 上找到完整的项目代码,并参与到项目的改进中来。希望这篇教程能帮助你开始 Chrome 插件开发之旅。 - [利用 AI 对博客文章进行智能分类](https://blog.dong4j.site/posts/f5478013.md): 本文介绍了如何使用AI技术对博客内容进行智能分类,以实现更精准的内容管理和推荐。 - [AI助力博客创作:自动生成摘要与标签的实战指南](https://blog.dong4j.site/posts/87c223f.md): 本文探讨了如何利用AI技术自动为博客生成标签和摘要,以提升内容在信息爆炸时代的影响力。文章强调了标签和摘要的重要性,并介绍了AI在这一领域的技术优势,如高效性、准确性和个性化。接着,文章详细阐述了使用本地自建的LLM服务实现自动生成标签和摘要的过程,包括配置LLM服务、编写自动化脚本以及部署工作流程等。最后,文章总结了这一过程的优势,即提高效率、增强内容质量和促进本地化发展。 - [Hexo博客部署与图片处理全攻略:自动化流程大揭秘](https://blog.dong4j.site/posts/461c6733.md): 本文介绍了如何通过编写脚本和利用Makefile,简化Hexo博客的发布流程。作者详细描述了从图片处理、文章处理到部署到本地服务器和GitHub的全过程,包括使用Typora插入和管理图片、清理未引用图片、将图片转换为WebP格式、上传图片到图床以及根据不同环境编译文章等步骤。最后,作者通过Makefile将整个流程自动化,并通过命令行或VSCode插件运行。 - [群晖 NAS Docker 网络优化:配置 HTTP/SOCKS5 代理的终极指南](https://blog.dong4j.site/posts/13a784a6.md): 本教程介绍了在群晖NAS(DSM 7.2版本)上配置Docker代理的步骤。首先通过SSH连接到NAS,创建一个配置文件夹并编辑代理配置文件,设置HTTP或SOCKS5代理,然后重新加载重启Docker服务,最后验证代理是否设置成功并通过拉取镜像测试代理效果。在受限网络环境中,代理可以帮你顺利下载Docker镜像。 - [图片过多导致GitHub/Gitee仓库爆仓?这里有解决方案!](https://blog.dong4j.site/posts/d4c941b5.md): 本文介绍了如何解决GitHub和Gitee仓库体积限制的问题,包括通过Git GC清理历史记录、使用git-filter-repo删除大文件历史和bfg-repo-cleaner工具清理大于特定大小的文件等方法。文章还包含了相应的命令行代码示例和效果图片。 - [ComfyUI Desktop 安装攻略:自动化安装失败问题解决](https://blog.dong4j.site/posts/85d50e5.md): 本文记录了作者在尝试安装最新版本的ComfyUI-Desktop时遇到的问题和解决方法。首先遇到了PyTorch安装失败的问题,随后通过手动运行缺失的命令成功部署。接着,作者尝试使用虚拟环境中的python进行安装,并通过执行测试代码验证了安装成功。然而,在后续步骤中仍然缺少一些软件包,最终决定直接使用ComfyUI的`requirements.txt`文件安装依赖项,并顺利完成剩余的安装步骤。 - [智能化的内容管理工具:Hoarder的AI书签革命](https://blog.dong4j.site/posts/90130153.md): Hoarder 是一款开源的 AI 书签管理工具,专为 NAS 部署设计。它通过 AI 技术自动标记内容,支持链接、笔记、图像和 PDF 的存储。此外,Hoarder 还提供全文搜索功能,以及 OCR 技术从图像中提取文本。该工具还支持多种平台,包括 Chrome 和 Firefox 插件、iOS 和 Android 应用等。 - [ZSH 启动慢,原来是这个问题!](https://blog.dong4j.site/posts/5eb89a7b.md): 本文详细介绍了 macOS 中将 zsh 配置为默认 shell 时,由于配置文件加载顺序导致的启动时间过长的问题。文章首先解释了 Bash 和 zsh 的配置加载顺序差异,并分析了问题出现的可能原因。接着,通过排查发现是由于 `.zshrc` 文件向 `.zprofile` 添加了大量重复的 `eval` 命令导致。最后,提供了优化 zsh 启动时间的建议和参考资料。 - [HomeLab 网络续集:升级 10G 网络-再战 10 年](https://blog.dong4j.site/posts/7e09e56.md): 本文介绍了博主升级家庭网络到万兆的经验,包括从犹豫不决到决定升级的过程、第一次接触光纤和光模块的相关知识、设备购买、网络拓扑设计、网络环境配置和网络测试等方面的细节。文章详细探讨了雷电 4/3 和 USB4.0 的差异,以及 JHL7440 和 ASM2464PD 两款主控芯片的性能对比。最后,博主分享了网络拓扑图、硬件和软件的部署情况,并对升级效果进行了测试。 - [为 Hexo 博客引入智能对话:集成 AI 聊天机器人全攻略](https://blog.dong4j.site/posts/385a05d5.md): 本文介绍了如何将 AI 聊天机器人集成到 Hexo 博客中,以增强读者互动体验。文章首先介绍了所使用的 dify 工具,一个支持检索增强生成(RAG)的开源项目,它可以结合各大厂商的 AI API 和自建的语言模型服务。作者分享了如何利用 dify 构建个人知识库,并基于博客内容提供智能对话服务。文章详细描述了将 dify 嵌入到 Hexo 主题中的步骤,包括获取嵌入代码、本地化 embed.min.js 文件、创建必要的 JavaScript 和 CSS 文件,并解释了如何进行样式的自定义。此外,文章还考虑了移动设备的适应性,提供了条件加载 CSS 和 JavaScript 文件的脚本,以确保聊天机器人在非移动设备上运行。最后,文章展示了集成后的效果,并讨论了未来的知识库建设计划,包括对话服务的升级和语言模型的更换。 - [树莓派集成 PCA9685 舵机控制与流媒体服务器视频推流的综合应用](https://blog.dong4j.site/posts/a21c0fd1.md): 本文介绍了如何在树莓派上集成PCA9685舵机控制,并通过流媒体服务器实现视频推流。首先,文章概述了PCA9685的主要特点和应用场景,包括其16路独立PWM输出和I²C接口通信等。接着,详细讲解了如何连接PCA9685舵机驱动板和树莓派,以及如何配置树莓派的I2C接口。文章还介绍了如何使用PCA9685 Python库来控制舵机,并展示了通过Web页面实时展示两个摄像头画面,并利用PCA9685舵机控制摄像头角度的实现方式。此外,文章还探讨了如何使用ZLM将视频流转成mp4格式,并嵌入到Web UI中。最后,通过实际效果展示和开源代码的提供,读者可以更好地理解和应用这一综合方案。 - [智能监控燃气站:无人值守运维新时代](https://blog.dong4j.site/posts/20ab66ff.md): 本文介绍了针对燃气站设备的自动化监控解决方案。该方案通过连接IPC、NVR、门禁系统、网络交换机、UPS等设备,实现无人值守的运维模式。监控内容包括视频展示、门禁状态监测、网络运行数据收集、环境参数控制、远程重启功能以及状态数据的集中展示和云端上报。方案设计遵循简单适用、稳定安全、可扩展易维护的原则,并提供了详细的系统架构图和子系统说明。此外,还介绍了连接方式、监控系统的基础功能及监控子系统的具体实现细节。 - [揭秘基础框架:如何简化软件开发?](https://blog.dong4j.site/posts/7774f295.md): 本文介绍了什么是基础框架及其在软件开发中的重要性。它定义了框架为可重用的设计构件,并解释了为什么需要一个成熟的基础框架来提高开发效率、保证代码风格一致性以及促进团队协作。文章还讨论了基础框架与基础开发平台的区别,并详细描述了一个基础框架的架构和主要特性,包括技术选型、项目依赖管理、开发工具包、IDE 插件和技术组件。最后,文章概述了开发计划、代码规范以及技术文档的重要性。 - [从通用到垂直:企业知识库的AI赋能](https://blog.dong4j.site/posts/f3b0024e.md): 本文探讨了企业如何利用LLM和生成式人工智能构建专注于其特定领域的AI产品。由于大语言模型在处理通用问题方面表现较好,但在垂直专业领域存在知识深度和时效性不足的问题,因此需要不断将自身的知识库输入到大语言模型中进行训练。文章介绍了两种常见的方法实现:微调和提示调整。并详细说明了如何使用LLM作为用户和搜索系统沟通的介质,发挥其强大的自然语言处理能力,对用户请求进行纠错、提取关键点等预处理实现“理解”,并对输出结果在保证正确性的基础上二次加工。最后,文章推荐了Langchain-Chatchat + chatglm3-6b作为最终方案。 - [绩效考核新篇章:技术中心的绩效管理与评估方法](https://blog.dong4j.site/posts/3a683908.md): 技术中心由业务部门一和二以及开发团队、测试团队、产品团队、UI设计团队、运维团队和实施团队构成。领导层包括技术中心总负责人、技术负责人、产品负责人等。工作汇报机制从事业线到项目经理,再到总负责人形成层级。每个部门都有明确的职责范围和团队组成。开发流程包括立项、需求收集与评审、计划与排期、设计与开发、测试与验收、发布上线等多个阶段。每个阶段都有详细的产出物说明和岗位职责描述。项目管理和绩效考核体系使用维格表加NAS协作工具,设置了不同的评价指标和评价周期。 - [基于树莓派的视频推流方案](https://blog.dong4j.site/posts/530746b7.md): 本文介绍了如何使用树莓派5B和两种不同像素的摄像头(RPi Camera V2和IMX519)来实现视频推流。文章详细描述了如何配置和测试摄像头,并通过WebUI控制摄像头。此外,还探讨了多种流媒体服务器方案,包括mjpg-stream、vlc、raspivid、pistreaming、motion、fswebcam、Camkit、ffmpeg和webrtc等,并对比了它们的性能和延迟。最终,选择了MediaMTX作为媒体服务器,并提供了详细的配置和部署步骤。文章还包含了一些高级玩法和V4L2驱动的相关信息。 - [树莓派直播新选择:打造你的个人流媒体服务器](https://blog.dong4j.site/posts/5e9872c3.md): 本文介绍了一种利用树莓派和大方摄像头结合RTSP协议,通过流媒体服务器实现直播间搭建的方法。文章详细介绍了直播架构,包括推流工具如ffmpeg和OBS studio、拉流工具如ffplay和ijkplayer等,以及多种流媒体服务器的选择和部署方法。重点推荐了ZLMediaKit作为流媒体服务器,并提供了详细的安装配置步骤和API使用示例。 - [宝宝动一下就知道:如何用树莓派和小米大方摄像头构建智能监控](https://blog.dong4j.site/posts/8dc39439.md): 本文记录了作者如何利用闲置设备和小米大方摄像头,通过树莓派搭建MQ服务器,实现了对儿子的实时视频监控和动作检测。当儿子动时,系统会通过bark服务将警报推送到妈妈的手机上,从而形成一个完整的家庭监控系统闭环。文章详细介绍了固件刷写、MQ配置、树莓派安装MQ服务以及使用python编写脚本实现消息推送的步骤。 - [构建自己的公网IP服务:Nginx Proxy Manager实战](https://blog.dong4j.site/posts/1fd7702b.md): 本文介绍了如何使用Nginx和Nginx Proxy Manager(NPM)来搭建一个获取公网IP的服务,以便DDNS-GO能够使用。文章详细描述了配置步骤,包括在电信和联通网络环境下如何设置路由器端口转发、域名泛解析以及如何在NPM中配置支持获取公网IP的代理。最后总结了核心配置要点,并提供了相关参考链接。 - [业务场景全解:如何应对视频集成挑战](https://blog.dong4j.site/posts/a31e50a5.md): 本文全面介绍了视频集成解决方案,涉及监控数据流转、音视频传输协议对比、主流流媒体和播放协议、封装格式、主要视频编码、设备与连接方案、业务场景、视频接入平台选型以及流媒体服务选型等方面。文章通过多种业务场景的案例分析,展示了如何从现有方案中学习总结,以应对日益复杂的视频集成需求。此外,文章还对比了多个主流的视频接入平台和流媒体服务器,如ZLMediaKit、Monibuca、SRS、EasyDarwin等,并详细介绍了WVP平台的架构、功能以及部署方法。 - [IDEA插件开发中的国际化配置实践:轻量级ResourceBundle应用](https://blog.dong4j.site/posts/c1e0543.md): 本文介绍了如何使用Java的ResourceBundle类实现轻量级的国际化配置,适用于IDEA插件开发。作者分析了IDEA中i18n的实现方式,并创建了一个自定义的Bundle类来实现国际化和占位符替换。文章还展示了如何在项目中添加国际化配置文件和使用这些配置文件的示例代码。 - [通用的告警通知方案设计](https://blog.dong4j.site/posts/ca466aa0.md): 本文介绍了监控告警模块的功能和使用方法。该模块用于实时监控各类设备数据,通过采集、分析和处理数据,生成有价值的指标和警报信息,并向管理员发送通知,确保业务稳定运行。主要功能包括数据采集、数据分析、告警通知、告警处理、数据展示、数据管理界面等。告警规则根据业务需求设置,支持阈值告警、持续时间告警、模式告警、组合告警、定时告警和基于事件的告警规则。告警通知方式包括邮件、短信、语音电话、即时通讯工具和大屏幕展示等。告警信息处理记录可以帮助了解每个告警的处理状态和处理过程,告警历史可以查询已发生的告警信息,告警统计可以分析设备告警的出现频次,站内通知可以快速到达告警历史详情页,界面设计包括告警设置、告警列表、告警详情、告警处理、告警统计、总览界面的数据可视化分析界面等。 - [告别文档恐惧症:轻松掌握技术文档写作技巧](https://blog.dong4j.site/posts/22b8af79.md): 本文探讨了程序员为何不喜欢写技术文档以及如何写出高质量的技术文档。文章指出,项目文档的重要性在短期内被高估,长期则被低估,导致文档缺失或过时。作者分析了程序员不喜爱写文档的原因,包括缺乏写作技巧、忙碌无暇、对敏捷开发的误解等。文章强调写文档对于个人和团队的重要性,包括理清思路、便于维护交接和协作沟通。随后,文章列举了编写技术文档时应注意的问题,如工具统一、内容完整、排版规范等。最后,文章提出了如何写出好技术文档的方法论,包括5W法则、金字塔原则、从模仿开始、从小文档开始、从粗到细迭代更新等,并强调了排版和配图的重要性。 - [Maven入门指南:掌握项目管理的核心工具](https://blog.dong4j.site/posts/6c5526f1.md): 本文讨论了为何使用构件管理工具,以及为什么选择 Maven 作为项目管理工具。Maven 通过声明式配置简化项目构建过程,并提供依赖管理和生命周期管理等功能。文章还介绍了 Maven 的安装、标准的项目结构、POM 文件、坐标和依赖、仓库、生命周期等概念,并解释了如何排除全部依赖、使用 mvnd 和开发插件等内容。 - [代码审查的艺术:格式到功能的全面审视](https://blog.dong4j.site/posts/77edbced.md): 本文讨论了代码审查的重要性,包括审查者在审查他人代码时应关注的问题。文章强调了自动化工具在格式化、风格和命名等方面的作用,而人类则擅长于设计、可读性和功能性方面的审查。文章还详细说明了在代码审查中应关注的测试代码的各个方面,包括测试的存在性、与要求的相符性、未覆盖的情况以及限制记录等方面。最后,本文讨论了性能审查的重要性,并提供了关于避免常见性能陷阱的建议。 - [打造个性化 GitHub 主页:实用模板与插件推荐](https://blog.dong4j.site/posts/d8463a4b.md): 本文旨在帮助读者通过使用各种资源和工具美化他们的 GitHub 主页,从而提升个人品牌形象和项目吸引力。文章首先介绍了 GitHub 主页美化的意义和重要性,随后详细列举了多种实用工具和模板,包括数据可视化插件、动态效果添加器以及个性化主题模板等。此外,文章还提供了具体的操作步骤和技巧,指导读者如何将这些工具和模板应用到自己的 GitHub 主页上。最后,文章总结了美化 GitHub 主页的益处,并鼓励读者积极尝试和探索更多个性化装饰方案,以在开源社区中脱颖而出。 - [「Hexo」anzhiyu 主题:朋友圈部署教程](https://blog.dong4j.site/posts/f7489f5a.md): 本文详细介绍了如何部署安知鱼主题的自带朋友圈功能。过程包括创建朋友圈页面、配置主题以及部署前后端服务。前端使用Hexo和Vue.js构建,后端通过Docker容器化并使用Nginx进行反向代理和HTTPS证书配置。文章还附带了实际效果展示和官方文档链接供读者参考。 - [个性化加载动画,让你的 Hexo 博客更炫酷!](https://blog.dong4j.site/posts/a239fff8.md): 本文介绍了如何在 anzhiyu 主题下添加和自定义加载动画。文章详细描述了如何创建不同的加载动画模板(如小汽车、旋转齿轮等),并通过配置文件选择相应的样式。此外,还提供了相关的代码示例,包括 CSS 样式和 JavaScript 逻辑。最后,文章也提到了如何通过修改主题配置来切换加载动画的样式。 - [为 Hexo 添加统计功能:Docker 部署 Busuanzi 服务教程](https://blog.dong4j.site/posts/a83edbc6.md): 本文介绍了如何在本地服务器上自建 Hitokoto 服务,包括使用 Docker 部署 Busuanzi 统计功能和使用 Hexo 配置主题。文章详细讲解了配置文件和修改主题代码的步骤,以及如何通过Hexo 的三连击命令来展示效果。 - [用 Docker 部署 Hitokoto API,让你的 Hexo 主题更酷!](https://blog.dong4j.site/posts/dd32a18c.md): 本文讲述了作者如何解决Hexo主题[hexo-theme-anzhiyu]默认随机一言接口限流的问题。通过搭建自己家的服务器并使用docker-compose部署hitokoto-api,实现了在博客中使用自定义的随机一言功能。文章详细介绍了配置过程、服务部署、以及如何在Hexo中调用这一新功能。 - [Hexo 博客升级指南:集成 RSS 订阅](https://blog.dong4j.site/posts/65647068.md): 本文详细介绍了如何在 Hexo 博客中添加 RSS 订阅功能,包括插件安装、配置以及如何自定义订阅内容。 - [Spring Boot 3.3.x 脚手架重构:企业级应用实践](https://blog.dong4j.site/posts/321ba84a.md): 本文介绍了作者基于Spring Boot 2.5.x开发的一套脚手架工程,并计划基于Spring Boot 3.3.x进行重构。文章讨论了重构的原因,包括体验最新技术、解决兼容性问题、优化设想和开源项目等。同时,作者也设定了一些小目标,如使用GitHub服务、集成感兴趣的开源项目和寻找bug等。最后介绍了创建的项目和组织。 - [Hexo Theme Aurora 主题图片居中显示的解决方案](https://blog.dong4j.site/posts/c1f388ed.md): undefined - [打造智能URL切换器:让内外网访问更便捷](https://blog.dong4j.site/posts/9f1d6e11.md): 本文介绍了一款名为 URL Switcher Pro 的 Chrome 扩展,它旨在解决智能家居爱好者在内外网访问家庭服务器时遇到的困扰。这款扩展能够自动检测当前网络环境,并根据配置智能切换内外网 URL,支持批量 URL 配置管理并提供 URL 可访问性检测。文章详细阐述了其技术实现,包括 URL 匹配与切换、网络环境检测、配置同步以及国际化支持。此外,还介绍了使用方法、特色功能以及未来的发展方向。通过这款工具,用户可以高效地管理内外网访问,提升访问体验。欢迎访问 GitHub 仓库获取更多信息或参与项目开发。 - [HomeLab数据备份:打造坚实的数据安全防线](https://blog.dong4j.site/posts/6c25aa66.md): 本文详细介绍了作者的个人 Homelab 架构,包括硬件设备、网络环境、数据存储方案以及数据备份和恢复策略。文章涵盖了从树莓派到 OpenWrt 的一系列设备的备份方法,以及 Synology NAS 的多种备份功能的应用,如 Snapshot Replication、Hyper Backup 和 Active Backup for Business。此外,还讨论了使用 rsync 进行文件增量备份,以及利用阿里云盘的 WebDAV 服务进行异地备份的策略。文章最后总结了整个 Homelab 架构的备份时间表和备份流程。 - [HomeLab数据同步:构建高效的数据同步网络](https://blog.dong4j.site/posts/273b6766.md): 本文介绍了如何在 HomeLab 中高效地同步数据。主要使用了 Synology Drive 和 Syncthing 两种工具,实现了不同设备之间的文件同步和备份。Synology Drive 主要用于工作文件、配置文件的实时或按需同步,而 Syncthing 则用于在不支持 Synology Drive Client 的设备上进行文件同步。文章详细介绍了如何设置和管理这两种工具,包括配置文件同步规则、选择合适的同步方式等。最后总结了数据同步的方法和操作流程,为 HomeLab 用户提供了实用的参考。 - [HomeLab 存储与备份:数据堡垒-保障数据和隐私的存储解决方案](https://blog.dong4j.site/posts/b808f350.md): 本文深入探讨了在HomeLab中实现高效数据存储、备份和同步方案的重要性。文章介绍了3-2-1备份原则,即至少保留三份数据副本,存放在两种不同类型的媒介上,并且有一份异地备份,以确保数据的安全性和可用性。文章还详细说明了如何对数据进行分类,包括系统与配置文件、个人与家庭数据、工作与代码存储、媒体与资源以及虚拟机与容器备份等。此外,文章介绍了如何在NAS系统中实现这些备份和同步策略,并提供了一些实用的技巧和建议。 - [HomeLab 服务篇:自托管的乐趣-探索和创造个人云端世界的旅程](https://blog.dong4j.site/posts/b2341239.md): 本文介绍了如何构建一个自托管的个人云端实验室(HomeLab),通过安装和配置各种服务来实现个性化的云服务平台。文章涵盖了从硬件选择到软件部署的整个过程,包括Docker容器化技术、文件同步工具、网络监控软件等。作者分享了在个人云端实验室中使用的各类服务和应用的搭建经验,并鼓励读者一起探索和学习。 - [NAT 内网穿透详解:揭秘网络连接背后的奥秘](https://blog.dong4j.site/posts/46fb4e89.md): 本文深入探讨了NAT(网络地址转换)的起源、作用和类型,以及它在家庭和办公网络中的工作原理。文章首先介绍了IPv4地址耗尽问题,私有地址的需求,以及NAT的诞生背景。接着详细解释了NAT的作用,如缓解地址枯竭、提高安全性等。然后,文章讨论了NAT的类型,包括静态NAT、动态NAT和端口地址转换(PAT/NAT Overload)。随着IPv6的发展,NAT的角色逐渐被重新审视,但它在IPv4网络中仍然扮演着重要角色。文章最后介绍了NAPT(网络地址端口转换)的工作原理,内网穿透的实现方式,以及如何检测和提升NAT类型。 - [HomeLab 网络篇:互联世界-构建高效的自托管网络环境](https://blog.dong4j.site/posts/e537d446.md): 本文深入探讨了构建个人云端实验室(Homelab)中的家庭网络配置,涵盖了从基础的架构设计到高级的安全性和异地组网技术。文章详细阐述了如何选择合适的网络设备、部署网络覆盖、设置网络安全策略以及实现异地管理和操作。同时,还分享了实际操作的步骤和经验,帮助读者更好地理解和应用这些网络技术和概念。通过本文的探讨,读者将能够了解到如何构建一个高效、安全且可扩展的自托管网络环境,满足日常工作和学习需求,并为个人云端实验室提供一个稳固的网络基础。 - [HomeLab 硬件篇:构建基石-自托管硬件的选购与实践](https://blog.dong4j.site/posts/1c3b04a.md): 本文讨论了个人云端实验室(HomeLab)的硬件选择,包括稳定性、性价比、可扩展性和兼容性等多个关键因素。作者详细介绍了自己选择的硬件设备,例如MacBook Pro、Mac mini、ThinkStation M920x Tiny和台式组装机等,以及如何在实际操作中挑选合适的硬件组件。文章还提到了网络环境、异地组网与网络安全、使用Docker搭建的服务、数据存储方案、备份方案和数据恢复方案等多个方面,为构建一个稳定、高效的个人云端实验室提供了指导。 - [HomeLab 先导篇:入门指南-开启你的个人云端实验室之旅](https://blog.dong4j.site/posts/15433dee.md): 本文介绍了中年男人三大爱好——充电头、NAS和软路由,并分享了作者作为软件开发者搭建自己的服务器(HomeLab)的经历。文章详细描述了如何选购合适的NAS设备、软路由器以及服务器,以及在搭建过程中遇到的挑战和解决方案。同时,还探讨了为什么选择自建HomeLab的原因,包括搭建实验室的乐趣、数据安全和隐私保护的重要性。文章强调了KISS原则在HomeLab搭建中的应用,即在保证功能的前提下尽量简化系统架构。此外,还介绍了硬件成本和软件成本的考虑因素。最后,总结了整个搭建过程中的关键点和所遇到的问题及解决方案。 - [私有云时代,NAS如何帮助企业实现高效协作?](https://blog.dong4j.site/posts/f5f7afe2.md): 本文介绍了企业数据存储面临的问题及解决方案。主要问题包括数据安全性差、数据量大且难以管理、多系统平台导致数据共享困难以及员工离职导致资料丢失等。针对这些问题,提出了使用群晖NAS服务器和Backup插件作为解决方案。NAS能够实现网络中的数据有效存放和管理,满足企业集中数据中心的需求,提高办公效率,确保数据安全并降低成本。 - [掌握Hexo加密,构建更安全的个人博客](https://blog.dong4j.site/posts/4633c2df.md): 本文介绍了关于加密测试的内容。 - [KVM 虚拟机磁盘容量扩展指南:从文件到文件系统的全面解析](https://blog.dong4j.site/posts/107e2c9.md): 在这篇博客中,我们深入探讨了如何扩展 KVM 虚拟机的磁盘容量。我们首先介绍了如何扩展虚拟机的虚拟磁盘文件,然后详细讲解了如何在虚拟机内部扩展分区和文件系统。通过这个指南,您将能够有效地管理虚拟机的存储资源,确保您的虚拟机能够满足不断增长的数据需求。无论您是经验丰富的系统管理员还是虚拟化技术的初学者,这篇文章都将为您提供实用、易于理解的指导。 - [VuePress 搭建指南:从基础到部署](https://blog.dong4j.site/posts/71182928.md): 本文介绍了如何使用 Vuepress 搭建个人博客,包括安装、写作、基本配置、默认主题修改、PWA 设置以及部署上线等步骤。同时,还介绍了如何使用 vuepress-theme-reco 主题扩展功能,如分类和标签的添加、时间轴的添加、评论功能的配置、加密功能的设置、Config.js 配置以及首页配置等。最后,还说明了如何在 GitHub Pages 上部署个人站点和项目站点。 - [开源项目汇总:Spring Cloud生态圈](https://blog.dong4j.site/posts/44d3ec9b.md): 基于Spring Cloud的SaaS型微服务脚手架,支持用户管理、资源权限管理、网关统一鉴权等模块,可进行多业务系统并行开发。核心技术包括Nacos、Fegin、Ribbon、Zuul、Hystrix等。同时提供IDEA启动、jar部署、docker部署和k8s部署四种方式。 - [深入理解Spring Profiles:定制化配置的艺术](https://blog.dong4j.site/posts/278e3e03.md): 本文介绍了如何在Spring框架中利用Profile功能来管理不同环境下Bean的配置。文章首先解释了从Spring 3.1开始支持根据不同profile(如开发、测试和产品)动态加载Bean的概念。接着详细说明了如何使用`@Profile`注解将Bean绑定到特定profile,以及如何在XML配置文件中声明profile。然后讨论了几种设置和激活profile的方法,包括通过WebApplicationInitializer接口、ConfigurableEnvironment、web.xml配置、JVM参数、环境变量以及Maven Profile等。最后,文章以一个示例说明了如何在测试中使用`@ActiveProfiles`注解指定profile,并在Spring Boot环境下展示了如何使用profile-specific profiles文件来为不同环境配置不同的数据库连接信息。 - [API安全之道:深入解析认证、授权与凭证](https://blog.dong4j.site/posts/f50183c1.md): 本文讨论了互联网协议HTTP的无状态特性以及如何通过cookie、session、token等技术实现用户追踪。文章详细介绍了认证和授权的区别,并探讨了HTTP Basic Authentication、HMAC(AK/SK)认证、OAuth2等流行技术。此外,还介绍了JWT作为自包含令牌的优势及其在微服务系统中的应用。最后,文章提出了选择合适认证方式的重要性,强调了Human-to-machine (H2M) 和 Machine-to-machine (M2M) 通信的不同需求和安全关注点。 - [Java开发中遇到的一些常见问题](https://blog.dong4j.site/posts/6dc04ed2.md): 该博客讨论了在使用 Maven 管理项目时遇到的一些常见问题,包括重复依赖、配置冲突和代码不规范等。同时,还提到了一些解决这些问题的方法,例如使用父模块来管理依赖和插件,以及统一格式化风格。此外,博客还介绍了一些开发文档的最佳实践,如添加注释和使用 SLF4J 日志框架。最后,推荐了几个有用的工具和插件,包括 Markdown 工具、Chrome 插件和 Intellij IDEA 插件。 - [Spring提供的不同序列化方式大对比](https://blog.dong4j.site/posts/ea742350.md): 本文深入探讨了缓存服务组件的设计与实现,重点介绍了依赖的第三方库:Jedis、Spring Data Redis和Spring Session Data Redis。文章详细解释了ShardedJedisPool在连接Redis集群中的作用以及它与JedisPool的区别。此外,还讨论了集群环境下的Session共享机制,包括Session复制和Session粘性策略,并分析了各自的优缺点。最后,本文介绍了Spring Session如何实现基于分布式缓存的session共享机制,以及Redis过期数据的删除方式,包括定时删除、惰性删除和定期删除策略。同时,还提到了使用GenericJackson2JsonRedisSerializer替代JdkSerializationRedisSerializer的动机和潜在问题,并简要说明了JedisPool与RedisTemplate的区别。 - [JDK 从5 到 10 的新特性介绍](https://blog.dong4j.site/posts/9c7f49a2.md): Java 5 到 Java 9 的更新历史回顾,涵盖了泛型、枚举、自动拆箱装箱、可变参数、注解、增强 for 循环、静态导入、print 输出格式化、并发支持(JUC)、Arrays、Queue、线程安全 StringBuilder 等新特性。Java 10 到 Java 11 的更新历史回顾,包括本地变量类型推断、字符串加强、集合加强、Stream 加强、Optional 加强、InputStream 加强、HTTP Client API、化繁为简的命令编译运行源代码等新特性。同时,还提到了 Java 9 和 Java 11 的移除项和废弃项。 - [JetBrains IDEA插件开发:核心API与工具详解](https://blog.dong4j.site/posts/8366ec74.md): 本文介绍了IntelliJ IDEA Platform的文件操作API,包括虚拟文件系统(VFS)、文档(Document)、编辑器(Editor)和程序结构接口(PSI)。VFS用于处理各种类型的文件,提供快照功能跟踪文件修改,并与文件系统持久数据关联。文档是可编辑的Unicode序列,对应VFS中的文本内容,支持读写操作和监听更改。编辑器API提供了与IDE用户界面交互的方式。PSI是IntelliJ IDEA的核心概念之一,用于表示代码的结构,包括类、方法和属性等。Java特定的PSI操作包括查找类的继承者、重命名元素、重建虚拟文件PSI等。 - [IDEA插件开发指南(八):持久化配置与设置面板](https://blog.dong4j.site/posts/9fb70690.md): 本文介绍了如何在IDEA插件中创建设置面板并实现配置的持久化。详细描述了如何使用IDEA自带的GUI工具来设计设置面板,以及如何利用`PersistentStateComponent`来保存和恢复用户配置。 - [IDEA插件开发(七):如何创建右键菜单操作](https://blog.dong4j.site/posts/56e5b99c.md): 本文介绍了如何为IDEA插件开发添加右键菜单入口。首先,通过研究现有插件配置来找到合适的Group,然后使用XML文件定义AnAction及其属性。接下来,通过判断选中的对象是否为Markdown文件来实现功能,并获取Markdown文件的所有内容。最后,提供了关于更新版本的链接。 - [IntelliJ IDEA 插件开发攻略:Markdown 图片上传至 Aliyun OSS](https://blog.dong4j.site/posts/c9eda116.md): 开发一款插件,将 Markdown 文档中的图片上传到阿里云 OSS。功能包括解析所有图片标签、根据设置上传图片、支持图片压缩、备份已上传图片以及提供 Aliyun OSS 控制台等。 - [从基础到高级:IntelliJ IDEA 插件的四大分类](https://blog.dong4j.site/posts/50e2e964.md): IntelliJ IDEA 插件类型包括自定义语言支持、框架集成、工具集成和用户界面附加组件。这些插件提供了丰富的功能,如文件识别、语法突出显示、代码洞察、框架特有功能的直接访问、第三方工具的直接操作以及IDE界面的定制化。 - [从0到1:学习如何在IntelliJ IDEA中查看和管理插件日志](https://blog.dong4j.site/posts/5649be19.md): 本文介绍了如何在IntelliJ IDEA中查看插件开发日志。首先说明了如何找到并实时查看idea.log文件,然后提到了默认的日志级别为INFO,调试时可能需要降低日志等级以减少性能损耗。最后推荐了一款名为PsiViewer的插件来帮助理解PSI,并强调了解读官方文档的重要性。 - [使用 Gradle 快速入门 IntelliJ IDEA 插件开发](https://blog.dong4j.site/posts/ac0a5116.md): 本文介绍了使用Gradle插件开发IDEA插件的详细过程,包括配置、遇到的问题和解决方案。文章首先解释了IDEA插件开发的两种方式:直接使用IntelliJ Platform Plugin和使用Gradle,并推荐了后者。接着,文章详细介绍了如何使用Gradle创建插件项目、配置文件以及依赖等。在开发过程中遇到了两个主要问题:lombok的依赖配置和SLF4J日志框架的问题。文章提供了详细的解决方案,包括修改Gradle配置和排除高版本依赖等方法。最后,文章展示了如何注册AnAction类到plugin.xml中,并介绍了如何运行插件及其效果。总结部分指出,虽然入门很快,但开发IDEA插件的教程已经非常丰富,因此本文主要记录了开发过程中遇到的问题和经验总结,并提供了项目的GitHub地址供读者参考。 - [捋一捋 async-tool 的问题](https://blog.dong4j.site/posts/a42dfdd6.md): 本文详细描述了在使用ActiveMQ进行精准营销需求测试时遇到的问题和解决过程。主要问题包括:频繁创建和关闭ActiveMQ连接导致的性能下降,以及多线程环境下由于Spring容器重复初始化导致的JmsProducer实例化问题。文章通过分析日志、追踪代码、修改单例实现方式等方法逐步定位并解决了问题。最后,作者提出了重构代码的建议,包括规范依赖管理、配置管理和日志管理,以及如何进行有效的单元测试和集成测试。 - [Mac mini 开发环境搭建全攻略](https://blog.dong4j.site/posts/345a28fd.md): 本文详细介绍了在Mac mini上搭建开发环境的过程,包括系统设置、JDK安装、ssh配置、brew使用、zsh和oh-my-zsh的设置、IDEA、Docker、surge的安装、code命令的添加、语法高亮插件的安装和使用Powerlevel9k主题等内容。 - [Java 常用四大线程池用法以及 ThreadPoolExecutor 详解](https://blog.dong4j.site/posts/3b7cca00.md): 文章详细介绍了在Java中使用线程池的原因和优势,以及如何配置ThreadPoolExecutor。重点阐述了不同类型的线程池及其特点和用法,包括CachedThreadPool、FixedThreadPool、SingleThreadPool和ScheduledThreadPool等。文章还提供了具体的示例代码来展示如何使用这些线程池。 - [Apollo配置中心的使用心得分享:从入门到进阶](https://blog.dong4j.site/posts/a2959ba3.md): 本文介绍了携程的Apollo配置中心。Apollo是一个用于集中管理不同环境、集群和命名空间的配置的管理平台。它支持实时生效、灰度发布、版本控制、权限管理和审计日志等功能,并且提供Java和.NET的原生客户端。文章还详细介绍了Apollo的核心概念、配置获取规则以及如何与Spring集成。 - [日志编码规范:编写高效可维护的日志代码](https://blog.dong4j.site/posts/b3fe09a9.md): 本文详细探讨了现有架构日志系统中存在的问题,包括关键逻辑无日志埋点、日志级别不规范、生产环境日志配置不当等问题。针对这些问题,文章提出了一整套解决方案,包括统一使用log4j2日志框架、规范日志输出格式和路径、以及改进日志编码规范等。同时,也提供了一些具体的代码修改建议和最佳实践,旨在提高日志系统的质量和可维护性。 - [避免调试陷阱:依赖日志的编程习惯](https://blog.dong4j.site/posts/286572f8.md): 本文讨论了日志在软件开发中的重要性以及如何制定合适的日志规范。文章指出,虽然大多数公司都制定了日志规范,但实际应用效果并不理想,主要是因为缺乏有效的测试和考核机制。良好的日志输出对于快速定位问题至关重要。文章还详细介绍了不同类型的日志等级(trace, debug, info, warn, error, fatal),并提出了相应的日志记录规范,包括显式日志等级、时间精确到毫秒、修改操作必须打印日志等。此外,文章还强调了使用SLF4J API代替log4j来提高日志输出效率,以及不在循环中打印日志的最佳实践。最后,文章讨论了如何构建一个日志追踪系统来实现跨进程/跨线程的场景下的日志收集和分析。 - [SSO单点登录优化:Shiro认证过程详解与代码封装技巧](https://blog.dong4j.site/posts/205ef910.md): 本文介绍了使用Shiro框架实现用户认证的过程。首先通过封装登录逻辑为插件模块来统一处理多个模块的登录需求。接着详细讲解了Shiro认证过程的步骤,包括收集凭据信息、提交凭据消息、自定义Realm进行认证、以及认证处理和登出操作。最后说明了SimpleAuthenticationInfo的使用方法及其注意事项。 - [从零开始:lanproxy与nginx配置攻略](https://blog.dong4j.site/posts/81cae783.md): 本文详细介绍了如何搭建和使用基于阿里云服务器的proxy-server和proxy-client,以实现内网pc或服务器访问公网资源。文章步骤包括:准备环境、配置nginx反向代理、修改hosts文件、搭建proxy-server、配置proxy-server添加客户端和配置、搭建proxy-client并启动、优化nginx转发等。通过这些步骤,可以实现从公网IP的服务器安全地访问内网的pc或服务器资源。 - [动态调整日志:JMX与Zookeeper的强大组合](https://blog.dong4j.site/posts/8872e19a.md): 本文介绍了如何使用JMX和Zookeeper来实现动态修改Java应用程序的日志级别。通过实现一个MBean,并利用Zookeeper来监听节点数据变化,可以实现不重启应用的情况下修改日志级别的功能。文章中还讨论了集群环境下的挑战以及相应的解决方案,如使用Zookeeper Watcher来确保在分布式环境中日志级别更改的一致性。最后,还提到了部署时的注意事项,比如设置contextName以避免Tomcat中多个应用的记录器上下文冲突。 - [Spring AOP 动态代理深度解析:LTW 技术揭秘](https://blog.dong4j.site/posts/95aea2e1.md): 本文介绍了AspectJ LTW(加载期切面织入)的实现方式,包括静态代理和动态代理。LTW利用JVM代理在类加载期间替换字节码来实现织入。文章详细讲解了LTW的具体实现过程,包括定义切面类、编写目标测试bean、配置XML文件等步骤。同时,还分析了LTW的原理,涉及JDK的字节码转换框架和虚拟机代理技术。 - [Redis Sentinel:实现高可用性与故障转移](https://blog.dong4j.site/posts/a87e6e25.md): 文章详细介绍了使用Redis Sentinel构建高可用Redis服务的过程。首先概述了现有的高可用方案,包括Keepalived、Codis和Twemproxy等,并强调了Redis Sentinel在监控和服务恢复方面的优势。接着,文章深入讲解了Redis Sentinel的故障转移处理逻辑,包括主观下线和客观下线的概念以及定时监控任务。随后,文章详细描述了Redis Sentinel的安装与部署过程,包括配置文件、启动命令和确认关系的步骤。最后,文章讨论了不同的部署方案,如一套Sentinel监控所有主节点或每个主节点各一套Sentinel,并提供了相应的优缺点分析。此外,文章还提到了因连接数过多导致的问题,分析了原因并提供了解决方案,例如修改redis配置文件和完善代码等。 - [Java开发者的痛:如何避免和解决常见的Jar包冲突问题](https://blog.dong4j.site/posts/a65dfb13.md): 本文深入探讨了Java应用程序中的JAR包冲突问题,分析了导致这类问题的本质原因和常见表象。文章指出,JAR包冲突主要分为两类:第一类是由于依赖管理中不同版本的同名JAR包导致的;第二类则是由于多个不同JAR包中存在同名类导致的加载顺序问题。文章详细解释了Maven的仲裁机制、JAR包的加载顺序以及这些因素如何导致冲突。同时,文章还提供了针对这些问题排查和解决的策略,包括良好的依赖管理习惯和使用冲突检测插件等方法来有效避免和解决JAR包冲突问题。 - [Java代码审查:常见错误及改进指南](https://blog.dong4j.site/posts/c43d4ea4.md): 文章讨论了多个代码问题,包括重试逻辑、日志输出、空指针风险、编码风格和注释不规范等。同时,也提到了如何改进代码,如使用常量代替直接数字、优化Java字符串操作、统一日志框架和使用Maven管理依赖等。文章还涉及项目结构的问题,并展示了音乐搜索项目的模块组织结构和已重构的模块内容。 - [打造高效团队:统一编码风格的重要性](https://blog.dong4j.site/posts/a29c1a98.md): 本文介绍了以阿里巴巴开发手册为基础,结合作者工作经验,对musicsearch-project项目进行重构和规范化的方案。主要内容涉及命名规范、代码风格、IntelliJ IDEA插件配置、版本控制设置以及Maven使用等各个方面,旨在构建一个稳定、易于维护、可扩展的项目结构。 - [Redis Sentinel 搭建指南:从入门到精通](https://blog.dong4j.site/posts/70b9e46a.md): 本文详细介绍了Redis Sentinel的搭建过程及其在保证高可用性方面的作用。文章首先分析了现有架构中手动切换主节点的复杂性,接着阐述了Redis Sentinel如何通过监控、通知和应用故障转移来确保数据服务的连续性。具体部署方面,文章以一个包含1个主节点、2个从节点和3个Sentinel节点的例子,提供了详细的配置文件和启动步骤,包括针对master、slave节点以及sentinel节点的配置。最后,文章介绍了通过Jedis操作Redis的不同方式,包括单机模式、分片模式和集群模式,并讨论了在集成Jedis时可能遇到的问题及解决方案。 - [Shiro 引入后 Springboot 项目的循环依赖解决方案](https://blog.dong4j.site/posts/62ae7a01.md): 本文讨论了在使用 Spring Boot 和 Shiro 框架时遇到的依赖循环问题。文章解释了什么是依赖循环以及它如何导致项目启动错误。通过提供两种解决方案,作者展示了如何在项目中避免或解决这种循环依赖。第一种方法是在配置文件中为互相依赖的 bean 设置 lazy-init 属性,第二种方法是在代码中使用 @Lazy 注解延迟加载 bean。这些技巧有助于在开发过程中保持项目的稳定性和可维护性。 - [SSH Config 那些你所知道和不知道的事](https://blog.dong4j.site/posts/ff561974.md): SSH是一种创建在应用层和传输层基础上的安全协议,为计算机上的Shell提供安全的传输和使用环境。它能够有效防止远程管理过程中的信息泄露问题,并通过加密传输数据、防止DNS欺骗和IP欺骗来保证安全性。本文主要介绍了SSH的相关使用技巧,包括配置文件的使用、管理多组密钥对、vim访问远程文件、远程服务当本地用、多连接共享、禁用密码登录、关键词登录以及代理登录等。 - [内存优化实战:从数据结构选择到GC策略](https://blog.dong4j.site/posts/b2f99cee.md): 本文对比了在使用 BloomFilter 和 DataCache 存储黑白名单前后的内存优化效果。通过减少临时变量和使用布隆过滤器,显著降低了程序的内存消耗和运行时间。 - [如何实现优雅的重试机制?两种方式大比拼!](https://blog.dong4j.site/posts/2c5b3e3a.md): 本文讨论了解决方案演化过程中的重试问题,分析了简单重试模式和策略重试模式存在的问题,并提出了基于代理设计模式和开源工具Spring-retry的优雅重试方案。文章详细介绍了使用命令设计模式和Spring-retry实现正常逻辑和重试逻辑解耦的方法,以及Guava-retryer工具的优势和应用场景。最后总结了优雅重试方案的共性和原理,强调了解耦、重试策略、线程安全等特点的重要性。 - [定制你的Spring Boot:探索maven-assembly-plugin](https://blog.dong4j.site/posts/d16c10eb.md): 本文探讨了SpringBoot项目的打包和部署方式。文章首先介绍了SpringBoot默认的两种打包方式:直接打成jar包或war包,并分析了它们的缺点。接着,作者提出了自己的目标,即打包成类似于Tomcat或Maven的软件包结构,包含bin、boot、lib、conf等目录。为了实现这一目标,作者使用了maven-jar-plugin和maven-assembly-plugin插件进行自定义打包配置。文章详细描述了pom.xml中的配置以及assembly.xml文件的具体内容,包括如何指定程序入口类、依赖包路径、配置文件位置等。此外,文章还介绍了如何将依赖lib从项目分离出来,并提供了半自动化和全自动化的部署步骤。 - [Java打包进化论:Maven Jar的多种打包方式大揭秘](https://blog.dong4j.site/posts/79fceeeb.md): 本文探讨了使用 Maven 打包 Java 程序的不同方法。首先介绍了如何在不包含依赖的情况下打包程序,然后讨论了如何通过 Maven Assembly Plugin 将依赖打包进 jar 文件中,但这种方式会打上所有依赖,可能不适用于需要纯净 jar 的情况。接着介绍了另一种打包方式,即将项目相关文件打包成一个 zip 包,方便发布和部署。最后,本文还比较了几种打包方式,建议根据不同需求选择合适的打包方式。 - [IntelliJ IDEA Git操作指南:轻松管理代码分支与合并](https://blog.dong4j.site/posts/22c0ef08.md): 本文介绍了在IntelliJ IDEA中操作Git的具体步骤。首先,描述了在一个名为git-branch-test的GitLab项目中的工作流程,特别是如何处理master分支和新功能的开发。接着详细说明了如何在IDEA中设置任务、获取token登录GitLab、新建分支并开始新功能开发。文章还展示了当遇到紧急问题时如何进行问题修复和代码合并的操作,包括创建临时分支、修复问题后合并到master分支以及继续其他工作。最后,介绍了如何完成新功能的开发,并最终将其合并回master分支。 - [IDEA插件推荐:Markdown Image Kit,让你的文档配图更简单!](https://blog.dong4j.site/posts/d03a684c.md): Markdown Image Kit 是一款在 IntelliJ IDEA 中方便高效管理 Markdown 文档图片的插件。它支持一键上传当前文档所有引用图片后自动替换、多个图床选择、图片直接压缩等功能,并提供详细的设置选项来满足用户的不同需求。 - [apidoc基础教程:从零开始编写API文档](https://blog.dong4j.site/posts/b0674c16.md): 本文介绍了如何使用 @api 标记来生成 API 文档。文章详细讲解了各种标记的功能,包括描述请求方法、路径、错误信息、权限等。同时,还介绍了如何定义全局的 header 描述和使用 apiSampleRequest 来显示接口调用相关部分。 - [日志追踪系统详解:从自动埋点到动态修改级别](https://blog.dong4j.site/posts/9cba1244.md): 本文介绍了如何通过扩展 dubbo Filter 拦截 RPC 请求,将 SnowFlake 算法生成的全局唯一 traceId 存入 RpcContext 中传递给下一个服务。文章还讲解了接入追踪系统的过程,包括 Dubbo 追踪接入、http 追踪接入和自动埋点方法。此外,还详细解释了实现原理,如自动埋点的代码织入方式、调用链日志的扩展 Filter 和 traceId 的传递过程。最后,介绍了传输日志到 Kafka 和使用 JMX 实现动态修改日志级别的具体实现。 - [声网Agora SDK集成教程:Java客户端API详解](https://blog.dong4j.site/posts/7ef4d1ad.md): 声网主要提供实时互动基础能力和扩展能力,以及低代码应用平台。其产品解决低延迟、高可靠性的实时互动需求,支持海量用户同时在线,保障数据安全。业务场景包括手机端和PC端的语音聊天,支持呼叫功能、群组管理等。声网客户端API涵盖账号消息系统和频道系统,提供登录、发送消息、加入/离开频道等功能。SDK集成示例涵盖Android、Web、iOS平台。 - [声网集成:掌握App ID、Dynamic Key和UID,打造安全通话环境](https://blog.dong4j.site/posts/d8c7081e.md): 本文详细介绍了声网(Agora)集成中的关键概念,包括App ID、Dynamic Key、App Certificate、Channel、UID以及信令和通信流程。强调了在安全要求不高的场景下使用App ID,以及在正式上线运营时采用Dynamic Key的重要性。此外,还说明了频道名称(channel)、频道密钥(channel key)的作用,以及如何在同一频道中唯一标识用户(UID)。最后,详细描述了Agora平台上的呼叫建立和发起流程,包括信令服务器与用户的交互、频道的加入和退出,以及在通话中的音视频流控制。 - [轻松搞定Maven多环境配置:实战技巧大放送](https://blog.dong4j.site/posts/53d86ec9.md): 本文详细介绍了如何使用 Maven 的 profiles 和 filter 功能来实现多环境配置打包。文章首先展示了如何定义不同的 profile,包括本地开发、测试和生产环境的配置。接着说明了如何在 build 阶段添加 filters,以便根据不同的环境来替换资源文件中的占位符。此外,还解释了如何使用命令行参数来激活特定的 profile 进行打包。最后,文章探讨了 Spring 中使用 元素来加载和注入属性文件的机制,并给出了多个配置文件的加载方法。 - [提高开发效率,提升代码质量:CheckStyle的实战应用](https://blog.dong4j.site/posts/e5eb73b9.md): 本文介绍了如何根据阿里巴巴的开发规范配置IntelliJ IDEA开发环境,以实现代码风格检查。文章详细讲解了如何使用Google-code-checks.xml文件和CheckStyle插件来控制命名规则、格式规约和注释规范,以提高代码质量和可维护性。 - [走进Python核心:揭秘元类和类的创建过程](https://blog.dong4j.site/posts/8f42e00b.md): 本文深入探讨了Python面向对象编程的高级概念,包括类的成员、成员修饰符以及特殊成员。文章详细介绍了字段(普通和静态)、方法和属性(基本使用、定义方式和两种定义方式),并阐述了私有成员与公有成员的区别及其访问限制。此外,还讲述了类描述信息(doc)、模块和类表示、构造方法(init)和析构方法(del)、对象调用方法(call)、类的所有成员(dict)、对象的字符串表示(str)、索引操作(getitem, setitem, delitem)、分片操作(getslice, setslice, delslice)、迭代器功能(iter),以及类的创建方式(普通方式和特殊方式)。最后,文章讨论了类是如何由type类的构造函数实例化产生的,并介绍了metaclass的概念及其作用。 - [Python OOP 入门:轻松掌握封装、继承和多态](https://blog.dong4j.site/posts/b158ae75.md): 本文介绍了Python面向对象编程的基础知识,包括类和对象的创建、封装、继承和多态等概念。通过示例代码展示了如何在Python中实现面向对象编程,并对比了函数式编程和面向对象编程的应用场景。文章还讨论了经典类和新式类的差异以及多态的概念。 - [日志追踪系统设计:构建高效监控系统](https://blog.dong4j.site/posts/747eedc9.md): 本文探讨了基于Dubbo Filter的日志追溯系统的设计,旨在解决线上系统运行状态的监控、问题快速定位、系统瓶颈发现、潜在风险预警和产品价值挖掘等问题。文章详细介绍了日志的分类(诊断、统计、审计、业务)、分布式日志系统的设计,包括日志采集器、处理器、存储和搜索方式、关联业务Id以及日志展示系统和监控报警机制。此外,还讨论了日志系统优化和最佳实践,如打印日志的最佳时机、日志级别设置、日志数量和大小控制、日志切割方式和格式配置等。 - [掌握MDC,Java日志追踪新高度](https://blog.dong4j.site/posts/36b6823d.md): MDC 是 log4j 和 logback 提供的方便在多线程条件下记录日志的工具。它允许开发者在多线程环境下跟踪用户的会话,通过将用户信息存储在当前线程绑定的哈希表中来实现。这种方法的优点是可以避免在每个使用日志记录器的类中都访问到用户相关信息,使得日志格式一致并便于后续分析。文章提供了 MDC 使用案例、所需依赖、log4j.xml 配置样例和日志打印类的实现代码,以及一个简单的测试示例。 - [zheng 框架解析 (二):从环境搭建到部署实战](https://blog.dong4j.site/posts/ffbf019e.md): 本文介绍了在使用Dubbo框架时遇到的一个问题,即消费者向提供者发送统计数据时出现错误。分析了问题的原因,并提供了两种解决方案:部署dubbo-monitor和修改配置文件以不使用monitor。同时,还详细介绍了项目环境的搭建过程,包括Vagrant环境搭建、Redis配置、Nginx配置、Zookeeper单机配置、ActiveMQ默认配置以及Tomcat单机多实例配置等。最后,描述了项目的打包、上传和启动流程。 - [深入解析Zheng框架:搭建与部署实战指南](https://blog.dong4j.site/posts/508e9afc.md): 本文详细介绍了在MacOS 10.12.6系统上使用IntelliJ IDEA、Maven、Dubbo、Zookeeper、Nginx、ActiveMQ、MySQL、Redis等工具和框架搭建环境的过程。文章首先回顾了依赖环境的搭建,然后重点讲解了项目结构的导入、数据库的配置(包括解决MySQL默认值不兼容问题)、配置文件的修改以及Nginx的配置。最后介绍了如何启动服务并简要提到了使用Vagrant或Docker来搭建环境的方法。 - [Google Dapper:揭秘分布式跟踪系统的秘密](https://blog.dong4j.site/posts/a69881a6.md): Dapper 是一个 Google 生产环境下的分布式跟踪系统,用于收集和呈现复杂分布式系统的行为信息。它通过低损耗、应用透明和大范围部署满足需求。Dapper 设计之初参考了 Magpie 和 X-Trace 等分布式系统的理念,并通过采样率的使用和代码植入限制在一小部分公共库的改造上实现了成功应用。本文介绍了 Dapper 的构建和部署过程,包括使用 Dapper 搭建的分析工具、在 Google 内部使用的统计数据和使用场景等,并讨论了从 Dapper 收获的经验和教训。 - [IntelliJ IDEA 翻译插件开发 - 从概念到实践](https://blog.dong4j.site/posts/d2f9713d.md): 本文介绍了在IntelliJ IDEA中使用Gradle开发插件项目时遇到的问题,并提供了解决方案。文章首先解释了为什么使用Gradle创建的项目缺少图形化界面功能,然后通过修改`.iml`文件将项目类型更改为Plugin Module,解决了依赖和插件配置问题。接着,文章详细介绍了如何使用GUI创建Action,以及如何调用有道翻译API进行文本翻译。最后,总结了插件开发中常用的API和方法。 - [掌握IntelliJ插件开发:从Gradle入门到高级实战](https://blog.dong4j.site/posts/7dc8ea5f.md): 本文记录了使用Gradle开发IntelliJ IDEA插件的入门过程,包括创建插件项目、设置build.gradle文件、添加plugin.xml等步骤。文章还分享了遇到的问题及解决方案,如Gradle路径设置和Gradle IntelliJ依赖的下载方法。 - [ZooKeeper配置中心:简化你的开发部署过程](https://blog.dong4j.site/posts/ffa1ef45.md): 本文介绍了一个基于Zookeeper实现的配置中心,旨在解决现有架构中的配置分散、不安全、不一致等问题。通过使用Zookeeper作为配置存储方案,实现了简单、可靠和实时配置更新。配置分类包括单次读取型、多次读取型和动态读取型,并设计了相应的系统架构和模块说明。文章还讨论了技术选型、开发配置管理解决方案以及Dev Test Prod环境部署解决方案。最后,列出了待办事项清单。 - [Redis集成攻略:从Jedis到ShardedJedisPool](https://blog.dong4j.site/posts/4fa65dbc.md): 本文详细介绍了Redis的不同集成方式,包括Jedis、Spring Data Redis和Spring Session Data Redis。文章还解释了如何使用ShardedJedisPool连接Redis集群,并探讨了Session共享机制,包括Session复制和Session粘性。此外,文章还讨论了Redis过期数据的删除策略,如定时删除、惰性删除和定期删除,以及如何在Spring中实现这些策略。最后,文章比较了jedisPool与RedisTemplate的区别,并介绍了Spring提供的不同序列化方式的区别。 - [RESTEasy入门:JAX-RS实践指南](https://blog.dong4j.site/posts/9659e30c.md): RESTEasy是一个由JBoss提供的开源项目,用于构建RESTful Web Services和Java应用程序。它完全遵循JAX-RS规范并通过了JCP认证。RESTEasy支持与多种框架集成,如EJB、Seam、Guice、Spring等,并提供自动实现GZIP解压缩的功能。JAX-RS是一个Java API,用于创建RESTful Web Services。它使用Java SE 5的注释来简化Web服务的开发和部署,并提供了各种注解来定义资源类和方法,如@Path、@GET、@PUT、@POST等。 - [Spring生态下的Logback:实现结构化日志的秘诀](https://blog.dong4j.site/posts/b6d58107.md): 本文介绍了logback的使用和自定义输出格式的配置方法。首先讲述了logback相较于log4j的优势,并提供了如何在项目中配置logback的示例代码,包括依赖添加、配置文件创建等步骤。接着详细解释了日志格式中各个参数的含义及其作用,并通过实例展示了如何输出SQL语句。最后,文章介绍了如何通过重写ClassicConverter和PatternLayout类来实现自定义日志格式,以满足graylog这样的日志收集工具的需求。通过修改配置文件中的layout属性,实现了将日志以JSON格式输出的功能。 - [告别keys *,掌握Redis scan系列命令的精髓](https://blog.dong4j.site/posts/958ae77b.md): 本文介绍了Redis数据库中用于查找键的命令:scan、sscan、hscan和zscan。这些命令分别用于迭代所有键、集合键、哈希键和有序集合键,通过游标cursor进行分页查询。通过MATCH参数可以进行模糊匹配,通过COUNT参数可以控制每批返回的数量,而TYPE参数则可以根据数据类型来指定查询的类型。文章还提供了具体的命令示例,展示了如何在Redis中利用这些命令进行键的查找和筛选。 - [原型模式揭秘:从Linux命令scp到设计模式的实践应用](https://blog.dong4j.site/posts/91ad9ce3.md): 本文介绍了Linux命令scp的使用方法,解释了其在加密方式下进行远程文件复制的功能。文中还讨论了scp与cp的对比,scp在传输过程中是加密的且不占太多系统资源。接着,文章详细讲解了原型模式的概念和应用,包括它的UML图示和两种实现方法。最后,给出了具体的Java代码示例来展示如何使用原型模式创建对象。 - [Java编程进阶:单例模式与反射挑战](https://blog.dong4j.site/posts/f1601c3e.md): 本文介绍了Linux命令less的功能和使用方法,包括翻页、搜索等操作。接着,通过一个抽象工厂模式练习的实例,详细讲解了如何设计支持多手机操作系统平台的游戏软件。最后,讨论了单例模式的几种实现方式,以及防止反射、反序列化和克隆破坏的方法。 - [抽象工厂模式:构建灵活的软件系统](https://blog.dong4j.site/posts/9b7d6e62.md): 本文介绍了Linux中的more命令,这是一个基于vi编辑器的文本过滤器,用于按页显示文本文件内容。文章还回顾了工厂方法模式,并讨论了其优缺点和适用场景。最后,深入讲解了抽象工厂模式,通过一个界面皮肤库的案例,展示了如何使用抽象工厂模式来创建一系列相关或相互依赖的对象,并提供了相应的代码实现。 - [开闭原则的实践:工厂方法模式的案例解析](https://blog.dong4j.site/posts/8ec7c960.md): 本文介绍了Linux中的cat命令及其参数,以及简单工厂模式在Java中的应用。首先解释了cat命令的功能和用法,包括编号行、处理空白行等选项。接着详细讨论了简单工厂模式的优缺点和关键代码实现,并通过一个绘图工具的例子展示了其实际应用。随后,文章转入了工厂方法模式的概念介绍,分析了其如何解决简单工厂模式的扩展性问题,并给出了具体的案例和代码示例,以及通过配置文件来动态选择日志记录方式的实践。最后,总结了工厂方法的优点、缺点和适用场景。 - [掌握设计模式精髓:五大核心原则深度解析](https://blog.dong4j.site/posts/7244523f.md): 本文讨论了软件开发中的六个重要原则,包括单一职责原则、开闭原则、里氏替换原则、依赖倒转原则、接口隔离原则和合成复用原则。每个原则都提供了定义、作用以及实际代码示例来展示如何应用这些原则。文章还讨论了迪米特法则作为降低软件实体之间耦合度的一种方法。通过遵循这些设计原则,开发者可以构建出更加灵活、可扩展且易于维护的系统。 - [从零到一,掌握Java简单工厂模式](https://blog.dong4j.site/posts/6b3bea20.md): 本文介绍了Linux中的ls命令及其各种选项,包括显示所有文件、目录、隐藏文件等。随后,文章通过一个简单的计算器示例,展示了如何使用简单工厂模式来降低代码的冗余和耦合度,提高系统的灵活性和可维护性。最后,文章总结了简单工厂模式的优缺点,并提供了相关的引用链接。 - [使用 validate API 验证 Elasticsearch 查询语句的合法性与解释](https://blog.dong4j.site/posts/f20ffdb.md): 验证查询语句是否合法是复杂的任务,特别是与不同的分析器和字段映射相结合后。Elasticsearch 提供了一个 validate API 来检查查询语句的合法性,并提供具体的错误信息。通过 explain 参数可以获取更详细的解释,包括每个索引的处理方式和执行过程。这有助于理解查询语句在 Elasticsearch 中的执行方式以及如何根据不同索引的映射和分析器进行优化。 - [掌握Elasticsearch,从理解查询和过滤开始](https://blog.dong4j.site/posts/f56310d4.md): 本文介绍了如何在ElasticSearch API中使用查询语句和过滤语句。文章首先说明了如何创建查询或过滤的上下文关系,然后展示了如何在查询语句中加入过滤子句以及如何在过滤语句中使用查询子句。最后,文章提醒读者,在过滤中很少会使用到查询,只有在需要全文本匹配时才会采用这种结构。 - [Elasticsearch进阶:高效的过滤条件与精确查询](https://blog.dong4j.site/posts/8b9030ff.md): 本文详细介绍了Elasticsearch的查询过滤方法。包括term过滤、terms过滤、range过滤、exists和missing过滤以及bool过滤等。此外,还解释了match_all查询、match查询和multi_match查询的基本用法。 - [关系型数据库与Elasticsearch对比:索引、类型和文档解析](https://blog.dong4j.site/posts/24a1ab9d.md): 本文对比了关系型数据库和Elasticsearch(ES)的结构和工作方式。关系型数据库以表格形式存储数据,而ES使用倒排索引来加速搜索。文章介绍了如何创建、删除和查询ES中的文档,以及多索引和多类型搜索的用法。还提到了深度分页问题和查询方式的说明。 - [Java 基础:一些常用的代码片段四](https://blog.dong4j.site/posts/1553cb8c.md): 本文讨论了Java中排序和事务管理的两种重要技术:外部排序(使用Comparator)和内部排序(实现Comparable接口),以及JDBC中的事务管理。外部排序提供灵活的排序方式,而内部排序保持了类的一致性。事务管理确保数据库操作要么全部完成要么全部不执行,对于保持数据一致性至关重要。 - [Java 基础:一些常用代码片段三](https://blog.dong4j.site/posts/5981a792.md): 本文介绍了Java中动态获取加载的JAR包位置的工具方法`ClassLocationUtils.where(cls)`。此外,还探讨了三种实现定时任务的方法:使用普通Thread、java.util.Timer和java.util.concurrent.ScheduledExecutorService。文章还涉及了去除字符串拼接时的最后一个多余逗号、将List对象转换为带分隔符的字符串、利用反射机制根据完整类名获取类对象、多条件排序ArrayList以及遍历Map对象的几种方法。此外,还介绍了使用`SimpleDateFormat`进行日期和字符串转换的方法,Math类的常用方法,单例模式的实现方式及其注意事项。 - [Java基础:一些常用代码片二](https://blog.dong4j.site/posts/1bdd319f.md): 本文介绍了Java开发中的字符串拼接、集合处理、GC日志查看、字节码分析、国际化处理以及性能比较等技术。文章详细解释了使用Apache Commons Lang和Google Guava进行字符串拼接的方法,如何获取集合中的元素,以及查看GC日志和字节码信息。此外,还讨论了集合操作的并集、交集和差集等,以及通过枚举属性行获取枚举实例的代码示例。国际化处理方面,介绍了使用.properties文件实现国际化的方法。最后,文章对比了`switch-case`结构和`if-else`语句的性能差异,以及如何使用Java反射机制来获取注解信息。还提供了阅读文件内容、打印GC详情、移除字符串中的所有空格等实用方法的示例代码。 - [Java 基础:一些常见的代码片段一](https://blog.dong4j.site/posts/205d1f36.md): 本文详细介绍了多种Java编程技术及其相关知识点,包括面向切面编程(AOP)、使用Jackson进行泛型反序列化、单次执行逻辑的实现方法以及防止主线程退出等。文章还提供了代码片段展示、解释与注意事项,并分享了最佳实践。涉及到的技术还包括分割字符串为迭代器、SLF4J占位符格式化、防止Java主线程退出、BeanDefinitionRegistryPostProcessor的应用、instanceof和isInstance的区别、Dubbo百分数与Double互转、Lombok注解详解、Optional类的使用、Spring读取Classpath下的文件以及BigDecimal的基本操作。 - [探索 Java 8 Stream API:从排序到过滤的全面指南](https://blog.dong4j.site/posts/845cfa4f.md): 本文深入探讨了Java 8 Stream API的强大功能,涵盖了将List转换为Map、列表排序、过滤和Map的条件操作等多个方面。文章详细介绍了如何利用Lambda表达式简化代码,并提供了多个示例来展示Stream API在数据处理中的实际应用。此外,还讨论了性能考虑、空值检查以及并行流的使用等注意事项,为开发者提供了实用的指导。 - [Zookeeper 概述:核心概念与应用场景](https://blog.dong4j.site/posts/5f2cc770.md): Zookeeper 是 Google Chubby 开源实现的一个分布式协调服务,提供组管理、配置、同步和命名服务等。它支持多种节点类型,如持久、短暂、顺序和非顺序节点,并提供Watcher机制来监听节点变化。此外,Zookeeper 还应用于分布式配置管理、高可用集群、队列和锁等场景。 - [Python自动化脚本:公司WiFi监控与邮件通知](https://blog.dong4j.site/posts/958f9ffe.md): 该博客文章介绍了一个基于Python编写的脚本,用于检测用户当前连接的Wi-Fi网络。根据不同的Wi-Fi环境(如公司或家里),脚本会执行不同的操作:如果连接到公司的Wi-Fi且时间超过6点10分,则向指定邮箱发送邮件告知对方需要加班;如果连接到家里的Wi-Fi并连接了外接显示器但未开启CatchMouse软件,则会启动该软件。此外,文章还提到了GitHub上的开源软件Moon,以及一个关于自动化任务的博客文章。 - [自定义SSH密钥,高效管理多个GitHub和GitLab账户](https://blog.dong4j.site/posts/32516dfc.md): 本文记录了在拥有两个GitHub账号和公司GitLab账号时遇到的权限错误问题,并提供了详细的解决方案。首先介绍了由于使用相同默认公钥导致的权限错误情况,然后指导如何为不同的账号生成独立的密钥对,并通过SSH配置文件区分不同用户的连接。接着展示了如何在SSH配置中添加GitLab服务器的连接信息,最后通过一系列的Git操作来测试设置的正确性。 - [JVM内部机制大揭秘:Java类加载全过程](https://blog.dong4j.site/posts/cd5f7bae.md): 本文介绍了Java程序中的类加载机制,包括类的初始加载、类加载器的类型及其功能、JVM类加载机制和自定义类加载器。还详细描述了类的链接和初始化过程,以及类初始化的时机。 - [掌握 Java 并发精髓 - 理解JMM与Happens-before原则](https://blog.dong4j.site/posts/4d06da5c.md): 本文介绍了Java内存模型的三大核心:原子性、可见性和顺序性。Java采用共享内存模型,线程间通过JMM隐式通信。JMM控制线程与主内存之间的交互,确保变量写入对其他线程可见。编译器和处理器重排序可能导致内存可见性问题,JMM提供编译器重排序规则和处理器重排序规则来保证内存可见性。happens-before规则用于阐述操作间的内存可见性,简化了程序员的开发过程。 - [同步与异步的较量:如何在Spring Boot中优化执行效率](https://blog.dong4j.site/posts/603b8025.md): 本文介绍了同步调用和异步调用的概念以及如何在Spring Boot中使用`@Async`注解来实现异步调用。文章首先定义了一个Task类,其中包含三个操作函数,并模拟了这三个操作的执行时间。然后通过单元测试展示了同步调用的效率问题。接着,文章演示了如何通过添加`@Async`注解使这些操作变为异步执行,并通过配置@EnableAsync来启用异步支持。最后,文章介绍了如何使用Future对象来判断异步任务是否完成,并通过计算总耗时来展示异步调用的优势。 - [SpringBoot 退出服务时调用自定义销毁方法的两种方式](https://blog.dong4j.site/posts/442823ed.md): 本文介绍了在SpringBoot应用中如何在工作容器退出时执行特定操作的方法,包括通过实现DisposableBean接口和使用@PreDestroy注解两种方式。并通过代码示例展示了这两种方法的具体使用。文章还提供了关于如何在命令行启动并正确地终止应用的技巧。 - [基于Token的RESTful API,Spring Security入门](https://blog.dong4j.site/posts/31d0a22c.md): 本文探讨了两种常见的 API 认证模型:基于 Session 和基于 Token 的安全机制。首先介绍了如何在多服务器集群环境中使用 Redis 外置 Session 来避免用户信息丢失的问题。接着详细阐述了如何利用 Spring Security 实现 RESTful API 的Token认证,包括过滤器、预认证和权限 Endpoint 的配置。最后,讨论了前后端分离架构下的鉴权问题,以及通过 nginx 反向代理和 SSO 组件来保护未授权资源的方法。总结了通过基础设施配置实现安全性的重要性,强调了组件独立性对优化和问题定位的便利性。 - [Java 程序员必学:classpath 文件读取技巧](https://blog.dong4j.site/posts/a5564900.md): 本文讲述了在Java程序中从classpath下读取文件的方法。作者首先介绍了使用ClassLoader的getResource方法来获取文件资源,然后讨论了如何在Maven项目中配置编译器插件来处理特定类型的文件,例如MyBatis框架中的mapper XML文件。文章还提供了示例代码,展示了如何通过不同的方式访问classpath下的资源文件。 - [Java并发利器:ThreadPoolExecutor 高效使用指南](https://blog.dong4j.site/posts/f1e67b7e.md): 本文讨论了Java中线程池的使用,特别是在处理大量短时间请求时的优势。文章首先说明了使用线程池可以减少线程创建和销毁的性能开销,并提供了Executor和ThreadPoolExecutor接口的相关信息。接着详细介绍了ThreadPoolExecutor的构造方法和相关参数,包括核心线程数、最大线程数、任务队列等。最后,通过一系列的验证实例演示了如何根据不同配置来管理线程池中的线程数量和任务执行规则。 - [Java线程池深度解析:四种创建方式详解](https://blog.dong4j.site/posts/c7d0ca57.md): Java通过Executors提供四种线程池,分别是可缓存、定长、定时和单线程化的线程池。这些线程池具有重用线程、控制最大并发数、支持定时任务等优势。可缓存线程池能够灵活回收空闲线程或新建线程;定长线程池可以限制最大并发数并让超出数量的任务在队列中等待;定时线程池支持定时及周期性任务的执行;单线程化的线程池保证所有任务按指定顺序执行,但仅存在一个工作线程。 - [掌握Java GC:深入理解并高效配置GC参数](https://blog.dong4j.site/posts/29d7a15f.md): 本文介绍了Java中的垃圾收集器(GC)的基本概念和不同的回收算法。包括引用计数、标记清除、标记压缩和复制算法等。文章详细解释了这些算法的工作原理以及适用的场景,如新生代和老年代的GC策略。此外,还讨论了可触及性定义、Stop-The-World现象及其影响,以及不同收集器的优缺点和参数配置方式。最后提供了使用示例来帮助理解finalize方法的使用和可能的问题。 - [volatile 知识点汇总:掌握并发编程利器](https://blog.dong4j.site/posts/8705625e.md): volatile关键字在Java编程中的作用有两个主要方面:确保内存可见性和阻止指令重排。它通过每次访问变量时都读取变量的最新值来保证线程间的数据一致性,并且不允许编译器对涉及volatile变量的指令进行重排序,以保持操作的顺序性。尽管volatile保证了数据的可见性和一定的有序性,但它并不能保证原子性,因此对于需要确保完整性的操作(如i++),仍然需要额外的同步机制。 - [掌握Java同步机制:生产者消费者模式实战](https://blog.dong4j.site/posts/d3a1d32e.md): 生产者消费者问题是多线程编程中的经典问题,描述了一个缓冲区作为仓库,生产者将产品放入仓库,消费者从仓库中取走产品。解决该问题的方法有同步机制和管道两种方式。Java语言提供了wait()/notify()、await()/signal()、BlockingQueue、Semaphore和PipedInputStream/PipedOutputStream等方法支持同步。其中,wait()/notify()和await()/signal()需要配合synchronized或Lock使用,而BlockingQueue、Semaphore和PipedInputStream/PipedOutputStream则可以直接使用。 - [Java 多线程入门:从概念到实战](https://blog.dong4j.site/posts/71aa5641.md): 本文介绍了Java中多线程的基本概念和操作。包括线程状态转换(新建、可运行、运行、阻塞、死亡)、如何创建线程(使用Thread类或实现Runnable接口)、终止线程的方法(不建议使用stop方法,推荐使用中断机制)、挂起和继续执行线程的方法(已弃用)、join和yield方法的使用场景、守护线程的概念以及线程优先级和基本的同步操作。文章还详细解释了synchronized关键字的三种加锁方式和wait、notify的用法。 - [Java内存管理:方法区与常量池](https://blog.dong4j.site/posts/42f151c0.md): 本文详细介绍了 Java 内存模型中的方法区和运行时常量池。方法区存储类信息、静态变量和方法,而运行时常量池则用于存储符号引用和直接引用。自 JDK7 开始,HotSpot 虚拟机移除了永久代,引入了元空间(Meatspace),这导致了内存管理方式的改变,并对某些字符串操作产生了影响。 - [深入浅出Java并发基础:从概念到实践](https://blog.dong4j.site/posts/ef65c071.md): 本文介绍了几种并发概念,包括同步和异步、并发和并行、临界区、阻塞和非阻塞、死锁、饥饿和活锁等。同时,还讨论了并行的不同级别,如阻塞、非阻塞、无障碍阻塞和无等待等,最后以读-写场景为例说明了无等待的案例。 - [从零开始:Tmux会话管理实战](https://blog.dong4j.site/posts/88c12565.md): 本文详细介绍了 tmux 的基本操作和使用技巧,包括安装配置、常用命令以及插件等内容,帮助读者更高效地使用终端。tmux 是一个终端复用软件,可以合并多个终端窗口,提高工作效率。文章提供了详细的安装步骤和常见命令解释,并介绍了 tpm 插件管理器和其他实用插件如 copycat 和 tree。通过学习本文,读者能够更好地理解和应用 tmux,提升工作效率。 - [掌握 Homebrew,轻松管理你的软件包](https://blog.dong4j.site/posts/711ab194.md): 本文详细介绍了Homebrew的功能和用途,解释了为什么选择Homebrew作为软件包管理器,以及与Fink和MacPorts的比较。文章还提供了Homebrew的安装步骤、基本使用方法,包括更新、搜索、安装、升级和删除软件等操作。此外,还介绍了一些高级用法,如服务管理和出错处理。最后总结Homebrew的优点,并提醒用户访问官方网站获取最新信息。 - [macOS 上使用 IDEA 搭建 SSM 项目](https://blog.dong4j.site/posts/23cbb67c.md): 本文详细介绍了使用Spring+Spring MVC+Hibernate等技术栈搭建项目的过程。首先讲解了在IntelliJ IDEA中新建项目的步骤,包括创建项目视图、配置文件和结构等。然后介绍了项目中各层包的功能,如controller、dao、domain、dto、qo、rowmapper、schedulejob和服务等。接着,文章重点讲解了Dao层代码中对适配器设计模式的应用,以及HibernateTemplateDao类的实现细节。最后,文章还介绍了如何配置Tomcat服务器并部署项目。 - [使用Axios拦截器统一处理HTTP请求和响应](https://blog.dong4j.site/posts/d9e151a4.md): 该博客介绍了如何使用axios的拦截器来统一处理所有HTTP请求和响应。文章首先解释了设置拦截器的目的,然后详细展示了如何在项目中引入axios以及element-ui框架中的loading和message组件。接着,作者演示了如何配置http请求和响应的拦截器,包括添加token到请求头、超时处理以及错误信息的显示。最后,博客提供了完整的代码示例,便于开发者参考和使用。 - [掌握Sublime Text高效快捷键,提升编程效率](https://blog.dong4j.site/posts/350ed0bd.md): 本文介绍了Sublime Text文本编辑器的一些常用快捷键,包括基本操作、查找与替换、编辑与格式化等。文中还列出了具体的命令列表和页面操作、复制粘贴与删除等快捷键的具体功能。 - [系统级操作与第三方软件:macOS 快捷键全解](https://blog.dong4j.site/posts/6dad3a8f.md): 本文详细介绍了macOS系统中常用的快捷键及其应用场景。包括系统级快捷键、第三方软件快捷键等,旨在帮助用户提高工作效率和操作便捷性。 - [快速上手 iTerm2:掌握这些必备快捷键](https://blog.dong4j.site/posts/6bf37004.md): 本文介绍了终端模拟器iTerm2和tmux的一些常用快捷键,包括基本操作、搜索历史记录、切换Tab和Pane、切分屏幕等。还涵盖了文本编辑相关的快捷键,以及tmux中的系统操作、窗口操作、面板操作等内容。 - [打造个性化 IntelliJ IDEA 编辑环境](https://blog.dong4j.site/posts/eb599575.md): IntelliJ IDEA是一款功能强大的IDE,提供了丰富的快捷键和自定义设置以提升开发效率。文章介绍了如何调整编辑器颜色、代码折叠方法以及一系列常用快捷键,包括调试、翻译等功能的快捷操作。还涉及到自定义VM选项和使用HTTP代理的方法。 - [从入门到精通:IDEA 的所有快捷键汇总](https://blog.dong4j.site/posts/72a223e0.md): IntelliJ IDEA 提供了一系列快捷键来提高文件编辑、代码重构与调试的效率。这些快捷键包括文件和编辑相关操作,如插入行、创建测试用例、运行/调试任务等;代码重构与调试相关操作,如生成方法返回类型、提炼新方法、跳转到断点等;以及文档查看和翻译功能。通过使用这些快捷键,用户可以更高效地进行软件开发工作。 - [常量池迁移史:从永久代到堆,JVM内存的变迁](https://blog.dong4j.site/posts/4453ea00.md): 在 Java 中,字符串字面量(如 'abc')会被存储在运行时常量池中。当使用 new String( - [Docker基问题记录](https://blog.dong4j.site/posts/79a8d4c5.md): 本文详细介绍了如何升级 Docker 到最新版本、解决升级后可能出现的错误、安装和配置 Docker Compose。此外,还涵盖了磁盘清理与镜像管理、处理其他常见问题以及查看容器日志和设置自动启动等技巧。 - [Docker基础教程:镜像、容器与仓库](https://blog.dong4j.site/posts/fa8faa2e.md): 本博客是关于Docker入门的指南。内容涵盖了Docker的基本概念、安装方法、基本命令以及如何构建自己的镜像和Docker Compose的使用。Docker是一个开源的应用容器引擎,让开发者能够将软件及其运行时环境封装起来以方便地进行移植和部署。通过使用Docker,可以快速打包、发布以及运行应用程序在几乎任何地方(包括物理机或虚拟机上)。它利用Linux内核的资源隔离特性来实现轻量级的操作系统级虚拟化,使得开发人员能够创建和管理容器化的应用和服务。博客还提供了在Ubuntu、Windows和macOS上安装Docker的详细步骤和基本命令的解释。此外,还介绍了如何构建自己的Docker镜像和Docker Compose的使用方法。 - [JUnit4 入门:掌握 Java 单元测试的艺术](https://blog.dong4j.site/posts/6961d5gq.md): 本文介绍了JUnit,一个用于编写和运行Java单元测试的框架。文章首先解释了为何使用JUnit来替代传统的测试方法,如手动创建测试类和main方法进行测试。接着详细阐述了如何使用JUnit进行测试,包括创建项目结构、编写测试代码、以及配置测试套件等。然后深入讲解了Junit的一些高级特性,比如Fixtures(用于初始化数据)、异常和时间测试、忽略测试方法以及如何通过Ant工具与JUnit结合使用。最后总结了在编写单元测试时的一些最佳实践和技巧。 - [Maven 命令精讲:从入门到精通](https://blog.dong4j.site/posts/4f5fa1df.md): 本文介绍了Maven的一些高级使用技巧,包括如何生成IntelliJ IDEA项目文件、删除指定依赖、设置日志级别、引入新依赖而不改变原有配置、处理依赖版本范围等。此外,还介绍了Maven的环境变量引用方法、解决缓存依赖问题的措施以及如何下载和安装jar包到本地仓库。文章最后讨论了`dependencies`和`dependencyManagement`的区别、Maven Scope的解释以及如何创建Maven Web项目和Java应用程序模板。 - [从零开始构建Spring Boot Starter](https://blog.dong4j.site/posts/6961d5da.md): Spring Boot通过条件注解自动配置Bean的能力。文章介绍了常用的条件注解及其使用场景,并详细展示了如何创建一个自定义的Starter POM、配置属性类、服务类和自动配置类,以及如何在项目中引入和使用该Starter。最后,演示了如何通过修改配置文件来自动化地调整配置值。 - [数据库相关的零碎记录](https://blog.dong4j.site/posts/166cf996.md): 本文主要讨论了 MySQL 数据库的设置和管理,包括 SQL 模式配置、数据库和表的字符编码修改、表情符号支持、外网访问设置以及 Oracle 和 MySQL 的批量处理示例。同时,还介绍了如何实现 Oracle 数据库中的主键自增功能,并探讨了分页计算公式及日期时间函数的应用。最后,文章还涉及了查看 MySQL 读取配置文件顺序的方法和数据库驱动实现过程。 - [Maven基础教程:构建自动化和依赖管理](https://blog.dong4j.site/posts/a6380364.md): Apache Maven 是一个强大的Java项目管理和构建工具,它通过定义项目的配置文件pom.xml来简化开发流程。Maven提供了一系列插件支持编译、测试和打包等功能,并且能够与持续集成工具如Jenkins配合使用。本文详细介绍了如何在Linux和Windows系统中安装Maven,并展示了Maven项目的标准结构和基本命令的使用方法。此外,还讨论了pom.xml配置的元素定义及插件配置,以及如何设置仓库管理器以优化依赖下载速度。 - [让资源关闭更简单:Java 7 try-with-resources](https://blog.dong4j.site/posts/85a56b56.md): 本文介绍了在Java 7中引入的try-with-resources语句,该语句简化了资源的自动管理。文章首先比较了传统的try-catch-finally结构如何手动管理资源,并指出其可能的问题,如异常处理和资源关闭顺序控制。接着,详细解释了try-with-resources的工作原理及其优势,包括自动关闭资源、处理多个资源和自定义AutoClosable接口的类。最后,通过代码示例展示了如何在try-with-resources中使用Java内置类以及用户自定义的AutoCloseable实现。 - [自定义Logback输出格式:掌握JSON日志的奥秘](https://blog.dong4j.site/posts/d2b51e2a.md): 本文介绍了logback日志框架,它与log4j类似但更高效。文章详细解释了如何配置logback,包括依赖声明、配置文件和日志输出格式。此外,还讲解了如何通过重写Converter类和PatternLayout类来将日志格式改为JSON,以便于使用日志收集工具如graylog。 - [掌握Log4j配置,日志管理更高效!](https://blog.dong4j.site/posts/b533df62.md): 本文详细介绍了如何配置Log4J日志系统,包括设置日志级别、输出目的地、日志信息格式等。文章还提供了多个示例配置文件,演示了如何将日志输出到控制台、文件、每天滚动生成的新文件、发送电子邮件以及写入Windows事件日志和数据库中。此外,文章还涉及了自定义Appender的高级使用方法,例如将特定级别的错误记录到NT日志或通过电子邮件通知管理员。 - [轻松掌握Java数据库操作:JDBC入门](https://blog.dong4j.site/posts/5a428776.md): 本文介绍了Java中使用JDBC进行数据库操作的基本方法。首先阐述了如何导入必要的包,并通过一个示例主类展示了连接MySQL服务器、执行SQL语句以及预处理数据的过程。接着详细描述了使用PreparedStatement进行插入、更新和删除数据的步骤。最后,文章提供了数据库配置属性文件`db.properties`的例子,以及一个实用工具类`DBUtil.java`的实现解析,该工具类封装了创建和释放数据库连接的逻辑,并提供了异常处理机制。 - [深入浅出:Java日志系统的演变](https://blog.dong4j.site/posts/10ce2820.md): 本文介绍了Java日志系统的历史和发展,从早期的Log4j到JDK自带的JUL(Java Util Logging),再到较新的Logback。文章详细解释了如何使用SLF4J作为统一的日志门面来适配不同日志系统,包括Log4j和JDK的logging实现。还提到了如何在项目中配置和使用log4j以及logback,并强调了在不同环境下如何正确地桥接slf4j到具体日志实现的重要性。最后总结了slf4j与其他日志框架如log4j、logback以及JCL的交互方式及其注意事项。 - [Servlet 方法大揭秘:sendRedirect vs forward](https://blog.dong4j.site/posts/a886bfdb.md): 本文比较了Java Servlet中的sendRedirect和forward方法的区别,以及encodeURL和encodeRedirectURL方法的区别。同时,文章还解释了setAttribute与getParameter的区别,包括它们如何在不同情况下工作以及在转发和请求参数处理中的作用。 - [Java程序员必备技能:性能优化的35个实用技巧](https://blog.dong4j.site/posts/692bb3c4.md): 本文讨论了代码优化的重要性,以及如何通过细小的细节来提升代码运行效率。文章列举了多个优化的细节,包括指定final修饰符、重用对象、使用局部变量、及时关闭流、减少重复计算、采用懒加载策略、慎用异常、避免在循环中使用try-catch等。同时,还提到了使用数据库连接池和线程池、带缓冲的输入输出流进行IO操作、根据场景选择合适的集合类等方法来提高代码效率。文章强调了优化应在有足够时间开发、维护代码时考虑,并提供了具体的示例说明。 - [JVM 内存新篇章:从持久代到元空间](https://blog.dong4j.site/posts/7f48a7fb.md): 本文深入探讨了Java虚拟机(JVM)中的持久代和元空间。文章首先介绍了持久代的概念,包括其作用、存储的数据类型以及大小限制。然后讨论了为什么HotSpot JVM移除了持久代,并引入了元空间来替代它,解释了元空间的特性和内存分配模型。此外,还讲述了如何调整元空间的大小以优化GC性能,并介绍了一些相关的JVM工具。最后总结了元空间的特点和未来的可能发展方向。 - [从零开始:JUnit4.x 的实践指南](https://blog.dong4j.site/posts/64d008b.md): 本文介绍了JUnit单元测试框架的用途和基本使用方法。文章首先解释了传统单元测试中存在的问题,如代码混乱和重复调用等,引出JUnit的必要性。接着详细介绍了如何使用JUnit进行单元测试,包括创建项目、编写测试类、添加测试方法和使用断言等。最后,文章深入探讨了Junit的高级特性,如Fixture的使用、异常和时间测试以及如何忽略测试方法。还提到了JUnit和Ant的结合使用,并提供了一些编写测试代码的技巧和实践方法。 - [Java面试必知:final、finally和finalize的区别解析](https://blog.dong4j.site/posts/c8f7e252.md): 本文介绍了Hibernate和Spring框架的基本概念和工作原理,以及它们与iBatis的比较。Hibernate是一个ORM(对象关系映射)工具,用于简化数据库操作;而Spring框架则提供了一种编程模型和编程范式,使开发人员能够更容易地开发出可维护的、测试的和模块化的应用程序。文章还讨论了final、finally和finalize的区别。 - [Java基础:一些常用代码片段](https://blog.dong4j.site/posts/b3298821.md): 本博客详细介绍了Java编程语言中的各种重要概念和技术,包括环境变量和系统属性的获取、字符串处理、日期时间操作、数据结构的使用(如ArrayList、LinkedList、HashMap等)、泛型和foreach循环的应用、面向对象编程的原则和实践、输入输出流的使用、网络通信(客户端和服务器端的Socket编程、RMI远程方法调用)、数据库访问技术、XML数据处理、Java与外部语言的结合等。博客中使用了大量的示例代码,详细解释了每个概念和技术在Java编程中的应用场景和方法。对于初学者来说,这些内容可以帮助他们建立起对Java基础知识的全面理解;对于有一定经验的开发者来说,则可以作为参考和学习的资源。 - [Ja编程:知识点总结二](https://blog.dong4j.site/posts/569377f1.md): 本文深入探讨了Java编程中的多个关键概念,包括equals方法、逻辑与运算符&和&&的区别、short类型变量的操作、char类型的Unicode支持、final关键字的使用、==操作符和equals方法的区别、静态变量和实例变量的区别、static方法和非static方法的调用限制、Math类的方法、Java的类加载机制以及双亲委派模型、进程间通信的方式、线程间通信的方式、clone方法、内部类的初始化方式、String、StringBuffer与StringBuilder的区别、length、length()和size()方法的区别、final、finally和finalize的关键字区别、stop和suspend方法的危险性、sleep和wait方法的差异、多线程的实现方式和同步机制、Java锁的种类以及synchronized和java.util.concurrent.locks.Lock的异同。文章还通过示例代码展示了这些概念的应用,并讨论了数据库驱动程序的动态加载和使用方式。 - [Java面试必知:HashMap原理与常见问题解答](https://blog.dong4j.site/posts/b944ce65.md): 本文详细介绍了Java中的集合框架,包括Collection、List、LinkedList、ArrayList、CopyOnWriteArrayList、Vector、Stack、Set、HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、Map、ConcurrentHashMap、ConcurrentSkipListMap等类。文章首先对单线程下的List和Map进行了详细解析,包括其底层实现原理和遍历方式。接着介绍了多线程集合框架,如CopyOnWriteArrayList、ConcurrentSkipListSet、CopyOnWriteArraySet、ConcurrentHashMap、ConcurrentSkipListMap等。最后讨论了Java集合框架中的一些常见问题和最佳实践。 - [Java基础:知识点总结一](https://blog.dong4j.site/posts/b89d16dd.md): 本文探讨了Java中的几个重要概念:Serializable接口的意义,单例模式的不同实现方式(包括懒汉模式、饿汉模式、同步锁、双锁机制、枚举实现和静态内部类实现),以及如何防止反射和反序列化破坏单例。文章还介绍了Fork/Join框架与MapReduce的区别,NIO和AIO的特点,序列化和反序列化的原理,Java中的数据类型Integer的自动装箱和拆箱行为,进制的概念,==和equals方法的使用区别,强引用、软引用、弱引用和虚引用的区别及其在垃圾回收中的应用。最后,文章讨论了Java垃圾收集器的工作时机、对象判断标准以及GC操作的详细内容。 - [Git基础命令全解析:掌握版本控制的艺术](https://blog.dong4j.site/posts/6952e88b.md): 本文介绍了Git的配置和管理,包括忽略规则、取消跟踪文件、从版本库中移除文件或目录、创建和推送标签、同步标签、统计提交次数及代码量变化、同时向多处推送代码、强制提交更改、克隆指定标签的仓库、配置代理和取消代理设置、初始化项目并上传到GitHub、创建及同步分支、处理大小写不匹配的文件名、移除版本控制下的某个文件或目录、修改文件夹名称或移除版本控制下的空文件夹、删除远端分支、修改远程仓库的地址以及修改文件名大小写等方面的内容。 - [掌握Git核心技能:必备的命令和操作](https://blog.dong4j.site/posts/858a1037.md): 本文介绍了Git的基本操作和命令,包括创建代码库、配置、增加/删除文件、提交代码、分支管理、标签使用、查看信息、远程同步、撤销操作等。这些命令对于版本控制和团队协作至关重要,能够帮助开发者更好地管理代码变更和历史记录。 - [轻松掌握SSH服务配置:Ubuntu入门必学技能](https://blog.dong4j.site/posts/ab98e58e.md): 本文提供了Ubuntu系统使用过程中的基本操作步骤,包括图形界面与命令行模式的切换以及配置SSH服务的方法。文章详细说明了如何更新包列表、安装openssh-server、查看和开启SSH服务、查看系统IP地址以及修改SSH配置文件以允许root用户通过SSH登录。这些技能将帮助读者更好地管理和远程访问Ubuntu系统。 - [掌握Java泛型的力量:从基础到高级用法](https://blog.dong4j.site/posts/28ed4a7f.md): 本文深入探讨了Java中的泛型概念及其应用。文章首先解释了泛型的基本原理,即通过类型参数化提高代码复用性和安全性。接着,文章通过示例展示了如何使用泛型来避免强制类型转换和运行时错误。文中还介绍了泛型的高级用法,包括限制泛型、多接口限制、通配符泛型和泛型方法的使用。最后,文章讨论了类型参数与无界通配符的区别以及Java泛型中的super关键字。 - [Git基础入门:从安装到高级实战指南](https://blog.dong4j.site/posts/8d8f656a.md): 本文介绍了Git的基本操作和使用方法,包括安装、配置、仓库初始化、文件添加与提交、分支管理、远程仓库操作、冲突解决以及使用最佳实践等。内容涵盖了从入门到高级使用的各个方面,适合希望深入学习Git的用户。 - [Nginx入门必备:高效Web服务器的探索之旅](https://blog.dong4j.site/posts/d73767c3.md): Nginx 是一款高性能的 HTTP 和反向代理服务器,由俄罗斯工程师 Igor Sysoev 开发。它具有高并发性能、资源效率、功能丰富和高度可扩展等优势,适用于静态文件服务、反向代理、负载均衡、缓存、Web 应用加速等多种场景。Nginx 通过事件驱动(异步)的非阻塞架构,能够高效处理成千上万的并发连接,特别适合高流量应用。它的配置文件简单明了,便于管理和扩展。 - [SQL 基础:常用的 SQ操作](https://blog.dong4j.site/posts/ac8eb277.md): 本文介绍了SQL连接操作、CASE WHEN的使用、删除重复记录的方法、设置和查看SQL模式、在XML中处理SQL语句的技巧、模糊查询的执行方法、使用mycli工具进行数据库查询、MyBatis动态SQL中的参数区别和使用最佳实践,以及如何通过MyBatis接口方法和XML映射文件处理单个和多个参数,并展示了数组参数和List参数的处理方式。 - [Shell脚本入门:Linux文件管理系统秘籍](https://blog.dong4j.site/posts/10f60db1.md): 本文介绍了通过端口号获取PID的方法,如何根据名称获取PID,以及tar命令的使用。同时阐述了shell中执行多个命令的方法,包括使用分号、与和或来控制命令的执行顺序。还讨论了查看历史命令和批量杀进程的技巧。接着介绍了删除文件和目录的方法,包括使用rm命令和find命令进行精确筛选。最后详细说明了find命令的使用方法,包括常用的选项和运算式,并提供了实际应用示例。 - [Spring Boot 入门指南:从基础到实践](https://blog.dong4j.site/posts/f2cb7e19.md): 本文探讨了Spring Boot应用中main类放置位置的建议。建议将main类放在所有类所在包的顶层,以便于使用@ComponentScan和@SpringBootApplication注解,简化配置。同时,文章还介绍了构造器注入、开发者工具(如devtools)的使用,以及配置文件和环境选择等高级特性。此外,还提到了Spring Boot的一些调试和管理特性,例如远程调试、自定义Banner、Application事件监听器和Admin特性等。最后,本文简要描述了日志配置的选择和定制方法。 - [Java并发编程的利器:volatile的关键技巧和应用](https://blog.dong4j.site/posts/da43da6e.md): 本文探讨了volatile关键字在Java并发编程中的作用和意义,主要涵盖了两个方面:可见性和指令重排。volatile关键字确保了变量的可见性,即当一个线程修改了一个共享变量时,其他线程能够立即得知这个修改。它还禁止了指令重排,从而保证了程序执行的有序性。然而,volatile关键字不能保证操作的原子性,这可能导致并发问题。文章通过具体的例子和代码分析,深入解释了这些概念。 - [《Log4j 2 官方文档》多余性(Additivity)](https://blog.dong4j.site/posts/d6e26bb5.md): 本文介绍如何在Log4j2中配置专门的Logger来输出特定组件的TRACE级别日志,同时避免影响其他组件的日志输出。文章通过XML配置文件展示了如何为com.foo.Bar组件创建一个独立的Logger实例,并关闭了其父Logger(Root Logger)的自动性(additivity),以防止重复输出日志。此外,还说明了如何在配置中添加Console Appender以及设置日志格式。 - [如何更安全地删除文件:使用自定义`rmtrash`脚本](https://blog.dong4j.site/posts/ae39e951.md): 本文介绍了在Linux系统中创建自定义回收站的步骤和使用方法。文章首先描述了使用rm命令直接删除文件的不可逆性,以及为避免误操作而设计的一个类似于Windows系统回收站的脚本。该脚本通过修改rm命令的行为,将文件移动至用户家目录下的`.rmtrash/`目录中,同时记录删除操作的详细信息。通过不同的选项,用户可以查看、恢复、清空或列出回收站内容。文章还提供了脚本的代码和安装说明,以及如何使用别名替换原rm命令以实现这一功能。 - [Log4j2深度剖析:从基础到异步优化](https://blog.dong4j.site/posts/d9189394.md): Apache Log4j 2 是对 Log4j 的升级,提供了许多改进和修复了 Logback 的一些问题,包括异常处理、性能提升、自动重载配置和无垃圾机制等。文章介绍了 log4j2 的概念、例子、异步日志的使用方法以及注意事项和性能测试结果。 - [Node.js 版本管理:从入门到精通](https://blog.dong4j.site/posts/19e627d5.md): 本文介绍了Node.js的基础入门知识,包括如何安装和管理不同版本的Node.js。文章首先解释了Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,适用于构建网络应用程序。接着详细阐述了如何使用`n`模块来管理Node.js版本,包括升级、安装指定版本和切换版本等操作。此外,还介绍了http-server模块作为静态文件服务器在项目中的应用,以及如何使用nvm工具来实现多版本的Node.js管理。 - [掌握 CentOS 环境下的 Python 技巧](https://blog.dong4j.site/posts/44bde9f9.md): 本文介绍了在 CentOS 操作系统中手动安装和配置 Python 环境的步骤,包括解压源代码包、配置编译选项、安装 Python,以及如何使用 pip 安装依赖项和运行简单的 HTTP 服务器。 - [Redis 数据结构详解:从基本到高级](https://blog.dong4j.site/posts/ae6109b1.md): Redis 是一个高效的开源内存数据结构存储系统,提供多种数据类型和持久化机制。它支持主从复制、密码验证等功能,适用于快速读写和高并发场景。Redis 还具有丰富的命令和良好的社区支持,使其成为一个强大的工具。 - [RESTful API 入门指南:从概念到实战](https://blog.dong4j.site/posts/1fce8c1c.md): RESTful API 是一种网络应用架构风格, 强调通过统一的接口和资源操作设计 API. 它使用 HTTP 协议中的不同方法来创建、读取、更新和删除资源, 让开发者和用户能够直观地理解和操作应用程序. - [从零开始:掌握Web会话管理的四种方式](https://blog.dong4j.site/posts/b1cd2b93.md): 本文深入探讨了 HTTP 协议的无状态性及其带来的挑战。为了在多个请求中保持会话状态,文章介绍了四种解决方案:表单隐含字段、Cookie、Session 和 URL 重写。每个方法的特点和用途都进行了详细的解释,并提供了相关的代码示例。最后,文章总结了这些方法的优缺点和使用场景,为开发者提供了实用的指导。 - [Spring MVC 优化:敏感词过滤与Token验证的集成](https://blog.dong4j.site/posts/f335982.md): 本文深入探讨了在Spring MVC框架下如何通过拦截器和注解实现Token验证、用户信息注入、参数别名处理、关闭默认Content-Type判断、更改默认Json序列化方案以及自动加密/解密请求中的Json等高级功能。文章还介绍了敏感词过滤功能的实现,包括基于注解的敏感词过滤和记录请求返回内容的过滤器。这些功能的实现不仅增强了应用的安全性,也提高了开发效率和用户体验。 - [基于 Spring 的 Token 鉴权系统搭建教程](https://blog.dong4j.site/posts/2c481faa.md): REST是一种软件架构风格,通过URL对资源进行操作,而Token用于移动端登录身份鉴权,与Session相比更安全且符合无状态设计。文章介绍了Token的交互流程、程序示例和Spring框架下的实现方式,包括TokenModel类、RedisTokenManager接口及其在Controller中的应用。还讨论了登录请求的安全性问题以及Token生成方式的多样性。 - [@Autowired 和 @Resource:哪种方式更适合你的项目?](https://blog.dong4j.site/posts/499585b.md): 本文对比了Spring框架中的两个注解@Autowired和@Resource在装配bean时的异同。@Autowired默认按类型注入,而@Resource默认按名称注入;@Autowired可以设置required属性允许null值,而@Resource找不到匹配的bean会抛出异常。此外,两者都可以指定bean的名称进行注入。根据使用场景和个人偏好选择合适的注解。 - [从零开始:IntelliJ IDEA 中构建 SpringMVC+Spring+MyBatis 项目](https://blog.dong4j.site/posts/aca063f7.md): 本文详细介绍了如何在使用IntelliJ IDEA集成SpringMVC、Spring和Mybatis框架时,基于Annotation进行配置。文章首先展示了创建Spring工程并配置项目结构,随后讲解了如何在web.xml中设置SpringMVC的核心控制器和Spring容器监听器。接着,通过实例代码演示了实现登录功能的过程,包括配置实体Bean、Controller、Mapper以及Service层,并逐步完成了数据库连接的配置。 - [5分钟掌握:RESTful API的异常处理艺术](https://blog.dong4j.site/posts/954087b4.md): 本文探讨了在Spring MVC和RESTEasy框架中的异常处理方法。Spring MVC提供了SimpleMappingExceptionResolver、HandlerExceptionResolver以及@ExceptionHandler注解来实现异常处理。RESTEasy则通过ExceptionMapper接口来进行通用异常处理。文章详细介绍了这些方法的实现方式,并给出了示例代码。 - [三层架构的魅力:界面层、业务逻辑层与数据访问层](https://blog.dong4j.site/posts/a13702d6.md): 本文详细介绍了框架模式和设计模式的区别,以及MVC框架模式的具体应用。文章首先解释了框架和设计模式的定义及其区别,然后重点阐述了MVC框架模式在Web应用开发中的应用,包括Model2开发和三层架构的概念。最后总结了MVC框架的组成部分及其工作流程。 - [使用Spring MVC与MyBatis实现用户数据管理,包括注册、分页和删除](https://blog.dong4j.site/posts/22eab19d.md): 本博客介绍了如何在一个Java Spring MVC项目中实现用户注册功能,包括数据库表创建、实体类定义、Mapper接口和XML文件配置。此外,还包括了分页和删除功能的实现。代码中使用了AJAX进行异步数据加载和处理,并且通过fastjson库将Java对象转换为JSON格式数据。最后,还讨论了由于未配置编码过滤器导致乱码的问题。 - [Mybatis入门五:探索Mapper Java接口与Map参数的灵活结合](https://blog.dong4j.site/posts/7bb33d78.md): 该博客介绍了MyBatis中mapper.xml的配置和使用。包括二级缓存的开启、resultMap的使用、根据不同条件进行查询和更新操作,以及使用choose语句来处理固定数量的条件项。同时也展示了如何通过Map参数传递动态的条件并构建SQL语句。 - [MyBatis二级缓存实战教程](https://blog.dong4j.site/posts/66515f3d.md): MyBatis提供了两种类型的缓存:一级缓存和二级缓存。一级缓存是基于HashMap的本地缓存,作用域为Session。二级缓存也是基于HashMap存储,但作用域为Mapper(Namespace),并支持自定义存储源如Ehcache。当执行C/U/D操作时,相应的作用域下的缓存会被清空。测试代码展示了如何使用MyBatis的一级和二级缓存。一级缓存默认开启且只能在同一Session中使用相同条件查询时生效。二级缓存需要配置并在User类中实现Serializable接口,支持跨SqlSession的数据共享。总结中还介绍了cache标签的常用属性,如回收策略、自动刷新时间、最大缓存大小等。 - [MyBatis 一对多、一对一查询详解与配置示例](https://blog.dong4j.site/posts/2a833323.md): 本文介绍了使用MyBatis进行数据库操作的方法,包括一对一关联、一对多关联和继承关联。通过配置XML文件,可以实现数据库的查询、更新、删除等操作。文章中详细说明了如何使用association和collection标签来实现不同类型的关联关系。此外,还介绍了一种新的关联方式:使用discriminator标签实现继承关联。最后,本文提供了一个具体的例子,展示如何在MyBatis中使用这些功能。 - [MyBatis CRUD操作指南](https://blog.dong4j.site/posts/68dfa52e.md): 本节内容深入介绍了Mybatis框架在数据库操作中的应用,包括基于XML和注解两种方式实现CRUD操作。详细演示了如何定义UserMapper接口、使用SQL映射文件以及如何在测试类中调用这些方法进行数据的增删改查。此外,还提到了如何将数据库连接配置信息写入properties文件,以及在mybatis-config.xml中引入该配置文件。最后,讨论了如何处理字段名和实体类属性名不一致的问题,并提供了两种解决方法的示例。 - [MyBatis 入门必备:如何配置和运行第一个程序](https://blog.dong4j.site/posts/535f8b87.md): MyBatis是一个基于Java的持久层框架,由iBATIS演变而来。它支持普通SQL查询、存储过程和高级映射,并自动处理大部分JDBC代码。MyBatis使用XML或注解配置,将接口和Java对象映射到数据库记录。快速入门指南包括创建项目、添加库依赖、设置数据库环境、定义实体类、建立SQL映射文件、注册映射文件以及编写测试代码。 - [从零开始:深入理解Hibernate框架的奥秘](https://blog.dong4j.site/posts/f0fe1ae8.md): 本文深入探讨了Hibernate框架,一个用于实现数据库与Java实体类之间映射的工具。通过配置文件和映射文件,开发者可以轻松地将对象模型映射到关系型数据库模型中。文章详细解释了Hibernate的核心概念、组成部分和开发接口,包括持久化类的序列化接口、SessionFactory的连接池管理以及Session的事务管理和对象状态转换。此外,文章还介绍了对象的瞬时、持久化和托管状态,以及代理模式在Hibernate中的应用。最后,文章重点讲解了ORM(对象关系映射)的概念及其好处,并提供了.hbm.xml和.hibernate.cfg.xml配置文件的详细示例。 - [探索Spring MVC注解驱动:从基础到高级](https://blog.dong4j.site/posts/aab1eaf1.md): 本文探讨了Spring框架中多配置文件的处理方法,包括使用逗号和通配符分隔配置文件以及如何开启注解驱动和自动扫描。文章还介绍了如何在Spring中使用@RequestMapping注解来处理HTTP请求,并讨论了数据绑定、类型转换和输入验证等方面。最后,文章简单提及了文件上传和拦截器的相关内容。 - [Spring 入门:EJB vs Spring 容器大比拼](https://blog.dong4j.site/posts/90f41285.md): EJB和重量级容器的缺点在于它们带来的复杂性和侵入性,例如代码难以测试、性能降低以及可移植性问题。相比之下,Spring容器通过控制反转(IoC)和依赖注入(DI)提供了更灵活的解决方案,可以管理POJO并使用AOP进行功能增强。这些特性使得Spring在Web应用、小应用和桌面程序中具有不同的依赖程度。 - [RabbitMQ基础教程:Fanout交换器与多消费者模型](https://blog.dong4j.site/posts/e954a744.md): 本文讨论了在RabbitMQ中实现发布/订阅模式的方法。通过创建一个简单的日志系统,展示了如何将消息发送给多个消费者。文章介绍了不同类型的转发器(Exchanges)及其工作原理,包括Direct、Topic和Fanout类型。同时,还讲解了如何使用临时队列和绑定机制来实现这种模式。最后,提供了生产者和消费者的完整Java代码示例,以展示如何在RabbitMQ中实现日志的发布/订阅功能。 - [从轮询到公平:RabbitMQ的消息队列策略](https://blog.dong4j.site/posts/ab083149.md): 本文讨论了工作队列的概念及其在Web应用中的重要性。文章通过Java代码示例展示了如何在RabbitMQ中实现生产者和消费者的通信。还详细解释了消息应答机制、消息持久化和公平转发的重要性以及如何实现它们。最后,通过对比测试结果,展示了公平转发机制与轮询调度机制的区别。 - [RabbitMQ入门:深入理解消息队列核心概念](https://blog.dong4j.site/posts/90881fe0.md): RabbitMQ是一个基于Erlang和AMQP协议的开源消息队列系统,由RabbitMQ Technologies Ltd开发并得到VMware部门的SpringSource的支持。它支持生产者与消费者之间的异步通信,并通过交换机、队列和绑定等概念实现消息的路由和分发。RabbitMQ提供了一套API来简化消息的生产、发布、消费过程,并且支持消息的持久化以确保数据的安全。 - [掌握这6种算法,成为负载均衡高手!](https://blog.dong4j.site/posts/f1119903.md): 本文介绍了多种负载均衡方法,包括轮询法、随机法、源地址哈希法、加权轮询法、加权随机法和最小连接数法。每种方法都有其特点和适用场景,能够根据不同需求和后端服务器的实际情况进行选择和应用。 - [Zookeeper Curator高级特性实战指南](https://blog.dong4j.site/posts/348a7282.md): Curator 是 Netflix 公司开源的 zookeeper 客户端框架,简化了 Zookeeper 客户端的开发工作。本文介绍了 Curator 的一些高级特性,包括缓存、领导选举、分布式锁和计数器等。此外,还简要介绍了 Curator 提供的不同类型的队列和屏障功能。 - [Redis高效处理:字符串、哈希、列表和有序集合](https://blog.dong4j.site/posts/5567a46d.md): 本文介绍了 Redis 中几种基本数据结构的操作和应用场景。文章首先讲解了字符串类型的存储和常用命令,包括设置过期时间、批量处理等。然后介绍了哈希类型的数据结构及其在用户信息查询中的应用。接着阐述了列表类型,重点说明了其作为消息队列的使用方法。最后简单提及了集合和有序集合这两种数据结构。此外,还探讨了如何使用 Redis 的键管理功能来高效地组织和操作这些数据。 - [Redis背后的技术:单线程如何实现高性能?](https://blog.dong4j.site/posts/1556580b.md): 本文介绍了 Redis 的五种数据结构、内部编码以及单线程模型的工作原理。Redis 使用单线程处理命令,通过纯内存访问和非阻塞 I/O技术实现高效率。但也存在一个问题,即当单个命令执行时间过长时,可能会导致其他命令的阻塞。 - [Redis命令速查手册:常用指令详解](https://blog.dong4j.site/posts/570ace06.md): 本文详细介绍了Redis的可执行文件及其作用,包括启动Redis的`redis-server`命令、Redis命令行客户端`redis-cli`、基准测试工具`redis-benchmark`等。文章还讲解了如何通过运行参数和配置文件来启动Redis,以及Redis的持久化路径和日志路径的修改方法。此外,文章还介绍了Redis的命令行客户端使用方式,包括交互式方式和命令方式,并列举了停止Redis服务的命令。最后,文章讨论了Redis的全局命令,如`dbsize`、`keys`、`exists`、`del`、`expire`和`type`等,解释了它们的功能和使用方法。 - [从零开始:安装并配置CentOS Nginx服务](https://blog.dong4j.site/posts/779e9fe6.md): 本文介绍如何在Centos 64位系统上安装Nginx。首先需要下载Nginx的tar包及依赖的工具,然后进行编译和安装。最后通过浏览器访问服务器IP来验证Nginx是否成功启动。如果出现找不到libpcre.so.1的问题,可以通过创建符号链接来解决。 - [Redis入门:掌握基础,开启高效数据存储之旅](https://blog.dong4j.site/posts/6c8ae0af.md): 本文介绍了 Redis 的三种主要用法:作为内存缓存、定量数据指标和发布/订阅模型。文章详细解释了 Redis 如何使用不同的数据结构(如字符串、列表、集合、有序集合、哈希和 HyperLogLog)来实现这些功能,并提供了相应的示例代码。此外,还讨论了 Redis 的事务处理机制及其原子性特点。 - [CentOS7 MongoDB 3.0 安装全攻略](https://blog.dong4j.site/posts/53cebd27.md): 本文介绍了 MongoDB 3.0 的下载、安装以及 CRUD 操作。MongoDB 3.0 提供了更强大的写入效率、数据压缩率和运维成本减少。文章还提到了 WiredTiger 存储引擎和 MongoDB 可视化工具的使用方法。 - [在CentOS上享受更高效的Shell体验:oh-my-zsh](https://blog.dong4j.site/posts/ac4909f7.md): 本文介绍了如何为Linux系统安装并配置zsh和oh-my-zsh。首先,通过运行命令查看当前系统的shell类型,然后检查系统中是否已安装zsh,如果没有则使用yum进行安装。安装完成后,需要将默认的bash shell切换为zsh,可以通过chsh命令实现。之后,介绍了如何从GitHub克隆oh-my-zsh并执行安装脚本。如果遇到`warning: cannot set LC_CTYPE locale`的问题,可以在`/etc/profile`文件中添加相关代码来解决。最后,通过修改`.zshrc`配置文件可以选择插件、主题和选项来进一步定制zsh环境。 - [掌握 Shell 编程:Linux 必备技能](https://blog.dong4j.site/posts/441dc39d.md): 本文深入浅出地介绍了Linux下的Shell编程基础知识,包括Shell脚本的概念、常用的shell命令如cd、mkdir、touch等,以及Shell脚本的运行方式。文章还详细讲解了变量、字符串、数组的使用方法,并介绍了注释的写法。此外,文章对参数传递、基本运算符、文件测试运算符等进行了说明,并通过实例展示了如何使用echo和printf命令进行格式化输出。最后,文章还讲述了Shell脚本中的流程控制语句,包括if-else语句、for循环、while循环、无限循环、until循环、case语句以及跳出循环的方法。此外,还介绍了函数的定义和使用方法,以及输入/输出重定向的概念。 - [Shell脚本编写全攻略:从零开始](https://blog.dong4j.site/posts/a77b2cc.md): 本博客内容详细介绍了Shell编程的基础知识,包括定义变量、只读变量、删除变量、特殊变量、shell替换、运算符、字符串处理、数组操作、echo命令和printf命令的使用,以及if-else语句、case语句、for循环、while循环、until循环、break和continue语句、shell函数的定义和使用,最后还介绍了shell输出重定向和包含其他sh文件的方法。 - [Web app开发:成本与体验的权衡之道](https://blog.dong4j.site/posts/390ff665.md): 本文讲述了作者在开发一个社交化的在线商店过程中遇到的挑战和解决方案。文章首先介绍了项目的技术架构,包括 Android 和 iOS 客户端、Java 后台以及前端 Web app 的开发。接着分析了 Native App 和 Web App 的区别,强调了 Native App 在用户体验和功能实现上的优势,同时也指出了其更新成本高和维护复杂的问题。随后,作者详细描述了 Java Web 开发与 Web app 数据交互的区别,并举例说明了客户端登录流程的具体实现。最后,文章讨论了在开发过程中遇到的两个问题:Windows 下搭建 Redis 服务器和 SVN 版本控制问题,并提供了相应的解决方法。 - [JDK版本差异分析:方法区和运行时常量池的演变](https://blog.dong4j.site/posts/27c94bc.md): 本文讨论了 Java 方法区的特征和运行时常量池的动态性。方法区是全局共享的区域,存储 Java 类的结构信息,包括常量、静态变量和方法。JVM 规范不要求自动内存管理,但商用 JVM 实现了这一功能。方法区和运行时常量池都可以动态扩展,当内存不足时抛出 OutOfMemoryError 异常。HotSpot 方法区在 JDK1.2 到 JDK6 使用永久代实现,从 JDK7 开始移除永久代,JDK8 中被元空间取代。文章还通过测试代码说明了这些变迁对程序执行的影响,如 String 对象的 intern 方法在不同版本 Java 中的行为差异。 - [final、finally和finalize:Java编程必备知识](https://blog.dong4j.site/posts/697d5753.md): final、finally 和 finalize 是 Java 中的三个关键字,它们在语法上相似但功能不同。final 主要用于定义不可变变量、方法和类,确保这些元素只能被赋值一次。finally 通常用于 try/catch 块中,保证无论是否发生异常,都会执行 finally 代码块,常用于资源清理。finalize 是一个由 GC 调用的方法,用于在对象即将被回收时进行最后的清理工作,但因其不稳定性和不推荐使用,现代 Java 开发已逐步淘汰该功能。 - [从零到一学习SQL:内连接与外连接实战](https://blog.dong4j.site/posts/f9bb212c.md): 本文介绍了SQL中的聚合函数、数据分组、单表查询和多表查询的基本概念和语法。包括如何使用聚合函数如count、sum、avg、max和min进行数据统计,如何通过GROUP BY子句对数据进行分组,以及如何在WHERE和HAVING子句中进行条件筛选。此外,还详细介绍了分页查询、字符串连接、去除重复行的方法,以及LIKE模糊匹配的用法。最后,文章讲解了多表查询中的内连接、外链接(包括左外连接、右外连接和外全连接)和自然连接的概念和方法,以及子查询的使用场景和结果集形式。 - [SQL初学者必看:DDL与DML的区别与应用](https://blog.dong4j.site/posts/c3ab3ba4.md): 本文详细介绍了SQL中的表结构操作,包括创建、修改、删除表;数据操纵语言(DML)如插入、更新和删除数据;以及数据库约束的概念和应用,包括非空约束、主键、唯一约束、外键和默认值等。此外,还讨论了索引的创建和删除方法及其在提高查询效率方面的作用。文章涵盖了SQL的基础知识,适合初学者了解和学习。 - [MySQL 基础教程:从创建到备份恢复](https://blog.dong4j.site/posts/329422b3.md): 本文详细介绍了MySQL的基本操作,包括服务器的启动、停止与卸载,登录方法,提示符的修改,退出命令以及常用SQL语句。还涵盖了数据类型和操作数据表的方法,如创建、删除、使用数据库,以及如何插入、更新和删除记录。此外,文章还解释了如何在MySQL中更改密码、修改表结构,包括添加或删除字段,以及数据的备份与恢复。 - [轻松掌握Java Properties文件操作,从入门到实践](https://blog.dong4j.site/posts/c89e3217.md): Properties 类在Java中用于持久化保存属性集,支持从流读取和写入文件。通过 load() 方法可以从输入流加载属性列表,使用 getProperty() 和 getProperty(String, String) 查询属性,setProperty(String, String) 设置或更新属性值,store(OutputStream, String) 将属性集合存储到输出流中。Properties 类可以用于多种场景,如配置文件的读取和写入、用户设置保存等。 - [HashSet、TreeSet、HashMap:Java集合类的核心](https://blog.dong4j.site/posts/220ed6be.md): 本文介绍了Java集合框架中的基本概念和常用API,包括装载数据的集合类如HashSet、ArrayList和LinkedList,操作集合的工具类如Arrays和Collections。文章还详细解释了Iterator接口和Iterable接口的使用方法,以及泛型在集合框架中的作用。此外,文中还讨论了Collection、List、Set、Map等接口的特点和实现方式,并提供了HashMap和Properties类的使用示例代码。 - [Java编程基础:类型转换和操作技巧详解](https://blog.dong4j.site/posts/eee067eb.md): 本文深入探讨了Java编程中的几个关键概念。首先,文章解释了条件运算符的工作原理,包括操作数的类型如何影响表达式的类型。接着,讨论了加号(+)和加等于(+=)运算符的行为,特别是在处理不同数据类型的变量时可能出现的错误。最后,文章通过一个实例说明了如何在不使用临时变量的情况下交换两个整型变量的值,并指出了另一种方法在数值溢出时的潜在问题。 - [Java编程进阶之路:学习Collections和Arrays的强大功能](https://blog.dong4j.site/posts/d366874c.md): 本文介绍了Java中的Collections类和Arrays类的常用方法,以及内部比较器Comparable和外部比较器Comparator的概念。通过实现Comparable接口或使用自定义的Comparator对象,可以实现对对象的排序。文章还提供了一个Student类的例子,展示如何根据年龄和名字长度对Student对象进行排序。 - [Java 编程:抽象类与接口的使用指南](https://blog.dong4j.site/posts/64ccc6a0.md): 本文详细介绍了Java中的抽象类和接口的概念、特点以及它们之间的关系。抽象类是一种继承关系,子类只能有一个父类但可以有多个接口;而接口则提供了一种更高级的抽象方式,允许一个类实现多个接口,以解决多继承问题。文章还解释了为什么在抽象类中写抽象方法和在接口中写抽象方法的区别,以及何时使用它们。最后总结了选择抽象类还是接口的设计原则,强调了理解问题域的重要性。 - [理解 Java 多态性:编译时和运行时的区别](https://blog.dong4j.site/posts/ac4294eb.md): 本文探讨了面向对象编程中的多态概念,包括静态多态和动态多态。静态多态通过方法重载实现,而动态多态则涉及方法的重写和动态绑定。文章还讨论了转型技术,包括向上转型(自动)和向下转型(强制),并阐述了多态带来的好处和弊端,如提高程序的可维护性和可扩展性,但子类特有功能不能被父类访问。此外,还介绍了多态的三种体现形式:具体类多态、抽象类多态和接口多态。 - [Java继承的多态魅力:向上转型的艺术](https://blog.dong4j.site/posts/11d8b32d.md): Java的继承是创建新类的基础技术,允许利用现有类的定义来构建新的类。子类可以扩展父类,增加新的属性和方法,或重载方法。Java使用`extends`关键字表示继承关系,并且每个类默认继承自Object类。继承提高了代码复用性,但可能破坏封装性和导致强耦合。在处理继承时,应谨慎考虑其适用性。 - [封装与多态:Java编程的核心](https://blog.dong4j.site/posts/d60eb45.md): 封装是软件工程中的一个重要概念,它涉及隐藏对象的属性和实现细节,仅对外公开接口。通过这种方式,可以控制程序中属性的读写访问级别,并将抽象得到的数据和行为结合成一个整体。JavaBean 规范详细说明了如何实现封装,包括私有属性、提供公共的 set 和 get 方法等。geter 和 setter 方法用于更精确地控制成员变量的访问。此外,文章还讨论了方法重载的概念,即同一个类中具有相同名称但参数列表不同的方法,以及为什么不能根据返回值类型来区分重载方法。 - [Java基础到进阶:Math类与包装类的学习之路](https://blog.dong4j.site/posts/5d1ffcf3.md): Math 类提供了一系列用于数学运算的静态方法和属性,如计算自然对数的 E 值和圆周率的 PI 值。它还包含一些常用方法,例如向上取整 ceil、向下取整 floor、返回最接近整数 rint 和生成随机数 random。文章介绍了三种获取随机数的方法:利用当前时间毫秒数、使用 Math.random() 和通过 Random 类。此外,文章讲述了包装类的概念和作用,包括基本数据类型对应的包装类以及它们的不可变性特点。最后,详细解释了基本数据类型、包装类和 String 类之间的相互转换方法。 - [不可变与可变,解析Java三种字符串类差异](https://blog.dong4j.site/posts/58a301ae.md): 本文深入探讨了Java中的字符串操作类,包括String、StringBuffer和StringBuilder。详细解释了这些类的特点和用途,以及在内存中如何存储字符串对象。此外,还讨论了JVM运行时数据区的划分和反射机制对理解这些类的重要性。文章最后对比了三种字符串类在性能和使用场景上的差异,为开发者选择合适的字符串操作工具提供了指导。 - [Java异常处理全解析:掌握try-catch-finally,开启更安全的编程之旅](https://blog.dong4j.site/posts/28877bf.md): Java 异常机制提供了识别和响应错误的方法,通过异常类型、堆栈跟踪和信息可以回答 'what', 'where', 'why'。Throwable 类是所有错误或异常的超类,包含 Error 和 Exception 子类。Exception 指出合理的应用程序想要捕获的条件,而 RuntimeException 则是在运行时可能会出现的异常。被检查的异常需要在编译期进行处理,而错误通常无法恢复。Java 提供了 try、catch、finally 和 throw、throws 关键字来处理和抛出异常。自定义异常类可以通过继承 Exception 并重载构造方法来实现。 - [Java 关键字解析:new、static 与 final](https://blog.dong4j.site/posts/fe7c7d2d.md): 本篇博客介绍了Java编程语言中的几个关键概念:new关键字、构造方法、static属性和方法的用法,以及final修饰符的作用。此外,还解释了finally语句块在异常处理中的作用,以及super关键字与this关键字之间的区别。 - [Java编程基础:掌握四种访问修饰符(public、protected、default和private)](https://blog.dong4j.site/posts/f941d9b7.md): 本文介绍了Java中的四种访问权限:public、默认(friendly)、protected和private。public权限在包内外都可见,protected权限在同包和导出类中可见,private权限只对自身可见。文章通过代码示例说明了不同访问权限的使用方法及其作用域。 - [在Java中正确使用long类型:避免计算时意外丢失精度](https://blog.dong4j.site/posts/b0abc087.md): 本文探讨了Java语言中的数据类型溢出问题。通过一个示例代码,展示了在计算一天的微秒数和毫秒数时,由于没有正确指定数值类型为`long`,导致结果超出`int`类型的范围,从而引发数据溢出的情况。文章解释了如何避免这种陷阱,并提供了改进后的代码示例。 - [Java编程基础:如何正确判断一个数字是奇数还是偶数](https://blog.dong4j.site/posts/2363f1e9.md): 本文探讨了Java中判断一个整数是否为奇数的两种方法。首先介绍了一种基于取模运算符(%)的方法,该方法正确地判定正整数的奇偶性,但对于负整数会返回错误的结果。然后提出改进方案:使用按位与运算符(&)进行判断,这种方法更加简洁和有效。文章还详细解释了取模运算符的工作原理,说明了其结果根据操作数的符号决定的问题。 - [Java编程:结构化与面向对象的对决](https://blog.dong4j.site/posts/c8b315d3.md): 本文深入探讨了结构化编程和面向对象编程的区别。文章详细介绍了如何编写Java类,实例化对象,访问对象的属性和方法,以及理解this引用的概念。此外,还涵盖了包的用法、封装、继承、多态等面向对象的特点,并解释了基本数据类型和引用类型的传递特性。最后,文章阐述了对象的生命周期管理,包括对象的销毁和垃圾回收机制,以及JavaBean规范和对象之间的关系。同时,对方法调用栈、方法重载和构造器进行了详细的解析。 - [Java揭秘:深入浅出局部变量与常量池](https://blog.dong4j.site/posts/aa0f783a.md): 本文探讨了Java中的访问控制符、封装以及静态关键字的使用。文章首先介绍了四种访问控制符(public, 默认, protected, private)及其作用范围,包括它们在类和实例方法中的应用。接着,解释了getter和setter方法的深入理解,特别是当属性被设置为private时,如何通过这些方法进行数据验证和控制。然后详细描述了封装的好处,包括成员变量可读性的控制、类的整体内容控制和用户对内部实现细节的无需了解。文章还讨论了static关键字的使用,解释了静态变量(类变量)和静态方法的区别及使用方式,并说明了它们在内存中的存储位置。此外,阐述了代码块的概念,包括静态初始化块和实例化初始化块的执行顺序和作用。最后,对内部类的概念进行了概述,区分了成员内部类、局部内部类和匿名内部类,并解释了为什么局部内部类不能使用访问修饰符。 - [掌握Java数组:入门到进阶指南](https://blog.dong4j.site/posts/340249a9.md): 本文详细介绍了Java数组的基本概念、用法和操作。文章首先解释了数组的定义,包括它们在内存中的存储方式以及如何通过下标访问元素。接着讨论了数组下标的起始问题及其原因。然后,文章深入探讨了Java中数组的声明、初始化和动态分配空间的方法。此外,还介绍了数组的基本操作,如读取和修改元素值,并强调了数组越界的错误处理机制。最后,文章展示了如何使用数组来实现排序和查找算法,同时给出了一个二分法查找的示例代码。 - [Java虚拟机探秘:字节码与类文件](https://blog.dong4j.site/posts/c69e2769.md): 本文介绍了Java编程语言的基础知识,包括Java虚拟机(JVM)、类定义、主方法、系统输出、classPath配置以及标识符和关键字的使用。文章还详细讨论了Java的数据类型,例如int、double、byte、boolean、long、char等,并解释了它们之间的转换关系。此外,还介绍了String类的使用,包括字符串的定义、连接和数组。最后,文章讲解了程序的逻辑结构,如顺序结构、选择结构和循环结构,以及如何使用JOptionPane类进行用户交互。 - [Java数据类型转换:实战案例解析](https://blog.dong4j.site/posts/3daa4bf4.md): 本文介绍了Java中的数据类型转换和比较运算符的用法。首先,文章解释了不同数据类型的优先级顺序:double > float > long > int > short > byte。接着,讨论了自动转换(向上转型)和强制转换(向下转型)的区别以及可能出现的数据溢出问题。随后,详细介绍了if-else和if-else if判断语句的语法和用法,并给出了相应的示例代码。最后,通过几个实际操作的练习,如成绩等级划分、简单的四则运算以及回文数的判断等,加深了读者对这些知识的理解。 - [Java入门必备:环境配置与高效开发技巧](https://blog.dong4j.site/posts/ff9e7ddd.md): 本文介绍了Java编程语言及其应用。Java是一种面向对象的跨平台程序设计语言,具有通用性、高效性和安全性。Java技术广泛应用于PC、数据中心、游戏控制台、科学超级计算机等领域,并拥有庞大的开发者社群。文章还详细介绍了Java的体系结构,包括JavaSE(标准版)、JavaEE(企业版)和JavaME(移动版)。此外,文章讨论了Java的特点,如简单性、面向对象编程、跨平台、解释性语言、健壮性和安全性等。最后,文章简要说明了JDK和JRE的区别,并介绍了Java的数据类型、变量、常量以及环境变量的配置方法。 - [Java程序设计基础入门指南](https://blog.dong4j.site/posts/ca7b1ce7.md): 本文探讨了计算机程序、软件和计算机语言的关系。首先,介绍了计算机程序的概念和作用,将其比作日常生活中的烹饪过程。接着,详细解释了二进制及其在计算机系统中的应用,分析了其优缺点及采用原因,并提供了十进制转二进制的代码实现示例。文章还讨论了机器语言、汇编语言和高级语言的区别和特点,以及翻译程序中的编译和解释两种形式。最后,介绍了算法的概念和基本特征,阐述了程序设计的五个步骤,并用Java语言实现了猜数字的例子。 - [打造个性化编程环境:Sublime Text插件深度体验](https://blog.dong4j.site/posts/b5d8b5d5.md): Sublime Text 是一款适合前端开发的代码编辑器,界面美观且插件丰富。本文详细介绍了如何安装和使用 Sublime Text 进行 Java 开发环境的搭建,包括使用 Package Control 安装插件,解决中文乱码问题,以及提供一系列快捷键操作指南。