Archive for the ‘开源工具库’ Category.

ngrok安装问题

ngrok是一个反向代理,通过公网服务器与内网机器建立一条安全通道,使用得在其它地方的电脑能够通过这条通道访问内网服务。类似的技术还有SSH反向隧道。

在国内环境中使用ngrok官网提供的服务会被墙,所以需要自己搭建ngrok服务器,那么就涉及到安装的问题,如果安装可以参考其它资料。

在安装ngrok服务器端的过程发现,执行到下面这步就卡死不动了

gopkg.in/inconshreveable/go-update.v0  (download)

这是由于使用yum install git方式安装的git,需要下载git源码进行编译安装

yum -y install perl-devel perl-CPAN
yum install tcl  build-essential tk gettext
yum install -y curl curl-devel
git clone https://github.com/git/git.git
cd git
./configure
make && make install
cp /usr/local/bin/git /usr/bin/

安装成功后,就能继续编译ngrok了

开源许可证的一些介绍

Apache v2 License

Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:

  1. 需要给代码的用户一份Apache Licence
  2. 如果你修改了代码,需要再被修改的文件中说明。
  3. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
  4. 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

MIT License

MIT许可证之名源自麻省理工学院(Massachusetts Institute of Technology, MIT),又称「X条款」(X License)或「X11条款」(X11 License)

MIT内容与三条款BSD许可证(3-clause BSD license)内容颇为近似,但是赋予软体被授权人更大的权利与更少的限制。

被授权人有权利使用、复制、修改、合并、出版发行、散布、再授权及贩售软体及软体的副本。

被授权人可根据程式的需要修改授权条款为适当的内容。

在软件和软件的所有副本中都必须包含版权声明和许可声明。

此授权条款并非属copyleft的自由软体授权条款,允许在自由/开放源码软体或非自由软体(proprietary software)所使用。

此亦为MIT与BSD(The BSD license, 3-clause BSD license)本质上不同处。

MIT条款可与其他授权条款并存。另外,MIT条款也是自由软体基金会(FSF)所认可的自由软体授权条款,与GPL相容。

GPL v2

我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。

GPL协议的主要内容是只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。

由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。
Continue reading ‘开源许可证的一些介绍’ »

在windows和linux使用wxWidgets编写程序

按照上一篇文章http://www.zoudaokou.com/index.php/archives/658安装完wxWidgets后,就可以开始wxWidgets编程之旅了。

在windows下,创建一个VC工程,然后配置工程属性,加入wx的include路径,需要注意的是,在编译时会报setup.h找不到,它在include\msvc\wx目录下,将其复制到include\wx下再编译。然后再加入wx的lib路径及所需要的lib文件wxmsw30u_html.lib wxmsw30u_core.lib wxbase30u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib即可。

在linux下,使用make install会将include和lib都安装到usr/local目录中,在写makefile文件时需要指定它们的路径和名称,而在编译wx时会生成wx-config文件,这个文件可以用来自动指定include和lib的位置以及一些编译选项,使用wx-config –libs或wx-config –cxxflags即可。

新建一个minimal.cpp文件,内容如下:

// wxWidgets "Hello world" Program

// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>

#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif

class MyApp: public wxApp
{
public:
    virtual bool OnInit();
};

class MyFrame: public wxFrame
{
public:
    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
private:
    void OnHello(wxCommandEvent& event);
    void OnExit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);

    wxDECLARE_EVENT_TABLE();
};

enum
{
    ID_Hello = 1
};

wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(ID_Hello,   MyFrame::OnHello)
    EVT_MENU(wxID_EXIT,  MyFrame::OnExit)
    EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()

wxIMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame( "Hello World", wxPoint(50, 50), wxSize(450, 340) );
    frame->Show( true );
    return true;
}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
        : wxFrame(NULL, wxID_ANY, title, pos, size)
{
    wxMenu *menuFile = new wxMenu;
    menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
                     "Help string shown in status bar for this menu item");
    menuFile->AppendSeparator();
    menuFile->Append(wxID_EXIT);
    wxMenu *menuHelp = new wxMenu;
    menuHelp->Append(wxID_ABOUT);
    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, "&File" );
    menuBar->Append( menuHelp, "&Help" );
    SetMenuBar( menuBar );
    CreateStatusBar();
    SetStatusText( "Welcome to wxWidgets!" );
}

