<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[WingC的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/wingWC</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wingWC]]></copyright><item><title><![CDATA[记录一次艰辛的Python包持续集成与发布过程]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/80379822</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/80379822</guid><author>wingWC</author><pubDate>Sun, 20 May 2018 09:12:27 +0800</pubDate><description><![CDATA[缘由

为了保证代码质量，编写单元测试是非常必要的，特别是在团队开发的过程中，编写有效的单元测试保证每人编写的模块能够正常工作，以免项目后期出现各种不可预知的bug，因此，在提交代码前运行单元测试，可以有效保证代码的健壮性。这种工作当然是要自动化完成，因此，许多CI工具也应运而生，最常见的就是Travis-CI，它很好地与Github兼容，每当我们提交代码时，都会执行.travis.yml下的指令...]]></description><category></category></item><item><title><![CDATA[C++内存管理 RAII]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78852895</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78852895</guid><author>wingWC</author><pubDate>Wed, 20 Dec 2017 14:29:31 +0800</pubDate><description><![CDATA[C++和C#，python等语言不同，其本身是没有gc机制的，因此我们需要手动来管理内存，一般来说，我们只要将每一个new出来的对象delete之后，就可以保证资源不被泄漏，但万事都不是那么理想的，我们可能因为忘记delete而导致内存泄漏，并且当开发大型项目时，我们可能不了解其他人的代码意图，导致不能正确释放内存，因此，我们有几种方法来解决该问题。 
    RAII即当资源取得时机就是初始化时机]]></description><category></category></item><item><title><![CDATA[Advanced Installer打包及自定义卸载]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78845152</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78845152</guid><author>wingWC</author><pubDate>Tue, 19 Dec 2017 17:29:50 +0800</pubDate><description><![CDATA[Advanced Installer是一个windows平台下的打包软件，他可以将我们的程序打包为不依赖开发环境的安装包。接下来我简单介绍一下Advanced Installer的使用。 
    上图是新建程序的选项，一般来说对于发布的程序我们使用Professional模板，如果程序比较简单可以使用Simple模板。在这里我们选择Professional。    上图是产品详细信息的参数，包含了]]></description><category></category></item><item><title><![CDATA[异步IO：Python中的协程]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78741236</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78741236</guid><author>wingWC</author><pubDate>Thu, 07 Dec 2017 14:42:57 +0800</pubDate><description><![CDATA[我们在实际的问题中会遇到一些堵塞线程的场景，比如UI程序进行耗时的计算阻塞主线程；进行IO操作，比如读写文档或者网络传输时会阻塞线程等等，之前我采用的是使用多进程+多线程的处理方式，但这种方式相比于协程来说都比较慢，特别是在Windows操作系统下启动一个线程是开销很大的，因此掌握Python中的协程对于处理一些高并发需求来说是非常重要的，看完了廖雪峰的官方网站–异步IO后我总结了一下我对于协程的理]]></description><category></category></item><item><title><![CDATA[使用Pyinstaller打包exe]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78729987</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78729987</guid><author>wingWC</author><pubDate>Wed, 06 Dec 2017 13:58:07 +0800</pubDate><description><![CDATA[当我们我们编写python程序后，我们有时会将程序打包成不依赖python环境的exe程序，这时我们可以使用PyInstaller这个包来打包我们的程序，使其成为可以直接运行的exe程序，本人第一次打包的时候遇到了许多坑，在这里记录一下，同时也可以给大家一点参考。首先我们使用pip下载PyInstaller这个包，同时我们会安装一些其他的依赖包，如果安装失败，需要看看依赖的包是否正确安装了，最好在一]]></description><category></category></item><item><title><![CDATA[QImage与cv::Mat之间的相互转换]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78724435</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78724435</guid><author>wingWC</author><pubDate>Tue, 05 Dec 2017 20:23:27 +0800</pubDate><description><![CDATA[CV：：Mat与QImagecv::Mat是OpenCV中用来存储图像的数据结构，其中的data是uchar*类型，根据图像的通道数和位数的不同可以划分为不同的类型。例如CV_8UC3代表的是8位三通道的图像8位代表每个通道的范围为0~255，3通道分为为RGB三个通道，RGB三原色的混合即可以组成各种不同的颜色。同样CV_8UC1代表8位单通道的图像，也就是黑白图像。若涉及到图像深度还有其他的类型]]></description><category></category></item><item><title><![CDATA[桌面端软件设计经验总结]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78674263</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78674263</guid><author>wingWC</author><pubDate>Thu, 30 Nov 2017 11:33:11 +0800</pubDate><description><![CDATA[软件的基本架构1、MVC简介对于工业上的桌面端软件来说，主要的功能就是通过获取用户的操作来处理后台的数据并在界面上进行呈现。对于这种软件需求，最经典的应用就是MVC架构，可以在图1中粗略展示MVC框架的设计思想。                                图1、MVC框架
2、实际中需要解决的问题        软件的设计需求就是实时获取用户的操作，比如查询条件的改变，测量条件的]]></description><category></category></item><item><title><![CDATA[在PySide中使用多进程与多线程（multiprocess,threading）]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78508699</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78508699</guid><author>wingWC</author><pubDate>Sat, 11 Nov 2017 21:09:36 +0800</pubDate><description><![CDATA[在UI界面程序中，使用到多进程与多线程是很常见的场景，有时候我们需要将一些耗时的操作放在其他的线程或者进程中，避免卡死主线程。而且利用多线程加Qt的信号槽机制我们可以在子进程中实现事件监听，实时监测进程间的通信。之前一直对线程和进程的理解不太深刻，借着这次机会好好理解了一下多线程与多进程，等之后在接触带锁的多线程模式。multiprocess是python的一个库，由于python的跨平台特性，我们]]></description><category></category></item><item><title><![CDATA[Python装饰器与函数式编程]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78413191</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78413191</guid><author>wingWC</author><pubDate>Wed, 01 Nov 2017 13:38:22 +0800</pubDate><description><![CDATA[一、函数式编程“函数式编程”同“面向对象编程”，“面向过程编程”一样是一种编程范式，它属于”结构化编程”的一种，主要思想是把运算过程尽量写成一系列嵌套的函数调用。相比于面向对象，函数式编程的最大优点在于将计算机运算看做是数学中函数的计算，并且避免了状态以及变量的概念，关于函数式编程的更多知识还有待于学习，这里先埋个坑，以后再补。二、闭包简单来说，闭包是是引用了自由变量的函数，闭包包含自由（未绑定到特]]></description><category></category></item><item><title><![CDATA[利用Swig在python中调用C/C++代码]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78397385</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78397385</guid><author>wingWC</author><pubDate>Mon, 30 Oct 2017 21:09:38 +0800</pubDate><description><![CDATA[用途当我们在开发Python程序的时候，我们可以利用Python的特性来进行敏捷开发，但有时候我们可能在程序的关键地方需要比较高的运行效率，或者当我们与底层进行通信时要使用C++来运行，这时我们可以有两种方法。一是使用subprocess模块打开编译好的exe程序，与exe程序进行通信，二是利用Swig工具将C++代码转化为Python文件进行调用，本文主要讲解第二种方法。
本文参考了：在Pytho]]></description><category></category></item><item><title><![CDATA[使用pyside+designer将.ui文件转化为.py文件的两种方法]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78309583</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78309583</guid><author>wingWC</author><pubDate>Sun, 22 Oct 2017 13:36:19 +0800</pubDate><description><![CDATA[一、使用pyside-uic.exe将.ui文件转化为.py文件1、进入Pycharm的设置界面 
2、进入外部工具设置 
3、配置designer.exe，注意program路径和working directory路径 
4、配置pyUIC，注意找到pyside-uic.exe文件所在的路径和参数 
当配置完成之后就可以直接在pycharm中利用designer生成.ui文件，并且使用pyUIC将]]></description><category></category></item><item><title><![CDATA[《大话设计模式》读书笔记之C++实现--chapter27解释器模式]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78288517</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78288517</guid><author>wingWC</author><pubDate>Thu, 19 Oct 2017 19:35:03 +0800</pubDate><description><![CDATA[关于解释器模式看到了一篇讲解的十分好的博客行为型模式—解释器模式 ，自己写了一遍实现，首先要看懂UML类图，理解终结符解释器和非终结符解释器的作用，然后要掌握抽象语法树的构建，理解了这几点之后就很容易利用解释器模式构造自己的解释器#include <iostream>
#include <string>
#include <map>
#include <stack>
using namespace]]></description><category></category></item><item><title><![CDATA[《大话设计模式》读书笔记之C++实现--chapter26享元模式]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78270812</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78270812</guid><author>wingWC</author><pubDate>Wed, 18 Oct 2017 11:16:02 +0800</pubDate><description><![CDATA[#include <iostream>
#include <list>
#include <string>
#include <map>
#include <QDebug>
using namespace std;class FlyWeight{
public:
    virtual void Operation() = 0;
    virtual ~FlyWeight(){}
};class]]></description><category></category></item><item><title><![CDATA[C++11 for_each函数与Qt中foreach函数比较]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78267361</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78267361</guid><author>wingWC</author><pubDate>Tue, 17 Oct 2017 22:02:29 +0800</pubDate><description><![CDATA[#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <QCoreApplication>
#include <QDebug>
using namespace std;void add(int& i)
{
    i++;
}void out(]]></description><category></category></item><item><title><![CDATA[《大话设计模式》读书笔记之C++实现--chapter15抽象工厂模式]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78266782</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78266782</guid><author>wingWC</author><pubDate>Tue, 17 Oct 2017 21:42:16 +0800</pubDate><description><![CDATA[#include <iostream>
using namespace std;//抽象产品类
class AbstractProduct{
public:
    virtual void ProductFunction() = 0;     //子类可以重写该函数来实现不同子类的特有功能
    virtual ~AbstractProduct(){}
};//具体产品类，有实现自己功能的成员函]]></description><category></category></item><item><title><![CDATA[《大话设计模式》读书笔记之C++实现--chapter24命令模式]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78261603</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78261603</guid><author>wingWC</author><pubDate>Tue, 17 Oct 2017 16:05:10 +0800</pubDate><description><![CDATA[#include <iostream>
#include <QDebug>
using namespace std;class ConcreteHandleSecond;class ConcreteHandleThird;//利用枚举类确定请求的等级
enum Request{
    Normal,
    Important,
    Urgent,
    UrgentAndImport
};]]></description><category></category></item><item><title><![CDATA[《大话设计模式》读书笔记之C++实现--chapter23命令模式]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78258647</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78258647</guid><author>wingWC</author><pubDate>Tue, 17 Oct 2017 11:32:37 +0800</pubDate><description><![CDATA[#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
#include <QCoreApplication>
using namespace std;//抽象接受命令类，执行命令
class AbstractReceiver{
public:
    virtual void ExcuteCommand(]]></description><category></category></item><item><title><![CDATA[《大话设计模式》读书笔记之C++实现--chapter22桥接模式]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78254317</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78254317</guid><author>wingWC</author><pubDate>Mon, 16 Oct 2017 20:57:19 +0800</pubDate><description><![CDATA[17-10-13 1、练习mysql2、练习git3、学习二分法以及程序的边界问题（左闭右开）4、学习变量命名方法，程序的异常处理及调试，表驱动方法 17-10-14 1、深入练习了mysql，了解多重查询的嵌套，温故了Qt访问数据库以及QsqlQuery操作结果集，温故SQLite的亲和数据类型2、读代码大全、编程珠玑，了解变量名的命名规则，防御式编程以及如何编写健壮的子程序。还需要看类的实现细节]]></description><category></category></item><item><title><![CDATA[异常处理]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78235157</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78235157</guid><author>wingWC</author><pubDate>Sat, 14 Oct 2017 16:37:34 +0800</pubDate><description><![CDATA[对于一个程序来说，异常处理是一个必不可少的环节，这里简单总结一下自己进行异常处理的经验。 
首先我们要确定代码可能会发生的所有情况，比如数组越界，串口连接失败等，然后我们要确定异常的级别，是属于绝对不可能发生的我们在程序开发阶段就要使用断言等方法来修复，有可能在用户使用时发生的我们要根据异常级别做不同的处理，比如串口断开我们应该提醒用户，然后可以选择进行重连或退出程序，当用户输入的数据超过正常范围也]]></description><category></category></item><item><title><![CDATA[二分查找算法（左闭右开区间）]]></title><link>https://blog.youkuaiyun.com/wingWC/article/details/78229684</link><guid>https://blog.youkuaiyun.com/wingWC/article/details/78229684</guid><author>wingWC</author><pubDate>Fri, 13 Oct 2017 19:31:33 +0800</pubDate><description><![CDATA[二分查找算法是一个基本但用处十分广泛的算法，但要写出一个没有bug的二分查找算法也不容易，《编程珠玑》一书中提到仅有百分之十的人可以第一次就写出没有bug的二分查找算法，主要原因在于寻找中间区间时数据有可能溢出，以及区间的选择不正确导致死循环，数组越界等等。二分查找算法一共有64种形式，由于在计算机中左闭右开区间非常普遍（比如迭代器中就是使用左闭右开区间），我将划分范围划分为左闭右开区间。如下图所示]]></description><category></category></item></channel></rss>