谈一次单元测试驱动代码重构 目前团队并没有QA岗,而且在很长一段时间内,可能也不会设立QA岗,所以我们需要RD保证代码的质量。而鉴于人类天生的“惰性”,很多时候质量完全依赖于作者的能力以及职业素质。于是我在团队内推动单元测试,并要求提升测试覆盖率。虽然单元测试不能“根治”bug,但是它可以驱使代码结构简洁可测,为提升测试代码覆盖率奠定基础,从而可以有效降低bug率。(转载请指明出于breaksoftware的csdn博客) 以下我将以工作中一个实际例子讲解如何将一个不可测代码变成更加合理且可测代码。...
AWS攻略——使用CodeBuild进行自动化构建和部署Lambda(Python) Aws Lambda是Amazon推出的“无服务架构”服务。我们只需要简单的上传代码,做些简单的配置,便可以使用。而且它是按运行时间收费,这对于低频访问的服务来说很划算。具体的介绍可以常见aws lambda的官网。(转载请指明出于breaksoftware的csdn博客) 比较正统的方法是使用Aws CloudFormation方案,但是鉴于这个方案过于复杂,所以我们还是借助CloudBuild的自定义命令来解决。 本文适用于熟悉在Aws Lambda人...
AWS攻略——使用CodeBuild进行自动化构建和部署静态网页 首先声明下,使用“CodeBuild”部署并不是“正统”的方案,因为AWS提供了“CodeDeploy”。如果不希望引入太多基础设施,可以考虑直接使用CodeBuild进行部署。(转载请指明出于breaksoftware的csdn博客)创建构建项目 kronos是我们项目的名称,因为之前已经建好测试环境,所以本次我们使用“online”作为其属性。 因为需要通过一套代码去自动化构建和部署,还要区分“生产”和“测试”环境,所以我们引入...
AWS攻略——使用S3托管静态网页 在AWS上有很多部署静态网页的方式,比如使用EC2或者Lightsail。但是不管使用上述哪种方案,都需要预先部署如Nignx或者Apache等Http服务。这对纯前端同学来说可能有点复杂,而AWS提供了更简单的部署方式——只需要提供静态网页文件的“S3网页托管服务”。(转载请指明出于breaksoftware的csdn博客) 本文将带大家熟悉一下该方案的实施步骤。创建存储桶 因为S3管理页面是不分区的——“全球”,所以在创建存储桶时,需要指定该存储桶...
AWS攻略——使用CodeCommit托管代码 除了我们熟悉的github,各大云厂商也有自己的代码托管服务。本文讲解如何在Amazon的CodeCommit中托管代码。根账户登录 AWS有两种账户登录界面。IAM账户登录界面 根账户登录界面 我们先使用根账户登录。IAM 我们需要定义一些IAM(Identity and Access M...
bug诞生记——信号(signal)处理导致死锁 这个bug源于项目中一个诡异的现象:代码层面没有明显的锁的问题,但是执行时发生了死锁一样的表现。我把业务逻辑简化为:父进程一直维持一个子进程。(转载请指明出于breaksoftware的csdn博客) 首先我们定义一个结构体ProcessGuard,它持有子进程的ID以及保护它的的锁。这样我们在多线程中,可以安全的操作这个结构体。#include <st...
bug诞生记——不定长参数隐藏的类型问题 这个bug的诞生源于项目中使用了一个开源C库。由于对该C库API不熟悉,一个不起眼的错误调用,导致一系列诡异的问题。最终经过调试,我们发现发生了内存覆盖问题。为了直达问题根节,我将问题代码简化如下(转载请指明出于breaksoftware的csdn博客)#include <iostream>#include <stdarg.h>enum type...
C++拾取——stl标准库中集合交集、并集、差集、对称差方法 STL库中有丰富的集合运算方法,我们可以使用它们快速完成交集、并集、差集、对称差集的运算。(转载请指明出于breaksoftware的csdn博客)交集(intersection) 交集是集合运算中经常会用到的计算,其表达是两个集合共有的部分(图中红色区域) STL中有set_intersection方法可以实现该功能。它是C++17开始...
使用libev监视文件夹下文件(夹)属性变动的方案和实现 在《libev源码解析》系列中,我们分析了libev的基本原理。本文我们介绍一套使用libev封装的文件(夹)变动监视方案和实现。(转载请指明出于breaksoftware的csdn博客) 我们先看个最简单方案,下面的代码会监视/home/work下文件(夹)的新增、删除等操作。void call_back(ev::stat &w, int reve...
Golang反射机制的实现分析——reflect.Type方法查找和调用 在《Golang反射机制的实现分析——reflect.Type类型名称》一文中,我们分析了Golang获取类型基本信息的流程。本文将基于上述知识和经验,分析方法的查找和调用。(转载请指明出于breaksoftware的csdn博客)方法package mainimport ( "fmt" "reflect")type t20190107 struct { ...
Golang反射机制的实现分析——reflect.Type类型名称 现在越来越多的java、php或者python程序员转向了Golang。其中一个比较重要的原因是,它和C/C++一样,可以编译成机器码运行,这保证了执行的效率。在上述解释型语言中,它们都支持了“反射”机制,让程序员可以很方便的构建一些动态逻辑。这是C/C++相对薄弱的环节,而Golang却有良好的支持。本系列,我们将通过反汇编Golang的编译结果,探究其反射实现的机制。(转载请指...
C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率 布隆过滤器是一种判定元素是否存在于集合中的方法。其基本原理是使用哈希方法将数据映射到一个很长的向量上。在维基百科上,它被称为“空间效率和查询时间都远远超过一般的算法”的方法。由于它只保存散列的数据,所以对于很长的数据有着良好的压缩特性,这个是个不争的事实(可以参见《布隆过滤器 (Bloom Filter) 详解》)。但是其查询效率究竟如何,我们还是要实际测试一下。(转载请指明出于b...
Gin源码解析和例子——中间件(middleware) 在《Gin源码解析和例子——路由》一文中,我们已经初识中间件。本文将继续探讨这个技术。(转载请指明出于breaksoftware的csdn博客) Gin的中间件,本质是一个匿名回调函数。这和绑定到一个路径下的处理函数本质是一样的。 再以Engine的Default方法为例func Default() *Engine { debugPrin...
Gin源码解析和例子——路由 Gin是一个基于golang的net包实现的网络框架。从github上,我们可以看到它相对于其他框架而言,具有优越的性能。本系列将从应用的角度来解析其源码。(转载请指明出于breaksoftware的csdn博客) 本文我们将分析其路由的原理。先看个例子(源于github)func main() { // Disable Console Color //...
Colly源码解析——结合例子分析底层实现 通过《Colly源码解析——框架》分析,我们可以知道Colly执行的主要流程。本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现。(转载请指明出于breaksoftware的csdn博客)递归深度 以下例子截取于Basic c := colly.NewCollector( // Visit only domains: ...
Colly源码解析——框架 Colly是一个使用golang实现的数据抓取框架,我们可以使用它快速搭建类似网络爬虫这样的应用。本文我们将剖析其源码,以探析其中奥秘。(转载请指明出于breaksoftware的csdn博客) Collector是Colly的核心结构体,其中包含了用户对框架行为的定义。一般情况下,我们可以使用NewCollector方法构建一个它的指针// NewColl...
并行计算——OpenMP加速矩阵相乘 OpenMP是一套基于共享内存方式的多线程并发编程库。第一次接触它大概在半年前,也就是研究cuda编程的那段时间。OpenMP产生的线程运行于CPU上,这和cuda不同。由于GPU的cuda核心非常多,可以进行大量的并行计算,所以我们更多的谈论的是GPU并行计算(参见拙文《浅析GPU计算——CPU和GPU的选择》和《浅析GPU计算——cuda编程》)。本文我们将尝试使用OpenMP...