void MyFrame::OnExit(wxCommandEvent& event)
{
    Close( true );
}

void MyFrame::OnAbout(wxCommandEvent& event)
{
    wxMessageBox( "This is a wxWidgets' Hello world sample",
                  "About Hello World", wxOK | wxICON_INFORMATION );
}

void MyFrame::OnHello(wxCommandEvent& event)
{
    wxLogMessage("Hello world from wxWidgets!");
}

Continue reading ‘在windows和linux使用wxWidgets编写程序’ »

linux编译wxWidgets

windows编译wxWidgets没什么好说的,解压wxWidgets后,找到build\msw下面的.dsw或.sln文件,打开编译即可,它有四种编译模式,Debug和Release是编译成静态库调用的,Debug dll和Release dll是编译成动态库的。

而linux编译wxWidgets是需要gtk库,若系统中未安装gtk则需要手动安装,ubuntu可以直接使用sudo apt-get install libgtk-3-dev来安装,大约17M左右,Suse可以使用yast来安装。在使用./configure命令时报找不到gtk则要先安装gtk。

wxWidgets库是使用bz2格式压缩的,先使用

bzip2 -d wxWidgets-3.0.0.tar.bz2

解压成wxWidgets-3.0.0.tar文件,然后使用

tar -xvf wxWidgets-3.0.0.tar

解压到wxWidgets-3.0.0目录,然后进入到该目录,执行./configure

cd wxWidgets-3.0.0
./configure

配置约两分钟左右,完成后,进行编译

make

未指定安装目录,则默认安装到系统/usr/目录中,有些系统需要root权限,否则执行make install时会报权限不够,所以先使用su切换成root用户

su
make install
ldconfig

这样wxWidgets就安装好了,可以使用下面的命令查询wxWidgets的配置

wx-config --libs
wx-config --cxxflags

上面这两条命令是查看wxWidgets的lib路径及需要链接的动态库名称,以及预编译处理器的定义。

使用boost的property_tree解析内存缓冲区中的XML

上一篇文章中是使用boost的property_tree来读取本地XML文件的方式来解析的,见http://www.zoudaokou.com/index.php/archives/628,但在某些情况下,我是从网络上接收到XML数据的,如果再将XML数据存在文件中,再用read_xml读取文件,就显示多余了,本文介绍直接使用property_tree将内存中保存的XML数据解析出来。

在property_tree中读取XML内容的函数是read_xml,它的参数有两种形式:

//第一种形式
template<class Ptree> void read_xml(std::basic_istream<typename Ptree::key_type::value_type> &stream,
                  Ptree &pt,
                  int flags = 0)
//第二种形式
template<class Ptree> void read_xml(const std::string &filename,
                  Ptree &pt,
                  int flags = 0,
                  const std::locale &loc = std::locale())

第二种形式中第一个参数是文件名,在第一种形式中,可以看到第一个参数为std::basic_istream &stream,那么我们可以使用字符串流istrstream,它是间接继承于basic_istream的,字符串流可以将内存中的数据保存起来,然后在调用read_xml的时候传入istrstream进行解析。
Continue reading ‘使用boost的property_tree解析内存缓冲区中的XML’ »

使用boost的property_tree解析XML

boost中提供了对配置文件读取的支持,它就是:property_tree,property_tree是一个保存了多个属性值的属性数据结构,可以用类似路径的简单方式访问任意节点的属性,而且每个节点都可以用类似STL的风格遍历子节点。property_tree特别适合于应用程序的配置数据处理,可以解析xml、ini、json和info四个格式的文本数据。

在处理四种格式的文件时,除包含头文件、读文件、写文件时有部分区别外,其他对文件内部数据操作时基本一致(因为文件格式都基本一致)。实际上,property_tree内部使用的就是一个小巧快速的开源XML解析器——rapidxml。

