Windows上Boost库的编译与使用

网上找cpp的正则表达式库,基本上有以下几个GNU Regex Library, Boost.Regex, PCRE, PCRE++,GRETA等,其中GNU不支持多字节跳过、PCRE及兄弟PCRE++由于才疏学浅编译不通过跳过、GRETA编译不通过跳过。值得一提的是网上有人对比说GRETA比Boost Regex效率在某些时候更高、且体积明显小得多,如果有朋友编译通过(注:本来都是在VS2008和VS2010下尝试的)的话可以通知我,毕竟Boost是个体积相当庞大的家伙,用简单的功能引入的库太大不太好。

Introduce Boost

Boost是一个开源的CPP库,类似于STL,功能强大,但由于不是标准,所以需要用户自己安装。网上介绍Boost的文章太多,我就不多说。官网:http://www.boost.org/

Get Boost

从官网下载到最新版本,现在是1.49.0版本的源码包,下载地址http://www.boost.org/users/download/,也可以通过Installer直接安装,通过Installer不需要自己编译了,直接下载的就是Binary和头文件,很爽,在这里http://www.boostpro.com/download/可以下到相应版本的Installer

Complile Boost

网上找到的关于编译Boost的文章有许多,方法也有许多,但是我的方法绝对是最简洁的。

1.解压源码包到磁盘,比如我的:

F:\boost_1_49_0

2.双击bootstrap.bat。

3.双击生成的bjam.exe。

4.等待10分钟左右,就编译完成,在F:\boost_1_49_0\stage\lib目录下就是所有的Lib了。

F:\boost_1_49_0\stage\lib

其他编译方法:

http://www.cnblogs.com/xdotnet/archive/2009/03/26/pcre_windows.html

http://blog.sina.com.cn/s/blog_496be0db0100yh5p.html

http://blog.sina.com.cn/s/blog_59a586490100ixkx.html

http://blog.csdn.net/zhangyu666/article/details/5459693

Use Boost

关于使用,源码包中的Html文件中已经说的很详细了。在VS2010中就和引用普通的lib一样。比如:新建Welcome项目,在解决方案管理器中右击该解决方案,设置VC directorys中的头文件和lib目录。见下图:

测试代码如下:

#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
    std::string line;
    boost::regex pat( "^subject: (re: |aw: )*(.*)" );

    while (std::cin)
    {
        std::getline(std::cin, line);
        boost::smatch matches;
        if (boost::regex_match(line, matches, pat))
            std::cout << matches[2] << std::endl;
    }
}

运行截图:

毕设之数据库服务器–SQLServer2008R2

数据库服务器选用了经典的SQLServer 2008 R2 的Express版本。

毕设之分布式缓存–Couchbase

Couchbase介绍

Couchbase是一个很优秀的Memcached服务器,官网http://www.couchbase.com.

Couchbase安装

参见http://www.couchbase.com/develop/net/current,非常易用。

nginx-http-push-module编译安装

下载Nginx与Nginx-http-push-module源码,NHPM下载最新版即可,Nginx按照NHPM推荐的版本下载,切不可盲目图新。

下载地址:
Nginx:http://nginx.org/
NHPM:http://pushmodule.slact.net/

我这里下载的是Nginx0.8.55版本、NHPM0.692版本。

mkdir /data0/software -p
cd /data0/software
wget http://nginx.org/download/nginx-0.8.55.tar.gz
wget http://pushmodule.slact.net/downloads/nginx_http_push_module-0.692.tar.gz
tar zxvf nginx_http_push_module-0.692.tar.gz
tar zxvf nginx-0.8.55.tar.gz
cd nginx-0.8.55
apt-get update
apt-get install libpcre3 libpcre3-dev
apt-get install openssl
apt-get install libssl-dev
./configure --prefix=/usr/local/nginx --add-module=/data0/software/nginx_http_push_module-0.692

 

基于Nginx的Comet服务器-NGiNX_HTTP_Push_Module

毕设需要实现一个可以实时消息推送的框架,按照原始思想:TCP长连接,保持心跳,有消息实时推送。这其中要实现许多诸如内网打洞等高难度动作。且不说这一整套实现的复杂性,单考虑网络环境的多变,就已经很有挑战性了。有的用户甚至处于内网之中,更有甚者只能使用HTTP代理上网。

技术发展,有一种不算新的新技术”反向Ajax”出现了。在websocket没有广泛普及之前,这是一个很好的解决途径。

网上乱逛搜到一个基于Nginx的插件:NGiNX_HTTP_Push_Module,简称:NHPM,名字够抽象吧~

