存档在 2013年6月

对多个字节组装成一个帧后发送封装

2013年6月29日

很多时候,我们需要填充一个帧结构然后通过网络或者串口发送出去,另外可能一个帧需要在多个地方进行填充后才发送。我利用下边的封装类完成,使用块进行复制,相对来说速度更快点!
头文件CQueueBuf.h

using namespace std;
class CQueueBuf
{
public:
public:
	CQueueBuf(size_t size);
	~CQueueBuf();

	bool Write(const char *p,size_t l);

	bool Read(char *dest,size_t l);


	bool Remove(size_t l);


	std::string ReadString(size_t l);


	size_t GetLength();

	const char *GetStart();

	size_t GetL();

	size_t Space();

	unsigned long ByteCounter(bool clear = false);

private:
	CQueueBuf(const CQueueBuf& s) {}
	CQueueBuf& operator=(const CQueueBuf& ) { return *this; }
	char *buf;
	size_t maxSizeBytes;
	size_t queueBytes;
	size_t readIndex;
	size_t writeIndex;
	unsigned long bytesCount;
};

其中:
maxSizeBytes为循环缓冲区的大小;
queueBytes为当前在循环缓冲区队列中的字节数;
readIndex为读索引;
writeIndex为写索引;
bytesCount为总的字节计数。

源文件为:

#include "CQueueBuf.h"
#include <string>

CQueueBuf::CQueueBuf(size_t size)
:buf(new char[/*2 * */size])
,maxSizeBytes(size)
,queueBytes(0)
,readIndex(0)
,writeIndex(0)
,bytesCount(0)
{
}

CQueueBuf::~CQueueBuf()
{
	delete[] buf;
}


bool CQueueBuf::Write(const char *s,size_t l)
{
	if (queueBytes + l > maxSizeBytes)
	{
		return false;
	}
	bytesCount += (unsigned long)l;
	if (writeIndex + l > maxSizeBytes)
	{
		size_t l1 = maxSizeBytes - writeIndex;
		memcpy(buf + writeIndex, s, l1);
		memcpy(buf, s + l1, l - l1);
		writeIndex = l - l1;
		queueBytes += l;
	}
	else
	{
		memcpy(buf + writeIndex, s, l);
		memcpy(buf + maxSizeBytes + writeIndex, s, l);
		writeIndex += l;
		if (writeIndex >= maxSizeBytes)
			writeIndex -= maxSizeBytes;
		queueBytes += l;
	}
	return true;
}


bool CQueueBuf::Read(char *s,size_t l)
{
	if (l > queueBytes)
	{
		return false; 
	}
	if (readIndex + l > maxSizeBytes) 
	{
		size_t l1 = maxSizeBytes - readIndex;
		if (s)
		{
			memcpy(s, buf + readIndex, l1);
			memcpy(s + l1, buf, l - l1);
		}
		readIndex = l - l1;
		queueBytes -= l;
	}
	else
	{
		if (s)
		{
			memcpy(s, buf + readIndex, l);
		}
		readIndex += l;
		if (readIndex >= maxSizeBytes)
			readIndex -= maxSizeBytes;
		queueBytes -= l;
	}
	if (!queueBytes)
	{
		readIndex = writeIndex = 0;
	}
	return true;
}


bool CQueueBuf::Remove(size_t l)
{
	return Read(NULL, l);
}


size_t CQueueBuf::GetLength()
{
	return queueBytes;
}


const char *CQueueBuf::GetStart()
{
	return buf + readIndex;
}


size_t CQueueBuf::GetL()
{
	return (readIndex + queueBytes > maxSizeBytes) ? maxSizeBytes - readIndex : queueBytes;
}


size_t CQueueBuf::Space()
{
	return maxSizeBytes - queueBytes;
}


unsigned long  CQueueBuf::ByteCounter(bool clear)
{
	if (clear)
	{
		unsigned long x = bytesCount;
		bytesCount = 0;
		return x;
	}
	return bytesCount;
}


std::string  CQueueBuf::ReadString(size_t l)
{
	char *sz = new char[l + 1];
	if (!Read(sz, l)) 
	{
		delete[] sz;
		return "";
	}
	sz[l] = 0;
	std::string tmp = sz;
	delete[] sz;
	return tmp;
}

Write:为向缓冲区中写bytes数组;
Read:为从缓冲区中读长度为l的字节数,如果不够读则返回false。
Remove:为移除缓冲区中的l字节,内部实现为读l字节;
GetLength:当需要查询一个帧是否组装完成或者需要获取缓冲区中的字节数时非要有用喔!
GetStart:返回读索引

Android

2013年6月29日

Android图片上传(头像裁切+原图原样)

