Jump to Navigation

C++

C/C++编程

C++标准的发展历史

C++从1979年诞生开始,到2010年以前,一共经历了两个标准版本,并且两个标准差别并不大,时间跨度约30年。

自从2010年之后,随着多种不同类型的新型语言的推出,包括灵活的解释型语言和函数式语言,

C++借着对新语言特性的需求,又好像进入了另一个阶段的飞速发展时期。

C++标准委员会,刚发布了C++11的标准,加入了大量的语言特性,

现在已经提出了C++14标准,并且即将通过委员会讨论。

再往后,可能还会有C++17标准。

C++语言更复杂,更灵活,希望也更好用。

C++的完整历史,

Category:

PHP的PDO遇到MySql has gone away的解决方法

在MySQL特定的数据库参数配置的情况下,在一个超时的连接上调用任意的mysql函数,

会导致PHP的PDO扩展报"MySQL has gone away"警告,导致程序无法继续执行。

在使用多种PHP层的解决方案后,依旧无法避免这一问题的出现。

原因在于PDO架构采用了连接对象缓存机制,在使用相同的dsn串连接数据库时,

PDO会从连接池对象中取出有相同dsn串的连接,问题就出在这个地方。

当该连接出现了"MySQL has gone away"之后,PDO并不知道这一情况,

PDO连接对象仍旧在PDO的连接池中。

下次即使在PHP层检测到这一问题,并重试连接,PDO却返回之前报了错的连接。

问题的原因查找到了,接下来就是寻找解决方法。

由于PDO没有提供关闭连接的方法,而是依靠PHP本身的引用计数与垃圾回收机制关闭连接,

在大多数情况下这都没有问题,但这时候这种机制就略显无力了。

经过多次实践修改测试,总结出来以下两种方式,

php扩展编写中的整数参数接收

在php中没有C/C++语言中的unsigned long long,unsigned int这些无符号整数类型,

在C/C++程序中一般表示为uint64_t,uint32_t等。

如果在php扩展中需要接收这些无符号数据类型,则需要特殊的处理方式。

对于在PHP支持的范围内的整数,可以直接使用"l"参数获取,

但对于赶出php支持范围的整数,一般需要使用"s"参数获取,

之后在C/C++语言中转换成无符号整数。

也就是,通用的情况下,参数定义为mixed(integer/string)类型的。

在扩展中使用"z"接收参数,接收到之后,使用宏Z_TYPE_P判断参数的实际类型,

对于Z_TYPE_P == IS_LONG的时候,直接转换成无符号类型,

因为这情况情况说明PHP正确传递了整数类型的参数。

如果超出了PHP处理的范围,参数会被转换为浮点数,宏Z_TYPE_P应该为IS_DOUBLE类型。

这样就可以根据扩展中判断出来的类型做不同的接收处理。

当使用字符串类型传递这种参数时,Z_TYPE_P == IS_STRING,转换一次就可以。

Category:

做了个php-hyperdex扩展

前几天使用 hyperdex的golang客户端api编写导数据程序,

发现golang API还有一个内存泄漏的BUG,导致长时间导入数据时内存占用非常大。

一般导入100w条后,4G内存的机器已经受不了,但准备导入的数据大概2000w或者更多。

这几天花了点时间,找了个hyperdex把 php 语言API扩展,

发现其已经是很早之前的,已经与现在的hyperdex版本不兼容了。

在此基础出,迁移到了与最新版本的hyperdex兼容,并且添加了HyperdexAdmin相关的功能。

有兴趣的可以看看, 代码在github上, https://github.com/kitech/php-hyperdex

现的状态是基本功能完成可用。

后续的改进包括,

1、支持超时参数。。

2、支持hyperdex官方的C API中的异步执行功能。

3、把代码改到使用hyperdex的C++ API,转为C API是hyperdex在C++ API基础上封装的。

4、admin管理API异常/错误处理完善。

Category:

libaria2功能介绍

libaria2是linux aria2命令行下载工具的封闭api,
这样在使用aria2的时候不需要修改其代码了。

