学习观察者模式
观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个 “观察” 该对象的对象。什么是观察者模式观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个 “观察” 该对象的对象。有值得关注的状态的对象通常被称为目标,由于它要将自身的状态改变通知给其他对象,我们也将其称为发布者 (publisher),所有希望关注发布者状态变化的其他对象被称为订阅者(subscribers)。当发布者发布了事件,它要遍历订阅者并调用其对象的特定通知方法。举例说明观察者模式类似于明星与粉丝的关系,粉丝关注明星,当明星发布消息的时候,粉丝会对这个消息做出反应。观察者模式适用场景当一个对象状态的改变需要改变其他对象,可使用观察者模式。当一些对象必须观察其他对象时,可使用观察者模式..
更多DEFCON 28 Final 杂记
距离 DEFCON 28 Final 已经过去了两个多月了,本来结束就写写,但是因为一些后来事耽搁了,现在补一下这次参赛的一些经历。[TOC]Preface前言:本篇文章不代表任何组织社团的观点,全文仅代表个人看法以及意见。如有冒犯请联系我进行必要的修改。由于今年疫情的原因,今年的 DEFCON Final 在线上举办,我有幸与 Tea Deliverers 一起参与了 DEFCON 28 CTF Final ,最终在比赛中取得了第四的成绩。本文我会主要从参赛经历见闻以及一些对于 Web 题的分析入手来写这篇文章,由于 Web 题过分简单,也没什么特别好分析的,所以没什么技术营养,可以权当小说看看,博君一笑。并且为了避免一些不必要的麻烦,全文涉及到姓名 ID 处我都尽量以某师傅进行称呼。The First..
更多性能压测工具 wrk 使用
wrk 是一款针对 Http 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产生大量的负载。 名词解释 QPS: QPS(Query per second 每秒处理完的请求数) 什么是wrk 看下他GitHub上的介绍:https://github.com/wg/wrk wrk is a modern HTTP benchmarking tool capable of generating significant load when run on a single multi-core CPU. It combines a multithreaded design with scal..
更多使用 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,能够提供比原生页面更加丰富的内容,一般记账所需要的信息一目了然。想体验的同学可以在..
更多阿里的三道面试题
前段时间做了三道阿里的在线面试题,分享一下前言前段时间做了三道阿里的在线面试题,分享一下。(一) 身为前端,我很抱歉123456789101112131415根据表达式计算字母数。说明: 给定一个描述字母数量的表达式,计算表达式里的每个字母实际数量 表达式格式: 字母紧跟表示次数的数字,如 A2B3 括号可将表达式局部分组后跟上数字,(A2)2B 数字为1时可缺省,如 AB3。示例: countOfLetters('A2B3'); // { A: 2, B: 3 } countOfLetters('A(A3B)2'); // { A: 7, B: 2 } countOfLetters('C4(A(A3B)2)2'); // { A: 14, B: 4, C: 4 }functi..
更多使用 Github Action 发布 Flutter 插件
本文说明如何使用 Github Actions 自动发布 Flutter 插件到 pub.dev前言笔者有发布过几个 Flutter 插件,一直在手动更新。手动更新插件有点麻烦且容易失败(需要科学上网),因此研究了下如何使用 Github Actions(Github 提供的一种 CI/CD 服务)自动发布插件到 pub.dev,这样做的好处有避免手动发布,节约上传时间在 Github 合并别人提交的代码后也可以立即发布以下说明如何进行添加流程首先在插件的 .github/workflows 目录内创建一个配置文件 publish.yml。内容如下12345678910111213141516171819name: Publish to Pub.dev# 流程触发时机,当有标签创建时触发,如 v1.0.0..
更多