监控室内空气质量 1. 背景爱否出品的新风消费报告[1]里提到了一个概念:室内空气的四个终极目标是恒温、恒湿、恒净、恒氧。笔者对此深感认同,可惜笔者生活的北京并没有足够宜人的气候[2]: 空气质量指数[3]也堪忧: 更糟糕的是,为了保证室内空气含氧量,笔者的窗户常年是半开的。这就导致室内空气很容易受室外影响,不仅容易积灰,而且往往要等空气质量显著糟糕时笔者才会想到要关窗。 为了能更好地评估室内空气质量,并指导改 2022-12-05 #监控 #生活
用Afterburner和Grafana监控PC性能 背景监控Linux服务器性能已经有比较成熟的解决方案了:笔者用的是node_exporter+Prometheus+Grafana的经典三件套,整体效果令人满意: 整体架构 Grafana面板 同时笔者在使用PC时偶尔还会使用MSI Afterburner(以下简称Afterburner)来观察PC性能: 但Afterburner的监控功能并不易用(特别是在高分辨率下),如果 2022-08-20 #Golang #监控 #生活
Go语言error四问 什么是errorGo语言没有像Java/Python一样提供try&catch这种错误捕获方式,而是要求编码者显示地处理下游的传递的错误、显示地向上游抛出错误,也难怪总是有人吐槽Go在这方面的啰嗦。 1234567891011var file *os.Filevar err errorfile, err = os.Open("something.txt")if 2021-07-17 #Golang
读《流畅的Python》:一等函数 前言一等对象(first-class objects)是指拥有如下特性的程序实体: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 Python中的函数拥有这几个特性,所以被称作一等函数(functions as first-class objects,简称first-class functions)。 把函数视作对象12345678910111213& 2020-07-05 #流畅的Python #读书笔记
Python中的函数参数与参数传递 注:本篇文章使用CPython3.6 定位参数、关键字参数在Python中,当定义一个函数时,函数接收的参数叫做为形式参数(parameters),以下简称形参;当调用一个函数时,调用者传递给该函数的值叫做实际参数(arguments),以下简称实参。 根据inspect模块的描述,Python的形参可以分成如下五类: POSITIONAL_OR_KEYWORD,默认类型,可通过定位 2020-07-04 #Python
Python部分内置函数装饰器源码浅析 前言这是这个博客里第一篇带有源码Tag的文章。在过去的一个月,笔者深刻地认识到自己在技术深度方面有很大的不足,所以在未来的学习道路上,笔者会尽量多地阅读开源软件的源代码,并将自己的理解以文章的形式表达出来。如有错漏,请各位读者不吝指教。 注:本篇文章所用环境为CPython3.6 functools.wrapswraps这个内置函数装饰器在笔者的上一篇文章里有过介绍,功能很单纯(拷贝__nam 2020-06-20 #Python #源码
读《流畅的Python》:函数装饰器与闭包 前言 读书笔记这种内容,放在Evernote等笔记软件里似乎要比放在博客里更合适。但其一是笔者还没有找到适合我的笔记同步方案,其二是博客相比笔记软件更能锻炼自身的表达能力(或许吧),其三是将读书笔记放在博客里可以避免在求职的时候被面试官吐槽博客内容太少(笑),所以还是决定将这篇文章放在博客里。 但不管怎样,读书笔记终归是读书笔记,对其他人的作用还是有限,如有读者觉得碍眼烦请无视。 注:本篇文章使 2020-06-19 #流畅的Python #读书笔记
如何在Python中引起内存泄露 前言 嗯,怎么看怎么像标题党写的标题……其实这篇文章只是笔者对Python中引用计数、弱引用的一些记录和思考,不涉及引用循环、分代回收等概念,先打个预防针。 注:本篇文章基于CPython 3.6,可能不适用于其它CPython版本或其它类型的Python实现。 引用计数引用计数(Reference counting)可以说是一个老生常谈的问题了,炒冷饭也没啥意思。引用一下《流畅的Python 2020-06-14 #Python #GC
如何高效地对100万个UUID进行前缀匹配查询 前言 在《Redis实战》这本书的第六章中,作者介绍了如何使用Redis的ZSET来实现通讯录自动补全(即前缀匹配查询)。这部分内容激发了我的兴趣,于是我借助这个机会抛出问题:如何高效地对100万个UUID进行前缀匹配,并尝试用这篇文章来解答。 数据准备首先是数据准备工作:生成100万个UUID、将其写入至Redis和MariaDB(后者可作为对比)。顺便一提,Redis和MariaDB均在笔者电 2020-06-13 #Redis #数据库 #算法
如何在Golang里实现一个高性能的TTLMap 前言TTLMap是一个比较实用的数据结构,特别是在需要缓存数据的场景下。TTLMap的实现现不算复杂,但也有许多需要注意的地方,这也是这篇文章出现的原因。 在TTLMap里,移除失效的数据有三种策略:立即删除、惰性删除和定期删除策略。立即删除策略会在数据过期时立即将数据删除;惰性删除策略只在碰到过期键时才进行删除操作;定期删除策略则每隔一段时间,主动查找并删除过期键。第一种策略对CPU不友好,第二 2020-05-24 #Golang #map