2012年3月13日星期二

Boost中的Regex类库将部分中文识别为空白字符的问题原因及解决办法

问题描述:
使用字符类\s匹配一个字符串中的空白字符时,部分中文字符也将被识别为空白。

原因:
查看Boost的Regex源代码可以发现,Regex使用cpp_regex_traits类(在文件 boost/regex/v4/cpp_regex_traits.hpp 中定义)来处理字符类


// class cpp_regex_traits_base:
// acts as a container for locale and the facets we are using.
//
template
struct cpp_regex_traits_base
{
cpp_regex_traits_base(const std::locale& l)
{ imbue(l); }
std::locale imbue(const std::locale& l);

std::locale m_locale;
std::ctype const* m_pctype; //这个类用来识别空白符
//……
}


可以看到Regex使用std::ctype类来识别空白符等
ctype类有一个is成员函数用来判断某个字符是否属于空白字符或数字字符等,regex正是使用了这个成员函数。
查看这个成员函数的介绍可知字符类是在cctype头文件中定义的
cctype头文件定义了一系列函数来分类和转换单个字符,函数isspace来判断一个字符是否为空白字符
再来看函数isspace的说明,可知在C++中,指定了locale的此函数的模板版本存在于头文件中.
也就是说指定不同的locale,此函数的行为将不同。而默认的locale为"C" locale集。这就是问题的根源。

解决办法:1.使用[ \t\r\n]等特定的字符来代替\s
2.设置合适的locale并使用宽字符集和Regex的宽字符版本wregex

2012年3月7日星期三

Windows下编译和安装Boost库的指定模块

当然你可以使用www.boostpro.com提供的安装工具来安装,免去以下的步骤。但是那会安装许多不必要的文件,占用大量磁盘空间,有可能使你更迷惑。可参见这篇文章

如果你想了解如何一步步编译安装Boost库,请接着往下读。

一、到官网(www.boost.org)下载最新版Boost并解压到任意目录
先来看一下解压后的目录结构,以$BOOST_ROOT代表你Boost所在的目录

$BOOST_ROOT\ .................boost 根目录
index.htm .........A copy of www.boost.org starts here
boost\ .........................所有的Boost头文件
libs\ ............各种库的测试用例,文档说明。可以在这个文件夹中查看各种库怎么使用
index.html ........库文档从这里开始
algorithm\
any\
array\
…更多的库…
status\ .........................Boost范围测试套件
tools\ ...........一些有用工具, 比如 Boost.Build, quickbook, bcp
more\ ..........................政策等其它文档.
doc\ ...............所有Boost库文档的子集


二、编译需要的库
首先要说明的是大多数Boost库现在已经可以使用了,直接包含boost目录下相应的头文件即可,并不需要编译安装。

以下是必须编译安装的Boost库:


以下库拥有可选的编译组件(也就是说如果你要使用它们中的某些功能,则需要单独编译安装)

  • Boost.DateTime 当你使用它的 to_string/from_string 或者序列化特性, 或者目标平台为 Visual C++ 6.x 或 Borland.

  • Boost.Graph 仅仅当你想 处理 GraphViz 文件.

  • Boost.Math 含有TR1 和 C99 cmath 函数二进制组件.

  • Boost.Random 当你使用 random_device.

  • Boost.Test 可以 “header-only” 或 “separately compiled”
    模式使用, 尽管 对于郑重使用时推荐单独编译.



如果要编译上面的库,首先打开命令行,转到$BOOST_ROOT目录并运行目录下的bootstrap.bat脚本,这个脚本为Boost.Build系统的运行准备环境。

bootstrap.bat

可以看到现在$BOOST_ROOT目录下有b2.exe和bjam.exe两个可执行文件。这两个文件是一样的,只是名字不同,它们可以调用Boost.Build系统来创建上面那些需要编译安装的库。

比如我们想单独编译安装regex库,运行下面的命令即可

bjam stage --with-regex link=static threading=multi runtime-link=static

下面介绍相关参数的含义:
stage 仅创建和安装库文件(不创建头文件),可以用 --stagedir= 选项指定库的安装位置,默认安装在当前目录下的stage文件夹内。
--with- 创建和安装指定的库,如果使用了这个选项,则仅仅指定的库被创建,其它库不被创建。如果不指定这个选项,默认创建所有需要编译安装的库。
link=static指定生成静态regex库
threading=multi指定生成多线程库
runtime-link=static指定链接静态C和C++ 运行库