不过Nginx出了名的高并发,再加上NHPM高效的算法实现,轻松handle百万级的长连接再也不成问题,妈妈再也不用担心我的学习,哦也~

项目地址http://pushmodule.slact.net/

Atheros AR8151 Drivers Installation

Last week, i got a ACER ASPIRE 4743G Laptop with windows xp pre-installed and Atheros AR8151 Gbit network interface .I works well,both wired and wireless network.Today I change my system software to Ubuntu.The wireless network works well,but the other way goes the wired network.After i use the COMMAND ifconfig,I realised that what has happend.After I finished installing the Atheros AR8151 drivers,it works fine.

download drivers from here:http://media.cdn.ubuntu-de.org/forum/attachments/2666793/AR81Family-linux-v1.0.1.14.tar.gz
You can solve it with these:

  1. If you don’t know what enternet controller is present run the command

    lshw -class network

  2. Once you have downloaded the .gz pacakage, put it into a empty folder and run the following commands

    tar -xzvf AR81Family-Linux-v1.0.1.9.tar.gz
    sudo su
    make install
    modprobe atl1e
    exit

IE6/IE7绝对定位position:absolute相邻元素margin-top失效的bug

bug复述

ie6的bug,绝对定义(position:absolute)的相邻元素margin-top会失效;

条件:
1、 相邻元素是有width属性的,如果去掉width属性,margin-top又会生效.
2、 增加相邻元素浮动,margin-top也会又会生效

解决方法:
1、如果没有复杂的背景什么的可以使用padding-top替换margin-top;
2、还可以在相邻元素间插入一个空标签的方法;

我选择的是解决方案2″在相邻元素间插入一个空标签的方法”

百度2012校招笔试题-系列1

某位牛人从百度现场偷出来的题目,有兴趣的可以试一下,您也可以把你的想法发在下边。
题目:
一、基础题
1、C++中的v…操作:
1)push_back函数运行后的内存分配是如何的
2)clear函数运行后内部是如何运作的,如果要释放内存,需要进行如何操作
2、说明程序中有的问题
foo函数统计a-z中每个字符出现的个数

   void foo(char a[100],int chur[256])
   {
       meseat(chur,0,sizeof(chur[256]));
       while(*a!='\0')
       {
           ++chur[*a];
           ++a;
        }
        for(char ch='a';ch<='z';++ch)
        {
            printf(%c:%d,ch,chur[ch]);
         }
   }
    void main()
    {
        char a[100]="百度abc";
        char chur[256];
        foo(a,chur);
        return 0;
     }

二、算法设计
1、rand(s,t)随机出[s,t]之间的小数,已知圆的半径为R,要随机得出n个圆内部的点,问你如何使用rand(s,t)实现此功能,且计算出时间复杂度
2、系统要每天随机记录每个用户访问的query,但由于用户众多,无法全部记录,每天只能记录m个query,如何做到记录每个query的概率基本相同,请设计一种算法并对其进行分析(注意,不到最后一刻不知道用户的总访问量是多少)
三、系统设计
1、针对服务器和客户端的情况,正常情况下只允许每个客户端每分钟发送一个请求,一分钟内其余的操作被认为是非法操作,设服务器能够获知每个用户的ipv6地址作为id,但一个服务器的hash表中无法容纳这么多用户的ipv6地址,请设置一个算法,迅速对此情况进行过滤,可以使用多台服务器,但使用的服务器越少越好,请画出相应的图表,并写出关键代码

使用WinINet下载HTTP资源文件

下载资源很简单,但是从发起请求到完整取到资源还有一段很长的路要走。

涉及到得知识:

  • InternetOpen/准备发起Internet请求并获得internet句柄
  • InternetOpenUrl/发起Internet请求并获得文件句柄,该文件句柄与文件系统的句柄不通用!
  • InternetQueryDataAvailable/查询数据是否可用并获取数据长度,如果可用则返回TRUE,否则将挂起直到数据可用
  • InternetReadFile/读取数据,这一步可能涉及到默认编码转换问题如GZip自动解码,如果没有需要根据返回格式自己动手。如服务器返回HTML使用UTF-8则需要使用MultiByteToWideChar把UTF-8编码转换成wchar_t类型。
  • MultiByteToWideChar/如上一条,UTF-8是三字节的东西,而我们的程序一般处理ANSI或者Unicode,故需要转换
  • InternetCloseHandle /资源用完就要还,小时候妈妈告诉我:”东西用完了不放回原处就要打PP”

