<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>极客老墨</title>
    <link>https://blog.hankmo.com/posts/</link>
    <description>Recent content on 极客老墨</description>
    <generator>Hugo -- 0.138.0</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 20 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.hankmo.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>OpenClaw多Agent实战：从0到1搭多角色协作机器人，踩遍所有坑！</title>
      <link>https://blog.hankmo.com/openclaw-multi-agent-1/</link>
      <pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/openclaw-multi-agent-1/</guid>
      <description>从0到1搭建OpenClaw多Agent协作机器人，详解工作区创建、飞书机器人配置、消息路由绑定，附完整避坑指南。main调度&#43;mr/pm/dev多角色协同工作实测。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-19] 搞定基础就想收工？别天真了！揭秘 Go 进阶路上的“九九八十一坑”</title>
      <link>https://blog.hankmo.com/posts/golang/go-basic-summary/</link>
      <pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-basic-summary/</guid>
      <description>Go 基础教程收官总结。搞定语法只是开始，真实的工程世界里还有 GMP、内存管理、并发安全等大山等你去翻越。老墨带你复盘基础坑位，规划进阶路线。</description>
    </item>
    <item>
      <title>养虾必备的 10 个 Skills，最后一个是真神</title>
      <link>https://blog.hankmo.com/openclaw-top-10-skills/</link>
      <pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/openclaw-top-10-skills/</guid>
      <description>装了 20 个 Skills，筛选出 10 个天天在用的。从安全审计到自我进化，每个都附实战场景和安装命令。最后一个 Self-Improving Agent，让你的 AI 越用越聪明。</description>
    </item>
    <item>
      <title>别再用 ls 和 cat 了！这两个工具让我的终端效率直接翻倍</title>
      <link>https://blog.hankmo.com/terminal-tools-bat-eza/</link>
      <pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/terminal-tools-bat-eza/</guid>
      <description>系统自带的 ls 和 cat 太鸡肋了。用上 bat 和 eza 这两个神器，终端体验直接拉满，每天至少省 1 小时。5 分钟装好，全平台兼容，零代码基础也能跟着做。</description>
    </item>
    <item>
      <title>不会用飞书？没关系，粉丝要的腾讯家族，他来了！手把手教你接入QQ、企业微信到OpenClaw</title>
      <link>https://blog.hankmo.com/posts/ai/20260311-%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E6%8E%A5%E5%85%A5qq%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E5%88%B0openclaw/</link>
      <pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/20260311-%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E6%8E%A5%E5%85%A5qq%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E5%88%B0openclaw/</guid>
      <description>OpenClaw 接入 QQ 实战记录：3分钟跑通，手机远程操控终端，踩坑全记录。</description>
    </item>
    <item>
      <title>OpenClaw这一套自动化流程下来，再也不需要我自己手动发图文了</title>
      <link>https://blog.hankmo.com/posts/ai/openclaw-auto-publish-wechat/</link>
      <pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/openclaw-auto-publish-wechat/</guid>
      <description>用 OpenClaw 实现了从选题到发布公众号的全自动化流程。小墨不仅会生成图片、调用 API，还能自己总结工作流程。这篇文章记录了整个系统的架构、小墨的工作流程，以及我对 AI 的新理解。</description>
    </item>
    <item>
      <title>重启 OpenClaw，结果崩溃了！</title>
      <link>https://blog.hankmo.com/posts/ai/openclaw-update-bug/</link>
      <pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/openclaw-update-bug/</guid>
      <description>OpenClaw 自动更新到最新版本后，因为飞书插件兼容性问题导致无法启动。记录了整个排查过程和解决方案，也思考了快速迭代带来的问题。</description>
    </item>
    <item>
      <title>GPT-5.4 来了，全球风靡的 OpenClaw 还能养多久？</title>
      <link>https://blog.hankmo.com/posts/ai/gpt-5-4-openclaw-future/</link>
      <pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/gpt-5-4-openclaw-future/</guid>
      <description>GPT-5.4 正式发布，原生支持桌面操作能力，直接对标 OpenClaw。作为一个每天在 Cursor 里用 GPT-5.4 预览版的开发者，我既惊叹于它的代码能力，又在思考：当大模型开始抢框架的饭碗，我们到底需要什么样的 AI 助手？</description>
    </item>
    <item>
      <title>AI 龙虾第一天就给我写了个程序，还会定时爬数据</title>
      <link>https://blog.hankmo.com/first-day-openclaw-work/</link>
      <pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/first-day-openclaw-work/</guid>
      <description>OpenClaw 上岗第一天实测：写贪吃蛇游戏、爬小红书数据、定时早报，AI 助手真的能干活了。附踩坑记录和飞书玩虾大会感悟。</description>
    </item>
    <item>
      <title>为了搞个 AI 助手，我在 Windows 上折腾了整整一天</title>
      <link>https://blog.hankmo.com/posts/ai/openclaw-windows-guide/</link>
      <pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/openclaw-windows-guide/</guid>
      <description>老墨亲测：在 Windows 上部署 OpenClaw AI 助手的完整踩坑记录，包括 PowerShell 配置、MiniMax 模型设置、飞书频道配置等</description>
    </item>
    <item>
      <title>Go这样检测Data Race让并发程序又简单了许多</title>
      <link>https://blog.hankmo.com/posts/golang/go-data-race-detector/</link>
      <pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-data-race-detector/</guid>
      <description>写并发代码最怕的不是死锁，而是那些偶尔才出现、难以复现的诡异 bug。这些 bug 的罪魁祸首往往就是 Data Race。好在 Go 提供了 Race Detector，只需加个 -race 参数，就能在开发阶段揪出这些幽灵般的并发问题。本文带你掌握 Race Detector 的使用技巧，以及 5 种最常见的 Data Race 场景和解决方案。</description>
    </item>
    <item>
      <title>2026年2月：AI狂飙的一个月，老墨的技术探索之旅</title>
      <link>https://blog.hankmo.com/posts/summary/2026-02-summary/</link>
      <pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/summary/2026-02-summary/</guid>
      <description>从本地部署DeepSeek到手撸视频下载器，从OpenClaw实战到AI开发小程序，这个2月，老墨带你见证AI如何改变开发者的工作方式</description>
    </item>
    <item>
      <title>Go模糊测试实战：让AI帮你找Bug</title>
      <link>https://blog.hankmo.com/posts/golang/go-fuzz-in-action/</link>
      <pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-fuzz-in-action/</guid>
      <description>单元测试只能测你想到的场景，模糊测试能测你没想到的。这篇文章带你用Go 1.18&#43;的原生Fuzzing功能，配合AI工具，让测试覆盖率飙升，Bug无处遁形。</description>
    </item>
    <item>
      <title>Go模块管理踩坑实录：从入门到放弃再到真香</title>
      <link>https://blog.hankmo.com/posts/golang/go-modules-practical-guide/</link>
      <pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-modules-practical-guide/</guid>
      <description>Go模块管理让你头大？依赖冲突让你抓狂？版本号看不懂？replace指令不会用？这篇文章记录了我从抵触到真香的全过程，以及那些官方文档不会告诉你的坑。</description>
    </item>
    <item>
      <title>2026 年了，这些 AI IDE 还能白嫖</title>
      <link>https://blog.hankmo.com/2026-free-ai-ide-guide/</link>
      <pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/2026-free-ai-ide-guide/</guid>
      <description>去年还在为 Cursor Pro 的 20 刀纠结，今年电脑里装了七八个 AI IDE，一个月花费：0 元。不是我抠，是免费额度真的够用。从 Cursor 到 Windsurf，从通义灵码到 Kiro，老墨亲测的白嫖攻略全在这了。</description>
    </item>
    <item>
      <title>2026马年春节，我用AI帮我写了一个嘴替小程序</title>
      <link>https://blog.hankmo.com/2026-ai-ma-zuiti/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/2026-ai-ma-zuiti/</guid>
      <description>3天时间，用AI全流程开发一个春节嘴替小程序：从产品设计、UI素材、代码实现到上线，一个人就能搞定</description>
    </item>
    <item>
      <title>大模型实战指南（2026年新春版）：深度推理与智能体的时代</title>
      <link>https://blog.hankmo.com/posts/ai/llm-2026-guide/</link>
      <pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/llm-2026-guide/</guid>
      <description>最近被朋友问麻了：“老墨，都2026年了，GPT-5到底值不值那个天价订阅费？” “Claude 4的超长记忆真的不丢包了吗？” “国产模型现在的‘推理能力’是不是真的赶上来了？”</description>
    </item>
    <item>
      <title>[GoLang避坑实战-00] 别再犹豫了！一个老码农的真心话：为什么 2026 年必学 Go</title>
      <link>https://blog.hankmo.com/why-golang/</link>
      <pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/why-golang/</guid>
      <description>Golang不仅是一门语言，更是一把通往高性能、高并发世界的钥匙。它足够简单，让你能快速上手；它又足够强大，能支撑起字节跳动、Uber、Docker这样庞大的技术体系。</description>
    </item>
    <item>
      <title>EP03 - 试图驯服一只猛兽：OpenClaw 的 Docker 监狱</title>
      <link>https://blog.hankmo.com/posts/ai/install-openclaw-in-docker/</link>
      <pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/install-openclaw-in-docker/</guid>
      <description>这就是我们在前几篇里提到的代价：**强大的能力伴随着巨大的风险。** 一个拥有 Shell 权限的 AI Agent，本质上就是一个盯着你键盘随时准备按下回车键的超级用户。在裸机 (Bare Metal) 上直接运行它，无异于把自家大门的钥匙交给一个喝醉了的锁匠。</description>
    </item>
    <item>
      <title>EP02 - 给你的电脑安装一个数字管家: 安装和搭建 OpenClaw</title>
      <link>https://blog.hankmo.com/posts/ai/install-openclaw/</link>
      <pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/install-openclaw/</guid>
      <description>很遗憾，国内的IM目前 OpenClaw 都不支持, 对于飞书、钉钉的支持据说还在开发中，所以目前我们最好的方式就是选择 Telegram. 因为它是这个星球上对开发者最友好的 IM，没有之一: 不需要手机号验证码，不需要营业执照，不需要企业认证。你只需要跟一个叫 @BotFather 的机器人聊两句，就能拿到通往 OpenClaw 的钥匙。</description>
    </item>
    <item>
      <title>EP01 - 告别 Claude Desktop：为什么我选 OpenClaw 做我的数字管家</title>
      <link>https://blog.hankmo.com/posts/ai/why-i-choose-openclaw/</link>
      <pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/why-i-choose-openclaw/</guid>
      <description>这意味着你可以躺在床上用手机发消息（支持 WhatsApp/Telegram 等等几十种聊天客户端），指挥你书房里的 Mac 干重活。这也是它的口号： “The AI that actually does things.” 我想这也是为什么他会这么大火的原因。</description>
    </item>
    <item>
      <title>为了学 AI，我用 Go &#43; Fyne 手撸了一个原生视频下载器</title>
      <link>https://blog.hankmo.com/posts/vdd/vdd-intro/</link>
      <pubDate>Wed, 04 Feb 2026 01:15:48 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/vdd/vdd-intro/</guid>
      <description>从 24 年初 Sora 横空出世，到 Claude 3.5 杀疯了，再到最近 DeepSeek 甚至能自己修 Bug，这世界变化快得像开了二倍速。以前我们卷算法、卷架构，现在倒好，不仅要卷提示词，还要防着被自己的 IDE 抢了饭碗。</description>
    </item>
    <item>
      <title>EP00 - DeepSeek R1 本地部署实战 (Mac篇)</title>
      <link>https://blog.hankmo.com/posts/ai/local-deploy-deepseek-r1/</link>
      <pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/ai/local-deploy-deepseek-r1/</guid>
      <description>别被几万块的显卡劝退。你的 MacBook Pro (Apple Silicon) 就是跑 DeepSeek R1 的神器。本文手把手教你用 Ollama 在本地跑起“满血版”推理模型，不仅免费，而且隐私绝对安全。</description>
    </item>
    <item>
      <title>Go高级教程：反射 (Reflection) 实战</title>
      <link>https://blog.hankmo.com/go-advanced-reflection/</link>
      <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/go-advanced-reflection/</guid>
      <description>反射是框架开发的灵魂。本文带你拆解 reflect 包，学会如何在运行时动态操作对象，并手撸一个简单的 JSON 序列化工具。</description>
    </item>
    <item>
      <title>Go高级教程：其他并发工具</title>
      <link>https://blog.hankmo.com/go-advanced-concurrency/</link>
      <pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/go-advanced-concurrency/</guid>
      <description>超越基础的 Goroutine &#43; Channel，掌握 sync.Pool、sync.Map、Atomic 原子操作以及如何检测数据竞争（Data Race）。</description>
    </item>
    <item>
      <title>Go高级教程：深入理解 GMP 调度器</title>
      <link>https://blog.hankmo.com/go-advanced-gmp/</link>
      <pubDate>Fri, 28 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/go-advanced-gmp/</guid>
      <description>用通俗易懂的语言，配合生动的比喻，带你深入理解 Go 语言高并发的核心秘密——GMP 调度模型。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-18] 实战 CLI 工具：30 分钟用 urfave/cli 构建你的极客武器</title>
      <link>https://blog.hankmo.com/posts/golang/dev-cli-with-urfave-cli/</link>
      <pubDate>Thu, 20 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/dev-cli-with-urfave-cli/</guid>
      <description>手撸参数解析太痛苦了，试试 urfave/cli 框架，5 分钟搞定一个专业的命令行工具。我们将以此重构之前的计算器项目，作为基础教程的完美收官。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-17] 从零撸一个计算器：基础知识的大合练</title>
      <link>https://blog.hankmo.com/posts/golang/go-project-example/</link>
      <pubDate>Mon, 10 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-project-example/</guid>
      <description>从零开始构建一个简单的 Go 命令行工具项目，演示项目结构、依赖管理与构建流程。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-16] &#34;干净利落！手把手带你搭一套企业级 Go 项目目录</title>
      <link>https://blog.hankmo.com/go-project-layout/</link>
      <pubDate>Wed, 29 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/go-project-layout/</guid>
      <description>学习 Go 社区推荐的标准项目布局，理解 internal、pkg、cmd 等目录的作用，构建清晰易维护的项目结构。</description>
    </item>
    <item>
      <title>环境变量与配置管理</title>
      <link>https://blog.hankmo.com/go-config-management/</link>
      <pubDate>Thu, 11 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/go-config-management/</guid>
      <description>掌握 Go 应用的配置管理：从简单的环境变量到强大的 Viper 配置库，学习如何让应用适应不同环境。</description>
    </item>
    <item>
      <title>模糊测试入门 (Fuzzing)</title>
      <link>https://blog.hankmo.com/go-fuzzing-intro/</link>
      <pubDate>Wed, 20 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/go-fuzzing-intro/</guid>
      <description>Go 1.18 引入的原生模糊测试功能，帮助你发现边界情况的 Bug，提升代码健壮性。</description>
    </item>
    <item>
      <title>日志管理：从 log 到 zap</title>
      <link>https://blog.hankmo.com/go-logging-guide/</link>
      <pubDate>Fri, 18 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/go-logging-guide/</guid>
      <description>全面对比 Go 语言的日志方案：标准库 log、Go 1.21 新增的 slog、以及高性能的 zap，学习如何在生产环境中正确使用日志。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-11] 万物皆 Reader：像老鸟一样玩转 Go 语言的 IO 流</title>
      <link>https://blog.hankmo.com/go-file-io-operations/</link>
      <pubDate>Thu, 19 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/go-file-io-operations/</guid>
      <description>掌握 Go 语言的文件操作：从基础的读写到高效的 bufio，从目录遍历到网络文件下载，全面理解 io.Reader 和 io.Writer 接口。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-15] Go Module 救命指南：彻底告别依赖冲突和环境混乱</title>
      <link>https://blog.hankmo.com/go-modules-intro/</link>
      <pubDate>Fri, 06 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/go-modules-intro/</guid>
      <description>深入理解 Go Modules：从 go.mod 文件结构到版本管理，从 replace 指令到私有仓库配置，掌握 Go 依赖管理的方方面面。</description>
    </item>
    <item>
      <title>GoLang教程——泛型编程入门</title>
      <link>https://blog.hankmo.com/posts/golang/go-generics-basics/</link>
      <pubDate>Sat, 22 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-generics-basics/</guid>
      <description>介绍 Go 1.18 引入的泛型（Generics）特性，包括泛型函数、泛型类型约束以及 any 关键字的使用。</description>
    </item>
    <item>
      <title>GoLang教程——Context上下文实战</title>
      <link>https://blog.hankmo.com/posts/golang/go-context-in-depth/</link>
      <pubDate>Sun, 02 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-context-in-depth/</guid>
      <description>详解 Go 标准库 Context 的核心作用，演示如何使用它来处理请求超时、取消并发任务以及传递上下文信息。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-14] 写得爽，跑得快：表格驱动测试的工程级避坑实战</title>
      <link>https://blog.hankmo.com/posts/golang/go-testing-benchmark/</link>
      <pubDate>Wed, 19 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-testing-benchmark/</guid>
      <description>别的语言测试要装一堆库，Go 直接内置 go test。单元测试、表格驱动、基准测试，全都有。老墨手把手教你写出优雅的测试代码。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-13] 标准库挖矿：这几个库包能让你少写一半代码</title>
      <link>https://blog.hankmo.com/posts/golang/go-stdlib/</link>
      <pubDate>Sun, 12 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-stdlib/</guid>
      <description>概览 Go 语言强大而丰富的标准库，精选 fmt、time、strings、encoding/json 等常用包进行演示。</description>
    </item>
    <item>
      <title>GoLang教程——并发进阶</title>
      <link>https://blog.hankmo.com/posts/golang/go-concurrency-advanced/</link>
      <pubDate>Thu, 05 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-concurrency-advanced/</guid>
      <description>深入 Go 并发编程，掌握 sync 包中的各种同步工具：WaitGroup、Mutex、RWMutex、Once、Cond，以及信号量和 errgroup 的使用。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-12] 并发初体验：Goroutine 和 Channel 真的那么神吗？</title>
      <link>https://blog.hankmo.com/posts/golang/go-concurrency-basics/</link>
      <pubDate>Tue, 19 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-concurrency-basics/</guid>
      <description>介绍 Go 语言的核心并发特性：Goroutine（协程）和 Channel（通道），以及 sync 包的基本用法。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-10] 不要 panic！Go 风格错误处理的&#34;优雅避坑&#34;指南</title>
      <link>https://blog.hankmo.com/posts/golang/go-error-handling/</link>
      <pubDate>Tue, 29 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-error-handling/</guid>
      <description>讲解 Go 语言中基于返回值的错误处理机制，以及 panic 和 recover 的异常处理流程。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-09] 接口即正义：解密 Go 语言&#34;鸭子类型&#34;的实战精髓</title>
      <link>https://blog.hankmo.com/posts/golang/go-structs-interfaces/</link>
      <pubDate>Sun, 15 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-structs-interfaces/</guid>
      <description>介绍 Go 中结构体的定义、匿名字段与嵌入，以及接口的定义与实现（鸭子类型）。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-08] 切片扩容的惨剧：为什么共享底层数组让你哭都哭不出来？</title>
      <link>https://blog.hankmo.com/posts/golang/go-array-slice-map/</link>
      <pubDate>Thu, 22 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-array-slice-map/</guid>
      <description>数组长度固定？切片会自动扩容？map 遍历顺序随机？Go 的数据结构设计简洁但强大，切片和 map 是日常开发的主力。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-07] 扔掉冗长的 if-else：Go 流程控制的&#34;极简之道&#34;</title>
      <link>https://blog.hankmo.com/posts/golang/go-control-structures/</link>
      <pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-control-structures/</guid>
      <description>Go 没有 while？switch 不用 break？if 还能初始化变量？Go 的控制结构简洁但强大，一个 for 就能搞定所有循环。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-06] 该选指针接收者吗？老墨带你一次理清函数与方法的纠葛</title>
      <link>https://blog.hankmo.com/posts/golang/go-func-method/</link>
      <pubDate>Wed, 17 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-func-method/</guid>
      <description>函数返回多个值？闭包捕获变量？defer 延迟执行？Go 的函数设计比你想的更灵活。还有方法绑定，让你的代码更优雅。</description>
    </item>
    <item>
      <title>Data Race vs Race Condition</title>
      <link>https://blog.hankmo.com/posts/tech/data-race-vs-race-condition/</link>
      <pubDate>Tue, 18 Jun 2024 00:00:10 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/data-race-vs-race-condition/</guid>
      <description>这篇文章中的所有内容都非常明确，但我发现那些比较了解的人对 Data Race 和 Race Condition 之间的区别感到非常困惑（例如，因为他们正在研究并发正确性）。甚至当人们完全清楚基本概念时，也非常容易混淆它们，他们有时会说“Race Condition”，而实际上真正的意思是“Data Race”，这让事情变得更加混乱。当然，我发现自己也在这样做。</description>
    </item>
    <item>
      <title>Golang中singleflight的实现原理</title>
      <link>https://blog.hankmo.com/posts/golang/go-singleflight-impl/</link>
      <pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-singleflight-impl/</guid>
      <description>singleflight 的实现主要依赖 sync.WaitGroup 和 sync.Mutex，利用 WaitGroup 限制并发请求数量，利用 Mutex 加锁保证并发安全性。DoChan 和 Do 方法的区别在于处理结果上，前者多了对于 chan 的管理。</description>
    </item>
    <item>
      <title>使用 Let‘S Encrypt 为您的网站申请免费证书</title>
      <link>https://blog.hankmo.com/posts/devops/letsencrypt-https/</link>
      <pubDate>Sun, 09 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/devops/letsencrypt-https/</guid>
      <description>Let&amp;#39;s Encryot 是一个免费颁发https证书的组织，它提供了 Certbot 工具方便地为我们申请、安装证书，不过它需要使用 snap 来安装，整个过程其实比较简单，完成后您的网站就可以通过 https 访问了。</description>
    </item>
    <item>
      <title>Golang中singleflight的用法</title>
      <link>https://blog.hankmo.com/posts/golang/go-singleflight/</link>
      <pubDate>Sat, 18 May 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-singleflight/</guid>
      <description>singleflight 用于抑制同一时间获取相同数据的重复请求。当存在多个重复请求时，singleflight 保证只有一个请求能执行，其他请求阻塞，直到前边的请求返回后直接将其返回值共享(shared)给阻塞的这些请求。</description>
    </item>
    <item>
      <title>Rust 学习笔记 03：函数</title>
      <link>https://blog.hankmo.com/rust-learning-03-functions/</link>
      <pubDate>Sat, 18 May 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/rust-learning-03-functions/</guid>
      <description>Rust 的函数设计不仅关乎代码组织，更深刻影响了语言的表达力。表达式与语句的区别，是理解 Rust 这一关的钥匙。</description>
    </item>
    <item>
      <title>Python教程12：列表进阶与推导式高级</title>
      <link>https://blog.hankmo.com/python-tutorial-12-list-advanced-comprehensions/</link>
      <pubDate>Sun, 28 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-12-list-advanced-comprehensions/</guid>
      <description>深入掌握列表推导式的高级技巧：嵌套推导式、条件过滤、多维列表处理，以及列表的高级操作。</description>
    </item>
    <item>
      <title>自由与梦想</title>
      <link>https://blog.hankmo.com/posts/essay/dream-and-freedom/</link>
      <pubDate>Fri, 26 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/essay/dream-and-freedom/</guid>
      <description>每个人心中都会有梦想，那就是我们最想做的事情，最想走的路，只是多数时候我们为生活所迫东奔西走，仿佛随波逐流的沙粒，被生活磨平了棱角，早就忘记了自己的梦想是什么了。“人们只有两条路，一条需要用心走，叫做梦想；另一条需要用脚走，叫做现实。”诚然，现实与梦想仿佛总是相对立的两面。对于大多数人而言，梦想往往是高不可攀的，只能深埋于心，为了生计不得不放弃梦想而从事自己并不喜欢的工作的人不计其数，为追逐梦想而奋斗此生最终获得成功的人寥寥无几。</description>
    </item>
    <item>
      <title>Python教程11：列表基础</title>
      <link>https://blog.hankmo.com/python-tutorial-11-list-basics/</link>
      <pubDate>Mon, 15 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-11-list-basics/</guid>
      <description>全面掌握Python列表：创建、访问、修改、常用方法，理解列表的强大功能和应用场景。</description>
    </item>
    <item>
      <title>Rust 学习笔记 02：变量与可变性</title>
      <link>https://blog.hankmo.com/rust-learning-02-variables/</link>
      <pubDate>Fri, 12 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/rust-learning-02-variables/</guid>
      <description>Rust 的变量默认不可变？这简直是对 Go 开发者认知的最大挑战。但习惯之后，你会发现这才是世界的真相。</description>
    </item>
    <item>
      <title>这本区块链爱好者必读作品终于迎来第三版</title>
      <link>https://blog.hankmo.com/posts/reading/mastering-bitcoin-3rd-edition/</link>
      <pubDate>Wed, 20 Mar 2024 22:50:39 +0800</pubDate>
      <guid>https://blog.hankmo.com/posts/reading/mastering-bitcoin-3rd-edition/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://blog.hankmo.com/posts/reading/fs/img.png&#34; alt=&#34;Mastering Bitcoin&#34; /&gt;
