博客优化:Hexo支持webp格式&&迁移到香港云主机
最近使用lighthouse对博客做了一个测试,测试结果如下,以下是桌面 PC 端的测试的结果: 下图是一个优秀个人博客网站的测试结果,通过对比可以发现有很大差距。 这个测试能够一定程度反映网站的用户体验,测试主要包含性能,可访问性,SEO和最佳实践四个方面。通过测试,我们能发现网站存在的问题, 同时lighthouse工具也提供关于这些问题的一些改进建议。其中很多问题网上已经有优化方案了,我们就不再搬运了,但是关于Hexo建站如何优雅使用webp图片格式的问题, 还没有成熟的方案,本片博文将给大家分享我是如何实现 Hexo 兼容webp格式图片,且做到无感知,全自动化的管理的; 同时也会简单介绍通过将博客迁移到香港云主机,优化国内读者的访问速度的过程。 图片资源优化技术类文章不可避免地需要大量的配图,同时随着博客文章的图片的增多,偶尔出现几 M 大小的图片,博客页面加载就会变慢,影响读者的阅读体验。 缩小页面的中配图的大小,加速博文渲染速度迫在眉睫,但是最终实现不能以牺牲图片的质量和显示效果为代价。查阅相关资料,我尝试了从以下两种思路进行优化。 第一种思路是使用压缩工具将过大的 ...
docker最佳实践-减小镜像体积
系列文章docker最佳实践系列介绍了容器使用的一些最佳实践,内容包括如何优化减少镜像的大小,如何提升构建速度(这在CICD中十分重要), 如何管理镜像等。如果有需要的小伙伴,可以一起讨论学习。 减小镜像体积 提升构建速度 大纲当我们刚开始接触Docker,并尝试使用docker build构建镜像时,通常会构建出体积巨大的镜像。而事实上,我们可以通过一些技巧方法减小镜像的大小。 本片博文,我将介绍一些优化技巧,同时也会探讨如何在减小镜像大小和可调试性取舍。这些技巧可以分为两部分:第一部分是多阶段构建(multi-stage builds), 正确使用多阶段构建能够极大减小构建物镜像的大小,同时还会解释静态链接(static link)和动态链接(dynamic link)之间的区别以及为什么我们需要了解它们; 第二部分是使用一些常见的基础镜像,这些基础镜像仅包含我们所需要的内容,而无需引入其他文件。 场景还原首先,我们通过Golang和C的两个Hello world程序去还原很多开发者第一次使用docker build所构建出镜像, 并且看看这些的镜像的大小。 下面是C的Hell ...
Go协程,OS线程和CPU管理
本片博文基于Go1.14.3版本 创建一个系统线程并且从一个线程切换到另一个线程会带来内存和性能上的损耗。Go旨在更好地发挥多核的性能,其从一开始设计就考虑了对并发地优化。 M-P-G模型为了解决线程间切换所造成的性能损耗。Go有自己的调度器(scheduler),可以在操作系统上分配协程(Goroutine)。 这个调度器有三个核心概念,源码中的描述如下: 12345The main concepts are:G - goroutine.M - worker thread, or machine.P - processor, a resource that is required to execute Go code. M must have an associated P to execute Go code[...]. 下图展示了M-P-G模型: 每个协程G运行在一个系统线程M中,同时该线程M被分配一个逻辑CPUP上。让我们看一个简单的例子,这个例子介绍了Go M-P-G模型: 12345678910111213141516func main() { ...
博文格式化&Hexo主题高级自定义
有一段时间没怎么倒腾博客了,这几天收拾了一下博客,同时将最近阅读和记录的有趣的内容整理一番,分享给大家。主要包括在博客 写作时遇到的一些问题及解决方法,即我是如何构建自己的博客写作工作流的。同时也有一些在博文写作的中一些感悟。 hexo 及 Butterfly 主题升级首先,最近升级了 hexo 版本,升级到最新版本3.1.0,同时也更新了主题的版本。当然,升级完就出现问题🤪,定位错误是之前复制 的自定义配置文件butterfly.yml缺少一些必要的变量,同时该文件结构也发生了变化,导致没办法渲染成功。暗暗窃喜还好做了 版本管理,直接 merge,但是由于结构改动变化太大,merge过程很不轻松,最终还是手动将之前的配置迁移到新的自定义配置文件, 才解决问题。 这提醒我们版本管理并不能解决任何问题,只是当灾难降临,提供给我们多一种选择。作为软件的用户,升级前需要做好规划, 特别是很长时间没有更新的情况下。而作为主题开发者,需要提供给用户良好的平滑升级功能,当然有时这需要耗费很大经历。 使用开源项目,有时是需要代价和精力去维护的,而这又体现收费软件的价值所在。 图片管理Hexo搭建博 ...
the-clean-architecture
过去几年,我们已经看到了一系列关于系统架构的想法,包括: 六边形架构(接口与适配器) 洋葱架构(Onion Architecture) Screaming Architecture DCI BCE 这些架构有很多共同的点(思想),尽管它们细节上有所不区别,它们都有相同的目标,那就是关注点分离(the speration of concerns), 它们都是通过将软件分层来实现这种分离,每个组件至少有一个用于业务规则的层和另一个用于接口的层。 这些架构中每一个都会产生这样的系统: 独立的框架:该架构不依赖于某些特性软件库的存, 可测试的(Testable):可以在不依赖UI、数据库、Web服务器或任何其他外部依赖的情况下进行测试 独立于UI:UI可以轻松的更改,而无需更改系统的其余部分。例如用控制台UI(终端)代替Web UI,而不需要更改业务规则。 独立于数据库:你可以切换底层数据库,你的业务业务规则不应该于数据库绑定 独立于任何外部依赖:你的业务规则根本不了解外部世界 本文顶部的图是尝试将所有这些体系结构集成到一个可行的想法中的尝试。 依赖性规则(The Depende ...
Golang源码分析可视化
A picture is worth a thousand words. 我们在阅读博客和文档的时候,通常倾向于阅读配有图形的这些文章。如果一篇技术类文章从头到尾都是文字,将十分影响读者的阅读体验, 也不便于读者理解。还有我们在进行一些项目源码分析时,边阅读代码,边绘制一些图形能够极大的提升效率,同时也能加强自己理解。 这片博文我将介绍我是如何绘制调用图和'类图'(不是面向对象语言中的类图)帮助自己更好地理解Golang项目的。 Golang目前还没有关于调用图和类图的官方标准,有一些工具能够静态分析能够生成项目调用图和类图,不过也不是很成熟。 而且自动生成的图形美观性很差,也不便于调整。不过这些工具定义了一些如何可视化Golang元素的规则, 我借鉴了这些规则,同时结合UML类图的语法定义,形成了一套规则。 go-callvisgo-callvis是用于可视化 Go 程序之间的调用拓扑和包关系的的开发工具。 这个库定义了一些规则,用于统一的表示Golang项目元素。 Golang 代码元素及规则规则目前参考 go-callvis Package/Type大型项 ...
Helm:kubernetes包管理工具
最近给部门的小伙伴做了一个关于helm的入门介绍,收到了不错的反响,于将资料整理分享给博客的读者们。 本文第一部分介绍helm是做什么的以及能解决什么问题。第二部分介绍helm的核心概念及安装使用helm的教程, 第三部分介绍helm使用的核心即chart的开发,这一章节通过一个示例给大家演示基本的开发步骤。最后一部分, 简单说明如何搭建私有模板仓。在读完后,相信你会对Helm及生态有一个简单的了解。 什么是 helm如标题所示,官方给Helm的定义是 kubernetes 的包管理器。那么什么是包管理器呢? 什么是包管理工具 包管理器一组软件工具,它们以一致的方式自动安装、升级、配置和删除计算机操作系统的计算机程序 -维基百科helm 帮助用户管理 kubernetes 程序,helm chart 帮助用户定义、安装和升级最复杂的 Kubernetes 应用程序,Charts 很容易 创建,版本管理,共享和发布,所以停止 copy-and-paste,开始使用 helm -helm 官方 核心概念helm的官方文档中的描述更加详细,这里只列出一些重要的概念: Helm ...
GO111MODEDULE变量以及Go Module的使用建议
我们可能在很多地方如 README 文件、Makefile 文件以及 Dockerfile 文件中看到GO111MODULE=on, 对于刚接触的Golang的开发者可能对此有很多疑惑。 1GO111MODULE=on go get -u golang.org/x/tools/gopls@latest 这片文章,我将详细介绍GO111MODULE变量的意义,以及什么时候需要使用到该变量, 同时也总结了一些在使用 Go Modules 时需要注意的细节,帮助你在下次遇到这个变量时不再疑惑。 从 GOPATH 到 GO111MODULE首先,对于 GOPATH,无论是资深开发者和新开发者都不会陌生。GO 在 2009 年发布时,并没有提供包管理器(Package manager), go get会根据导入路径拉取所有的源代码,存储在$GOPATH/src目录中。这种方式使用master分支作为包的稳定版本。 可想而知,这种方式缺乏灵活性同时很容易造成版本管理混乱的状态。 Go Modules(旧版本被成为vgo-versiond Go)在 Go 1.11 被正式引入,与 GOPATH 方 ...
Golang什么时候该使用指针
Golang 什么时候使用指针(Pointer)?什么时候使用值(Value)?对于go开发者来说是一件头疼的事情, 而且这个问题似乎没有绝对的答案,那是否代表我们可以随意使用呢?答案当然是否定的。本文我将试图总结什么场景使用指针更合理。 在开始阅读前,建议读者先能够清晰理解 Golang 指针、类型和值等概念。 本文并不是标准更不是唯一答案,而是自己根据使用经验和社区的一些讨论而总结的实践 有下几种情形,我们是否需要考虑使用指针: 结构体定义的字段 方法中接受者 函数传参 函数和方法返回值 这里我先给出使用一般准则,后面详细介绍不同场景的细节。 方法通常使用指针作为接受者, 官方文档的建议是:如果犹豫,请使用指针; Slices,maps,channels,strings,function value and interface value 这些类型内部通过指针实现,再定一个指针指向这些类型的变量是多余的; 当一个结构体很复杂或者需要修改结构体使用指针,其他情况使用值,因为滥用指针会出现一些不可预料的情况; 什么不需要使用指针 CodeReviewComments中建议传 ...
RESTful
接口设计 问题 资源校验,UI表单分布提交,校验,这里需要提供一些字段校验接口,比如校验 template name