其他选项可参见这篇文章

三、配置开发环境
打开Visual Studio,在 工具->选项->项目和解决方案->VC++目录 条目下配置Boost包含文件和库文件目录,这样以后就不用每次都要配置Boost目录。

C++程序配置类库

一、INI文件读取库


除了使用Windows提供的API函数(见之前文章介绍)和BoostQTwxWidgets等类库提供的配置函数外,还可以使用下面的类库:

1.SimpleIni(code.jellycan.com/simpleini/)


一个跨平台的类库,提供简单的API读写INI文件,支持ASCII, MBCS and Unicode文件格式。开源,使用MIT协议。
使用方法:

CSimpleIniA ini;
ini.SetUnicode();
ini.LoadFile("myfile.ini");
const char * pVal = ini.GetValue("section", "key", "default");
ini.SetValue("section", "key", "newvalue");


2.RudeConfig(rudeserver.com/config/index.html)



// Create config object
//
Config config;


// load a configuration/.ini file
//
config.load("myfile.ini");


// read information
//
config.setSection("General Info");
double cost = config.getDoubleValue("Cost");
const char *company = config.getStringValue("Company Name");


// create information
//
config.setSection("new section");
config.setStringValue("animal type", "giraffe");
config.setBoolValue("mammal", true);

// save changes
//
config.save();


3.minIni(code.google.com/p/minini/)


minIni是一个在嵌入式系统中使用的读取INI文件库。minIni占用极少资源,可以为各种文件IO库配置。

二、XML文件读取库


1.TinyXML-2(grinninglizard.com/tinyxml2docs)


如名字所示,是简单的XML文件读取库,并且是第二版。仅包含一个.h文件和一个.cpp文件,直接和自己的源代码一起编译即可使用。


三、序列化文件(类似JSON格式)读取库


1.libconfig(hyperrealm.com/libconfig/)


Libconfig是一个简单的用来处理结构化配置文件的库,像这样的文件:test.cfg。这种文件格式比XML更紧凑易读。不像XML,它是可识别类型的,所以在程序代码中不必做字符串解析。

int var1;
double var2;
const char *var3;

if(config.lookupValue("values.var1", var1)
&& config.lookupValue("values.var2", var2)
&& config.lookupValue("values.var3", var3))
{
// use var1, var2, var3
}
else
{
// error handling here
}

2012年2月21日星期二

科学家部署激光器、GPS技术来改善降雪测量

通过配备专门的激光和GPS技术,国家大气研究中心(NCAR)的科学家们正在与同事一道解决一个关键的冬季天气奥秘:如何准确地测量地面上的降雪量。

运输船员,水资源管理者和其他那些重大安全决策者需要对于积雪深度如何在大范围内分布的精确测量。 但是当积雪量在单一区域或街道变化时,传统的测量设备,如雪压表或尺度杆往往不能够捕获 降雪总量。

[caption id="attachment_1136" align="alignleft" width="375" caption="Ethan Gutmann examines a laser instrument for measuring snow. "]Ethan Gutmann examines a laser instrument for measuring snow. [/caption]
现在,科学家们发现,使用光脉冲、卫星信号和其他技术的原型装置提供了几乎实时测量大面积降雪量的可能性。 随着时间的推移,这种装置甚至可能提供全球积雪深度的图像。

“我们已经准确测量降雨几个世纪了,但降雪量更难测量,因为它受风吹日晒和其他因素的影响”,NCAR的科学家伊桑•葛特曼(Ethan Gutmann),“看起来新技术将最终使我们能够精确地说出多少雪降在地面上。”

NCAR正与几个合作组织,包括美国国家海洋和大气管理局(NOAA)和科罗拉多大学博尔德大学(University of Colorado Boulder)进行这项研究。 这项工作得到NCAR的赞助商--国家科学基金会的支持。

不确定的深度


在大风暴期间应急管理人员依靠降雪观测来调集雪犁,或决定是否关闭高速和机场。 他们还使用雪总量来决定一个地区是否达到灾难援助的资格。 在山区,官员需要准确的积雪深度报告来评估雪崩或洪水的威胁,并预估从春季和夏季径流可用的水总量。

更精确的测量,还可以帮助气象学家和水文学家更好地了解雪物理和水文过程。

