自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 收藏
  • 关注

原创 记录一次艰辛的Python包持续集成与发布过程

缘由为了保证代码质量,编写单元测试是非常必要的,特别是在团队开发的过程中,编写有效的单元测试保证每人编写的模块能够正常工作,以免项目后期出现各种不可预知的bug,因此,在提交代码前运行单元测试,可以有效保证代码的健壮性。这种工作当然是要自动化完成,因此,许多CI工具也应运而生,最常见的就是Travis-CI,它很好地与Github兼容,每当我们提交代码时,都会执行.travis.yml下的指令...

2018-05-20 09:12:27 1276

原创 C++内存管理 RAII

C++和C#,python等语言不同,其本身是没有gc机制的,因此我们需要手动来管理内存,一般来说,我们只要将每一个new出来的对象delete之后,就可以保证资源不被泄漏,但万事都不是那么理想的,我们可能因为忘记delete而导致内存泄漏,并且当开发大型项目时,我们可能不了解其他人的代码意图,导致不能正确释放内存,因此,我们有几种方法来解决该问题。     RAII即当资源取得时机就是初始化时机

2017-12-20 14:29:31 610

原创 Advanced Installer打包及自定义卸载

Advanced Installer是一个windows平台下的打包软件,他可以将我们的程序打包为不依赖开发环境的安装包。接下来我简单介绍一下Advanced Installer的使用。     上图是新建程序的选项,一般来说对于发布的程序我们使用Professional模板,如果程序比较简单可以使用Simple模板。在这里我们选择Professional。    上图是产品详细信息的参数,包含了

2017-12-19 17:29:50 11375

原创 异步IO:Python中的协程

我们在实际的问题中会遇到一些堵塞线程的场景,比如UI程序进行耗时的计算阻塞主线程;进行IO操作,比如读写文档或者网络传输时会阻塞线程等等,之前我采用的是使用多进程+多线程的处理方式,但这种方式相比于协程来说都比较慢,特别是在Windows操作系统下启动一个线程是开销很大的,因此掌握Python中的协程对于处理一些高并发需求来说是非常重要的,看完了廖雪峰的官方网站–异步IO后我总结了一下我对于协程的理

2017-12-07 14:42:57 621

原创 使用Pyinstaller打包exe

当我们我们编写python程序后,我们有时会将程序打包成不依赖python环境的exe程序,这时我们可以使用PyInstaller这个包来打包我们的程序,使其成为可以直接运行的exe程序,本人第一次打包的时候遇到了许多坑,在这里记录一下,同时也可以给大家一点参考。首先我们使用pip下载PyInstaller这个包,同时我们会安装一些其他的依赖包,如果安装失败,需要看看依赖的包是否正确安装了,最好在一

2017-12-06 13:58:07 486

原创 QImage与cv::Mat之间的相互转换

CV::Mat与QImagecv::Mat是OpenCV中用来存储图像的数据结构,其中的data是uchar*类型,根据图像的通道数和位数的不同可以划分为不同的类型。例如CV_8UC3代表的是8位三通道的图像8位代表每个通道的范围为0~255,3通道分为为RGB三个通道,RGB三原色的混合即可以组成各种不同的颜色。同样CV_8UC1代表8位单通道的图像,也就是黑白图像。若涉及到图像深度还有其他的类型

2017-12-05 20:23:27 1471

原创 桌面端软件设计经验总结

软件的基本架构1、MVC简介对于工业上的桌面端软件来说,主要的功能就是通过获取用户的操作来处理后台的数据并在界面上进行呈现。对于这种软件需求,最经典的应用就是MVC架构,可以在图1中粗略展示MVC框架的设计思想。 图1、MVC框架2、实际中需要解决的问题     软件的设计需求就是实时获取用户的操作,比如查询条件的改变,测量条件的

2017-11-30 11:33:11 6008

原创 在PySide中使用多进程与多线程(multiprocess,threading)

