使用 OpenResty 无痛优化图片体积(AVIF / WebP)
图片体积优化计划两年半之前,我第一次了解到 WebP 可以有效减少图片体积的时候,有一瞬间产生了“把网站中所有资源替换成 WebP”的冲动,但当我打开 caniuse 的时候,发现 Safari 迟迟不支持,况且网站中涉及到图片的地方实在是太多,修改代码不太现实。我当时搜了一些资料,是关于让 Nginx 针对浏览器提供的 Accept 头来分别提供不同格式的文件。这个方法确实有,然而我实在是太懒了,以至于写一段命令将所有图片转个格式都不想写,并且想到以后所有图片都要提供两个版本,实在是太麻烦了!于是这个计划就被搁置了。后来我更多的接触了 OpenResty,这是一个集成了 Lua 的 Nginx,可以利用 Lua 脚本来方便的做一些扩展。我还摸索出了如何利用 Lua FFI 调用 OpenCC API 无..
更多Flutter 绘制图形 Circle Packing
本文讲解使用 Flutter 实现 Generative Artistry 教程里面的第六个图形 Circle Packing(圆形填充)前言懒癌发作,好久没写博客了…本文讲解使用 Flutter 实现 Generative Artistry 教程里面的第六个图形 Circle Packing(圆形填充)。实现这个图形的思路大致是:创建一个圆。判断这个圆是否与其他圆发生碰撞。没有则不断增大圆的半径,再次进行碰撞检测,直至最大半径。绘制更多的圆形,重复以上。初始化照旧创建一个 CirclePacking 控件以及 CirclePackingPainter。12345678910111213141516class CirclePacking extends StatelessWidget { @overri..
更多golang switch的用法
最近一直在写go, switch说实话用的不算多。但是今天用了下发现go的switch可真不太一样啊。 无需break 该代码只会匹配到 case 0 ,go会帮你隐式break掉。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 func main() { i := 0 switch i { case 0: fmt.Println("0000000000") fmt.Println("0") case 1: fmt.Println("1111111111") fmt.Println("1") c..
更多golang select的用法
golang的select与channel配合使用。它用于等待一个或者多个channel的输出。本篇我们重点讲下select的用法。 golang中的select语句格式如下: 1 2 3 4 5 6 7 8 select { case <-ch1: // 如果从 ch1 信道成功接收数据,则执行该分支代码 case ch2 <- 1: // 如果成功向 ch2 信道成功发送数据,则执行该分支代码 default: // 如果上面都没有成功,则进入 default 分支处理流程 } 可以看到select的语法结构有点类似于switch,但又有些不同。 select里的case后面并不带判断条件,而是一个信道的..
更多开始使用 Beancount
使用 Beancount 记账已经有将近两个月了,简单写一写我都做了什么。 注:本文只是一个流水账,并不是一个 Beancount 使用教程,如果想详细了解 Beancount 的话,可以参考下面提到的那些文章。 一些背景 Beancount 是什么 如上文所说,Beancount 是一个记账工具,更准确些来讲,是一个复式记账工具。但直到我写这篇文章的时候才发现官方将其定义为“一种复式记账计算机语言”。 简单来讲,它可以让你以纯文本方式记账,并通过一种类 SQL 的语言来对交易进行查询。记账文件还可以配合 Git 进行版本控制。 此外,Beancount 官方提供了一个名叫 fava 的图形化管理工具,它基于 Web,能够提供比原生页面更加丰富的内容,一般记账所需要的信息一目了然。想体验的同学可以在..
更多