Jump to Navigation

C++

C/C++编程

GCC 4.9.0 发布,提升 C++11 和 C++14 特性

GCC 4.9.0 发布,此版本是个主要版本更新,包括了 GCC 4.8.x 系列和之前的 GCC 版本都没有的新特性,新特性非常之多,详细内容请看发行说明。

此版本已提供二进制包下载,镜像下载,FTP 下载。

文章转载自:开源中国社区 [http://www.oschina.net]
本文标题:GCC 4.9.0 发布,提升 C++11 和 C++14 特性
本文地址:http://www.oschina.net/news/51084/gcc-4-9-0

Category:

程序运行时动态修改进程名

在做平台的过程中,碰到一个可能的需要,平台服务的的进程名一般都不变的,
如果需要动态在外部监控进程的执行状态,比如程序正在执行什么功能,
也许可以通过动态修改进程的名字实现,可以把正在执行的功能做个摘要放在进程名字中。

在linux上,有一个系统调用prctl,这是一个综合性的函数,可以实现一些进程的控制功能。
动态修改进程名的功能也就是在prctl函数。

来看看prctl的函数原型,

NAME
prctl - operations on a process

SYNOPSIS

projecttox项目介绍

projecttox旨在实现一个能够替代skype的开源支持视频通话的即时通信IM,
它的目标是简单易用,消息全程加密,保证通信与通话的安全。

在技术上,与skype类似地可大概分为核心部分与界面UI部分。
核心部分实现了主要的网络通信,网络穿透功能,加密安全功能,视频编码功能。
界面部分是基于核心的功能,使用Qt开发,比较容易地实现跨平台功能。

网络部分最开始使用了UDP协议,为了能支持简便的网络穿透功能。
最近,开发工程师正在添加TCP的支持。
可能将来projecttox也会像skype一样,两种网络协议混用。
在不同的功能上使用不同的网络协议,简化代码,提高可靠性与可用性。

目前在网络穿透功能上,核心部分已经实现了非对称防火墙打洞功能,
对称防火墙的打洞正在做理论研究与测试,相信不久之后也能够加入到核心代码。

在分布式网络方面,使用的是类似bittorrent的分布式DHT网络结构,这一点也与skype类似。
但相比skype来说更是一种无中心结点的分布式网络环境。

Category:

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训练,
使用训练好的分类器文件,识别目标中的字符。

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

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

页面

订阅 RSS - C++


Main menu 2

by Dr. Radut