但传统的测雪方法可能极大低估或高估雪总量​​,特别是在恶劣的条件下。 在大风暴中雪仪表可能会缺测几乎三分之一的雪,即使当他们被专门设计的围栏保护起来以减少风的影响。 雪探头或雪尺可以在有限的区域内揭示积雪深度。 但是,这些工具需要不同地点的很多人工测量,这种方法在大雪期间可能无法得到雪总量。

[caption id="attachment_1137" align="alignleft" width="450" caption="Snow dunes. The three-dimensional features of a snow field above treeline is revealed by laser measurements. The laser, installed by NCAR at a test site in the Rocky Mountains, measures snow at more than 1,000 points across an area almost the size of a football field. "]Snow dunes[/caption]
气象专家有时也会监测收集在平坦、白色的被称为雪板的木板上的降雪量,但是这是一个时间密集型的方法,需要人每隔几个小时来检查雪板并清除他们。 两个全国最大的志愿者努力--全国天气服务合作观察员计划和社会协作雨、冰雹和雪网(CoCoRaHS)--每一个涉及全国数千名使用雪板的参与者,但他们的报告通常是仅仅一天提出一次。

最近,超声波装置已部署在一些世界上最寒冷的地区。 就像雷达,这些设备测量携带能量的超声波脉冲抵达雪面并返回到发射器所需的时间长度。 然而,信号可能受不断变化的大气条件(包括温度、湿度和风)的影响。

测试新方法


NCAR正在发展的专门的激光仪器可以纠正这些问题。 一旦设置在一个位置,它们就可以自动测量大面积的积雪深度。不同于超声仪器,激光依靠不受大气条件影响的光脉冲。

[caption id="attachment_1138" align="alignleft" width="350" caption="Ethan Gutmann walks past a snow gauge at a research site in Colorado."]snow gauge[/caption]
古特曼新的测试表明,安装在博尔德以西的落基山脉高于树线以上的激光仪器,可以测量10英尺以上的积雪,和测量半英寸的精度相当或更好。 这种仪器,在一个多小时里,在几乎是一个足球场大小的区域内测量超过1000个点的积雪,产生一个积雪深度及其变化的三维图像。

古特曼的下一步--如果他能获得急需的资金--将是建立和测试可以测量几平方英里的雪的激光仪器。 测量如此大的区域需要一个能够以每秒获取超过12,000个测量的新工具。

“如果我们成功了,一下子这些类型的工具将能够显示横跨整个流域的降雪的图像”他说。

然而,激光器的一个限制是光脉冲不能穿透物体,如树木和建筑物。这可能需要低成本的激光装置网络的发展,它们将记录每一个封闭区域内的积雪深度。另外,未来配备了这种激光器的卫星可能拥有从上面观测整个世界降雪的能力。

古特曼和Kristine拉尔森--在美国科罗拉多州大学的同事--也正在探索如何使用GPS传感器来进行降雪测量。 GPS传感器记录了两个卫星的信号,直接达到雪表面和地面反射的信号。 当地面上有雪,GPS信号用(相比地面是裸露的土壤)不同的频率反射雪,使科学家能够确定在地面之上是多高的雪面。

这些传感单元可能是一个经济有效的测量雪总量的方法,因为气象学家可以利用现有的地面GPS接收机的全球网络。 然而,研究人员正在充分了解雪的密度和其表面粗糙度如何改变GPS信号。

“我们希望建立一个高科技工具,使官员不断监测积雪深度,即使在强烈的风暴期间,”拉森说。 “虽然我们仍然需要做很多工作,该技术非常有前途。”

“我认为这项技术具有很大的可能让应急管理人员和其他决策者受益,就想我们的天气预报”,古特曼说。

原文链接:scientists-deploy-lasers-gps-technology-improve-snow-measurements

2012年2月13日星期一

PHP代码获取当前系统的CPU和内存的空闲百分比

设想我们有一个php页面A比较耗资源,因此在每次执行页面A中的代码前需要检测一下系统目前CPU和内存的空闲百分比。
我们可以利用下面几个函数来解决这个问题


