关于 Jiajun Huang

毕业于软件工程专业。在分布式和高并发方面有一些经验。

RSS 地址: https://jiajunhuang.com/rss

请复制 RSS 到你的阅读器,或快速订阅到 :

Jiajun Huang RSS 预览

再读《程序员修炼之道-从小工到专家》

2024-09-07 08:00:00

《再读《程序员修炼之道-从小工到专家》》我单独拎出几个觉得很重要的点,作为笔记。## 测试...

让浏览器下载文件

2024-09-06 08:00:00

《让浏览器下载文件》不知道你是不是遇到过这样的需求,想要从服务器将一个文件发送给用户。原来我以为,直接遵循这么几步就可以:- 将文件内容写入到响应体中...

再读《软件随想录》/《黑客与画家》/《软技能》

2024-09-06 08:00:00

《再读《软件随想录》/《黑客与画家》/《软技能》》最近重读了这三本书。上一次读大概还是在10年前,有了这些年的工作经验,再看这些书,感触颇深。---...

HTTP 压力测试中的 Coordinated Omission

2024-08-30 08:00:00

《HTTP 压力测试中的 Coordinated Omission》HTTP负载测试工具有很多,常见的有 ApacheBench,也就是 ab,还有 wrk、vegata等。在了解这些工具时,我了解到一个新的概念:Coordinated Omission,来看 GPT 的解释...

2的补码

2024-07-24 08:00:00

《2的补码》计算机的底层是一堆的bit,具体怎么理解bit,取决于我们怎么解释,对于同样的8个bit,例如 `11111111`,我们可以把它看成是一个无符号数,也可以看成是一个有符号数。如果我们把它看成是一个无符号数,那么它的值就是255,如果我们把它看成是一个有符号数,那么它的值就是-1, 如果理解为字符,那么它就是一个字符,具体是什么字符,取决于编码方式,如果是ASCII编码,那么它就是DEL字符...

编程语言中的 context 是什么?

2024-07-21 08:00:00

《编程语言中的 context 是什么?》最近在看 CSAPP3e,看到讲 context,想起这个概念在学习编程的时候经常遇到,却没有一个准确清晰的定义。随着在工作中逐渐积累,才有一些感觉。准确的来说,context,就是一堆状态(state)。举几个例子来看不同场景下的 context...

flutter macOS 构建出错

2024-03-20 08:00:00

《flutter macOS 构建出错》今天尝试用flutter构建一个 macOS 应用,结果一直报错:```bash...

Flatpak 使用小记

2024-03-19 08:00:00

《Flatpak 使用小记》一般的软件,都是直接用apt安装,不过桌面上有一些软件例如浏览器,是更新很频繁的,apt仓库的基本都过时了老旧了,因此有了flatpak 和 snap 这样的软件,不过我不是很喜欢snap,正好今天尝试了一下 flatpak,以Ubuntu/Debian为例...

Golang CAS 操作是怎么实现的

2024-03-10 08:00:00

《Golang CAS 操作是怎么实现的》在Go语言中,CAS(Compare and Swap) 操作一般都是通过 `atomic` 操作来实现的,我们来探究一下底层是怎么实现的。我们以 `CompareAndSwapInt32` 为例,首先找到源码,位于 `doc.go`...

PostgreSQL 当MQ来使用

2024-03-09 08:00:00

《PostgreSQL 当MQ来使用》一般我们都是用 Redis/RabbitMQ等等 来做MQ,那么,能不能使用关系型数据库来做这件事情呢?显然,可以。## 设计存储表...

Clash 结合 工作VPN 的网络设计

2024-03-08 08:00:00

《Clash 结合 工作VPN 的网络设计》这个是我曾经探索实践过的方案,主要用于学习工作,但是看网络上有不少人有同样的疑惑,因此整理一下分享给大家。Clash是一个网络分流工具,为了方便使用,我直接在 OpenWRT 也就是路由器这一层面搭建的Clash,因此只要在局域网内都可以获得流畅的网络...

使用 PostgreSQL 搭建 JuiceFS

2024-03-07 08:00:00

《使用 PostgreSQL 搭建 JuiceFS》首先我们来看一下大概的步骤:1. 安装PG和JuiceFS...

PostgreSQL 配置优化和日志分析

2024-03-05 08:00:00

《PostgreSQL 配置优化和日志分析》## 性能PG默认的配置下,连接数和缓存等都不是很大,因此我们需要根据机器的情况来优化参数,这里我推荐一个工具 [pgtune](https://pgtune.leopard.in.ua/) ...

有GitHub Copilot?那就可以搭建你的ChatGPT4服务

2024-03-03 08:00:00

《有GitHub Copilot?那就可以搭建你的ChatGPT4服务》我有Github Copilot,也订阅了GPT Plus,GPT Plus 20刀每月,我看了一下其实我用的不是特别多。本着开猿节流,降本增笑的精神,我停止续订了GPT Plus,并且着手于找到 GPT Plus 的替代方案...

窗口函数的使用(以PG为例)

2024-03-01 08:00:00

《窗口函数的使用(以PG为例)》很少做数据统计,之前一直没有接触和使用窗口函数。今天看了一下文档,发现在统计领域,窗口函数非常强大,当然,缺点就是把计算量移到了数据库这一层,但是没关系,对于少量数据,直接一条SQL解决,cool!...

读《为什么学生不喜欢上学》

2024-01-16 08:00:00

《读《为什么学生不喜欢上学》》我喜欢学习和探索,更喜欢学习自己是如何学习的。这本书就是“元认知”类型的:学习自己是如何学习的。以下为摘录和我的归纳。- 人天生有好奇心,想要探索不知道的东西。但是人并不是天生就喜欢思考,相反,大脑会避免思考。因此,每一个阶段,它能思考...

OpenAI Prompt Engineering 摘录和总结

2024-01-07 08:00:00

《OpenAI Prompt Engineering 摘录和总结》这篇文章是指导如何写出比较好的prompt,本文是我的摘录和总结。原文链接:https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions...

读《打造真正的新产品》

2023-12-30 08:00:00

《读《打造真正的新产品》》这本书豆瓣评分很低,但是我觉得还不错,下面是摘录和我的理解,文章较短。---...

2023年终总结

2023-12-26 08:00:00

《2023年终总结》可能时间踩下了油门,完全不顾我们是否愿意,嗖的一声,就到了和2023道别的时刻。## 今年成就...

VueJS 总结

2023-12-17 08:00:00

《VueJS 总结》使用Vue有一段时间了,可能因为使用场景比较少,一直都感觉不得要领,最近终于有一种融会贯通的感觉了,理解了大部分使用场景和技巧。这篇文章是我的总结...

Linux 自动挂载 alist 提供的webdav

2023-11-29 08:00:00

《Linux 自动挂载 alist 提供的webdav》首先需要安装 `davfs2`:```bash...

FreeBSD 使用 vm-bhyve 安装Debian虚拟机

2023-11-17 08:00:00

《FreeBSD 使用 vm-bhyve 安装Debian虚拟机》首先需要安装 `bhyve` 和 `vm-bhyve`:```bash...

FreeBSD 和 Linux 网卡聚合实现提速

2023-11-16 08:00:00

《FreeBSD 和 Linux 网卡聚合实现提速》今天折腾的内容是网卡聚合提速。由于家里的交换机是2.5G,但是有两个机器,板载网卡都是千兆网卡,我想提升一下访问该机器的传输速率,因此想到了可以叠加两个网卡,从而提升带宽,由于两台机器的操作系统不同,因此FreeBSD和Linux都折腾了一下...

GPT 帮我搞定了时区转换问题

2023-11-15 08:00:00

《GPT 帮我搞定了时区转换问题》前几天碰到一个时区转换问题,需要把2023年(year)第46周(week)的第2天(weekday)转换为timestamp,时区在美国洛杉矶。其中weekday使用0表示周一,6表示周日...

长任务系统如何处理?

2023-11-12 08:00:00

《长任务系统如何处理?》有时候我们会遇到一些长时间运行的任务,应该如何处理呢?可能你的第一回答是“使用异步任务”,没错,是需要使用异步任务,但没有那么简单。常见的异步任务框架,针对的场景,大部分可能都是1分钟以内的任务,例如很多框架都会为任务设置一个超时时间...

macOS/Linux 编译 InputLeap

2023-11-11 08:00:00

《macOS/Linux 编译 InputLeap》上一篇说到,我安装了 synergy-core,但是是下载别人编译好的二进制。我就想着,反正我也能编译,干脆改改源码,把Synergy里烦人的激活提示框干掉得了?但是又想到,Barrier本来就是改好了的,只是不维护了,InputLeap 又是 Barrier 的继任,那我就直接自己编译 InputLeap 试试看了...

使用开源软KVM - synergy-core

2023-11-10 08:00:00

《使用开源软KVM - synergy-core》前面我写过使用barrier的文章,Linux + Windows的时候,Linux做服务端,Windows做客户端,工作的还是挺不错的,大部分时候都能正常工作,偶尔剪贴板会有点小问题,比如贴出来的是乱码,第二次贴才正常,但是无伤大雅...

解决 macOS 终端hostname一直变化问题

2023-11-06 08:00:00

《解决 macOS 终端hostname一直变化问题》macOS 终端有时候名字会变化,网上查到的原因说是因为 macOS 会从 DHCP 服务器取值,解决的办法很简单,执行如下命令(假设你准备把hostname改成 mbp)...

KVM 共享 Intel 集成显卡

2023-11-05 08:00:00

《KVM 共享 Intel 集成显卡》我比较喜欢折腾虚拟化,最近在折腾的就是这个:把宿主机的 Intel 集成显卡 给 Windows 虚拟机使用。Intel 平台做这个事情非常方便,因为官方有 Intel GVT-g 项目,就是用来把宿主机生成多个虚拟 GPU 给虚拟机用的...

PromQL 备忘

2023-10-17 08:00:00

《PromQL 备忘》偶尔需要写PromQL,但是总是不记得,以下为备忘。表达式语言数据类型包括以下四种...

读《格鲁夫给经理人的第一课》

2023-07-09 08:00:00

《读《格鲁夫给经理人的第一课》》> 本文是我自己的改编以及摘抄## 生产...

读《打开心智》

2023-07-06 08:00:00

《读《打开心智》》我们生活在现实世界里,总是会遇到各种事情,让人烦恼让人忧愁,当然也有开心和惊喜。我们的心智模型决定了我们遇到一件事情的反应和处理方式...

为什么要把复杂的联表操作拆成多个单表查询?

2023-02-03 08:00:00

《为什么要把复杂的联表操作拆成多个单表查询?》我们在系统优化的时候,常见的一个操作,就是把复杂的联表操作,拆解成多个单表操作,然后在应用程序中进行联接。为什么要这样做呢?相信大家都可以列出几点。不过《高性能MySQL 第四版》对此有很好的总结,值得细品。摘录如下...

红包系统的设计

2023-01-31 08:00:00

《红包系统的设计》秒杀系统中,很常见的一种就是抢红包,还有其他的例如:双11抢购、直播间秒杀下单、一元夺宝等等。其中抢红包的特点在于无法超售,对于下单,如果比库存超售少许,其实是可以接受的,但是对于红包,一旦用户抢到的钱比发出去的钱更多,那就是大问题了。当然,抢购也有特定的业务复杂度,例如下单之后,用户可能没有付款,超时之后需要重新把库存加回去等。我们这里主要讨论红包系统...

2022年终总结

2022-12-31 08:00:00

《2022年终总结》2022年是忙碌的一年,也是收获满满的一年。今年的博客比往年又要少,一则是太忙了没有时间,二则是太水的文章也没有很大的意义,以后也是如此,希望能够越钻越深,产出有质量的文章...

MySQL Index Condition Pushdown Optimization

2022-12-28 08:00:00

《MySQL Index Condition Pushdown Optimization》比如数据库中有如下表:```sql...

Go mod 简明教程

2022-12-16 08:00:00

《Go mod 简明教程》最近认真学习了一下 `go mod`,整理成文。这篇文章是系统的了解 `go mod`,并不是简单介绍如何使用。在 `go mod` 出来之前,社区采用的是类似 `NodeJS` 那种模式,`vendor`,也就是把所有的包都保存在 `vendor` 这个目录下,但是...

OpenWRT 使用 Android/iOS USB 网络

2022-12-04 08:00:00

《OpenWRT 使用 Android/iOS USB 网络》我所在的地方网络不好,于是计划用 4G/5G 网络,但是开热点有个缺点,那就是WiFi本身新号未必稳定,第二无法让它经过OpenWRT实现全局科学上网。一个方案是购买 CPE,也就是 4G路由器,或者5G路由器,将手机信号转换成有线信号,然后作为 OpenWRT 的网络入口...

搭建旁路由

2022-11-20 08:00:00

《搭建旁路由》有一台机器处于这样的环境:有DNS污染、无法访问外网,而经常又需要下载一些依赖需要外网。但是这是一台老机器,没有多个网口,因此无法网卡穿透做OpenWRT。那怎么办呢?这个时候,旁路由就可以登场了...

Golang gRPC 错误处理

2022-11-04 08:00:00

《Golang gRPC 错误处理》gRPC 最常见的错误处理方式就是直接返回错误,例如 `return nil, err`,但是实际业务中,我们还有业务码需要返回,常见的方式是在返回的结构体里定义一个错误码,但是这样写起来又很是麻烦,例如,你可能需要这样写...

编写可维护的单元测试代码

2022-10-31 08:00:00

《编写可维护的单元测试代码》这篇文章主要讲讲单元测试代码的可维护性。不知道你是否写过面条式的单元测试,也就是这样的结构。坦白讲,我写过不少:```go...

OAuth 2 详解(六):Authorization Code Flow with PKCE

2022-10-12 08:00:00

《OAuth 2 详解(六):Authorization Code Flow with PKCE》我们在前面了解到,`Authorization Code` 模式是最安全的一种模式,但是必须要有服务端参与进来,因为 `client_secret` 必须保存在服务端才安全。OAuth 2.0 在 [RFC7636](https://www.rfc-editor.org/rfc/rfc7636) 中定义了一种扩展模式,这种模式下,客户端不需要使用 `client_secret`,模式中 PKCE 的全称是 Proof Key for Code Exchange。那怎么理解这个呢?简单来说,就是我们仍然...

OAuth 2 详解(五):Device Authorization Flow

2022-10-11 08:00:00

《OAuth 2 详解(五):Device Authorization Flow》我们经常可以看到这样的需求:智能电视要我们登录帐号,或者是命令行程序,需要登录帐号。提示通常都是:扫码或者打开网页并且输入验证码后登录。这就是device authorization flow的流程了...

OAuth 2 详解(四):Client Credentials Flow

2022-10-10 08:00:00

《OAuth 2 详解(四):Client Credentials Flow》这种模式,是另外一种简单的授权模式,甚至连用户名密码都不需要,直接根据 `client_id`, `client_secret` 就可以授权。![Client Credentials Flow](./img/client_credentials_flow.png)...

OAuth 2 详解(三):Resource Owner Password Credentials Grant

2022-10-10 08:00:00

《OAuth 2 详解(三):Resource Owner Password Credentials Grant》这大概是最简单的一种授权方式之一了,那就是用户名密码授权。通常来说,是不建议使用,但是有一种情况下,非常适合:那就是自家App对接的时候,这样就可以复用已有的授权逻辑。这种模式,通常只适合用在可信度非常高的App里,一般也就是自家的App...

OAuth 2 详解(二):Implict Grant Flow

2022-10-09 08:00:00

《OAuth 2 详解(二):Implict Grant Flow》在 [RFC6749](https://www.rfc-editor.org/rfc/rfc6749#section-4.2) 中,Implict Grant Flow的流程图比较复杂:```...

OAuth 2 详解(一):简介及 Authorization Code 模式

2022-10-08 08:00:00

