centos 下为php添加mongodb扩展

export PHP_AUTOCONF=/usr/bin/autoconf
export PHP_AUTOHEADER=/usr/bin/autoheader
wget http://pecl.php.net/get/mongo-1.2.7.tgz
tar zxvf mongo-1.2.7.tgz
cd mongo-1.2.7
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

//最后在php.ini中加入以下行并重启webserver
extension=mongo.so

查看phpinfo,如出现mongo字样,说明成功了。

KMP算法精髓之预算NEXT值

void next_index(char *str, int next[]) {h
    int i = 0, j = -1, str_length = strlen(str);
    next[0] = -1;
    while(i < str_length) {
        if(j == -1 || str[i] == str[j] ) {
            ++i;
            ++j;
            next[i] = j;
        } else {
            j = next[j];
        }
    }
}

顺序表的初始、插入、删除实现

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#include<stdlib.h>
#include<stdio.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef struct {
    ElemType *elem;
    int length;
    int listsize;
} SqList;

Status InitList_Sq(SqList *L) {
    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!L->elem) exit(OVERFLOW);
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
    return OK;
}

Status ListInsert_Sq(SqList *L, int i, ElemType e) {
    ElemType *newbase, *q, *p;
    if (i < 1 || i > L->length + 1) return ERROR;
    if (L->length >= L->listsize) {
        newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));
        if (!newbase) exit(OVERFLOW);
        L->elem = newbase;
        L->listsize += LISTINCREMENT;
    }
    q = &(L->elem[i-1]);
    for (p = &(L->elem[L->length - 1]); p >= q; --p) *(p + 1) = *p;
    *q = e;
    ++L->length;
    return OK;
}

