CodingDiaryxkcoding的代码成长日记https://xkcoding.com/Mitchell Hashimoto 的 AI 经验分享https://xkcoding.com/2026-02-28-mitchell-hashimoto-ai-experience.htmlhttps://xkcoding.com/2026-02-28-mitchell-hashimoto-ai-experience.htmlMitchell Hashimoto(HashiCorp 联合创始人,Terraform / Ghostty 作者)写了篇自己从对 AI 工具不熟练到离不开 Agent 的经历。最开始逼自己把活干两遍来练手,利用下班时间让 Agent 跑任务,再用工程化手段减少重复犯错,一个老程序员老老实实复盘自己接受新工具的过程。读完觉得挺有共鸣的,提炼了一下核心要点分享出来。Sat, 28 Feb 2026 00:00:00 GMT写在前面 Mitchell Hashimoto 是 HashiCorp 的联合创始人,也是 Terraform 和 Ghostty(一个终端模拟器)的作者。 前段时间他写了篇 My AI Adoption Journey,聊了聊自己怎么从对 AI 工具不熟练,到后来慢慢离不开 Agent 的。一个做了这么多年基础设施工具的人,老老实实地讲了自己接受新工具的过程。他还专门声明了:这篇文章是手写的,没用 AI。读完觉得挺值得分享的,就提炼了一下。 慢慢上手 别用 ChatBot 写代码了 大多数人接触 AI 编程,第一反应都是打开 ChatGPT,贴一段需求,让它写代码。 Mitchell 也是这么开始的。他第一次被 AI 惊到,是把 Zed 编辑器的命令面板截了个图丢给 Gemini,让它用 SwiftUI 复现,结果出奇的好。Ghostty 现在的 macOS 命令面板就是在那个基础上稍微改的。 不过这种惊喜没能持续。一旦换到有一定复杂度的项目,ChatBot 就不灵了。它本质上是在靠训练数据猜答案,猜错了你只能反复纠正,再加上来回复制粘贴代码和报错,折腾半天还不如自己写来得快。 所以...用 Tailscale + Terminus 在 iPad 上远程操控 Claude Codehttps://xkcoding.com/2026-02-17-remote-claude-code-with-tailscale-terminus.htmlhttps://xkcoding.com/2026-02-17-remote-claude-code-with-tailscale-terminus.htmlClaude Code 驱动的工作流用得越深,越离不开那台 Mac。上下文、笔记、项目全在上面,出门就接不上。本文对比了 frp、Cloudflare Tunnel、Happy Coder、Tailscale 几种远程方案,最后用 Tailscale 组网加 Terminus 做移动端 SSH,iPad 和手机随时能连回 Mac 用 Claude Code。也记录了搭建 Tailscale 过程中踩的坑:GUI 版锁屏断连、国内 DNS 污染、SSH 读不到 macOS 钥匙串,以及自己的排查思路。Mon, 16 Feb 2026 16:00:00 GMT写在前面 我的第二大脑是 Obsidian + Claude Code 搭的 Claudesidian 方案。它在 Obsidian 里预设了一套 PARA 结构的知识库,然后通过 Slash Command 和 MCP 让 Claude Code 来驱动整个工作流:日常写笔记、整理收藏、做 daily review,甚至研究一个新话题,都是在跟 Claude Code 对话中完成的。它不只是个工具,更像一个长期协作伙伴。 问题是,我不可能随时坐在电脑前。春节假期躺沙发上突然冒出个想法,陪娃逛街时脑子里闪过一个 bug 的解法。偏偏这种碎片化的瞬间,最想随手跟 AI 聊两句。 折腾了一番,我使用 Tailscale 组网 + Terminus 做移动终端,现在在 iPad 上打开 Terminus 就能直接跟 Mac 上的 Claude Code 对话。 为什么选 Tailscale 想要从外面连回家里的 Mac,核心问题是组网。常见方案有几种: - frp / ngrok:需要一台有公网 IP 的服务器做中转,不是每个人都有 - Cloudflare Tunnel:免费,不需要公网...用 AI 写代码越来越快,但我学到东西了吗?https://xkcoding.com/2026-01-31-rethink-ai-coding-from-anthropic-research.htmlhttps://xkcoding.com/2026-01-31-rethink-ai-coding-from-anthropic-research.html学新东西的时候,AI 帮你绕过了犯错,也帮你绕过了理解本身。Anthropic 最新研究发现,用 AI 学新库的人和手写代码的人,差距最大的不是速度,而是调试能力。更值得关注的是 AI 组内部的分化:同样让 AI 生成代码,多追问一句「为什么」的人,对新知识的理解程度几乎翻倍。本文从这项研究出发,结合自己做 fathom 项目时从反复让 AI 调 bug 到跳出来重新审视架构的经历,也分享一些我自己的思考和踩过的坑。Sat, 31 Jan 2026 00:00:00 GMT一篇研究引发的思考 2026 年 1 月 29 日,Anthropic 发布了一篇研究:How AI assistance impacts the formation of coding skills(论文原文)。起因是一个矛盾的现象:一方面,Anthropic 自己的研究表明 AI 能将某些任务提速 80%;另一方面,其他研究发现使用 AI 后,人会减少思考投入,把认知负担卸载给 AI。这项研究想回答的问题是:效率提升的同时,你的编程能力还能不能跟着成长,还是会因此退化? 研究团队做了一个随机对照试验(RCT)。52 名初级软件工程师,学习一个他们不熟悉的 Python 库 —— Trio(用于异步编程),模拟的是工作中学新工具的场景。一半人可以用 AI 辅助,另一半手写代码。完成编码后参加测验,覆盖四个维度:调试、代码阅读、代码编写、概念理解。研究者特意侧重了调试、代码阅读和概念理解,理由是:未来越来越多代码由 AI 生成,人类最需要的能力不是写代码,而是审查代码 —— 能看出 AI 写的东西哪里不对、为什么不对。 结果:AI 辅助组平均答对 50%,手写组 67%。其中差距最大的...从 Vibe 到 Spec:我的 AI Coding 工作流https://xkcoding.com/2026-01-22-vibe-to-spec-ai-coding-workflow.htmlhttps://xkcoding.com/2026-01-22-vibe-to-spec-ai-coding-workflow.htmlVibe Coding 效率高,但方向容易跑偏,复杂度容易失控。本文分享一套亲测有效的两阶段工作流:Vibe 阶段用 Gemini 探讨方向,产出 Deep Research 报告;SDD 阶段用 OpenSpec 管理开发,proposal → review → apply → archive,先写规范再写代码。发散靠 Vibe,收敛靠 Spec。也分享了一些实践经验:一个 spec 只做一件事、出错如何回溯、何时触发深度思考。无论是 0→1 新项目还是老项目加功能,这套流程都管用。Thu, 22 Jan 2026 00:00:00 GMT写在前面 2025 年初,Andrej Karpathy 在 X 上提出了 "Vibe Coding" 这个概念: "There's a new kind of coding I call 'vibe coding', where you fully give in to the vibes, embrace exponentials, and forget that the code even exists." "I 'Accept All' always, I don't read the diffs anymore. When I get error messages I just copy paste them in with no comment." 说白了就是:完全信任 AI,不看代码,不读 diff,报错就贴,能跑就行。 用这种方式快速验证想法确实爽,但做稍微复杂点的东西,问题很快就来了: - 对话长了,AI 开始"失忆",前面定好的字段命名后面全忘了 - AI 自信地写出根本不存在的 API,编都不带眨眼的 - 改了登录逻辑,支付流程莫名其妙挂了 这些是 Vibe Co...用 Slash Command 扩展 Claude Code:从网页剪藏开始https://xkcoding.com/2026-01-17-extend-claude-code-with-slash-command.htmlhttps://xkcoding.com/2026-01-17-extend-claude-code-with-slash-command.html每次都手动抓网页喂给 Claude Code 做上下文?复制粘贴 HTML 一堆 CSS/JS 噪音,根本没法用。Slash Command 让你把这类重复工作流封装成 /xxx 命令,敲一下就跑。本文以网页剪藏为例,用 Firecrawl API 一键把网页转成干净的 Markdown——对比 AgentScope Java 文档页,curl 拿到的是十几个 link 标签,Firecrawl 直接给你结构化正文。一个是噪音,一个是信号。从 Frontmatter 配置到 API 调用到文件命名,全流程拆解,附反爬超时、积分消耗等踩坑指南。Sat, 17 Jan 2026 00:00:00 GMT写在前面 Claude Code 自带的能力已经很强,但总有些重复性的工作让人想偷懒。比如我经常需要把技术文档、博客文章抓下来喂给它做上下文——每次都手动复制粘贴,或者让它现场写爬虫,效率太低。 Slash Command 就是用来解决这类问题的。你可以把常用的工作流封装成一个命令,在 Claude Code 里敲 /xxx 就能执行。本文用「网页剪藏」做例子,手把手带你写一个实用的 Slash Command。 什么是 Slash Command 简单说,Slash Command 是你给 Claude Code 写的「快捷指令」。 它本质上是一个 Markdown 文件,放在项目的 .claude/commands/ 目录下。文件里写清楚这个命令要干什么、能用哪些工具、怎么执行。之后在 Claude Code 里输入 /文件名,它就会按你写的逻辑来。 举个例子: - /commit - 自动生成 commit message 并提交 - /test - 跑测试并分析失败原因 - /firecrawl - 把网页抓成 Markdown(今天要写的) 官方文档在这:Claude Cod...解决 MacOS BigSur JD-GUI 打开失败的问题https://xkcoding.com/2022-01-04-fix-error-about-jd-gui-on-big-sur.htmlhttps://xkcoding.com/2022-01-04-fix-error-about-jd-gui-on-big-sur.htmlMacOS 升级到 BigSur/Monterey 后,JD-GUI 打不开了?提示「No suitable Java version found」,明明装了 JDK 还报错?这是 JD-GUI 内置的 Java 检测脚本太老,不认识新版 MacOS 的问题。解决方法很简单:右键显示包内容,把 universalJavaApplicationStub.sh 替换成 GitHub 上的新版即可。三步搞定,继续愉快地反编译 Jar 包。Tue, 04 Jan 2022 12:48:04 GMT前言 JD-GUI 是一款轻量级的 Java 反编译工具,对于一些没有源码的 Jar 包,直接拖进去就可以反编译源码,十分的方便。 在 MacOS 还是 Mojave 的时候,JD-GUI 使用一切正常。 当系统升级到 BigSur 和 Monterey 的时候,打开 JD-GUI 就会提示找不到 JDK 环境。(即使你的电脑已经存在 JDK 环境并且配置了环境变量,依然会提示找不到 JDK 环境) 大致错误提示如下: log ERROR launching 'JD-GUI' No suitable Java version found on your system! This program requires Java 1.8+ Make sure you install the required Java version. 解决办法 起初,我第一感觉可能是新版的 MacOS 和老版本的 JD-GUI 不兼容导致的,然后在官网下载最新的 1.6.6 版本,安装后,依然报同样的错误信息。 这肯定不可能是我一个人遇到这个问题,于是我在官方仓库找到了这个问题 Update universa...《Flink入门与实战》之读书笔记https://xkcoding.com/2021-05-06-reading-notes-about-flinkrumenyushizhan.htmlhttps://xkcoding.com/2021-05-06-reading-notes-about-flinkrumenyushizhan.html想入门 Flink 实时计算?这本《Flink入门与实战》给你一些参考。前几章是官方文档导读,中间章节介绍广播变量、State 管理、窗口函数、WaterMark 等高阶特性,最后两个实战案例(实时 ETL + 实时报表)帮你理解应用场景。Flink 版本迭代快,API 还是要看官方文档。如果看不下去官方文档,本书是不错的入门选择。Thu, 06 May 2021 02:02:11 GMT总体评价 - 阅读状态:已读 - 阅读时间:2021/04/16 - 2021/05/06 - 个人评价:一般 本书前几个章节更像是官方文档的导读,中间几个章节粗略的介绍了一下 Flink 高阶 API 的使用,但考虑到 Flink 版本更新较快,因此最好还是根据文档学习 API,最后一章通过两个 demo 程序帮助更好的理解 Flink 的使用场景,重要的是学习如何在实际工作场景中去使用 Flink 解决实际问题。 如果沉得下心看官方文档,还是推荐看官方文档。反之,本书也不失为一本 Flink 的入门首选。 读书笔记 第1章 Flink概述 - 高吞吐表示单位时间内可以处理的数据量很大,低延迟表示数据产生以后可以在很短的时间内对其进行处理,也就是Flink可以支持快速地处理海量数据。 实时计算框架的选择也要看实际场景,脱离了场景、需求做技术选型,完全就是为了技术而用技术。 第2章 Flink快速入门 本章内容大段的粘贴官方文档的 HelloWorld 代码,看的真的是尴尬极了。。 第3章 Flink的安装和部署 本章介绍了下Flink集群的部署,有空可以尝试下,不过企业中大部分都是中...愉快的本地开发体验之本地DNShttps://xkcoding.com/2021-05-01-happy-dev-run-local-dns-server.htmlhttps://xkcoding.com/2021-05-01-happy-dev-run-local-dns-server.html本地开发服务太多,ip:port 记不住?用域名替代!方案一:SwitchHosts 修改 hosts 文件,简单但不支持泛域名;方案二:dnsmasq 容器化部署,一行配置支持 *.dev.io 泛域名解析;方案三:go-dnsmasq 解决内存泄漏问题,镜像仅 2.7M。附 Docker Compose 配置 + M1 芯片本地编译教程。Sat, 01 May 2021 02:42:11 GMT写在前面 大家在本地环境进行联调或者运行一些服务的时候,是不是经常通过 ip:port 进行测试。有时候服务一多,经常性的需要记住很多 ip:port 信息。 本文将介绍如何通过自定义域名的方式去替换 ip:port,减去我们的记忆负担,提升我们的开发体验。 方案一:修改本地 Hosts 文件 + Nginx Proxy 这里推荐一款工具,SwitchHosts(记忆中,之前的版本叫做 SwitchHosts!),页面简洁,操作一目了然。 配置 Hosts 文件,只需要将域名的地址跟 IP 做映射即可。 测试 bash ➜ ping a.dev.io PING a.dev.io (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmpseq=0 ttl=64 time=0.098 ms 64 bytes from 127.0.0.1: icmpseq=1 ttl=64 time=0.086 ms 64 bytes from 127.0.0.1: icmpseq=2 ttl=64 time=0.093 ms ^C 3 packe...当 Lombok 遇见了 MapStruct の「坑」https://xkcoding.com/2021-04-22-when-lombok-met-mapstruct.htmlhttps://xkcoding.com/2021-04-22-when-lombok-met-mapstruct.htmlLombok 和 MapStruct 都很香,但一起用就翻车?编译报错「找不到 getXXX() 方法」?别急,这是 Annotation Processor 执行顺序的锅。两者都在编译期生成代码,但 Maven 不知道要先跑 Lombok 再跑 MapStruct。本文带你理解问题本质,只需在 pom.xml 的 annotationProcessorPaths 里加一行配置,让 Lombok 排在 MapStruct 前面,问题迎刃而解。附完整可运行示例代码。Thu, 22 Apr 2021 06:01:21 GMT前言 2021 年了,相信搞 Java 的小伙伴们不会还没有人没用过 Lombok 吧? Lombok 是一款通过「注解」的形式简化并消除冗余代码的 Java 插件,利用「Annotation Processor」原理,在编译时生成一些「重复」代码。另外需要注意的是,在 IDEA 环境下,需要额外安装一个 Lombok 插件。(本文不会专门介绍 Lombok 的使用方法,想要深入学习的小伙伴可以去 官方文档 学习 Lombok 提供的所有注解的使用方法。) 可能一些朋友对 MapStruct 就有点陌生了,但是我敢肯定的是,你们一定用过和他功能类似的工具。比如 Apache Commons BeanUtils、Spring BeanUtils、BeanCopier、Dozer 等等。没错,MapStruct 也是为了解决对象属性拷贝这一个通用需求的。传统使用「反射」进行属性拷贝的方式,在大数据量的场景下,性能低下,效率堪忧。MapStruct 底层则是通过 getter/setter 的方式提升属性拷贝的性能的,跟 Lombok 一样利用「Annotation Processor」的原...《小时候真傻,居然盼着长大》之读书笔记https://xkcoding.com/2021-04-15-reading-notes-about-xiaoshihouzhensha-juranpanzhezhangda.htmlhttps://xkcoding.com/2021-04-15-reading-notes-about-xiaoshihouzhensha-juranpanzhezhangda.html老舍散文精选集,小时候盼着长大,长大后才明白成年人的世界没有容易二字。北京的春节、贺年的劳动滋味、考试制度的吐槽、理想家庭的描绘……还有那句「人是为明天活着的,因为记忆中有朝阳晓露」。往事如风,你来人间一趟,你要看看太阳;你若爱生活哪里都可爱。推荐阅读~Thu, 15 Apr 2021 02:02:11 GMT总体评价 - 阅读状态:已读 - 阅读时间:2021/03/18 - 2021/04/15 - 个人评价:推荐 小时候,无忧无虑,傻傻的盼着长大; 长大了,各有各的难处,成年人的世界哪有容易二字; 往事如风,只能用回忆纪念; 你来人间一趟,你要看看太阳;你若爱生活哪里都可爱。 读书笔记 封面 - 小时候,画在手上的表没有动,却带走了我们最好的时光。长大后才明白,成年人的世界,从来没有简单二字。但生活就是由各种琐事组成的,它们共同构成了我们五彩斑斓的人生。追赶不上的不追,不属于自己的不要,挽留不住的不留,生活哪有那么复杂,简单甚好。 第一章 小时候真傻,居然盼着长大 - 小孩子们买各种花炮燃放,即使不跑到街上去淘气,在家中照样能有声有光地玩耍。这的确是美好快乐的日子。 北京的春节 - 元旦 这里的元旦指的应该是正月初一 - 男男女女都出来踏月、看灯、看焰火;街上的人拥挤不动。在旧社会里,女人们轻易不出门,她们可以在灯节里得到些自由。 - 现在的儿童只快活地过年,而不受那迷信的熏染,他们只有快乐,而没有恐惧——怕神怕鬼。 - 也许,现在过年没有以前那么热闹了,可是多么清醒健康呢。以前,...使用 docker 快速启动本地 ZooKeeper 集群https://xkcoding.com/2021-04-14-run-local-zookeeper-cluster-with-docker.htmlhttps://xkcoding.com/2021-04-14-run-local-zookeeper-cluster-with-docker.html学大数据绑不开 ZooKeeper,但安装配置让人头疼?Docker Compose 一键搞定!本文提供单机版和集群版两套方案:单机一行命令 `docker run`;集群三节点配置 ZOO_MY_ID + ZOO_SERVERS,利用 Compose 网络互通特性组成集群。还解决了 Curator 连接集群报 NPE 的坑——需要配置 hosts 通过 hostname 连接。Wed, 14 Apr 2021 08:03:53 GMT前言 ZooKeeper ,翻译过来就是:动物园管理员,而这也是它 logo 的由来。它是一个为分布式应用提供一致性服务的软件,是大数据场景下的一个重要的基础组件。所以安装 ZooKeeper,也是入门学习大数据的第一步。 曾几何时,我们在学习大数据技术的时候,总是先在本地环境启动虚拟机应用,然后开始初始化虚拟机配置和环境,紧接着开始安装软件。此时如果需要模拟一些集群环境,还需要进行大量重复的苦不堪言的配置工作。 今天我们便利用 Docker 来快速的在本地启动一个 ZooKeeper 环境。 实操 环境 自行在本机安装 Docker 和 Docker Compose 软件,如果网络环境差的,可以配置阿里的镜像源地址,本文不再赘述。 寻找合适的镜像 前往 镜像仓库 可以很轻松的搜索到 ZooKeeper,发现已经提供了 官方镜像,美滋滋,省去了我们鉴别镜像甚至自己封装镜像的步骤。 启动单机版 ZooKeeper 你可以简单的执行下面的命令运行一个单节点的 ZooKeeper,这里我们选择目前最新的 3.7.0 版本。 bash $ docker run -d -p 2181:2181...《史蒂夫·乔布斯传》之读书笔记https://xkcoding.com/2021-03-16-reading-notes-about-shidifuqiaobusizhuan.htmlhttps://xkcoding.com/2021-03-16-reading-notes-about-shidifuqiaobusizhuan.html《史蒂夫·乔布斯传》阅读中断的笔记。乔布斯的童年、被遗弃与被收养、养父母对他的影响、印度寻找精神导师的经历……学到了「现实扭曲力场」的由来。他不是众人可效仿的楷模,但他的个性、激情与产品紧密关联。「如果你表现得好像掌控了一切,别人就会以为你真的掌控了一切。」待续……Tue, 16 Mar 2021 02:02:11 GMT总体评价 - 阅读状态:暂停 😭 - 阅读时间:2021/03/06 - 2021/03/16(暂停) 读书笔记 2021/03/06 chap. 前言 本书是如何诞生的 这是一本关于一个富有创造力的企业家的书,关于他过山车一般的人生,关于他炽热强烈的个性。 他不仅制造出革命性的产品,还在自己的第二次努力下成就了一家充满生命力的公司,这家公司继承了他的基因,集中了一群极富想象力的设计师和大胆创新的工程师,他们能够将他的设想发扬光大。 全世界都在努力建设创造性的数字时代经济,乔布斯成为了创造力、想象力以及持续创新的终极标志。他深知21世纪创造价值的最佳途径就是将创造力与科技结合起来,所以他创建了一家公司,在这里,想象力的跳跃与高超的工程学技术被结合到一起。 他不是众人尽可效仿的模范老板,或是人类楷模。他就像被恶魔驱使一样,可以让身边的人狂怒和绝望。但他的个性、激情与他的产品之间是相互关联的,就好像苹果的硬件和软件一样,各为整体系统的一部分。因此,他的故事既有启发性,也有告诫意义,其中充满了创新、品质、领导力和价值观方面的经验。 2021/03/07 chap. 第一章 童年 真正的潜在...如何在本地快速启动一个 K8S 集群https://xkcoding.com/2021-03-15-run-local-k8s-cluster-quickly.htmlhttps://xkcoding.com/2021-03-15-run-local-k8s-cluster-quickly.html学 K8S 不想只看文档?想在本地搭集群练手却被网络和资源劝退?k3d 了解一下——基于 Docker 运行 k3s,一行命令创建「1主2从」集群,启动快、资源省、还能模拟多节点调度。本文对比 minikube/microk8s/kind/k3d 四种方案,手把手教你用 k3d 搭建本地 K8S 环境,从创建集群到部署 nginx 验证 Ingress,10 分钟搞定。附 kubecm 多集群切换技巧。Mon, 15 Mar 2021 09:44:47 GMT背景 最近在阅读《每天5分钟玩转Kubernetes》 这本书,个人感觉是一本不错的 K8S 的入门书籍。 我们在刚开始学习一项技术的时候,不论是通过官方文档、书籍,亦或是视频的形式,如果仅仅是去看,而不去练习实践的话,那么是很难将其真正应用起来的。 然而当我开始准备实践的时候,发现要想在本地将 K8S 跑起来,并不像我们想象的那么容易。存在以下几点「问题」: - 网络环境:K8S 里面的一些镜像在国内很难将其 pull 下来,当然这可以通过代理、镜像站等方式解决。 - 资源消耗:在内存资源不这么充裕的本地开发环境,去部署一个 K8S 集群,这无疑不是一个明智的选择。 那么有没有什么方案可以更优雅更轻量更快速搭建一个 K8S 集群呢?答案就是 k3d。 其实有很多种方式可以在本地运行 k8s,比如: - minikube 仅支持单节点,但是我们期望可以跑一个集群的方式,方便我们去 Mock 节点宕机之后 K8S 自动调度的 case ✖️ - microk8s 是 Ubuntu 生态里提供的一个可以单机运行的 k8s 版本,配合 Ubuntu 生态的 multipass,可以模拟多节点...解决 MacOS BigSur 使用 pip 安装依赖失败的问题https://xkcoding.com/2021-03-10-fix-error-about-python-package-install-on-big-sur.htmlhttps://xkcoding.com/2021-03-10-fix-error-about-python-package-install-on-big-sur.html被基金伤透了心,想学量化交易?安装聚宽数据 SDK 却报错 `clang: error: invalid version number in 'MACOSX_DEPLOYMENT_TARGET=11'`?这是 macOS Big Sur 的坑!Command Line Tools 版本太旧不支持 macOS 11。解决方法:用 `brew doctor` 检测问题,重装 CLT 升级 clang 到 12.0。附完整排查思路 + 解决步骤。Wed, 10 Mar 2021 11:23:16 GMT前言 年后到现在,我已经被基金伤透了心🤕 于是乎,为了争取不做 韭零后,我打算学习一下关于量化交易方面的内容。 学习量化交易,首先得先拿到交易的数据,这里我使用的是 聚宽数据 提供的本地数据接口,官方提供了 Python SDK,所以我就开始照着文档安装 SDK …… 照着文档的安装步骤,其实很简单: shell $ pip install jqdatasdk 如果一切正常,那么你可以直接关掉本文了。 可如果你的环境和我一样: - 系统版本:MacOS BigSur 11.2.3 - Python 版本:3.9 - IDE 版本:PyCharm Professional 2020.3 那么很有可能会安装失败,并且错误日志如下(截取部分日志): shell $ pip install jqdatasdk Collecting jqdatasdk Using cached jqdatasdk-1.8.8-py3-none-any.whl (151 kB) Requirement already satisfied: six in /usr/local/lib/python3.9/si...《每天5分钟玩转Kubernetes》之读书笔记https://xkcoding.com/2021-03-06-reading-notes-about-meitian5fenzhongwanzhuankubernetes.htmlhttps://xkcoding.com/2021-03-06-reading-notes-about-meitian5fenzhongwanzhuankubernetes.html想入门 K8S 但被官方文档劝退?这本《每天5分钟玩转Kubernetes》或许适合你。从 minikube 体验到 kubeadm 部署三节点集群,从 Pod/Service/Ingress 到 Helm 包管理,从健康检查到持久化存储……前12章循序渐进,小白友好。作为入门书籍还不错,但一定要动手实践!附个人 k3d+k3s 实践笔记。Sat, 06 Mar 2021 02:02:11 GMT总体评价 - 阅读状态:已读 - 阅读时间:2021/02/27 - 2021/03/06 - 个人评价:一般 本书前十二章内容适合刚接触 K8S 的小白做入门学习,后面几章内容略显仓促收尾。作为一本 K8S 的入门书籍,还是不错的。 小白学习,一定要记得练习。 读书笔记 2021/02/27 chap. 第1章 先把Kubernetes跑起来 本书偏入门,第一章主要是通过 minikube 来体验 K8S 的功能,学一项新技术,首先需要跑起来。 2021/02/28 chap. 第2章 重要概念 本章内容主要是介绍 K8S 中的一些名词概念以及各个组件在 K8S 中的职责。 2021/03/01 chap. 至第4章 Kubernetes架构 学习了如何通过 kubeadm 部署三节点的 K8S 集群,同时学习了 K8S 的架构以及 Master 和 Node 节点分别跑哪些组件和服务。 PS:因个人资源与网络环境问题,个人使用 k3d+k3s 实践。 2021/03/02 chap. 第5章 运行应用 学习了 K8S 中不同类型 Controller 的作用以及如何通过 yaml...《富爸爸穷爸爸》之读书笔记https://xkcoding.com/2021-02-24-reading-notes-about-fubabaqiongbaba.htmlhttps://xkcoding.com/2021-02-24-reading-notes-about-fubabaqiongbaba.html工资涨了却越来越穷?「富爸爸穷爸爸」颠覆你的金钱观:资产是把钱放进口袋的东西,负债是把钱取走的东西。富人让钱为自己工作,穷人为钱工作。财务知识比高薪更重要,因为不靠财商挣来的钱也留不住。理财小白必读,建立你的财商第一课。本书虽有争议,但这些观念确实让人耳目一新。Wed, 24 Feb 2021 02:02:11 GMT总体评价 - 阅读状态:已读 - 阅读时间:2021/02/04 - 2021/02/24 - 个人评价:推荐 本书整体还是比较推荐阅读的,对于理财小白来说,本书最大的意义就是在于给我们建立一个财商的观念。 有很多观点对于毫无理财观念的小白来说,有点耳目一新的感觉。 读书笔记 2021/02/04 chap. 第一课:富人不为钱工作 1. 如果你们能看到一个机会,就注定你们会在一生中不断地发现机会。 2. 穷人和中产阶级为钱而工作。富人让钱为他工作。 3. 对大多数人而言,给他们的钱越多,他们欠的债也就越多。 2021/02/06 chap. 第二课:为什么要教授财务知识 1. 你挣了多少钱不重要,重要的是你留下多少钱,以及能够留住多久。 2. 只有知识才能解决问题并创造财富,那些不是靠财务知识挣来的钱也不会长久。 3. 富人获得资产,而穷人和中产阶级获得负债,只不过他们以为那些负债就是资产。 2021/02/07 chap. 第二课:为什么要教授财务知识 1. 资产就是能把钱放进你口袋里的东西,不管我工作与否。负债是把钱从我口袋里取走的东西。 2. 财富就是支撑一个人生存多长时间的能...2020.Q4&年度总结https://xkcoding.com/2021-01-18-Q4-2020-and-year-summary.htmlhttps://xkcoding.com/2021-01-18-Q4-2020-and-year-summary.html2020 当实「鼠」不易,2021 望「牛」转乾坤!Q4 是我在涂鸦的第一个完整季度,独立设计并上线了精准营销和营销自动化系统。人生大事:11.22 领证,寓意 1+1=2+2!年底聚会如梦技术团队收获颇丰。这一年经历离职、亲人离世、经济压力……但一切都在变好。坚持写日记是今年最正确的事。Mon, 18 Jan 2021 09:05:00 GMT我们都在用力的活着 前言 Q4 算是我在涂鸦迎接的第一个挑战,今年的 Q4 对我个人来说也是意义非凡的。 2020,当实「鼠」不易;2021,望「牛」转乾坤! 1. 我的 Q4 Q4 是我在涂鸦所经历的第一个完整的 Q,涉及到季度 KPI 的考核,所以说 Q4 是我在涂鸦迎接的第一个挑战。 Q4 我也完成了一些人生角色的转变,所以对我个人来说也是意义非凡的。 1.1. 工作 Q4 是 2020 年的尾巴,产品经理要做年度汇报,收尾工作要做的到位、做的漂亮,开发的工作量必然少不了。Q4 的工作是富有难度且极具挑战的。 10-11 月,根据埋点数据进行精准营销的功能。11-12 月,设计并实现了一套营销自动化流程的功能。 目前均已上线投入使用,营销工具的覆盖场景已覆盖公司 100% 的运营同学,同时代码质量我自己也是比较满意,Q4 的工作整体应该是达标状态。 1.2. 生活 国庆加完班,就带着老爸老妈去了趟襄阳,带我爸妈去见妞爸妞妈。整体还算是顺利。 后面错过了 10.24、11.11,终于是在 11.22 带着妞去领了个证,从此以后,xkcoding 也是已婚人士啦。 11.22 这个日...快速运行一个你自己的「一言」程序https://xkcoding.com/2020-11-02-quick-run-you-own-yiyan.htmlhttps://xkcoding.com/2020-11-02-quick-run-you-own-yiyan.html「一言」官方 API 有频率限制?自己搭一个内网版!Docker Compose 一键部署:Redis + hitokoto/api 镜像,5 分钟搞定。附 Nginx 反向代理配置 + 前端 HTML 集成示例,完整 docker-compose.yml 直接拿来用。动漫台词、网络金句,属于你的私有一言服务~Mon, 02 Nov 2020 15:21:53 GMT前言 动漫也好、小说也好、网络也好,不论在哪里,我们总会看到有那么一两个句子能穿透你的心。我们把这些句子汇聚起来,形成一言网络,以传递更多的感动。如果可以,我们希望我们没有停止服务的那一天。 简单来说,一言指的就是一句话,可以是动漫中的台词,也可以是网络上的各种小段子。 或是感动,或是开心,有或是单纯的回忆。来到这里,留下你所喜欢的那一句句话,与大家分享,这就是一言存在的目的。 ——选自「一言」简介 1. 为什么要自己搭建? 「一言」其实提供了在线的 api 地址访问,因为「一言」是一个免费的服务,因此必然是对访问频率存在一定的限制,同时也有可能存在一定的网络延迟(考虑地域/网络环境等影响因素)。 「一言」官网:https://hitokoto.cn/ 在线 API 地址:https://v1.hitokoto.cn/ API 文档:https://developer.hitokoto.cn/ 2. 快速运行 本着快速运行的目的,Docker 自然会成为我们的首选工具,好在「一言」提供了官方的 Docker 镜像,简直就是懒人神器 首先我们创建一个文件夹存放程序启动时相关的文件 bas...如何在 Spring 环境下优雅的实现策略模式https://xkcoding.com/2020-10-11-how-to-use-strategy-design-pattern-in-spring.htmlhttps://xkcoding.com/2020-10-11-how-to-use-strategy-design-pattern-in-spring.htmlES 查询、CSV 导入、MongoDB 查询……一堆 if-else 判断数据来源?Spring 环境下策略模式帮你优雅消灭!核心技巧:用 List<接口> 注入所有实现类,工厂类按类型选择策略。文中还藏着模板方法模式和工厂模式,多种设计模式协同作战,代码更优雅!Sun, 11 Oct 2020 01:13:29 GMT背景 最近在忙一个需求,大致就是给满足特定条件的用户发营销邮件,但是用户的来源有很多方式:从 ES 查询的、从 csv 导入的、从 MongoDB 查询….. 需求很简单,但是怎么写的优雅,方便后续扩展,就存在很多门道了。 我们的项目是基于 Spring Boot 开发的,因此这篇文章也会基于 Spring Boot 作为基础框架,教你如何使用 Spring 依赖注入的特性,优雅的实现策略模式。 1. 简单粗暴 最简单粗暴直接的方式莫过于 if...else… 了,伪代码如下: java if(来源 == ES){ // TODO: ES Query }else if(来源 == CSV){ // TODO: Read CSV File }else if(来源 == MongoDB){ // TODO: MongoDB Query } 如果后面还需要从其他平台获取,那就在接着添加 else if...,这种方式固然简单直接,但是当后续扩展的方式越来越多,相应的if...else...也会越来越长,emmm…..怎么说呢,黑猫白猫,能抓到老鼠的就是好猫。 2. 策略模式 在...2020.Q2&Q3总结https://xkcoding.com/2020-10-01-Q2-Q3-2020.htmlhttps://xkcoding.com/2020-10-01-Q2-Q3-2020.html被糟心事包裹的 Q2 Q3,但仍有一丝美好。外公病情、待业 5 个月、面试有赞/涂鸦/酷家乐/天猫精灵……最终选择涂鸦。技术氛围、团队氛围真的很重要!感谢一路帮助我的朋友们。附面经分享,需要涂鸦内推的欢迎私聊~Wed, 30 Sep 2020 22:14:48 GMT今天国庆节,那就祝大家不加班的不要堵车,加班的不要出生产事故。😏 转眼,今年仅剩下百天不到啦。高能预警,灵魂发问环节。各位今年的计划完成的咋样?是超期完成还是又一次偷偷摸摸改成了明年计划?行动起来,今年说不准还有机会的。 1. 总结 本打算是 Q2、Q3 分别做总结的,无奈 Q2 实在是糟心事都搅在一块了,Q2 也就顺理成章的拖延到 Q3 总结里。 我的 Q2、Q3 总结下来就是一句话:被糟心事包裹的 Q2、Q3,但仍有一丝美好。 大部分不顺心的事情集中在 Q2,外公病情加重导致面试流程延期、长时间的待业也带来了一些负面情绪。7 月初传来外公病情好转的消息,没想到 7 月底,外公还是走了。世事无常,调整情绪之后,也继续之前的一些面试流程。 面了一些公司,包括:有赞(有赞云)、涂鸦(云端开发)、酷家乐(房企业务)、天猫精灵(中台事业部)、天猫新零售(国际化中台),其中大华体验极差(被放鸽子)。几个 offer 抉择下,最终选择了涂鸦,这里感谢老同学 @hank 的内推支持 从入职到现在,也已经待了 1 个月时间,也说下自己的感受。 - 氛围:技术氛围+团队氛围,真的很重要。 - 组员:...周末的不务正业~https://xkcoding.com/2020-09-13-what-i-like-to-do-0.htmlhttps://xkcoding.com/2020-09-13-what-i-like-to-do-0.html周末的不务正业~ 花了一个半小时折的燕子Sun, 13 Sep 2020 07:09:22 GMT周末的不务正业 花了一个半小时折的燕子justauth-spring-boot-starter 1.3.4.beta 发布https://xkcoding.com/2020-08-31-justauth-spring-boot-starter-publish-1-3-4-beta.htmlhttps://xkcoding.com/2020-08-31-justauth-spring-boot-starter-publish-1-3-4-beta.htmlJustAuth 新版来袭!1.3.4.beta 两大新特性:① 自定义 HTTP 代理,轻松测试 Google、Facebook 等国外登录;② 自定义 scopes 参数,获取更多用户权限。配置示例一看就懂,附完整 YAML 配置模板。升级 hutool-core 5.4.0 修复 JSONUtil 报错问题。Mon, 31 Aug 2020 14:51:25 GMT前言 好久不见,鸽了那么久,我回来了。Q2&Q3 发生了挺多事情,等后面总结的时候再详细说说。今天给大家带来的是 justauth-spring-boot-starter 的 1.3.4.beta 新版本的一些新特性。废话不多说,走起 1. 版本特性 本次版本发布,使用的 JustAuth 的版本是 1.15.7-beta.3 版本,该版本主要是完善了 2 个能力: - 使用新版本的 simple-http ,支持自定义配置代理的功能,方便有特殊需求的小伙伴测试 Google/Facebook 等国外的一些第三方登录平台 - 支持自定义 scopes 参数,方便小伙伴们获取更多的用户权限 同时升级 hutool-core 版本:5.4.0,修复 JSONUtil.toJsonStr(obj) 报错的问题,参见 ISSUE#8 2. 如何使用 2.1. 引用依赖 xml com.xkcoding.justauth justauth-spring-boot-starter 1.3.4.beta 2.2. 如何配置自定义 http proxy 修改配置文件,增加如下配置: ym...悼念外公https://xkcoding.com/2020-07-28-mourning-grandpa.htmlhttps://xkcoding.com/2020-07-28-mourning-grandpa.html终究是没能熬过这个庚子年。Tue, 28 Jul 2020 04:56:47 GMT终究是没能熬过这个庚子年。 今年以来,外公就已经躺在床上起不来了,上周开始进不了食,住院治疗。今天接到爸爸的电话,外公永远地离开我们了。 我算是从小被外公外婆和表姐疼大的孩子,他们一直陪伴着我的成长,直到我远赴湖北求学,才开始变得聚少离多。从有记忆开始,外公就是个不爱说话的人,能让外公说很多话的场景,大概也是在表弟和我打闹的时候的一些训斥。外公这辈子是个劳碌命,是一个闲不住的人,喜欢听戏,喜欢田地,但凡还动的了就要下地干活,啥都种一点,还啥都种的好。外公喜欢花草,家里的院子、二楼的阳台,养了很多盆栽,即使到现在回想起来,我依然还是绝大部分都不认识。 其实我是个挺怕外公的人,外公是个不苟言笑的人,虽然外公瘦瘦的还有些佝偻着背,但是还是极具威严。记得19年第一次带妞去见外公外婆的时候,那时候外公还下得了床,但是得靠支架支撑,我挺怕他们会因为外地女孩儿的身份对妞有偏见,没想到他们很开心,那是我少有的几次见到外公笑的场景。 接到消息的时候,脑海是一片空白的,虽然早已做好了准备,但是当不幸到来的时候,自己还是有些扛不住。外孙未能如愿尽孝,子欲养而亲不待的痛楚莫过如此。愿您在另一个世界里能够好好休...spring-boot-demo 配套视频教程https://xkcoding.com/2020-06-28-video-tutorial-of-spring-boot-demo.htmlhttps://xkcoding.com/2020-06-28-video-tutorial-of-spring-boot-demo.html学 Spring Boot 只看文档不够爽?现在有配套免费视频了!讲师冷冷是 pig、Spring Boot、Spring Security Oauth、Spring Cloud Alibaba 等多个知名开源项目的 committer。课程内容与 spring-boot-demo 完全一致,中间件全程 Docker 部署,学习无门槛!Sun, 28 Jun 2020 04:36:38 GMTspring-boot-demo 项目地址:https://github.com/xkcoding/spring-boot-demo spring boot demo 是一个用来深度学习并实战 spring boot 的项目,目前总共包含 66 个集成demo,已经完成 54 个。 现在,配套视频正式来袭 配套视频介绍 讲师:冷冷 介绍:国内知名开源项目 pig 作者,Spring Boot 的 committer,Spring Security Oauth 的 committer,Spring Cloud Alibaba 的 committer,Spring Cloud Gateway 的 committer,Nacos、Sentinel 的 committer,Feign 的 commiter 视频地址:https://www.bilibili.com/video/BV1Nf4y117W6 视频简介:本系列视频课程全部开源免费,课程内容保持和 spring-boot-demo 完全一致,所有 Spring Boot 版本采用官网最新版本,所有中间件部署均采用 Docker 安装形式...如何解决 Quartz Job 中无法注入 Spring Beanhttps://xkcoding.com/2020-06-05-fix-quartz-job-cannot-autowired-spring-beans.htmlhttps://xkcoding.com/2020-06-05-fix-quartz-job-cannot-autowired-spring-beans.html在 Quartz Job 里 @Autowired 结果 NPE?别急着怀疑人生。这是因为 Job 实例由 Quartz 内部创建,压根不在 Spring 容器管辖范围内。本文从 SchedulerFactoryBean 源码入手分析问题根因,提供两种解法:自定义 JobFactory 配合 AutowireCapableBeanFactory,或者用 SpringUtil 工具类手动获取 Bean。文末还揭秘了 Spring Boot 2.x 为什么默认就能注入——因为它用了 SpringBeanJobFactory。Fri, 05 Jun 2020 02:51:50 GMT1. 问题 不知道小伙伴们在 Spring 集成 Quartz 的时候有没有遇到过这样一个问题,就是在 Quartz 的 Job 中 @Autowired 一个 Spring Bean 的时候会报空指针异常。如果在 Spring 中无法使用 @Autowired 进行注入一个 Bean 的话,这无疑是一个噩耗,那么遇到这个问题,该如何解决呢? 2. 原因 出现这个问题是因为定时任务的 Job 对象实例化的过程是通过 Quartz 内部自己完成的,但是我们通过 Spring 进行注入的 Bean 却是由 Spring 容器管理的,Quartz 内部无法感知到 Spring 容器管理的 Bean,所以没有办法在创建 Job 的时候就给装配进去。 3. 源码分析 传统的 Spring 项目,我们可以看到 Schedule 的创建是通过 SchedulerFactoryBean 进行创建的,我们看一下 SchedulerFactoryBean 源码,该类实现了 InitializingBean 接口,会在 Bean 属性初始化之后调用 afterPropertiesSet() 方法。 java...我的博客是如何集成CICD的?https://xkcoding.com/2020-06-01-how-does-my-blog-integrate-cicd.htmlhttps://xkcoding.com/2020-06-01-how-does-my-blog-integrate-cicd.html静态博客发布文章太繁琐?CI/CD 来解放双手!本文分享博客部署演进:v1.0 Jenkins + Travis-CI 自动构建推送 Pages;v2.0 升级 GitLab CI + Docker Swarm 容器化部署,Traefik 反向代理实现 0 配置负载均衡。附完整 Jenkinsfile、.gitlab-ci.yml 配置。Mon, 01 Jun 2020 15:36:42 GMT1. 前言 博客现在貌似成为了一个技术人的标配,从最初的炫技到单纯的记录自己的成长历程。我的博客也经历了很多次「蜕变」。 当下博客的选型十分多,这里我列举一些: - 动态博客 - WordPress:http://www.wordpress.com/ - Ghost:https://ghost.org/ - Halo:https://halo.run/ - ... - 静态博客 - jekyll:http://jekyllcn.com/ - hexo:https://hexo.io/ - hugo:https://gohugo.io/ 关于动态和静态的区别主要有以下几点: - 资源占用:静态博客相比动态博客占用服务器资源更少; - 发布更新:由于静态博客没有管理后台,所以发布更新内容要比动态博客繁琐; - 访问速度:静态博客没有数据库的访问连接,所以静态博客访问速度更快; 本站使用的就是静态博客 hexo 加上 Next 主题搭建的,同时也自定义了一些样式和功能。上面说到静态博客发布更新文章比较繁琐,那么有没有什么方法可以简化发布流程,提升整个写作体验呢?答...如何实现一个你自己的 RPC 框架(3)https://xkcoding.com/2020-05-26-how-to-design-your-own-rpc-framework-3.htmlhttps://xkcoding.com/2020-05-26-how-to-design-your-own-rpc-framework-3.htmlNIO 读写数据仍是同步的,AIO 才是真正的异步!本文使用国产框架 smart-socket 重构 RPC:异步 IO 操作,CompletableFuture 阻塞获取结果,MessageProcessor 处理请求响应。BIO → NIO → AIO,三种 IO 模型的 RPC 实战对比系列完结篇。Tue, 26 May 2020 06:43:05 GMT前言 在前面的文章《如何实现一个你自己的 RPC 框架(1)》中,我们通过 BIO 去实现了一个简单的 RPC 通信案例,同时在《如何实现一个你自己的 RPC 框架(2)》中我们将 BIO 改造成了 NIO,今天我们将会基于第一次 BIO 的案例进行改造,将 BIO 改造为 AIO 通信。 1. 什么是 AIO 在《如何实现一个你自己的 RPC 框架(2)》中已经介绍了 BIO、NIO、AIO,不知道的小伙伴可以前往查看,在此不做赘述了。 2. 选型 本文将选用国产 AIO 框架 smart-socket 来实现 AIO 改造。 3. 实战 本次代码是基于《如何实现一个你自己的 RPC 框架(1)》进行重构的,因此模块划分保持一致,可以在上一次的基础上进行修改。本文为了凸显区别,模块名均进行修改,由 bio 变更为 aio。 模块划分: java rpc-demo-3 ├── rpc-client-aio // 客户端 ├── rpc-common-aio // 通用模块,封装 RPC 请求参数 └── rpc-server-aio // 服务端...如何实现一个你自己的 RPC 框架(2)https://xkcoding.com/2020-05-12-how-to-design-your-own-rpc-framework-2.htmlhttps://xkcoding.com/2020-05-12-how-to-design-your-own-rpc-framework-2.htmlBIO 一个连接一个线程,大量连接直接崩溃!NIO 同步非阻塞如何解决?本文基于 Netty 重构 RPC 框架:ServerBootstrap 替换 ServerSocket,Channel + Handler 处理请求,事件驱动提升性能。从 BIO 到 NIO 的进化之路,附完整代码对比。Mon, 11 May 2020 16:02:27 GMT前言 在上一篇《如何实现一个你自己的 RPC 框架(1)》中,我们通过 BIO 去实现了一个简单的 RPC 通信案例,今天我们将会基于上次的案例进行改造,将通信由 BIO 改造为 NIO。 1. 什么是 NIO 说到 NIO,就需要一起聊聊它的俩兄弟,BIO 以及 AIO。 BIO:Blocking IO,同步阻塞 IO。简单的说就是服务端创建一个 ServerSocket,客户端通过 Socket 去连接 ServerSocket,服务端会通过 accept 去阻塞等待客户端的请求。BIO 存在一个十分明显的问题,就是每当存在一个客户端连接服务端时,服务端都会启动一个线程,专门的去服务这个客户端,这将导致如果出现大量的客户端连接时,服务端将会产生大量的线程开销,导致崩溃。(因此,在上一篇文章中,我们在服务端使用一个线程异步的去处理这些请求,尽量增大服务端每个线程可以处理的请求数,来达到略微优化的目的。) NIO:NonBlocking IO,同步非阻塞 IO。在 Java 1.4 中引入,NIO 是基于 Reactor 模型。NIO 中引入了 Selector、Channel、Buf...如何实现一个你自己的 RPC 框架(1)https://xkcoding.com/2020-04-20-how-to-design-your-own-rpc-framework-1.htmlhttps://xkcoding.com/2020-04-20-how-to-design-your-own-rpc-framework-1.html远程过程调用(RPC)让分布式调用像本地调用一样简单,但底层原理你了解吗?本文从零实现一个 RPC 框架:用 BIO 的 Socket/ServerSocket 做网络通信,JDK 序列化传输数据,动态代理让调用方无感知。三个核心技术点,附完整可运行代码。Mon, 20 Apr 2020 08:31:27 GMT前言 RPC,全称:Remote Procedure Call,翻译过来就是:远程过程调用。主要用来在分布式系统中,解决不同系统间的服务调用问题。RPC 不仅要让实现服务间的通信,还有一点就是要让用户在远程调用的过程中像是在本地调用一样方便。如何实现一个简易的 RPC 通信呢?这个系列的文章将会一一解答。 1. 设计 首先我们看看本地调用的流程,本地调用,我们相当于是直接通过 new 的方式去创建一个对象,然后调用对象的方法去获取数据。 如果是分布式系统,服务调用方和服务提供方,分布在不同的服务上,此时调用关系就变成了这样子,我们将调用方和提供方分别用 client 和 server 代替。 既然是远程调用,必然涉及到 IO 通信、传输内容序列化 / 反序列化 等技术。 IO 通信分为 BIO、NIO、AIO 序列化又分为 JDK 自带的序列化机制、XML、JSON、二进制等等 - XML - Json:jackson、fastjson、Gson - 二进制方式:hessian、avro、kyro、protobuf 各序列化方式性能比较:https://github.com/eisha...2020.Q1总结 & 离职感想https://xkcoding.com/2020-04-01-somewords-about-dissmission-2020.htmlhttps://xkcoding.com/2020-04-01-somewords-about-dissmission-2020.html马云说离职无非两原因:钱给少了、心委屈了。2 年时间,从技术输出到团队管理,为什么最终选择离开?需求不明确的会议、技术推广的阻力、产品质量的无奈……当努力得不到匹配回报,是时候换个环境了。疫情下的职场思考与 Q2 计划。Wed, 01 Apr 2020 06:42:30 GMT这里先祝大家愚人节快乐。 看了眼上次博客更新的时间,也已经过去了一个季度,真是将“拖字诀”发挥的淋漓尽致。今天聊聊我对这个季度的总结以及自己的一些离职感想。 2020 注定是个不平凡的一年! 1. Q1 总结 转眼间,2020 已经过去 1/4,说实话,这个季度我感觉自己是虚度的。 感情 原计划于今年带爸妈去襄阳与妞的爸妈聊聊婚礼的事情,因为疫情的原因,还不知道什么时候执行,与之直接存在影响的应该就是今年的结婚计划。 我和妞夫人已经携手走过了 6 年时光,等待是为了更好的前行。 工作 我已于 2020.03.19 正式离开美创,告别了2 年朝夕相处的领导及同事,感谢领导们的培养与信任,也感谢同事们的包容与照顾。 在美创的这段时间里,我学到了很多,尤其是团队管理方面的知识,第一次带团队,感谢 Team 小伙伴的信任。这 2 年时间,我向团队输出了一些内容,包括开发规范、微服务架构、容器化部署、基础依赖架构等,对我来说也是一种成长。 美创是一家不错的公司,当你展现出足够的实力的时候,美创的领导们愿意花时间培养你、给你匹配的资源。 至于我为什么要离职? 马云爸爸曾经说过,离职无非 2 个原因...又是一年总结时https://xkcoding.com/2020-01-01-bye2019-hello2020.htmlhttps://xkcoding.com/2020-01-01-bye2019-hello2020.html十年匆匆而过,从中考吊车尾到大学专业前三,从北漂初入职场到开源贡献者。2019 年的高光时刻:spring-boot-demo 登顶 GitHub 热门 Java 榜第一名!参与 JustAuth、发布 magic-starter……回顾这一年的工作、技术、开源与生活,展望 2020 新的 decade。Tue, 31 Dec 2019 16:00:00 GMTWe are all in the gutter,but some of us are looking at the stars. 2019 年转眼就过去了,迎来了新一轮的 decade。十年匆匆而过,我想借这次机会,好好的总结下这十年。 忆往昔 杂记 2010 年,我经历了中考,2013 年,我经历了高考,2 场决定命运起点的考试。 10 年的中考,吊车尾的挤上了「仙中」,一年不懈的努力,终于挤进了「五班」。 高中,最不愿意回忆的一个片段,一手好牌,被自己玩的稀烂。 13 年的高考,班里少数的几个二本,真是个难忘的夏天。五十多个人的实验班,10 个以下的二本,其余全是一本。「作死」这个词可以十分完美的形容高中的自己。在合适的时间做合适的事情,是我多年后的总结。学习如此,游戏如此,恋爱也是如此。 接下来就是我的大学,在「湖北文理学院」的日子了。可能是突然长大了,也可能是高考对自己的影响太大了,自尊心不断驱使着自己去学习。截止到我大三去北京工作之前,成绩始终在本专业前三,获得过「校二级奖学金」,也获得过「国家励志奖学金」。除了校级竞赛,也参加了「软件杯」本科组优秀奖、「蓝桥杯」湖北赛区三...简单 HTTP 工具https://xkcoding.com/2019-12-26-xkcoding-simple-http.htmlhttps://xkcoding.com/2019-12-26-xkcoding-simple-http.htmlJustAuth 强依赖 hutool-http,想换成 OkHttp3 怎么办?simple-http 来解耦!设计思路:定义通用 Http 接口,提供 4 种默认实现(JDK11 HttpClient、OkHttp3、Apache HttpClient、Hutool)。通过 Class.forName() 自动探测依赖,也支持自定义实现。运用了代理模式、委派模式、策略模式。Thu, 26 Dec 2019 10:03:23 GMT1. 前言 因为本人是 JustAuth 的主要贡献者之一,JustAuth 里需要和各大平台做 HTTP 交互来换取 Token、用户信息等数据,使用的是 hutool-http来实现 HTTP 请求的发送。前段时间,有朋友提出一个需求:能否使用 OkHttp3 等更优秀的 HTTP 请求工具来替换默认的 hutool-http ?于是写一个 simple-http 的想法就诞生了。 2. 设计思路 2.1. 解耦 simple-http 设计出来就是为了解决 JustAuth 中对 hutool-http 的强耦合,所以需要先找到 JustAuth 中到底使用到了需要哪些 HTTP 请求,找到它们的共性,才能解耦。具体参见下表: | 请求类型 | 请求参数类型 | 响应数据类型 | 其他 | | :: | :----------: | :----------: | :----------------: | | GET | query | JSON、TEXT | Header、URL Encode | | POST |...设计模式之结构型设计模式-装饰者模式https://xkcoding.com/2019-11-11-design-pattern-decorator.htmlhttps://xkcoding.com/2019-11-11-design-pattern-decorator.htmlBufferedReader、InputStream、OutputStream……JDK IO 类为什么可以层层包装?装饰者模式!本文用「购买 MacBook Pro 升级内存/硬盘套餐」的场景讲解:基础套餐 → 叠加内存装饰器 → 叠加硬盘装饰器,动态扩展功能。比继承更灵活,符合开闭原则。Mon, 11 Nov 2019 09:32:01 GMT1. 模式简介 在不改变原有对象的基础之上,将新功能附加到原有对象上,提供了比继承更有弹性的解决方案(扩展原有对象的功能),属于结构型设计模式。 2. 示例代码 这回咱们就土豪一把,模拟购买 2019 款 MacBook Pro 16 寸,来演示装饰者模式的逻辑。 - MacBook Pro 的基础信息 java / 苹果笔记本 @author yangkai.shen @date Created in 2019/12/13 16:51 / public interface MacBookPro { / 套餐名称 @return 套餐名称 / String getComboName(); / 硬盘 @return 硬盘 / String getHardDisk(); / 内存 @return 内存 / String getMemory(); / 价格...设计模式之行为型设计模式-观察者模式https://xkcoding.com/2019-10-25-design-pattern-observer.htmlhttps://xkcoding.com/2019-10-25-design-pattern-observer.html微信朋友圈点赞,为什么所有好友都能收到通知?因为观察者模式!本文用「私信推送通知」的场景讲解:Pusher 作为被观察者发布消息,User 作为观察者订阅并接收。setChanged() + notifyObservers() 触发通知。JDK Observer、Guava EventBus、Spring ApplicationEvent 都是典型应用。Fri, 25 Oct 2019 09:02:55 GMT1. 模式简介 定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有观察者对象都会收到通知并更新。属于行为型设计模式。观察者模式也被叫做发布订阅模式。 2. 示例代码 这里我们使用观察者模式来模拟一个消息推送通知的场景。 - 消息 java / 消息 @author yangkai.shen @date Created in 2019/11/24 17:36 / @Data @NoArgsConstructor @AllArgsConstructor public class Message { private String message; private String from; private String to; } - 消息发布(被观察者) java / 消息推送,被观察者 @author yangkai.shen @date Created in 2019/11/24 17:36 / public class Pusher extends Obse...设计模式之行为型设计模式-模板方法模式https://xkcoding.com/2019-10-16-design-pattern-template.htmlhttps://xkcoding.com/2019-10-16-design-pattern-template.htmlJdbcTemplate、RedisTemplate、MongoTemplate……Spring 为啥这么爱用 Template?因为模板方法模式太香了!本文用「短信/邮件发送器」的场景讲解:父类定义 validate → execute → error 的流程骨架,子类只需实现具体步骤。公共逻辑不重复,扩展新渠道只加子类。Wed, 16 Oct 2019 08:58:52 GMT1. 模式简介 定义一个程序的整体流程,并允许子类为其中的一个或者多个步骤提供具体实现。模板方法使得子类可以在不改变整体流程的情况下,重新定义其中的某些步骤。属于行为型设计模式。 2. 示例代码 这里我们通过模板方法模式实现一个短信发送、邮件发送的 demo。 - 定义一个整体流程 java / 消息发送器 @author yangkai.shen @date Created in 2019/11/18 17:22 / public abstract class BaseMessageSender { / 发送消息 @param content 内容 / public void send(String content) { validate(content); if (!execute(content)) { error(content); } } / 校验消息 @para...Easy Mock 基本用法https://xkcoding.com/2019-10-14-easy-mock-syntax.htmlhttps://xkcoding.com/2019-10-14-easy-mock-syntax.htmlMock 数据不够真实?Easy Mock + Mock.js 让假数据活起来!本文详解:基础语法生成随机数据、数据占位符模拟真实场景、响应式数据根据请求参数返回。重点:如何用 Easy Mock 实现分页数据接口,附完整模板代码。前端小姐姐再也不用求后端了!Mon, 14 Oct 2019 10:10:48 GMT前言 在上一篇文章,我们了解了如何《使用 docker 运行 easy-mock》,这篇文章我们来学习下 Easy Mock 的基本用法,掌握 Easy Mock 的奇淫技巧,前端小姐姐写页面再也不需要去求后端的小哥哥了。 1. 基础语法 Easy Mock 集成了 Mock.js ,因此可以使用 Mock.js 的语法来 mock 数据。 1.支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等;2.支持扩展更多数据类型,支持自定义函数和正则。 定义返回格式如下: json { "string|1-10": "★", "string2|3": "★★", "number|+1": 202, "number2|1-100.1-10": 1, "boolean|1": true, "regexp": /[a-z][A-Z][0-9]/, "absolutePath": "@/string @/user/name", "user": { "name": "demo" }, "object|2": { "310000": "...使用 docker 运行 easy-mockhttps://xkcoding.com/2019-10-08-docker-easy-mock.htmlhttps://xkcoding.com/2019-10-08-docker-easy-mock.html前后端并行开发,接口还没写好怎么办?Easy Mock 帮你搞定 Mock 数据!本文使用 docker-compose 一键部署 Easy Mock(含 MongoDB + Redis),附 nginx 配置 HTTPS 反向代理。告别手写假数据、拦截请求的麻烦,可视化创建接口,支持 Swagger 导入。Tue, 08 Oct 2019 01:49:36 GMT前言 有时候,我们写前端页面或者小程序的时候,如果有数据,我们就可以更好的进行开发,但是实际场景中,前后端是并行开发的,并没有现成的后端接口给我们用,这时候 mock 假数据的作用有显得十分有必要了。 1. 常见的 Mock 方式 日常开发过程中,有以下几种常见的 Mock 假数据的方式: 1. 将模拟数据直接写在代码里 2. 利用 JavaScript 拦截请求 3. 利用 Charles、 Fiddler 等代理工具拦截请求 虽然这几种方式都很 实用 但是却存在以下几点问题: 1. 配置、编写繁琐 2. mock 的数据不够真实 3. 加上容易去除难 2. 什么是 Easy Mock Easy Mock 是一个可视化,并且能快速生成 模拟数据 的持久化服务。 官方网站:https://www.easy-mock.com/ 特性: - 支持接口代理 - 支持快捷键操作 - 支持协同编辑 - 支持团队项目 - 支持 RESTful - 支持 Swagger | OpenAPI Specification (1.2 & 2.0 & 3.0) - 基于 Swagger 快速创建项目...设计模式之结构型设计模式-适配器模式https://xkcoding.com/2019-09-13-design-pattern-adapter.htmlhttps://xkcoding.com/2019-09-13-design-pattern-adapter.html电脑 USB 接口和手机 Type-C 不兼容?买个转接头啊!适配器模式就是代码世界的「转接头」。本文用 USB 转 Type-C 的场景讲解:老接口不改动,新增适配器类做转换。Spring MVC 的 HandlerAdapter、Spring AOP 的 AdvisorAdapter 都是典型应用。Fri, 13 Sep 2019 08:18:23 GMT1. 模式简介 将一个原有的类的接口转换成期望的另一个接口,使原本的接口不兼容的类可以一起工作。属于结构型设计模式。 2. 示例代码 这里我们模拟一个现实生活中的例子,之前电脑的接口都是 USB 接口,现在很多设备新增了 Type-C 接口,为了兼容,出了一种转接头设备,将 USB 接口输出变成 Type-C 接口输出。 - USB 接口类 java / 定义标准的电脑USB接口类 @author yangkai.shen @date Created in 2019/9/16 17:07 / public class Usb { / 接口类型 @return USB / public String slot() { String type = "USB"; System.out.println("接口类型:" + type); return type; } } - Type-C 接口 java / 新的Type-C接口...设计模式之行为型设计模式-策略模式https://xkcoding.com/2019-09-03-design-pattern-strategy.htmlhttps://xkcoding.com/2019-09-03-design-pattern-strategy.html支付宝、微信、京东、银联……一堆 if-else 判断支付方式?策略模式帮你优雅消灭!本文用「选择支付方式」的场景讲解:定义 Payment 接口,不同支付方式各自实现。JDK 的 Comparator、Spring 的 Resource 都是典型应用。符合开闭原则,扩展新支付只需新增类。Tue, 03 Sep 2019 10:01:29 GMT1. 模式简介 定义了一系列算法、分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。可以避免多重分支的 if...else... 和 switch 语句。属于行为型设计模式。 2. 示例代码 - 支付方式策略 java / 支付策略 @author yangkai.shen @date Created in 2019/8/28 14:43 / public enum PaymentStrategy { / 支付宝 / ALIPAY, / 微信支付 / WECHATPAY, / 京东支付 / JDPAY, / 银联支付 / UNIONPAY; / 支付方式容器池 / private static Map PAYMENTPOOL = new HashMap<>(); static { PAYMENTPOOL.put(A...GitHub Actions 初体验https://xkcoding.com/2019-08-29-early-experience-about-github-actions.htmlhttps://xkcoding.com/2019-08-29-early-experience-about-github-actions.html还在用 Jenkins、Travis-CI?GitHub 自家的 CI/CD 来了!GitHub Actions 支持自定义工作流,开源项目免费使用。本文记录申请流程和 Spring Boot + Maven 项目的配置示例,push 代码自动触发构建,真香!附完整 maven.yml 配置。Thu, 29 Aug 2019 06:54:05 GMT前言 前段时间同性交友网站 GitHub 推出了自家的 Registry 服务,支持多种语言的镜像服务,具体参见:https://help.github.com/en/articles/about-github-package-registry 随后,又推出了自家的自动化构建服务:Github Actions,具体参见:https://help.github.com/en/articles/about-github-actions 这俩服务我都在第一时间申请使用了,也都已经审核通过了,但是由于 Registry 测试有些不稳定,还存在一些问题,所以,并未发布体验文章,不过 关于GitHub Actions 我已经成功体验了一把。 1. GitHub Actions GitHub Actions enables you to create custom software development lifecycle workflows directly in your GitHub repository. —— https://help.github.com/en/articles/abo...设计模式之行为型设计模式-委派模式https://xkcoding.com/2019-08-27-design-pattern-delegate.htmlhttps://xkcoding.com/2019-08-27-design-pattern-delegate.html委派模式和代理模式傻傻分不清?核心区别:代理注重过程,委派注重结果!本文用「老板-组长-工人」的场景讲解:Boss 下命令,Leader 派发任务,Worker 执行。虽然不属于 GoF 23 种设计模式,但 Spring MVC 的 DispatcherServlet 就是典型应用。Tue, 27 Aug 2019 08:45:41 GMT1. 模式简介 负责任务的调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果;属于行为型设计模式;不属于23种设计模式。 2. 示例代码 - 业务执行者(Worker)的具体实现 java / 工人接口 @author yangkai.shen @date Created in 2019/8/28 11:17 / public interface Worker { / 做事情 @param thing 任务 / void doing(String thing); } / 厨师工 @author yangkai.shen @date Created in 2019/8/28 11:19 / public class ChefWorker implements Worker { / 做事情 @param thing 任务 / @Overrid...设计模式之结构型设计模式-代理模式https://xkcoding.com/2019-08-20-design-pattern-proxy.htmlhttps://xkcoding.com/2019-08-20-design-pattern-proxy.htmlSpring AOP 底层到底用的啥?JDK 动态代理 vs CGLIB 动态代理,区别在哪?本文用「售票员卖票」场景讲解:静态代理只能代理特定类,动态代理可代理任意对象。附 JDK Proxy 源码深度剖析(从 newProxyInstance 到 ProxyClassFactory),以及 Spring 的代理选择原则。Tue, 20 Aug 2019 10:24:49 GMT1. 模式简介 为其他对象提供一种代理,以控制对这个对象的访问;代理对象就类似生活中的中介;属于结构型设计模式。 2. 示例代码 2.1. 静态代理 显式声明被代理对象,仅可以代理某些对象 2.1.1. 代码实现 - 具体实现 java / 售票接口 @author yangkai.shen @date Created in 2019-08-20 22:12 / public interface Ticket { / 卖票 / void sell(); } / 演唱会门票 @author yangkai.shen @date Created in 2019-08-20 22:16 / public class MusicTicket implements Ticket { / 卖票 / @Override public void sell() { System.out.println("卖演唱会门票"); } } /...设计模式之创建型设计模式-原型模式https://xkcoding.com/2019-08-14-design-pattern-prototype.htmlhttps://xkcoding.com/2019-08-14-design-pattern-prototype.htmlclone() 方法你真的会用吗?浅克隆的坑你踩过没?引用对象地址相同,改一个全变了!本文用「印钞机打印纸币」的场景,对比浅克隆 vs 深克隆的实现差异。深克隆需要实现 Serializable 接口,通过序列化/反序列化实现真正的对象复制。附 BeanUtils、JSON.parseObject 等常见应用。Wed, 14 Aug 2019 09:56:14 GMT1. 模式简介 原型实例指定创建对象的种类,通过克隆这些原型创建新的对象。调用者不需要指定对象的创建细节,不通过调用构造函数创建对象。属于创建型设计模式。 2. 示例代码 2.1. 浅克隆 2.1.1. 代码实现 - 原型接口 java / 钱 @author yangkai.shen @date Created in 2019-08-14 15:53 / public interface Money { / 打印 @return {@link Money} / Money print(); } - 具体实现 java / 形状 @author yangkai.shen @date Created in 2019-08-14 15:59 / @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class Shape implements Serializable { / 描述...设计模式之创建型设计模式-单例模式https://xkcoding.com/2019-08-12-design-pattern-singleton.htmlhttps://xkcoding.com/2019-08-12-design-pattern-singleton.html单例模式怎么写才安全?7 种实现方式全解析!饿汉式、懒汉式、双重检查锁、静态内部类、枚举、容器式、ThreadLocal——哪种最推荐?更关键的是:反序列化和反射都能破坏单例!本文深入 ObjectInputStream 源码,揭秘 readResolve 方法的原理。Mon, 12 Aug 2019 14:43:39 GMT1. 模式简介 确保一个类在任何情况下都绝对只有一个实例,并提供一个全局的访问入口点;隐藏所有的构造方法;属于创建型设计模式。 2. 实现方式 2.1. 饿汉式单例 先将实例创建出来,用的时候直接拿 2.1.1. 属性初始化 java / 饿汉式单例,在属性初始化 @author yangkai.shen @date Created in 2019-08-11 11:32 / public class EagerSingleton1 { private final static EagerSingleton1 INSTANCE = new EagerSingleton1(); / 私有化构造方法 / private EagerSingleton1() { } / 提供全局访问入口 / public static EagerSingleton1 getInstance() { return INSTANCE; } public stat...设计模式之创建型设计模式-抽象工厂模式https://xkcoding.com/2019-08-10-design-pattern-abstract-factory.htmlhttps://xkcoding.com/2019-08-10-design-pattern-abstract-factory.html简单工厂生产单一产品,工厂方法还是单一产品,抽象工厂才是「产品族」!本文用科技公司卖手机+笔记本+耳机的场景讲解:小米、华为、苹果三家公司,每家都有自己的产品线。TechFactory 抽象工厂定义 sellPhone/sellLaptop/sellEarPhone 三个方法,子类各自实现。附 Spring AbstractBeanFactory 源码分析。Sat, 10 Aug 2019 03:34:16 GMT1. 模式简介 提供一个创建一系列相关或者相互依赖对象的接口,无须指定具体的类,属于创建型设计模式。 2. 示例代码 - 产品抽象 java // 手机产品抽象类 public abstract class Phone { / 描述 / public abstract void describe(); } // 笔记本产品抽象类 public abstract class Laptop { / 描述 / public abstract void describe(); } // 耳机产品抽象类 public abstract class EarPhone { / 描述 / public abstract void describe(); } - 科技公司工厂抽象 java // 科技公司抽象工厂类 public abstract class TechFactory { / 卖手机 @return 手机 / pub...使用JustAuth集成企业微信https://xkcoding.com/2019-08-06-use-justauth-integration-wechat-enterprise.htmlhttps://xkcoding.com/2019-08-06-use-justauth-integration-wechat-enterprise.html企业微信扫码登录怎么接?JustAuth 新增企业微信支持!本文详解:注册企业微信 → 创建应用 → 配置授权回调域 → 获取 4 个关键参数(client-id、client-secret、redirect-uri、agent-id)。最后用 justauth-spring-boot-starter 三步完成集成,附效果截图。Tue, 06 Aug 2019 08:51:57 GMTJustAuth 又㕛叒叕添加新平台啦 此次更新带来的是 企业微信,本文将带领大家使用 JustAuth 快速集成 企业微信 的第三方登录。 1. 注册并登录企业微信 地址:https://work.weixin.qq.com/weworkadmin/loginpagewx?from=myhomeopenApi 如果没有企业可以点击 企业注册 2. 创建企业微信应用 导航栏 -- 应用管理 -- 自建 -- 创建应用 选择合适的应用logo,为应用取个名,同时设置应用的可见范围,创建应用 3. 应用设置及基本关键参数 3.1. 应用设置 创建完应用之后,拖到应用最下方,配置应用信息 使用 JustAuth 基本都是网页应用,所以这一步我们直接选择 Web网页 -- 设置授权回调域 注意:这里 授权回调域 不需要指定 前缀,后缀 等信息,示例如下图 关于授权回调域存在疑问的童鞋请看这里:https://open.work.weixin.qq.com/api/doc#90000/90135/90988 3.2. 基本关键参数获取 使用 JustAuth 进行企业微信登录需要 4 个参数信息...JFinal 快速集成第三方登录功能https://xkcoding.com/2019-07-17-jfinal-login-with-oauth.htmlhttps://xkcoding.com/2019-07-17-jfinal-login-with-oauth.html不用 Spring Boot 也能快速接入第三方登录!本文演示 JFinal 框架如何通过 JustAuth 集成 QQ、GitHub、小米登录。踩坑记录:JFinal 路由不支持 /{type}/callback 格式,回调地址要改成 /callback/{type}。附完整配置文件和 Controller 代码。Wed, 17 Jul 2019 10:30:46 GMT前言 此 demo 主要为了演示 Jfinal 如何通过 JustAuth 快速集成第三方平台的登录,如果有小伙伴是基于 Spring Boot 的可以参考这个 demo https://github.com/xkcoding/spring-boot-demo/tree/master/spring-boot-demo-social 1. 环境准备 参考 Spring Boot 快速集成第三方登录功能 - 环境准备 这一章 2. 主要代码 2.1. pom.xml xml 4.0.0 com.xkcoding jfinal-justauth-demo 1.0-SNAPSHOT war jfinal-justauth-demo JFinal 使用 JustAuth 快速集成第三方登录 UTF-8 1.8 1.8 1.9.5 com.jfinal jfinal-undertow 1.7 com.jfinal...Spring Boot快速集成第三方登录功能https://xkcoding.com/2019-05-22-spring-boot-login-with-oauth.htmlhttps://xkcoding.com/2019-05-22-spring-boot-login-with-oauth.htmlQQ、微信、GitHub、Google、微软……7 种第三方登录一次搞定!使用 JustAuth + justauth-spring-boot-starter 快速集成,yml 配置 + 一个 Controller 就能跑。本文还手把手教你搭建 frp 内网穿透环境、各平台应用申请流程,从零到能跑的完整指南。Wed, 22 May 2019 08:21:43 GMT前言 此 demo 主要演示 Spring Boot 项目如何使用 史上最全的第三方登录工具 - JustAuth 实现第三方登录,包括QQ登录、GitHub登录、微信登录、谷歌登录、微软登录、小米登录、企业微信登录。 通过 justauth-spring-boot-starter 快速集成,好嗨哟 JustAuth,如你所见,它仅仅是一个第三方授权登录的工具类库,它可以让我们脱离繁琐的第三方登录SDK,让登录变得So easy! 1. 全:已集成十多家第三方平台(国内外常用的基本都已包含),后续依然还有扩展计划! 2. 简:API就是奔着最简单去设计的(见后面快速开始),尽量让您用起来没有障碍感! PS: 本人十分幸运的参与到了这个SDK的开发,主要开发了QQ登录、微信登录、小米登录、微软登录、谷歌登录这 5 个第三方登录,以及一些BUG的修复工作。再次感谢 @母狼 开源这个又好用又全面的第三方登录SDK。 如果技术选型是 JFinal 的,请查看此 demo https://github.com/xkcoding/jfinal-justauth-demo 如果技术选型是 ActFr...Mac下使用Vagrant快速搭建Centos/7虚拟机https://xkcoding.com/2019-04-24-use-vagrant-build-linux-virtual-machine.htmlhttps://xkcoding.com/2019-04-24-use-vagrant-build-linux-virtual-machine.html本地搭建 K8s 集群?先来几台 CentOS 虚拟机!Vagrant + VirtualBox 比手动安装快 10 倍。本文从零开始:box 镜像下载、vagrant init/up 基础命令、共享文件夹和网络代理配置。最后附一个完整 Vagrantfile 案例:一键创建 3 节点集群,自动安装 Docker 并设置开机启动。Wed, 24 Apr 2019 08:52:23 GMT前言 日常开发过程中,为了保证开发环境的统一并且又不想污染我们本机的环境,通常我们有 2 种方式可以做到,一种是状态火热的docker虚拟化技术,另一种就是我们经久不衰的虚拟机了。本文介绍在 Mac 下使用 Vagrant 快速搭建Centos7 虚拟机。 2. 安装 Vagrant 2.1. 环境准备 安装 provider,主要用于挂载虚拟机。本文将采用开源免费的 VirtualBox 作为 Vagrant 的 provider 来挂载我们的虚拟机。VirtualBox 是一款开源免费的虚拟机软件,相比 VMware 体系的软件来说,更加 小巧(主要是 免费)。 下载地址:https://www.virtualbox.org/wiki/Downloads 笔者使用的 VirtualBox 版本是 6.0.6 。 安装方式是傻瓜式安装,只需要选择好对应系统的版本,下一步操作即可。 2.2. 安装 Vagrant 主角登场,接下来我们来安装 Vagrant。 下载地址:https://www.vagrantup.com/downloads.html 笔者使用的 Vagrant 版本是...scaffold 组件相关文档https://xkcoding.com/2019-03-12-scaffold-doc.htmlhttps://xkcoding.com/2019-03-12-scaffold-doc.htmlSpring Boot 项目总是重复造轮子?scaffold 开源脚手架帮你搞定!10 个模块覆盖常见需求:launcher 多环境启动器、common 统一返回格式、log 操作日志注解、swagger 自动装配、web 全局异常处理、code 验证码、notification 钉钉/邮件/短信通知、codegen 代码生成器。开箱即用,让你专注业务逻辑。Tue, 12 Mar 2019 01:51:34 GMT前言 scaffold: 脚手架的意思,是一款封装了一些通用组件的,让Spring Boot快速开发的工具集。 1. Scaffold组件图谱 2. 项目信息 项目地址: https://github.com/xkcoding/scaffold 目录结构: bash scaffold ├── scaffold-bom scaffold依赖管理 ├── scaffold-common 通用工具类 ├── scaffold-launcher 通用启动器 ├── scaffold-log 日志包 ├── scaffold-swagger swagger配置 ├── scaffold-test 通用单元测试 ├── scaffold-web 通用web配置 ├── scaffold-code 通用验证码组件 ├── scaffold-notification 通用通知组件 └── scaffold-codegen 代码生成器 版本更新记录:CHANGELOG 3.安装方...使用Mybatis动态SQL构建通用自定义高级查询https://xkcoding.com/2019-02-18-use-mybatis-dynamic-sql-to-build-common-custom-advance-query.htmlhttps://xkcoding.com/2019-02-18-use-mybatis-dynamic-sql-to-build-common-custom-advance-query.html每个 Mapper.xml 都写一堆 if 条件太烦了!本文提供通用高级查询方案:定义 AdvanceQuery 模型封装 key/op/value,SQL 片段支持 eq/gte/lte/between/in/notin/like 等 9 种操作符。前端传 JSON 数组,后端动态拼装 WHERE 条件。一套模板复用所有查询,告别重复代码。附完整 XML 模板和 PostMan 测试示例。Mon, 18 Feb 2019 02:36:29 GMT前言 动态SQL是Mybatis中最强大的特性之一。实际开发中,数据的查询条件是动态多变的,因此动态SQL可以很方便的构建多条件的 where 语句的拼装。但是where条件里的查询条件跟表中的字段还是息息相关,我们在编写Mapper.xml 文件的时候,还是需要在 节点里写编写很多的 条件。程序猿都是一种爱偷懒的物种,于是乎,便有了此文的主题『使用Mybatis动态SQL构建通用自定义高级查询』。话不多说,进入正题。 1. 思路 我们需要构建通用的自定义高级查询,那么首先有以下几个必须满足的点: 1. 满足通用的要求,那么查询字段就不能写死在 节点中。 2. 满足高级查询的要求,那么查询条件的个数就是不确定的。 3. 满足自定义的要求,那么查询操作符肯定不可以限死是 = 或者 like 等。 根据上面提出要求,也就是说我们需要定义一个查询参数去接收前端传到后台的查询条件。查询条件需要满足3个要素:①查询字段②查询操作符③查询数据。当我们接收到查询条件的时候,根据动态SQL的语法构建出动态查询条件。 2. 实现 步骤一:定义高级查询条件模型 AdcanceQuery.java j...设计模式之创建型设计模式-工厂方法模式https://xkcoding.com/2019-02-15-design-pattern-factory-method.htmlhttps://xkcoding.com/2019-02-15-design-pattern-factory-method.html简单工厂的 if-else 越写越长?工厂方法模式来解耦!核心思想:把具体类的实例化延迟到工厂子类,新增产品只需新增工厂类,不用改原有代码。本文继续用糖果工厂的例子,对比简单工厂 vs 工厂方法的 UML 图和代码实现。附 JDK Calendar.getInstance() 源码分析,看看大佬怎么用。Fri, 15 Feb 2019 01:00:54 GMT1. 模式简介 工厂方法模式(Factory Method Pattern):又称为工厂模式,属于创建型设计模式。在工厂方法模式中,工厂父类负责定义创建对象的公共接口,工厂子类负责生成具体的对象,这样做的目的是将具体类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体对象。本文将使用 糖果工厂生产不同口味的糖果 这个实际场景,用代码来实现 工厂方法模式。 2. 模式角色 工厂方法模式包含以下4种角色: 1. 抽象实体(Candy):糖果类基类 2. 具体实体实现(LemonCandy 和 WatermelonCandy):具体口味糖果实现 3. 抽象工厂(CandyFactory):糖果工厂类基类 4. 具体工厂实现(LemonCandyFactory 和 WatermelonCandyFactory):具体口味糖果工厂类实现 3. UML图例 4. 代码实现 4.1. 步骤一:创建抽象糖果类 Candy.java java / 糖果抽象类 @package: com.xkcoding.design.pattern.creationa...设计模式之创建型设计模式-简单工厂模式https://xkcoding.com/2019-02-13-design-pattern-simple-factory.htmlhttps://xkcoding.com/2019-02-13-design-pattern-simple-factory.htmlnew LemonCandy() 散落在代码各处?简单工厂模式帮你统一管理对象创建!本文用「糖果工厂生产不同口味糖果」的场景,手把手实现简单工厂:抽象糖果类 → 具体糖果实现 → 工厂类封装创建逻辑。还有两种工厂方法实现:字符串参数和 Class 参数反射创建。附 Slf4j LoggerFactory 源码分析。Wed, 13 Feb 2019 02:23:27 GMT1. 模式简介 简单工厂模式(Simple Factory Pattern):它属于创建型设计模式,不属于23种设计模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。本文将使用 糖果工厂生产不同口味的糖果 这个实际场景,用代码来实现 简单工厂模式。 2. 模式角色 简单工厂包含3个角色: 1. 工厂角色(CandyFactory):主要负责创建具体的实例。 2. 抽象实体(Candy):它是工厂角色所创建的所有实例的父类,包含所有具体实例所共有的公共接口。 3. 具体特征的实体(LemonCandy 和 WatermelonCandy):所有由工厂角色创建出来的实例都属于具体实体。 3. UML图例 3.1. 未使用简单工厂模式的UML图 3.2. 使用简单工厂模式之后的UML图 4. 代码实现 4.1. 步骤一:创建抽象糖果类 Candy.java java / 糖果抽象类 @package: com.xkcoding.design.pattern.creationa...使用Maven管理Spring Boot Profilehttps://xkcoding.com/2019-02-04-use-maven-manage-spring-boot-profile.htmlhttps://xkcoding.com/2019-02-04-use-maven-manage-spring-boot-profile.html每次打包都要手动改 spring.profiles.active?太容易出错了!本文介绍 Maven Profile + @xx@ 变量替换的优雅方案:pom.xml 定义 dev/test/prod 三套环境,application.yml 用 @profileActive@ 动态获取,mvn package -P prod 一键打包。还提供了 shell 脚本和 IDEA 可视化操作两种构建方式。Mon, 04 Feb 2019 01:47:35 GMT前言 Spring Boot开发的项目中,多环境配置极大的提升了开发效率,避免了因为测试(test)、开发(dev)、生产(prod)导致频繁修改一个配置文件,导致出现配置错误的情况。 那么Spring Boot如何做到多环境配置?还有没有更优雅的方式管理Spring Boot的多环境配置呢? 1. Spring Boot多环境配置 Spring Boot 项目可使用 profile 来实现多环境配置,通过 spring.profiles.active 属性决定使用具体哪个环境的profile。 Spring Boot 的配置文件默认为 application.yml(或properties,此外仅以yml配置为说明)。不同 profile 下的配置文件由 application-{profile}.yml 管理,同时 application-{profile}.yml 配置文件会覆盖默认配置文件(application.yml)下的同一属性。 一般 profile 有以下几种:dev(开发),test(单元测试),prod(生产环境) 2. Maven多环境配置 大部分项目基于 Ma...Spring Boot 使用枚举类型作为请求参数https://xkcoding.com/2019-01-30-spring-boot-request-use-enums-params.htmlhttps://xkcoding.com/2019-01-30-spring-boot-request-use-enums-params.html接口参数传 0 或 1,怎么自动转成 GenderEnum.MALE 或 FEMALE?@RequestParam 和 @RequestBody 搞不定,需要自定义 Converter。本文提供完整的通用方案:BaseEnum 接口 + ConverterFactory 工厂模式,一套代码支持所有枚举类型的自动转换,Get/Post 请求都能用。Wed, 30 Jan 2019 06:17:37 GMT1. 场景 在我们实际开发中,枚举类型应用十分广泛,可以避免在项目中定义大量的『魔法值』变量。但是,在web开发中,如何将枚举对象作为请求参数传进Controller,做到类型自动转换?直接使用 @RequestParam 和 @RequestBody 断然是不够的,这里就需要我们自定义 Converter 来实现类型转化了。 2. 需求 比如一个用户对象,里面的性别属性,我们定义一个枚举类型 Gender。 GenderEnum.java java / 性别枚举 @package: com.xkcoding.springboottest.constants.enums @description: 性别枚举 @author: yangkai.shen @date: Created in 2019-01-30 11:06 @copyright: Copyright (c) 2019 @version: V1.0 @modified: yangkai.shen / @Getter public enum GenderEnum { /...修改 git 提交的时间https://xkcoding.com/2019-01-21-modify-git-commit-timestamp.htmlhttps://xkcoding.com/2019-01-21-modify-git-commit-timestamp.html想把 Git 提交时间改成跨年那天的 00:00:00?用 git commit --amend --date 就能搞定。本文记录两种场景:修改当前最新提交的时间,以及通过 commit id 修改历史提交的时间。改完记得 git push 同步到远程。GitHub 绿点补救指南。Mon, 21 Jan 2019 09:10:03 GMT有时候我们需要修改 git commit 时间,可以通过下面的方法解决。 修改当前本地提交的commit时间 bash git commit --amend --date="2019-01-01T00:00:00+0800" -am ":memo: 更新 TODO.md" 修改之前提交的某次commit时间,首先通过 git log 获取提交的唯一id,然后 bash git commit --amend --date="2019-01-01T00:00:00+0800" -C edd2dbbe31fbab492f337628011119493a12a9c6 对于之前已经提交到远程仓库的,需要再 git push 一次,即可推送到远程仓库解决 Nginx 413 Request Entity Too Large 问题https://xkcoding.com/2019-01-17-solve-nginx-413-problem.htmlhttps://xkcoding.com/2019-01-17-solve-nginx-413-problem.htmlSpring Boot 文件上传遇到 Nginx 413 Request Entity Too Large?原因是 Nginx 默认限制请求体大小为 1MB。解决方法很简单:在 server 块加一行 client_max_body_size 20M,然后 nginx -s reload 重启即可。一分钟解决的小问题,记录一下备忘。Thu, 17 Jan 2019 02:44:21 GMT使用 Spring Boot 文件上传的时候,前端使用 nginx 代理后端请求,出现如下 413 Request Entity Too Large 这个错误。 解决方法其实也十分简单,只需要在 nginx 配置文件里添加如下内容,重启 nginx,即可解决。 nginx server { # ... listen 80; servername localhost; clientmaxbodysize 20M; # ... } 重启 nginx,nginx -s reload,大功告成!解决 Mac 安装最新版 minikube 出现的问题https://xkcoding.com/2019-01-14-solve-mac-install-minikube-problem.htmlhttps://xkcoding.com/2019-01-14-solve-mac-install-minikube-problem.htmlminikube 搭建 K8s 真的傻瓜式吗?至少我遇到了两个大坑:kubectl v1.13 和 minikube 默认的 k8s v1.12 版本不匹配,以及国内网络无法拉取 k8s.gcr.io 镜像。本文记录完整的排坑过程:--kubernetes-version 指定版本、--docker-env 配置代理,VirtualBox NAT 模式下 10.0.2.2 指向宿主机的原理。Mon, 14 Jan 2019 06:22:11 GMTkubernetes (本文后续简称 k8s ),是一个开源的,用于管理云平台中多个主机上的容器化的应用。Mac 本地运行 k8s 最快的方式,肯定是基于单节点的 minikube 来搭建。人人都说 minikube 搭建 k8s 最简单、快速、只需要傻瓜式输入命令就可以搭建成功,可事实并非如此,比如笔者在搭建的过程中就遇到了 版本 和 代理 的问题。 下面我将对遇到的问题一一进行解答。 1. 硬件环境 - 系统:MacOS Mojave 10.14.2 (18C54) 2. 软件环境 2.1. 虚拟机 这里我使用的是 VirtualBox,使用版本Virtual Box 5.2.22 r126460 (Qt5.6.3),当然也可以使用其他虚拟软件,参考:https://kubernetes.io/docs/tasks/tools/install-minikube/#install-a-hypervisor 2.2. 安装 kubectl 笔者安装的时候,最新版本为 v1.13.1 有2种安装方式: 1. 使用 brew 安装,brew install kubernetes-cli 2...溜了溜了2018,来了来了2019https://xkcoding.com/2019-01-01-bye2018-hello2019.htmlhttps://xkcoding.com/2019-01-01-bye2018-hello2019.html从北京回杭州,从执行者到产品负责人,2018 是角色转变的一年。工作上开始定 TODO-List、安排团队开发、考虑产品架构;开源上 spring-boot-demo 47 个 demo 持续更新。展望 2019:博客月更 3 篇、GitHub 日日有绿点、希望年底口袋不再空空。技术人的年终总结与自我期许。Mon, 31 Dec 2018 16:00:00 GMT18年不知不觉已到尽头,但自己总觉得好像18年只过了9个月一样。抓住18年的小尾巴,给自己的2018做个年终总结,为2019做个展望。 1. 总结18 1.1. 生活方面 今年相比去年,少了一次旅游,但是吃的方面,比去年更讲究了不少。有她的日子都很精致。 1.2. 感情方面 18年算是迈出了关键的一步吧。正月里去了她家,见了下她的父母,经历了下那儿的过年的风俗,还算顺利。5月带她回家,见了爸妈,虽然还有些小意外,不过我坚信自己可以处理好。 1.3. 工作方面 18年3月初,毅然决然的离开了北京,离开了那个氛围很好的图迹,回到杭州,不过生活并没想象中的美好,说实话,挺后悔的。嗯,不过,在美创的日子也还算不错,组长人好,团队成员也好相处,但总没有图迹的感觉,也可能是想那群“哥文化”的小伙伴了吧。 今年工作上最大的收货应该就是,之前东哥、明哥安排工作,我去依照时间计划执行,现在需要我去定todo-list,定工作量,安排小伙伴一起开发;之前只需对自己得代码负责,现在需要对自己得产品负责;之前考虑代码功能实现,现在考虑产品整体架构。 1.4. 技术方面 作为一个“伪全栈”,今年几乎没写前端,应...Hello,Spring Boot!https://xkcoding.com/2018-11-07-spring-boot-start.htmlhttps://xkcoding.com/2018-11-07-spring-boot-start.html还在被 Spring 的 XML 配置和依赖版本冲突折磨?Spring Boot 让这一切成为过去!本文从零开始:用 IDEA 的 Spring Initializr 创建项目,理解启动类的 @SpringBootApplication 注解,编写第一个 Controller,运行 main 函数启动内嵌 Tomcat。约定大于配置,开箱即用。Wed, 07 Nov 2018 08:09:07 GMTSpring Boot 是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品: 官网这个logo下有这么一段介绍: Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention over configuration and is designed to get you up and running as quickly as possible. 翻译一下: 用一些固定的方式来构建生产级别的spring应用。Spring Boot 推崇约定大于配置的方式以便于你能够尽可能快速的启动并运行程序。 其实人们把Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。 1. 了解 Spring Boot 1.1. 为什么学习 Spring Boot java一直被人诟病...后台运行node服务https://xkcoding.com/2018-09-28-run-node-service-in-background.htmlhttps://xkcoding.com/2018-09-28-run-node-service-in-background.htmlNode 服务一关终端就停了?用 PM2 守护进程!本文介绍 3 种后台运行 Node 服务的方式,重点推荐 PM2:支持负载均衡、进程监控、日志管理、开机自启。附完整命令速查表:start、stop、restart、logs、monit、save、startup 等,一文掌握 PM2 核心用法。Fri, 28 Sep 2018 01:46:37 GMT前言 很多时候,我们需要后台运行我们的 node 服务,有3种方式可以实现。 1. 使用Linux自带的nohup命令 2. 使用forever命令 3. 使用PM2管理node进程 这里推荐使用PM2来管理和运行我们的node服务 1. 简介 PM2 是一个开源的带有负载均衡功能的 node 应用的进程管理器,包括守护进程,监控,日志的一整套完整的功能,基本是Nodejs应用程序不二的守护进程选择,事实上它并不仅仅可以启动Nodejs的程序,只要是一般的脚本的程序它同样可以胜任。当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载,PM2是完美的选择。 2. 安装 bash npm install pm2 -g 3. 命令 bash $ pm2 start app.js # 启动app.js应用程序 $ pm2 start app.js -i 4 # cluster mode 模式启动4个app.js的应用实例 # 4个应用程序会自动进行负载均衡 $ pm2 start app.js --name="a...Neo4j 和 Mysql 查询基本语法的区别https://xkcoding.com/2018-09-20-query-language-differences-between-neo4j-and-mysql.htmlhttps://xkcoding.com/2018-09-20-query-language-differences-between-neo4j-and-mysql.html图数据库 Neo4j 的 Cypher 查询语言有多简洁?本文用 7 个典型场景对比 MySQL 和 Neo4j 的查询语法:全表扫描、排序分页、条件筛选、模糊查询、多表联查、分组聚合。特别是多表 JOIN,MySQL 要写一堆 JOIN ON,Neo4j 一行箭头搞定。Thu, 20 Sep 2018 05:54:31 GMT每种数据库都有自己的一套查询语言或者标准,即使是同为关系型数据库的Oracle、Sql Server 和 MySQL,其在一些语法细节上也有差异,更别说 Mongo, Redis 类似的非关系型数据库了。Neo4j 也一样,有自己专属的查询语言 Cypher。深入学习其实发现 Neo4j 的查询语法并不难去学习,因为 Cypher 的语意确实简洁,直观。 -- 1. 全表扫描 -- -- mysql -- SELECT p. FROM products as p; -- neo4j -- MATCH (p:Product) RETURN p; -- 2. 查询价格最贵的10个商品,只返回商品名字和单价 -- -- mysql -- SELECT p.ProductName, p.UnitPrice FROM products as p ORDER BY p.UnitPrice DESC LIMIT 10; -- neo4j -- MATCH (p:Product) RETURN p.productName, p.unitPrice ORDER BY p.unitPrice DESC L...git 如何更新 fork 的项目到原项目的最新版本https://xkcoding.com/2018-09-18-how-to-update-the-fork-project.htmlhttps://xkcoding.com/2018-09-18-how-to-update-the-fork-project.htmlFork 的项目落后原仓库几百个 commit 怎么办?本文用 hutool 项目演示完整的同步流程:添加 upstream 远程地址、fetch 原项目更新、merge 到本地分支、push 到自己的仓库。7 步命令搞定,再也不用删掉重新 Fork 了。开源贡献者必备技能。Tue, 18 Sep 2018 01:04:23 GMT在 github 上 fork 了一个项目之后,如何使自己 fork 的项目和原先作者的项目分支保持同步呢,下面我使用 hutool 的项目做示范,手摸手示范如何使 fork 的项目与原项目分支保持同步。 1. 查看远程的版本库地址 bash $ git remote -v origin https://github.com/xkcoding/hutool.git (fetch) origin https://github.com/xkcoding/hutool.git (push) 2. 添加原项目 git 地址到本地版本库 bash $ git remote add upstream https://github.com/looly/hutool.git 3. 检查版本库是否添加成功 bash $ git remote -v origin https://github.com/xkcoding/hutool.git (fetch) origin https://github.com/xkcoding/h...Spring Boot 全局异常处理https://xkcoding.com/2018-08-20-spring-boot-global-exception-handler.htmlhttps://xkcoding.com/2018-08-20-spring-boot-global-exception-handler.html前后端分离时代,接口返回格式必须统一!本文提供完整的 Spring Boot 全局异常处理方案:统一返回格式封装(Api.java)、状态码枚举(Status.java)、自定义业务异常类、404 异常配置、@ControllerAdvice 全局异常处理器。一套代码解决所有异常处理问题,直接复制到项目里用。Mon, 20 Aug 2018 01:39:36 GMT我们在做 Web 应用的时候,请求处理过程中发生错误异常是一个非常常见的情况,但是异常的处理方式和放回的异常内容并没有做一个统一的处理。在现在这种前后端分离的时代,不论响应成功还是失败的数据格式都需要保持一致。 1. 返回格式统一封装 Api.java java package com.xkcoding.scaffold.common; import com.xkcoding.scaffold.common.status.Status; import lombok.Data; import java.io.Serializable; / API 统一返回格式封装 @package: com.xkcoding.scaffold.common @description: API 统一返回格式封装 @author: yangkai.shen @date: Created in 2018/8/2 下午6:15 @copyright: Copyright (c) 2018 @version: V1.0 @modified: yangkai.shen...Java8 学习整理https://xkcoding.com/2018-07-30-java8-learning.htmlhttps://xkcoding.com/2018-07-30-java8-learning.html公司内部 Java 8 分享的完整文档!从 JDK 5 到 JDK 8 的发展历程梳理,重点讲解 Lambda 表达式、函数式接口、Stream API、Optional 类、新日期时间 API 等核心特性。每个特性都附带 Demo 代码,拿来即用。还在用 for 循环?是时候拥抱函数式编程了。Mon, 30 Jul 2018 02:39:07 GMT前言:Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。目前大部分公司都已经在使用 Java 8开发项目。本文是我在公司的一次Java 8分享的文章,开篇先介绍了 Java 8 的发展,再分别讲述 Java 8 的新特性,同时附上一些 Demo 代码( https://github.com/xkcoding/java8learning ),以便更好的入门学习 Java 8,厚脸皮的求个 Star。 1. Java 8 的发展 JDK 5 自动装箱与拆箱 JDK1.5为每一个基本数据类型定义了一个封装类。使java中的基本数据类型也有自己的对象 bash int -->Integer double --Double long --Long char --Character float --Float boolean --Boolean short --Short byte -- Byt...常用正则表达式https://xkcoding.com/2018-02-07-regular-expression-list.htmlhttps://xkcoding.com/2018-02-07-regular-expression-list.html手机号、身份证、邮箱、IP 地址、金额格式……这些常用正则表达式你每次都要现查?本文收集了开发中最常用的正则表达式:数字校验、字符校验、特殊格式校验,直接复制粘贴就能用。还有强密码规则、中文字符匹配、首尾空白去除等实用表达式。Wed, 07 Feb 2018 03:45:02 GMT校验数字的表达式 js 数字:^[0-9]$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9])$ 非零开头的最多带两位小数的数字:^([1-9][0-9])+(.[0-9]{1,2})?$ 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$ 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 有13位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 非零的正整数:^[1-9]\d$ 或 ^([1-9][0-9]){1,3}$ 或 ^\+?[1-9][0-9]$ 非零的负整数:^\-[1-9][]0-9"$ 或 ^-[1-9]\d$ 非负整数:^\d+$ 或 ^[1-9]\d|0$ 非正整数:^-[1-9]\d|0$ 或 ^((-\d+)|(0+))$ 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d\.\d|0\.\d[1-9]\d|0?\.0+|0$ 非正浮点数:^((...OSX 常用软件汇总https://xkcoding.com/2018-02-05-osx-software-lists.htmlhttps://xkcoding.com/2018-02-05-osx-software-lists.html每次重装系统,或者新电脑到手的时候,最麻烦的莫过于重新安装之前常用的一些软件了。但是,平时常用的软件实在有点多,于是乎,整理一个 OSX 常用软件的列表,便于以后查找使用,以下整理的软件仅代表我个人平时常用的软件,不喜勿喷。Mon, 05 Feb 2018 05:41:03 GMT每次重装系统,或者新电脑到手的时候,最麻烦的莫过于重新安装之前常用的一些软件了。但是,平时常用的软件实在有点多,于是乎,整理一个 OSX 常用软件的列表,便于以后查找使用,以下整理的软件仅代表我个人平时常用的软件,不喜勿喷。 最喜欢的一个「免(破)费(解)」的 osx 软件下载网址:xclient.info ,有经济能力的童鞋还是请支持正版。。。 聊天类软件 | 软件 | 介绍及下载地址 | | -- | ------------------------------------------------------------------------------------------------ | | QQ | 略,http://im.qq.com/macqq/ |...关于 MSSQL/MYSQL/ORACLE 的分页语句https://xkcoding.com/2018-01-16-db-page-sqls.htmlhttps://xkcoding.com/2018-01-16-db-page-sqls.htmlMSSQL 用 TOP,MySQL 用 LIMIT,Oracle 用 ROWNUM——三大数据库的分页语法完全不同。本文整理了各数据库查询前 N 条记录和分页查询的标准写法,直接复制就能用。特别是 Oracle 的三层嵌套结构,不熟悉的人很容易写错。Tue, 16 Jan 2018 06:07:37 GMTMSSQL 的前 N 条记录 sql --查询前 N 条记录,可以改成需要的数字 SELECT TOP N FROM TABLENAME MSSQL 的分页语句,第 N 条到第 M 条记录 sql SELECT TOP N T. FROM ( SELECT TOP M FROM TABLENAME ORDER BY COLUMNNAME ) T ORDER BY T.COLUMNNAME DESC MYSQL 的前 N 条记录 sql -- 通常0是可以省略的,直接写成 LIMIT N。0代表从第0条记录后面开始,也就是从第一条开始 SELECT FROM TABLENAME LIMIT 0,N MYSQL 的分页语句,第 N 条开始,每页 M 条 sql SELECT FROM TABLENAME LIMIT N,M ORACLE 的前 N 条记录 sql -- N 为前多少条记录 SELECT FROM TABLENAME WHERE ROWNUM NElasticSearch 笔记https://xkcoding.com/2018-01-12-elasticsearch-note.htmlhttps://xkcoding.com/2018-01-12-elasticsearch-note.html从零到一的 ElasticSearch 完整学习笔记!覆盖单机安装、分布式集群配置、head 插件和 ik 中文分词插件安装。详解索引、类型、文档、分片等核心概念,附带大量 RESTful API 示例:条件查询、聚合查询、复合查询。最后用 Spring Boot 整合 ES,实现增删改查和复杂搜索功能。Fri, 12 Jan 2018 09:11:18 GMTElasticSearch是一个基于 Lucene 的分布式搜索引擎,业内简称ES。它提供了基于 RESTful 风格的全文搜索API。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前最流行的企业级搜索引擎。另外,它的分布式设计让它天生就适合用于云计算中,并能够达到准实时搜索,而且安装使用方便,还拥有稳定,可靠,快速等特性。本文是我对 ES 的一个完整记录,方便后期查阅。另外大家还可以查阅更多的相关资料对 ElasticSearch 有更深入的了解。 1. 安装 1.1. 单机安装 ElasticSearch 要求本地的 JDK 版本不低于1.8 1. 去官网下载最新版的 ES 软件包 https://www.elastic.co/downloads/elasticsearch ,目前 ES 最新版本为6.1.1,我这里采用 wget 命令在终端下载 shell cd apps wget https://artifacts.elastic.co/downloads/elasticsearch/elasticse...驼峰命名和下划线命名互相转化https://xkcoding.com/2018-01-11-camelcase-underline-transform.htmlhttps://xkcoding.com/2018-01-11-camelcase-underline-transform.html数据库字段是 user_name,Java 属性是 userName,来回转换烦不烦?这个工具类帮你搞定驼峰命名和下划线命名的互转。基于正则表达式实现,代码简洁高效,直接复制到项目里就能用。ORM 框架没覆盖的场景,手动转换必备。Thu, 11 Jan 2018 01:47:10 GMTjava import java.util.regex.Matcher; import java.util.regex.Pattern; / 驼峰命名和下划线命名互转 @package: com.xkcoding @description: 驼峰命名和下划线命名互转 @author: yangkai.shen @date: Created in 2018/1/11 上午9:49 @copyright: Copyright (c) 2018 @version: 0.0.1 @modified: yangkai.shen / public class CasesUtil { private static final Pattern CAMELCASEPATTERN = Pattern.compile("[A-Z]"); private static final Pattern UNDERLINEPATTERN = Pattern.compile("[a-z]"); private static final char UNDERLINE...DevOps 之 Jenkins 安装、配置、美化、插件及常见错误处理https://xkcoding.com/2018-01-04-devops-jenkins.htmlhttps://xkcoding.com/2018-01-04-devops-jenkins.htmlGitLab 搭好了,下一步就是 Jenkins 持续集成。本文记录完整的 Jenkins 部署实战:JDK 路径配置、阿里云 Maven 镜像加速、个性化邮件模板(含完整 HTML 代码)。还推荐了 Material 风格主题美化方案,以及 11 个必装插件:Gitlab Hook、FireLine 代码规约检查、钉钉通知等。Thu, 04 Jan 2018 05:19:13 GMT继续上一篇的话题,既然已经搭建了 GitLab 的代码仓库,那么现在就可以开始进行下一步持续集成环境的搭建了。公司准备利用 Jenkins CI 进行持续集成,本文记录了 Jenkins 的安装、基础配置、界面美化、常用插件及常见错误处理。 1. 安装Jenkins 准备工作 1. 安装 JDK,并配置环境变量 2. 安装 maven 3. 配置阿里云的 maven 镜像源地址,vim /usr/share/maven/conf/settings.xml 将👇内容添加进 mirrors 节点 xml nexus-aliyun Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public 4. 安装 git 配置镜像源地址 shell sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo...DevOps 之 GitLab 安装、汉化及常见错误处理https://xkcoding.com/2018-01-03-devops-gitlab.htmlhttps://xkcoding.com/2018-01-03-devops-gitlab.html搭建企业私有 Git 仓库,GitLab 是首选。本文涵盖 CentOS 下的完整部署流程:从依赖安装、镜像源配置、QQ 邮箱 SMTP 设置,到中文汉化包的正确使用姿势。还有两个必踩的坑:reconfigure 卡住和端口占用,以及配置 push 时邮件通知 diff 信息的完整方案。Wed, 03 Jan 2018 03:12:37 GMT公司现在开始实行 DevOps 的开发模式,代码托管采用了 GitLab 搭建私有代码仓库,本文记录了 GitLab 的安装、汉化及常见错误处理。 1. 安装GitLab 准备工作 shell sudo yum install curl policycoreutils openssh-server openssh-clients sudo systemctl enable sshd sudo systemctl start sshd sudo yum install postfix sudo systemctl enable postfix sudo systemctl start postfix sudo firewall-cmd --permanent --add-service=http sudo systemctl reload firewalld 配置镜像源地址 shell curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash s...提升 JAVA 编程技能https://xkcoding.com/2017-12-11-tips-for-improve-java-skill.htmlhttps://xkcoding.com/2017-12-11-tips-for-improve-java-skill.html翻译自: How to improve Java programming skillMon, 11 Dec 2017 05:18:56 GMT翻译自: How to improve Java programming skill 1. 深入理解 OO 思想 2. 多读 JAVA 相关的书籍 3. 多练习,只有多去写代码,才能更懂代码 4. 阅读关键的 API(java.lang.,java.io.,java.util.)的源码 5. 处理问题之前,花更多的时间去分析问题,这其实是在节约时间 6. 通过帮助他人来提升自己对问题的理解 7. 尽量写简单、容易理解的逻辑代码,而不是通过复杂的代码来彰显自己的代码多么牛逼,好的代码本身就是文档 8. 多阅读大牛的技术博客 9. 保持跟进新的 JAVA 技术,可以不去精通,但是你不能落后 10. 多阅读文档 11. 不要去和他人比较(最后一点,但并不是关键性的),最大的敌人永远是你自己redux 和 mobx 初体验https://xkcoding.com/2017-12-05-redux-and-mobx-first.htmlhttps://xkcoding.com/2017-12-05-redux-and-mobx-first.html前段时间搞了 Vue,现在又得开始写 React 了。 我堂堂的一个后端,真是太残忍啦 o(╯□╰)o 接触过 Vue 的应该都知道,Vue 的状态管理可以有两种实现,一种是 Vuex,还有一种是 eventBus 形式。 React 状态管理,老牌的应该是 Redux,但是存在了太多的概念,对于刚接触的童鞋不太友好。mobx 当属时代的新星了。不管从效率,还是易读性都远超 Redux。...Tue, 05 Dec 2017 09:58:56 GMT前段时间搞了 Vue,现在又得开始写 React 了。 我堂堂的一个后端,真是太残忍啦 o(╯□╰)o 接触过 Vue 的应该都知道,Vue 的状态管理可以有两种实现,一种是 Vuex,还有一种是 eventBus 形式。 React 状态管理,老牌的应该是 Redux,但是存在了太多的概念,对于刚接触的童鞋不太友好。mobx 当属时代的新星了。不管从效率,还是易读性都远超 Redux。 下面带来俩小🌰大家感受下 最简单的一个 redux 操作 js import { createStore } from "redux"; const ADDACTION = "ADD"; const add = num ={ return { type: ADDACTION, num, }; }; const initialState = { count: 0, }; const reducers = (state = initialState, action) ={ switch (action.type) { case ADDACTION: r...Mac 下彻底解决 mysql 中文乱码问题https://xkcoding.com/2017-11-14-mysql-chinese-character-encoding.htmlhttps://xkcoding.com/2017-11-14-mysql-chinese-character-encoding.htmlMySQL 中文乱码?别急着改 my.cnf!本文梳理了 Mac 环境下 MySQL 乱码的 4 种原因:程序配置、数据库/表/字段编码、终端设置、Navicat 连接设置。特别是 Homebrew 安装的 MySQL 默认没有 my.cnf,以及 Navicat 的 Encoding 要选 Auto 而非 UTF-8 这两个坑,踩过才知道痛。Tue, 14 Nov 2017 01:26:08 GMT数据库中文乱码是个比较常见的问题,今天笔者就遇到了。 系统环境:macOS Sierra 10.12.6MySQL 版本:5.7.18 Homebrew连接软件:Navicat Premium 12.0.12 TNT edition 1. MySQL程序问题 sql #启动 mysql.server start #关闭 mysql.server stop #执行mysql命令 mysql; #查看编码设置[下面显示的是已经设置好的] mysqlshow variables like '%char%'; +--------------------+--------------------------------------------------------+ | Variablename | Value | +--------------------------+-----------------------------------------------------...使用 Druid 加速 oracle 的查询https://xkcoding.com/2017-11-10-druid-oracle-pscache.htmlhttps://xkcoding.com/2017-11-10-druid-oracle-pscache.htmlOracle 查询慢不一定是 SQL 的问题。开启 Druid 的 PSCache 功能后,性能提升了 20%!原理是 Oracle 支持游标,PreparedStatement 被缓存复用时服务端游标不关闭,性能提升可达一个数量级。关键是 Druid 是唯一解决了 PSCache 内存占用过多问题的连接池。Fri, 10 Nov 2017 01:06:33 GMT##1. 问题 最近,公司的 web 应用,查询数据有些慢,数据库使用的是 oracle,连接池采用了阿里巴巴温少开源的 Druid 连接池,于是开始寻找解决办法。 2. 方法 1. 首先我们需要做的应该是通过 Druid 来监控我们应用中的慢 SQL,然后对其进行优化。从 SQL 监控和 SQL 防火墙中,我发现我们的 SQL 并没有多少慢 SQL。于是排除了慢 SQL 导致查询变慢的原因。 2. Druid 中支持配置 PSCache。我们的 web 程序并没有开启这个选项,我们将其开启,发现查询返回的结果速度快了 20% 左右。 3. 原理 oracle 支持游标,一个 PreparedStatement 对应服务器一个游标,如果 PreparedStatement 被缓存起来重复执行,PreparedStatement 没有被关闭,服务器端的游标就不会被关闭,性能提高非常显著。在类似 SELECT FROM T WHERE ID = ? 这样的场景,启用 PSCache 和不启用 PSCache 的性能可能是相差一个数量级的。 连接 oracle 数据库,打开 PSCache...dubbo前置知识:dubbo-admin 的安装https://xkcoding.com/2017-11-08-dubbo-admin-install.htmlhttps://xkcoding.com/2017-11-08-dubbo-admin-install.htmlDubbo 服务部署后如何监控和治理?dubbo-admin 是官方提供的可视化管控台。本文详细记录从 GitHub 拉取源码、Maven 打包、Tomcat 部署到配置 Zookeeper 集群地址的完整流程。重点讲解端口冲突避免、JVM 参数调优等实战技巧,让你的 Dubbo 服务治理一目了然。Wed, 08 Nov 2017 07:37:14 GMTdubbo-admin 是 dubbo 官方提供的一个的管控台程序,可以对 dubbo 服务进行监控,还可以对其进行权重分配、负载均衡策略等的调优操作,简而言之,我们可以通过 dubbo-admin,对我们的 dubbo 服务进行服务治理及服务监控。 现在,我们开始安装及配置 dubbo-admin。 1. 首先启动我们之前安装了 zookeeper 集群的三台 Linux 虚拟机,并将虚拟机的 zookeeper 集群启动起来。 2. 前往 GitHub 的 dubbo-ops 仓库 去 clone 最新的 dubbo 源码。 shell # yangkai.shen @ localhost in /Documents/code/open [16:23:11] $ git clone https://github.com/apache/incubator-dubbo-ops.git 3. 进入 dubbo 项目文件夹里的 dubbo-admin 文件夹中。 shell # yangkai.shen @ localhost in /Document...dubbo前置知识:zookeeper集群搭建https://xkcoding.com/2017-11-01-zookeeper-cluster.htmlhttps://xkcoding.com/2017-11-01-zookeeper-cluster.html学 Dubbo 之前先把注册中心搭好。本文手把手教你在 3 台 Linux 虚拟机上搭建 Zookeeper 集群:从下载解压到配置 zoo.cfg,从创建 myid 文件到配置环境变量,每一步都有详细命令。最后验证集群状态,一个 leader 两个 follower,高可用注册中心就绑了。Dubbo 入门的前置必修课。Wed, 01 Nov 2017 05:55:10 GMT拖了一天一天又一天,终于在时隔3月之后,又迎来了一篇新博客。真的是懒癌晚期了。o(╯□╰)o dubbo 框架需要将服务统一注册到一个注册中心,才能被远程调用。这里注册中心可以使用 zookeeper 或者 redis。 这里我们以 zookeeper 为例。zookeeper 可以单机版也就是 standalone模式运行,也可以使用集群方式运行。为了实现高可用,本例采用集群方式部署,需要保证至少半数以上的机器存活,所以至少为3台机器。话不多说,让我们开始 zookeeper 集群的搭建吧: 1. 官网下载 zookeeper-3.4.10.tar.gz ,将软件包分别放在三台 Linux 虚拟机的 /software 目录下。 2. 进入 software 目录下,解压软件包。 bash [root@localhost ]# cd /software [root@localhost software]# tar -zxvf zookeeper-3.4.10.tar.gz [root@localhost software]# ll total 34228...mysql启动报错问题https://xkcoding.com/2017-08-31-mysql-start-error.htmlhttps://xkcoding.com/2017-08-31-mysql-start-error.htmlWindows 服务器上 MySQL 启动失败,报「系统错误 1067 进程意外终止」?别急着改 my.ini 的 basedir 和 datadir,先用 netstat 查查 3306 端口是不是被占用了。本文记录一次排查过程:发现是 IEXPLORE.exe 占了端口,杀掉进程后 MySQL 正常启动。附 Windows 下端口占用排查命令。Thu, 31 Aug 2017 01:48:10 GMT今天公司 windows 服务器 MySQL 数据库启动异常,记录下原因。 1. 问题重现 执行 net start mysql 的时候出现如下错误: bash 系统出错 发生系统错误 1067 进程意外终止 2. 排查问题 查阅资料,普遍的解决方法是,my.ini 文件中需要存在 basedir 和 datadir 这两个配置 但是我的 my.ini 原本就已经加入了这两个配置,仍然启动错误。 排查原因,发现是 mysql 的 3306 端口被IEXPLORE.exe占用了 bash windows 下查看端口占用 netstat -aon|findstr "3306" windows 下根据 id 查看对应程序 tasklist|findstr "2016" 3. 解决问题 打开任务管理器, IEXPLORE.exe 的程序杀死,重新 net start mysql MySQL 就愉快的重新启动了。自定义阻塞队列https://xkcoding.com/2017-08-02-customize-blocked-queue.htmlhttps://xkcoding.com/2017-08-02-customize-blocked-queue.html想理解 Java 并发编程里的 wait() 和 notify()?最好的方式是自己实现一个阻塞队列。本文用 LinkedList + AtomicInteger + synchronized 手撸一个简易版 BlockingQueue,队列满时 put 阻塞,队列空时 get 阻塞,完美演示生产者-消费者模型。附完整测试代码,帮你真正理解线程间通信机制。Wed, 02 Aug 2017 07:47:07 GMT今天重温了下 java 多线程中的 notify() 方法以及 wait() 方法,一时兴起,决定通过这俩个方法,实现一个简易的自定义阻塞队列。 阻塞队列是什么,与普通队列的区别是什么? 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来。 1. 新建一个 MyQueue.java 类 java import java.util.LinkedList; import java.util.concurrent.atomic.AtomicInteger; import com.xiaoleilu.hutool.util.StrUtil; / 使用 notify() 和 wait() 实现自定义阻塞队列 @author Yangkai.Shen @...spring-boot整合mybatis的时候使用logback打印日志https://xkcoding.com/2017-07-19-spring-boot-mybatis-logback.htmlhttps://xkcoding.com/2017-07-19-spring-boot-mybatis-logback.htmlSpring Boot 整合 MyBatis 后,SQL 语句死活打印不出来?关键在于 logback-spring.xml 里要把 Mapper 接口的包路径配成 DEBUG 级别。本文提供完整的 logback 配置模板,包括控制台输出、按日期滚动的文件日志、独立的错误日志。另外安利 Lombok 的 @Slf4j 注解,告别冗余的 Logger 声明。Wed, 19 Jul 2017 03:44:55 GMT最近在学习 spring boot ,日志用的是 logback ,至于为什么没有选常用的 log4j ,因为 logback 是 spring boot 官方推荐的日志系统。但是在整合 Mybatis 的时候一直打印不了 SQL 语句,查阅多方资料,终于解决了 1. 先展示下 logback-spring.xml 的完整内容 xml 【xkcoding】%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n ${user.dir}/logs/log/online-study.%d.log 【xkcoding】%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n ERROR...Windows10 系统下载与激活https://xkcoding.com/2017-07-18-win10-download.htmlhttps://xkcoding.com/2017-07-18-win10-download.htmlwindows 是目前我们用的最多一个系统,win10 现在也优化的越来越好,今天大姐的电脑有点问题,担心太蠢,不会下载和激活系统,所以整理并记录一下如何下载并激活 win10 系统,以供查阅。Tue, 18 Jul 2017 01:57:35 GMTwindows 是目前我们用的最多一个系统,win10 现在也优化的越来越好,今天大姐的电脑有点问题,担心太蠢,不会下载和激活系统,所以整理并记录一下如何下载并激活 win10 系统,以供查阅。 1. 微软各类软件下载地址(国人自己搞得,非微软官方) 2. 选择 win10 更新版本 3. 选择 win10 的具体版本 4. 复制版本下载地址,使用迅雷下载 我已经把64位多版本的链接单独抠出来了,需要的直接拿去用 ed2k://|file|cnwindows10multipleeditionsversion1703updatedjune2017x64dvd10724850.iso|5741144064|7717C389428734009E0350A1BB8F2508|/ 5. 附赠一个激活工具下载地址 提取码:1pdp 这个激活工具很强大,可以激活 windows 系统 和 office 软件,并且提供 office 2016和 office 2013两个版本的自动安装功能。 6. 激活工具的使用,下载激活工具,解压压缩包,得到...HashMap 的 JDK 源码探索https://xkcoding.com/2017-07-12-jdk-map-source-explore.htmlhttps://xkcoding.com/2017-07-12-jdk-map-source-explore.htmlMap.Entry 明明是个接口,为什么能直接调用 getKey() 和 getValue()?从一个朋友的疑问出发,深入 HashMap 源码,揭秘 entrySet() 返回的其实是内部类 EntrySet,而真正干活的是实现了 Map.Entry 的 Node 类。一次完整的 Java 多态实战分析,帮你理解接口、实现类、内部类之间的关系。Wed, 12 Jul 2017 03:26:43 GMT缘由:今天好友拿着下面的代码,问我为什么Map.Entry 这个接口没有实现 getKey() 和 getValue() 方法,却可以使用,由此,开启了一番查阅 JDK 源码的旅途.... java Map map = new HashMap(); map.put(1, "张三"); map.put(2, "李四"); map.put(3, "王五"); map.put(4, "赵六"); map.put(5, "钱七"); Set set = map.entrySet(); for (Object object : set) { Map.Entry entry = (Map.Entry) object; System.out.println(entry.getKey() + "-->" + entry.getValue()); } 1. 首先,我们看 map 对象,这个 map 对象是 HashMap 的一个实例,然后下面的 Set set = map.entrySet(); 可以知道这其实用的 HashMap 实现的 entrySet() 方法,然后我们可以查看 Has...Oracle 11gR2 RAC的JDBC连接串 https://xkcoding.com/2017-01-06-connect-oracle11g-rac-url.htmlhttps://xkcoding.com/2017-01-06-connect-oracle11g-rac-url.html前言--> 今天tomcat启动时,连接oracle直接报错,出现ORA-12505的问题,最开始,我以为错误的原因是jdbc连接Oracle的连接串中的sid配置的不对,oracle不能解析连接串中的sid名字,所以拒绝了连接。在连接字串中写入正确的sid即可。Fri, 06 Jan 2017 05:51:10 GMT前言--今天tomcat启动时,连接oracle直接报错,出现ORA-12505的问题,最开始,我以为错误的原因是jdbc连接Oracle的连接串中的sid配置的不对,oracle不能解析连接串中的sid名字,所以拒绝了连接。在连接字串中写入正确的sid即可。 于是,查看数据库中当前的sid: sql select INSTANCENAME from v$instance; 发现sid果然不同,然后将url的sid换成查出来的sid,果然连接上了。 但是我仔细一想,我用原来的sid通过navicat是可以连上oracle的,为什么jdbc会连接不上呢? 查资料得知,对于Oracle的JDBC连接,是支持EZ-Connect写法的,即jdbc:oracle:thin:@Server:1521/Database 但对于Oracle 11gR2 RAC系统,如果Server用了ScanName,Database用了数据库的ServiceName,并不能连接到数据库,而是报SID错误。 原因可能是此种写法,JDBC将Database解析为了数据库的SID。 经多方测试,可用如下写法实现11GR...elasticsearch环境搭建及起步https://xkcoding.com/2016-12-13-elasticsearch-get-start.htmlhttps://xkcoding.com/2016-12-13-elasticsearch-get-start.htmlElasticSearch 概述 ElasticSearch是一个高可扩展的开源的全文搜索分析引擎。 它允许你快速的存储、搜索和分析大量数据。ElasticSearch通常作为后端程序,为需要复杂查询的应用提供服务。...Tue, 13 Dec 2016 09:12:39 GMTElasticSearch 概述 ElasticSearch是一个高可扩展的开源的全文搜索分析引擎。 - 它允许你快速的存储、搜索和分析大量数据。ElasticSearch通常作为后端程序,为需要复杂查询的应用提供服务。 - Elasticsearch是一个基于Lucene的开源分布式搜索引擎,具有分布式多用户能力。Elasticsearch是用java开发,提供Restful接口,能够达到实时搜索、高性能计算;同时Elasticsearch的横向扩展能力非常强,不需要重启服务,基本上达到了零配置。 ElasticSearch 安装 1. 在VMware上安装centos7 2. 安装vim,输入yum install -y vim 3. 安装git,输入:yum install -y git 4. 安装jdk1.8+ - 查看CentOS自带JDK是否已安装,输入:yum list installed |grep java。 - 若有自带安装的JDK,卸载CentOS系统自带Java环境。 - 卸载JDK相关文件,输入:yum -y remove java-1.8....Lenovo System X3250 M5服务器安装CentOS6.4https://xkcoding.com/2016-08-31-server-install-centos6.htmlhttps://xkcoding.com/2016-08-31-server-install-centos6.html前言 第一次真正接触服务器,公司要求安装linux系统,花了2天时间,因为该服务器比较复杂,以此文记录下安装过程中出现的问题。Wed, 31 Aug 2016 02:46:09 GMT前言 第一次真正接触服务器,公司要求安装linux系统,花了2天时间,因为该服务器比较复杂,以此文记录下安装过程中出现的问题。 问题一:安装系统时无法识别硬盘 问题描述: Lenovo System X3250 M5 该服务器最初是存在磁盘阵列的,也就是Raid模式,因此使用 U盘安装系统 时,有时会出现无法识别硬盘的状态。 问题解决: 手动加载驱动的方法 - centos 6.2进入安装界面时Tab键进入高级选项,追加输入 linux dd,这样安装时会提示加载disk driver。用管理卡挂载驱动镜像即可。 - centos 5.8进入安装界面直接在boot:后面输入 linux dd。 PXE安装自动加载驱动 - ks文件中在开头附近增加driverdisk选项 driverdisk --source=http://$ip/driverimg.iso 问题二:使用U盘安装系统,安装过程中说找不到ISO文件 问题描述: 该问题是使用U盘安装系统时会出现的,使用U盘安装的步骤: 1. 使用UltraISO(软碟通)将linux系统镜像写入U盘 ,并且将ISO文件放入U盘 2. 设置...实际项目中的代码规范https://xkcoding.com/2016-04-05-coding-standards.htmlhttps://xkcoding.com/2016-04-05-coding-standards.html前言最近在准备软件杯的比赛项目,因为是担任的是项目组长,所以要求组员之间的项目代码必须要有规范,方便组员之间的团队合作,以及后期代码的维护。而且,我相信,如果我们代码规范能够做好的话,对于我们的开发水平也会提高多少。Tue, 05 Apr 2016 13:35:53 GMT前言最近在准备软件杯的比赛项目,因为是担任的是项目组长,所以要求组员之间的项目代码必须要有规范,方便组员之间的团队合作,以及后期代码的维护。而且,我相信,如果我们代码规范能够做好的话,对于我们的开发水平也会提高多少。 1. 代码的规范化好处多多 1. 规范的代码可以促进团队合作 1. 规范的代码可以减少bug处理 1. 规范的代码可以降低维护成本 1. 规范的代码有助于代码审查 1. 养成代码规范的习惯,有助于程序员自身的成长 2. 开发前的准备 Eclipse中设置代码样式在 Window -->Preferences 中设置 2.1. 设置工作空间编码为UTF-8 2.2. 设置文件编码为UTF-8 2.3. 方法变量名转化成成员变量名称时,变量名称前加m以示区分 2.4. 配置文档注释 Window -->Preferences -->Java -->Code Style -->Code Templates 2.4.1. Comments Files修改成如下内容 / @Title: ${filename} @Package ${packagen...Android中svn不需要进行版本控制的部分https://xkcoding.com/2016-04-03-android-svn-attention.htmlhttps://xkcoding.com/2016-04-03-android-svn-attention.html前言SVN是Subversion的简称,是一个开放源代码的版本控制系统,说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。但是SVN对于Android项目来说并不是所有文件都需要进行版本控制的。 bin,gen 两个文件夹不用提交,因为这两个文件夹是自动生成的,如果提交可能会产生编译异常。 .settings也是自动生成,也不用提交。...Sun, 03 Apr 2016 05:07:36 GMT前言SVN是Subversion的简称,是一个开放源代码的版本控制系统,说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。但是SVN对于Android项目来说并不是所有文件都需要进行版本控制的。 1. bin,gen 两个文件夹不用提交,因为这两个文件夹是自动生成的,如果提交可能会产生编译异常。 1. .settings也是自动生成,也不用提交。 1. .git文件夹也不需要提交,这是存放git的配置信息 1. .svn同.git一样,是存放svn的配置信息的,同样不需要提交 - bin目录 - gen目录 - .svn目录 - .settings目录 - .git目录 --- 屏蔽上传的方式:window-->preferences-->team-->Ignored Resources-->Add Pattern最后添加完成点击Apply 具体需要添加的部分见下图蓝桥杯感想https://xkcoding.com/2016-03-28-lanqiao-exam.htmlhttps://xkcoding.com/2016-03-28-lanqiao-exam.html前言今年是我第一次参加蓝桥杯。3月20号。Mon, 28 Mar 2016 15:08:33 GMT前言今年是我第一次参加蓝桥杯。3月20号。 大一、大二的时候,我就对蓝桥杯有所耳闻,今年如愿以偿的报名了。曾经憧憬着可以在蓝桥杯轻松获得二等奖,兴许运气来了,一等也是有机会的。However,今晚(3月28号)成绩出来了,三等奖,GG了。大学从未有过的信心摧残。好了,炮灰就是炮灰,我也不会一直自怨自艾,我是个有态度的炮灰,总结一下失败的原因吧! 1. 总结 1. 自信心爆棚(自负) 比赛前一个月,室友和我说,蓝桥杯还有一个月了,不做做模拟?当时我正在做一个Android项目,再加上一直对自己实力的自信,就没有在意;比赛前2周,室友说紧张不,我说小case。。终于我成功的裸考了(在进考场之前未做甚至未看一题模拟题) 1. 学艺不精(对简单的算法不够熟练,对复杂的算法没有深究) 1. 想到再补(不是想不到,而是实在太多了) 2. 展望 蓝桥杯,如果大四还可以参战的话,明年我还想再战,那时我必将全力以赴,毕竟大学不想留有遗憾。大学剩下的一年,我会尽自己最大的努力提升自己,以最好的姿态迎接毕业。android 在eclipse中把局部变量变成成员变量前自动加mhttps://xkcoding.com/2016-03-27-eclipse-tips-variable.htmlhttps://xkcoding.com/2016-03-27-eclipse-tips-variable.html前言在开发过程中,开发规范很重要,这样有利于后期维护,而且如果离职后,新同事接收你项目时也方便阅读代码,比如我们命名一个成员变量,一般在都是m子母开头。Sun, 27 Mar 2016 04:22:09 GMT前言在开发过程中,开发规范很重要,这样有利于后期维护,而且如果离职后,新同事接收你项目时也方便阅读代码,比如我们命名一个成员变量,一般在都是m子母开头。 比如我们在一个方法中写一个变量,后来发现在其他地方也要用到此变量,这时我们就需要把这变量做成成员变量,我们只要按下ctrl+1,就会提示是否需要变成成员变量,如果要它自动在变量前加m,其实这也是可以配置的,如图:volley开源框架的初体验https://xkcoding.com/2016-03-26-first-use-volley-demo.htmlhttps://xkcoding.com/2016-03-26-first-use-volley-demo.html前言Http网络数据交互请求是极其重要并且使用很频繁的一个模块,也是最基本的网络编程所需要学习的。网络请求方式的效率和性能直接影响到APP的整体用户体验流畅性,所以学习并掌握一款好的Http请求框架对我们的网络开发非常重要。Http请求在移动网络编程中主要是Get和Post请求接口数据的使用。所以,在学习好基础的Http请求知识后,为了提升开发效率,选择学习使用一款好的Http网络请求框架变得非常...Fri, 25 Mar 2016 16:51:41 GMT前言Http网络数据交互请求是极其重要并且使用很频繁的一个模块,也是最基本的网络编程所需要学习的。网络请求方式的效率和性能直接影响到APP的整体用户体验流畅性,所以学习并掌握一款好的Http请求框架对我们的网络开发非常重要。Http请求在移动网络编程中主要是Get和Post请求接口数据的使用。所以,在学习好基础的Http请求知识后,为了提升开发效率,选择学习使用一款好的Http网络请求框架变得非常的重要。 什么是Volley?汉语译过来就是:齐射; 迸发的意思。可以看出来,Volley特别适合数据量不大但是通信频繁的场景。 Volley是Google I/O 2013上Google官方发布的一款Android平台上的网络通信库。 以前的网络请求,要考虑开启线程、内存泄漏、性能等等复杂的问题。但是Volley框架已经帮我们把这些问题处理好了,对外提供了相应的完善的请求API ,我们只需要按照要求使用即可 1. Volley框架的特点 - 能使网络通信更快,更简单,更健壮 - Get、Post网络请求及网络图像的高效率异步处理请求 - 可以对网络请求进行排序优先级管理 - 网络请求的缓存...Android 开源项目分类汇总https://xkcoding.com/2016-03-25-android-open-project.htmlhttps://xkcoding.com/2016-03-25-android-open-project.html目前包括: Android 开源项目第一篇——个性化控件(View)篇 包括:ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、ColorPickView、GraphView、UI Style、其他...Fri, 25 Mar 2016 14:15:00 GMT目前包括: 1. Android 开源项目第一篇——个性化控件(View)篇 包括:ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、ColorPickView、GraphView、UI Style、其他 1. Android 开源项目第二篇——工具库篇 包括:依赖注入、图片缓存、网络请求、数据库 ORM 工具包、Android 公共库、高版本向低版本兼容库、多媒体、事件总线、传感器、安全、插件化、文件、其他 1. Android 开源项目第三篇——优秀项目篇 比较有意思的完整的 Android 项目 1. Android 开源项目第四篇——开发及测试工具篇 包括:开发效率工具、开发自测相关、测试工具、开发及编译环境、其他 1. Android 开源项目第五篇——优秀个人和团体篇 乐于分享并且有一些很不错的开源项目的个人和组织,包括 JakeWharton、Chris Banes、Koush...Ubuntu-15.04安装jdkhttps://xkcoding.com/2016-03-24-ubuntu-15.04-install-jdk.htmlhttps://xkcoding.com/2016-03-24-ubuntu-15.04-install-jdk.html前言最近在Linux上学习Python,而PyCharm需要java环境的支持,本文记录了在Ubuntu-15.04上安装jdk1.8版本的步骤与遇到的问题。 1. 方式一 Ubuntu安装JDK 系统版本:Ubuntu 15.04 x64 JDK版本:jdk-8u60-linux-x64 步骤详解 1. 查看系统位数,输入以下命令即可 getconf LONGBIT 2. 下载对应的JDK文件,我这里下载的是jdk-8u60-linux-64.tar.gz 3. 创建目录作为JDK的安装目录,这里选择安装位置为:/usr/java/ sudo mkdir /usr/java 4. 解压文件带/usr/java/目录下,文件下载的位置是在download目录下的 cd do...Wed, 23 Mar 2016 16:00:46 GMT前言最近在Linux上学习Python,而PyCharm需要java环境的支持,本文记录了在Ubuntu-15.04上安装jdk1.8版本的步骤与遇到的问题。 1. 方式一 Ubuntu安装JDK 系统版本:Ubuntu 15.04 x64 JDK版本:jdk-8u60-linux-x64 步骤详解 1. 查看系统位数,输入以下命令即可 getconf LONGBIT 2. 下载对应的JDK文件,我这里下载的是jdk-8u60-linux-64.tar.gz 3. 创建目录作为JDK的安装目录,这里选择安装位置为:/usr/java/ sudo mkdir /usr/java 4. 解压文件带/usr/java/目录下,文件下载的位置是在download目录下的 cd download sudo tar zxvf jdk-8u60-linux-x64.tar.gz -C /usr/java/ 5. 进入到/usr/java/目录,给文件夹改名(这一步并非必须,但是为了配置环境变量方便,建议这样做) cd /usr/java/ sudo mv jdk1...helloworldhttps://xkcoding.com/2016-03-21-helloworld.htmlhttps://xkcoding.com/2016-03-21-helloworld.htmlWelcome to Hexo: This is your very first post." Mon, 21 Mar 2016 15:58:59 GMTWelcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick Start Create a new post bash $ hexo new "My New Post" More info: Writing Run server bash $ hexo server More info: Server Generate static files bash $ hexo generate More info: Generating Deploy to remote sites bash $ hexo deploy More info: Deployment