在之前编写karia2(aria2的GUI界面前端)的时候,
需要在控制代码中包含大量的aria2源代码头文件,
维护起来非常复杂,虽然这有个好处是能了解aria2源代码的组件结构。
编写早期的karia2的过程中,基本上实现了libaria2的功能,
并且比现在的libaria2功能还要多。因为当时直接include进来aria2的源代码,
可以获取到所有程序运行状态信息。

现在karia2作为aria2的前端,以多种不同方式支持aria2的运行管理。
包括直接使用aria2源代码的方式,使用libaria2的方式,
使用aria2 RPC的方式。
所有这些方式,使用相同的管理架构进行下载的管理,并与用户界面交互信息。

Category:

zeromq与nanomsg的简单对比

两两个是同一个东西,都是消息系统。

两个项目的主要作者是同一个人,只是作者本人对之前开发的项目有许多不满意,
诸如不应该使用C++来写,接口不太好,效率不够高,项目名字与实际功能不符合等。
但对于一相相对已经稳定成熟的项目来说,深度的重构面临很多问题。

所以作者fork出了新的 nanomsg项目,按作者的意思,使用纯C编写,接口更清晰,
代码清楚,效率上很容易比zeromq快3-4倍。

不过nanomsg现在刚放出第一个alpha版本,不够成熟稳定。
除此之外,在理念上与zeromq并没有很大区别。

zeromq.org
nanomsg.org

Category:

初步尝试opencv图像识别训练

在了解了一些关于opencv的功能与基本用法之后,开学尝试使用opencv做一些实际应用。
本次选定一个功能应用,识别验证码功能。
验证码用于网站的防伪,一般为大小写字母与数字,4-6个字符不等。

使用opencv识别,分解为以下步骤,
验证码图片的切割,把图片中的几个字符拆开成单独的字符图片。
使用拆开的字符图片执行opencv训练,
使用训练好的分类器文件,识别目标中的字符。

对于图片验证码的切割,又分为下面几个步骤,
图像去噪,去除图像的背景,混淆随机点/线
图像的加强或者平滑处理,让其中的字符更清楚
根据字符轮廓,切割出字符图片。

这一步中,对于稍微复杂的验证码,也非常难以做到,
例如在去噪的时候,会把字符线条也去掉了部分,对于比较细的字体,可能就被过滤掉了。
对于有比较粗的混淆线时,这种线一般与字符交叉重叠,
在计算字符的轮廓时,会出现两个字符粘连一在起的情况。
图片加强时,也会加强没有去掉的混淆点/线,影响识别字符轮廓
还有些字符距离可能由于倾斜或者字体大小不同而靠的非常近,

ARM处理器支持的数据宽度

ARM 处理器支持6种数据类型;

8位有符号和无符号字节。 (char, unsigned char)

16位有符号和无符号半字,它们以2字节的边界对准。(short int, unsigned short int)

32位有符号和无符号字,它们以4字节的边界对准。(int, unsigned int)

ARM指令全是以32bit的字并且必须是字对准的。

Thumb指令是半字而且必以两字节的边界对准的。

#include
#include

Category:

GCC 4.8 发布,提升 C++11 的支持

GCC 4.8 正式版发布!!!该版本包括通用的优化、新语言以及语言规范提升,提升 G++ 对 C++11 的支持,改进新的 ISO C++ 标准库、C++11 的支持,支持更多平台,详情请看发行说明
GCCGNU Compiler CollectionGNU编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划 的关键部分,亦是自由的 类Unix 及苹果计算机 Mac OS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。

Category:

C11的内建线程支持

C语言走过30年,依旧在不停发展进步。

语言级内建线程支持是C11语言标准引入的新特性之一。

C11内建线程头文件在c11/threading.h

C11内建线程包括mutex锁的实现,临界资源的应用,

mtx_init

mtx_destroy

mtx_lock

mtx_unlock

tss_create

tss_set

tss_get

thrd_current

C11内建线程与linux pthread的比较

Category:

页面

订阅 RSS - C++


Main menu 2

by Dr. Radut