basic_ptree 是property_tree的核心基础。其接口像std::list。可以执行很多基本的元素操作,比如使用begin()、end()等。

此外还加入了操作属性树的get()、get_child()、get_value()、data()等额外的操作。

basic_ptree有两个重要的内部定义self_type和value_type。self_type是basic_ptree模板实例化后自身的类型,它也是子节点的类型。value_type是节点的数据结构,它是一个std::pair,它含有属性名(first)和节点自身(second)。

通常不使用basic_ptree,而是使用预定义的typedef。ptree、wptree、iptree、wiptree。前缀i表示忽略大小写,前缀w表示支持宽字符。
Continue reading ‘使用boost的property_tree解析XML’ »

boost的日期时间处理

在c++中获取日期时间比较简单,但如果需要对日期间进行更复杂的使用就有点力不从心了,比如:

1.要计算从2013-07-10 14:33:00到2013-09-28 11:11:30之间的天数、小时数、分钟数、秒数。

2.或者要计算从2013-07-10 14:33:00开始,过了218天30小时14分钟30秒后的时间。

下面来介绍Boost.Date_Time的简单使用。

boost的日期操作需要引入头文件

#include "boost/date_time/gregorian/gregorian.hpp"

时间操作需要引入头文件

#include "boost/date_time/posix_time/posix_time.hpp"

Continue reading ‘boost的日期时间处理’ »

boost的windows编译

boost库一款非常优秀的c++库,文档非常完善,鼓励商业或非商业使用,开源免费,被称为准标准库,下面介绍它在windows下的编译过程。

现在最新的boost库版本是1_53_0,可以在其官方网站下载,解压后,可以打开boost_1_53_0目录下的index.html文件,这里面对boost库进行了详细的说明,包括boost的安装,在文档的Getting Started on Windows中描述了使用MSVC的Command Prompt进行编译的过程。

例如我的机器安装了Visual Studio 2005,在开始菜单中打开Microsoft Visual Studio 2005 > Visual Studio Tools > Visual Studio 2005 Command Prompt。

然后使用命令行进入boost_1_53_0的目录,并执行以下命令

bootstrap

这个步骤是安装boost库编译程序,最后会在boost_1_53_0目录下生成b2.exe程序,生成了b2.exe后,再执行

b2 --build-type=complete

这个步骤就是编译boost库了,编译完成后,会在boost_1_53_0的stage目录中找到生成的lib文件,如boost_date_time-vc80-mt-gd-1_53.lib,其中vc80表示是vs2005版本的。
Continue reading ‘boost的windows编译’ »

使用gsoap生成客户端代码

网络上提供一些免费的接口资源,比如天气预报、列车时刻表以及股票信息等服务,而这些接口使用的是Web Service规范,若要自己编写协议进行通信比较费劲,我们可以使用gsoap工具来生成Web Service客户端协议组装及发送代码,而我们只需要填充查询数据就能得到我们想要的内容。

gsoap可以在http://gsoap2.sourceforge.net/上下载到,使用步骤:

1.下载gsoap文件后解压,在gsoap/bin/win32目录下有soapcpp2.exe和wsdl2h.exe两个文件。

2.将这两个文件复制到gsoap目录中,然后使用wsdl2h命令生成.h文件,例如下面的命令是生成天气预报客户端代码


wsdl2h -o weather.h http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

3.扫行完上面的命令后,会在gsoap目录中生成相应的.h文件,再使用soapcpp2命令生成.cpp文件,-C的意思是生成客户端代码,生成服务端代码是使用-S,例如将上面的weahter.h生成.cpp文件:


soapcpp2 -C -x -i -I "./import" -L?weather.h

5.然后将生成的.cpp文件及.h文件都复制到工程目录中进行编译

注意:在上面使用soapcpp2命令的时候,默认是生成第一版的协议,如果加上-2则生成第二版协议,若发现协议执行错误,不妨试试加上-2生成代码。