http://blog.csdn.net/geofferysun/article/details/42835669

 

 

  1. Android-ObservableScrollView
    上滚动去掉工具栏,向下滚动可以拉伸。
  2. wechat微信的高仿版本。
  3. GuillotineMenu-Android
    铡刀
    样式,非常棒
  4. jeesite
    JeeSite 是一个企业信息化开发基础平台,Java EE(J2EE)快速开发框架,使用经典技术组合(Spring、Spring MVC、Apache Shiro、MyBatis、Bootstrap UI),包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流等。
  5. ExRecyclerView扩展的RecyclerView,拥有添加头、底等多种操作
  6. KJBlog
    爱看博客客户端
  7. JfinalUIB
    Jfinal实现的用户权限管理系统
  8. PreLollipopTransition
  9. KJFrameForAndroidKJFrameForAndroid 又叫KJLibrary,是一个android的orm 和 ioc 框架。同时封装了android中的Bitmap与Http操作的框架,使其更加简单易用;KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全的开发APP。我们提倡用最少的代码,完成最多的操作,用最高的效率,完成最复杂的功能。
  10. Android_UsingCar_Example基于高德地图Android API快速搭建用车解决方案的示例。
  11. xUtilsxUtils 包含了很多实用的android工具。
  12. lemon

    开源OA

  13. ASimpleCache

    ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。

  14. android-satellite-menu

    安卓卫星菜单。

  15. TouchImageView

    ImageView基础上进行了扩展,包括缩放、拖曳等

  16. AndroidStaggeredGrid

    错开的grid view,支持每一列有多行。

  17. afinal

    Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,我们一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块,我们可以以ajax形式请求http数据。

  18. SuperToasts

    对Toast进行了扩展,功能更 多功能。

  19. SmoothProgressBar

    可定制的ProgressBar。

  20. awesome-android-ui

    多个优秀的android开源项目列表。

  21. android-async-http
    Asynchronous http。
  22. ExpandableLayout

hadoop学习资料

2013年6月29日

1.”Hadoop.Operations.pdf.zip”http://vdisk.weibo.com/s/vDOQs6xMAQH62
2.”Hadoop权威指南(中文版)(带书签).pdf”Hadoop权威指南(中文版)(带书签).pdf
3.”[Hadoop权威指南(第2版)].pdf”[Hadoop权威指南(第2版)].pdf
4.”hadoop权威指南第3版2012.rar”hadoop权威指南第3版2012.rar

5.《Hadoop技术内幕:深入解析HadoopCommon和HDFS.pdf”《Hadoop技术内幕:深入解析Hadoop Common和HDFS.pdf
6.”Hadoop技术内幕:深入解析MapReduce架构设计与实现原理.pdf”Hadoop技术内幕:深入解析MapReduce架构设计与实现原理.pdf

7.”Hadoop实战.pdf”Hadoop实战.pdf
8.”Hadoop实战-陆嘉恒(高清完整版).pdf”Hadoop实战-陆嘉恒(高清完整版).pdf
9.”Hadoop实战(第2版).pdf”Hadoop实战(第2版).pdf
10.”HadoopinAction.pdf”Hadoop in Action.pdf

11″Hadoop in practice.pdf”Hadoop in practice.pdf
12″HadoopThe.Definitive.Guide,3Ed.pdf”Hadoop The.Definitive.Guide,3Ed.pdf
13.”O’Reilly.Hadoop.The.Definitive.Guide.3rd.Edition.May.2012.pdf”O’Reilly.Hadoop.The.Definitive.Guide.3rd.Edition.May.2012.pdf

14.”hadoop入门实战手册.pdf”hadoop入门实战手册.pdf
15.”Hadoop入门手册.chm”Hadoop入门手册.chm

16.”windows下配置cygwin、hadoop等并运行mapreduce及mapreduce程序讲解.doc”windows下配置cygwin、hadoop等并运行mapreduce及mapreduce程序讲解.doc
17″在Windows上安装Hadoop教程.pdf”在Windows上安装Hadoop教程.pdf

18.”Hadoop源代码分析(完整版).pdf”Hadoop源代码分析(完整版).pdf
19.”hadoop-api.CHM”hadoop-api.CHM

20.”HBase-Hadoop@小米.pptx” HBase-Hadoop@小米.pptx
21.”但彬-Hadoop平台的大数据整合.pdf”但彬-Hadoop平台的大数据整合.pdf

22.”QCon2013-罗李-Hadoop在阿里.pdf”QCon2013-罗李
23.”百度hadoop计算技术发展.pdf”百度hadoop计算技术发展.pdf
24.”QCon-吴威-基于Hadoop的海量数据平台.pdf”QCon-吴威-基于Hadoop的海量数据平台.pdf
25.”8步安装好你的hadoop.docx”8步安装好你的hadoop.docx
26.”hadoop运维经验分享.ppsx”hadoop运维经验分享.ppsx