Status ListDelete_Sq(SqList *L, int i, ElemType *e) {
    ElemType *p, *q;
    if(i < 1 || i > L->length) return ERROR;
    p = &(L->elem[i - 1]);
    *e = *p;
    q = L->elem + L->length - 1;
    for(++p; p length;
    return OK;
}

CentOS下安装Tsung

首先爆个粗口,尼玛,这二郞向下兼空也有真有点弱啊?!
嗯,发泄一下感觉好一点,先说一下我之前犯下的错误,大家有遇到时,别再往这个坑里跳。
Tsung是erlang写的,并且在出报表图时,需要使用perl相关库,所以先要安装三个玩意:
1.erlang
2.perl
3.gnuplot

后面两个好办,perl在centos上直接就带了,没装就装一下。
yum -y install perl
yum -y install gnuplot

现在说这鸟erlang,你特么真是二郞,带个二的东西就是犯二。
在我安装时,我选择的Tsung是1.4.1这个最新版。
而erlang也是选择的最新版R15B这个源码包。
在make install 时报错:
build main app boot script .. make : *** [priv/tsung.boot] Error 1
这个无解,在网上一直找不到答案。最后我一个一个试,先选择不同的Tsung版本,发现报同样的错,所以排除Tsung 版本的问题。然后选择不同的erlang版本,但选择R14B04时,安装成功,所以这特么的问题应该出在最新版上面,R15B。。看什么看,说的就是你丫的,真想抽你丫的,耽误老子半天时间。

具体安装如下:
1.下载erlang-R14B04,(这里erlang的依赖包,需要到官网上去看,依赖啥就装啥。我这就省略了。)
wget http://www.erlang.org/download/otp_src_R14B04.tar.gz
tar zxvf opt_src_R14B04.tar.gz
cd opt_src_R14B04
./configure –prefix=/usr/local/erlang
make && make install
2.安装tsung
wget http://tsung.erlang-projects.org/dist/tsung-1.4.1.tar.gz
tar zxvf tsung-1.4.1.tar.gz
cd tsung-1.4.1
./configure –prefix=/usr/local/tsung –with-erlang=/usr/local/erlang
make && make install

git优点分析

最近想把SVN换成git,总结了一下为什么git更爽一些:

1. git 是分布式的

目前大多数VCS都是集中式式,如SVN,也就是说一台SVN服务器,别人都是客户端,数据的操作都必需在这台服务器上。这会造成一个明显的问题:单点故障,你懂的。

而git是分布式的,也就是说大家都是服务端,你中有我,我中有你,合恢统一,当然git也有共同的远程服务器。不过就算一台服务器挂了,随便找个客户端clone一下,又生龙活虎了。

分布式的别一个好处是,断网或不在内网,你也可以工作。相信大家都有这么个经历,公司有事没做完,背电脑回家做,做了又提交不了,而git就无需担心了,你机子的数据库就是完整的git数据库,就算处于无网状态,你也可以提交修改。

2. git 分支使用指针

传统的VCS切分支挺麻烦的,如果有过管理VCS经验的人应该知道,切一个分支就是完全复制当前分支的所有文件,在比较大型的项目里,开销是比较大的,如果你有N个APP,且每个APP都有各自的分支,那就有的你忙了。

git提倡你多切分支,因为它使用的是指针,你可以在去上厕所前切一个,去上厕所后再切一个,左切切右切切,没关系,它罩得住。

传统VCS切分支是在服务端操作的,也就是说本地其实要在服务端操作完再check下来。git 不然。服务端也可以切分支,本地也可以切分支,这是我认为最大的好处,你在处理12345这个bug时可以切一个分支,马上老大来话说你给我优化一下XXX功能,你又切一个分支,上级应用层来个电话说YYY功能不太好用啊。。同样,你再切一个分支。由于你切的分去只是本地的,不会影响到别人,在发好功能测试后你可以合并到master里,测试提交。

3. 分工协作

本来这点可以放到第一点中,git 是分布式的。不过我单独拿出来是因为这个优点有不同寻常的意义。大家可能经历过手里同时有2~N个活,可能都是基于公司同一个源代码。其中可能要和A完成一个功能,和B完成一个功能。这时候git就可以大显身手了,你也可从A机子里得到项目的最新代码,也可以从B机子里拿到他的劳动成果,而完全不用经过中央服务器,所以不会对其他人照成影响。

4…还有一些优点,以后补充,因为哥们要上班了。

ruby中的信号

在unix/linux中,进程之间传递信息是用信号的方式,(不清楚 ?=》google : linux singal 信号机制),ruby也支持这种方式。

  ri trap

代码:

trap :INT do
  puts
  puts 'Bye'
  exit
end

print 'Say something: '
STDOUT.flush
puts "You said: #{STDIN.gets}"

当运行这段代码时,如果按^C即control+c,这样会传递一个SIGINT信号给该进程。可以尝试*nux下的信号表的其它信号,
还是比较有趣的。HOHO~

《web cache》(译)- 1.介绍

翻译出于个人意愿,一为对技术的兴趣,二为对英语的学习,过英语三级以上者还请去阅读英语原版,切勿自误。

————————————————————————————————————————————–

1. 介绍

术语缓存出至法译,字面上的意思,就是存储。作为一个数据处理的术语,缓存是指计算机储存最近读取的信息,以备将来访问。存储的信息可以使用或不使用,所以只有当存储量低于读取量时,缓存才是有益的。

缓存的概念几乎在计算机和网络系统每一个方面的都有应用。CPU中有数据和指令缓存,计算机操作系统有硬盘和文件系统的缓冲存储器缓存。分布式(网络)文件系统,如:NFS和AFS的良好性能也依赖缓存。网络路由器缓存最近使用的路由。域名系统(DNS)服务器缓存主机名到地址的查询及其他查询。

对某些数据块的请求可能同时发起。CNN的主页的请求通常伴随着该页面的所有图片请求。缓存基于之前的访问数据来预测随后的访问。当预测是正确的,会有显着的性能改善。在实践中,这种技术的好处,使得我们难以忍受计算机系统中,没有内存和磁盘高速缓存之缓慢。几乎所有的数据处理任务中读取的地方都能从高速缓存中受益。

当请求的数据在缓存中存在,我们称它为命中。同理,访问数据没有被缓存称为未命中。缓存提供性能改进的主要依据,是在服务时间上缓存命中率和未命中率的比较。所有的请求,命中的比例是所谓的命中率。

任何使用缓存的系统必须支持缓存一致性机制。这是缓存保持更新的过程。我们说缓存的数据,是新的或过时的。缓存可以立即重用新鲜的副本,但通常需要验证数据是否过时。保持一致性的算法可强可弱。弱一致性意味着缓存有时会返回过时的信息。强的一致性,意味着缓存的数据始终是先验证,然后再使用它。CPU和文件系统缓存需要很强的一致性。然而,某些类型比如:路由器和DNS解析器缓存,即使他们返回过时的信息仍是有效的。

我们知道,在现代计算机的内存和磁盘系统中,缓存起着重要作用。在WEB中,能同样成功么?问不同的人,你可能会得到不同的答案。一些缓存使Web可用是至关重要的。其他看法是缓存非常不利于用于web中。一小部分可能认为这只是一般不利于[图克斯伯里,1998]。

在这本书中,我将谈Web应用缓存技术,并试图说服你,Web缓存是一项好的技术。我们将看到如何使用Web缓存的工作原理,如何与客户端和服务器交互,和HTTP扮演的角色。您将了解用于构建缓存集群和层次的协议。除了有关技术方面的问题,我也花了很多时间在讨论分岐问题上面。由于Web高度分散的性质,介绍了一些其它有趣的问题。

当你读完本书,你应该能够为您所属机构设计和评估缓存代理解决方案。也许你将在你的防火墙安装一个独立的缓存代理,或也许你需要位于整个网络的各种缓存。此外,你应该做好准备,从缓存操作了解和诊断任何可能出现的问题或故障。如果你是一个内容提供商,那么我相信你增加你提供的信息的缓冲能力。

《web cache》(译)- 目录

翻译出于个人意愿,一为对技术的兴趣,二为对英语的学习,过英语三级以上者还请去阅读英语原版,切勿自误。

————————————————————————————————————————————–

目录
1.介绍
1.1 网络架构
1.2 网络传输协议
1.3 为什么要缓存网页?
1.4 为什么不缓存网页?
1.5 网络缓存的类型
1.6 缓存代理特征
1.7 网格、集群、层次
1.8 产品

修改validation中错误信息的字段名

在rails的activerecord中,如果对字段进行验证,出错信息中,往往会把表中的字段名显示成主语,比如:

class Person < ActiveRecord::Base
  validates :name, :presence => true
end

出错时显示的是:”Name can’t be blank”,其中”can’t be blank”是rails默认的信息,我们可以通过候改I18n,轻易的改成中文,但在以前的rails版本中,想把字段名(这里是name)友好化,那很麻烦。
不过现在也可以通过修改I18n配置文件来自定义你的字段描述了:

cn:
  activerecord:
    attributes:
      person:
        name: "姓名"

是不是很简单呢,嘎嘎。

修改form_for生成的提交按钮文字

  <%= form_for @post do |f| %>
    <%= f.submit %>
  <% end %>

这段代码会生成一个表单,而提交按钮默认值是英文,根据你的模型生成新增或更新字样,比如在上面这个例子中,如果@post是新记录,它将用”Creat Post”,如果不是新记录,会生成”Update post”字样。
这些值能通过I18n自定义,在helpers.submit键中允许使用 %{model} 做为翻译引用表单使用的模型名字:

  en:
    helpers:
      submit:
        create: "Create a %{model}"
        update: "Confirm changes to %{model}"
      post:
        create: "Add %{model}"

所以当我们使用中文时候可以建一个cn.yml

  cn:
    helpers:
      submit:
        create: "新建"
        update: "修改"
      post:
        create: "添加"