//获取cpu的空闲百分比
function get_cpufree(){
$cmd = "top -n 1 -b -d 0.1 | grep 'Cpu'";//调用top命令和grep命令
$lastline = exec($cmd,$output);

preg_match('/(\S+)%id/',$lastline, $matches);//正则表达式获取cpu空闲百分比
$cpufree = $matches[1];
return $cpufree;
}
//获取内存空闲百分比
function get_memfree(){
$cmd = 'free -m';//调用free命令
$lastline = exec($cmd,$output);

preg_match('/Mem:\s+(\d+)/',$output[1], $matches);
$memtotal = $matches[1];
preg_match('/(\d+)$/',$output[2], $matches);
$memfree = $matches[1]*100.0/$memtotal;

return $memfree;
}

//获取某个程序当前的进程数
function get_proc_count($name){
$cmd = "ps -e";//调用ps命令
$output = shell_exec($cmd);

$result = substr_count($output, ' '.$name);
return $result;
}


比如当CPU空闲率小于30%时我们延迟页面A执行:

$cpufree = get_cpufree();

while( $cpufree<30 ){
// wait for 0.1 seconds
usleep(0.1*1000000);
$cpufree = get_cpufree();
};

2012年2月9日星期四

在线绘制近10年全球天气形势图(chatianqi.org)

天气预报等气象行业经常要与天气图打交道,查看并分析500hPa、700hPa等不同层次的高度场、温度场、湿度场和风场等要素,了解对流层的结构,从而制作天气预报。而每次遇到暴雨强对流等灾害性天气,更要认真分析实时的天气图,之后还要总结各种灾害性天气出现时对应的典型天气形势。只有对大量灾害性天气的形势图进行总结分析,才能得出规律,以便更好进行下一次预报。

而每次写技术总结,学术交流文章,写论文都要再次回顾一些天气个例,利用绘图工具对典型的天气形势进行绘图。很多人会对那些复杂的绘图命令望而生畏,即使对一些绘图工具有一些了解,绘制专业并且漂亮的天气形势图也需要花费大量的时间。而且你需要重新整理各种历史资料,提取需要的数据等,而这种资料的整理也需要花费大量时间。

现在给大家推荐一个网站,可以在线绘制近10年全球天气形势图,让大家省却以上烦恼并将为大家节省大量宝贵的时间。
网址为:chatianqi.org 十分好记,就是"查天气"的拼音

无论你在何地,使用任何设备(单位电脑、平板电脑等),只要能连接互联网,就可以打开这个网站查看任一日期的天气图,并可以对比多个层次、多个时次的天气图。
快来体验一下吧!

2012年1月2日星期一

推荐一些适用于安卓(Android)平板的应用




  • 1.百度输入法Pad版 (官方网站)


    个人觉得很好用

  • 2.安卓市场平板客户端 (官方网站)


    这里可以搜索并下载各种应用与游戏,资源比较丰富

  • 3.MoboPlayer (官方网站)


    比较好用的视频播放器软件,支持各种视频格式

  • 4.Evernote (官方网站)


    强大的笔记本软件,可在各种平台间同步笔记。
    国内类似的应用为有道云笔记,但功能差远了,在wifi代理情况下不能同步。

  • 5.鲜果联播Android HD版 (官方网站)


    杂志般的阅读体验,可订阅各种内容。这个可以取代RSS阅读器了。

  • 6.Google Maps (官方网站)


    google 官方的地图应用,强大易用不必多说。另外Google Sky Map还可以查看星空。

  • 7.Google Music (官方网站)


    Google的另一个应用,这个一定要安装,超炫的音乐播放器。有人说你装了这个软件就再也不想装其他的音乐播放器了

  • 8.豆瓣FM (官方网站)


    豆瓣电台,自动推荐歌曲

  • 9.云中书城 (官方网站)


    盛大出品的阅读应用,可以下载各种电子书

  • 10.Twitter (官方网站)


    这个不解释

  • 11.豌豆荚 (官方网站)


    在Windows下安装豌豆荚程序,可以向android平板里面安装应用,并且可以截取平板上面的屏幕图像

  • 12.豆果美食 Android Pad版 (官方网站)


    发现的唯一针对Android平板进行优化设计的食谱应用,内容很丰富,拿着平板可以做菜了

  • 13.Adobe Reader (官方网站)


    官方的PDF阅读器,很流畅,支持文本重排,阅读体验非常好

  • 14.开卷有益 (官方网站)


    支持TXT EPUB UMD CHM HTML JPG PNG GIF CBZ格式电子书 漫画和图片。