27.”PPT集萃:20位Hadoop专家分享大数据技术工具与最佳实践.rar”PPT集萃:20位Hadoop专家分享大数据技术工具与最佳实践.rar
28.”Hadoop2.0基本架构和发展趋势.pdf”Hadoop 2.0基本架构和发展趋势.pdf
29.”Hadoop与大数据技术大会PPT资料.rar”Hadoop与大数据技术大会PPT资料.rar
30.”Hadoop2011云计算大会.rar”Hadoop2011云计算大会.rar

31.”hadoop开发者(1~3)期.zip”hadoop开发者.zip

开源免费的C/C++网络库(c/c++ sockets library)

2013年6月26日

(1)ACE
庞大、复杂,适合大型项目。开源、免费,不依赖第三方库,支持跨平台。
http://www.cs.wustl.edu/~schmidt/ACE.html

(2)Asio
Asio基于Boost开发的异步IO库,封装了Socket,简化基于socket程序的开发。
开源、免费,支持跨平台。
http://think-async.com/

(3)POCO
POCO C++ Libraries 提供一套 C++ 的类库用以开发基于网络的可移植的应用程序,功能涉及线程、线程同步、文件系统访问、流操作、共享库和类加载、套接字以及网络协议包括:HTTP、 FTP、SMTP 等;其本身还包含一个 HTTP 服务器,提供 XML 的解析和 SQL 数据库的访问接口。POCO库的模块化、高效的设计及实现使得POCO特别适合嵌入式开发。在嵌入式开发领域,由于C++既适合底层(设备I/O、中断处理等)和高层面向对象开发,越来越流行。
http://pocoproject.org/

(4)libevent
Libevent是一个轻量级的开源高性能网络库,从它的官网标题:libevent-an event notification library就能知道它的机制是采用事件触发,封装了以下三种事件的响应:IO事件,定时器事件,信号事件。select模型来实现跨平台的操作,Windows环境下支持IOCP。Google的开源WEB浏览器Chromium在Mac和Linux版本中,也使用了Libevent,足见该库的质量。
http://libevent.org/

(5)libev
libev和libevent很像,按照作者的介绍,可以作为libevent的替代者,能够提供更高的性能。
libev是一个高性能事件循环,所实现的功能就是一个强大的reactor。
http://software.schmorp.de/pkg/libev.html

(6)c++ sockets library
封装了sockets C API的C++类库。
支持SSL, IPv6, tcp 和 udp sockets, sctp sockets, http协议, 高度可定制的错误处理。
http://www.alhem.net/Sockets/

(7)libcurl
libcurl是免费的轻量级的客户端网络库,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet, TFTP. 支持SSL, HTTP POST, HTTP PUT, FTP上传, HTTP form上传,代理,cookies, 用户名与密码认证。
如果你开发的是客户端,libcurl是一个不错的选择。
http://curl.haxx.se/libcurl/

看了之后觉得每个库都不错,这里我具体下载这些库看一下,简单总结一下;
顺便添加一些我找到的网络库;

(1)ACE
庞大、复杂,适合大型项目。开源、免费,不依赖第三方库,支持跨平台。
http://www.cs.wustl.edu/~schmidt/ACE.html
注:除非特别需要,否则不建议;
(2)Asio
Asio基于Boost开发的异步IO库,封装了Socket,简化基于socket程序的开发。
开源、免费,支持跨平台。
http://think-async.com/
注:要配置Boost库,还要熟悉Boost,还是麻烦;

(3)POCO
POCO C++ Libraries 提供一套 C++ 的类库用以开发基于网络的可移植的应用程序,功能涉及线程、线程同步、文件系统访问、流操作、共享库和类加载、套接字以及网络协议包括:HTTP、 FTP、SMTP 等;其本身还包含一个 HTTP 服务器,提供 XML 的解析和 SQL 数据库的访问接口。POCO库的模块化、高效的设计及实现使得POCO特别适合嵌入式开发。在嵌入式开发领域,由于C++既适合底层(设备I/O、中断处理等)和高层面向对象开发,越来越流行。
http://pocoproject.org/
注:没用过,看上面提示为 适合 嵌入式 开发;

(4)libevent
Libevent是一个轻量级的开源高性能网络库,从它的官网标题:libevent-an event notification library就能知道它的机制是采用事件触发,封装了以下三种事件的响应:IO事件,定时器事件,信号事件。select模型来实现跨平台的操作,Windows环境下支持IOCP。Google的开源WEB浏览器Chromium在Mac和Linux版本中,也使用了Libevent,足见该库的质量。
http://libevent.org/
注:看了倒是不错,还是有点麻烦;