《OAuth 2 详解(一):简介及 Authorization Code 模式》在这个系列里,我们主要讲解 [RFC6749](https://www.rfc-editor.org/rfc/rfc6749) 中定义的四种授权模式,以及 [RFC7636](https://www.rfc-editor.org/rfc/rfc7636) 中定义的 PKCE 模式。这篇文章中,我们将会介绍第一种模式:Authorization Code Flow。不过在此之前,我们需要介绍一些前置概念,方便理解...

ElasticSearch 学习笔记

2022-10-06 08:00:00

《ElasticSearch 学习笔记》最近在学习使用ES,这篇博客记录一下相关的知识。在此之前,我都是使用PG的全文索引来做搜索...

三种git流程以及发版模型

2022-07-28 08:00:00

《三种git流程以及发版模型》使用Git,与其他版本控制系统最大的不同在于,Git是一个分布式系统,每一份仓库里,都是全量代码,因此协作中,冲突是常有的事。我们来看看三种Git开发模型...

错误处理实践

2022-07-27 08:00:00

《错误处理实践》一个接口,或者一个系统,总是要处理很多异常流程,通常我们都需要以某种形式表达出来,例如返回错误、抛异常。这篇文章我想讲讲怎么去处理错误...

权限模型(RBAC/ABAC)

2022-07-15 08:00:00

《权限模型(RBAC/ABAC)》最近研究了一下权限模型,看完AWS IAM之后,深感 AWS IAM 设计精妙。就我个人的看法,RBAC应对一些场景还是不太够,主要是控制粒度不够,例如,我想控制某个role只能操作某个集群的资源,RBAC就无法表达。ABAC可以表达,但是ABAC要复杂很多,AWS IAM是ABAC,但是易用性上做的很不错,还有一种方式,就是魔改RBAC,通过增加一个condition来缩小权限,从而做到精细化控制...

OIDC(OpenID Connect) 简介

2022-07-06 08:00:00

《OIDC(OpenID Connect) 简介》最近了解了一下认证体系中的 OIDC ,整理成一篇博客,主要包含 OIDC 中的概念,流程以及使用。在介绍这些之前,我们先要弄清楚两个名词 Authorization 和 Authentication...

任务队列简介

2022-07-05 08:00:00

《任务队列简介》在很多系统中,为了解耦,或者处理需要较长时间的任务时(例如,有些网络请求可能很慢,或者有一些请求属于CPU密集型,需要等待一段时间),我们通常会引入任务队列。典型的任务队列由下面三部分组成...

使用Drone CI构建CI/CD系统

2022-04-29 08:00:00

《使用Drone CI构建CI/CD系统》我个人一直使用 `gitea` 来存放代码,之前部署一直都是用 `ansible`,每次在本地跑一个 `ansible-playbook` 命令,就在本地编译、同步代码、同步配置、部署到服务端,服务端个人通常使用 `supervisor`,毕竟个人的小项目啥的,例如博客,就懒得Docker镜像打包来打包去...

PostgreSQL 操作笔记

2022-04-29 08:00:00

《PostgreSQL 操作笔记》之前我写了一篇 [MySQL操作笔记](./2020_05_01-mysql_notes.md.html) 用于记录我常用的MySQL操作,事实证明还是很有用处的,我经常需要翻到。由于今年我的目标之一是用熟PG,我也开始使用PG,但是很多时候不记得,还需要临时去查,因此再来记录一篇PG的操作笔记,方便以后查阅...

Golang migrate 做数据库变更管理

2022-04-28 08:00:00

《Golang migrate 做数据库变更管理》最近在使用 [golang-migrate](https://github.com/golang-migrate/migrate) 做数据库变更管理,按照官方的教程,需要本地先下载一个二进制,命令行生成变更文件...

使用PostgreSQL做搜索引擎

2022-04-12 08:00:00

《使用PostgreSQL做搜索引擎》最近我在研究用PostgreSQL来做搜索引擎,简单来说,搜索引擎主要使用的就是倒排索引,也就是把一篇文章或者语句,首先进行分词,将文章分成N个词语,每一个词语都有一定的权重,这一步里有很多地方可以优化,将文章切分成准确含义的分词,对后续搜索的影响十分大,这个可以参考 TF-IDF 或者 TEXTRANK 算法;第二步就是建立倒排索引,也就是将分词和该词语在文章中的位置关联起来;...

Nginx 源码阅读(三): 连接池、内存池

2022-03-23 08:00:00

《Nginx 源码阅读(三): 连接池、内存池》这一篇文章中,我们主要来看看Nginx怎么实现连接池和内存池。通过这两个池,Nginx就可以避免频繁申请内存,从而提高性能。- [Nginx 源码阅读(一): 启动流程](https://jiajunhuang.com/articles/2022_03_21-nginx_source_code_1.md.html)...

Nginx 源码阅读(二): 请求处理

2022-03-22 08:00:00

《Nginx 源码阅读(二): 请求处理》上一篇我们了解了Nginx的启动流程,master和worker的分工。这一篇我们主要聚焦在Nginx是怎么处理请求的。- [Nginx 源码阅读(一): 启动流程](https://jiajunhuang.com/articles/2022_03_21-nginx_source_code_1.md.html)...

Nginx 源码阅读(一): 启动流程

2022-03-21 08:00:00

《Nginx 源码阅读(一): 启动流程》去年读了一部分Nginx源码,后来耽搁了,最近决定捡起来做完这件事情。说起Nginx源码,我主要是想了解Nginx的代码组织、架构、master/worker分工、以及一个请求的处理流程。对其它的我就不是那么感兴趣了。因此这一系列Nginx源码阅读也主要是围绕这些话题来写的...

Go 泛型简明教程

2022-03-17 08:00:00

《Go 泛型简明教程》Go 1.18 发布了,其中一大特性就是泛型,说到泛型, 曾经我也是不怎么喜欢泛型的,因为泛型会增加代码的复杂度,但是后来随着经验的增加,我还是正视了泛型,泛型有其存在的必要性,例如当实现一些容器库、算法库的时候,有泛型就会简单方便很多...

KVM 显卡穿透给 Windows

2022-03-15 08:00:00

《KVM 显卡穿透给 Windows》很久以前就想这么玩,但是碍于各种条件,一直没有实现,直到最近,得到一块额外的亮机卡,于是就有了这次折腾。那么通过显卡穿透,我们可以做啥呢?比如:我们可以用Linux做宿主机,虚拟化一个Windows出来,但是Windows使用独显打游戏;或者我们可以把显卡透传给虚拟机挖矿,等等。我的宿主机是AMD平台,宿主机使用AMD显卡,虚拟机使用Nvidia显卡...

使用 HTTP Router 处理 Telegram Bot 按钮回调

2022-03-12 08:00:00

《使用 HTTP Router 处理 Telegram Bot 按钮回调》写 Telegram Bot 的时候,我们可能会选择使用 [Inline keyboard](https://core.telegram.org/bots/2-0-intro#new-inline-keyboards),这样的好处是界面比较好看,交互也好,消息下面可以有很多按钮,点击一下就可以更新消息和按钮,但是开发起来就比较麻烦,因为每一个点击,对于 Telegram Bot 程序来说,都是要处理一个回调,而且大部分情况下按钮是需要带一定的消息回去的...

使用反射(reflect)对结构体赋值

2022-01-10 08:00:00

《使用反射(reflect)对结构体赋值》[上一篇](./2022_01_09-gin_binding_args.md) 中,我们看了GIN是如何绑定参数并且校验的,本着知道如何使用也要知道底层原理的探索精神,这一篇中,我们自己来使用 `reflect` 实现一个轻量版的参数绑定...

GIN 是如何绑定参数的

2022-01-09 08:00:00

《GIN 是如何绑定参数的》在GIN这个框架里,可以通过 `Bind` 系列的函数绑定并且校验参数,我们来看看是如何实现的。GIN 的binding分为两个系列...

你好 2022(2021 年终总结)

2021-12-30 08:00:00

《你好 2022(2021 年终总结)》2021年又要结束了,今年的主旋律是去杠杆,到年底基本上把杠杆降到了可以驾驭的程度,目前的杠杆率可以应对2022年的装修了,算是完成了年初定下的目标。技术上,今年把 Redis 源码读了一遍,把 Nginx 读了一小部分,Android 开发由于觉得拼 UI 太无聊,并且对我来说也没有太多使用场景,后来放弃了。总体上感觉技术进步不如往年大,不过这也符合预期...

用Go导入大型CSV到PostgreSQL

2021-12-11 08:00:00

《用Go导入大型CSV到PostgreSQL》最近我想试试 `PostgreSQL`,素闻美名,一直没有尝试过。从网上下载了一个超大的CSV,解压后达18G,一般的文件编辑器直接打不开,简单的方案是直接用 PostgreSQL 提供的 `\copy` 命令,或者 `COPY` 语句,但是这个文件无法使用,因为其中有几行都是坏数据...

使用 OpenWRT 搭建软路由

2021-12-01 08:00:00

《使用 OpenWRT 搭建软路由》绝大部分的家庭网络拓扑,都是很直接的光猫到路由器,然后分别接入有线和无线设备,如下图所示:![常见家庭网络拓扑](./img/before_openwrt.png)...

使用软KVM切换器 barrier 共享键鼠

2021-11-26 08:00:00

《使用软KVM切换器 barrier 共享键鼠》我一直用 Linux 办公,之前都是 Linux host + Windows 虚拟机的方案,但是换AMD + 4k显示器之后,虚拟机不知道是啥原因,卡得慌,于是把老本本搬出来放一边用于开会等...

SQL 防注入及原理

2021-11-04 08:00:00

《SQL 防注入及原理》SQL 注入一直是 Web 安全中非常常见的攻击手段,也是非常严重的安全漏洞,我在使用 SQLAlchemy 的时候,想要防止 like 语句被注入,最后发现 SQLAlchemy 已经做了这一层的处理。我们来看看其原理...

使用 gomock 测试 Go 代码

2021-10-12 08:00:00

《使用 gomock 测试 Go 代码》gomock 是 Google 推出的用于 Go 的 mock 工具。它的大致用法是:- 需要 mock 的地方,使用接口...

gevent不是黑魔法(二): gevent 实现

2021-10-11 08:00:00

《gevent不是黑魔法(二): gevent 实现》上一篇我们说了,gevent 是基于 greenlet,结合 event loop 实现的,这一篇我们就来看看 gevent 是如何实现的...

gevent不是黑魔法(一): greenlet 实现

2021-09-29 08:00:00

《gevent不是黑魔法(一): greenlet 实现》最近粗略的读了一下 gevent 的实现,毕竟用了这么多年的 gevent,之前没去看过怎么实现,心里没底呀。gevent 是基于 greenlet 之上,结合 eventloop 实现的一套 Python 协程库,通过 gevent monkey patch,可以用同步的方式写出...

用 entgo 替代 gorm

2021-09-06 08:00:00

《用 entgo 替代 gorm》一直以来,基本上 Go 的ORM都是用 GORM 。直到前段时间朋友推荐了 entgo,尝试之后发现 entgo 是更好的选择。entgo 是 Facebook 开源的一个基于 go generate生成的 ORM,但是并不算复杂,相比 GORM 的好处在于,GORM中,大量存在...

应用内使用crontab不是那么方便

2021-09-01 08:00:00

《应用内使用crontab不是那么方便》以前我一直是 cron 的忠实用户,毕竟这么多年了,cron 非常稳定。我一直说 cron 简单粗暴,坚如磐石。但是随着使用 cron 越多,我越是发现不太方便的一些地方,主要是在应用开发里...

单测时要不要 mock 数据库?

2021-08-27 08:00:00

《单测时要不要 mock 数据库?》最近我们讨论了一个问题,要不要 mock 数据库? 本文是我的一些个人观点。首先,对于第三方调用进行 mock ,这是基本都能获得一致意见的,但是是否需要 mock 数据库,则各有分歧。我是赞成不 mock 数据库...

Sentry 自建指南

2021-08-25 08:00:00

《Sentry 自建指南》之前一直使用官方的免费服务,最近想要自己托管一个玩玩,于是就折腾了起来。Sentry 是一个开源的异常收集工具,据我所知好像很多公司都在用它,而且讲真确实挺好用的,我也是老用户...

用selenium完成自动化任务

2021-08-19 08:00:00

《用selenium完成自动化任务》Selenium 是一个控制浏览器的自动化软件,常常用来做自动化UI测试(浏览器端),既然可以代码控制,那么就是自动化的一个好工具了。这一篇我们就来看看如何使用 Selenium 来搜索一下,由于 Selenium打开一个全新的浏览器会话,我没有配置全局梯子,我们就以百度搜索为例...

用闲置的安卓手机做垃圾电话短信过滤

2021-07-09 08:00:00

《用闲置的安卓手机做垃圾电话短信过滤》我几乎每天都要收到垃圾短信和电话,基本都是:你买房吗?你装修吗?你分期吗?你改套餐吗?你...超级烦人,对于短信,iOS和Android都有不错的解决方案,但是对于垃圾电话来说,没有一个好用的方案,即使安装了手机管家,也没有什么用,相反我成了电话标注的一个数据源,它并没有帮助到我避免被打扰,只能采取打一个拉黑一个的方案,但是敌在暗处,我在明处,防不胜防...

推荐三个时间管理工具

2021-07-06 08:00:00

《推荐三个时间管理工具》最近比较忙,一忙起来,就没完没了,各种事情来找,怎么把事情安排的有条不紊呢?这个时候就需要借助一些时间管理工具了。我今天介绍三个,他们分别是Google Calendar,Kanboard和Microsoft TODO...

一次事故反思

2021-07-02 08:00:00

《一次事故反思》最近把一个管理后台系统从原来的大单体中整体拆分出来,出了四个问题,我对此进行深刻反思。本文为反思录。事情的起因是大家决定要把管理后台拆出来,状况是...

当JS遇到uint64:JS整数溢出问题

2021-06-22 08:00:00

《当JS遇到uint64:JS整数溢出问题》最近遇到一个问题,就是传了一个超级大的uint64,结果前端发现数字对不上,精度丢失了!原因就在于,JS的Number是"64-bit floating point IEEE 754 number"。最大能表示的数是 `Number.MAX_SAFE_INTEGER`,一般来说,就是...

SQLite3 存储以及ACID原理

2021-06-19 08:00:00

《SQLite3 存储以及ACID原理》我一直想知道如何处理磁盘存储,最近学习了一下SQLite3的做法,这是学习笔记。首先多亏了操作系统的抽象,对于一个磁盘上文件,我们可以简单的想象成...

Redis源码阅读:pub/sub实现

2021-06-07 08:00:00

《Redis源码阅读:pub/sub实现》今天我们来看看Redis是怎么实现 PUB/SUB 这个功能的,其实比较简单,但是我们还是从命令入手。PUB/SUB 命令用法如下:```bash...

Redis源码阅读:zset实现

2021-06-06 08:00:00

《Redis源码阅读:zset实现》关于zset这个数据结构的,网上有很多的资料,这一篇文章我主要还是通过探索几个命令,来看到zset是怎么实现的。首先我得借用维基百科上一张关于skiplist的图,来让大家对skiplist进行一个认知...

Redis源码阅读:bitmap 位图的运算

2021-05-30 08:00:00

《Redis源码阅读:bitmap 位图的运算》Redis提供了位图,位图也就是从bit的角度来看数据,可以把某一个bit设置为0或者1,举个简单的例子,我们希望记录用户某个月的每一天是否登录,那么就只需要给一个32bit的值,如果第n天登录了,就把第n个bit设置为1。位图很节省内存,毕竟是从bit的角度来看待和存储数据的,但是缺点也很明显,位图所需要存储的数据的大小取决于上限...

Redis源码阅读:set是怎么做交并集运算的?

2021-05-29 08:00:00

《Redis源码阅读:set是怎么做交并集运算的?》今天我们来看看 Redis 中的set是如何存储数据,然后如何做交集、并集、差集运算的,所以我们一共会探索 `SADD`, `SISMEMBER`,`SINTER`, `SUNION`, `SDIFF` 这五个命令的实现...

Redis源码阅读:list实现(ziplist, quicklist)

2021-05-28 08:00:00

《Redis源码阅读:list实现(ziplist, quicklist)》如果我们用Redis做过broker,就知道,绝大部分的队列实现,都是基于 `LPUSH` 和 `BRPOP` 这两个命令的。那么,Redis到底是怎么实现list的呢?底层是如何实现的,是否省内存,Redis为了省内存又做了什么优化?阻塞版的pop又是怎么实现的?这篇文章里,我们就会探讨这些问题...

Redis源码阅读:RDB是怎么实现的

2021-05-27 08:00:00

《Redis源码阅读:RDB是怎么实现的》Redis中提供的另外一种持久化方式就是RDB,全称是 Redis Database,其实就是把Redis进程中存储的内容全部dump到磁盘上,因此 RDB 文件是以二进制形式保存的,这一点与 AOF 相反...

Redis源码阅读:AOF重写

2021-05-26 08:00:00

《Redis源码阅读:AOF重写》Redis会自动进行AOF重写,也可以由 `BGREWRITEAOF` 命令手动触发重写。我们来看看,从 `BGREWRITEAOF` 开始入手:```c...

Redis源码阅读:AOF持久化

2021-05-25 08:00:00

《Redis源码阅读:AOF持久化》都说Redis是内存数据库,其实 Redis 也有持久化机制,就是我们在 `redis.conf` 里配置的如下几行:```c...

Redis源码阅读:key是怎么过期的

2021-05-24 08:00:00

《Redis源码阅读:key是怎么过期的》我们经常用到Redis的expire这个命令,比如我们设置一个缓存,通常会这样用:```bash...

Redis源码阅读:字典是怎么实现的

2021-05-24 08:00:00

《Redis源码阅读:字典是怎么实现的》dict,也就是哈希表这个数据结构,在Redis中的作用非常广泛,比如,Redis用它来存储支持的命令,这篇文章我们会看一下Redis是如何实现dict的...

Redis源码阅读:执行命令

2021-05-23 08:00:00

《Redis源码阅读:执行命令》上一篇我们读到,Redis是怎么从启动服务,到开始读取来自socket的字节流。这一篇我们继续看看,如何处理字节流,然后变成命令,到返回对应数据...

Redis源码阅读:启动过程

2021-05-22 08:00:00

《Redis源码阅读:启动过程》最近我突然想看看Redis是怎么开始处理命令的,也就是从启动到开始处理请求,中间大概都发生了什么。话不多说,首先fork原始仓库,然后把代码拉下来...

WAL(Write-ahead logging)的套路

2021-05-15 08:00:00

《WAL(Write-ahead logging)的套路》WAL的全称是 Write-ahead logging, 是一种常见的用于持久化数据的方式, 通常性能都很不错,利用了磁盘连续写的性能高于随机读写的这一个特性. 一般来说, WAL都是用于这样一种场景, 记录操作日志, 数据库收到合法请求之后, 首先在WAL里写入一条记录, 然后再开始进行内存...

搞定CORS问题

2021-04-29 08:00:00

《搞定CORS问题》帮我配置一下跨域...跨域了,没法请求...这是日常开发中经常遇到的问题,最近好好的阅读了一下相关文档,这篇文章是学习笔记...

如何定位程序问题所在

2021-04-15 08:00:00

《如何定位程序问题所在》如何定位bug所在,这是一个很好的问题,我的经验也不丰富,今天综合学习了一下,结合我的经验,总结成文。在出问题之前,我们需要做的事情是(生产环境,测试环境一般容忍性更强,下面的步骤就看各团队要求了)...

设计一个IM归档系统

2021-04-14 08:00:00

《设计一个IM归档系统》最近整了一个IM归档系统,需求就是把IM聊天记录、文件、图片等全部归档,供数据团队分析。挑战在于量非常的大,以及可靠性保证。架构如下...

logrotate read only filesystem问题

2021-04-11 08:00:00

《logrotate read only filesystem问题》最近配置了OpenResty的 logrotate 规则,但是遇到一个奇怪的问题,自己直接在命令行执行是ok的,但是systemd timer执行却是不行...

Golang GIN写单测时,愉快的使用返回值

2021-03-23 08:00:00

《Golang GIN写单测时,愉快的使用返回值》我写的接口,基本长这样:```js...

Python Queue源码分析

2021-03-20 08:00:00

《Python Queue源码分析》今天读源码时发现了 [Queue](https://docs.python.org/3/library/queue.html) 这个标准库,是Python标准库里对队列的实现,翻了一下源码,发现还挺有意思的...

Go里优雅的使用全局配置

2021-03-18 08:00:00

《Go里优雅的使用全局配置》全局配置是一个单例,最简单的实现是使用一个全局变量,为了到处都可以使用到,所以常见的做法是有一个包,例如名字叫 `global`或者诸如此类的,然后要用到的地方去导入,例如...

Golang sync.Map源码分析

2021-03-15 08:00:00

《Golang sync.Map源码分析》今天看了一下 `sync.Map` 的实现,首先我们从一个demo入手:```go...

Android滑动时隐藏FAB

2021-03-11 08:00:00

《Android滑动时隐藏FAB》我在BaseClass里加入了如下代码,实现了在滑动 `RecyclerView` 的时候,隐藏浮动按钮(FAB):```kotlin...

Python中用tuple作为key

2021-02-25 08:00:00

《Python中用tuple作为key》其实当我得到这个结论的时候,我觉得很简单很正常,但是我第一次看到这个用法时,我觉得很新奇:```python...

一些常用的算法思维

2021-02-24 08:00:00

《一些常用的算法思维》其实算法并不是空中楼阁的东西,相反,在实际工程、实际生活中,也可以看到它的影子。因为它是一种思维方式。我们来看看常用的一些算法思维...

编写可维护的函数

2021-02-21 08:00:00

《编写可维护的函数》之所以写这篇,是因为看到 Dave Cheney 的一篇博客,深有同感:https://dave.cheney.net/2019/09/24/be-wary-of-functions-which-take-several-parameters-of-the-same-type ...

为什么要把配置保存在仓库里?

2021-02-04 08:00:00

《为什么要把配置保存在仓库里?》作为后端我们经常会遇到运维性质的活儿,比如测试环境起一个容器化数据库,或者是要改改Nginx配置等等。在很久以前,其实我们是跑商去改完了就算了,甚至包括数据库也是这样,测试环境改完了,生产环境抄过去再改一次。但是我认为应该要把这些配置放在一个repo里,这样子有如下几个好处...

Android自动展示和关闭进度条

2021-01-27 08:00:00

《Android自动展示和关闭进度条》客户端总是要有个进度条告诉用户,正在加载内容。可是我很懒,不想每次都自己来控制,那样子的话,得在调用api前设置进度条显示出来,调用api之后不显示。每次都要这样,太麻烦了...

Kotlin/Java 列表Protobuf序列化

2021-01-13 08:00:00

《Kotlin/Java 列表Protobuf序列化》本来想保存一些Protobuf生成的类的实例到本地,方法自然就是把一个列表的数据序列化成bytes,然后存起来。不过搞了半天都没办法,于是就自己整了一个 "poor man's serialization for list of protobuf object"...

deeplink结合路由处理扩展App的能力

2021-01-03 08:00:00

《deeplink结合路由处理扩展App的能力》开始学习移动端开发是一个正确的选择,点了一颗新的技能树,扩展了知识和能力体系。下面是最近的关于路由处理和deeplink的感想。通常情况下,如果想要服务端触发一些App的行为,那么我们选择的是通过某个约定的code,App检测到之后,就作出一定的响应。例如...

怎么使用ViewModel 和 RecyclerView

2021-01-03 08:00:00

《怎么使用ViewModel 和 RecyclerView》当他们分开使用的时候,很简单,但是怎么把ViewModel和RecyclerView结合在一起呢?代码如下...

Android手动挡MVVM

2021-01-02 08:00:00

《Android手动挡MVVM》Android官方的自动档MVVM方案 Jetpack Compose 还没正式发布,目前只有手动挡的MVVM方案,那就是下面几者的组合:- view binding...

来电拦截方案

2020-12-23 08:00:00

《来电拦截方案》最近接了很多垃圾电话,分享一下我的拦截方案。首先我有一个主号,这是很多年前办的,银行、房贷等重要信息的电话,都是用的这个,不能换,但是由于办理时间长,很多垃圾电话和短信...

你好,2021!

2020-12-22 08:00:00

《你好,2021!》时间的流逝似乎跟上了深圳快节奏的步伐,转眼之间就快到了2021。是时候来总结一下2020年,然后以一种全新的心态来面对来年,正所谓辞旧迎新...

gRPC鉴权方案

2020-12-19 08:00:00

《gRPC鉴权方案》昨日与群友讨论,gRPC比较优雅的鉴权方案应该怎么做,本文记录一下最终相对优雅的实践方案。不过我们仍然要从故事的开头讲起...

Golang里数据库migration方案

2020-12-16 08:00:00

《Golang里数据库migration方案》Python中如果用SQLAlchemy的话,一般会用alembic来做migration。那么,Go呢?我一般用这个:https://github.com/golang-migrate/migrate...

Android SwipeRefreshLayout左右滑动冲突的解决

2020-12-12 08:00:00

《Android SwipeRefreshLayout左右滑动冲突的解决》我有一个页面是需要下拉刷新的,所以在 `` 的外层包了 ``,但是同时我希望 ``里的组件,可以支持左右滑动,比如,右滑删除,左滑编辑...

Android调用gRPC的两个小工具函数

2020-12-07 08:00:00

《Android调用gRPC的两个小工具函数》Android上调用gRPC,由于gRPC中的status错误,在gRPC Java/Kotlin生成的代码中,是以异常的形式展现出来的,所以,如果不想在业务代码里到处都充斥着 `try {} catch(e: StatusRuntimeException) {}` 这样的代码,就得抽出一个工具函数来同一处理错误,如下...

Android上结合kotlin使用coroutine

2020-12-01 08:00:00

《Android上结合kotlin使用coroutine》最近入了Android坑,目前还处于疯狂学习的状态,所以很久都没有写博客了。今天记录一个小代码片段,在Android上使用coroutine的小例子...

gRPC错误处理

2020-11-26 08:00:00

《gRPC错误处理》之前写gRPC的时候,不好怎么处理错误,原来官方已经有解决方案,只是文档上没细说:```go...

Java collection的结构

2020-11-13 08:00:00

《Java collection的结构》最近在学Java,这张图是collection的结构,Java里常用的数据结构实现都在这里面了,准备好好的研究研究。结构如图:![Java collection](./img/java_collection.png)...

为啥Redis使用pipelining会更快?

2020-11-02 08:00:00

《为啥Redis使用pipelining会更快?》这是一个很考究细节的问题,大部分人都会说:因为减少了网络开销,那么,看如下例子:```python...

通过阳台种菜实现蔬菜自由

2020-10-24 08:00:00

《通过阳台种菜实现蔬菜自由》虽然我这博客一直都是搞技术的,但是最近研究了一下阳台种菜,也有朋友比较感兴趣,所以总结一下。通过阳台种菜,我们可以实现...

从GORM里学习到的panic处理方式

2020-10-19 08:00:00

《从GORM里学习到的panic处理方式》今天在博客的评论里,有童鞋提醒我,GORM里也有简化事务处理的帮助函数。源码如下:```go...

Go使用闭包简化数据库操作代码

2020-10-17 08:00:00

《Go使用闭包简化数据库操作代码》在日常工程中,我们可能要开事务来完成一些操作,因此就会有如下代码:```go...

TCMalloc设计文档学习

2020-10-10 08:00:00

《TCMalloc设计文档学习》TCMalloc全名Thread-Caching Malloc,是Google开发的用来替代传统malloc函数的内存分配库,它的竞争对手主要是jemalloc, glibc malloc等。我们主要学习它的设计思路。首先要明确的一点就是tcmalloc为什么这么快,大量使用无锁操作是tcmalloc...

Flask和requests做一个简单的请求代理

2020-09-27 08:00:00

《Flask和requests做一个简单的请求代理》有的时候,我们需要做一些简单的代理工作,比如,把一个内部系统,通过已有的鉴权方式暴露出去。代码如下...

Linux常用命令(四):xargs

2020-09-21 08:00:00

《Linux常用命令(四):xargs》xargs命令可以从标准输入读取参数,然后组建成新的命令去执行,举个例子:```bash...

Linux常用命令(二):htop

2020-09-20 08:00:00

《Linux常用命令(二):htop》htop是非常非常常用的一个命令行工具。htop在top上有很多改进,更加易用,并且操作更加简单、直观。我们来看看htop的截图:![htop](./img/htop.png)...

Linux常用命令(三):watch

2020-09-20 08:00:00

《Linux常用命令(三):watch》watch命令是一个比较简单但是实用的命令。不知道你是否有过这样的经历,你想看一个命令的输出,因此不断的手动执行这个命令,然后观察输出。watch命令就是帮你自动完成这个过程的命令。举个例子,我们像要看现在的时间,就可以这样...

Linux常用命令(一):netcat

2020-09-19 08:00:00

《Linux常用命令(一):netcat》netcat是常见的用于网络相关的工具,比如连接,监听,扫描端口等。和所有的UNIX命令一样,netcat也是一把瑞士军刀。接下来我们来学习如何使用...

结合Flask 与 marshmallow快速进行参数校验

2020-09-16 08:00:00

《结合Flask 与 marshmallow快速进行参数校验》在Flask里如何方便快速的进行参数校验呢?如下,我们通过组合Flask提供的工具函数,以及marshmallow,来完成一个方便快捷的参数校验函数...

规整数据的重要性

2020-09-10 08:00:00

《规整数据的重要性》对于后端而言,无论前端是否校验了表单(前端可能出于用户体验会做校验),后端都必须校验一次。并且在数据有问题时及时终止处理。常见的请求处理如下...

apt安装特定包以及忽略升级某个包

2020-09-05 08:00:00

《apt安装特定包以及忽略升级某个包》apt是debian的包管理工具,ubuntu沿用之。## 安装特定版本的包...

StackGuard的作用

2020-08-26 08:00:00

《StackGuard的作用》最近在重新翻Go runtime的源码,发现一个新知识点,叫做StackGuard。此为学习记录。## 什么是StackGuard...

Goroutine是如何处理栈的?

2020-08-26 08:00:00

《Goroutine是如何处理栈的?》为什么Go的栈是无限大小的?为什么Go的栈策略从 segmented stacks 切换到 contiguous stacks?逃逸分析是什么?这篇文章是我的学习记录,分别解答了上述问题。Go在1.3以前,是使用一种叫做 segmented stacks 的栈策略。而1.3时,换成了 contiguous stacks ,我们分别来了解一下这两种策略...

Go DiskQueue源码阅读

2020-08-22 08:00:00

《Go DiskQueue源码阅读》如何使用Go来实现一个简单的基于磁盘的FIFO队列呢?我们来看看 [go-diskqueue](https://github.com/nsqio/go-diskqueue) 的实现,它是NSQ中用来持久化的一个库,我们借助它来了解一下,如何实现一个基于磁盘的队列...

NSQ源码分析

2020-08-16 08:00:00

《NSQ源码分析》简单的翻了一下NSQ的源码,看看它是怎么实现的。我首先是从nsqtail开始看的,先从简单的入手。之后我看了nsqlookupd和nsqd。本文只讲nsqd...

NSQ简明教程

2020-08-15 08:00:00

《NSQ简明教程》周末试了一下NSQ,发现挺好用的,简单方便。NSQ是一个消息队列,比如异步任务时,我们需要一个broker,或者是将日志统一处理时,我们需要一个日志流中间件。NSQ就可以用来干这个...

结合Redis与MySQL实现又快又好的数据方案

2020-08-11 08:00:00

《结合Redis与MySQL实现又快又好的数据方案》要速度快,我们一般会选择Redis,不过同等价格的情况下,内存容量终究比不过硬盘大小,对于大量数据,MySQL是更好的选择。不过,我们可以结合Redis和MySQL实现,将热点数据存储在Redis中,将不热的数据存储在MySQL中...

程序员的MySQL手册(五):索引优化

2020-07-28 08:00:00

《程序员的MySQL手册(五):索引优化》随着产品的迭代,数据库中的数据一直在变更,索引也要跟着变更才能顺应时代,哦不,顺应数据的要求。当索引不够好用时---通常是一波请求高峰击溃了系统,或者是提前发现查询性能不够高,我们就需要对查询进行诊断,判断当前是否...

程序员的MySQL手册(四):索引设计

2020-07-27 08:00:00

《程序员的MySQL手册(四):索引设计》在了解了第三节的情况下,我们设计两个表,关系如下:```sql...

程序员的MySQL手册(三):数据库设计

2020-07-26 08:00:00

《程序员的MySQL手册(三):数据库设计》这一篇我们会讲解数据库设计的准则,介绍常见的数据类型,以及数据库范式和反范式,和他们的应用。## 数据库设计的准则...

Linux窗口管理器下的截图

2020-07-25 08:00:00

《Linux窗口管理器下的截图》Linux使用窗口管理器时,也想做到截图然后保存到剪贴板,之后就可以到处贴比如贴到虚拟机里的Windows,不过如果直接使用截图工具的话,是没有办法保存到剪贴板的,不过使用xclip可以做到。我使用的是XMonad,加这么一行...

Go设计模式:facade模式和观察者模式

2020-07-23 08:00:00

《Go设计模式:facade模式和观察者模式》## facade模式(外观模式)初看这个名字,觉得很陌生。但是我说这个模式,其实就是抽象封装,那么我想它就不陌生了。facade模式的作用就是,原本随着项目...

程序员的MySQL手册(二): 监控与benchmark

2020-07-23 08:00:00

《程序员的MySQL手册(二): 监控与benchmark》这一节我们主要讲解如何监控MySQL的性能数据,以及如何对MySQL进行压测。## 使用Prometheus进行监控...

Go设计模式: 责任链模式

2020-07-21 08:00:00

《Go设计模式: 责任链模式》今天我们来介绍责任链模式,从名字可以看出来,它应当是一系列的操作。的确如此,看看维基百科的定义:> 责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象...

我们真的需要这么复杂的技术栈吗?

2020-07-15 08:00:00

《我们真的需要这么复杂的技术栈吗?》现在业界流行的是k8s全家桶, ELK全家桶, Gitlab全家桶。分别使用他们的如下能力和作用:- k8s: 自动调度,自动扩容...

Go设计模式:装饰器模式

2020-07-14 08:00:00

《Go设计模式:装饰器模式》今天我们来介绍decorator这个经典的设计模式。如果使用过python的话,我想decorator都不用我介绍了,我们来看个例子:```python...

程序员的MySQL手册(一): 安装,基本配置

2020-07-05 08:00:00

《程序员的MySQL手册(一): 安装,基本配置》这是《程序员的MySQL手册》第一篇。这个系列主要是把作为开发,日常工作中需要用到MySQL的方方面面作一个总结,除去了一部分运维工作,主要包括...

ElasticSearch学习笔记

2020-07-04 08:00:00

《ElasticSearch学习笔记》## 搭建单节点ES用Docker来搭建是比较简单的方式...

Go设计模式:composite模式

2020-07-02 08:00:00

《Go设计模式:composite模式》典型的composite模式,是这样的,对于多个对象,由于我们只需要其中一部分共同的操作,因此我们可以通过定义一个父类,来规定我们所需要的操作,却并不管具体每个子类到底是什么样的。看下维基百科的定义...

拯救删除ZFS之后的分区表

2020-06-25 08:00:00

《拯救删除ZFS之后的分区表》本想安装在笔记本上安装FreeBSD+Linux双系统,不过总是引导不起来,遂放弃。删除分区表之后,准备调整分区大小,结果发现gparted里,显示的只有zfs一个分区,但是lsblk却又是正常的。经过搜索发现是ZFS写入了metainfo,于是就看怎么删除...

Linux使用redshift自动调整屏幕色温

2020-06-23 08:00:00

《Linux使用redshift自动调整屏幕色温》多年以前使用Windows的时候,我会安装flux来根据时间调整屏幕色温,这样在晚上的时候,就不那么刺眼。Linux下有开源实现...

Go设计模式:桥接模式和策略模式

2020-06-21 08:00:00

《Go设计模式:桥接模式和策略模式》桥接模式在日常编码中还是经常用到的,这也是我比较喜欢的一个设计模式。从定义上来说,桥接模式比较晦涩难懂:“桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。”...

Go设计模式:单例模式、原型模式和Builder模式

2020-06-20 08:00:00

《Go设计模式:单例模式、原型模式和Builder模式》这篇文章记录三个设计模式,因为他们都比较简单,因此较短的篇幅就可以描述完,就把这三个放在一起。## 单例模式...

操作系统也是CRUD

2020-06-15 08:00:00

《操作系统也是CRUD》![Andrew S·Tanenbaum 现代操作系统](./img/modern_os.png)起初学习UNIX环境下的编程觉得非常难,毕竟这是一个陌生的东西,但是工作后,照面打得多了,自然就熟悉了些,在此总结一些经验...

Go设计模式:简单工厂模式

2020-06-13 08:00:00

《Go设计模式:简单工厂模式》原始的工厂模式太过于繁冗,我几乎不用。但是简单工厂模式是经常用到的,比如:```python...

把USB设备穿透给虚拟机里的系统

2020-06-13 08:00:00

《把USB设备穿透给虚拟机里的系统》最近买了一个NUC8,i5版本,因为听说好装黑苹果,买来之后,看到这么小一个电脑,真的是感叹科技进步速度之快。不过我并不喜欢双系统,也不喜欢macOS,我已经用Linux桌面+Windows虚拟机这套组合8年了,一切都是得心应手。除了一个:最近我在学flutter,没有macOS没法给iOS打包...

debug故事之:事务让生活更美好

2020-06-12 08:00:00

《debug故事之:事务让生活更美好》最近遇到一个故障,接手的项目是一个类似RBAC结构的鉴权系统,用于公司内部的各组织内的管理系统,但是某个接口间歇性返回空数据,这会导致第三方系统判定为无权限,从而让用户从管理后台退出登录...

Go设计模式:模板模式

2020-06-11 08:00:00

《Go设计模式:模板模式》模板模式,大家猜猜是什么?其实我们天天用,离我们最近的就是面向对象里的继承。模板的作用是什么呢?是框定一个框架,但是不填充具体细节,细节由具体的子类来完成,举个例子,如果我们想写一个短信系统,他要对接各种第三方短信,但是其实大家都知道,发短信,大家接口不一样而已,实际上他们可以抽象成相同的流程...

Go设计模式:适配器模式

2020-06-09 08:00:00

《Go设计模式:适配器模式》我买过一个港版的手机,香港的插座和大陆不一样,电压也不一样,因此为了充电,我还买了一个转换头,这个转换头,就是起的适配器的使用...

Go设计模式:Iterator

2020-06-07 08:00:00

《Go设计模式:Iterator》最常见的迭代模式莫过于循环:```go...

glusterfs 笔记

2020-05-30 08:00:00

《glusterfs 笔记》我在自己的集群里搭了一个分布式文件系统,起初在选型的时候,纠结选择ceph还是glusterfs,因为听ceph多一些,且看到有测评ceph写入速度快一点,不过后来想了想,对于我的需求,因为我的集群是跨公网的异地节点组成的,带宽非常有限,会直接成为性能瓶颈,因此选择了glusterfs,因为搭建起来特别简单...

用peewee代替SQLAlchemy

2020-05-29 08:00:00

《用peewee代替SQLAlchemy》用了几年SQLAlchemy,但是说实话,复杂的很,包括配套的DB Migration工具alembic。想要配置一个自动生成migration也是很复杂。最近用了几天peewee,发现真的是简单好用...

Go的slice工作机制

2020-05-23 08:00:00

《Go的slice工作机制》slice是咋工作的?首先我们从一个demo看起:```go...

Linux系统迁移记录(从HDD到SSD)

2020-05-22 08:00:00

《Linux系统迁移记录(从HDD到SSD)》我把HDD上的Linux迁移到SSD上,重装系统太麻烦了,所以我直接拷贝整个系统,然后重建引导恢复,以下是记录。## 两块硬盘...

Redis是如何工作的?

2020-05-21 08:00:00

《Redis是如何工作的?》黄健宏老师的《Redis源码剖析》采用自底向上的讲述方法,先从Redis的数据结构讲起。但是,Redis是怎么从监听端口到执行这些命令的呢?本文记录了我探索这一问题的过程(Redis 6.0)...

virsh自动关闭windows虚拟机

2020-05-18 08:00:00

《virsh自动关闭windows虚拟机》大家都知道,这种定时任务是通过crontab来做,但是,如果你直接尝试在crontab里关机,你会发现有时候是关不掉windows虚拟机的。这是为啥呢?这个问题困扰了我好久,因为每次我直接输入命令关机的时候,都关机成功了,我要是放到crontab里等,它也能关机,但是我设置crontab在晚上1点关机,第二天发现,它就是没有关机...

Golang sort源码阅读

2020-05-16 08:00:00

《Golang sort源码阅读》## 复习算法- 插入排序(insertion sort)...

分治的思维方式

2020-05-15 08:00:00

《分治的思维方式》算法,其本质是一种思维方式。具体实现是术,思维方式是道。对于分治算法,它对应的数学理论是数学归纳法。在程序的表现中,它一般会和递归一起使用...

Debian 使用NetworkManager之后networking.service崩溃

2020-05-13 08:00:00

《Debian 使用NetworkManager之后networking.service崩溃》NetworkManager更好用,但是直接安装NetworkManager之后,原有的networking.service会崩溃。安装当然很简单...

httprouter源码阅读与分析

2020-05-09 08:00:00

《httprouter源码阅读与分析》httprouter是Go里比较高效的一个http 路由框架,比如GIN就是基于它。我们来看看httprouter的源码。首先要明确的一点是httprouter基于radix tree这种数据结构...

《程序员的自我修养-装载、链接与库》笔记

2020-05-08 08:00:00

《《程序员的自我修养-装载、链接与库》笔记》很就之前读过这本书,今日重读,作笔记。## 操作系统...

Golang sync.Pool源码阅读与分析

2020-05-05 08:00:00

《Golang sync.Pool源码阅读与分析》Go的很多地方都有用到 sync.Pool,这是作为一个内存池来使用的。例如 `fmt.Printf`:```go...

MySQL操作笔记

2020-05-01 08:00:00

《MySQL操作笔记》MySQL是我最常用的关系型数据库,不过运维相关的一些命令,我不是很常用,但是偶尔又要用,每次都要去搜索太麻烦了,遂作笔记。## 把默认编码设置为 utf8mb4...

Go语言解析GBK编码的xml

2020-04-30 08:00:00

《Go语言解析GBK编码的xml》最近接短信提供商,因为要做审计功能,所以就要把短信的trace id等信息存储下来,但是捏,提供商返回的是GBK格式的XML,而Goxml库默认只支持UTF-8。那咋办呢?下面是两个方案,第一个比较trick,但是还挺好玩的,第二个比较正式...

Golang log 源码阅读

2020-04-28 08:00:00

《Golang log 源码阅读》来看看Go标准库里的log,怎么实现的,首先我们来看一个例子:```go...

使用Go语言实现一个异步任务框架

2020-04-24 08:00:00

《使用Go语言实现一个异步任务框架》如何使用Go语言实现一个简单的异步任务框架呢?且听我一一道来。首先我们看一下常见的任务队列的架构:![任务队列架构图](./img/gotasks.jpg)...

Golang flag源码阅读及自己实现

2020-04-23 08:00:00

《Golang flag源码阅读及自己实现》看了一下flag的实现,其实挺简单的。首先我们从一个使用例子入手:```go...

Go使用gdb调试

2020-04-23 08:00:00

《Go使用gdb调试》其实我一般调试都是直接打log的,不过gdb调试还是很有用处,尤其是当碰到一些底层错误的需要单步跟踪的时候,比如,想研究一下Go的runtime是如何实现的的时候...

Golang context源码阅读与分析

2020-04-22 08:00:00

《Golang context源码阅读与分析》Golang中使用context作为goroutine之间的控制器,例如:```go...

Golang ASM简明教程

2020-04-22 08:00:00

《Golang ASM简明教程》这几天倒腾了一下Go的ASM,然后写了一个简单的汇编代码,记录一下以防忘记。首先要说明的是Go的ASM是一种中间码,或者说是众多汇编语言的一种抽象体,但是呢,又不完全是抽象,总之,揉合了Go自定义的一部分,和真实汇编语言。这里主要记录的就是Go自己定义的那部分...

Golang中的并发控制

2020-04-21 08:00:00

《Golang中的并发控制》之前我写过一篇博客介绍 [Python中的并发控制](https://jiajunhuang.com/articles/2020_02_12-python_concurrency.md.html)。Python的并发控制可以说很优雅,Java的也是类似的,那么,Go语言咋办?如果我也想实现类似的需求,例如:同时不超过8个goroutine...

善用闭包(closure)让Go代码更优雅

2020-04-21 08:00:00

《善用闭包(closure)让Go代码更优雅》通常来说我们降低一个函数的复杂度的方法是拆分。即大事化小,各个击破的原理。不过拆分成函数调用有一个问题,那就是修改函数参数的时候很蛋疼...

Golang的可选参数实践

2020-04-20 08:00:00

《Golang的可选参数实践》Golang处理可选参数+默认参数的时候,常见的代码是这样的:```go...

FreeBSD ipfw使用教程

2020-04-13 08:00:00

《FreeBSD ipfw使用教程》FreeBSD,古老的UNIX系统,最近在研究它的ipfw防火墙,鉴于国内相关资料较少,我就记录下来,以飨读者。首先在FreeBSD 12中,ipfw已经默认编译进内核了,所以中文资料包括很多英文资料里,还需要编译的,就不用看了,那是过时的...

Golang expvar库源码阅读

2020-04-12 08:00:00

《Golang expvar库源码阅读》最近看到同事用一个库,叫做 `expvar`,这个库的作用官网描述如下:```...

Golang SQL生成库 Squirrel 教程及源码阅读

2020-04-11 08:00:00

《Golang SQL生成库 Squirrel 教程及源码阅读》可能看到标题会产生一个疑问:为啥不用ORM?使用ORM的好处显而易见,能够自动帮我们处理好面向对象和数据库之间的映射,Python中我使用的是SQLAlchemy,但是Go语言目前没有一个比较好用的ORM,目前的ORM都是处于半自动形态的,而且还要处理零值和非零值时的坑,想要省略某些字段要这样写,不想省略要那样写,很难记忆,因此还不如使用SQL这种已经是事实标准的,学一次就能用很久的东西...

Golang validator使用教程

2020-04-10 08:00:00

《Golang validator使用教程》validator应该是Golang里进行表单校验的事实标准了,比如在Web框架GIN中,就是默认使用它。表单校验的作用,就是对输入的数据进行合法判断,如果是不合法的,那么就输出错误。比如...

价值编程与职业发展

2020-04-09 08:00:00

《价值编程与职业发展》投资中有一种理念叫做价值投资,指的是评估一支股票的内在价值所应有的价格,当市场价格低于它时,买入,高于它时卖出。其中市场价与实际价格的差,就叫安全边际...

使用Redis的Stream模块实现群聊功能

2020-04-09 08:00:00

《使用Redis的Stream模块实现群聊功能》Redis 5.0 加入了一个新的模块:[Stream](https://redis.io/topics/streams-intro),在这篇文章中,我们使用它来实现IM中的群聊。首先我们来看看我们的IM有哪些功能,回忆一下我们使用的最多的IM---微信,聊天的形式有两种...

解决k8s cron无法读取环境变量的问题

2020-04-08 08:00:00

《解决k8s cron无法读取环境变量的问题》我们使用 `cron` 放一个deployment里,而不是使用k8s自带的cron方案,原因有几个:- cron经过了历史验证,并且满足要求(虽然精度只到分钟,但是够用了)...

应用内购的坑

2020-03-27 08:00:00

《应用内购的坑》> iOS应用内购,那真不是一般的坑。最近了解了一下iOS和Android的应用内购,也就是在App里进行购买...

两种常见的访问控制模型

2020-03-26 08:00:00

《两种常见的访问控制模型》那就是ACL(Access-control list,访问控制列表)和RBAC(Role-based access control,基于角色的访问控制)。如果我们现场来做一个访问控制,会怎么做呢?最简单的就是,像门卫一样,把每个人和每个对象做一行记录,比如...

gunicorn max-requests 选项的作用

2020-03-25 08:00:00

《gunicorn max-requests 选项的作用》gunicorn 是Python中常见的一个服务网关,它有这么一个特性就是,处理完一定量的请求之后,就会把那个worker重启,用一个新的worker来替代之。但是,这样做的目的是什么呢?...

Redis使用中的几点注意事项

2020-03-23 08:00:00

《Redis使用中的几点注意事项》- 如非必要,一定要设置TTL。如果不是业务所需,必须持久存储,那么请一定要设置好TTL,否则随着时间流逝,Redis里会塞满垃圾。此外还要注意使用框架时,确定好框架是否会设置ttl,比如最近遇到的一个坑就是Python RQ没有默认为job设置ttl,因此几年过去,现在Redis内存不够用了,分析之后才发现,里面有诸多的垃圾,比如一些不用的业务数据,还有很早以前的job的数据等等,全部都堆在...

给你的代码跑个分?pylint使用教程

2020-03-12 08:00:00

《给你的代码跑个分?pylint使用教程》之前我一直使用 `flake8` 来检查Python项目中的代码规范,工作良好,除了一个问题,由于Python是动态语言,编译器只能做最基本最简单的错误检查,这也就意味着,很多错误,如果肉眼看不出来,那就得等执行报错了才会被发现...

一个Gunicorn worker数量引发的血案

2020-03-11 08:00:00

《一个Gunicorn worker数量引发的血案》最近大佬想要我重写一个应用,为嘛呢?因为发现这个应用内存占用非常高,每个pod(我们部署在k8s里)占用1.2-1.3G,一共放了6个pod。但是按道理来说,这个应用并不复杂,不应该占用如此多的内存...

MySQL Boolean类型的坑

2020-03-06 08:00:00

《MySQL Boolean类型的坑》MySQL中,Boolean只是 tinyint(1) 的别名,也就是说,MySQL中并没有真正的bool类型。而SQLAlchemy生成SQL的时候并没有检测到这一点,这就导致一个问题,当使用 bool 类型作为查询条件时,用不上索引,从而导致扫表的行为...

pip freeze是魔鬼

2020-03-04 08:00:00

《pip freeze是魔鬼》很多用Python的项目,喜欢用 `pip freeze > requirements.txt` 来保存依赖,而不是手动维护文件,`pip freeze` 是魔鬼。来看看一个项目依赖的简化版...

一个feed流系统的演进

2020-03-02 08:00:00

《一个feed流系统的演进》这几年我持续开发维护了一个类feed流系统。类feed流在结构上都有这么一个共性,即类feed流系统是一个中心节点,将多个用户和多个feed来源连接起来...

Android 使用view binding

2020-03-01 08:00:00

《Android 使用view binding》在学习和使用flutter一段时间之后,发现flutter的生态和原生相比还是不在一个数量级。因此进行了原生安卓的学习。Android开发中比较烦的一个事情是,当你要操作Activity中的控件时,你必须要写类似的代码...

系统调用的过程

2020-02-27 08:00:00

《系统调用的过程》> 来自APUE和TLPI读书笔记一个系统调用是怎么发生的呢?典型步骤如下...

MySQL charset不同导致无法使用索引的坑

2020-02-26 08:00:00

《MySQL charset不同导致无法使用索引的坑》今天排查了一个MySQL Charset不同导致无法使用索引的坑。当然最开始我是不知道的,同事碰到一个性能问题,我也在群里,因此就捞过界了一把,一起看了一下问题。但是从SQL来说应该是...

微服务的缺点

2020-02-19 08:00:00

《微服务的缺点》微服务,火了好几年的东西。曾经我们看中的是微服务拆分之后,每个项目变得更小,对团队的每个人来说维护成本降低,因为需要了解的东西局限于一个更小的服务。第二是加强了技术选型的灵活性。但是由于没有实践,并不知道微服务会带来什么大的问题...

远程工作一周有感

2020-02-14 08:00:00

《远程工作一周有感》由于疫情的缘故,最近在家远程办公一周了。很久以前就想过切换到远程工作这件事情,咨询过很多人,有的人说远程不好容易受打扰,有的人说远程好因为工作效率高,但是自己却一直没有机会试试。谁也没想到,突然就有一个机会尝试一把...

Python中的并发控制

2020-02-12 08:00:00

《Python中的并发控制》最近有个需求,要大批量写数据,项目是用Python写的。所以有个问题就是如何使用Python做并发控制,如果是Go语言,那么就可以使用[WaitGroup](https://golang.org/pkg/sync/#WaitGroup)...

KVM spice协议在高分屏上的分辨率问题

2020-02-08 08:00:00

《KVM spice协议在高分屏上的分辨率问题》高分屏用起来很爽,但是目前还是经常会遇到各类问题,比如,最近我发现如果我使用扩展显示器,virt manager可以完美的切换guest的分辨率,但是一旦我切回笔记本的屏幕(高分屏),guest就无法自动更新分辨率,而是会有一个最大上限比如 `1600x1020` 之类的...

计算机中的权衡(trade-off)

2020-01-11 08:00:00

《计算机中的权衡(trade-off)》![太极](./img/taiji.jpeg)计算机中一切都是权衡(trade-off)。所谓权衡,即在两个极端中取一个相对中间的位置,不是非黑即白,而是根据实际情况作出取舍...

[声明]本站所有文章禁止转载

2020-01-10 08:00:00

《[声明]本站所有文章禁止转载》最近发现有好些个垃圾站直接全文抄袭本站的文章,请注意,本站此前的协议是“转载需注明作者及原链”,垃圾站直接抄文章不注明原链是违反此协议的,自2020年1月10日12:00起,本站所有文章(包括以前的)都 **禁止转载**,引用请注明作者及原链...

Golang不那么蛋疼的sort

2020-01-07 08:00:00

《Golang不那么蛋疼的sort》以前Go里写排序,如果不能用 `sort.Ints`, `sort.Strings`, `sort.Float64s` 等等快捷函数,就只能实现 `sort.Interface` 这个接口了...

Flutter给Android应用签名

2020-01-06 08:00:00

《Flutter给Android应用签名》给Google Play交了25美元保护费,琢磨着把博客的App上架,上架的前提就是给应用签名。如下:```bash...

使用Gitea+Drone打造自己的CI/CD系统

2020-01-01 08:00:00

《使用Gitea+Drone打造自己的CI/CD系统》有些代码我放本地了,因此搭建了一个Gitea,再加上家里有个老机器,闲着也是闲着,就搭建一个Drone CI来跑测试。首先可以直接安装...

2019年就要结束啦!

2019-12-31 08:00:00

《2019年就要结束啦!》近来有这么一种感觉,时间过的越来越快:2019年就这么悄然的溜过去了。如果说我的2018年是下降,那么2019年就是螺旋回升。人生就是这样,有起有落,我接受这样的人生,我要做的就是尽我最大努力去保证它是螺旋上升,而不是螺旋下降,这就够了...

为什么要使用gRPC?

2019-12-27 08:00:00

《为什么要使用gRPC?》技术选型的时候,多问几个为什么总是没错的。对于RPC,为什么要选择gRPC而不是其他的呢?> 这里要定义一下,RPC = Remote procedure call。我们暂且也把RESTful列入其中一起对比(准确的来说RESTful是一种风格...

Matebook X Pro 2019安装Debian 10

2019-12-24 08:00:00

《Matebook X Pro 2019安装Debian 10》最近着手把手头上的三台ArchLinux都换成Debian 10, 更换的原因是不想再频繁更新了,ArchLinux很好用,唯一的缺点就是更新太频繁了,其实大多数软件的新特性我都用不上,比如内核,我就要一个bbr,最新的LTS内核已经有了,再新的也只是更新驱动而已...

ArchLinux忽略某个包的升级

2019-12-22 08:00:00

《ArchLinux忽略某个包的升级》最近滚挂了,滚了两年,终于挂了一次,挂在啥地方呢?从5.3的内核升级到5.4之后,wifi用不了了。去报了个bug,但是尝试了几个更新版本都没有修复,因此准备先忽略内核的更新...

SQLAlchemy使用主从与数据库autocommit

2019-12-21 08:00:00

《SQLAlchemy使用主从与数据库autocommit》autocommit,意思就是自动提交。它代表着这么一个行为,如果autocommit设置为True(或1),意味着,每一个传输到DBMS的SQL都会被当作一个事务来执行,并且提交。用MySQL举个例子...

Blackbox禁用IPv6

2019-12-19 08:00:00

《Blackbox禁用IPv6》使用Blackbox Exporter对我的主站进行健康检查,但是由于本地的网络对IPv6支持并不好,而Blackbox默认优先使用ipv6来访问,这样就导致老是报警,加入以下配置来避免使用IPv6...

预防缓存击穿

2019-12-18 08:00:00

《预防缓存击穿》一般来说,传说中的高并发解决方案的一大法宝就是使用缓存。没有缓存时,我们的请求是这样的:```...

Go 1.13的errors挺香

2019-12-18 08:00:00

《Go 1.13的errors挺香》前段时间Go发布了1.13,但是因为还没有进Arch的官方库,所以没去尝试。今天抽空试了一下,非常香。我们先来看个例子,然后看看源码...

flutter开发体验汇报

2019-12-16 08:00:00

《flutter开发体验汇报》最近我用flutter给我的博客开发了一个App,这一篇文章是体验报告,也希望能给想要了解flutter的朋友们一些参考。第一天初始化项目是在2019.11.28,到今天为止一共19天,一共迭代了4个版本,目前是0.4.0。目前为止包含这些功能...

自己封装一个好用的Dart HTTP库

2019-12-13 08:00:00

《自己封装一个好用的Dart HTTP库》用过Python的同学,大概都用过requests这个库,这么好用的库,就会想其他语言有没有这个库。Dart没有,所以自己封装:```dart...

Flutter应用启动后检查更新

2019-12-11 08:00:00

《Flutter应用启动后检查更新》开发一个App时,有这么一种需求,用户打开App时,做一些操作,例如检查更新。Flutter的UI是单线程的,不过好在有 `async` 等,但是有一个问题,那就是当检查到有更新的安装包时,怎么在UI上显示出来...

Grafana Gravatar头像显示bug修复

2019-12-10 08:00:00

《Grafana Gravatar头像显示bug修复》给Grafana提了个PR修复了这个问题,现在PR已经合并了,估计会在下个版本发布。Grafana的响应还是很快的,全程大概2d。事情的起因是这样的,我发现自建的Grafana登录之后,左下角的头像裂了,于是就把请求抓出来,发现...

flutter中使用RESTful接口

2019-12-09 08:00:00

《flutter中使用RESTful接口》这篇文章简单的介绍一下,flutter中如何请求接口,并且解析响应的JSON,以及如何向服务器发送POST请求。flutter中请求JSON的例子...

Vim YouCompleteMe使用LSP(以dart为例)

2019-12-04 08:00:00

《Vim YouCompleteMe使用LSP(以dart为例)》YCM(YouCompleteMe)是Vim下大名鼎鼎的补全插件,现在YCM也支持LSP了,因此可以使用YCM来补全支持LSP的代码,再加上YCM自带的语义补全,写起代码来如有神助...

flutter webview加载时显示进度

2019-12-03 08:00:00

《flutter webview加载时显示进度》最近在学习flutter,在webview加载页面时,如果网速不好的话,就会一直白屏,用户看到这个场景可能会比较迷惑,因此我们得加个进度条:```dart...

SQLAlchemy快速更新或插入对象

2019-12-02 08:00:00

《SQLAlchemy快速更新或插入对象》写脚本刷数据的时候,常常有这样的需求:如果对象存在,那么更新数据,否则,插入数据。有可能数据源的数据比schema的字段更多,这种时候,就需要想办法把SQLAlchemy中的schema字段取出来,只取需要的字段了。假设我们的schema叫做 `User`...

修复Linux下curl等无法使用letsencrypt证书

2019-11-26 08:00:00

《修复Linux下curl等无法使用letsencrypt证书》遇到一个奇怪的问题,由于我的博客使用的是letsencrypt,浏览器可以正常访问,但是命令行却不可以。```bash...

欣赏一下K&R两位大神的代码

2019-11-24 08:00:00

《欣赏一下K&R两位大神的代码》这段代码来自UNIX v6,作用是分配和归还内核管理的内存,使用的是first-fit算法,也就是遍历,找到第一个合适的空间,就返回那块空间...

MySQL的ON DUPLICATE KEY UPDATE语句

2019-11-19 08:00:00

《MySQL的ON DUPLICATE KEY UPDATE语句》有这么一种场景:- 查找记录...

使用microk8s快速搭建k8s

2019-11-17 08:00:00

《使用microk8s快速搭建k8s》以前都是用minikube的,minikube默认起一个Virtualbox虚拟机(也可以使用kvm驱动来起kvm虚拟机),今天我们介绍一个新的玩意儿。由Ubuntu维护的microk8s...

Python中优雅的处理文件路径

2019-11-15 08:00:00

《Python中优雅的处理文件路径》写代码(尤其是脚本的时候)经常会遇到要处理文件路径的问题,通常有这么几个考量:- 简单易懂...

Go语言MySQL时区问题

2019-11-14 08:00:00

《Go语言MySQL时区问题》最近由于我要统一技术栈,因此把原本使用SQLite做存储的数据全部迁移到MySQL。博客也是。不过当我检查数据库时,发现时间和我产生数据的时间相差8小时...

我的技术栈选型

2019-11-13 08:00:00

《我的技术栈选型》工作已经几年了,逐步摸索到了自己的技术上限 --- 还是计算机五大件。不断的追新和扩展广度已经没有太大意义,它们的实现原理也都了解的差不多,因此现在是时候开始收缩技术栈,缩小需要不断更新的知识范围,节省精力去做更有意义的事情,把常用技术栈固定下来,并且保持小量更新的状态...

为什么我要用Linux作为桌面?

2019-11-11 08:00:00

《为什么我要用Linux作为桌面?》最近看到一个帖子,说某山软件的流氓行径,不由得让我想叨叨几句:为什么我要用Linux做桌面。当然,要意识到,偏激的极端的东西总是不好的,用Linux做桌面必然是因为Linux能够满足我的需求,为什么我能用Linux做桌面呢?...

disqus获取评论时忽略query string

2019-11-08 08:00:00

《disqus获取评论时忽略query string》我的博客使用disqus,但是默认情况下有一个问题,那就是如果有query string,那么评论只会在对应的query string下才会显示,而我想要忽略query string,以去除query string的URL为唯一标识来加载评论...

MySQL性能优化指南

2019-11-06 08:00:00

《MySQL性能优化指南》数据库优化,是一个存在了几十年的问题,更是每一个后端开发者精进路上必须掌握的技能。而性能优化的核心,就是抠门。在完成功能的前提下:对于CPU,执行越少的代码,那么所需要的CPU时间就越少,因此程序就会越快;...

网络编程所需要熟悉的那些函数

2019-11-01 08:00:00

《网络编程所需要熟悉的那些函数》> 注:图片来自《TCP/IP协议详解卷二:实现》![网络编程函数(recvfrom, sendto, listen, bind, accept等)](./img/network_programming.png)...

DNSCrypt简明教程

2019-10-31 08:00:00

《DNSCrypt简明教程》我们输入 `jiajunhuang.com` 之后,浏览器是需要将 `jiajunhuang.com` 翻译成IP,然后才能建立TCP连接的。而将域名翻译成IP地址,就是DNS服务器的事情,但是有一个小问题,DNS是明文的...

SQLAlchemy简明教程

2019-10-30 08:00:00

《SQLAlchemy简明教程》SQLAlchemy是Python中常用的一个ORM,SQLAlchemy分成三部分:- ORM,就是我们用类来表示数据库schema的那部分...

这些年,我们错过的n个亿

2019-10-25 08:00:00

《这些年,我们错过的n个亿》这些年,我们错过了不知道多少个亿。工作了几年,了解了以前的历史,回头看来,马后炮总是那么容易,但是我们就算马后炮,也要总结历史经验...

给Linux用户的FreeBSD快速指南

2019-10-19 08:00:00

《给Linux用户的FreeBSD快速指南》可能现在很多人甚至没有听过FreeBSD,但是不得不说,FreeBSD虽然市场份额变小了,仍然是UNIX家族中重要的一支...

旧电脑也不能闲着:家用备份方案

2019-10-18 08:00:00

《旧电脑也不能闲着:家用备份方案》手头上有三台本子,一台X61,一台Y400,一台超级本,外加一个阿里云小水管vps。老机器常年放着,电池报废了,国庆回去换了个电池,遂决定拿来做远程备份。超级本由于日常要用,而且因为划分了双系统,硬盘不是很足,因此不加入家庭备份方案(重要资料除外,如下述)...

将SQLite的数据迁移到MySQL

2019-10-15 08:00:00

《将SQLite的数据迁移到MySQL》这几天将Grafana的数据库 `/var/lib/grafana/grafana.db` 迁移到了 MySQL,原因是不想维护多个数据库备份,全都丢MySQL里,统一管理,统一备份即可...

Linux托管Windows虚拟机最佳实践

2019-10-08 08:00:00

《Linux托管Windows虚拟机最佳实践》Linux和Windows各有所长,macOS非我所爱。对我来说,习惯使用XMonad这类平铺式窗口管理器,而Windows并没有好的替代品,再加上Windows相比来说更加吃内存,国产软件又比较流氓等多个原因,我的方案是使用Linux作为桌面系统,而Windows装在虚拟机里,这样有多个好处...

为什么gRPC难以推广

2019-09-29 08:00:00

《为什么gRPC难以推广》为什么gRPC难以推广?gRPC构建在HTTP/2之上,而RESTful实际生产中仍然大量使用HTTP/1,无论在性能、吞吐量、消息传输大小等方面,gRPC都完胜。然而就我的从业经历来看,gRPC在推广上遭遇的难度比RESTFul要难很多。我想主要是这么几个原因...

关于ORM的思考

2019-09-26 08:00:00

《关于ORM的思考》> ORM,全称是Object-relational mapping,即对象关系映射,借助ORM可以把类和数据库表(schema)对应起来。我想大家手头上都不会少了ORM这个工具,借助ORM,我们可以以面向对象的方式来写SQL,例如...

MySQL指定使用索引(使用索引提示)

2019-09-25 08:00:00

《MySQL指定使用索引(使用索引提示)》> 也叫index hint可以看到官方文档中,BNF如下...

QT5使用GTK主题

2019-09-23 08:00:00

《QT5使用GTK主题》我在使用arc这个GTK的主题,但是QT5之后,并不直接使用GTK的主题,因此显得格外的丑。解决方案:```bash...

搭建samba服务器

2019-09-23 08:00:00

《搭建samba服务器》> 由于网上的配置都是非常多而且乱,所以我自己翻了一下manual,整理了一份自己的配置。我需要在Windows和Linux之间共享文件,Samba是UNIX下的CIFS实现,也就是让Linux也可以使用Windows的局域网文件共享。文件共享的...

ssh时自动运行tmux

2019-09-18 08:00:00

《ssh时自动运行tmux》tmux,终端复用神器,之前我一直用byobu,它是tmux的封装,我看了一下源代码,其实就是一堆的bash脚本+python脚本。因为一些byobu的bug,我选择使用原生tmux,但是有一个问题,就是以前执行tmux的时候,是在 `~/.bashrc` 里加上...

ufw简明教程

2019-09-14 08:00:00

《ufw简明教程》iptables过于复杂,ufw才是给平常人用的。首先我们要安装ufw:```bash...

zerotier简明教程

2019-09-11 08:00:00

《zerotier简明教程》最近使用zerotier替换了frp来实现内网穿透,zerotier是一个软交换机,使用zerotier可以让多台内网机器组成一个局域网。首先要安装 `zerotier-one` 这个软件包,如果是ArchLinux,直接运行...

提取kindle笔记

2019-09-04 08:00:00

《提取kindle笔记》首先在Kindle上通过邮件把笔记分享到自己的邮箱,然后把html下载到本地,执行下面的脚本:```python...

一个Golang gRPC握手错误的坑

2019-09-02 08:00:00

《一个Golang gRPC握手错误的坑》在 [这个issue](https://github.com/grpc/grpc-go/issues/2406) 里所提到的feature实现之前,Go的gRPC实现里,客户端和服务端握手过程中,客户端并不会等待HTTP/2协议握手完成之后才开始交互,因此Go的gRPC v1.18之后开始改变这种行为,实现前面所说的这个feature。然而,这就引入了一个不兼容问题,也引入了一大堆bug。很不幸,我就...

Golang(Go语言)爬虫框架colly简明教程及源码阅读与分析

2019-08-31 08:00:00

《Golang(Go语言)爬虫框架colly简明教程及源码阅读与分析》使用了一下colly这个爬虫框架,发现非常的好用,它的设计还是值得学习一下的,API设计的非常简洁。不过首先我们要看看这玩意儿咋用...

选择合适的技术栈

2019-08-30 08:00:00

《选择合适的技术栈》刚毕业的新人特别喜欢使用新的技术,从业多年的老人往往偏于保守。```...

Golang的template(模板引擎)简明教程

2019-08-23 08:00:00

《Golang的template(模板引擎)简明教程》模板语言,在前后端分离的时代,大概可以归类到上古时代的技术了。不过前后端分离并不是银弹(而且也只是把模板从后端移到前端而已),它也有很多问题...

毕业三年,一路走来

2019-08-21 08:00:00

《毕业三年,一路走来》正是开学季,对我来说,是比开学更有纪念意义的日子。三年,一千多个日夜。回头看来,感慨良多,我从一个月薪三千的实习生,一路打怪升级,遇到过好的mentor和领导,也遇到过差劲的;挖过坑,填过坑;删过数据库,也抢救过他人删除的数据库;有信心爆棚的时候,也有迷茫的时候...

代码的坏味道

2019-08-18 08:00:00

《代码的坏味道》这坨代码真烂!这真是一座屎山!能写出这样的代码也真是绝了!...

消息分帧(字符串设计或协议设计)的两种形式

2019-08-05 08:00:00

《消息分帧(字符串设计或协议设计)的两种形式》如果你读过Redis的源码,那么一定知道Redis的sds的设计。C语言中,字符串以 `'\0'` 结尾,`printf` 函数遇到 `'\0'` 之后便会停止输出;而sds则是为字符串增加了一个长度,首先我们读取这个字符串长度为多少,然后打印多少个字符...

C, Go, Python的错误处理和异常机制杂谈

2019-08-01 08:00:00

《C, Go, Python的错误处理和异常机制杂谈》很多语言都混用了错误和异常,本文中,我们对错误和异常进行定义:- 错误(error) 是不可恢复的,只能通过修复程序或者输入输出来修正的...

好的命名是最好的文档

2019-07-29 08:00:00

《好的命名是最好的文档》好的命名是最好的文档。包括:- 项目名...

读《系统之美:决策者的系统思考》

2019-07-24 08:00:00

《读《系统之美:决策者的系统思考》》![系统之美:决策者的系统思考](./img/thinking_in_systems.png)最近一周读了这本《系统之美》,如题所述,这本书主要讲如何从系统层面来看待问题,而不是从单一的细节。不知道大家是否...

Linux高分屏支持

2019-07-20 08:00:00

《Linux高分屏支持》整了个高分屏的本子,由于分辨率实在是太高了,默认情况下字太小了无法看清楚。因此编辑 `.Xresources` ,内容如下:```...

GCC默认的头文件搜索路径

2019-07-16 08:00:00

《GCC默认的头文件搜索路径》```bash$ cpp -vUsing built-in specs...

读《远见-如何规划职业生涯3大阶段》

2019-07-15 08:00:00

《读《远见-如何规划职业生涯3大阶段》》![远见-如何规划职业生涯3大阶段](./img/the_long_view.png)毕业之前,学校一般都会组织上职业生涯规划这样一门课程,但是一般由于涉世未深,学校这么课程一般也挺水,因此可以说,大部分人...

后端工程师学前端(五): SASS

2019-07-13 08:00:00

《后端工程师学前端(五): SASS》此前我们学习了基本的CSS和HTML的知识,因此我们已经可以开始构建基本的页面,但是现实工程中有一个问题,即CSS使用的越来越多,代码维护难度也上升...

后端工程师学前端(四): CSS进阶(盒子模型)

2019-07-10 08:00:00

《后端工程师学前端(四): CSS进阶(盒子模型)》盒子模型是我们常用的一种布局模式,在盒子模型之前,一般是用表格布局,但是现在已经弃用。> 这一篇文章主要出自阅读《CSS权威指南》之后的笔记...

读《投资中最简单的事》

2019-07-06 08:00:00

《读《投资中最简单的事》》![投资中最简单的事](./img/the_simple_things_in_investment.png)最近读了这一本《投资中最简单的事》,作者也是坚定的价值投资者。信奉价值投资的人,说来说去其实就是这一个词语:安全边际...

后端工程师学前端(三): CSS进阶(特指度、单位和字体族)

2019-07-04 08:00:00

《后端工程师学前端(三): CSS进阶(特指度、单位和字体族)》> 这一篇文章主要出自阅读《CSS权威指南》之后的笔记## 特指度...

后端工程师学前端(二): CSS基础知识(规则与选择器)

2019-07-02 08:00:00

《后端工程师学前端(二): CSS基础知识(规则与选择器)》> 这一篇文章主要出自阅读《CSS权威指南》之后的笔记## 基础介绍...

Swift语法笔记

2019-06-25 08:00:00

《Swift语法笔记》## 类型- Int...

后端工程师学前端(一): HTML

2019-06-23 08:00:00

《后端工程师学前端(一): HTML》为了让自己的技能不再那么单一,我决定先后学习前端和iOS开发。此前我的前端技能是零散的、不成体系的,我会系统的将学习历程记录成系列博客:后端工程师学前端...

读《管理的实践》

2019-06-23 08:00:00

《读《管理的实践》》![管理的实践](./img/the_practice_of_management.png)最近把《管理的实践》读了一遍,我认为这本书可以多读几遍,因为这可以提升我们的思维层次,以技术人员一章中的说法为例,为何...

frp 源码阅读与分析(二):TCP内网穿透的实现

2019-06-19 08:00:00

《frp 源码阅读与分析(二):TCP内网穿透的实现》在 [上一篇](https://jiajunhuang.com/articles/2019_06_11-frpc_source_code_part1.md.html) 文章中,我们介绍了frp中的一些概念和基础知识,这一篇中,我们在此前的基础之上,来看看frp是怎么实现TCP内网穿透的...

五天不用微信 - 爽得很

2019-06-15 08:00:00

《五天不用微信 - 爽得很》上周突发奇想,在自己身上做了一个实验,如果生活没有了微信,将会发生什么?于是就在朋友圈发了一条“停用微信一段时间,有事邮件、电话、tg联系”之后把微信卸载了...

frp 源码阅读与分析(一):流程和概念

2019-06-11 08:00:00

《frp 源码阅读与分析(一):流程和概念》frp 是一个比较流行的用于内网穿透的反向代理服务器,与Nginx不同,一般我们使用Nginx做负载均衡,而frp我们一般用来做内网穿透。先来看看Nginx和frp流量走向的区别。这是Nginx的流量走向示意图...

学习frp源码之简洁的在两个connection之间转发流量

2019-06-10 08:00:00

《学习frp源码之简洁的在两个connection之间转发流量》在阅读frp的代码时,发现这样一个技巧,即使用 `io.CopyBuffer` 来把两个连接之间的流量互转。```go...

自己动手写一个反向代理

2019-06-09 08:00:00

《自己动手写一个反向代理》[此前谈到网络编程的重要性](https://jiajunhuang.com/articles/2019_06_06-ip_ban.md.html),放假在家做了一个反向代理。目前来说,比较好用的反向代理是 [frp](https://github.com/fatedier/frp)。但是用归用,造轮子归造轮子。明白了底层原理,才心安...

读《债务危机》

2019-06-08 08:00:00

《读《债务危机》》![债务危机 豆瓣评分](./img/big_debt_crises.png)最近读了《原则》一书作者的另一本书,《债务危机》,花了点时间,昨天才读完。这本书主要是以20世纪到2018年世界范围内发生的...

从XMonad迁移到i3

2019-06-08 08:00:00

《从XMonad迁移到i3》XMonad用了很多年了,但是ArchLinux上,Haskell的包更新太频繁了,而XMonad的配置语言使用Haskell,每次更新之后,如果没有编译一下,可能下次就进不去了,而且ArchLinux上Haskell的包分得太小了,再加上我使用Haskell就是为了写配置文件,但是配置文件不常更新,因此有点忘记了...

服务器IP被ban学到的经验

2019-06-06 08:00:00

《服务器IP被ban学到的经验》最近服务器被ban了,然后连续几天晚上都在处理各种数据迁移。真把我累惨了,今天终于处理的差不多了,总结一下经验和教训:- 学会网络安全太重要了,要学会在网络上隐身。不过由于我在网络上留下了很多痕迹,想要隐身已经不太可能了,但是可以从现在开始...

socks5 协议详解

2019-06-06 08:00:00

《socks5 协议详解》`socks5` 是一个简单的代理协议,这里是 [RFC](https://tools.ietf.org/html/rfc1928)。![firefox proxy settings](./img/firefox_proxy.png)...

开启HSTS(HTTP Strict Transport Security)

2019-06-04 08:00:00

《开启HSTS(HTTP Strict Transport Security)》HSTS(HTTP Strict Transport Security) 的作用就是,当你使用了一次之后,浏览器就会记住这个选项,之后都是直接访问HTTPS。原理是通过设置一个头部:`Strict-Transport-Security: max-age=15552000; includeSubDomains`。格式是 `Strict-Transport-Security: max-age=<过期时间>; includeSubDomains`...

网络乞讨之合并支付宝和微信的收款二维码

2019-06-01 08:00:00

《网络乞讨之合并支付宝和微信的收款二维码》在博客的右边加了一个网络乞讨的二维码,但是支付宝和微信分别有两个二维码,要想个法子把它们合并一下。于是把支付宝和微信的收款二维码解码了一下(可以找二维码解码工具,如果是iOS用户,直接用自带的相机扫描,就会弹出来是否打开),发现支付宝的是一个链接,但是微信的是一个自有链接...

从Chrome切换到Firefox

2019-06-01 08:00:00

《从Chrome切换到Firefox》Chrome一家独大之后,就喜欢开始搞幺蛾子,商业公司毕竟是商业公司。再加上Chrome实在是越来越卡,让我的老本子打开都要白屏加载好几秒钟,试用了一下Firefox Quantum,发现Firefox已经不是当年的Firefox,响应非常快,常见的插件也都有,于是就直接切换到Firefox了...

nomad简明教程

2019-05-31 08:00:00

《nomad简明教程》k8s其实太复杂,对于小团队来说,光是hold住k8s就要花好几个人力,而且k8s更新迭代太快了,有种上了贼船就下不来的感觉。nomad就简单多了,就是一个调度器,啥也不带,显得有点简陋,不过,对于中小型团队来说,完全足够...

Linux下当笔记本合上盖子之后只使用扩展显示器

2019-05-31 08:00:00

《Linux下当笔记本合上盖子之后只使用扩展显示器》鉴于我的笔记本是7年前的本子,那会儿分辨率还是 `1366x768`,辣眼睛,所以接了一个扩展显示器,笔记本呢,就丢在角落里,连几根线出来就可以了。但是有个问题就是,每次打开的时候,`XMonad` 都以为是两个屏幕,因此它会开两个 `workspace`,所以要实现这么一个目的,就是打开图形界面登录的时候,检测一下是不是接了扩展显示器,而且笔记本的盖子是关着的。实现方式就是...

Ubuntu 18.04 dhcp更换新IP

2019-05-30 08:00:00

《Ubuntu 18.04 dhcp更换新IP》今天在准备弄一个虚拟机集群,自然是装好一个,然后clone成三份。但是有一个问题,clone的时候虽然选择了更换 `MAC` 地址,但是起来之后发现ip地址还是没变。原来是 `systemd-networkd` 的老bug。它不是根据 `MAC` 地址来决定是否换IP,而是根据 `/etc/machine-id`来计算出来一个值,如果这个值发生了变化,那么就更换IP地址...

Python中的新式类(new style class)和老式类(old style class)

2019-05-29 08:00:00

《Python中的新式类(new style class)和老式类(old style class)》Python2.3之前,使用的是老式继承,直接看例子:```python...

Python Requests 简明教程

2019-05-18 08:00:00

《Python Requests 简明教程》[requests](https://2.python-requests.org/en/master/) 是Python中一个非常出名的库,它极大的简化了Python中进行HTTP请求的流程,我们来看一个简单的例子...

密码技术简明教程(三):证书和TLS

2019-05-15 08:00:00

《密码技术简明教程(三):证书和TLS》在 [第一篇](https://jiajunhuang.com/articles/2019_05_12-crypto.md.html) 和 [第二篇](https://jiajunhuang.com/articles/2019_05_14-crypto_part2.md.html) 中我们学到了使用对称加密加密信息,非对称加密配送密钥,使用散列确认文件没有被篡改,使用消息认证码确保知晓密码的才能发送消息,使用数字签名来证明消息的发送者...

密码技术简明教程(二):散列、消息认证码和数字签名

2019-05-14 08:00:00

《密码技术简明教程(二):散列、消息认证码和数字签名》[上一篇](https://jiajunhuang.com/articles/2019_05_12-crypto.md.html) 我们讲到了对称加密和非对称加密,利用这两个技术我们确保了信息传输的安全性。但是如果有这么一种情况,`Alice` 下班之后忘记把电脑锁屏,第二天来的时候 `Alice` 如何确定自己的文件是否被篡改过呢?...

SEO学习笔记

2019-05-14 08:00:00

《SEO学习笔记》> https://support.google.com/webmasters/answer/7451184SEO的全称是Search Engine Optimization,就是搜索引擎结果优化。目的就是让你的网站在搜索引擎的返回结果中靠前。现在的搜索引擎...

密码技术简明教程(一):对称加密和非对称加密

2019-05-12 08:00:00

《密码技术简明教程(一):对称加密和非对称加密》密码技术好像不常用,偶尔我们才需要对接需要验签的接口。实际上密码技术很常用,只要你访问了https的网站,就用到了密码技术,甚至是解锁手机,也用到了密码技术...

Kubernetes 笔记

2019-05-10 08:00:00

《Kubernetes 笔记》> 读《Kubernetes in Action》后整理而来我们可以把一个或者多个容器打包在一起,就像用 `docker-compose` 时那样。我们把这样一个组合成为一个 `pod`。 pod是一个节点上,一个或多个容器的组合...

go mod 和 logrus 路径大小写的问题

2019-05-09 08:00:00

《go mod 和 logrus 路径大小写的问题》前段时间遇到了这么个问题:```bash...

Flask自动加载Blueprint

2019-05-08 08:00:00

《Flask自动加载Blueprint》写多了 `from controllers.xxx import xxx`, `app.register_blueprint(xxx)` 就想偷懒。于是就仿照 `unittest` 的实现思路来做了一个自动加载 `Blueprint` 的工具。使用方法如下...

在KVM里安装Minikube

2019-05-07 08:00:00

《在KVM里安装Minikube》我要在本地搭建一个Kubernetes,所以要在本地安装minikube,这是一个相对简单也节省资源的方案,但是minikube默认使用virtualbox做虚拟机,而virtualbox的效率有点太低了,我要使用KVM...

搞定面试中的系统设计题

2019-04-29 08:00:00

《搞定面试中的系统设计题》一般来说,社招多少都会考察系统设计题,尤其是针对有了1年以上工作经验的工程师,这更是面试流程中的家常菜,除了面试之外,学会系统设计对我们的日常工作也是大有裨益的...

Crontab + Sendmail实现定时任务并且通知

2019-04-25 08:00:00

《Crontab + Sendmail实现定时任务并且通知》systemd timers真是不好用。或者说,我还是更喜欢crontab,简单易懂。最近我有个需求是定时从云主机把数据备份到笔记本上,一开始用的systemd timers,但是出错了也不通知我,于是用回crontab,而且还发先可以使用Linux自带的本地邮件的功能来实现提醒的功能...

Nginx设置Referer来防止盗图

2019-04-23 08:00:00

《Nginx设置Referer来防止盗图》如果不是图床,还真怕别的网站直接使用本站图片。这样子流量很可能一下子就被刷光了,毕竟CDN都是白花花的银子买来的。因此,还是设置一个防盗链吧,Nginx就可以完成这个功能了...

Graphviz dot简明教程

2019-04-20 08:00:00

《Graphviz dot简明教程》graphviz是一个用特殊的文本语言来生成图片的应用,可以生成有向图和无向图。dot就是那个特殊的文本语言。dot大概长这样...

jQuery简明教程

2019-04-19 08:00:00

《jQuery简明教程》> 偶尔才用用jQuery,但是老是不记得怎么用,所以总结一下做个笔记都9102年了,还在用jQuery?是的,有时候还是会用到jQuery...

Python RQ(Redis Queue)添加gevent支持

2019-04-18 08:00:00

《Python RQ(Redis Queue)添加gevent支持》python-rq简单好用,但缺点是,默认的实现是使用fork的模式,关于这点可以看[python-rq源码阅读与分析](https://jiajunhuang.com/articles/2017_09_20-task_queue_python_rq.md.html) ...

技术人,光有技术是不行的

2019-04-17 08:00:00

《技术人,光有技术是不行的》三年前,我刚毕业的时候,对技术一无所知,当然,现在也只是比以前知道的多了一点点。当时我觉得,技术人,要深度优先,广度次之。这是对的,坚持深度的这三年给我带来了很多提升。但是还记得语文课本上的卖油翁吗?...

读《超级运营术》- 如何做社区?

2019-04-17 08:00:00

《读《超级运营术》- 如何做社区?》这本书主要是讲如何去运营。因为最近在折腾一个 [社区](https://qipa.jiajunhuang.com) ,从技术上来说并不难,但是技术之外的东西我却不懂,因此需要学习一下...

搭建aria2服务器

2019-04-06 08:00:00

《搭建aria2服务器》首先安装:```bash...

使用shairport-sync搭建airplay音频服务器

2019-04-06 08:00:00

《使用shairport-sync搭建airplay音频服务器》Arch下直接:```bash...

VirtManager Windows自适应屏幕

2019-04-05 08:00:00

《VirtManager Windows自适应屏幕》此前折腾过一次,最近在折腾btrfs的时候,因为磁盘大小不够,把原本的虚拟机给删掉了,重新装一个,因此又遇到了这个问题,因此记录一下解决方案...

使用btrfs组建RAID1

2019-04-03 08:00:00

《使用btrfs组建RAID1》最近在折腾 `syncthing` 这个 P2P 的私人云盘,原本是在vps上搭建了一个,但是考虑到vps的数据也不安全,于是还是决定把数据保存在本地。但是由于单块硬盘是不可靠的,因此需要组一个RAID...

Swagger? 不好用

2019-04-01 08:00:00

《Swagger? 不好用》最近用了一下swagger,swagger是一个用于把代码和文档连接起来的工具,我们在注释里写好一些东西,然后swagger生成出一个网页,这样可以方便的在网页上点一下测试,就可以发出一个请求。但是,实际体验中,并不好用,原因如下...

Golang/Python最佳实践

2019-03-29 08:00:00

《Golang/Python最佳实践》## 统一好返回格式- 使用gRPC...

读《毛泽东选集》

2019-03-24 08:00:00

《读《毛泽东选集》》> 此处为读毛选的笔记。此文纯属学习,与任何政治观点、派别无关。- 要学会抓主要矛盾:谁是我们的敌人?谁是我们的朋友?这个问题是革命的首要问题。中国过去一切革命斗争成效甚小,其基本原因...

GORM源码阅读与分析

2019-03-19 08:00:00

《GORM源码阅读与分析》最近读了一下GORM的源码,以下是简述。我们将以一个查询来看GORM是怎么调用的。## 事前准备...

随想

2019-03-16 08:00:00

《随想》这是最近的一些新的想法,记录下来。## 技术为业务服务...

Golang中的错误处理

2019-03-15 08:00:00

《Golang中的错误处理》## error是个啥Golang的error是一个接口...

Golang 的槽点

2019-03-14 08:00:00

《Golang 的槽点》Golang虽然说打着简洁的名号,但是很多设计实际上并不简洁,且由于Go1兼容性保证的原因,这些都不能被修正。## 声明方式太多...

一个想当然的bug

2019-03-12 08:00:00

《一个想当然的bug》许久不写Python,`"".split(",")` 的结果我已经不能脑内运算了:```python...

读《稀缺》

2019-03-06 08:00:00

《读《稀缺》》稀缺能为人们带来收益(专注红利),但同时也有坏处(管窥)。- deadline是第一生产力...

读《影响力》

2019-03-03 08:00:00

《读《影响力》》感叹:销售套路深。- “一分钱一分货”:其实是假的,人们对不了解的东西就会觉得一分钱一分货,实际上并不是如此,有很多智商税,例如钻石...

读《自控力》

2019-03-01 08:00:00

《读《自控力》》自控力,是指我们能否自我控制。很多事情都需要这种力量,例如:- 节食减肥...

Containerd简明教程

2019-02-27 08:00:00

《Containerd简明教程》最近在玩这个玩意儿,准备在此之上开发自己的容器编排系统 [huang](https://github.com/jiajunhuang/huang)。这里简单看一下containerd的使用。containerd是从Docker分离出来的一个用于容器、镜像增删改查的程序,这是它的架构图...

软件设计套路之推拉模式

2019-02-26 08:00:00

《软件设计套路之推拉模式》推、拉是两种常见的数据分发模式。以微博为例:- 推:发微博时,遍历所有关注者,写入数据到对应的关注者数据表里。好处是,读取时直接读取数据库即可,即用写入时间换取读取时间。坏处是...

记一次Golang TLS编程踩坑

2019-01-30 08:00:00

《记一次Golang TLS编程踩坑》最近在写一个HTTP/2代理,一开始使用h2c玩的好好的,结果往测试环境发布,因为跨了公网,因此要加证书,踩了一个坑。发起连接的客户端代码...

杂谈

2019-01-13 08:00:00

《杂谈》Golang,除去繁琐的 `if err != nil` 之外,写起来还是非常爽的。而goroutine作为Golang的 core feature,就是能让我们爽的根本原因之一,仔细的了解一下goroutine,怎么来说都不为过。所以,聊一聊goroutine,希望能给读者带来一些启发。> TL;DR 我们最开始从组装一台电脑说起,然后会讲到操作系统的一些概念例如进程,线程,之后再了解一下goroutine本身...

使用autossh实现内网穿透

2019-01-12 08:00:00

《使用autossh实现内网穿透》如果想要随时随地访问自己的笔记本该怎么做?不用搜了,当然是用强大的ssh。```bash...

Linux线程内存模型

2019-01-07 08:00:00

《Linux线程内存模型》![linux thread memory layout](./img/linux_thread.jpg)...

关闭手机通知,修复碎片化的生活

2019-01-03 08:00:00

《关闭手机通知,修复碎片化的生活》我以前做过一个推送系统,其任务就是,把给用户的消息推送到手机上,这样,手机就会收到一条弹窗推送。想象一下从我们用上智能手机以后的生活,每当需要一个功能,就去软件商店搜索相关的软件,安装,之后App第一件事情就是问你...

Linux下系统调用的过程

2019-01-01 08:00:00

《Linux下系统调用的过程》> TLPI, Chap 3- The application program makes a system call by invoking a wrapper function in the C library...

Redis 5.0 Stream简明教程

2018-12-27 08:00:00

《Redis 5.0 Stream简明教程》Redis是我最喜欢的工具之一。Redis 5.0推出了一个新的数据结构:Stream。当然是要好好的研究研究。首先,Stream就是一个流处理的数据结构,例如:任务流,消息流等等。因此,借助Stream模块,我们可以做分布式任务分发,消息订阅,可以做类似IRC的聊天软件等等...

耍耍OverlayFS

2018-12-27 08:00:00

《耍耍OverlayFS》自Linux3.4之后,就可以使用overlay了。来,耍耍。```bash...

删除分区表

2018-12-26 08:00:00

《删除分区表》之前删除分区表,都是用很傻的方式,例如,gparted一个一个分区删掉,然后最后把分区表删了,或者是fdisk去删除。但是!读一下 [GPT](https://zh.wikipedia.org/wiki/GUID%E7%A3%81%E7%A2%9F%E5%88%86%E5%89%B2%E8%A1%A8) 的维基百科定义,就会发现...

YouCompleteMe ycmd server SHUTDOWN 和 pyenv的问题

2018-12-24 08:00:00

《YouCompleteMe ycmd server SHUTDOWN 和 pyenv的问题》周末手欠,`pip uninstall` 的时候不小心接了个pip在后面,结果虚拟环境里的pip就没了。那当然是重新装一个就好了:`pyenv install 3.7.0`,但是此后YouCompleteMe一直挂,有时候又不挂。终于找到了原因...

Docker组件介绍(二):shim, docker-init和docker-proxy

2018-12-24 08:00:00

《Docker组件介绍(二):shim, docker-init和docker-proxy》[上一篇](https://jiajunhuang.com/articles/2018_12_22-docker_components.md.html) 文章中,我们简单的介绍了 `runc`和`containerd`。这一篇文章中,我们分别看看 `docker-containerd-shim`, `docker-init` 和 `docker-proxy` 的作用...

Docker组件介绍(一):runc和containerd

2018-12-22 08:00:00

《Docker组件介绍(一):runc和containerd》> TL;DR: 主要介绍了Docker的各个组件:`runc`, `containerd`, `shim`, `docker-init`, `docker-proxy`。最近在研究Docker,为 [我自己的容器编排系统](https://github.com/jiajunhuang/huang) 做知识储备工作。初次接触到Docker是在大二的时候...

Prometheus MySQL Exporter源码阅读与分析

2018-12-16 08:00:00

《Prometheus MySQL Exporter源码阅读与分析》常见的消息订阅模式有两种情形,一种是推,即产生一条消息时,即刻推送给所有客户端(或者对应的DB存储下来);另外一种是拉,即产生一条消息时,并不做任何动作,而是当真正需要数据时,再去生成。对应到实际编程中,也有类似的概念,例如,实时计算vs延迟计算(lazy evaluation)...

MySQL性能指标

2018-12-13 08:00:00

《MySQL性能指标》最近在魔改MySQL性能收集器 [mysqld-exporter](https://github.com/prometheus/mysqld_exporter),接触到一些MySQL常见的性能指标,好好地记录下来学习学习:`SHOW GLOBAL STATUS` 中...

使用Dropbox来备份服务器文件

2018-12-12 08:00:00

《使用Dropbox来备份服务器文件》服务器一直都没有备份,上面其实还有数据库,[Dropbox](https://db.tt/8enuh0Mf)这么好用的东西,当然就用它了,当然了,我的数据库里没有机密信息,但是又要保证不丢,所以符合使用 [Dropbox](https://db.tt/8enuh0Mf) 来备份的要求...

《计算机网络-系统方法》读书笔记

2018-12-10 08:00:00

《《计算机网络-系统方法》读书笔记》> https://book.systemsapproach.org/- 网络设计者需要考虑的三个主要问题...

Y Combinator《如何创业》笔记

2018-12-08 08:00:00

《Y Combinator《如何创业》笔记》> https://www.bilibili.com/video/av6612058/?p=2> https://www.youtube.com/watch?v=CBYhVcO4WgI&list=PL11qn6zM2Y3bMZdChxEqHKaCaKUjwItGL...

Go类型嵌套

2018-12-01 08:00:00

《Go类型嵌套》Go没有继承,但是有类型嵌套,主要有三种使用方式,使用类型嵌套,wrapper可以自动获得被嵌套类型的所有方法。接下来我们分别看三种情况下的例子...

etcd源码阅读与分析(五):mvcc

2018-11-28 08:00:00

《etcd源码阅读与分析(五):mvcc》[MVCC](https://en.wikipedia.org/wiki/Multiversion_concurrency_control) 是数据库中常见的一种并发控制的方式,即保存数据的多个版本,在同一个事务里,应用所见的版本是一致的...

etcd源码阅读与分析(四):lease

2018-11-27 08:00:00

《etcd源码阅读与分析(四):lease》lease是租约,类似于Redis中的TTL(Time To Live)。可以看一下怎么使用lease:```go...

干了这碗叔本华牌毒鸡汤 --- 《人生的智慧》

2018-11-26 08:00:00

《干了这碗叔本华牌毒鸡汤 --- 《人生的智慧》》如果说一般的心灵鸡汤有毒,那么叔本华的鸡汤就是剧毒。为什么呢?作为读者,你会无时不刻感觉到:这特么说的不就是我么?怎么和我想的一样?毕竟,这书看起来是叔本华写给聪明人看的。来,今天我们一起干了这碗毒鸡汤...

etcd源码阅读与分析(三):wal

2018-11-24 08:00:00

《etcd源码阅读与分析(三):wal》今天来看看WAL(Write-Ahead Logging)。这是数据库中保证数据持久化的常用技术,即每次真正操作数据之前,先往磁盘上追加一条日志,由于日志是追加的,也就是顺序写,而不是随机写,所以写入性能还是很高的。这样做的目的是,如果在写入磁盘之前发生崩溃,那么数据肯定是没有写入的,如果在写入后发生崩溃,那么还是可以从WAL里恢复出来...

Memory leak in net/http

2018-11-24 08:00:00

《Memory leak in net/http》> English is not my mother languange, help me to improve this if you'd like, thanks!## What happened?...

etcd源码阅读与分析(二):raft

2018-11-22 08:00:00

《etcd源码阅读与分析(二):raft》今天讲的是 `raft` 这个文件夹下的内容。我觉得etcd的代码写得不够好,当然,也有可能是因为我外行,不过这只是我的感受,不喜勿喷。首先要看一下 `doc.go` 这个文件,里面写了很多注释,有利于理解,此外看 `raft` 文件夹下的代码,结合上一篇所说的raftexample一起来...

etcd源码阅读与分析(一):raftexample

2018-11-20 08:00:00

《etcd源码阅读与分析(一):raftexample》> 开始读etcd的源代码,今天首先来看的是 raftexample,这是一个基于 raft 的简单内存KV,希望通过 raftexample 能对 etcd 有一个大概的认识。首先看一下目录结构...

虚拟机里的Ubuntu sudo时卡住

2018-11-18 08:00:00

《虚拟机里的Ubuntu sudo时卡住》> https://serverfault.com/questions/38114/why-does-sudo-command-take-long-to-execute今天装了一个虚拟机,其他都很快,但是执行sudo的时候却非常的卡,要等好几秒钟,搜了一下,是这么个解决法,把主机名加到 `/etc/hosts` 里,原因是安装过程中,hostname没有追加到 `/etc/hosts` 里...

Go访问私有变量

2018-11-16 08:00:00

《Go访问私有变量》> 工程上当然不能这么干,所以这篇文章呢,just for fun :)Go语言里,小写的变量,包外不可访问...

Raft论文阅读笔记

2018-11-16 08:00:00

《Raft论文阅读笔记》- Raft集群中,每个server只有三种状态:leader,follower,candidate(选举)。- follower不会主动发送消息,只会接受和响应消息。- leader处理所有的客户端请求,如果follower接收到客户端的请求,则转发给leader...

避免全局变量

2018-11-15 08:00:00

《避免全局变量》> 睡觉前好像确实不应该想问题,大半夜的思维活跃睡不着了。当然,那只臭蚊子也有功劳,要是被我发现了我要灭了它。> 不过,既然睡不着,那就起来写篇博客...

Go的unsafe包

2018-11-13 08:00:00

《Go的unsafe包》常规的Go代码是可以跨平台的,因为常规代码只关心使用哪种数据结构,而不关心数据结构的内部实现,内部实现细节由编译器处理。而 `unsafe` 这个包就是用来访问内部实现细节的。所以,使用了unsafe这个包的代码,因为Go的编译器实现细节改变,很有可能会造成兼容性问题...

Golang中实现禁止拷贝

2018-11-12 08:00:00

《Golang中实现禁止拷贝》Go中没有原生的禁止拷贝的方式,所以如果有的结构体,你希望使用者无法拷贝,只能指针传递保证全局唯一的话,可以这么干,定义一个结构体叫 `noCopy`,要实现 `sync.Locker` 这个接口...

人生如戏,全靠演技 -- 《日常生活中的自我呈现》读后感

2018-11-11 08:00:00

《人生如戏,全靠演技 -- 《日常生活中的自我呈现》读后感》> 随想随写,有点乱。日常生活中,表达有两种,一种是给出的表达,例如通过词语,语言;另一种是流露出的表达,例如不经意间的一些行为动作,眼神态度...

Golang的反射

2018-11-10 08:00:00

《Golang的反射》反射是指,在程序运行的时候,可以动态的检查自身的类型,结构和其他信息。要了解Go语言的反射,我们需要了解两个概念...

数据库事务

2018-11-10 08:00:00

《数据库事务》## 事务的四个特性数据库事务,简单来讲,就是把一堆的数据库操作(增删改查)组合成一个操作,这个操作要么成功,要么失败,如果成功,那么结果...

把网站去掉CSS之后

2018-11-09 08:00:00

《把网站去掉CSS之后》准确的来说,是去掉了CSS框架。前几天把博客的CSS框架(Bootstrap)去掉了,于是现在网站变成了90年代的风格,黑白两色,没有特效...

处理并发的方式

2018-11-07 08:00:00

《处理并发的方式》并发,就会出现竞争问题,下面是几种常见的处理方式:- 加锁。所有的参与者竞争同一个锁,持有锁的参与者可以对资源进行操作。如果资源满足读和写可以分离的条件,可以使用读写锁来...

常见的索引方式

2018-11-02 08:00:00

《常见的索引方式》如果没有索引,对于无序的数据,我们查找数据就只能依靠遍历,算法时间复杂度为O(N);对于有序的数据,可以使用二分查找,时间复杂度为O(lgN),但是此处的有序还有一个要求,就是数据是空间连续的,即如果是使用链表保存,即便是有序也无法使用二分查找...

Golang 实践经验

2018-11-01 08:00:00

《Golang 实践经验》- 编码风格:https://github.com/golang/go/wiki/CodeReviewComments- 编码规范:代码提交前使用 go fmt 格式化代码- 虽然Go推荐使用比较短的名字来命名,但是不要太短,例如l, a, r,容易看不懂,尤其是当嵌套层次深了之后。例如gRPC实现中的一段代码...

高性能MySQL笔记第一章

2018-10-23 08:00:00

《高性能MySQL笔记第一章》![mysql archtecture](./img/mysql_arch.png)最上层是连接处理,网络认证等功能;第二层是查询优化,分析,优化,缓存,以及SQL内置函数的实现、跨存储引擎的操作...

面试的一些技巧

2018-10-21 08:00:00

《面试的一些技巧》当然,看到这篇博客的同事,不要误以为我是要跳槽了❌。这是从毕业到现在,所经历的一些面试和跳槽积累下来的经验,其实有很大一部分属于“不能说的话”,但是,我仍然坚信,这些“不能说的话”往往有其巨大的价值,能够帮助到很多人,所以在这里分享给大家...

HTTP/2 简介

2018-10-13 08:00:00

《HTTP/2 简介》> 2018.11.09,可以看更详细的:https://github.com/jiajunhuang/http2-illustrated最近阅读了一下RFC7540和一部分HTTP/2的Go语言支持实现,故作此记录...

独立运营博客一年的一些数据分享

2018-09-24 08:00:00

《独立运营博客一年的一些数据分享》说是运营,其实都是野生啦。大学时期就开始写博客,但是一直在各个地方分散,有试过Github Repo,Github issue,github.io 托管,然后后来买了VPS,又转换到VPS...

To B(usiness) 和 To C(ustomer)

2018-09-22 08:00:00

《To B(usiness) 和 To C(ustomer)》毕业后第一家公司是做的To B的产品,而后第二家公司是做To C的(社区)服务,现如今是做企业内部服务,如果要归根的话,还是属于To B。简单的描述一下我感受到的To B和To C的区别(典型情况下,并非绝对)...

常见的软件架构套路

2018-09-16 08:00:00

《常见的软件架构套路》本文主要翻译来源:https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013 。有删减。## 分层模式...

Cookie 中的secure和httponly属性

2018-09-16 08:00:00

《Cookie 中的secure和httponly属性》Golang中 `net/http` 的Cookie结构体:```go...

Google Ads使用体验

2018-09-10 08:00:00

《Google Ads使用体验》前段时间闲的蛋疼,就冲了几百块智商税试试Google Ads的效果。于是我选择了系统自动出价,选好关键字之后,一天就把我的钱花完了,于是抱着好奇的态度,再去冲了一些钱,把单次点击最高出价设置成了0.05元每次,然后我的钱现在还在那一分没动...

Go的custom import path

2018-09-07 08:00:00

《Go的custom import path》什么是 custom import path?就是 `package` 后面的注释,注释的内容是 `// import xxxx`。这就是传说中的 custom import path。例如 `Docker` 中的 [代码](https://github.com/moby/moby/blob/master/daemon/configs.go)...

如何挖掘二级子域名?

2018-09-06 08:00:00

《如何挖掘二级子域名?》[DNS](https://zh.wikipedia.org/wiki/%E5%9F%9F%E5%90%8D%E7%B3%BB%E7%BB%9F) 是用来将域名和IP地址相互映射的一个分布式数据库。通常我们打开一个网站的第一步,就是在浏览器里输入 `jiajunhuang.com`,然后浏览器会帮我们填充为 `http://jiajunhuang.com`,暗地里,再加上默认的端口号80,去访问网站,而这一步里进行的操作就包括把 `jiajunhuang.com` 这个域名翻译为具体的IP地址...

Go Module 简明教程

2018-09-03 08:00:00

《Go Module 简明教程》用惯了dep,突然换到 `go mod`,真是不习惯。首先我们执行一下看看有什么效果...

写了一个Telegram Bot:自动化分享高质量内容

2018-09-02 08:00:00

《写了一个Telegram Bot:自动化分享高质量内容》平时我们读到优秀的资源例如文章,视频或者电子书等等,总是会忍不住收藏起来,但是如果我们能分享出来给所有人看到,那会不会更好呢?所以我做了一个Telegram Bot,平时我只要把阅读到的不错的链接分享给我的bot,然后选择性的添加一些我自己的评语(或者叫推荐...

ArchLinux 怎么降级 package ?

2018-09-01 08:00:00

《ArchLinux 怎么降级 package ?》今天我照常升级:`pacman -Syyu`。升级之后发现没法儿愉快的ssh登录了,不论是我从host登录到虚拟机,还是从虚拟机登录到远端VPS。首先我做的事情是确认是谁的问题...

Vim打开很慢,怎么找出最慢的插件?怎么解决?

2018-09-01 08:00:00

《Vim打开很慢,怎么找出最慢的插件?怎么解决?》很久很久以前,YouCompleteMe还只是一般般的卡,现在,YCM(简称,后同)简直是巨卡,巨卡。仔细分析一下自己用Vim的地方:- 写博客...

为什么我选择放弃运营微信公众号?

2018-09-01 08:00:00

《为什么我选择放弃运营微信公众号?》一个网站其实是需要细心去运营的,尤其对于个人技术博客来说,想要留住用户是非常困难的,作为一个技术博客,尤其如此。通常用户来自于...

Web后端工程师进阶指南(2018)

2018-08-29 08:00:00

《Web后端工程师进阶指南(2018)》作为一名后端工程师,毕业两年有余,从实习到现在,回头一看,成长还是有的!所以我把这六年(加大学四年)从入门到进阶的经验整理、总结了一下,分享给大家。本文主要是针对三年以内的,中高级工程师以下的进阶指南。针对读者:大学生,毕业生,初级工程师,中级工程师。如果你是架构师以上,TL;DR,哈哈...

How to implement fork syscall in Golang?

2018-08-28 08:00:00

《How to implement fork syscall in Golang?》[中文版](https://jiajunhuang.com/articles/2018_03_08-golang_fork.md.html)ref: https://github.com/moby/moby/tree/master/pkg/reexec...

macOS ansible 遇到 rsync: --chown=www-data: unknown option

2018-08-28 08:00:00

《macOS ansible 遇到 rsync: --chown=www-data: unknown option》用Ansible同步数据的时候,遇到了错误:```bash...

关于运营的思考-运营要怎么做?

2018-08-26 08:00:00

《关于运营的思考-运营要怎么做?》## 一个血气方刚的故事前段时间一时兴起,建了一个技术交流群,并且把入群的二维码公开在了博客和论坛上,没多久就加了几十个人---虽然自己的博客是个小站,但是还是有那么些读者的嘛...

Python中实现单例模式的n种方式和原理

2018-08-24 08:00:00

《Python中实现单例模式的n种方式和原理》在Python中如何实现单例模式?这可以说是一个经典的Python面试题了。这回我们讲讲实现Python中实现单例模式的n种方式,和它的原理。## 什么是单例模式...

Golang defer中修改返回值

2018-08-23 08:00:00

《Golang defer中修改返回值》我们来看demo:```go...

Python dataclass 源码阅读与分析

2018-08-12 08:00:00

《Python dataclass 源码阅读与分析》## 先来看看如何使用```python...

gRPC-gateway 源码阅读与分析

2018-08-08 08:00:00

《gRPC-gateway 源码阅读与分析》> https://github.com/grpc-ecosystem/grpc-gateway首先看一下要怎么用这个库,README里写着...

如何阅读源代码

2018-08-04 08:00:00

《如何阅读源代码》今天我们来简单的谈谈应该如何去阅读源代码。阅读源代码是每个程序员都要做的事情,毕竟成为master的先前一步,就是 `follow the master`...

我心目中的配置中心应该怎么做?

2018-07-22 08:00:00

《我心目中的配置中心应该怎么做?》最近有使用携程开源的 [apollo](https://github.com/ctripcorp/apollo)。Golang的客户端的使用用法大概是`agollo.GetStringValue("GRPCAddr", "")` 这样...

设计一个HTTP网关

2018-07-18 08:00:00

《设计一个HTTP网关》最近在使用公司的网关,发现一些不好用的地方,加上之前自己有做一个熔断器,其原理其实都差不多,总结一些我心目中的网关应有的特性...

设计一个分布式块存储

2018-07-08 08:00:00

《设计一个分布式块存储》https://github.com/jiajunhuang/hfs最近读了GFS论文,然后想自己造一个轮子出来,毕竟自己的轮子圆又圆...

Linux低电量自动关机

2018-06-24 08:00:00

《Linux低电量自动关机》2019.09.12更新:可以直接使用自带的UPower,编辑 `/etc/UPower/UPower.conf`...

CGO简明教程

2018-06-15 08:00:00

《CGO简明教程》## Hello World```go...

求值策略:Applicative Order vs Normal Order

2018-05-22 08:00:00

《求值策略:Applicative Order vs Normal Order》- https://cs.stackexchange.com/questions/40758/difference-between-normal-order-and-applicative-order-evaluation- https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-10.html#%_sec_1.1.5...

High Performance MySQL阅读笔记

2018-05-17 08:00:00

《High Performance MySQL阅读笔记》![MySQL Architecture](./img/mysql_arch.png) - 第一层是连接处理,授权认证等方面...

MySQL EXPLAIN中的filesort是什么?

2018-05-15 08:00:00

《MySQL EXPLAIN中的filesort是什么?》- https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html#order-by-filesort- https://www.percona.com/blog/2009/03/05/what-does-using-filesort-mean-in-mysql/- http://s.petrunia.net/blog/?p=24...

数据库索引设计与优化

2018-05-13 08:00:00

《数据库索引设计与优化》这是读完了 <高性能MySQL> , <数据库索引设计与优化> 和 MySQL Manual 之后的总结。本文的所有知识都是与MySQL相关的,其他数据库也许有不同...

如何调试?

2018-05-08 08:00:00

《如何调试?》单步跟踪是最常见的调试方法,不过我用的极少,因为效率低。往往也不需要用到这个。接下来我写的几种常见的调试方式,主要针对Go和Python。按难度从容易到难,按效率从高到低...

Docker CE 18.03源码阅读与分析

2018-04-14 08:00:00

《Docker CE 18.03源码阅读与分析》Docker更新的速度太快了。网上很多分析已经过时了。今天我翻了一下Docker的源码,发现其实Docker的源码挺简单易懂的。当然前提是,你已经熟练掌握了Docker,经常用,知道有哪些概念,了解其原理。有了这些做基础,就很容易读了...

容器时代的日志处理

2018-04-12 08:00:00

《容器时代的日志处理》> 这是对目前接触到的日志处理的一个总结## 日志收集...

Golang和Thrift

2018-04-10 08:00:00

《Golang和Thrift》Thrift是一款RPC协议+工具。我们团队选择了Thrift的主要原因是之前gRPC对gevent的支持不够好。目前虽然有支持,但是合并也还没有多久。而Thrift有饿了么搞的一套,相对来说好用一些...

折腾Kubernetes

2018-04-05 08:00:00

《折腾Kubernetes》## 安装哇,在国内安装k8s可就费劲了,因为你懂的网络的原因,各种镜像拉不下来。。。主要是参考以下资料自己...

协程(coroutine)简介 - 什么是协程?

2018-04-03 08:00:00

《协程(coroutine)简介 - 什么是协程?》> 如果涉及到具体的操作系统和CPU等,则为 Linux/amd64## 程序内存布局...

goroutine 切换的时候发生了什么?

2018-03-29 08:00:00

《goroutine 切换的时候发生了什么?》## Goroutine怎么主动让出权力?https://golang.org/pkg/runtime/#Gosched...

Prometheus 数据类型

2018-03-19 08:00:00

《Prometheus 数据类型》> 写博客记一下,老是忘记- Counter: 适用于只增不减的数值,例如请求数,错误数...

Gin源码阅读与分析

2018-03-16 08:00:00

《Gin源码阅读与分析》> 很典型的一个web框架先看简单的demo...

如何面试-作为面试官得到的经验

2018-03-10 08:00:00

《如何面试-作为面试官得到的经验》- 社会很残酷,学历是一块敲门砖,尽管个人认为学历不是硬性要求,但是现实就是如果用合格人选处以其学历等级的人数,学历越高,合格的几率越高,因此很多HR为了节省时间,往往是要求本科以上...

自己写一个容器

2018-03-09 08:00:00

《自己写一个容器》见: https://github.com/jiajunhuang/cup容器技术并不是什么新技术,Docker能如此风行估计是让容器技术降低了使用难度。大概说一下这个demo用到的技术...

Golang(Go语言)中实现典型的fork调用

2018-03-08 08:00:00

《Golang(Go语言)中实现典型的fork调用》[English Version](https://jiajunhuang.com/articles/2018_08_28-how_does_golang_implement_fork_syscall.md.html)## 背景...

软件开发之禅---大事化小,各个击破

2018-02-26 08:00:00

《软件开发之禅---大事化小,各个击破》that's it :)...

程序员的自我修养:链接,装载与库 阅读笔记

2018-02-25 08:00:00

《程序员的自我修养:链接,装载与库 阅读笔记》- 我们可以把内存想象成一个巨大的数组,很久以前的程序是直接在物理内存上进行操作的。 - 程序在运行时访问的地址都是物理地址...

Redis源码阅读与分析二:双链表

2018-02-24 08:00:00

《Redis源码阅读与分析二:双链表》Redis中的双向链表实现属于比较经典的实现,我们直接看代码:```c...

Redis源码阅读与分析三:哈希表

2018-02-24 08:00:00

《Redis源码阅读与分析三:哈希表》直接上代码:```c...

Redis源码阅读与分析一:sds

2018-02-24 08:00:00

《Redis源码阅读与分析一:sds》- sds的定义: `typedef char *sds;`。所以sds是指向一个C字符串的指针。- sds所指向的指针之前有一个头部...

Golang runtime 源码阅读与分析

2018-02-02 08:00:00

《Golang runtime 源码阅读与分析》> 只想简单地写写,就不写的太复杂了。注释都在: https://github.com/jiajunhuang/go- Go的编译方式是静态编译,把runtime直接编译到最终的可执行文件里。首先我们把代码考过来,然后编译出 `go` 这个可执行文件...

Golang的一些坑

2018-01-31 08:00:00

《Golang的一些坑》- 传给 `signal.Notify` 的channel必须是一个buffered channel, 否则收不到信号- channel默认是unbuffered channel, 因此在没有消费者之前, 放入channel的动作都会被阻塞, 例如...

GC 垃圾回收

2018-01-30 08:00:00

《GC 垃圾回收》涉及的技术:- 标记-清除。第一步,从一些对象出发(这部分通常称之为root),例如线程内的栈,将引用到的对象做标记。此后,通过第二步...

设计一个路由

2018-01-28 08:00:00

《设计一个路由》简单地说一下常见的路由形式。- 数组存储。按照添加路由的顺序存储在数组中,查找时依次匹配。这种路由效率比较低。tornado就是这么设计的...

Go语言性能优化实战

2018-01-22 08:00:00

《Go语言性能优化实战》**过早优化是万恶之源,这里都是黑魔法,不是性能瓶颈慎用**- 根据pprof数据优化...

那些年开发的时候踩过的坑

2018-01-14 08:00:00

《那些年开发的时候踩过的坑》- 可能发生的错误一定会发生,所以能尽早想到,就尽早采取措施预防- 系统默认的环境被人改了,例如有人默认把 `python` 指向了2或者3...

(关系型)数据库优化总结

2018-01-08 08:00:00

《(关系型)数据库优化总结》> 来自高性能MySQL, 数据库索引设计与优化, 和MySQL官方文档。总的来说,数据库优化是一门艺术,需要不断的去探索,这篇博客是前段时间学习以上三份资料时所做的笔记...

动态规划民科教程

2018-01-04 08:00:00

《动态规划民科教程》> 这是我本人近段时间学习和练习动态规划的总结,因为本人不是练过ACM的,所以自称民科。文章末尾是一些有用的引用。动态规划(Dynamic Programming),一听就是一个高大上的词语,我们先来看看维基百科是怎么说的...

Golang 分布式异步任务队列 Machinery 教程

2017-12-30 08:00:00

《Golang 分布式异步任务队列 Machinery 教程》Golang的分布式任务队列还不算多,目前比较成熟的应该就只有 [Machinery](https://github.com/RichardKnop/machinery) 了。这篇文章里我们简略的看一下Machinery怎么用。但是我们首先简单介绍一下异步任务这个概念...

使用geohash完成地理距离计算

2017-12-27 08:00:00

《使用geohash完成地理距离计算》geohash的原理是使用二分法,把当前的经度和纬度和最大最小的经度纬度进行无限二分,在一边则为0,否则为1,这样就可以定位到地球上的每一个点了。然后把经度放在偶数位,纬度放在奇数位,组成一个01010101串。如果想变得更容易传输,可以用某种方式进行hash,例如 `base32`, `base64` 等...

2018年就要到了,这一年都做了什么呢?

2017-12-20 08:00:00

《2018年就要到了,这一年都做了什么呢?》一年又这么过去了,到年底的时候就应该总结一下过去的一年做了哪些事情,学到了什么,悟到了什么,有什么是需要改进的。2017年,要说发生的重大事情,第一是,发现自己原来想做的是高性能自研软件的研发,想成为技术专家,而不是CRUD程序员...

算法导论阅读笔记 --- 排序算法

2017-12-02 08:00:00

《算法导论阅读笔记 --- 排序算法》> 这篇文章是我在学习算法导论之后的笔记排序算法,无论是在工作上还是面试中,都是经常遇到的问题。话不多说,我们一个一个来回忆。为了方便理解,我们总是假设输入的...

短链系统的实现

2017-11-29 08:00:00

《短链系统的实现》简单的代码在:https://github.com/jiajunhuang/links其中主要的就是,通过 https://github.com/jiajunhuang/links/blob/master/codes.go#L9...

Git HTTPS 如何保存密码

2017-11-29 08:00:00

《Git HTTPS 如何保存密码》读了一下 `git-credential-store` 的manual。在项目下执行 `git config credential.helper store` 然后 `git push` 输入密码之后,家目录下就会多出一个文件...

程序员修炼之道 阅读笔记

2017-11-13 08:00:00

《程序员修炼之道 阅读笔记》> 本文是程序员修炼之道的阅读笔记和自己的经历以及思考- 提供各种选择,不要找蹩脚的借口...

Python开发实践经验

2017-11-04 08:00:00

《Python开发实践经验》> 这是我在公司项目中写下的约定, 该项目使用Python3开发, 分享出来, 希望对大家也会有一些帮助- 项目杜绝循环引用, 包之间的引用关系为(`->` 表示被引用)...

Golang实现平滑重启(优雅重启)

2017-10-25 08:00:00

《Golang实现平滑重启(优雅重启)》> 平滑重启,也叫优雅重启,热重启,平滑升级,热升级,热更新等等。最近在看traefik的源代码, 看到其中有一个功能是平滑重启, 不过他是通过一个叫做 [graceful](https://github.com/tylerb/graceful)...

traefik 教程

2017-10-24 08:00:00

《traefik 教程》traefik 是一个HTTP层面的反向代理和负载均衡, 用Go编写, 有的功能包括:- 没有依赖...

Web开发系列(十):事务和锁

2017-10-19 08:00:00

《Web开发系列(十):事务和锁》## 事务事务,有哪四个特性?想必十有八九在面试中问过这个问题...

Nginx作为TCP/UDP的负载均衡

2017-10-19 08:00:00

《Nginx作为TCP/UDP的负载均衡》从Nginx 1.9开始,nginx也可以支持TCP/UDP的负载均衡,当然前提是编译的时候把stream这个模块编译进去了,可以通过 `nginx -V` 来查看是否有...

Web开发系列(九):消息队列,异步任务

2017-10-19 08:00:00

《Web开发系列(九):消息队列,异步任务》有这样一个需求,第三方请求向我们的用户发送一个推送消息。我们必须尽快响应第三方:你的请求我们收到了,但是第三方又想知道结果。一种办法是等,第三方等我们的系统处理好了,然后返回结果给他。这样做有个优点,代码逻辑简单,但是缺点似乎更大,因为用户要等待结果,所以这个TCP连接是不会断掉的,也就意味着,如果请求的并发量比较大,那么对我们的系统负载是非常高的,因为要...

Web开发简介系列

2017-10-19 08:00:00

《Web开发简介系列》这个系列是我用来总结从实习到现在这一年半里接触到的web开发相关知识用的,主要是从后端开发的视角去看。从大体上分为两部分,简介部分和扩展部分。简介部分主要是从各个角度说明web开发中需要用到的一些东西,而扩展部分则是对简介部分没有讲到的东西的补充和讲到的东西的深入。以下是提纲(简介部分已经完成,扩展部分我会依次写完并且更新超链接)...

Web开发系列(十一):数据库扩展

2017-10-19 08:00:00

《Web开发系列(十一):数据库扩展》常见的MySQL数据库扩展方式有:- 读写分离:这种情况适用于读远大于写的情况,读越多,就可以分出越多的从库。从库是只读的,主则负责所有的写入。主和从之间...

Nginx 请求匹配规则

2017-10-18 08:00:00

《Nginx 请求匹配规则》当一个请求到来,nginx首先会检查请求的目标ip地址和端口与哪一个规则里listen的部分相匹配。如果同一个ip和端口中匹配了多个虚拟的server块,nginx将会测试HTTP请求中 `Host`头部的值和nginx配置文件中 `server_name` 的值。如果一个 `Host` 匹配到了多个 `server_name`,那么nginx...

Web开发系列(六):关系型数据库,ORM

2017-10-18 08:00:00

《Web开发系列(六):关系型数据库,ORM》数据库,web开发中总是离不开这个核心应用,可以说web开发的核心就是数据库。但数据库是一个泛称,通常我们说的数据库是指关系型数据库,此外还有非关系型数据库。在这篇文章中,我们单指关系型数据库...

Web开发系列(七):缓存,CDN

2017-10-18 08:00:00

《Web开发系列(七):缓存,CDN》## 缓存如果有一个GET请求,每秒钟有10k请求,但是10s钟才需要刷新一次,你会让内容服务器不停地处理这类请求吗?...

Web开发系列(八):单点故障,负载均衡

2017-10-18 08:00:00

《Web开发系列(八):单点故障,负载均衡》试想我们有一个内容服务器,假设是监听在 `192.168.1.1:8000` 上,我们所有的请求都打到这上面,那么这个进程或者机器挂了怎么办?因此有一个新的概念,叫做 [单点故障](https://en.wikipedia.org/wiki/Single_point_of_failure)。即,只要我们这唯一的,仅有的...

Web开发系列(五):form, json, xml

2017-10-17 08:00:00

《Web开发系列(五):form, json, xml》## 旧石器时代:表单很久以前的web开发是怎么一个工作模式呢?那时候的前端不像现在的前端,那时候的前端基本上就是熟练CSS和HTML就可以了,JS要求其实...

Web开发系列(四):Flask, Tornado和WSGI

2017-10-16 08:00:00

《Web开发系列(四):Flask, Tornado和WSGI》如 [上篇](https://jiajunhuang.com/articles/2017_10_14-web_dev_part2.md.html) 所讲,作为一个web服务器,我们需要建立socket连接,并且监听在指定端口,当请求来到时我们要解析请求的内容,做出判断,给出响应,然后关闭连接,进行下一个服务...

Web开发系列(三):什么是HTML,CSS,JS?

2017-10-15 08:00:00

《Web开发系列(三):什么是HTML,CSS,JS?》这篇博客要写的内容比较无聊,属于概念性的东西,我们介绍一下web开发中无法避开的三个东西,HTML,CSS和JS。HTML全称是Hypertext Markup Language,也是一种格式,或者说一种约定,大概张这样子...

Web开发系列(二):HTTP协议

2017-10-14 08:00:00

《Web开发系列(二):HTTP协议》在上一次我们介绍TCP协议的最后([点这里](https://jiajunhuang.com/articles/2017_08_12-tcp_ip.md.html)),我们简单的看了一下HTTP协议大概长什么样:当我们输入 `GET / HTTP/1.1` 回车之后,终端里便回显出服务器所返回的内容。今天我们更详细一点的看一看HTTP协议...

Web开发系列(一):从输入网址到最后,这个过程经历了什么?

2017-10-13 08:00:00

《Web开发系列(一):从输入网址到最后,这个过程经历了什么?》这个问题,其实非常非常非常的大,涉及到的知识点和细节非常的多。不过我们适度的抛去一些无关紧要的细节,例如在PC上用键盘输入还是在手机上用触屏输入这种...

SNI: 让Nginx在一个IP上使用多个证书

2017-10-11 08:00:00

《SNI: 让Nginx在一个IP上使用多个证书》近几天,准备在nginx给多个域名配证书,原想着在不同的server下配不同的证书是多么自然的一件事情啊。然后老大跟我说不能,这样会收不到请求,我说为啥呢?...

Haskell: infixl, infixr, infix

2017-09-27 08:00:00

《Haskell: infixl, infixr, infix》> https://www.haskell.org/onlinereport/decls.html#fixityinfix,infixl,infixr是Haskell中给运算符定义优先级操作用的...

Haskell简明教程(五):处理JSON

2017-09-26 08:00:00

《Haskell简明教程(五):处理JSON》> 这一系列是我学习 `Learn You a Haskell For Great Good` 之后,总结,编写的学习笔记。这个系列主要分为五个部分...

Haskell简明教程(四):Monoid, Applicative, Monad

2017-09-25 08:00:00

《Haskell简明教程(四):Monoid, Applicative, Monad》> 这一系列是我学习 `Learn You a Haskell For Great Good` 之后,总结,编写的学习笔记。这个系列主要分为五个部分...

HTTPS 的详细流程

2017-09-22 08:00:00

《HTTPS 的详细流程》> 之前有专门研究了一下HTTPS的具体工作流程,不过因为不是天天需要回忆,很快就忘了> 所以现在专门写一篇博客记录下来,不过内容翻译自 [这里](http://blogs.getcertifiedgetahead.com/understanding-https-process-security/)...

OAuth2 为什么需要 Authorization Code?

2017-09-21 08:00:00

《OAuth2 为什么需要 Authorization Code?》emm。。。今天我搜了一下OAuth2的流程,发现无论是中文还是英文,一上来都是跟你讲,一共是五个步骤blablabla。。。我就在想,为啥不能不要五步,OAuth2为什么中间需要一个 Authorization Code 呢?为什么不能直接...

任务队列怎么写?python rq源码阅读与分析

2017-09-20 08:00:00

《任务队列怎么写?python rq源码阅读与分析》rq的意思是 Redis Queue。这个项目和redis是强结合的,此外还有一个重度依赖是pickle。这是这个项目很简单的原因之一...

XMonad 配置教程

2017-09-19 08:00:00

《XMonad 配置教程》我已经用XMonad作为窗口管理器好几年了,XMonad非常稳定,但是中文里一直都没有一篇比较好懂的XMonad配置教程,我想可能的原因是XMonad的门槛比较高---配置需要懂一点Haskell...

Haskell简明教程(三):Haskell语法

2017-09-18 08:00:00

《Haskell简明教程(三):Haskell语法》> 这一系列是我学习 `Learn You a Haskell For Great Good` 之后,总结,编写的学习笔记。这个系列主要分为五个部分...

Haskell简明教程(二):从命令式语言进行抽象

2017-09-17 08:00:00

《Haskell简明教程(二):从命令式语言进行抽象》> 这一系列是我学习 `Learn You a Haskell For Great Good` 之后,总结,编写的学习笔记。这个系列主要分为五个部分...

Haskell简明教程(一):从递归说起

2017-09-11 08:00:00

《Haskell简明教程(一):从递归说起》> 这一系列是我学习 `Learn You a Haskell For Great Good` 之后,总结,编写的学习笔记。这个系列主要分为五个部分...

2017年必装的VIM插件推荐

2017-09-03 08:00:00

《2017年必装的VIM插件推荐》> 其实,我是用 [neovim](https://github.com/neovim/neovim) 的 :)- vim-plug...

TCP/IP简明教程 - 从零构建TCP/IP协议(二)连接,断开与拥塞控制

2017-09-02 08:00:00

《TCP/IP简明教程 - 从零构建TCP/IP协议(二)连接,断开与拥塞控制》> 这是第二篇,主要讲三次握手,四次挥手,滑动窗口,拥塞控制## 回顾...

TCP/IP简明教程 - 从零构建TCP/IP协议(这次叫PCT协议)

2017-08-12 08:00:00

《TCP/IP简明教程 - 从零构建TCP/IP协议(这次叫PCT协议)》> 这篇博客是读完《图解TCP/IP协议》和《TCP/IP协议详解卷一:协议》之后的总结我从0构建了一个可靠的双工的有序的基于流的协议,叫做PCT协议 :)...

Lua Manual 阅读笔记

2017-08-09 08:00:00

《Lua Manual 阅读笔记》- 关键字:```...

Golang Map 源码阅读与分析

2017-07-27 08:00:00

《Golang Map 源码阅读与分析》我们知道哈希表解决冲突一般要么是开放定址法,要么是再哈希法。Golang采用的是第一种,但是实现上和教科书式的实现方式不同。这也是很有趣的一个东西,就像之前看Python的 [deque](https://github.com/jiajunhuang/blog/blob/master/articles/2017_01_06-collections_source_code.md#deque) 一样,和教科书不一样,非常高效的实现方式...

MySQL 零碎知识 - MySQL必知必会

2017-07-26 08:00:00

《MySQL 零碎知识 - MySQL必知必会》> 重读《MySQL必知必会》- `DISTINCT` 作用于其后面的所有列...

Golang slice 源码阅读与分析

2017-07-18 08:00:00

《Golang slice 源码阅读与分析》翻Golang代码:```go...

经典好书推荐(2017)

2017-07-15 08:00:00

《经典好书推荐(2017)》大学到现在还是看到了一些好书的,主要还是感谢豆瓣和亚马逊,但是上面的评论和自己实际看下来的感受还是有些差别的...

Golang log库 源码阅读与分析

2017-07-11 08:00:00

《Golang log库 源码阅读与分析》Golang的log库。。。还是太简单,简单瞄了一下实现,差不多就是这样:```go...

毕业后一年

2017-07-02 08:00:00

《毕业后一年》![jxufe](./img/jxufe.jpg)去年的这个点,约莫我已经打包回家了。记得我是倒数第二个走的,帮室友搬着东西,目送...

ansible 简明教程

2017-06-22 08:00:00

《ansible 简明教程》ini格式的配置文件大家都懂吧。先编写一个host文件例如...

自己写个搜索引擎

2017-06-02 08:00:00

《自己写个搜索引擎》搜索引擎最核心的地方在于倒排索引,而倒排索引其实并不是一种具体的数据结构,确切的来说是一类。这个实现中使用Golang中的 `map` 来做倒排索引,全部代码如下...

HTTP 路由的两种常见设计形式

2017-05-24 08:00:00

《HTTP 路由的两种常见设计形式》- 线性型基本上是类似于用一个list保存路由的正则表达式,每次将url拿去匹配然后找到handler...

Golang的short variable declaration

2017-05-12 08:00:00

《Golang的short variable declaration》Go中,常规声明方式为```golang...

Greenlet和Stackless Python

2017-04-26 08:00:00

《Greenlet和Stackless Python》粗略看了一下实现,和Golang的实现基本属于相同的原理,即在堆里模拟栈,一个真正的线程栈同时配套n个模拟栈,每次真正在运行的只有一个。但是和Golang的相比,还是差远了,例如Golang有Work Stealing,多线程所以拥有多个线程栈栈(Python也有但是。。。)...

写一个简单的ORM

2017-04-25 08:00:00

《写一个简单的ORM》最近在研究SQLAlchemy源码,自己造个轮子先(当然,SQLAlchemy远比这里复杂)```python...

从源码看Python的descriptor

2017-04-19 08:00:00

《从源码看Python的descriptor》descriptor是Python初学者比较不好懂的概念之一,再加上官网文档说的也不是很清楚,就更容易让人误解了。但是源码总不会说不清楚,所以我们从源码看清楚descriptor到底在干啥...

Python字符串格式化

2017-04-16 08:00:00

《Python字符串格式化》说来惭愧,用Python这么久了,还没有系统的看过字符串格式化的文档,因为常用的也就那么几个。这篇文章就总结一下Python的字符串格式化...

Gunicorn 简明教程

2017-04-08 08:00:00

《Gunicorn 简明教程》Gunicorn是Python下的一个WSGI服务器,听起来很普通,不过因为它支持很多特性,在Python界还是很流行,例如作为起Flask的父进程,支持用gevent把Flask打个patch等...

Raft 论文阅读笔记

2017-03-29 08:00:00

《Raft 论文阅读笔记》Raft是用来保证集群数据一致性的协议或者说算法。特点:- Strong leader...

什么是 Golang Comparable Types

2017-03-06 08:00:00

《什么是 Golang Comparable Types》Golang 中有很多时候要用到comparable types,例如比较struct的时候,例如map里的key。弄清楚有哪些类型是comparable的非常重要...

GFS 论文阅读

2017-03-02 08:00:00

《GFS 论文阅读》- 预期背景 - Component failures are the norm rather than the exception. So constant...

MapReduce 论文阅读

2017-03-02 08:00:00

《MapReduce 论文阅读》> MIT 6.824- Users specify a map function that processes a key/value pair to generate a...

一起来做贼:Goroutine原理和Work stealing

2017-02-24 08:00:00

《一起来做贼:Goroutine原理和Work stealing》最近在看Goroutine的实现原理,用户空间实现的并发模型。在用户空间进行调度不比在内核级别,因为内核可以通过CPU中断夺回控制权,但是用户空间把控制权交给一段代码之后,需要那段代码主动交出权力才可以。当然也可以通过一些trick,例如编译...

Go语言的defer, panic和recover

2017-02-15 08:00:00

《Go语言的defer, panic和recover》> 本文源自 https://blog.golang.org/defer-panic-and-recover## defer...

再读 Python Language Reference

2017-01-24 08:00:00

《再读 Python Language Reference》https://docs.python.org/3.6/reference/ 重读笔记。## Lexical analysis...

再读vim help:vim小技巧

2017-01-24 08:00:00

《再读vim help:vim小技巧》- `ZZ` 相当于 `:wq`- Normal模式下`a`相当于反向的`i`,i把字符插入到光标前,a插到光标后...

设计模式(2)- 深入浅出设计模式 阅读笔记

2017-01-22 08:00:00

《设计模式(2)- 深入浅出设计模式 阅读笔记》## 命令模式命令模式就是不改变原有代码,而在原有代码的基础之上封装一层,为每个命令创建一个...

设计模式(1)- 深入浅出设计模式 阅读笔记

2017-01-21 08:00:00

《设计模式(1)- 深入浅出设计模式 阅读笔记》> 将会使用Java和Python。其中Java实现可能比较业余,但是仍然使用Java,> 因为很多设计模式在Java中更容易看清楚...

Cython! Python和C两个世界的交叉点

2017-01-15 08:00:00

《Cython! Python和C两个世界的交叉点》最近一周都没有发博客,因为发现一个好玩的东西---Cython!这周一直在研究这个。虽然了解C和Python之后学Cython,语法上很简单,但是为了探究它为何能快起来,还是翻了蛮多的代码并且做了测试的...

socketserver 源码阅读与分析

2017-01-09 08:00:00

《socketserver 源码阅读与分析》首先看到文件上半部分的注释,讲清楚了这个module里的类继承关系。```...

functools 源码阅读与分析

2017-01-08 08:00:00

《functools 源码阅读与分析》functools主要包括这几个东西: `wraps`, `partial`, `lru_cache`, 还有一些内置帮助函数例如 `c3_mro`。我们主要看上面三个...

contextlib代码阅读

2017-01-07 08:00:00

《contextlib代码阅读》首先我们要知道 [with协议](https://www.python.org/dev/peps/pep-0343/)。然后我们看看 `class _GeneratorContextManager(ContextDecorator, AbstractContextManager):`...

Collections 源码阅读与分析

2017-01-06 08:00:00

《Collections 源码阅读与分析》## dequedeque并不是普通的教科书式的双链表实现。经典实现是...

Redis通信协议阅读

2017-01-06 08:00:00

《Redis通信协议阅读》最近要搞搞redis的通信协议,先阅读一下官方文档,记录一下。## 应答模型...

2016年就要结束了,2017年就要开始啦!

2016-12-31 08:00:00

《2016年就要结束了,2017年就要开始啦!》2016年就结束啦!这一年经历的最大的事情就是身份的转变-----从大学生变成了社会人。1月底离开了实习的公司,非常感谢杨总和欧吧对我的教导,大可同学和校长同学对我的...

unittest 源代码阅读

2016-12-29 08:00:00

《unittest 源代码阅读》又是和单元测试有关的代码的阅读 :smile:## unittest 源码以及注释...

APUEv3 - 重读笔记

2016-12-26 08:00:00

《APUEv3 - 重读笔记》重读APUE,获益良多。## 第一章,UNIX基础知识...

Mock源码阅读与分析

2016-12-22 08:00:00

《Mock源码阅读与分析》写单元测试的时候,经常要借助Mock来完成某些替换,鉴于Python的动态性,Python中写单元测试还是很方便的。但是需要吐槽的是,也是因为Python的动态性,Python的功能必须要由高覆盖率的测试来保证...

Thinking in Python

2016-12-16 08:00:00

《Thinking in Python》每学习一门语言,就总会想找到它的 `core`。对于Python,我认为是它的 `core` 是字典。无论从 `CPython` 实现上或者是平时使用时的类机制,都能体会到Python中字典的作用。但是这篇文章不是什么教程或者学习体会。只是一些杂言。TL;DR...

我的代码进CPython标准库啦

2016-12-15 08:00:00

《我的代码进CPython标准库啦》smile: 最近在阅读CPython的C实现和一部分标准库实现,读到Mock的时候,发现了代码并不是想象中的优美,遂修改了一部分代码,提交上去。虽然是简单的几行代码但是一想到自己写的代码包含在全世界那么多人用的语言的标准库里,就有点小激动~...

Python零碎小知识

2016-12-09 08:00:00

《Python零碎小知识》今天读Mock的源代码,发现的几个新玩意儿。以后读代码发现了也记这里吧 :smile:- dict有个 `setdefault` 方法,`dict.setdefault(key, default)` 相当于...

Python和单元测试

2016-12-07 08:00:00

《Python和单元测试》以前我是不写任何测试的,后来偶尔写单元测试,现在我主动写单元测试 ----- 不得不承认,测试是有其存在必要性的,要说为什么的话,大概又会引发语言的强弱类型和是否静态语言之争了吧...

工作一年的总结

2016-12-07 08:00:00

《工作一年的总结》算上实习的时间,工作也有一年了呢,幸运的是,实习的时候有大神带我,正式工作之后又有许多东西来磨练...

Python 的继承

2016-12-06 08:00:00

《Python 的继承》## MROPython在2.3之后引入了新的继承方式,同时也带来了新的 `MRO - the C3 method resolution order`...

MongoDB 的一些坑

2016-12-06 08:00:00

《MongoDB 的一些坑》- 由于是文档型数据库,不像关系型数据库一样有规范的field。举个贴近生活的例子, 关系型数据库就像是一张Excel表格,所有的列都是统一的;而MongoDB就像是把json 存在一个txt文件里。**用成怎样全靠自觉啊!!!**...

Python的yield关键字有什么作用?

2016-11-29 08:00:00

《Python的yield关键字有什么作用?》我是从 `python 2.7` 开始接触的,要说python的各种历史,我还真的说不出来。不过好在有 `peps` 记录了python的发展和进化。今天我们来挖挖 `yield` 的历史...

借助coroutine用同步的语法写异步

2016-11-27 08:00:00

《借助coroutine用同步的语法写异步》首先我们构造一个耗时足够久的服务器:```python...

Python3函数参数中的星号

2016-11-21 08:00:00

《Python3函数参数中的星号》最近在看asyncio的代码,看到一个新的用法,查阅完文档之后,发现,在定义函数的参数列表中,`*` 后的参数,调用者必须以 ``key=value`` 形式调用。因为平时看到的都...

使用Git Hooks

2016-11-08 08:00:00

《使用Git Hooks》最近的工作就是,写文档!用markdown来写,然后要遵循一定的格式。之前都是我写好我负责的一部分,然后打包发送给项目负责人,因为...

Token Bucket 算法

2016-11-05 08:00:00

《Token Bucket 算法》最近在看celery代码,看到worker的代码,发现了tocket bucket算法,自己之前还一直在想像有些API对调用次数有限制是怎么做到的,看完才发现,原来是这么朴素的算法...

nginx配置笔记

2016-11-03 08:00:00

《nginx配置笔记》nginx变量-----------...

阅读Flask源码

2016-09-15 08:00:00

《阅读Flask源码》看到很多人推荐新手去阅读Flask,但其实个人并不推荐,因为单说Flask的话,代码量确实很少,但是Flask完全建立在Werkzeug之上,如果把Werkzeug的代码加起来,代码量...

尤克里里

2016-08-25 08:00:00

《尤克里里》 image:: img/ukulele.jpg...

学习使用Bootstrap4的栅格系统

2016-06-20 08:00:00

《学习使用Bootstrap4的栅格系统》响应式布局,在n年前被炒的火热火热的,因为前端的代码只需要写一次,却可以在各种分辨率的屏幕上显示,确实是个好东西。不过前端的东西总是变的比摩尔定律还快,现...

利用Github的WebHook完成自动部署

2016-06-19 08:00:00

《利用Github的WebHook完成自动部署》之前我写了一个用rst来写博客的项目,但是每次写完都要自己push,然后到服务器pull。再加上我采取的方式是把原来的写博客的repo作为这个项目的submodule。每次手动那就...

使用Tornado和rst来写博客

2016-06-18 08:00:00

《使用Tornado和rst来写博客》为什么用rst-------------...

Haskell do notation

2016-06-05 08:00:00

《Haskell do notation》从普通的语言切换过来的时候,看到return总是让人费解。因为Haskell中的return根本就不是普通语言中的return。这篇文章是看完Haskell Wiki [#]_ 以后写的一...

foldl 和 foldr 的变换

2016-05-22 08:00:00

《foldl 和 foldr 的变换》foldl 和 foldr 的类型签名为...

Haskell TypeClass 笔记

2016-05-05 08:00:00

《Haskell TypeClass 笔记》这是Haskell Wiki上的 `一篇文章 `_ ,以下是我的学习笔记...

重新捡起你那吃灰的树莓派

2016-04-03 08:00:00

《重新捡起你那吃灰的树莓派》最近在考驾照,没大块时间看书了,就拿起我那吃灰了1年的树莓派出来耍耍...

Tornado 源码阅读

2016-03-14 08:00:00

《Tornado 源码阅读》准备开始学习django的文档和源代码了,先总结一下看tornado源码的收获,防止忘记。这里写的是tornadov1.2的代码,因为我看了一遍4.3版本,和1.2思路相差不大,只是...

JavaScript权威指南笔记

2016-03-06 08:00:00

《JavaScript权威指南笔记》- 声明变量不带var,JS会在全局对象中创建一个同名属性,坑爹...

Python零碎知识汇总

2016-03-05 08:00:00

《Python零碎知识汇总》 这些都是我在文档里阅读到或者是在网上看到的,不足以成文却值得注意的知识...

C语言的位操作

2016-02-06 08:00:00

《C语言的位操作》以下所有都是针对64位机来说的...

分治

2016-01-25 08:00:00

《分治》Divide and Conquer. 在之前读 `Eric Roberts` 先生所著的`Thinking Recursively` 之后写过几句小总结,那本小书介绍了如何以递归的角度去...

关于python的decorator和descriptor

2015-12-05 08:00:00

《关于python的decorator和descriptor》一提到python,大家都会说,这门语言很简单。对有编程经验的人来说,python的语法确实能够在两小时内掌握,但是python这么强大,必然是有一些不那么容易掌握的东西的...

程序设计实践笔记

2015-10-09 08:00:00

《程序设计实践笔记》Style-------...

Thinking Recursively

2015-09-05 08:00:00

《Thinking Recursively》在之前阅读 `Eric Roberts `__ 先生所著的`《C程序设计的抽象编程》 `__ (个人觉得是本好书)...

Block I/O

2015-06-22 08:00:00

《Block I/O》- | The difference (between character device and block device) comes down to...

如何解读c的声明

2015-03-17 08:00:00

《如何解读c的声明》2015-03-17 更新:~~~~~~~~~~~~~~~~~...

关于输入法的猜想

2015-01-11 08:00:00

《关于输入法的猜想》每逢期末便是大作业、答辩涌来之时...

C语言与抽象思维

2014-12-12 08:00:00

《C语言与抽象思维》Part I------...

C注意事项

2014-11-04 08:00:00

《C注意事项》2014-11-04:~~~~~~~~~~~...

C语言中点操作符(.)和箭头操作符(->)的不同之处

2014-09-09 08:00:00

《C语言中点操作符(.)和箭头操作符(->)的不同之处》自己写一个简单的uname, 要用到utsname结构体, 编译报错如下...

征服C指针笔记 - 数组和指针的微妙关系

2014-09-07 08:00:00

《征服C指针笔记 - 数组和指针的微妙关系》在以前的程序中, 指针确实比数组下标访问更快,但是现在的cpu速度更快,编译器优化更好(循环计数是编译器优化的基本内容)...

关于文件权限的摘记

2014-08-22 08:00:00

《关于文件权限的摘记》在unix中, 文件权限是一个很重要的特征, 决定了对一个文件的读, 写,执行操作是否可以进行, 基础的相关知识就不重复说明, 在APUE中有如下摘要...

用crontab完成自动化

2014-06-17 08:00:00

《用crontab完成自动化》在我看来, 计算机就是为了帮人类完成一些繁琐的事情而生的, 而linux更是如此,所以我们要充分利用自动化...