在UI界面程序中,使用到多进程与多线程是很常见的场景,有时候我们需要将一些耗时的操作放在其他的线程或者进程中,避免卡死主线程。而且利用多线程加Qt的信号槽机制我们可以在子进程中实现事件监听,实时监测进程间的通信。之前一直对线程和进程的理解不太深刻,借着这次机会好好理解了一下多线程与多进程,等之后在接触带锁的多线程模式。multiprocess是python的一个库,由于python的跨平台特性,我们

2017-11-11 21:09:36 6468 1

原创 Python装饰器与函数式编程

一、函数式编程“函数式编程”同“面向对象编程”,“面向过程编程”一样是一种编程范式,它属于”结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。相比于面向对象,函数式编程的最大优点在于将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念,关于函数式编程的更多知识还有待于学习,这里先埋个坑,以后再补。二、闭包简单来说,闭包是是引用了自由变量的函数,闭包包含自由(未绑定到特

2017-11-01 13:38:22 336

原创 利用Swig在python中调用C/C++代码

用途当我们在开发Python程序的时候,我们可以利用Python的特性来进行敏捷开发,但有时候我们可能在程序的关键地方需要比较高的运行效率,或者当我们与底层进行通信时要使用C++来运行,这时我们可以有两种方法。一是使用subprocess模块打开编译好的exe程序,与exe程序进行通信,二是利用Swig工具将C++代码转化为Python文件进行调用,本文主要讲解第二种方法。本文参考了:在Pytho

2017-10-30 21:09:38 2311 1

原创 使用pyside+designer将.ui文件转化为.py文件的两种方法

一、使用pyside-uic.exe将.ui文件转化为.py文件1、进入Pycharm的设置界面 2、进入外部工具设置 3、配置designer.exe,注意program路径和working directory路径 4、配置pyUIC,注意找到pyside-uic.exe文件所在的路径和参数 当配置完成之后就可以直接在pycharm中利用designer生成.ui文件,并且使用pyUIC将

2017-10-22 13:36:19 15125

原创 《大话设计模式》读书笔记之C++实现--chapter27解释器模式

关于解释器模式看到了一篇讲解的十分好的博客行为型模式—解释器模式 ,自己写了一遍实现,首先要看懂UML类图,理解终结符解释器和非终结符解释器的作用,然后要掌握抽象语法树的构建,理解了这几点之后就很容易利用解释器模式构造自己的解释器#include <iostream>#include <string>#include <map>#include <stack>using namespace

2017-10-19 19:35:03 298

原创 《大话设计模式》读书笔记之C++实现--chapter26享元模式

#include <iostream>#include <list>#include <string>#include <map>#include <QDebug>using namespace std;class FlyWeight{public: virtual void Operation() = 0; virtual ~FlyWeight(){}};class

2017-10-18 11:16:02 321

原创 C++11 for_each函数与Qt中foreach函数比较

#include <iostream>#include <string>#include <algorithm>#include <vector>#include <iterator>#include <QCoreApplication>#include <QDebug>using namespace std;void add(int& i){ i++;}void out(

2017-10-17 22:02:29 1879

原创 《大话设计模式》读书笔记之C++实现--chapter15抽象工厂模式

#include <iostream>using namespace std;//抽象产品类class AbstractProduct{public: virtual void ProductFunction() = 0; //子类可以重写该函数来实现不同子类的特有功能 virtual ~AbstractProduct(){}};//具体产品类,有实现自己功能的成员函

2017-10-17 21:42:16 317

原创 《大话设计模式》读书笔记之C++实现--chapter24命令模式

#include <iostream>#include <QDebug>using namespace std;class ConcreteHandleSecond;class ConcreteHandleThird;//利用枚举类确定请求的等级enum Request{ Normal, Important, Urgent, UrgentAndImport};

2017-10-17 16:05:10 257

原创 《大话设计模式》读书笔记之C++实现--chapter23命令模式

#include <iostream>#include <algorithm>#include <list>#include <vector>#include <QCoreApplication>using namespace std;//抽象接受命令类,执行命令class AbstractReceiver{public: virtual void ExcuteCommand(

2017-10-17 11:32:37 279

原创 《大话设计模式》读书笔记之C++实现--chapter22桥接模式

17-10-13 1、练习mysql2、练习git3、学习二分法以及程序的边界问题(左闭右开)4、学习变量命名方法,程序的异常处理及调试,表驱动方法 17-10-14 1、深入练习了mysql,了解多重查询的嵌套,温故了Qt访问数据库以及QsqlQuery操作结果集,温故SQLite的亲和数据类型2、读代码大全、编程珠玑,了解变量名的命名规则,防御式编程以及如何编写健壮的子程序。还需要看类的实现细节

2017-10-16 20:57:19 295

原创 异常处理

对于一个程序来说,异常处理是一个必不可少的环节,这里简单总结一下自己进行异常处理的经验。 首先我们要确定代码可能会发生的所有情况,比如数组越界,串口连接失败等,然后我们要确定异常的级别,是属于绝对不可能发生的我们在程序开发阶段就要使用断言等方法来修复,有可能在用户使用时发生的我们要根据异常级别做不同的处理,比如串口断开我们应该提醒用户,然后可以选择进行重连或退出程序,当用户输入的数据超过正常范围也

2017-10-14 16:37:34 284

原创 二分查找算法(左闭右开区间)

二分查找算法是一个基本但用处十分广泛的算法,但要写出一个没有bug的二分查找算法也不容易,《编程珠玑》一书中提到仅有百分之十的人可以第一次就写出没有bug的二分查找算法,主要原因在于寻找中间区间时数据有可能溢出,以及区间的选择不正确导致死循环,数组越界等等。二分查找算法一共有64种形式,由于在计算机中左闭右开区间非常普遍(比如迭代器中就是使用左闭右开区间),我将划分范围划分为左闭右开区间。如下图所示

2017-10-13 19:31:33 7884

原创 Mysql安装及设置

mysql安装好了之后我们需要将其加入到windows的系统服务中,即进入mysql安装目录的bin目录下,使用命令mysqld –install安装MySQL服务,当无法连接mysql数据库时我们首先要确定mysql服务是否安装,再确认是否启动了该服务,启动mysql服务器的命令为net start mysql,然后使用root权限访问mysql数据库,命令为mysql -u root -p

2017-10-13 09:09:10 321

原创 机器视觉的相机标定

部分内容参考了知乎专栏,感谢该大神的无私分享相机标定一.目的相机标定是为了获得从像素坐标系到世界坐标系的转换矩阵,该矩阵由相机的内参和外参决定,当我们求出该矩阵后我们便可以通过像素坐标直接得出世界坐标,从像素坐标到世界坐标的转换过程如下:Created with Raphaël 2.1.0开始世界坐标系相机坐标系图像坐标系(考虑畸变)像素坐标系二、坐标系的转换世界坐标系–>相机坐标系: 参考机

2017-10-11 10:27:15 1720

原创 《函数指针的理解》

顾名思义,函数指针是一个指向函数的指针,该指针存放了函数的地址,地址中有着函数名,函数参数等信息,其基本语法如下:c++函数指针的定义形式:返回类型 (类名称::*函数成员名称)(参数类型,参数类型,参数类型,….);  对于函数指针的使用,以上篇中Qt的信号槽为例,我们可以写为: int MainWindow::FunPoint() { qDeb

2017-09-27 17:08:23 402

原创 《Qt打印功能总结》

Qt提供了强大的打印功能,我们可以使用QPainter直接在一个QPrinter的实例中进行打印,对于文件的输出我们有两种方式可以选择,一种是利用QPrinterDialog来指定打印机及打印格式;第二种方法是利用代码设置QPrinter的输出格式,纸张尺寸,并利用QFileDIalog来选择输出路径。第一种方法:QPrintDialog printDialog(printer, pare

2017-09-27 13:25:38 3439 1

原创 《Qt信号槽的几种写法》

信号槽是Qt的核心部分,它使得对象之间的的通信变得很简单。Qt通过connect来连接信号与槽,当信号被发出时,槽函数立刻被执行,connect函数有五个重载:QMetaObject::Connection connect(const QObject *, const char *, const QObject *, const

2017-09-26 10:13:24 4710

转载 管理Git生成多个ssh key

管理Git生成多个ssh key转载于点击打开链接生成两个key生成key的命令ssh-keygen -t rsa -C “Your Email Address” -f 'Your Name',-f后面给的生成key的名字,如果没有指定新的名字,那么每次ssh-keygen生成的名字相同,就会发生覆盖同名文件的情况的发生。生成两个key后,添加到对应服务器的ssh kyes

2017-09-20 15:20:45 198

原创 Python切片操作

本文参考了点击打开链接的博客,来加深对于切片操作的理解Python的切片可以理解为L[开始:结束:步进],例如L[0:6:1]可以理解为从序号0开始,步进为1,直到6结束,和C++的循环一样,数组的选择规则是左闭右开,即[0,6),从0开始(包括0)到6结束(不包括6),开始,结束的默认值由步进的正负决定,当步进为正值时,开始的默认值为切片起点索引,也就是0,结束的默认值为切片终点的索引;当步

2017-09-12 22:07:30 687

原创 《Effective C++读书笔记》--条款34:区分接口继承和实现继承

当我们设计一个类的时候,我们会希望其子类只继承成员函数的接口,但有时候又希望其继承接口和实现,但又希望能重写他们所继承的接口和实现或者不允许重写任何东西。我们首先要明确public继承含义,即is-A的关系,对于基类成立的所有条件,对其public继承的子类一定成立,反之则不然。当我们希望子类继承该函数的接口时,我们可将该函数在基类中定义为纯虚函数,此时基类是不可被实例化的,其中代表的含义是“

2017-09-11 14:46:06 254

原创 Qt源代码编码问题

Qt默认使用UTF-8格式保存代码,当我们编译的时候出现莫名错误提示的缺少“;”,“)”等问题,并且确定代码没错,这时候很有可能是编码问题,此时我们可以将代码用记事本打开,然后保存为UTF-8格式即可。

2017-09-04 21:07:31 381

原创 《Effective C++读书笔记》--条款29:努力写出异常安全的代码

异常安全有两个条件:①不泄漏任何资源②不允许数据破坏对于资源泄漏的问题我们只要遵循以对象管理资源这条条款就很容易解决,对于数据败坏的问题,首先我们要知道异常安全函数的概念,异常安全函数提供以下三个保证之一:①基本承诺:如果异常被抛出,程序内所有事物仍保持在有效状态下,没有任何对象或数据结构被破坏,所有对象都处于一种内部前后一致的状态。②强烈保证:如果异常被抛出,程序状态不改变。

2017-08-31 22:36:18 443

原创 《Effective C++读书笔记》--条款13:以对象管理资源

对于刚接触C++程序员来说,内存泄漏可能是最常遇到的会导致程序崩溃的问题。程序员自己管理内存和资源是一把双刃剑,用的好会使程序效率大大提高,用的不好便会造成一系列诸如内存泄漏,程序崩溃的致命问题。除了最常用的分配内存,还有许多需要管理的资源,包括文件描述器、数据库连接、互斥锁、图形界面中的画笔,网络socket等等。由于异常、函数体内的多个return(在释放资源前程序就退出),程序改动时没充分考

2017-08-30 10:34:45 269

原创 《Effective C++读书笔记》--条款08:别让异常逃离析构函数

在C++中不禁止析构函数抛出异常,但这是不推荐的行为,比如一个vector v,当v被销毁时,其中的所有widget都会被销毁,也就会调用它们的析构函数,但如果在析构函数中抛出异常,则会同时出现多个同时作用的异常(每销毁一个widget抛出一个异常),则会导致程序UB。对于这种情况,有一种方法就是在析构函数中处理该异常,但这并不是一个好方法。对此我们可以重新设置一个接口,将处理异常的责任从析构函数

2017-08-29 11:23:08 307

原创 《Effective C++读书笔记》--条款07:为多态基类声明virtual析构函数

在某些情况下,我们需要将析构函数声明为virtual,典型的一个例子就是当父类的指针指向子类对象时,删除该指针只会调用父类的析构函数而没调用子类的析构函数,也就是局部销毁,此时会造成内存泄漏。这时我们则需要将父类的析构函数声明为virtual.任何类只要带有虚函数就几乎可以确定应该有一个虚析构函数,因为有虚函数代表有些功能会被子类所重写来实现多态。所以当我们继承没有虚析构函数的类时需要格外注意。

2017-08-28 16:32:35 245

原创 《Effective C++读书笔记》--条款06:若不想使用编译器自动生成的函数,就应该明确拒绝

首先我们要明确,编译器产出的所有函数都是public,因此将成员函数声明为private且故意不去实现他们可以阻止编译器为你自动生成你不想要的函数。但我们在member函数或friend函数中使用该函数时,那么会在连接时发生错误,我们可以将错误迁移至编译阶段,此时的方法就是专门设计一个阻止拷贝动作的基类,这个基类的实现如下:class Uncopyable{protected: Un

2017-08-28 13:56:08 270

原创 《Effective C++读书笔记》--条款05:了解C++默默编写并调用哪些函数

编译器会默认为每个类声明一个默认构造函数,拷贝构造函数,赋值操作符和一个析构函数(如果你自己不声明),而这些函数都是public且inline的,当这些函数被调用时才会被编译器创建出来。此时我们要注意,编译器产出的析构函数是一个非虚函数,除非这个类的基类声明有虚析构函数,虚析构函数的作用我们将在下两章提到。

2017-08-28 13:32:47 273

原创 《Effective C++读书笔记》--条款04:确定对象被使用前已先被初始化

对于C++来说,定义一个值未初始化,其值是一个不确定的数,而当我们使用未初始化的值会导致UB,在不同的平台上表现不一样,总之会给程序带来不可预知的行为,我们要尽力避免。所以对于内置类型来说,我们要尽量在使用对象之前将他初始化,至于内置成员之外的类型,初始化的任务落在构造函数上,我们要确保每个构造函数将每个对象的每一个成员都初始化。此时有两种方法,一是在初始化列表中初始化,二是在构造函数中赋值。对此

2017-08-26 10:16:55 296

原创 《Effective C++读书笔记》--条款03:尽可能使用const

--1、const修饰指针和对象的不同方法:对于const时代表指针指向的地址是const还是该指针指向的地址内的对象是const,只需牢记一点:如果关键字const出现在*左边,表示被指物是常量,如果出现在*右边,表示指针本身是常量。在STL中来说,声明迭代器为const就如同声明指针为const一样(const在*左边),表示迭代器不得指向不同的东西,但它所指向的东西的值可以改变。如果

2017-08-22 18:14:40 297

原创 《Effective C++读书笔记》--条款02尽量以const,enum,inline替换#define

使用宏定义是一个不被推荐的做法,在阅读了书籍并且结合自身所读过的博客,总结以下两点不推荐使用宏定义的理由。--1、宏定义是简单的字符串替换:由于宏定义只是进行简单的字符串替换,因此有可能会造成意想不到的情况。典型的一个例子就是#define x+x 2x,当我们使用2x*2x时,我们的意图是得到(x+x)*(x+x),即4x,但实际上由于字符串替换 2x*2x相当于x+x*x+x=x+x^

2017-08-22 17:13:04 244

原创 关于初始化列表的总结

使用初始化列表主要有两个方面的原因:一是某些情况下不得不使用初始化列表,二是基于效率方面的考虑,一下我们具体分析这两种情况:一:必须使用初始化列表:初始化列表是在构造函数之前执行的,当我们的成员变量中具有常量值,引用或者没有无参构造函数的类时,我们必须使用初始化列表初始化。因为常量值只能被定义一次,且不能给常量赋值,对于类成员变量来说,由于编译器会在调用构造函数之前初始化该类,此时会调用该

2017-08-17 17:03:04 306

转载 什么情况下必须使用C++的初始化列表

先给理论。 1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代表"擦除对象当前值, 赋予新值". 它不承担为对象分配内存的义务. 2. C++中, 类成员的初始化于初始化列表中完成, 先于构造函数体执行. 即成员真正的初始化发生在初始化列表中, 而不是构造函数体中.再给说明。

2017-08-17 09:37:05 1778

空空如也

空空如也

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

TA关注的人

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