(5)libev
libev和libevent很像,按照作者的介绍,可以作为libevent的替代者,能够提供更高的性能。
libev是一个高性能事件循环,所实现的功能就是一个强大的reactor。
http://software.schmorp.de/pkg/libev.html
注:没看;

(6)c++ sockets library
封装了sockets C API的C++类库。
支持SSL, IPv6, tcp 和 udp sockets, sctp sockets, http协议, 高度可定制的错误处理。
http://www.alhem.net/Sockets/
注:看着功能不错,编译,应用还是有点麻烦;

(7)libcurl
libcurl是免费的轻量级的客户端网络库,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet, TFTP. 支持SSL, HTTP POST, HTTP PUT, FTP上传, HTTP form上传,代理,cookies, 用户名与密码认证。
如果你开发的是客户端,libcurl是一个不错的选择。
http://curl.haxx.se/libcurl/
注:没看,放到这里,以后编写网络客户端的时候看看;

(8):C++ Socket Class for Windows ,http://www.adp-gmbh.ch/win/misc/sockets.html;
注:这个文章的文件不可以下载自己复制 保存 h 和 cpp文件;
我用了一下,觉得很不错,也很简单,例子很明了; 不过有一个小小的缺点,只收发字符串,而且接收函数中的判断也有点不好;
如果要用这个库传输文件等数据,需要 自己重载 收发函数,不过也很简单;

(9):SimpleSockets,http://sockets.carrierlabs.com/index.html跨平台,支持 TCP ,UDP;

异步DNS解析

2013年6月26日

Linux系统下面gethostbyname()是内核调用而且是同步的,就是说当多线程程序都要进行DNS解析时,同时只能有一 个线程在执行gethostbyname()代码,其他线程在函数外等待。当多线程/进程进行大量DNS解析时,如果还调用 gethostbyname()方法,显然会成为程序的一个瓶颈。所以我编写一个DNS解析程序,很简单就是基于UDP利用DNS协议发送和解析DNS 包。由于代码工作在操作系统的用户态达到了并行异步的效果。

发几个异步DNS的开源项目:

http://c-ares.haxx.se/

http://sourceforge.jp/projects/sfnet_adns/

.a文件.o文件和.so文件的区别

2013年6月26日

新生童鞋经常问这样的问题,动态链接库与动态链接库如何区分?

看下边的简单描述就知道了

.o 就相当于windows里的obj文件 ,就是编译阶段产生的目标文件,供链接阶段使用;

.a 是好多个.o合在一起,用于静态连接 ,静态链接在链接阶段就将代码融合到程序中了。

.so 是shared object,用于动态连接的,和dll差不多,在需要的时候才调入内存。

CR, LF, CR/LF(回车与换行)

2013年6月25日

在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符.

Dos和windows采用回车+换行CR/LF表示下一行,
而UNIX/Linux采用换行符LF表示下一行,
苹果机(MAC OS系统)则采用回车符CR表示下一行.

CR用符号’r’表示, 十进制ASCII代码是13, 十六进制代码为0x0D;
LF使用’n’符号表示, ASCII代码是10, 十六制为0x0A.
所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示.
一般操作系统上的运行库会自动决定文本文件的换行格式. 如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件.
在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编辑程序代码时. 有时候代码在编辑器中显示正常, 但在编辑时却会因为换行符问题而出错.
很多文本/代码编辑器带有换行符转换功能, 使用这个功能可以将文本文件中的换行符在不同格式单互换.

在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换. 经过这种传输的文件字节数可能会发生变化. 如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本.

C++ Socket library中两个关键接口类[1]IEventHandler

2013年6月24日

IEventHandler主要是针对于Timer Event,所以几个纯虚函数都是与之相关的。

virtual bool GetTimeUntilNextEvent(struct timeval *) = 0;

该接口用于获取下一次Timer Event触发的时间,结果由值-结果参数timeval传回。这个结构体的定义可以查看struct timeval结构体 以及 gettimeofday()函数
如果有下一个Timer Event则返回true,否则返回false。可以来看看IEventHandler的派生类EventHandler是怎么实现该接口的。

bool EventHandler::GetTimeUntilNextEvent(struct timeval *tv)
{
	//如果事件链表为空,表明没有下一个可用的timer Event
	if (!m_events.size())
		return false;
	std::list::iterator it = m_events.begin();
	if (it != m_events.end())
	{
		//获取现在时刻
		EventTime now;
		//和链表中的时刻进行比较
		mytime_t diff = (*it) -> GetTime() - now;
		if (diff < 1) 		{ 			diff = 1; 		} 		//对这个时间间隔进行返回 		tv -> tv_sec = static_cast(diff / 1000000);//秒
		tv -> tv_usec = static_cast(diff % 1000000);//微妙零头
		return true;
	}
	return false;
}

» 阅读更多: C++ Socket library中两个关键接口类[1]IEventHandler