&lt;/p&gt;
&lt;p&gt;学习区块链的书籍我推荐这两本，我在&lt;a href=&#34;https://blog.hankmo.com/posts/tech/blockchain-intro/&#34; &gt;这里&lt;/a&gt;已经推荐过一次：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mastering Bitcoin&lt;/li&gt;
&lt;li&gt;Mastering Ethereum&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比特币开创了一门新的技术——区块链，而以太坊则在比特币的理念基础上进行再创新和升华，二者是近十多年来区块链技术的代表。因此，学习区块链技术，绝对离不开它们。恰好，这两本书就完全阐述了比特币和以太坊的技术。&lt;/p&gt;
&lt;p&gt;这两本书都由同一名作者编写，他是一名有十多年区块链研究经验的爱好者，两本书的传播度非常广，是学习、研究区块链技术的必读作品。&lt;/p&gt;
&lt;p&gt;《Mastering Ethereum》翻译为《精通以太坊》，目前该书可以在 github 上免费阅读，地址在&lt;a href=&#34;https://github.com/ethereumbook/ethereumbook?tab=readme-ov-file&#34; &gt;这里&lt;/a&gt;，翻译版在&lt;a href=&#34;https://github.com/inoutcode/ethereum_book&#34; &gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;《Mastering Bitcoin》中文译作《精通比特币》，本书详细介绍了比特币底层的实现逻辑，目前版本是第二版。但是随着比特币2017、2021两次的重大升级，添加了&lt;a href=&#34;https://en.bitcoin.it/wiki/Segregated_Witness&#34; &gt;隔离见证&lt;/a&gt;、Taproot、&lt;a href=&#34;https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki&#34; &gt;Schnorr签名&lt;/a&gt;等重大改进，不论是逻辑上还是技术上都有着很大的学习难度，第二版是在2017升级之前刊印的，现在未免显得有点过时了。如果你想学习比特币的底层知识，可以在&lt;a href=&#34;https://github.com/inoutcode/bitcoin_book_2nd&#34; &gt;这里&lt;/a&gt;阅读到本书的中文版。&lt;/p&gt;
&lt;p&gt;让人兴奋的是，2023年《Mastering Bitcoin》迎来了它的第三个版本，它由原作者 Andreas Antonopoulos 和另一位区块链爱好者 David Harding 联合编著，在第二版的基础上补全了这几年比特币的多个升级技术。可惜的是，本书目前还没有中文版本，但你可以直接在 github 上阅读英文版，地址在&lt;a href=&#34;https://github.com/bitcoinbook/bitcoinbook&#34; &gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;另外，为了便于阅读，我也fork了本书，编译并搭建了&lt;a href=&#34;http://bitcoinbook.hankmo.com/&#34; &gt;在线阅读网站&lt;/a&gt;，打开即可直接阅读，可以选择单页阅读整书也可以分章节阅读。&lt;/p&gt;
&lt;p&gt;区块链技术的学习是一个枯燥和费力的过程，但历史的车轮总是向前推进的，技术在进步，坚持下来者方能迎接蜕变。&lt;/p&gt;
&lt;p&gt;相关阅读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.investopedia.com/bitcoin-taproot-upgrade-5210039&#34; &gt;Bitcoin&amp;rsquo;s Taproot Upgrade: What You Should Know&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ajtowns/taproot-review&#34; &gt;https://github.com/ajtowns/taproot-review&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Python教程10：第一个实用程序</title>
      <link>https://blog.hankmo.com/python-tutorial-10-first-practical-program/</link>
      <pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-10-first-practical-program/</guid>
      <description>通过开发一个实用的文件管理工具，综合运用前面学到的所有知识，体验真实的Python开发。</description>
    </item>
    <item>
      <title>Rust 学习笔记 01：简介与环境搭建</title>
      <link>https://blog.hankmo.com/rust-learning-01-intro-setup/</link>
      <pubDate>Tue, 05 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/rust-learning-01-intro-setup/</guid>
      <description>Why Rust? Why now? 从 Go 开发者的视角，开启 Rust 的学习之旅。</description>
    </item>
    <item>
      <title>Python教程09：Python编码规范(PEP 8)</title>
      <link>https://blog.hankmo.com/python-tutorial-09-pep8-coding-standards/</link>
      <pubDate>Sat, 02 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-09-pep8-coding-standards/</guid>
      <description>掌握Python官方编码规范PEP 8，写出专业、规范、易读的Python代码，提升代码质量和团队协作效率。</description>
    </item>
    <item>
      <title>Python教程08：列表推导式入门</title>
      <link>https://blog.hankmo.com/python-tutorial-08-list-comprehensions/</link>
      <pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-08-list-comprehensions/</guid>
      <description>掌握Python最优雅的特性之一：列表推导式，让数据处理代码简洁高效，体验Pythonic编程之美。</description>
    </item>
    <item>
      <title>Python教程07：字符串深入</title>
      <link>https://blog.hankmo.com/python-tutorial-07-string-deep-dive/</link>
      <pubDate>Tue, 27 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-07-string-deep-dive/</guid>
      <description>深入掌握Python字符串：格式化方法、常用操作、切片技巧、正则表达式入门，让你成为字符串处理高手。</description>
    </item>
    <item>
      <title>Python教程06：控制流程-循环语句</title>
      <link>https://blog.hankmo.com/python-tutorial-06-loop-statements/</link>
      <pubDate>Sun, 21 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-06-loop-statements/</guid>
      <description>掌握Python的循环语句：for/while的使用、break/continue、循环else子句，让程序能够重复执行任务。</description>
    </item>
    <item>
      <title>ios如何同步obsidian笔记仓库？</title>
      <link>https://blog.hankmo.com/posts/artifact/ios-sync-obsidian/</link>
      <pubDate>Sat, 06 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/ios-sync-obsidian/</guid>
      <description>对于技术人而言，经常需要记录、整理大量的笔记内容，形成自己的知识库。现在，我基本上都是用 obsidian 来记笔记和写文章，它支持双向链接，很容易形成知识体系，而且具备丰富的插件支持，具体特性可以自己咨询网络。使用 iSH app 可以在 ios 上模拟一个 Linux 环境，并同步 git 仓库，这非常利于 obsidna 仓库的同步。配置 github 的操作稍有些麻烦，不过配置好后就很方便了。如果需要在 iPhone、iPad 上使用 obisidan 阅读、编写笔记，值得一试。</description>
    </item>
    <item>
      <title>2023年终回顾和2024新年展望</title>
      <link>https://blog.hankmo.com/posts/essay/2023-summary/</link>
      <pubDate>Tue, 02 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/essay/2023-summary/</guid>
      <description>每至年终，总慨时光飞逝，悔不该浪费光阴而不自知。欲提笔总结一年之种种，却感人生多琐事、岁月少芳华，生活不过柴米油盐酱醋茶。常人者，虽一年之大事鲜有，却亦欲略举一二。2023年，整个国际形势依旧不太妙，俄乌冲突、巴以冲突、缅甸内战，各国都在想法设法为自己牟利，战乱频发，新冠疫情之后本来就衰弱的国际经济形势更是雪上加霜。逐年变暖的气候，给我们的家园带来了严峻的挑战：火灾、洪水、泥石流、地震、台风……作为一介庶民，本该独善其身，”各人自扫门前雪，莫管他人网上霜“，然人是社会人，践行之何其难也！</description>
    </item>
    <item>
      <title>又一个大佬辞世，技术人该何去何从？</title>
      <link>https://blog.hankmo.com/posts/essay/programmer-soft-skills/</link>
      <pubDate>Wed, 27 Dec 2023 15:54:54 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/essay/programmer-soft-skills/</guid>
      <description>陈皓，网名左耳朵耗子，技术圈亲切地称他为“耗子叔”、“皓哥”，是一位资深技术大咖、骨灰级程序员，前阿里云资深架构师、天猫开发总监、亚马逊高级研发经理、汤森路透基础架构师和高级研发经理，他的博客酷壳每篇文章的阅读量高达数十万，其发布的专栏课程购买量也近20万，可见其影响力惊人！然而，这位技术大佬在2023年5月13日因心梗而与世长辞，享年47岁。英年早逝，无不令听者痛心、见者流泪！我很早都在拜读他的文章了，其博文范围广泛，涉及架构、技术、管理、生活方方面面，其文风犀利、见解独到、个性鲜明，每每读之均令人深受启发。这位技术传道者除了爱写作、爱分享，而且还一直处于不断学习、提升自己的状态，其生前博客还发表着GoLang、Rust、区块链等等技术的文章，实乃吾辈之楷模！</description>
    </item>
    <item>
      <title>Python教程05：控制流程-条件语句</title>
      <link>https://blog.hankmo.com/python-tutorial-05-conditional-statements/</link>
      <pubDate>Wed, 06 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-05-conditional-statements/</guid>
      <description>掌握Python的条件语句：if/elif/else的使用、嵌套条件、三元表达式，让程序能够做出决策。</description>
    </item>
    <item>
      <title>Python教程04：运算符</title>
      <link>https://blog.hankmo.com/python-tutorial-04-operators/</link>
      <pubDate>Mon, 04 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-04-operators/</guid>
      <description>全面掌握Python的各类运算符：算术、比较、逻辑、位运算、成员运算符，以及运算符的优先级。</description>
    </item>
    <item>
      <title>Python教程03：数据类型基础</title>
      <link>https://blog.hankmo.com/python-tutorial-03-data-types-basic/</link>
      <pubDate>Mon, 20 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-03-data-types-basic/</guid>
      <description>深入理解Python的基础数据类型：整数、浮点数、字符串、布尔值，以及类型转换的技巧。</description>
    </item>
    <item>
      <title>Python教程02：基础语法</title>
      <link>https://blog.hankmo.com/python-tutorial-02-basic-syntax/</link>
      <pubDate>Fri, 10 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-02-basic-syntax/</guid>
      <description>掌握Python的基础语法：注释、缩进、变量命名规则、输入输出，为后续学习打下坚实基础。</description>
    </item>
    <item>
      <title>Python教程01：Python简介与环境搭建</title>
      <link>https://blog.hankmo.com/python-tutorial-01-intro-and-setup/</link>
      <pubDate>Wed, 18 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/python-tutorial-01-intro-and-setup/</guid>
      <description>Python从零开始第一课：了解Python是什么，为什么要学Python，以及如何在你的电脑上搭建Python开发环境。</description>
    </item>
    <item>
      <title>Redis集群中的 CROSSSLOT Keys Error</title>
      <link>https://blog.hankmo.com/posts/devops/redis-cluster-crossslot-err/</link>
      <pubDate>Tue, 17 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/devops/redis-cluster-crossslot-err/</guid>
      <description>Redis集群环境中，使用HashSlot来决定分为key到那个节点，相同hash的key会存储到相同节点。在进行多键操作时，这些key必须位于同一个节点上，也就是hashslot必须相同，可以通过HASHTAG来设计这些需要多键操作的key。</description>
    </item>
    <item>
      <title>Nginx Bad Gateway和no live upstreams错误分析</title>
      <link>https://blog.hankmo.com/posts/devops/nginx-bad-gateway-no-live-upstreams/</link>
      <pubDate>Sat, 07 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/devops/nginx-bad-gateway-no-live-upstreams/</guid>
      <description>Nginx返回 `502 Bad Gateway` 时，注意观察其错误日志，通过日志来分析是请求超时或服务不可用导致的，如果输出 `no live upstreams while connecting to upstream` 说明并发请求量大，Nginx将服务下线后仍有请求被转发到下线服务，也可能是服务资源紧缺导致响应不及时，超时后所致。适当的增加 `max_fails` 参数可以有效避免由于极端情况服务被下线造成 `502` 问题。</description>
    </item>
    <item>
      <title>依赖注入库wire使用入门</title>
      <link>https://blog.hankmo.com/posts/golang/wire-use-guide/</link>
      <pubDate>Sun, 06 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/wire-use-guide/</guid>
      <description>依赖注入（Dependency injection）不是一个新概念了，早在2004年 Martin Fowler 就在其文章Inversion of Control Containers and the Dependency Injection pattern提出了依赖注入模式。在Java的世界中，随处可见依赖注入的使用，如Spring框架的核心之一就是控制反转(IoC)，而依赖注入就是 IoC 思想的一种技术实现，比如我们常用的 Spring 的注解 @Autowire，还有 Jsr250 规范定义的 @Resource 注解都实现了依赖注入。</description>
    </item>
    <item>
      <title>(译)Go1.13中处理错误</title>
      <link>https://blog.hankmo.com/posts/golang/go-err-113/</link>
      <pubDate>Fri, 05 May 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-err-113/</guid>
      <description>在过去的十年中，Go 将错误作为值来处理 ，这对我们很有帮助。尽管标准库对错误的支持很少 —— 只有 `errors.New` 和 `fmt.Errorf` 函数，它们产生的错误只包含一条消息 —— 内置 `error` 接口允许 Go 程序员添加他们想要的任何信息。它所需要的只是一个实现 `Error` 方法的类型</description>
    </item>
    <item>
      <title>(译)Go错误是值</title>
      <link>https://blog.hankmo.com/posts/golang/go-err-handle/</link>
      <pubDate>Sun, 30 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-err-handle/</guid>
      <description>一直以来，人们觉得一定有什么地方出了问题，而明显的目标就是 Go 本身。这是不幸的、误导性的，而且很容易纠正。也许刚接触 Go 的程序员会问，“我该如何处理错误？”，然后学习这种模式，最后就此打住。在其他语言中，可能会使用 try-catch 块或其他类似机制来处理错误。因此，程序员认为，我在我的旧语言中可以使用 try-catch 时，但在 go 中我只能输入 `if` `err` `!=` `nil` 来处理错误。随着时间的推移，Go 代码收集了许多这样的片段，结果感觉很笨拙。</description>
    </item>
    <item>
      <title>(译)Go模块：管理依赖项</title>
      <link>https://blog.hankmo.com/posts/golang/go-mod/</link>
      <pubDate>Wed, 19 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-mod/</guid>
      <description>当您的代码使用外部包时，这些包（作为模块分发）成为依赖项。随着时间的推移，您可能需要升级或更换它们。Go 提供了依赖管理工具，可帮助您在合并外部依赖项时确保 Go 应用程序的安全。本文介绍如何执行一些任务来管理您代码中的依赖项，您可以使用 Go tools 执行其中的大部分操作。本主题还介绍了如何执行其他一些您可能会觉得有用的依赖相关任务。</description>
    </item>
    <item>
      <title>(译)Rob Pike 带你深入理解 Go 字符串：字节、符文与 Unicode 编码</title>
      <link>https://blog.hankmo.com/posts/golang/go-unicode/</link>
      <pubDate>Sat, 25 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-unicode/</guid>
      <description>深入解析 Go 字符串的内部机制，理解字节、字符和符文的区别，掌握 Unicode 和 UTF-8 编码，以及字符串操作的最佳实践。本文翻译自 Rob Pike 的经典文章。</description>
    </item>
    <item>
      <title>(译)Go创造者Rob Pike带你深入了解数组、切片和字符串 底层的 “append” 原理</title>
      <link>https://blog.hankmo.com/posts/golang/go-slice/</link>
      <pubDate>Thu, 09 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-slice/</guid>
      <description>要了解切片是如何工作的，有助于了解它们是如何实现的。有一个小数据结构，即切片头，即与切片变量关联的项，该头描述了单独分配的数组的一部分。当我们传递切片值时，标头会被复制，但它指向的数组始终是共享的。一旦您了解它们的工作原理，切片不仅易于使用，而且功能强大且富有表现力，尤其是在内置函数 `append`、`copy` 的帮助下。</description>
    </item>
    <item>
      <title>(译)进入Go模糊测试的世界</title>
      <link>https://blog.hankmo.com/posts/golang/go-fuzz-guide/</link>
      <pubDate>Mon, 19 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-fuzz-guide/</guid>
      <description>本教程介绍了 Go 中模糊测试的基础知识。模糊测试会针对您的测试准备一些随机数据然后运行测试时使用它们，以尝试找出漏洞或导致崩溃的输入。可以通过模糊测试发现的一些漏洞示例包括 SQL 注入、缓冲区溢出、拒绝服务和跨站点脚本攻击(XSS)。</description>
    </item>
    <item>
      <title>(译)初始Go模糊测试</title>
      <link>https://blog.hankmo.com/posts/golang/go-fuzz/</link>
      <pubDate>Wed, 26 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-fuzz/</guid>
      <description>Fuzzing 是一种自动化测试，它不断地操纵程序的输入以查找错误。Go fuzzing 使用覆盖率指导来智能地不断重复执行模糊测试的代码，以发现并向用户报告问题。由于它可以覆盖人类经常错过的边缘情况，因此模糊测试对于发现安全漏洞特别有价值。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-05] 玩转 iota：优雅定义常量的黑科技，你真的会用吗？</title>
      <link>https://blog.hankmo.com/posts/golang/go-const/</link>
      <pubDate>Sat, 10 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-const/</guid>
      <description>写枚举还在 0、1、2、3 手动递增？Go 的 iota 能让你少写一半代码。还有无类型常量这个设计，直接省掉类型转换的麻烦。C 语言常量那些坑，Go 全给你填上了。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-04] 变量也玩&#34;躲猫猫&#34;？揭秘 Go 类型系统里那些隐蔽的坑</title>
      <link>https://blog.hankmo.com/posts/golang/go-var/</link>
      <pubDate>Tue, 02 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-var/</guid>
      <description>深入理解 Go 语言的变量声明、基本数据类型、常量与 iota、指针操作，以及变量作用域和命名规范。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-03] 专业选手的养成：用 golangci-lint 直抵企业级代码规范</title>
      <link>https://blog.hankmo.com/posts/golang/go-style/</link>
      <pubDate>Sat, 30 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-style/</guid>
      <description>Go作为编程语言中的后起之秀，在语言规范上吸收了诸多语言的优点，并形成了自身独特的语言风格。本文探讨一下Go语言的代码风格，并与后端语言中的老大哥Java做一些风格方面的比较。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-02] 初识 Go：除了高并发，它还有哪些让你尖叫的特性？</title>
      <link>https://blog.hankmo.com/posts/golang/go-intro/</link>
      <pubDate>Thu, 21 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-intro/</guid>
      <description>Go语言是最近几年发展最快、最火热的编程语言之一，由 google 公司出品，其学习成本低、天生支持高并发、语法简洁高效、强大的标准库以及日益丰富的生态特细等特性使得其非常适合开发后端服务程序，并逐渐挑战着 Java 在服务端编程语言中的领导地位。Go 语言的前身被认为是一种名为 Limbo 的编程语言，它是由 Unix 之父、C语言之父肯·汤普逊和丹尼斯·里奇这两位计算机灵魂人物领衔并在一个名为 Plan 9 的的操作系统研究项目中发明的。</description>
    </item>
    <item>
      <title>(译)Go并发模式——Context</title>
      <link>https://blog.hankmo.com/posts/golang/go-context/</link>
      <pubDate>Tue, 19 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/golang/go-context/</guid>
      <description>在Go服务器中，每个传入的请求都在其自己的 goroutine 中处理。请求处理程序通常会启动额外的 goroutine 来访问数据库和 RPC 服务等后端。处理请求的一组 goroutine 通常需要访问特定于请求的值，例如最终用户的身份、授权令牌和请求的截止日期。当请求被取消或超时时，所有处理该请求的 goroutines 都应该快速退出，以便系统可以回收它们正在使用的任何资源。</description>
    </item>
    <item>
      <title>以太坊入门之交易</title>
      <link>https://blog.hankmo.com/posts/tech/eth-tx/</link>
      <pubDate>Sat, 16 Jul 2022 21:45:50 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/eth-tx/</guid>
      <description>什么是交易？交易是由外部账户发起的经过签名的消息，经过区块链网络传播，由矿工打包记录到区块链上。简单而言，交易就是记录在&amp;#34;超级账本&amp;#34;中的每一笔消息，如收入、支出、转账，此外，合约创建以及涉及资金出入的合约方法调用等都是交易。区块链中涉及状态改变的操作，都是通过交易实现的。</description>
    </item>
    <item>
      <title>[GoLang避坑实战-01] Go 1.24 安装排雷指南：拒绝被&#34;环境变量&#34;折磨</title>
      <link>https://blog.hankmo.com/golang-environment-setup/</link>
      <pubDate>Sun, 10 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/golang-environment-setup/</guid>
      <description>别急着写代码！先把环境搞对，避免踩坑。老墨手把手教你配置 Go 开发环境，选对版本，一次搞定。</description>
    </item>
    <item>
      <title>以太坊入门之MetaMask钱包的安装和使用</title>
      <link>https://blog.hankmo.com/posts/tech/metamask-guide/</link>
      <pubDate>Sat, 11 Jun 2022 21:45:36 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/metamask-guide/</guid>
      <description>区块链中，与用户直接相关的一个重要组件是钱包。用户通过钱包来访问链上的资金、查看账户地址、转账交易等操作。可以说，没有钱包，用户就不能正常访问链上资金，可见其重要程度。而诸多钱包中，MetaMask是一款可以直接在浏览器中使用的、实现了钱包标准 BIP-39 的钱包，也是大多数使用者选择的入门级钱包。</description>
    </item>
    <item>
      <title>什么是以太坊</title>
      <link>https://blog.hankmo.com/posts/tech/ethereum-intro/</link>
      <pubDate>Mon, 09 May 2022 23:20:45 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/ethereum-intro/</guid>
      <description>以太坊是一个去中心化的、开源的、图灵完备的、有智能合约功能的区块链开放平台。作为开放平台和&amp;#34;世界超级计算机&amp;#34;，以太坊以智能合约为核心为去中心化应用(DApp)建设提供了整套解决方案。这一篇我们将详细介绍什么是以太坊。</description>
    </item>
    <item>
      <title>什么是区块链</title>
      <link>https://blog.hankmo.com/posts/tech/blockchain-intro/</link>
      <pubDate>Sun, 17 Apr 2022 21:45:50 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/blockchain-intro/</guid>
      <description>区块链是这几年非常火热的一个话题，越来越多的人加入到”区块“大军之中。他们其中一些人，积极投入到挖矿、炒币行列之中，甚至发行自己的数字货币来创收，这部分人社称之为”币圈“；另一部分人，深入探究区块链底层技术，期望不断改进并将区块链技术运用到更多领域中，这部分人社称之为”链圈“。越来越多的人积极群涌入区块链，游弋于“币圈&amp;#34;和&amp;#34;链圈&amp;amp;quot;之间，忙的不亦乐乎。本文将简单介绍区块链的一些入门知识，并介绍区块链开发所需要具备的基础知识，希望对准备进入区块链的开发者们会有一些帮助。</description>
    </item>
    <item>
      <title>Typora For Mac、Windows破解版和免费版下载</title>
      <link>https://blog.hankmo.com/posts/artifact/typora-crack-download/</link>
      <pubDate>Thu, 14 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/typora-crack-download/</guid>
      <description>Typora是一个所见即所得(WYSIWYG)的markdown编辑器，由于其快捷、方便，并且配备强大的快捷键来快速编写markdown文档，一经发布就深受大批用户（尤其是程序猿）的喜爱，也是迄今为止我用过的最好用的markdown编辑器了！</description>
    </item>
    <item>
      <title>读《Java并发》— Java内存模型</title>
      <link>https://blog.hankmo.com/posts/tech/jcip-jmm/</link>
      <pubDate>Mon, 28 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/jcip-jmm/</guid>
      <description>这一章称为&amp;#34;对象的共享&amp;#34;，书中重点介绍了如何共享和发布对象，这两章是并发编程中非常基础却很重要的部分。在本章，首先介绍了什么是可见性问题，然后介绍了Java内存模型，讨论什么是内存可见性以及java保证内存可见性的方式，在此基础上介绍如何设计线程安全的对象，如何使用线程封闭技术和设计不可变对象来避免同步，最后再重点探讨如何安全地发布对象。由于内容较多，我将这一章分为两篇来阐述自己对本章的理解，这是上篇。Java的并发机制基于共享内存，要理解对象间的共享关系，则离不开对象间的内存关系，这涉及到本章要介绍的一个重要概念：Java内存模型，又称 JMM。</description>
    </item>
    <item>
      <title>读《Java并发》— 线程安全性</title>
      <link>https://blog.hankmo.com/posts/tech/jcip-concurrency-thread-safety/</link>
      <pubDate>Tue, 25 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/jcip-concurrency-thread-safety/</guid>
      <description>并发编程会带来诸多挑战，最基本的就是 *线程安全性*，但这又是一个非常复杂的主题。这一章重点介绍了什么是线程安全性、原子性、竞态条件等概念，以及在Java中如果通过加锁来确保线程安全性。要理解什么是线程安全性，必须先明白什么是正确性，因为正确性是线程安全性的核心概念。正确性的含义是，某个类的行为与其规范完全一致。这个定义从静态视角出发强调了类的规范重要性。通常，我们不会定义类的详细规范，但是我们应该为类和方法提供文档注释，来说明类是否是线程安全的，以及对于线程安全性如何保证。尤其在方法上，应该明确规定该方法是否已经保证了线程安全，调用者是否应该在同步机制内调用该方法等等。</description>
    </item>
    <item>
      <title>读《Java并发》— 并发简史</title>
      <link>https://blog.hankmo.com/posts/tech/jcip-concurrency-intro/</link>
      <pubDate>Sat, 22 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/jcip-concurrency-intro/</guid>
      <description>这一章主要讲述线程的发展历史，以及并发编程带来的优势和挑战。1946年第一台计算机诞生，一直到20世纪50年代中期，这时候的计算机没有操作系统的概念，采用手工操作的方式工作，每次只能有一个人使用计算机。此时的手工操作方式，用户独占全机，昂贵的计算机资源得不到充分利用。后来，随着计算机的发展，出现了批处理系统、多道程序系统，它们都提升了计算机的资源利用率。1961年，分时系统（Time Sharing System）出现，此时的一台计算机可以供多个用户终端同时连接并使用，就好像自己在独占计算机一样。分时系统将CPU的运行时间分成很短的时间片，按时间片分配给不同的连接终端使用，这充分利用了计算机资源，看起来就好像多个用户在同时使用计算机一样。</description>
    </item>
    <item>
      <title>多线程活跃性——哲学家就餐问题及死锁</title>
      <link>https://blog.hankmo.com/posts/tech/deadlock/</link>
      <pubDate>Thu, 20 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/deadlock/</guid>
      <description>死锁是多线程编程中最常见的一种&amp;#34;活跃性问题&amp;#34;，除了死锁还包括&amp;#34;饥饿&amp;#34;和&amp;#34;活锁&amp;#34;，这些活跃性问题给并发编程带来极大的挑战。比如出现死锁时，定位和分析问题相对困难，一旦出现死锁，通常只能重启应用程序。本文通过死锁最经典的&amp;#34;哲学家就餐问题&amp;#34;来介绍死锁的产生原因和解决办法。死锁指的是多个线程相互等待彼此而进入永久暂停状态。比如，线程 T1 持有锁 L1 去申请锁 L2，但是线程 T2 持有锁 L2 申请锁 L1，此时它们都在等待对象释放锁，从而进入永久阻塞状态。这就好比两个小朋友，他们各有一个玩具，但都不愿意分享给对方，却希望获得对方的玩具，最终互不相让，只能彼此干瞪眼了。</description>
    </item>
    <item>
      <title>读《Java并发》— 简介</title>
      <link>https://blog.hankmo.com/posts/tech/jcip-book-intro/</link>
      <pubDate>Thu, 20 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/jcip-book-intro/</guid>
      <description>《Java并发编程实战》是 Brian Goetz 等 6 位 Java 大师合著的介绍 Java 并发编程的经典著作，这部名著由浅入深的介绍了 Java 并发编程的诸多知识，是一本完美的Java并发参考手册，豆瓣评分 9.0，可见其受欢迎程度。《Java并发编程实战》从并发性和线程安全性的基本概念出发，介绍了如何使用类库提供的基本并发构建块，用于避免并发危险、构造线程安全的类及验证线程安全的规则，如何将小的线程安全类组合成更大的线程安全类，如何利用线程来提高并发应用程序的吞吐量，如何识别可并行执行的任务，如何提高单线程子系统的响应性，如何确保并发程序执行预期任务，如何提高并发代码的性能和可伸缩性等内容，最后介绍了一些高级主题，如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。</description>
    </item>
    <item>
      <title>Java设计模式(24)-职责链模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-chainofresp-pattern/</link>
      <pubDate>Mon, 17 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-chainofresp-pattern/</guid>
      <description>您有没有遇到各种需要走流程的事情？比如，请假申请，假设公司规定，3天以内的请假申请组长可以直接审批，而4到7天的请假申请必须要让部门经理来审批了，超过7天的请假申请只能由公司总经理来审批。类似的场景还有很多，尤其在工作流中，比如物资审批、报账审批、资金审批等等……</description>
    </item>
    <item>
      <title>Java设计模式(23)-备忘录模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-memento-pattern/</link>
      <pubDate>Wed, 12 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-memento-pattern/</guid>
      <description>中国有句古话：&amp;#34;千金难买后悔药&amp;#34;。生活中很多时候，我们做过了的事情，虽然后悔，却无济于事。但是，在软件世界，我们却可以自己制作&amp;#34;后悔药&amp;#34;。比如，以前玩&amp;#34;仙剑&amp;#34;，每每遇到Boss战，那必须要存档的，就算没打过也可以恢复存档再来一次，否则，玩过的人都知道，哭去吧……这里的游戏存档，就会用到今天说的——备忘录模式。</description>
    </item>
    <item>
      <title>Java设计模式(22)-迭代器模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-iterator-pattern/</link>
      <pubDate>Tue, 11 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-iterator-pattern/</guid>
      <description>生活中，存在这样的场景：需要逐个遍历一堆对象，然后判断对象是否符合要求，做出相应的处理。例如，乘火车时，检票员站在门口挨个检票，没有买票的人不能乘车。类似的场景还有很多，比如乘地铁、乘公交、从书架上找书、食堂排队打饭等等…… 我们把需要逐个遍历的这一堆对象称为对象集合，把挨个遍历的过程称为迭代。迭代时，如果能将迭代过程从对象集合中抽取出来单独实现，让对象集合只负责管理自身状态，而不用负担迭代的任务，这就减轻了对象集合的职责，这就是今天要说的——迭代器模式。</description>
    </item>
    <item>
      <title>Java设计模式(21)-中介者模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-mediator-pattern/</link>
      <pubDate>Sat, 08 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-mediator-pattern/</guid>
      <description>如果您有租房的经历，那么您对中介并不陌生。租房时，我们先去房屋租赁中介登记，告诉它您的租房需求，然后中介会按照您的要求为您筛选适合的房子。房子确定后，您会与中介签订租赁合同，缴纳费用，然后拿到钥匙……整个过程中，所有事项都由中介一手包办，入住以后房屋有任何问题，您都直接去找中介，您甚至可能并不知道房东是谁。这就是我们今天要说的模式——中介者模式。</description>
    </item>
    <item>
      <title>Java设计模式(20)-观察者模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-observer-pattern/</link>
      <pubDate>Thu, 06 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-observer-pattern/</guid>
      <description>很快又到年底了，一年一度的春节除了可以享受愉快地享受假期之外，每年的&amp;#34;春节联欢晚会&amp;#34;也是让人倍感期待。然而，大多数人都没能坐在电视机跟前等着它的开始，有的人在厨房忙着准备丰富的食物，有的在一起打麻将、玩牌，还有的可能在玩电脑游戏……大家都想看晚会，于是派出一个小朋友，告诉他：&amp;#34;如果晚会开始了，你要立刻来通知我们哦！&amp;#34;虽然，大家就可以继续做自己的事情，小朋友就坐在电视跟前，当晚会开始的时候，他就立即跑去挨个通知大家……</description>
    </item>
    <item>
      <title>2021过去了，我都干了些啥？</title>
      <link>https://blog.hankmo.com/posts/essay/2021-summary/</link>
      <pubDate>Mon, 03 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/essay/2021-summary/</guid>
      <description>2021年又过去了，不得不让人感叹岁月如梭、光阴似箭！正值元旦假期，刚好有时间梳理一下这过去一年的种种，思来想去，还是不过&amp;#34;平凡&amp;#34;二字罢了。每年的年底，我都会做一下年终总结，也定制一下新的一年的计划。现在回过头去看，发现去年的计划完成度也只有40%，很多事情还是没有能够完成。一方面，计划可能定得过高，完成起来有一定的难度；另一方面，自身的自制力还有待提高，很多事情没有能够坚持去完成；再者，诸如读书这样的事情，如果阅读了但是没有去理解、梳理和总结，还是很难形成系统的经久不忘的知识。</description>
    </item>
    <item>
      <title>什么是时序攻击Timing Attack</title>
      <link>https://blog.hankmo.com/posts/tech/timing-attach/</link>
      <pubDate>Thu, 30 Dec 2021 11:30:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/timing-attach/</guid>
      <description>最近在维护一个老项目的时候，看到一段密码匹配的代码，感觉很奇怪，于是遍寻资料，最终还是很有收获。在密码学中,时序攻击是一种侧信道攻击,攻击者试图通过分析加密算法的时间执行来推导出密码。每一个逻辑运算在计算机需要时间来执行,根据输入不同,精确测量执行时间,根据执行时间反推出密码。</description>
    </item>
    <item>
      <title>Java反射之AnnotatedType接口</title>
      <link>https://blog.hankmo.com/posts/tech/reflect-annotated-type/</link>
      <pubDate>Thu, 25 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/reflect-annotated-type/</guid>
      <description>JDK1.8注解可以标注在任何类型上，获取注解的方式也随之扩展了。AnnotatedType 接口的目的在于获取泛型类型上的注解，包括泛型参数、通配符、上下边界等，前提是目标元素声明了泛型类型并且标注了注解，否则其 getType 方法将返回原始类型。</description>
    </item>
    <item>
      <title>Java反射之获取注解的AnnotatedElement接口</title>
      <link>https://blog.hankmo.com/posts/tech/annotated-element/</link>
      <pubDate>Sun, 21 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/annotated-element/</guid>
      <description>AnnotatedElement接口是用于反射获取注解的顶层接口，其api获取的注解与注解的存在形式息息相关，注解有四中存在形式：直接存在、间接存在、存在和关联。这几种注解存在的形式的出现原因，一方面是由于注解可以通过继承关系传递，另一方面是Java提供了定义可重复注解的功能。</description>
    </item>
    <item>
      <title>Java反射之获取泛型类定义的具体类型</title>
      <link>https://blog.hankmo.com/posts/tech/generic-actualtype/</link>
      <pubDate>Mon, 15 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/generic-actualtype/</guid>
      <description>很多时候，我们需要获取到泛型类上定义的具体类型，从而完成一些业务逻辑。比如，最常见的情景就是JSON的反序列化，需要将JSON字符串反序列化为泛型的具体类型，比如反序列化为 `List&amp;lt;User&amp;gt;`，这就要求每一个 `List` 中的元素都是 `User` 对象。那么，如何获取到泛型类上定义的具体类型呢？这就是本文要阐述的内容。</description>
    </item>
    <item>
      <title>Java反射之表示所有类型的Type接口</title>
      <link>https://blog.hankmo.com/posts/tech/type-components/</link>
      <pubDate>Sun, 14 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/type-components/</guid>
      <description>Type接口是JDK1.5新增的表示Java所有类型的接口，它有5个组件，除了Java的类、接口的原始类型可以用Class来描述，其他的几个组件都是用来描述泛型类型的，分别是描述整个泛型的ParameterizedType、描述泛型类型变量的TypeVariable、描述泛型通配符的WildcardType，以及描述泛型数组的GenericArrayType。</description>
    </item>
    <item>
      <title>Java反射之创建泛型数组</title>
      <link>https://blog.hankmo.com/posts/tech/reflect-generic-array/</link>
      <pubDate>Wed, 10 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/reflect-generic-array/</guid>
      <description>泛型是编译期特性，我们能否创建泛型数组呢？通过 `Array` 类，除了可以动态的获取和设置数组的元素，还可以动态创建类型安全的数组。</description>
    </item>
    <item>
      <title>Java反射的体系结构</title>
      <link>https://blog.hankmo.com/posts/tech/reflect-class/</link>
      <pubDate>Tue, 09 Nov 2021 11:15:48 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/reflect-class/</guid>
      <description>反射是JDK5推出的非常重要的特性，通过反射，开发者可以在运行时动态的创建类实例，获取、更改、调用类的相关信息、方法等。反射也是各大框架使用的主要技术，如知名的Spring framework框架。</description>
    </item>
    <item>
      <title>MindManager windows 2020中文版本下载，带正版激活码</title>
      <link>https://blog.hankmo.com/posts/artifact/mindmanager-2020-crack/</link>
      <pubDate>Wed, 14 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/mindmanager-2020-crack/</guid>
      <description>MindManger是Mindjet公司开发一款思维导图软件，目前已经更新到了2021版本。与其他几大思维导图软件相比，个人最钟爱MindManger，因为他功能更强大、界面更友好，支持强大的备注体系，插图片、查表格都可以，可以直接用来做知识体系整理，非常方便。</description>
    </item>
    <item>
      <title>Java设计模式(19)-状态模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-state-pattern/</link>
      <pubDate>Tue, 22 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-state-pattern/</guid>
      <description>状态模式建议为对象的所有可能状态新建一个类， 然后将所有状态的对应行为抽取到这些类中。当控制一个对象的状态转换条件过于复杂时，就可以将判断逻辑转移到状态类中，以简化复杂的判断逻辑。</description>
    </item>
    <item>
      <title>Expert One-on-One J2EE Development without EJB中文版PDF下载</title>
      <link>https://blog.hankmo.com/posts/reading/expert-j2ee-without-ejb/</link>
      <pubDate>Tue, 15 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/reading/expert-j2ee-without-ejb/</guid>
      <description>你的J2EE项目是否耗费了你太多的时间？它们是否难以调试？它们是否效率不彰？也许你还在使用传统的J2EE方案，然而这种主案太过复杂，而且并非真正面向对象。这里的很多问题都与EJB有关：EJB是一种复杂的技术，但它没有兑现自己曾经的承诺。</description>
    </item>
    <item>
      <title>Java设计模式(18)-命令模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-command-pattern/</link>
      <pubDate>Mon, 14 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-command-pattern/</guid>
      <description>命令模式的定义：将一个请求封装为一个对象，从而可以用不同的请求对客户进行参数化，并且可以对请求排队或记录日志，还支持可以撤销的操作。</description>
    </item>
    <item>
      <title>Java设计模式(17)-策略模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-strategy-pattern/</link>
      <pubDate>Mon, 07 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-strategy-pattern/</guid>
      <description>策略模式(Strategy Pattern)，定义了一系列算法，并将他们封装起来，让他们之间可以相互替换，并且不影响使用这些算法的客户。</description>
    </item>
    <item>
      <title>Java设计模式(16)-模板方法模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-template-method-pattern/</link>
      <pubDate>Thu, 27 May 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-template-method-pattern/</guid>
      <description>模板方法模式，其核心思想是：定义一个操作中的算法骨架，而将算法的一些步骤延迟到子类中，使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。</description>
    </item>
    <item>
      <title>HTTP权威指南中文高清版PDF下载</title>
      <link>https://blog.hankmo.com/posts/reading/http-authority-guide-pdf-download/</link>
      <pubDate>Mon, 12 Apr 2021 17:18:30 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/reading/http-authority-guide-pdf-download/</guid>
      <description>HTTP是Web的基础，这里所说的Web，不仅只是通常意义上的Browser/Server端的开发，而是Web Service。大多数人对HTTP的了解也就是这种程度了(没有读此书之前的我也是这样)。此书的意义在于，它让你知道，HTTP不仅只有一个简单的GET，HTTP可以做为一种通用的分布式编程的协议。现如今Web上大行其道的所谓Restful Web Service，其基础就是HTTP，而提出Rest这个概念的Roy Fielding，也是HTTP协议(RFC2616)的主要作者之一。</description>
    </item>
    <item>
      <title>IntelliJ IDEA 2020.3.x激活教程</title>
      <link>https://blog.hankmo.com/posts/artifact/intellij-idea-2020.2-crack/</link>
      <pubDate>Sat, 27 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/intellij-idea-2020.2-crack/</guid>
      <description>IntelliJ IDEA作为Java界IDE神一般的存在，深受广大java开发者的喜欢。目前官方最新版本为2020.3，本文介绍如何对其进行激活。</description>
    </item>
    <item>
      <title>Java设计模式(15)-代理模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-proxy-pattern/</link>
      <pubDate>Thu, 31 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-proxy-pattern/</guid>
      <description>什么是代理？代理就是中介，它提供与服务提供方相同或者相似的功能，客户不再直接面对服务提供方，而是先找代理，再由代理去与服务提供方交互完成功能。现实生活中，有很多代理的例子，比如前边提到的外卖订餐，外卖小哥就是一个代理角色；又如，购买火车票，火车票代售点就是一个代理角色，用户直接可以去代售点购买车票；再如，各种中介所，如婚姻中介所、房产中介等等，都是代理。</description>
    </item>
    <item>
      <title>Java设计模式(14)-享元模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-flyweight-pattern/</link>
      <pubDate>Mon, 21 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-flyweight-pattern/</guid>
      <description>享元模式，&amp;#34;享&amp;#34;即共享，&amp;#34;元&amp;#34;即元素，软件中则为对象，享元就是共享对象之意。这种设计模式用来共享对象而不是大量创建对象，以节约系统资源。</description>
    </item>
    <item>
      <title>Java设计模式(13)-外观模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-facade-pattern/</link>
      <pubDate>Tue, 08 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-facade-pattern/</guid>
      <description>外观模式（Facade Pattern），也叫门面模式，是一种经常被使用的结构性设计模式。DP对其定义如下：通过为多个复杂的子系统提供一个一致的接口，而使这些子系统更加容易被访问。</description>
    </item>
    <item>
      <title>Java设计模式(12)-组合模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-composite-pattern/</link>
      <pubDate>Mon, 07 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-composite-pattern/</guid>
      <description>组合模式（Composite Pattern），将对象组合成树形结构以表示**&amp;#34;部分-整体&amp;#34;**的层次结构，使得用户对单个对象和组合对象的使用具有一致性。</description>
    </item>
    <item>
      <title>Java设计模式(11)-装饰模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-decorator-pattern/</link>
      <pubDate>Thu, 05 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-decorator-pattern/</guid>
      <description>在不改变现有对象结构的情况下，动态地给该对象增加一些职责（即增加其额外功能）的模式称为装饰模式。装饰模式属于一种结构型模式，它比继承更灵活。</description>
    </item>
    <item>
      <title>Java设计模式(10)-桥接模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-bridge-pattern/</link>
      <pubDate>Wed, 04 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-bridge-pattern/</guid>
      <description>桥接模式（Bridge Pattern）的定义如下：将抽象部分与它的实现部分分离，使他们都可以独立变化。抽象化角色、实现化角色将桥接模式结构分为两个部分：抽象部分由抽象化角色作为父类，实现部分由实现化角色为父类。然后抽象化角色依赖了实现化角色，中间的依赖线类似一座桥梁，很形象的说明了桥接模式的命名由来。</description>
    </item>
    <item>
      <title>Java设计模式(9)-适配器模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-adapter-pattern/</link>
      <pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-adapter-pattern/</guid>
      <description>模式来源于生活，适配器模式最能直观的体现这一点。适配器，就是将多个原本不能共同工作的产品经过一定的处理，使得他们能够彼此协同工作的一种装置。</description>
    </item>
    <item>
      <title>Java设计模式(8)-建造者模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-builder-pattern/</link>
      <pubDate>Sun, 23 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-builder-pattern/</guid>
      <description>建造者模式（Builder Pattern），旨在解决复杂对象的创建过程，将对象与其创建过程分离，通过相同的创建过程创建多种不同的对象。</description>
    </item>
    <item>
      <title>Spring扩展原理</title>
      <link>https://blog.hankmo.com/posts/tech/spring-extension/</link>
      <pubDate>Wed, 12 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-extension/</guid>
      <description>Spring Bean后置处理器用于bean创建对象初始化前后进行拦截工作，因此它是spring容器扩展必不可少的组件。</description>
    </item>
    <item>
      <title>Java设计模式(7)-原型模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-prototype-pattern/</link>
      <pubDate>Wed, 15 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-prototype-pattern/</guid>
      <description>某些情况下，我们需要重复的创建多个对象，但是这些对象仅仅只有某几个属性不一致，大部分的信息都是相同的，如果使用传统的构造函数来创建对象，我们需要不断的实例化对象，并且反复调用属性的set方法来设置值，而这些值大多都是相同的。有没有一种模式，能够快速而高效的创建这些差别不大的对象呢？这就需要使用到原型模式。</description>
    </item>
    <item>
      <title>Java设计模式(6)-抽象工厂模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-abstract-factory-pattern/</link>
      <pubDate>Tue, 09 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-abstract-factory-pattern/</guid>
      <description>如果工厂模式中需要生产多种类型的产品，那么工厂方法模式就适合了，需要用到抽象工厂模式。</description>
    </item>
    <item>
      <title>Java设计模式(5)-工厂方法模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-factory-method-pattern/</link>
      <pubDate>Sat, 06 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-factory-method-pattern/</guid>
      <description>工厂方法模式，是工厂模式的一种，它对简单工厂模式进行进一步抽象化。它将工厂和产品进行抽象，抽象出来的工厂负责定义创建产品的规范，而抽象的产品负责定义产品规范，然后通过具体的工厂实现类来创建具体的产品。</description>
    </item>
    <item>
      <title>Java设计模式(4)-简单工厂模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-simple-factory-pattern/</link>
      <pubDate>Fri, 05 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-simple-factory-pattern/</guid>
      <description>工厂模式，一般分为三种，包括：简单工厂模式（也叫静态工厂模式）、工厂方法模式、抽象工厂模式。在GOF提及的23中设计模式中，没有简单工厂模式，但对于简单的软件开发中，简单工厂模式使用的还是很普遍的。</description>
    </item>
    <item>
      <title>Java设计模式(3)-单例模式</title>
      <link>https://blog.hankmo.com/posts/architecture/java-singleton-pattern/</link>
      <pubDate>Fri, 29 May 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/java-singleton-pattern/</guid>
      <description>单例模式，Java中最简单的设计模式之一，它定义了如何在整个系统范围内仅创建只有单个实例的类。单例模式是一种创建型模式，系统中的类只有一个实例，该类负责自己创建自身的唯一单个实例，并提供一个静态方法来获取自身实例。</description>
    </item>
    <item>
      <title>Java设计模式(2)-软件设计遵循的七大原则</title>
      <link>https://blog.hankmo.com/posts/architecture/seven-principles-for-software-design/</link>
      <pubDate>Wed, 27 May 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/seven-principles-for-software-design/</guid>
      <description>设计模式为面向对象软件设计的前进道路照亮了明灯，而设计模式遵循面向对象软件设计的七大原则，这些原则也是设计模式的基础。</description>
    </item>
    <item>
      <title>Java设计模式(1)-什么是设计模式?</title>
      <link>https://blog.hankmo.com/posts/architecture/what-is-designpattern/</link>
      <pubDate>Tue, 26 May 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/what-is-designpattern/</guid>
      <description>什么是设计模式？顾名思义，设计模式是一种软件设计所使用的方法，适用于面向对象软件设计。设计模式是一种方法，或者说是一种方法论，它是软件前辈们经历了无数的软件工程设计中的痛点和教训之后，总结出来的经验的结晶。设计模式是一种软件设计方法，不是代码，也不是规范。</description>
    </item>
    <item>
      <title>给Spring中注册Bean的几种方式</title>
      <link>https://blog.hankmo.com/posts/tech/methods-to-add-beans-to-spring/</link>
      <pubDate>Thu, 07 May 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/methods-to-add-beans-to-spring/</guid>
      <description>给Spring中添加Bean的这些方式，你都弄明白了吗？</description>
    </item>
    <item>
      <title>分布式事务的几种解决方案</title>
      <link>https://blog.hankmo.com/posts/tech/solutions-of-distributed-transaction/</link>
      <pubDate>Wed, 15 Apr 2020 21:29:04 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/solutions-of-distributed-transaction/</guid>
      <description>分布式系统，与传统单体架构系统相比，其结构复杂的多，系统间靠网络传输数据，系统存在诸多不确定因素，如硬件故障、网络波动等，都会影响整个系统的稳定性。而分布式事务更是分布式系统的一大难题。分布式事务常用的解决方案包括：两阶段提交(2PC)、TCC补偿性事务、本地消息表，也可以使用RocketMQ事务消息、阿里云全局事务服务GTS、Seata框架等。</description>
    </item>
    <item>
      <title>Java编程思想（第4版）中文高清版PDF下载</title>
      <link>https://blog.hankmo.com/posts/reading/thinking-in-java-pdf-download/</link>
      <pubDate>Tue, 14 Apr 2020 20:00:43 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/reading/thinking-in-java-pdf-download/</guid>
      <description>Java编程思想一书赢得了全球程序员的广泛赞誉，即使是最晦涩的概念，在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性（深入的面向对象概念、多线程、自动项目构建、单元测试和调试等），本书都能逐步指导你轻松掌握。</description>
    </item>
    <item>
      <title>Spring IoC容器实现原理</title>
      <link>https://blog.hankmo.com/posts/tech/spring-ioc-container/</link>
      <pubDate>Wed, 08 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-ioc-container/</guid>
      <description>IOC容器两个核心的接口为 BeanFacotry 和 ApplicationContext，前者提供容器管理Bean的基本功能，后者则扩展 BeanFactory，提供了容器级的强大功能，如国际化支持、资源加载、事件、应用上下文环境等。</description>
    </item>
    <item>
      <title>Docker时间和系统时间不匹配，相差8小时</title>
      <link>https://blog.hankmo.com/posts/tech/docker-time/</link>
      <pubDate>Wed, 11 Mar 2020 16:16:45 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-time/</guid>
      <description>使用 maven docker 插件部署时，发现docker容器时间与本地时间相差8小时。因为docker的时区与系统时区不同，docker容器默认的时区采用的UTC，而中国时区为CTS，与之差8小时（东8区），可以进入容器使用date命令查看时区：</description>
    </item>
    <item>
      <title>Spring Bean自动扫描原理</title>
      <link>https://blog.hankmo.com/posts/tech/spring-component-auto-scan/</link>
      <pubDate>Tue, 10 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-component-auto-scan/</guid>
      <description>Spring 基于注解的Bean自动扫描是由后置处理器 `ConfigurationClassPostProcessor` 来实现的，本篇将讨论Spring自动扫描的原理。</description>
    </item>
    <item>
      <title>Docker开启监听TCP端口，解决修改docker配置文件无效</title>
      <link>https://blog.hankmo.com/posts/tech/docker-tcp/</link>
      <pubDate>Tue, 18 Feb 2020 16:16:45 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-tcp/</guid>
      <description>Jenkins配置了Docker插件，结果发现不能远程调用远端的docker，原来是tcp端口没有打开。</description>
    </item>
    <item>
      <title>IntelliJ IDEA 2019.3.3激活</title>
      <link>https://blog.hankmo.com/posts/artifact/intellij-idea-2019.3-crack/</link>
      <pubDate>Fri, 14 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/intellij-idea-2019.3-crack/</guid>
      <description>IntelliJ IDEA 2019.3版本已经可以成功激活了，更新了非常多的性特性并极大的提升了性能。文本介绍了激活的方法和步骤，以及常见问题解答。</description>
    </item>
    <item>
      <title>Spring IoC容器启动过程</title>
      <link>https://blog.hankmo.com/posts/tech/spring-ioc-start/</link>
      <pubDate>Thu, 06 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-ioc-start/</guid>
      <description>Spring容器启动过程非常复杂，但是其核心流程都离不开 refresh 方法，所以该方法是spring最重要的一个方法，本文讨论spring容器的启动过程。</description>
    </item>
    <item>
      <title>修改docker容器端口映射</title>
      <link>https://blog.hankmo.com/posts/tech/docker-port-update/</link>
      <pubDate>Mon, 20 Jan 2020 16:16:45 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-port-update/</guid>
      <description>在docker run创建并运行容器的时候，可以通过 `-p` 指定端口映射规则。但是，我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改。当docker start运行容器后并没有提供一个-p选项或设置，让你修改指定端口映射规则。那么这种情况我们该怎么处理呢？今天Docker君教你如何修改运行中的docker容器的端口映射？</description>
    </item>
    <item>
      <title>Docker入门系列八——使用Dockerfile构建镜像</title>
      <link>https://blog.hankmo.com/posts/tech/docker-dockerfile/</link>
      <pubDate>Fri, 15 Nov 2019 16:16:45 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-dockerfile/</guid>
      <description>Dockfile就是一个文本文件，里边包含了一行行的指令，用来描述如何创建自定义镜像。使用 `docker build` 命令来基于Dockerfile文件和上下文构建镜像，构建上下文指的是特定路径(PATH或URL)的文件集合，PATH用来指定本地文件系统目录，而URL用来指定Git仓库的地址，它们包含的所有文件(子目录或子模块)都会被递归处理。在大多数情况下，最好以空目录作为上下文，并将Dockerfile保存在该目录中。仅添加构建Dockerfile所需的文件。</description>
    </item>
    <item>
      <title>使用Springboot开发websocket程序(四)——使用RabbitMQ作为STOMP消息代理</title>
      <link>https://blog.hankmo.com/posts/tech/springboot-websocket-chatroom-with-rabbitmq/</link>
      <pubDate>Tue, 12 Nov 2019 18:13:24 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springboot-websocket-chatroom-with-rabbitmq/</guid>
      <description>基于内存的stomp消息代理能够满足单应用需求，引入外部stomp消息代理解决了多应用之间的websocket消息传递需求。不同的消息中间件，都会按照stomp规范定义自身的destination支持。开发者需要明白两个点：订阅者订阅了什么destination，发送者发送到什么destination，这两个地址的匹配规则是什么。</description>
    </item>
    <item>
      <title>使用Springboot开发websocket程序(三)——基于子协议STOMP的web聊天室</title>
      <link>https://blog.hankmo.com/posts/tech/springboot-websocket-chatroom-with-stomp/</link>
      <pubDate>Sat, 02 Nov 2019 14:36:19 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springboot-websocket-chatroom-with-stomp/</guid>
      <description>WebSocket RFC定义了子协议的使用规范。在握手阶段，客户端和服务端使用Sec-WebSocket-Protocol请求头来通知彼此使用子协议，即更高级的、应用级的协议。当然，也可以不使用子协议，但是客户端和服务端仍然需要定义消息的格式。使用更规范的通用消息协议，更能让应用程序开发和维护变得简单。STOMP就是这样的一个消息协议，Spring框架提供了对其的支持。</description>
    </item>
    <item>
      <title>使用Springboot开发websocket程序(二)——基于原生websocket的web聊天室</title>
      <link>https://blog.hankmo.com/posts/tech/springboot-websocket-chatroom/</link>
      <pubDate>Fri, 01 Nov 2019 16:22:25 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springboot-websocket-chatroom/</guid>
      <description>websocket是一种由HTML5定义的浏览器和服务器保持长连接的通信协议，可以进行实时数据交换。WebSocket客户端除了支持Html5的浏览器外，还包括各大语言提供的WebSocket实现，比如Java中Spring框架的实现，从而在没有浏览器时也能进行websocket通信。HTML5中WebSocket API请看这里。服务端中，Java定义Java WebSocket API标准 JSR-356，Java主流容器都已经支持websocket。</description>
    </item>
    <item>
      <title>使用Springboot开发websocket程序(一)——什么是websocket</title>
      <link>https://blog.hankmo.com/posts/tech/springboot-websocket-intro/</link>
      <pubDate>Fri, 01 Nov 2019 11:51:49 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springboot-websocket-intro/</guid>
      <description>在互联网飞速发展的当代，浏览器和服务器之间的实时通信已经越来越重要，传统的HTTP协议难以解决实时通信的需求。因此，由HTML5定义的websocket协议应运而生。WebSocket是HTML5定义的浏览器与服务器实时通信的协议，它基于HTTP协议来完成与服务器的握手。目前，主流浏览器都已经支持websocket，如果浏览器不支持，也可以使用SocketJS来模拟websocket的API。WebSocket已经被广泛应用在网页游戏、视频直播、电商等等场景。</description>
    </item>
    <item>
      <title>使用Redis实现分布式锁</title>
      <link>https://blog.hankmo.com/posts/tech/distributed-lock-by-redis/</link>
      <pubDate>Thu, 17 Oct 2019 19:51:29 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/distributed-lock-by-redis/</guid>
      <description>在单体Java应用中，由于代码运行于同一个JVM，使用实现资源加锁是比较容易的，例如使用synchronized或ReentrantLock加锁来控制并发访问；但是在分布式系统中，多个分布式系统之间也需要控制并发访问，由于处于不同的JVM，此时就不能简单使用java的锁机制来进行控制。这种跨进程或者跨服务器的加锁，需要额外使用全局的获取锁的服务，就是本文探讨的分布式锁。</description>
    </item>
    <item>
      <title>IntelliJ IDEA 2019.2.x激活</title>
      <link>https://blog.hankmo.com/posts/artifact/intellij-idea-2019.2-crack/</link>
      <pubDate>Sat, 12 Oct 2019 15:18:29 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/intellij-idea-2019.2-crack/</guid>
      <description>IntelliJ IDEA 2019版本激活、破解流程详细说明。</description>
    </item>
    <item>
      <title>Docker入门系列七——端口映射与容器互联</title>
      <link>https://blog.hankmo.com/posts/tech/docker-mapping/</link>
      <pubDate>Sun, 15 Sep 2019 16:16:45 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-mapping/</guid>
      <description>如果外部要访问容器，需要将容器的端口开放出来，使用 `-p` 或 `-P` (大写)参数来映射容器端口和宿主机端口的关系。-p：明确指定端口映射，每个端口只能绑定一个容器，格式包括：IP:HOST_PORT:CONTAINER_PORT|IP:CONTAINER_PORT|HOST_PORT:COINTAINER_PORT</description>
    </item>
    <item>
      <title>SpringBoot自定义日志配置</title>
      <link>https://blog.hankmo.com/posts/tech/springboot-custom-log/</link>
      <pubDate>Fri, 06 Sep 2019 18:41:26 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springboot-custom-log/</guid>
      <description>当系统出现问题时，先从表现分析问题远远不够，要快速、准确地分析并定位问题原因，日志就是一个非常重要且必不可少的手段。Java而言，日志框架有很多，常用的有Common-logging、Java自带的Logging、Log4J、Logback等。另外，还有一个Slf4J的框架，主要目的是将这些框架进行整合。</description>
    </item>
    <item>
      <title>Mysql binlog格式</title>
      <link>https://blog.hankmo.com/posts/tech/mysql-binlog-format/</link>
      <pubDate>Wed, 28 Aug 2019 17:09:51 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/mysql-binlog-format/</guid>
      <description>Binlog有STATEMENT、ROW、MIXED三种格式，它们各有优缺点，需要根据自身业务需求来进行选择，从5.7.22版本开始，Mysql默认的格式由STATEMENT改为了ROW。</description>
    </item>
    <item>
      <title>Mysql开启Binlog并做数据备份</title>
      <link>https://blog.hankmo.com/posts/tech/mysql-binlog-guide/</link>
      <pubDate>Wed, 28 Aug 2019 16:21:14 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/mysql-binlog-guide/</guid>
      <description>Binlog，即binary log、二进制日志，记录了描述数据库更改的“事件”（EVENT），例如表创建操作或对表数据的更改(DELETE、UPDATE、INSERT)，通俗的说，binlog主要用来记录对mysql数据更新或潜在发生更新的SQL语句(例如DELETE语句没有删除任何行也会记录)，并以”事务”的形式保存在磁盘中Binlog；另外，它还包含有关每个语句获取更新数据的时间长度的信息。</description>
    </item>
    <item>
      <title>Docker入门系列六——数据管理</title>
      <link>https://blog.hankmo.com/posts/tech/docker-volumn/</link>
      <pubDate>Tue, 20 Aug 2019 16:16:45 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-volumn/</guid>
      <description>容器的数据管理有两种方式：数据卷（Data Volumes）：容器内数据直接映射到本地主机环境; 数据卷容器（Data Volume Containers）：使用特定容器维护数据卷。数据卷是一个可供容器使用的特殊目录，将主机的目录映射进容器，类似于Linux中的mount行为。</description>
    </item>
    <item>
      <title>Docker入门系列五——仓库</title>
      <link>https://blog.hankmo.com/posts/tech/docker-repo/</link>
      <pubDate>Mon, 12 Aug 2019 16:16:45 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-repo/</guid>
      <description>镜像注册表，用来存储镜像数据的地方，官方的Docker hub就是一个公共的Registry，另外，还可以通过官方的registry镜像搭建私有的镜像注册表。通常所说的镜像仓库是泛指Registry，但并不完全准确，一个Registry可以包含多个Repository。例如，拉取镜像：docker pull registry.hub.docker.com/ubuntu:18.04，这里的registry.hub.docker.com就是官方提供的镜像注册表，可以省略不写。</description>
    </item>
    <item>
      <title>Docker入门系列四——容器</title>
      <link>https://blog.hankmo.com/posts/tech/docker-container/</link>
      <pubDate>Mon, 29 Jul 2019 16:16:45 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-container/</guid>
      <description>容器是镜像的可运行实例。您可以使用Docker API或CLI创建，启动，停止，移动或删除容器。您可以将容器连接到一个或多个网络，附加存储，甚至可以根据其当前状态创建新镜像。默认情况下，容器与其他容器及其主机相对隔离。您可以控制容器的网络，存储或其他基础子系统与其他容器或主机的隔离程度。容器由其镜像以及在创建或启动时为其提供的配置选项定义。删除容器后，其未持久存储的状态数据都将消失。</description>
    </item>
    <item>
      <title>Docker入门系列三——镜像</title>
      <link>https://blog.hankmo.com/posts/tech/docker-image/</link>
      <pubDate>Tue, 23 Jul 2019 16:15:25 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-image/</guid>
      <description>镜像技术是docker轻量和高效的核心，由于镜像的层层叠加结构，多容器共享镜像层，而容器本身只创建本身的容器层，极大的提高了资源利用率。一般而言，镜像基于其他镜像构建，但是镜像树底层的根镜像也可能没有依赖其他父镜像。Docker镜像(Image)，一个镜像是一个只读的用于创建docker容器(container)的指令模板，包括了程序运行所需的全部依赖包（包括程序、库、资源、配置等）。通常，镜像基于另一个镜像，并进行自定义。镜像是只读的、可运行的，运行后的镜像即为容器（Container）。</description>
    </item>
    <item>
      <title>Docker入门系列二——安装</title>
      <link>https://blog.hankmo.com/posts/tech/docker-install/</link>
      <pubDate>Fri, 12 Jul 2019 16:07:37 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-install/</guid>
      <description>Docker是基于Linux系统的cgroup技术实现的，既然如此，那么Docker是否支持非Linux系统上使用呢？答案是肯定的。Docker官方提供了Docker Machine工具，用于在非Linux系统上构建虚拟机并在其上安装Docker；Docker官方还提供了Docker Toolbox工具包，用来在旧版本的操作系统上安装Docker；另外，Docker还专门针对Windows和Mac OS，提供了更简单易用的Docker Desktop，用来一键安装Docker及其相关组件。</description>
    </item>
    <item>
      <title>Docker入门系列一——简介</title>
      <link>https://blog.hankmo.com/posts/tech/docker-intro/</link>
      <pubDate>Wed, 03 Jul 2019 16:05:24 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/docker-intro/</guid>
      <description>容器化技术，是对Linux容器的一种封装，将程序打包为镜像文件，运行该文件创建容器，最终达到使用容器进行快速、简单、高效的开发、部署、运行软件程序的目的。相对于虚拟化技术，容器化技术有着更高的资源利用率、更高的性能、更低的开发和维护成本。</description>
    </item>
    <item>
      <title>使用Github的Webhook实现代码库与应用的交互</title>
      <link>https://blog.hankmo.com/posts/tech/github-webhook/</link>
      <pubDate>Tue, 02 Jul 2019 11:13:29 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/github-webhook/</guid>
      <description>Webhook，翻译过来可以称为网络钩子，用来将Github上的一系列事件信息回传到某一回调地址上，从而完成与外部应用的交互，它是github提供的一种与外部交互的入口。Github上提供了很多交互事件，当某一事件被触发后，如果设置了Webhook的回调地址，Github将会通过HTTP POST请求将事件信息发送到回调地址上，回调处理应用通过接收事件信息然后实现自身的业务需求。</description>
    </item>
    <item>
      <title>Spring AMQP消息转换</title>
      <link>https://blog.hankmo.com/posts/tech/spring-amqp-message-convert/</link>
      <pubDate>Mon, 17 Jun 2019 17:35:15 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-amqp-message-convert/</guid>
      <description>们介绍了如果使用Spring AMQP注解来实现消息发送和监听，示例都是使用的默认的消息转换器，即SimpleMessageConverter，它只能处理byte[]、String、java序列化对象(实现了Serializable接口的对象)。通常，不推荐使用Java序列化，因为它存在与Java对象强耦合、依赖java语言等缺点，Spring AMQP也提供了其他的消息转换方式，在本篇，我们将重点来看看如果将消息序列化为JSON格式。</description>
    </item>
    <item>
      <title>Spring AMQP注解的使用</title>
      <link>https://blog.hankmo.com/posts/tech/spring-amqp-guide-by-annotation/</link>
      <pubDate>Thu, 13 Jun 2019 17:15:31 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-amqp-guide-by-annotation/</guid>
      <description>上一篇 Spring AMQP简介和使用，我们介绍了Spring AMQP的一些基本要素和概念，也通过一些示例代码介绍了消息的发送和接收，但是都是使用的原始编码方式来实现，并不依赖Spring环境。其实，Spring AMQP也支持使用注解的方式来进行异步接收消息，极大的简化了编码。要使用注解，首先需要在Spring应用环境中。</description>
    </item>
    <item>
      <title>Spring AMQP简介和使用</title>
      <link>https://blog.hankmo.com/posts/tech/spring-amqp-intro/</link>
      <pubDate>Wed, 05 Jun 2019 09:42:47 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-amqp-intro/</guid>
      <description>Spring AMQP 是 Spring 对 AMQP 协议的封装和扩展，提供了消息发送和接收的模板。Spring AMQP由spring-amqp和spring-rabbit两个模块组成。spring-amqp模块位于org.springframework.amqp.core包，它的目标是提供不依赖于任何特定AMQP代理实现或客户端库的通用抽象；而spring-rabbit是spring-amqp通用抽象的具体实现，目前仅提供了rabbitmq的实现。</description>
    </item>
    <item>
      <title>Spring boot集成quartz并实现任务调度</title>
      <link>https://blog.hankmo.com/posts/tech/spring-boot-quartz-guide/</link>
      <pubDate>Tue, 22 Jan 2019 16:13:13 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-boot-quartz-guide/</guid>
      <description>spring boot与quartz集成，自定义JobFactory实现自动依赖注入，进行数据持久化。</description>
    </item>
    <item>
      <title>Spring boot工程Feign请求时Get请求无法传递body的问题</title>
      <link>https://blog.hankmo.com/posts/tech/spring-boot-feign-get-with-body/</link>
      <pubDate>Tue, 22 Jan 2019 15:54:21 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-boot-feign-get-with-body/</guid>
      <description>同RestTemplate类似，Feign默认情况下也使用的是JDK原生的http请求，同时也支持OkHttp、HttpClient等框架。默认情况下，原生Http请求不允许Get请求传递body，如果传递了body数据，会将当前请求转为Post请求，而实际上我们后台接收的是Get请求，所以抛出上边的异常，所以我们需要换成能够支持的HttpClient。</description>
    </item>
    <item>
      <title>使用Spring的RestTemplate发送GET请求，并支持传递Request body参数</title>
      <link>https://blog.hankmo.com/posts/tech/spring-resttemplate-get-with-body/</link>
      <pubDate>Wed, 31 Oct 2018 18:32:31 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-resttemplate-get-with-body/</guid>
      <description>使用RestTemplate发送GET请求，默认使用的JDK实现，不支持传递body参数，可以改为Apache的httpclient包，只需对HttpComponentsClientHttpRequestFactory进行扩展，让GET扩展自HttpEntityEnclosingRequestBase即可。</description>
    </item>
    <item>
      <title>Spring Boot参数验证（下）——Bean Validation在Web中的应用</title>
      <link>https://blog.hankmo.com/posts/tech/spring-boot-validation-2/</link>
      <pubDate>Fri, 12 Oct 2018 16:52:20 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-boot-validation-2/</guid>
      <description>Spring Boot的Web Starter已经加入了Bean Validation(JSR303)的依赖，可以直接使用。在使用时，只需在需要校验的方法上加上@Valid或者@Validated注解即可，如果需要编码自定义校验结果，则在校验的参数后加上BindingResult参数，注意对应关系；否则，为了模块化需要，也可以屏蔽校验失败业务逻辑，编写全局校验器，校验失败自动返回JSON校验结果即可。</description>
    </item>
    <item>
      <title>Spring boot全局异常处理和自定义异常页面</title>
      <link>https://blog.hankmo.com/posts/tech/spring-boot-global-exception-process/</link>
      <pubDate>Wed, 10 Oct 2018 17:39:20 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-boot-global-exception-process/</guid>
      <description>Spring boot提供了默认的异常处理机制，但是难以满足业务需要，一般需要编码来实现自己的业务处理机制。可以使用ContrllerAdvisor和ExceptionHandler注解来定义异常处理逻辑，要自定义异常页面，只需定义页面并放到error目录下即可。</description>
    </item>
    <item>
      <title>Spring Boot参数验证（上）——Bean Validation及其Hibernate实现</title>
      <link>https://blog.hankmo.com/posts/tech/spring-boot-validation-1/</link>
      <pubDate>Wed, 10 Oct 2018 15:15:34 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-boot-validation-1/</guid>
      <description>Bean Validation，是JCP(Java Community Process)定义的标准化的JavaBean校验API，基于注解，并且具有良好的易用性和扩展性，1.0版本定义为JSR 303，而现在发布了2.0版本，定义为JSR 380。Hibernate Validator是JSR 380的一种标准实现，同时还对其进行了扩展，如增加了部分验证约束。目前，最新的稳定版本为6.0.13.Final。</description>
    </item>
    <item>
      <title>Spring Cloud服务注册中心Eureka高可用</title>
      <link>https://blog.hankmo.com/posts/tech/springcloud-eureka-cluster/</link>
      <pubDate>Thu, 16 Aug 2018 17:03:18 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springcloud-eureka-cluster/</guid>
      <description>对于Eureka而言，其本身是支持多节点集群的。其原理大致如下：服务注册中心的多个实例彼此互相注册，形成注册中心的集群，同时对外提供服务，即使其中一个挂掉，其他实例仍然可以对外提供服务，从而保证了高可用。</description>
    </item>
    <item>
      <title>Spring Cloud服务注册中心Eureka</title>
      <link>https://blog.hankmo.com/posts/tech/springcloud-eureka-standalone/</link>
      <pubDate>Wed, 15 Aug 2018 16:48:42 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springcloud-eureka-standalone/</guid>
      <description>Eureka，字面意思即&amp;#34;发现&amp;#34;之意，是Netflix下开源的服务治理（注册、发现等）中间件。Spring Cloud Eureka在其基础上进行了二次封装，添加了自动化配置等功能，使其成为Spring Cloud微服务体系中核心的服务治理方案之一。</description>
    </item>
    <item>
      <title>Spring Cloud Config之配置集成化</title>
      <link>https://blog.hankmo.com/posts/tech/springcloud-config-center-with-git/</link>
      <pubDate>Tue, 14 Aug 2018 17:35:26 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springcloud-config-center-with-git/</guid>
      <description>Spring Cloud Config是一款配置集中管理的组件，它提供了分布式系统的客户端和服务端外部化配置支持，由git(也支持svn、本地文件系统等)存储库支持的集中式外部配置管理，实现了配置的外部化存储。</description>
    </item>
    <item>
      <title>Visio替代者-亿图9.0破解版下载</title>
      <link>https://blog.hankmo.com/posts/artifact/yitu-9.0-crack/</link>
      <pubDate>Tue, 31 Jul 2018 15:09:19 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/yitu-9.0-crack/</guid>
      <description>亿图，一款windows平台的微软Office风格的绘图软件，不仅简单易用，而且拥有强大的功能，支持的图形图表种类非常丰富，所绘制的图形也十分美观，你可以用来轻松绘制各种图形， 如流程图、框图、思维导图、工程设计图、平面图、时装设计等等。</description>
    </item>
    <item>
      <title>Spring Cloud简介</title>
      <link>https://blog.hankmo.com/posts/tech/springcloud-intro/</link>
      <pubDate>Fri, 20 Jul 2018 17:13:10 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springcloud-intro/</guid>
      <description>Spring Cloud是一套构建于Spring boot之上的微服务框架，它整合了大部分微服务实施所需的组件，并提供了默认实现，使得复杂的微服务实施变得简单化。Spring Cloud是一整套微服务解决方案，相比于dubbo等框架而言，不仅出生于Spring大家族，而且更新频繁，发展特别快，社区也很活跃，对于实施微服务的小型公司而言，使用Spring Cloud不仅能够快速实施微服务，而且其已经考虑微服务的各个方面，从而极大的节约了开发成本，提高了生产力。</description>
    </item>
    <item>
      <title>Spring Boot JPA使用详解</title>
      <link>https://blog.hankmo.com/posts/tech/spring-boot-jpa-guide/</link>
      <pubDate>Wed, 27 Jun 2018 18:08:47 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-boot-jpa-guide/</guid>
      <description>JPA是Java Persistence API的简称，中文名Java持久层API，是JDK 5.0注解或XML描述对象－关系表的映射关系，并将运行期的实体对象持久化到数据库中。本文介绍了Spring boot JPA的用法，包括核心接口和类介绍，查询创建，投影、分页查询、条件查询用法等。</description>
    </item>
    <item>
      <title>使用TpLink的DDNS让外网访问本地服务</title>
      <link>https://blog.hankmo.com/posts/devops/expose-local-server-by-ddns-of-tplink/</link>
      <pubDate>Sat, 09 Jun 2018 12:12:58 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/devops/expose-local-server-by-ddns-of-tplink/</guid>
      <description>很多时候，我们需要将本地服务暴露给外网访问，或者简单地说能够通过互联网访问本地电脑。比如，公司内网有一台服务器，上边的多个服务都需要在公司和在家里都能访问到，如代码库、数据库等；又比如，在开发微信公众号此类需要外网回调本地环境的应用，如果能够将本地服务暴露给外网访问，那么调试起来将非常方便。TpLink目前是自带了DDNS，可以免费申请DDNS域名，免费而且稳定。在使用的时候，需要将TpLink路由器作为上网源，光猫只是充当交换器而不提供路由功能。</description>
    </item>
    <item>
      <title>SpringBoot-工程结构、配置文件以及打包</title>
      <link>https://blog.hankmo.com/posts/tech/springboot-project-overview/</link>
      <pubDate>Thu, 07 Jun 2018 17:43:26 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/springboot-project-overview/</guid>
      <description>Spring Boot默认以jar方式来打包运行程序，与传统war不同的是，Spring Boot规定了web项目的配置文件、静态资源和模板存放位置，同时也提供了可执行jar包的目录规范和打包插件。通常，我们不需要更改Spring Boot的默认配置，如果有特殊需求，同样可以简单的修改application.properties配置项来实现自定义，例如自定义日志、自定义参数、随机参数、自定义WEB文件存放目录等。</description>
    </item>
    <item>
      <title>Intellij IDEA技巧-正则查询替换和纵向编辑</title>
      <link>https://blog.hankmo.com/posts/artifact/intellij-idea-powerful-regex-and-vertical-edit/</link>
      <pubDate>Thu, 31 May 2018 18:13:40 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/intellij-idea-powerful-regex-and-vertical-edit/</guid>
      <description>IntelliJ IDEA是一款非常强大的Java IDE，当然现在也支持多种语言，由JetBrains公司开发。IntelliJ IDEA在业界被公认为最好的java开发工具之一，尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn、github等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。</description>
    </item>
    <item>
      <title>微服务架构的理论基础 - 康威定律</title>
      <link>https://blog.hankmo.com/posts/architecture/microservice-conways-law/</link>
      <pubDate>Tue, 29 May 2018 20:06:22 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/microservice-conways-law/</guid>
      <description>可能出乎很多人意料之外的一个事实是，微服务很多核心理念其实在半个世纪前的一篇文章中就被阐述过了，而且这篇文章中的很多论点在软件开发飞速发展的这半个世纪中竟然一再被验证，这就是康威定律。</description>
    </item>
    <item>
      <title>什么是微服务架构</title>
      <link>https://blog.hankmo.com/posts/architecture/what-is-microservice/</link>
      <pubDate>Tue, 29 May 2018 10:18:23 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/architecture/what-is-microservice/</guid>
      <description>微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法，每个服务运行在自己的进程中，服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理，服务可用不同的语言开发，使用不同的数据存储技术。</description>
    </item>
    <item>
      <title>Spring Boot之基础入门</title>
      <link>https://blog.hankmo.com/posts/tech/spring-boot-intro/</link>
      <pubDate>Tue, 22 May 2018 18:56:09 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-boot-intro/</guid>
      <description>Spring Boot是Spring的开源项目，其目的是让开发者可以简单、快速地使用Spring框架创建生产级的应用，其目的不是为了替换Spring，而是简化Spring的使用。Spring Boot可以看做是对Spring框架的二次封装，不过，在封装的同时也还提供了许多高级功能。</description>
    </item>
    <item>
      <title>XMind8 pro版本下载和破解</title>
      <link>https://blog.hankmo.com/posts/artifact/xmind8-pro-crack/</link>
      <pubDate>Fri, 11 May 2018 15:28:05 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/xmind8-pro-crack/</guid>
      <description>XMind是一款比较易用的思维导图软件，开源且功能强大，有免费版本，能够满足基本使用。如果需要使用更高级的功能，可以付费购买收费版本。破解XMind需要下载并安装Xmind，并下载破解补丁，修改XMind.ini配置，并输入激活码。</description>
    </item>
    <item>
      <title>使用visualvm监控Java程序性能三——浏览堆dump文件</title>
      <link>https://blog.hankmo.com/posts/tech/visualvm-heap-dump/</link>
      <pubDate>Tue, 24 Apr 2018 19:18:50 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/visualvm-heap-dump/</guid>
      <description>堆dump，即堆转储，其实是一个当前JVM堆内存所有对象在某个时间点上的快照。堆dump用来将当前应用程序的堆内存中的数据信息保存为文件，并可以快速浏览文件中的内容，查询对象分配信息。堆dump是分析程序类和实例对象的关键手段，通过将堆内存信息保存起来，从而为后续分析做好准备工作。分析对dump，找出占用资源较高的对象，找出其引用关系，然后进行代码优化。</description>
    </item>
    <item>
      <title>使用visualvm监控Java程序性能二——主窗口功能详解</title>
      <link>https://blog.hankmo.com/posts/tech/visualvm-overview/</link>
      <pubDate>Sat, 21 Apr 2018 20:11:35 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/visualvm-overview/</guid>
      <description>VisualVM的概述页详细展示了应用程序和运行环境的参数信息；而监视页以图形化的方式直观的展示了当前监控程序的CPU、内存、类和线程的整体情况；线程页用于详细分析程序的线程情况，比如CPU占用情况、是否死锁等；抽样器则可以用来对CPU或者内存一定一段时间的数据抽样检查，并分析抽样结果；Profiler可以用于从整体上分析本地应用程序的性能，功能类似抽样器。</description>
    </item>
    <item>
      <title>使用VisualVM监控Java程序性能一——简介</title>
      <link>https://blog.hankmo.com/posts/tech/visualvm-intro/</link>
      <pubDate>Fri, 20 Apr 2018 17:08:21 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/visualvm-intro/</guid>
      <description>Java应用程序难免遇到性能问题，借助于一些性能分析工具，来监测程序性能，从而找出影响性能的问题所在，以便进行优化。本文的VisualVM就是一款比较强大的性能分析工具。VisualVM组织Java开发工具包(JDK)工具检索的JVM软件的数据，并以一种使您能够快速查看多个Java应用程序的数据的方式提供信息。您可以查看在远程主机上运行的本地应用程序和应用程序的数据。您还可以捕获有关JVM软件实例的数据，并将数据保存到您的本地系统中，以供后期查看或与其他用户共享。</description>
    </item>
    <item>
      <title>RabbitMQ服务器管理（二）——权限管理</title>
      <link>https://blog.hankmo.com/posts/tech/rabbitmq-permission/</link>
      <pubDate>Thu, 12 Apr 2018 12:31:32 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/rabbitmq-permission/</guid>
      <description>RabbitMQ有一套独立的权限机制：配置、写、读，通过三个正则表达式来分别匹配所访问资源的这三项权限。权限的设置需要使用rabbitmqctl控制台工具来输入命令完成，基本思路是：创建虚拟机、创建用户，然后给用户授予权限。rabbitmq还支持为topic交换器设置消息权限，该权限基于消息的routing key，通过正则匹配消息的routing key来控制具体消息的发布和消费。</description>
    </item>
    <item>
      <title>RabbitMQ服务器管理（一）——ubuntu上安装MQ</title>
      <link>https://blog.hankmo.com/posts/tech/rabbitmq-ubuntu-install/</link>
      <pubDate>Thu, 12 Apr 2018 11:31:04 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/rabbitmq-ubuntu-install/</guid>
      <description>我们将在ubuntu上安装RabbitMQ，其他操作系统类似。RabbitMQ使用Erlang语言开发，需要先安装Erlang语言，erlang的安装涉及许多依赖包，不过官方已经提供了ubuntu库地址文件和依赖安装完整包，只需在ubuntu原地址列表加入官方地址并更新即可。安装完成，还涉及服务器启动、停止和状态检查，以及权限控制。</description>
    </item>
    <item>
      <title>RabbitMQ基础（七）——虚拟主机vhost</title>
      <link>https://blog.hankmo.com/posts/tech/rabbitmq-vhost/</link>
      <pubDate>Wed, 04 Apr 2018 15:46:21 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/rabbitmq-vhost/</guid>
      <description>虚拟主机是RabbitMQ的逻辑单元，有用单独的连接、队列、交换器、绑定等等信息，多个虚拟主机相互隔离、互不影响。这解决了RabbitMQ数据量庞大时的各种管理问题，可以按照业务模块分别建立不同的虚拟主机，单独为独立的业务功能服务，而不会产生诸如命名冲突等问题。</description>
    </item>
    <item>
      <title>windows全能终端神器MobaXterm9.4破解版下载</title>
      <link>https://blog.hankmo.com/posts/artifact/mobaxterm-9.4-crack/</link>
      <pubDate>Mon, 02 Apr 2018 11:52:34 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/mobaxterm-9.4-crack/</guid>
      <description>MobaXterm是远程计算的终极工具箱。在一个单独的Windows应用程序中，它为程序员、网站管理员、it管理员和几乎所有需要以更简单的方式处理远程工作的用户提供了大量的功能。Mobaxterm为用户提供了多标签和多终端分屏选项，内置sftp文件传输以及xerver。MobaXterm提供了所有重要的远程网络工具、协议(SSH、X11、RDP、VNC、FTP、MOSH、…)和Unix命令(bash、ls、cat、sed、grep、awk、rsync、…)到Windows桌面。</description>
    </item>
    <item>
      <title>RabbitMQ基础（六）——实现RPC</title>
      <link>https://blog.hankmo.com/posts/tech/rabbitmq-rpc/</link>
      <pubDate>Wed, 28 Mar 2018 16:18:06 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/rabbitmq-rpc/</guid>
      <description>本章简单介绍了如何使用RabbitMQ来实现RPC，关键是使用AMQP.BasicProperties定义的消息属性。1、AMQP0-9-1预定了14中消息属性，不过常用的只有几种，在java中通过AMQP.BasicProperties访问和设置；2、客户端通过消息属性的replyTo属性来设置回调队列，服务端获取并将响应消息发送到回调队列；3、客户端请求和响应的对应关系需要通过比对correlationId来实现。</description>
    </item>
    <item>
      <title>RabbitMQ基础（五）——topic交换器</title>
      <link>https://blog.hankmo.com/posts/tech/rabbitmq-topic-exchange/</link>
      <pubDate>Fri, 23 Mar 2018 16:45:21 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/rabbitmq-topic-exchange/</guid>
      <description>Topic类型的交换器，支持使用&amp;#34;*&amp;#34;和&amp;#34;#&amp;#34;通配符定义模糊bindingKey，然后按照条件进行模糊匹配。bindingKey的定义需要遵循一定的规则，长度不能超过255字节。</description>
    </item>
    <item>
      <title>RabbitMQ基础（四）——direct交换器与路由</title>
      <link>https://blog.hankmo.com/posts/tech/rabbitmq-direct-exchange/</link>
      <pubDate>Fri, 23 Mar 2018 15:28:23 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/rabbitmq-direct-exchange/</guid>
      <description>绑定队列时，可以设置bindingKey，发送消息时可以设置消息的routingKey;direct交换器，按照消息的routingKey和bindingKey进行精确匹配，完全相同才会进行转发；相同的key可以与多个队列进行绑定，每个队列都可以收到与key匹配的消息，这称为多重绑定。在本篇，我们简单了解了direct类型的交换器，它适用于需要精确匹配并转发消息的场景；在下一篇，我们将会了解topic类型的交换器，以及其作用及适用场景。</description>
    </item>
    <item>
      <title>RabbitMQ基础（三）——fanout交换器和发布/订阅</title>
      <link>https://blog.hankmo.com/posts/tech/rabbitmq-fanout-exchange/</link>
      <pubDate>Thu, 22 Mar 2018 17:03:05 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/rabbitmq-fanout-exchange/</guid>
      <description>交换器，即Exchange，交换器是消息到达的第一站，所有的消息都先发送给交换器，交换器再按照不同的规则进行消息分发。RabbitMQ中的消息传递模型的核心思想是，生产者不会直接向队列发送任何消息。实际上，生产者甚至不知道消息是否会被传递到任何队列。相反，生产者只能发送消息给交换器。交换器做的事情非常简单：一方面，它接收来自生产者的消息，另一边则将消息推送到队列中。交换器分发规则是由交换类型(exchange type)定义的。</description>
    </item>
    <item>
      <title>MindManager2016版本下载，带正版激活码</title>
      <link>https://blog.hankmo.com/posts/artifact/mindmanager-2016-crack/</link>
      <pubDate>Thu, 22 Mar 2018 15:26:08 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/mindmanager-2016-crack/</guid>
      <description>mindmanager正版下载，附激活码，亲测可用!</description>
    </item>
    <item>
      <title>Spring事务管理四：声明式事务</title>
      <link>https://blog.hankmo.com/posts/tech/spring-declarative-transaction/</link>
      <pubDate>Thu, 08 Mar 2018 17:34:51 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-declarative-transaction/</guid>
      <description>可以从传播机制、隔离级别、是否只读、事务超时、回滚规则等方面来描述事务。Spring提供了xml和注解两者事务声明方式：采用xml：需要使用tx命名空间，好处是在xml中完成事务定义，代码中不需要做任何事务相关的编码；但是，事务控制的方法名称需要遵循一定的规则，一遍Spring能够匹配到并为其加入事务通知。采用注解：xml仅需一行配置，其他的事务控制都可以通过编码加上注解实现，而且对方法名称没有要求；如果整个应用不需要事务控制，取消xml配置即可。</description>
    </item>
    <item>
      <title>Spring事务管理三：编程式事务</title>
      <link>https://blog.hankmo.com/posts/tech/spring-programming-transaction/</link>
      <pubDate>Thu, 08 Mar 2018 15:50:47 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-programming-transaction/</guid>
      <description>Spring提供了TransactionTemplate工具类，可以方便地让开发人员手动的编程实现事务控制。编程式事务虽然可以精确控制事务，但是事务控制代码必须侵入业务逻辑代码中，耦合度高，后期难以维护。一般而言，不需要精确控制事务，所以采用的更多的是Spring的声明式事务。</description>
    </item>
    <item>
      <title>Spring事务管理二：Spring事务管理器</title>
      <link>https://blog.hankmo.com/posts/tech/spring-transaction-manage/</link>
      <pubDate>Wed, 07 Mar 2018 21:33:52 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-transaction-manage/</guid>
      <description>Spring并不支持管理事务，而是委托给第三方事务管理机制来完成事务控制，Spring顶层提供事务管理核心接口PlatformTransactionManager，事务管理器均是该接口的实现。如果没有合适的事务管理器或者需要支持分布式事务控制，则可以使用全局事务管理器：JTA事务管理器。</description>
    </item>
    <item>
      <title>Spring事务管理一：Spring事务简介</title>
      <link>https://blog.hankmo.com/posts/tech/spring-transaction-intro/</link>
      <pubDate>Wed, 07 Mar 2018 21:20:39 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/spring-transaction-intro/</guid>
      <description>在软件开发领域，全有或全无的操作被称为事务（transaction）。事物允许将几个操作组合成一个要么全部发生要么全部不发生的工作单元。发生和不发生两者只能选择其一，而不可能两者都选择。事务确保了数据和资源免于处在不一致的状态。事务必须具备ACID特性，在Spring中，除了编程来精确控制事务，还可以使用AOP来配置低耦合度的声明式事务控制。</description>
    </item>
    <item>
      <title>股票是什么</title>
      <link>https://blog.hankmo.com/posts/essay/what-is-stock/</link>
      <pubDate>Wed, 28 Feb 2018 15:54:54 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/essay/what-is-stock/</guid>
      <description>最近看了下股票相关的东西，刚好看到一则比较有意思的说明股票是什么的故事，转载下来！</description>
    </item>
    <item>
      <title>MySQL中批量插入和批量更新</title>
      <link>https://blog.hankmo.com/posts/tech/mysql-batch-insert-update/</link>
      <pubDate>Tue, 27 Feb 2018 19:22:14 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/mysql-batch-insert-update/</guid>
      <description>大批量同步数据到MySQL中，涉及到更新和新增数据，如果仅仅循环一次次插入，不仅耗费过多的网络开销，性能低下，而且频繁的获取数据库连接、操作数据库，增加数据库压力，甚至严重影响数据库性能。因此，此时我们需要批量操作，来减轻数据库压力，提升应用性能。</description>
    </item>
    <item>
      <title>RabbitMQ基础（二）——工作队列Work Queues</title>
      <link>https://blog.hankmo.com/posts/tech/rabbitmq-queue/</link>
      <pubDate>Wed, 24 Jan 2018 15:24:29 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/rabbitmq-queue/</guid>
      <description>Work Queues，称为工作队列(也称Task Queues，任务队列)，其主旨在于避免立即执行资源密集型任务，并且必须等待它完成。相反，我们把任务安排在后来执行。对此，我们将任务封装为消息并将其发送到队列中。在后台运行的工作进程会获取任务并最终执行任务。当你运行许多工作进程时，任务将在他们之间共享。</description>
    </item>
    <item>
      <title>RabbitMQ基础（一）——基本概念和HelloWorld</title>
      <link>https://blog.hankmo.com/posts/tech/rabbitmq-intro/</link>
      <pubDate>Thu, 18 Jan 2018 17:52:28 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/rabbitmq-intro/</guid>
      <description>RabbitMQ是一个消息代理，是一个erlang开发的AMQP（Advanced Message Queue ）的开源实现。RabbitMQ是轻量级的，易于部署在premises和云中。它支持多种消息传递协议。RabbitMQ可以部署在分布式和联合配置中，以满足高级别、高可用性需求。其主要思想非常简单:它接受并转发消息。你可以把它想象成邮局:当你把邮件寄到邮箱时，你很确定邮差先生最终会把邮件寄给你的收件人。使用这个比喻，RabbitMQ是一个邮筒，一个邮局和一个邮差。</description>
    </item>
    <item>
      <title>Windows server 2012 R2评估版本激活</title>
      <link>https://blog.hankmo.com/posts/artifact/windows-server-2012r2-active/</link>
      <pubDate>Tue, 05 Dec 2017 10:04:53 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/windows-server-2012r2-active/</guid>
      <description>Windows server 2012 R2评估版本，只能试用180天，到期后，系统激活前每隔一个小时会自动关机。激活系统需要进行两步：将评估板升级为标准版（standard版），使用购买的key或激活工具进行激活。</description>
    </item>
    <item>
      <title>redis desktop manager桌面工具</title>
      <link>https://blog.hankmo.com/posts/artifact/redis-desktop-manager-crack/</link>
      <pubDate>Thu, 23 Nov 2017 09:43:16 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/redis-desktop-manager-crack/</guid>
      <description>redis desktop manager可视化数据库管理工具，再也不用敲命令了！</description>
    </item>
    <item>
      <title>Astah professional 7.2版本破解文件</title>
      <link>https://blog.hankmo.com/posts/artifact/astah-professional-7.2-crack-download/</link>
      <pubDate>Wed, 22 Nov 2017 18:28:01 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/astah-professional-7.2-crack-download/</guid>
      <description>Astah professional 7.2版本破解文件下载。</description>
    </item>
    <item>
      <title>WEBP格式的图片导致ImageIO.read方法return null</title>
      <link>https://blog.hankmo.com/posts/tech/webp-image-cannot-read/</link>
      <pubDate>Fri, 03 Nov 2017 10:56:35 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/webp-image-cannot-read/</guid>
      <description>最近开发一个图片服务，主要是维护项目图片，支持JPG、BMP、PNG、JPEG等常规格式。开发的时候没问题，但是上到生产的时候，客户在维护图片的时候，发现有的JPG格式的图片能上传，有的不能。</description>
    </item>
    <item>
      <title>ubuntu下ssh关闭密码登陆，采用公钥认证登陆</title>
      <link>https://blog.hankmo.com/posts/devops/auth-with-public-key-by-ssh-on-ubuntu/</link>
      <pubDate>Mon, 14 Aug 2017 13:08:20 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/devops/auth-with-public-key-by-ssh-on-ubuntu/</guid>
      <description>ubuntu下如何关闭密码登陆，采用ssh公钥认证登陆？</description>
    </item>
    <item>
      <title>git从其他git服务器完整迁移到自建git服务器</title>
      <link>https://blog.hankmo.com/posts/artifact/git-repository-full-migrate/</link>
      <pubDate>Thu, 08 Jun 2017 15:57:34 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/artifact/git-repository-full-migrate/</guid>
      <description>git版本库迁移，保留所有提交信息。</description>
    </item>
    <item>
      <title>Nginx学习——nginx的下载、安装和启动</title>
      <link>https://blog.hankmo.com/posts/devops/nginx-download-install-and-start/</link>
      <pubDate>Mon, 15 May 2017 17:28:11 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/devops/nginx-download-install-and-start/</guid>
      <description>Nginx作为轻量级、高并发、高性能的web服务器，目前使用非常广泛。本文讲解了windows和linux下nginx的下载、安装和启动、停止等常规操作，一般建议Nginx部署在Linux服务器上，以发挥其高并发、高性能的特点。</description>
    </item>
    <item>
      <title>linux常见操作整理</title>
      <link>https://blog.hankmo.com/posts/devops/common-operation-of-linux/</link>
      <pubDate>Wed, 05 Apr 2017 22:52:20 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/devops/common-operation-of-linux/</guid>
      <description>Linux是一套免费使用和自由传播的类Unix操作系统，是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想，是一个性能稳定的多用户网络操作系统。本文记录了Linux常用的一些命令，并不断完善中，以备查阅。</description>
    </item>
    <item>
      <title>高性能Javascript--脚本的无阻塞加载策略</title>
      <link>https://blog.hankmo.com/posts/tech/javascript-non-blocking-load/</link>
      <pubDate>Wed, 05 Apr 2017 22:49:28 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/javascript-non-blocking-load/</guid>
      <description>JavaScript在浏览器中的性能，可以说是前端开发者所要面对的最重要的可用性问题。在Yahoo的Yslow23条规则当中，其中一条是将JS放在底部 。原因是，事实上，大多数浏览器使用单进程处理UI和更新JavaScript运行等多个任务，而同一时间只能有一个任务被执行。JavaScript运行了多长时间，那么在浏览器空闲下来响应用户交互之前的等待时间就有多长。</description>
    </item>
    <item>
      <title>MySQL慢查询分析</title>
      <link>https://blog.hankmo.com/posts/tech/mysql-slow-query-analysis/</link>
      <pubDate>Tue, 04 Apr 2017 16:31:00 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/mysql-slow-query-analysis/</guid>
      <description>最近开发微信红包活动，并发量大概在100左右，数据库存储数据几十万条。活动上线后，遇到一个问题，服务启动起来后，在几分钟之内，服务变得很慢，通过分析tcp状态（ss -s）发现，处于timewait状态的TCP达到一千多个，然后从应用前台、后台到数据库逐步分析，最后发现，由于某一张表的数据量达到几十万，而某一个逻辑需要连接该表进行数据查询，导致SQL执行非常缓慢。于是整理下SQL慢查询分析的相关方法，以便查阅。</description>
    </item>
    <item>
      <title>JVM垃圾回收器工作原理及使用实例介绍</title>
      <link>https://blog.hankmo.com/posts/tech/jvm-gc/</link>
      <pubDate>Mon, 03 Apr 2017 01:15:48 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/jvm-gc/</guid>
      <description>Java语言的一大特点就是可以进行自动垃圾回收处理，而无需开发人员过于关注系统资源，例如内存资源的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量，但是也增加了软件系统的负担。拥有垃圾收集器可以说是Java语言与C&#43;&#43;语言的一项显著区别。在 C&#43;&#43;语言中，程序员必须小心谨慎地处理每一项内存分配，且内存使用完后必须手工释放曾经占用的内存空间。当内存释放不够完全时，即存在分配但永不释放的内存块，就会引起内存泄漏，严重时甚至导致程序瘫痪。</description>
    </item>
    <item>
      <title>maven定义profile无法替换property属性值</title>
      <link>https://blog.hankmo.com/posts/tech/maven-profile-canot-replace-property/</link>
      <pubDate>Mon, 03 Apr 2017 01:04:21 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/maven-profile-canot-replace-property/</guid>
      <description>最近开发一个web项目，用的maven构建，建立多个profile，对应不同环境，分别包含不同的配置，在打包的时候发现，xml和properties配置文件没有被替换为profile下定义的property属性值。</description>
    </item>
    <item>
      <title>jQuery validator表单验证框架使用说明</title>
      <link>https://blog.hankmo.com/posts/tech/jquery-validator-guide/</link>
      <pubDate>Mon, 03 Apr 2017 00:53:09 +0000</pubDate>
      <guid>https://blog.hankmo.com/posts/tech/jquery-validator-guide/</guid>
      <description>jquery.validate.js是jquery旗下的一个验证框架，借助jquery的优势，我们可以迅速验证一些常见的输入,并且可以自己扩充自己的验证方法，并且对国际化也有很好的支持，本文介绍了该框架的基本使用及常见API。</description>
    </item>
  </channel>
</rss>
