自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

方亮的专栏

方亮的专栏

  • 博客(238)
  • 资源 (2)
  • 论坛 (4)
  • 收藏
  • 关注

原创 谈代码注释

只要写代码,就会遇到代码注释的问题。在不同的公司,不同的项目组,不同的项目中,可能会有不同的注释标准。有些标准让我们感觉很受益,有些则让我们感觉很反感。而对于没有明确标准的项目,我们往往会遇到“百花齐放,百家争鸣”般的注释。我无法给出一个明确的标准,只是在此探讨下:什么样的注释不应该写,什么地方需要写注释。(转载请指明出于breaksoftware的csdn博客)“不”的原则...

2018-04-01 01:24:25 7953 9

原创 谈一次单元测试驱动代码重构
原力计划

目前团队并没有QA岗,而且在很长一段时间内,可能也不会设立QA岗,所以我们需要RD保证代码的质量。而鉴于人类天生的“惰性”,很多时候质量完全依赖于作者的能力以及职业素质。于是我在团队内推动单元测试,并要求提升测试覆盖率。虽然单元测试不能“根治”bug,但是它可以驱使代码结构简洁可测,为提升测试代码覆盖率奠定基础,从而可以有效降低bug率。(转载请指明出于breaksoftware的csdn博客) 以下我将以工作中一个实际例子讲解如何将一个不可测代码变成更加合理且可测代码。...

2020-06-19 19:32:44 305

原创 AWS攻略——使用CodeBuild进行自动化构建和部署Lambda(Python)
原力计划

Aws Lambda是Amazon推出的“无服务架构”服务。我们只需要简单的上传代码,做些简单的配置,便可以使用。而且它是按运行时间收费,这对于低频访问的服务来说很划算。具体的介绍可以常见aws lambda的官网。(转载请指明出于breaksoftware的csdn博客) 比较正统的方法是使用Aws CloudFormation方案,但是鉴于这个方案过于复杂,所以我们还是借助CloudBuild的自定义命令来解决。 本文适用于熟悉在Aws Lambda人...

2020-06-15 15:23:43 482

原创 AWS攻略——使用CodeBuild进行自动化构建和部署静态网页

首先声明下,使用“CodeBuild”部署并不是“正统”的方案,因为AWS提供了“CodeDeploy”。如果不希望引入太多基础设施,可以考虑直接使用CodeBuild进行部署。(转载请指明出于breaksoftware的csdn博客)创建构建项目 kronos是我们项目的名称,因为之前已经建好测试环境,所以本次我们使用“online”作为其属性。 因为需要通过一套代码去自动化构建和部署,还要区分“生产”和“测试”环境,所以我们引入...

2020-06-12 22:23:55 323

原创 AWS攻略——使用S3托管静态网页

在AWS上有很多部署静态网页的方式,比如使用EC2或者Lightsail。但是不管使用上述哪种方案,都需要预先部署如Nignx或者Apache等Http服务。这对纯前端同学来说可能有点复杂,而AWS提供了更简单的部署方式——只需要提供静态网页文件的“S3网页托管服务”。(转载请指明出于breaksoftware的csdn博客) 本文将带大家熟悉一下该方案的实施步骤。创建存储桶 因为S3管理页面是不分区的——“全球”,所以在创建存储桶时,需要指定该存储桶...

2020-06-12 21:11:30 556

原创 AWS攻略——使用CodeCommit托管代码