放代码:

#include "stdafx.h"
#include <Windows.h>
#include <WinInet.h>
#pragma comment(lib,"wininet")

int _tmain(int argc, _TCHAR* argv[])
{
	HINTERNET hInternet =  InternetOpen(L"QDou",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
	if(!hInternet)
	{
		printf("打开INTERNET失败!错误码 %i\r\n",GetLastError());
		return -1;
	}
	HINTERNET hFile = InternetOpenUrl(hInternet,L"http://douban.fm/j/mine/playlist?type=n&h=&channel=1&from=mainsite&r=a17847251d",NULL,0,INTERNET_FLAG_EXISTING_CONNECT,NULL);//豆瓣FM播放列表文件
	if(!hFile)
	{
		printf("打开url错误,错误码 %i\r\n",GetLastError());
		InternetCloseHandle(hInternet);
		return -1;
	}
	DWORD datalength = 0 ;
	if(InternetQueryDataAvailable(hFile,&datalength,0,0))//会挂起,直到数据可用
	{
		//开始读取文件
		char *pstrBuffer = new  char[datalength];
		DWORD alreadyRead = 0;
		if(InternetReadFile(hFile,pstrBuffer,datalength,&alreadyRead))
		{
			//读取文件成功
			wchar_t *pHTML = new wchar_t[datalength];;
			int outSize = 0;
			outSize = MultiByteToWideChar(CP_UTF8,0,pstrBuffer,-1,NULL,0);//获取需要多少缓存
			if(0!=outSize)
				outSize = MultiByteToWideChar(CP_UTF8,MB_COMPOSITE,pstrBuffer,outSize,pHTML,datalength);//真正的转换
			if(0==outSize)
			{
				int errCode = GetLastError();
				printf("读取文件失败,错误码%i",errCode);
				switch(errCode)
				{
				case ERROR_INSUFFICIENT_BUFFER:
					printf("ERROR_INSUFFICIENT_BUFFER\r\n");
					break;
				case ERROR_INVALID_FLAGS:
					printf("ERROR_INVALID_FLAGS\r\n");
					break;
				case ERROR_INVALID_PARAMETER:
					printf("ERROR_INVALID_PARAMETER\r\n");
					break;
				case ERROR_NO_UNICODE_TRANSLATION:
					printf("ERROR_NO_UNICODE_TRANSLATION\r\n");
					break;
				}
				InternetCloseHandle(hInternet);
				return -1;
			}
			printf("%s",pHTML);
			delete []pstrBuffer;
			delete []pHTML;
			pHTML = NULL;
			pstrBuffer = NULL;
		}
		else
		{
			printf("读取文件失败,错误码%i",GetLastError());
			InternetCloseHandle(hInternet);
			return -1;
		}
	}
	else
	{
		DWORD errcode = GetLastError();
		if( ERROR_NO_MORE_FILES == errcode)
		{
			printf("没有找到可用数据");
		}else
		{
			printf("查看数据是否可用错误,错误码 %i\r\n",errcode);
		}
		InternetCloseHandle(hInternet);
		return -1;
	}
	InternetCloseHandle(hInternet);
	return 0;
}

 

QDou计划启动

十一长假,无聊回顾一下C/C++,一直对自己的C/C++没什么信心,所以趁着这个时间好好练习一下。

经常和别人说:”我只学过,但没用过,不过应该可以,因为我C#如何如何……”,但这样终究心里还是没底,有人常说一切程序设计都是相同的,其实我想说,前提是你到了一定的境界,如果你想达到这种境界呢,就需要广泛的涉猎,大量的实际应用,这样你不知不觉中也就了解了其他语言的特性(这个时候你可能会说语言都是相通的,我没怎么学某某,但是给我时间我也能用上来),否则你是很难达到这个境界的。

QDou是一个豆瓣FMWindows客户端,使用VC编写,使用win32 SDK作为基础,使用HTMLayout做为界面引擎。

目前觉得涉及到得知识可能有如下这些:

  • Win32 API
  • HTMLayout
  • DirectShow
  • Windows 网络编程API WinINet

需要解决的问题:

  • Windows网络编程,使用HTTP协议获取内容
  • XML、JSON等格式数据解析
  • Windows平台音乐播放
  • Win32应用程序界面编程
  • VC/VC++知识

我也常常写计划,但是常常做到一半都放弃了,写完这个程序也许就是一段新历程的开始吧,我也像灰太狼先生那样说一句:”我一定不会放弃的!!”