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:
- If you don’t know what enternet controller is present run the command
lshw -class network
- 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++知识
我也常常写计划,但是常常做到一半都放弃了,写完这个程序也许就是一段新历程的开始吧,我也像灰太狼先生那样说一句:”我一定不会放弃的!!”