除了我们熟悉的github,各大云厂商也有自己的代码托管服务。本文讲解如何在Amazon的CodeCommit中托管代码。根账户登录 AWS有两种账户登录界面。IAM账户登录界面 根账户登录界面 我们先使用根账户登录。IAM 我们需要定义一些IAM(Identity and Access M...

2020-03-03 23:00:30 551

原创 bug诞生记——信号(signal)处理导致死锁

这个bug源于项目中一个诡异的现象:代码层面没有明显的锁的问题,但是执行时发生了死锁一样的表现。我把业务逻辑简化为:父进程一直维持一个子进程。(转载请指明出于breaksoftware的csdn博客) 首先我们定义一个结构体ProcessGuard,它持有子进程的ID以及保护它的的锁。这样我们在多线程中,可以安全的操作这个结构体。#include <st...

2019-09-05 23:35:09 513

原创 bug诞生记——不定长参数隐藏的类型问题

这个bug的诞生源于项目中使用了一个开源C库。由于对该C库API不熟悉,一个不起眼的错误调用,导致一系列诡异的问题。最终经过调试,我们发现发生了内存覆盖问题。为了直达问题根节,我将问题代码简化如下(转载请指明出于breaksoftware的csdn博客)#include <iostream>#include <stdarg.h>enum type...

2019-04-25 20:59:06 808

原创 C++拾取——stl标准库中集合交集、并集、差集、对称差方法

STL库中有丰富的集合运算方法,我们可以使用它们快速完成交集、并集、差集、对称差集的运算。(转载请指明出于breaksoftware的csdn博客)交集(intersection) 交集是集合运算中经常会用到的计算,其表达是两个集合共有的部分(图中红色区域) STL中有set_intersection方法可以实现该功能。它是C++17开始...

2019-04-02 23:44:00 2969

原创 使用libev监视文件夹下文件(夹)属性变动的方案和实现

在《libev源码解析》系列中,我们分析了libev的基本原理。本文我们介绍一套使用libev封装的文件(夹)变动监视方案和实现。(转载请指明出于breaksoftware的csdn博客) 我们先看个最简单方案,下面的代码会监视/home/work下文件(夹)的新增、删除等操作。void call_back(ev::stat &amp;w, int reve...

2019-02-05 21:15:56 922

原创 Golang反射机制的实现分析——reflect.Type方法查找和调用

        在《Golang反射机制的实现分析——reflect.Type类型名称》一文中,我们分析了Golang获取类型基本信息的流程。本文将基于上述知识和经验,分析方法的查找和调用。(转载请指明出于breaksoftware的csdn博客)方法package mainimport ( "fmt" "reflect")type t20190107 struct { ...

2019-01-08 20:19:06 2835

原创 Golang反射机制的实现分析——reflect.Type类型名称

        现在越来越多的java、php或者python程序员转向了Golang。其中一个比较重要的原因是,它和C/C++一样,可以编译成机器码运行,这保证了执行的效率。在上述解释型语言中,它们都支持了“反射”机制,让程序员可以很方便的构建一些动态逻辑。这是C/C++相对薄弱的环节,而Golang却有良好的支持。本系列,我们将通过反汇编Golang的编译结果,探究其反射实现的机制。(转载请指...

2019-01-08 20:09:44 5481

原创 C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率

布隆过滤器是一种判定元素是否存在于集合中的方法。其基本原理是使用哈希方法将数据映射到一个很长的向量上。在维基百科上,它被称为“空间效率和查询时间都远远超过一般的算法”的方法。由于它只保存散列的数据,所以对于很长的数据有着良好的压缩特性,这个是个不争的事实(可以参见《布隆过滤器 (Bloom Filter) 详解》)。但是其查询效率究竟如何,我们还是要实际测试一下。(转载请指明出于b...

2018-12-26 20:26:02 821

原创 Gin源码解析和例子——中间件(middleware)

        在《Gin源码解析和例子——路由》一文中,我们已经初识中间件。本文将继续探讨这个技术。(转载请指明出于breaksoftware的csdn博客)        Gin的中间件,本质是一个匿名回调函数。这和绑定到一个路径下的处理函数本质是一样的。        再以Engine的Default方法为例func Default() *Engine { debugPrin...

2018-12-03 18:38:08 4178 2

原创 Gin源码解析和例子——路由

        Gin是一个基于golang的net包实现的网络框架。从github上,我们可以看到它相对于其他框架而言,具有优越的性能。本系列将从应用的角度来解析其源码。(转载请指明出于breaksoftware的csdn博客)        本文我们将分析其路由的原理。先看个例子(源于github)func main() { // Disable Console Color //...

2018-11-30 23:48:42 4702 2

原创 Colly源码解析——结合例子分析底层实现

        通过《Colly源码解析——框架》分析,我们可以知道Colly执行的主要流程。本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现。(转载请指明出于breaksoftware的csdn博客)递归深度        以下例子截取于Basic c := colly.NewCollector( // Visit only domains: ...

2018-11-28 22:04:59 1860

原创 Colly源码解析——框架

        Colly是一个使用golang实现的数据抓取框架,我们可以使用它快速搭建类似网络爬虫这样的应用。本文我们将剖析其源码,以探析其中奥秘。(转载请指明出于breaksoftware的csdn博客)        Collector是Colly的核心结构体,其中包含了用户对框架行为的定义。一般情况下,我们可以使用NewCollector方法构建一个它的指针// NewColl...

2018-11-27 19:08:21 1740

原创 并行计算——OpenMP加速矩阵相乘

        OpenMP是一套基于共享内存方式的多线程并发编程库。第一次接触它大概在半年前,也就是研究cuda编程的那段时间。OpenMP产生的线程运行于CPU上,这和cuda不同。由于GPU的cuda核心非常多,可以进行大量的并行计算,所以我们更多的谈论的是GPU并行计算(参见拙文《浅析GPU计算——CPU和GPU的选择》和《浅析GPU计算——cuda编程》)。本文我们将尝试使用OpenMP...

2018-10-22 21:47:22 4585

原创 C++拾取——使用stl标准库实现排序算法及评测

今天看了一篇文章,讲各种语言的优势和劣势。其中一个观点:haskell非常适合写算法,因为使用者不用去关心具体的计算机实现,而只要关注于操作语义。这让它在专心研究算法的人中非常受欢迎。所以很多时候,语言的争论没有太多的意义,有意义的是它适不适合某些场景或者某些人。(转载请指明出于breaksoftware的csdn博客) 目前在网上讨论排序算法更多是C语言实现的。...

2018-10-18 22:00:17 1555 2

原创 C++拾取——使用stl标准库生成等差、等比数列的方法

代码是思想的表达。阅读代码是一个猜测、求证的过程。这个过程非常费脑,所以人们都不喜欢啰啰嗦嗦的表达方式。于是在相同认知水平下,简洁高效的表达是喜闻乐见的。本文将抛砖引玉,通过一些案例讲解如何去简化代码。(转载请指明出于breaksoftware的csdn博客)关系数列等差数列 比如我们要构建的序列存储的值是0,1,2,3,4……9999。常规写法...

2018-10-12 13:17:48 1605

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

      相关环境和说明在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入》已给出。本文将分析各个容器中遍历和查找的性能。(转载请指明出于breaksoftware的csdn博客)遍历从前往后traversal_begin_16384_highest        性能最差的是map、multimap、set和...

2018-10-06 01:17:46 904

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

        相关环境和说明在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除的性能。(转载请指明出于breaksoftware的csdn博客)删除头部删除元素个数&gt;15000erase_begin_16384_highest        ve...

2018-10-06 00:41:25 1090

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入

        操作系统是Windows10 64bit,编译器是 Microsoft Virtual Studio Community 10。编译产出是64位测试程序。(转载请指明出于breaksoftware的csdn博客)        因为加入测量,就会导致误差。我已经尽量将环境影响降低,但是还是难免有误差。大家可以通过文后附的工程自行测量,结果可能和我存在一定的出入。      ...

2018-10-05 23:59:58 630

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

        相关环境和说明在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入》已给出。本文将分析各个容器中遍历和查找的性能。(转载请指明出于breaksoftware的csdn博客)遍历从前往后元素个数&gt;15000traversal_begin_16384_highest        表现最差的是unordered_m...

2018-10-05 21:21:25 661

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除

        相关环境和说明在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除的性能。(转载请指明出于breaksoftware的csdn博客)删除头部删除元素个数&gt;15000erase_begin_16384_highest        vector容器性能最差。...

2018-10-05 17:06:08 575

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入

        操作系统是ubuntu 18.04.1 server amd64,gcc是 7.3.0。编译产出是64位测试程序。(转载请指明出于breaksoftware的csdn博客)        因为加入测量,就会导致误差。我已经尽量将环境影响降低,但是还是难免有误差。大家可以通过文后附的工程自行测量,结果可能和我存在一定的出入。        文中将测试vector、list、f...

2018-10-05 17:05:57 513

原创 bug诞生记——隐蔽的指针偏移计算导致的数据错乱

        C++语言为了兼容C语言,做了很多设计方面的考量。但是有些兼容设计产生了不清晰的认识。本文就将讨论一个因为认知不清晰而导致的bug。(转载请指明出于breaksoftware的csdn博客)class Base {public: Base() = default; void set_v_b(int v_b) { _v_b = v_b; ...

2018-09-28 21:20:42 440

原创 一套使用注入和Hook技术托管入口函数的方案

        工作中,我们可能会经常使用开源项目解决一些领域中的问题。这种“拿来主义”是一种“专业人干专业事”的思想,非常实用。(转载请指明出于breaksoftware的csdn博客)        一般场景下,我们都是把开源项目代码编译到我们自己的项目中。这样的“融合”,就相当于让两个项目进行了“基因重组”,最终产出一个“基因战士”。在进行“基因重组”中,需要“专业人员”对开源项目中每个...

2018-09-28 01:59:14 1176 2

原创 ffmpeg api的应用——提取视频图片

        这些年来,“短视频”吸引了无数网民的注意。相对于丰富有趣的内容,我们码农可能更关心其底层技术实现。本系列文章将结合ffmpeg,讲解几则视频处理案例。(转载请指明出于breaksoftware的csdn博客)        “短视频”都是以“文件"的形式保存于服务器上。任何一个便于传播的文件都会有一种定义良好的格式,同样视频也有其格式。这系列我们不会去从微观的角度去分析这些格式...

2018-09-20 19:34:23 2246

原创 bug诞生记——const_cast引发只读数据区域写违例

        对于C++这种强类型的语言,明确的类型既带来了执行的高效,又让错误的发生提前到编译期。所以像const这类体现设计者意图的关键字,可以隐性的透露给我们它描述的对象的使用边界。它是我们的朋友,我们要学会和它相处,而不是改变它。(转载请指明出于breaksoftware的csdn博客)        我们来看一个试图改变这个好朋友的案例class Base {public:...

2018-09-11 23:39:13 292

原创 bug诞生记——临时变量、栈变量导致的双杀

        这是《bug诞生记》的第一篇文章。本来想起个文艺点的名字,比如《Satan(撒旦)来了》,但是最后还是想让这系列的重心放在“bug的产生过程”和“缺失的知识点”上,于是就有了本系列这个稍微中性的名称。(转载请指明出于breaksoftware的csdn博客)        本系列博文的案例将都秉承一个原则——“因知识缺失,而非粗心大意导致”。在实际工作中,粗心大意产生的bug太...

2018-09-05 01:41:00 498 1

原创 C++拾趣——使用多态减少泛型带来的代码膨胀

        泛型编程是C++语言中一种非常重要的技术,它可以让我们大大减少相似代码编写量。有时候,我和同事提及该技术时,称它是“一种让编译器帮我们写代码的技术”。(转载请指明出于breaksoftware的csdn博客)        C++是一门静态语言,它最终的编译成果是可以直接运行于冯诺依曼体系的计算机上,而不像其他动态语言,可以运行于虚拟机等容器中。由于对运行效率得追求,C++也是...

2018-09-01 15:05:38 606

原创 从0开始搭建编程框架——插件

        我将插件设计为两种类型。一种是框架自身携带的插件,用于增强其基础能力。一种是用户自定义插件,用于完成业务。本文将分别介绍在peleus框架下,这两种插件该怎么写。(转载请指明出于breaksoftware的csdn博客)        本文谈下框架自身携带的插件怎么写。我们以操作mysql为例。        第一步把mysqlclient开发环境给准备好。Wget ...

2018-08-15 16:36:33 409

原创 从0开始搭建编程框架——主框架和源码

        一个良好的结构是“对修改关闭,对扩展开放”的。(转载请指明出于breaksoftware的csdn博客)        这个过程就像搭建积木。框架本身需要有足够的向内扩展能力以使自身有进化能力,其次要有足够的外向扩展能力以使其可以方便定制业务。一般来说,我们让使用者继承框架暴露的接口,或者填充一些配置项以达到“扩展”的目的。        对内部分,我们称为模块(modul...

2018-08-14 16:55:22 2189

原创 从0开始搭建编程框架——思考

        需求来源于问题。(转载请指明出于breaksoftware的csdn博客)        之前有个人做前端开发的同学在群里问“C语言能做什么?能写网页么?”,然后大家就开始基于这个问题展开争辩。有的认为是“不能,从来没听说过C语言能写网页”;有的说“能,连浏览器都是C写的”。我想这是基于不同层面做出的回答。如果仅仅从语言层面来说,C的确写不出网页。但是从底层来说,C语言是可以做...

2018-08-14 16:55:09 760

原创 brpc介绍、编译与使用

brpc又称为baidu-rpc,是百度开发一款“远程过程调用”网络框架。目前该项目已在github上开源——https://github.com/brpc/brpc。(转载请指明出于breaksoftware的csdn博客) 据目前公开的资料,我们发现百度内部从2010年开始,开发过若干rpc框架:ub系列rpc(ubrpc,nova_pbrpc、public_...

2018-08-10 21:10:09 30066 11

原创 数据竞争(data race)问题分析的利器——valgrind的Helgrind

        数据竞争(data race)是指在非线程安全的情况下,多线程对同一个地址空间进行写操作。一般来说,我们都会通过线程同步方法来保证数据的安全,比如采用互斥量或者读写锁。但是由于某些笔误或者设计的缺陷,还是存在data race的可能性的。(转载请指明出于breaksoftware的csdn博客)        比如下面这段代码#define _GNU_SOURCE 1...

2018-08-02 23:12:59 4769

原创 死锁问题分析的利器——valgrind的DRD和Helgrind

        在《DllMain中不当操作导致死锁问题的分析--死锁介绍》一文中,我们介绍了死锁产生的原因。一般来说,如果我们对线程同步技术掌握不牢,或者同步方案混乱,极容易导致死锁。本文我们将介绍如何使用valgrind排查死锁问题。(转载请指明出于breaksoftware的csdn博客)        构造一个场景#include &lt;pthread.h&gt;pthre...

2018-08-02 20:09:00 2605 4

原创 互斥量、读写锁长占时分析的利器——valgrind的DRD

        在进行多线程编程时,我们可能会存在同时操作(读、写)同一份内存的可能性。为了保证数据的正确性,我们往往会使用互斥量、读写锁等同步方法。(转载请指明出于breaksoftware的csdn博客)        互斥量的用法如下 pthread_mutex_lock(&amp;mutex); // do something pthread_mutex_unlock(...

2018-08-02 18:04:55 492

原创 动态执行流程分析和性能瓶颈分析的利器——gperftools的Cpu Profiler

        在《动态执行流程分析和性能瓶颈分析的利器——valgraind的callgrind》中,我们领略了valgrind对流程和性能瓶颈分析的强大能力。本文将介绍拥有相似能力的gperftools的Cpu Profiler。(转载请指明出于breaksoftware的csdn博客)        我们依然以callgrind一文中的例子为例#include &lt;thread...

2018-07-31 17:06:48 3147

LuaCmdTest

我用于测试的一个lua脚本,没啥用,不用下载。

2012-11-27

同步双工管道

http://blog.csdn.net/breaksoftware/article/details/7001672文中的工程

2011-11-24

breaksoftware的留言板

发表于 2020-01-02 最后回复 2020-01-02

反汇编的问题,发大家帮一下忙啊!

发表于 2007-04-17 最后回复 2008-12-25

急!!!matlab和VC的混合编程

发表于 2008-01-23 最后回复 2008-02-22

请问怎么制作数据库软件的安装向导?

发表于 2007-06-04 最后回复 2008-01-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除