存档

  • c++11 之变长参数模板

    C++ 中可以对函数重载,即同样的函数名字(其实在编译期还是会被生成不同的名字)可以有不同的参数列表,例如 STL 中 string 的构造函数:

    string();
    string (const string& str);
    string (const string& str, size_t pos, size_t len = npos);
    string (const char* s);
    string (const char* s, size_t n);
    ...
    

    看上去和 C 中的变长参数有点类似:

    void func(int nil, ...);
    

    有点不同的是,C …

    阅读全文…

    2015年4月5日 | 归档: c++1x | 标签:
  • PostgreSQL 笔记

    PostgreSQL 是一个采用 BSD 许可证分发的跨平台的对象关系模型数据库,最早可以追溯到 1982 年在伯克利开始的 Ingres 计划。PostgreSQL 出现的时间比 MySQL 要早,之前也听过 PostgreSQL 的大名,不过看到相关的讨论比较少。由于这里的实验需求远未达到两者的极限,所以也没什么评测,网上的评价就不搬运过来了,有兴趣的可以搜一下。这里的实验环境是 Debian 6,PostgreSQL 版本是 9.1。

    初始化

    不同于 MySQL 在安装的时候会被要求输入 root 的密码,安装 PostgreSQL 的时候什么提示都没有,装完之后也不知道该干嘛……在网上搜了一把,照着参考资料 [1] 操作了一遍,基本算是入门了。

    由于没有 root 用户,默认有 root 权限的用户名是 postgres,也有同名的数据库。网上有很多介绍初始化的方法都是新建一个 postgres 的用户,然后切换到该用户登录后再修改密码。但是觉得为了初始化新建一个用户有点小题大作了,于是上网搜了下,发现可以通过修改配置文件达到目的。

    首先修改 /etc/postgresql/9.1/main/pg_hba.conf,把其中的

    local all postgres 

    阅读全文…

    2015年2月7日 | 归档: postgresql | 标签:
  • Lua C++ bindings (1)

    好几个项目都用了 Lua 作为配置文件语言,但是一直都用官方提供的 C API,写起来十分繁琐。本来大部分的配置文件都是 key-value 式的配置,简单地封装一下就足够了,但是本着完美主义的倾向一直都觉得要么就别封装,要么就写一个功能完善的,而函数调用和自定义类导出这部分一直没想明白怎么弄,因此迟迟没动手。至于为什么不直接使用 LuaBind 这样强大的东东,一方面是不喜欢 LuaBind 依赖 Boost 太臃肿,另一方面也是趁着这个机会学习一下。

    从去年 10 月左右就开始磕磕碰碰地写,三两下就把变量部分搞定了,不过之后就停滞了。直到去年年底的时候看了下 C++11 提供的变长参数模板有了些头绪,于是写成了现在这样,总的来说已经基本可用,心里的成就感满满的,于是写点东西记录一下,也算是打个广告。关于这个库准备写两篇博客,第一篇从使用者的角度介绍一下使用方法,第二篇从开发者的角度写写演变过程及设计原则。这里介绍的是第一个提交的版本,后续有变化的话不再同步更新博客了,只会更新相关的文档。

    哦,忘了打广告,代码放在 github 上,猛点 这里。需要 C++11 的支持,使用 g++ 编译时加上选项 -std=c++11。

    变量设置

    先来看一个“Hello, world!”式的程序:

    #include <iostream>
    using namespace std;
    
    #include "luacpp.hpp"
    using namespace 

    阅读全文…

    2015年1月17日 | 归档: lua | 标签:
  • 使用 C 编写 Lua 模块

    Lua 作为一种小巧的语言,一般都是嵌入到 C/C++ 中作为扩展语言,但是也可以作为独立的脚本语言使用,并且可以使用 C/C++ 编写扩展模块。在参考资料 [1] 中有怎样用 C/C++ 编写模块的介绍,但是比较零散,也不是很详细,所以在这里整理一下。

    这里使用的 Lua 版本是 5.2.3,系统是 Debian 7。

    Hello, world!

    不废话,还是先看一下经典的 “Hello, world!” 例子。

    #include <lua.h>
    #include <lauxlib.h>
    #include <lualib.h>
    
    static int l_hello(lua_State* l)
    {
        printf("Hello, world!\n");
        return 0;
    }
    
    static const 

    阅读全文…

    2014年8月9日 | 归档: lua | 标签:
  • Thrift 学习笔记 (2)

    Google 开发的 Protobuf 会经常被拿来和 Thrift 比较,不过 Protobuf 主要提供序列化/反序列化的功能,而 Thrift 还提供了几个 server 模型,加上可以自动生成代码,大大简化了 RPC 的开发。

    TSimpleServer

    上一篇笔记 的 echo server 为例,一个使用 TSimpleServer 的服务端如下:

    // This autogenerated skeleton file illustrates how to build a server.
    // You should copy it to 

    阅读全文…

    2013年12月14日 | 归档: thrift | 标签:
  • Thrift 学习笔记 (1)

    Thrift 是 Facebook 开发的一个二进制通信协议,现在托管在 Apache 基金会。它使用一种自定义的接口描述语言描述使用的数据结构和接口,通过编译可以生成各种语言的接口,如 c++,python,php 等。由于支持生成多种语言,Thrift 可以作为多种语言之间的通信接口,更详细的介绍见参考资料 [1]。

    这里使用的 Thrift版本是 0.8.0。

    一个简单的echo server

    首先编写对应的数据结构和接口描述文件:

    namespace cpp Test
    
    service EchoServer {
        string echo(1: string msg);
    }
    

    使用下面的命令生成对应的 c++ 接口文件:

    thrift --gen cpp echoapi.thrift
    

    默认会生成一个“gen-cpp”的文件夹,里面包含下列文件:

    echoapi_constants.cpp echoapi_constants.h echoapi_types.cpp echoapi_types.h EchoServer.cpp 

    阅读全文…

    2013年11月19日 | 归档: thrift | 标签:
  • C++11 中的 lambda 函数

    c++ 标准库里有一个函数 sort(),可以对容器的元素进行排序。它的函数原型是(参考资料 [1]):

    template <class RandomAccessIterator>
    void sort (RandomAccessIterator first, RandomAccessIterator last);
    
    template <class RandomAccessIterator, class Compare>
    void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
    

    其中第三个参数是一个比较函数,它接收两个容器中的两个元素,返回比较结果。如果没有第三个参数,默认按元素的升序排列。

    例如,我们要将一个整型数组降序排列:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    static bool compare_int(int 

    阅读全文…

    2013年9月9日 | 归档: c++1x | 标签: ,
  • pthread 学习笔记 (4)

    自旋锁

    除了前面提到过的互斥锁和读写锁外,还有另外一种锁:自旋锁(spinlock)。自旋锁的原理比较简单,就是当某个资源不可用时不断查询,直到资源可用:

    void tese_and_set(bool* condition)
    {
        bool tmp = *condition;
        *condition = true;
        return tmp;
    }
    
    void func()
    {
        while (test_and_set(&condition));
    
        /* visit */
    
        condition = false;
    }
    

    其中的操作 test_and_set() 可以看成一个原子操作,通常由硬件来实现。如果 condition 为 false,while 循环会不断地查询 condition 的状态,直到其可用为止。因为在条件不满足时程序也一直在忙,这样会消耗 cpu 资源,所以自旋锁适合用在执行时间不长的临界区中,例如修改一个数值等。

    由于自旋锁比较简单,pthread …

    阅读全文…

    2012年9月23日 | 归档: pthread | 标签:
  • hadoop笔记 (4):streaming

    hadoop 提供了 3 种方式来实现自己的功能,一种是 java 接口,另一种是 pipes,还有一种是 streaming。streaming 允许用任何语言来开发 mapper 和 reducer,它们和 hadoop 之间的交互通过标准输入/输出来进行。这种方式的好处是调试很方便。

    先来看一个使用 bash 编写的 wordcount 的例子:

    #!/bin/bash
    
    while read line; do
        arr=($line)
        let i=0
        while ! [ -z ${arr[$i]} ]; do
            echo -e "${arr[$i]}\t1"
            let i=$i+1
        done
    

    阅读全文…

    2012年9月5日 | 归档: hadoop | 标签:
  • hadoop笔记 (3):pipes例子分析 (2)

    使用 partitioner 和 combiner

    下面的程序是对 hadoop 1.0.3 自带例子(src/examples/pipes/impl/wordcount-part.cc)的一个修改版:

    #include <string>
    #include <vector>
    using namespace std;
    
    #include <hadoop/Pipes.hh>
    #include <hadoop/StringUtils.hh>
    #include <hadoop/TemplateFactory.hh>
    
    class WordCountMapper : public HadoopPipes::Mapper {
    
        public:
    
            WordCountMapper(HadoopPipes::TaskContext& context) {}
    
            void map(HadoopPipes::MapContext& context)
            {
                vector<string> words = HadoopUtils::splitString(context.getInputValue(), " 

    阅读全文…

    2012年8月25日 | 归档: hadoop | 标签:
‘程序设计’ 分类的存档
  • 当前页 1 / 2
  • 1
  • 2
  • »