sicp 笔记 (1)

“sicp”全称是“Structure and Interpretation of Computer Programs”,是 MIT 计算机专业第一年的一门入门课程的教材(据说现在已经取消了这门课,取而代之的是另一门使用 python 的课程)。网上很多人都强烈推荐这本书,给出了各种赞美之词,因此从网上找了个排版比较好的电子版(google 搜“sicp unofficial texinfo format”,我用的是 2.neilvandyke4 这个版本)。直到研究生快毕业才开始学习别人本科第一年的教材,希望亡羊补牢还不算晚。

这里使用 plt-scheme,除了 1.28 小题的 random 函数之外其它题目都能运行,推荐使用 mit-scheme(debian 中只有 i386 的包,64 位的需要自己到官网下载编译)。

下面是第一章的习题解答部分。

E-1.1: 把内容对着敲一遍就行了

E-1.2:

(/ (+ 5 4 (- 2 (- 3 (+ 

阅读全文…

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 …

阅读全文…

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

阅读全文…

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(), " 

阅读全文…

hadoop笔记 (2):pipes例子分析 (1)

Pipes 是 hadoop 提供的 c++ 接口,但是在官网上找不到 pipes 的文档,只能从例子开始一点点摸索。实验环境是 debian 6 amd64,hadoop 1.0.3。hadoop 的安装目录是 $HOME/hadoop,安装和配置过程在上一篇安装笔记中有提到。

为了少敲些字符,给 hadoop 命令做了一个 alias:

alias hadoop='$HOME/hadoop/bin/hadoop'

单词统计程序

下面的程序是对 hadoop 1.0.3 自带的单词统计程序(src/examples/pipes/impl/wordcount-simple.cc)的一个修改版:

#include <string>
#include <vector>
using namespace std;

#include <hadoop/Pipes.hh>
#include <hadoop/StringUtils.hh>
#include <hadoop/TemplateFactory.hh>

class WordCountMapper 

阅读全文…

hadoop笔记 (1):安装和配置

记录一下 hadoop 集群的搭建过程,一共 3 台机器,操作系统都是 debian 6,hadoop 版本是1.0.4,jre 是源里的 openjdk-6。hadoop 官网的说明挺详细,就是不能快速搭建出一个能跑的环境。在网上找到一篇文章(见参考资料 [1]),虽然文章中用的是 0.20 版本,但是在 1.0.4 上也适用。

这里使用 master,slave1 和 slave2 分别作为三台机器的主机名。为了操作方便,每台机器上都有一个用户 hadoop,密码都一样。以下的配置操作都在 master 上进行。

hadoop 的配置(2013.03.16 更新)

把下载到的 hadoop-1.0.4.tar.gz 解压到 hadoop 的家目录下,建立一个软链接 hadoop 指向解压得到的目录,这样以后更新只需重新建立软链接指向新版本即可。

进入解压后的目录,根据实际情况修改 conf/hadoop-env.sh 中的 JAVA_HOME,使其指向 jdk 的安装目录:…

阅读全文…

programming in lua (9)

第 27 章,主要介绍 c 语言和 lua 交互的一些技巧。这一章涉及到第 2 部分的一些内容。

数组操作

在 lua 中,数组是一种特殊的 table,除了可以使用 lua_settable() 和 lua_gettable() 等操作 table 的函数外,另外也有一些专门用来操作数组的函数。使用这些有针对性的函数有两个好处:一是性能上的提升,例如我们经常在循环访问数组的所有元素;二是像整数数组,字符串等常见的类型使用一些有针对性的操作会比较方便。

lua 提供了两个函数来访问指定下标的数组元素:

void lua_rawgeti (lua_State *L, int index, int key);
void lua_rawseti (lua_State *L, int index, int key);

其中 index …

阅读全文…

在 debian 上使用 qt 访问 oracle 数据库

之前的一个使用 oracle 的项目自从我把数据库装好之后就没有下文了,最近迎来了另一个也需要使用 oracle 的项目。由于 oracle 不是开源的,为了能在 Linux 下使用 qt 访问,只好自己编译对应的驱动。在网上找了一堆资料,又折腾了好几天,终于在今天晚上成功了,在这里记录一下。

先说一下环境:debian 6.0,qt sdk 4.8.1,oracle 11gR2。本文主要记录的是怎样编译驱动和怎样连接,关于 oracle 数据库服务器端安装中的一些问题可以参考之前的一篇 笔记

准备工作

下载 qt sdk。因为编译的时候 qt 工具链和源代码要保持一致,而 debian 6 源里的 qt 版本是 4.6.3,官网上已经找不到对应的源码包了,所以下载 sdk 安装(sdk 包含工具链和对应版本的源码),安装的时候要注意把安装 source code 的选项勾上。这里使用 QTDIR 表示 …

阅读全文…

自己整理的 latex 模板

为了为祖国的科研事业贡献自己的力量,更为了能顺利毕业以便更好地为祖国作贡献,前两周一直忙着憋论文。本来先打算用中文写了再翻译成英文,但是 boss 说从中文翻译过来的质量不好,而且时间不够,还不如直接上英文。记得上一次写英文文章都已经是两年半前考研的时候了(其实研一第一学期末参加了个英语选修考试,最后题目都来不及做完,作文连题目都来不及写……),而且写过的英文文章最多也就 200 个单词,忽然让我写这么长的文章就像是好几年没运动的人一上来就跑马拉松,还要限时跑完。本来表达能力就不行,再加上肚子里没货,写出来的内容自己都不想看了。

刚开始的时候准备用 word 来写,但是一想到要调格式就头大(一直不知道 word 有“格式刷”这个工具,不知道 excel 可以选中数据画曲线图饼状图直方图等各种图……不知道当时是怎样把本科毕设论文搞定的),最后决定用 latex 来写,顺便整理一下以前的模板。基础内容可以参考《The Not So Short Introduction to LATEX 2ε》,各个宏包的具体介绍可用“texdoc -s 关键字”来搜索相应的手册。

感谢 boss 清明节加班把论文从头到尾改了好几遍,80% 的内容被改得面目全非……感谢师兄帮忙画图;感谢 #大侠 友情提供 gnuplot 画图脚本一个。

最后贴个自用的模板为论文求 rp,内容来自网上和自己的总结(texlive2012 通过,20130601 更新):

\documentclass[a4paper]{article}
%\documentclass[twocolumn]{article}

%\usepackage{graphicx}
\usepackage{listings}
\usepackage{xcolor}

阅读全文…

项目总结 (2)

很累的一个月,为了赶项目天天码代码,第一次在看到代码的时候有想吐的感觉。

用 lua 作为配置文件

因为在之前的一个项目中师兄采用了网络作为前后端交互的方式,这样两部分分开调试比较方便,从此以后实验室的项目不管是否需要联网都采用这种方法,结果在项目中除了根据甲方的需求把控件拖来拖去之外剩下的就是解析各种各样的报文格式。

前段时间另一个项目需要写一个报文测试的小工具,就是有一堆自定义的报文格式,界面上有下拉条选择或者让用户自己输入某个字段的值,然后把报文发出去,收到返回信息并且把内容解析一下。我已经不怎么碰这个项目了,但是这次时间有点紧,于是哥又“被”当仁不让地充当临时工把活接了下来。在前一个项目中师兄使用了 xml 作为报文格式配置文件,这个小工具我打算用 lua 来试一下,也算是一个实际应用的机会。界面用了 qt,因为现在 qt 俨然成为本人实验室项目界面开发的默认工具了。

先说说使用 lua 作为配置文件吧。报文格式是常见的 TLV 格式(“T”表示 type,“L”表示长度,“V”表示数据),有些字段会有限定的范围:

packet = {
    "报文名称",
    {"字段名称1", "字段类型", 个数, {可选值1, "说明1"}, {可选值2}, {起始值, 结束值, 步长}, ...},
    ......
}

其中字段类型定义了一些常见的类型并规定了长度,例如“int”就是 4 字节,“double”就是 8 个字节等。个数表示该字段中包含了多少个这样的类型。例如…

阅读全文…