Rexdf

The devil is in the Details.

[置顶]发布一个sublime汉化插件

| Comments

很简单的一个插件,现在支持汉化Sublime Text2,Sublime Text3。全部系统Win64、Win32,Linux64,Linux32,OSX等,可以随意来回切换简体中文、繁体中文、日语、英语,无需重启SublimeText。

[转]Linux LVM 逻辑卷管理

| Comments

PV(Physical Volume) 物理卷。可以是单独磁盘,也可以是硬盘分区 VG(Volume Group) 卷组。是PV的组合,可以看成单独的逻辑磁盘 LV(Logical Volume) 逻辑分区。相当于物理分区的/dev/hdaX PE(Physical Extent) 物理范围。VG单元,类似于RAID的条带大小。 当多个PV组成一个VG时,LVM会在所有PV上做类似格式化的动作, 将每个PV切成一块块的空间,这一块块的空间就称为PE, 通常是4MB。 LE(Logical Extent) 逻辑范围。LV的组成单位。大小为PE的倍数(通常为1:1) 那么,最常用的3个名词和意义列表如下: 名词 意义 操作系统对应设备 PV 物理卷 /dev/hdaX VG 卷组 /dev/ (通常是个目录) LV 逻辑卷 /dev// 如果我们要使用lvm,顺序是pv->vg->lv。 就是说,我们先创建一个物理卷(对应一个物理硬盘分区或者一个物理硬盘),然后把这些分区/硬盘加入 一个卷组中(相当于一个逻辑上的大硬盘),然后我们在这个大硬盘上划分分区lv(逻辑上的分区,就是逻 辑卷这样,我们把lv逻辑卷格式化以后,就可以像使用一个传统分区那样,把它挂载到一个挂载点上,需要的时候,这个逻辑卷可以被动态缩放。 我们可以用一个长方蛋糕来说明这个对应关系。物理硬盘相当于一个长方蛋糕,我们把它切割成许多快, 每个小块相当于一个pv,然后我们把其中的某些pv重新放在一起,抹上奶油,那么这么些个pv的组合就是 一个新的蛋糕,也就是vg。最后,我们切割这个新蛋糕vg,切出来的小蛋糕就叫做lv。 有一点需要注意,就是/boot区不可以是lvm,因为引导程序lilo/grub并不能识别lvm,就像/boot同样不可以是软raid设备一样。 3) 如何使用lvm,创建逻辑卷的流程和实例 好了,我们来创建一个lv。 比如说,在一个物理硬盘/dev/hda上,我们需要将/dev/hda5,/dev/hda6作为pv 1 fdisk划分hda5,hda6,并且将这两个分区的标志(键入t改)改为(0x)8e 然后用partprobe通知OS磁盘分区的变化 2 pvcreate /dev/hda5 /dev/hda6(-s xxM可设定PE大小) 创建pv hda5,hda6 3 vgcreate rootvg /dev/hda5 /dev/hda6 将hda5,hda6加入逻辑卷组rootvg中 4 lvcreate -L 100M -n lv1 rootvg 从我们的rootvg中,创建一个100M的逻辑卷lv1 5 mkfs.ext3 /dev/rootvg/lv1 格式化我们的lv1,文件系统用ext3 6 mkdir /mnt/lvm;mount /dev/rootvg/lv1 /mnt/lvm 将lv1挂载到/mnt/lvm下 好了,这样一个创建lv的例子完成 4) 如何动态放大/缩小一个逻辑卷/逻辑卷组 我们如何放大lv?比如上面的lv1?流程: 1 lvextend -L 200M /dev/rootvg/lv1 将lv1增加200M 2 ext2online /dev/rootvg/lv1 让lv1容量更改立即生效减小lv,网上很多文章介绍的是ReiserFS,这里我们是ext3文件系统,如果我们需要减少50M: 1 umount /mnt/lvm 这里,需要先卸载分区 2 mke2fs -n /dev/rootvg/lv1 计算lv1的block数 这里一定要加-n参数,这是计算lv1的block数,而不是格式化分区,注意。 并且注意,从MB->KB这些的计算,都是乘1024,不是1000,这是个细节问题 3 计算减少50M后的block数。从mke2fs -n /dev/rootvg/lv1,我们可以得出2个需要的信息: Block size和blocks,这两个数的乘积就是分区大小A(单位字节), 我们把需要减小的容量50M换算成字节B,然后A-B的结果除以Block size,就是剩余的block数 4 resize2fs -f /dev/rootvg/lv1 剩余的block数 调整文件系统大小 5 lvreduce -L-50M /dev/rootvg/lv1 调整lv分区大小,减小50M 6 重新mount,df察看一下容量的减小 动态加大VG: 这里我们新增一个PV并加入VG 1 fdisk增加一个(0x)8e标志的分区/dev/hda7 2 vgextend rootvg /dev/hda7 好了,vg增大了 缩小逻辑卷组VG: 1 搬移PV中的资料(只限于同一VG中) #pvmove [-n ] [] 如 #pvmove /dev/hda5 /dev/hda6 将VG中pv hda5的内容搬移到hda6中 pvmove /dev/hda5(也可以这样,lvm决定hda2的内容被复制到哪里) 2 vgreduce rootvg /dev/hda5 把vg hda5移除 5) 如何删除逻辑卷/逻辑卷组 删除VG流程: 1 umount /挂接点 2 lvremove /dev/rootvg/lv1 移除逻辑卷,这里是lv1 3 vgchange -a n rootvg(关闭rootvg) 4 vgremove rootvg 移除rootvg 6) lvm相关命令 这个表格,你可以在RHCE_Study_Guide.pdf上找到 Physical Volume Volume Group Logical Volume scan pvscan vgscan lvscan create pvcreate vgcreate lvcreate display pvdispaly vgdisplay lvdisplay remove pvremove vgremove lvremove

Codeforces Round #172 (Div. 2) Rectangle Puzzle

| Comments

C. Rectangle Puzzle

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You are given two rectangles on a plane. The centers of both rectangles are located in the origin of coordinates (meaning the center of the rectangle’s symmetry). The first rectangle’s sides are parallel to the coordinate axes: the length of the side that is parallel to the Ox_axis, equals _w, the length of the side that is parallel to the Oy axis, equals h. The second rectangle can be obtained by rotating the first rectangle relative to the origin of coordinates by angle α.     Your task is to find the area of the region which belongs to both given rectangles. This region is shaded in the picture.

Input

The first line contains three integers w, h, α (1 ≤ w, h ≤ 106; 0 ≤ α ≤ 180). Angle α is given in degrees.

Output

In a single line print a real number — the area of the region which belongs to both given rectangles. The answer will be considered correct if its relative or absolute error doesn’t exceed 10 - 6.

Sample test(s)

input

1 1 45

output

0.828427125

input

6 4 30

output

19.668384925

Note

The second sample has been drawn on the picture above.  

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iomanip>

using namespace std;

const double PI=acos(-1);

int main()
{
    double w,h,a;
    double ans;
    cin>>w>>h>>a;

    cout<<setiosflags(ios::fixed)<<setprecision(8);
    if(a>90)a=180-a;
    a*=PI/180;

    if(fabs(a/PI*180-90)<1e-5)
    {
        //ans=w*h;
        if(w>h)ans=h*h;
        else ans=w*w;
        cout<<ans;
    }
    else if(a>=atan(2*h/w) && w>h/sin(a)+h/tan(a))
    {
        ans=h*h/sin(a);
        cout<<ans;
    }
    else if(a>=atan(2*w/h) && h>w/sin(a)+w/tan(a))
    {
        ans=w*w/sin(a);
        cout<<ans;
    }
    else
    {
        ans=w*h;


        /*
        double a11=1.0/sin(a)/cos(a)+tan(a)-1.0/tan(a),
        a12=2/cos(a),
        a21=2/cos(a),
        a22=1.0/sin(a)/cos(a)+tan(a)-1.0/tan(a),
        b1=w/cos(a)+h*tan(a)-w,
        b2=w*tan(a)+h/cos(a)-h;
        double x1=(b1*a22-b2*a12)/(a11*a22-a12*a21),x2=(a11*b2-a21*b1)/(a11*a22-a12*a21);
        ans-=x2*x2/tan(a)+(w-x2-x1/sin(a))*(w-x2-x1/sin(a))*tan(a);
        */
        ans=(sin(a/2)*h*h - 2*cos(a/2)*h*w + sin(a/2)*w*w)/(2*cos(a/2) - 4*cos(a/2)*cos(a/2)*cos(a/2));
        cout<<ans;
    }
    //system("pause");
}

LVM管理

| Comments

先看下我先前的情况

[root@localhost ~]# df -B 4k
文件系统	         4K-块      已用      可用 已用% 挂载点
/dev/mapper/vg_livecd-lv_root
                       1437078   1260828    161652  89% /
tmpfs                   126598        31    126567   1% /dev/shm
/dev/sda1               123961     14096    103466  12% /boot
[root@localhost ~]# df -h
文件系统	      容量  已用  可用 已用%% 挂载点
/dev/mapper/vg_livecd-lv_root
                      5.5G  4.9G  632M  89% /
tmpfs                 495M  124K  495M   1% /dev/shm
/dev/sda1             485M   56M  405M  12% /boot
[root@localhost ~]# fdisk -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00059acf

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        1045     7875584   8e  Linux LVM

Disk /dev/mapper/vg_livecd-lv_root: 5981 MB, 5981077504 bytes
255 heads, 63 sectors/track, 727 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg_livecd-lv_swap: 2080 MB, 2080374784 bytes
255 heads, 63 sectors/track, 252 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

原来的/目录是5.5G的,后面紧紧跟着一个1.9G的swap分区。 最先是VM的虚拟磁盘管理工具增加了2G的空间,然后是用Gparted的关盘引导,把lv_root逻辑分区调整大小到用完全部空间,重启,依然是原来的分区,完全看不出来空间到哪里去了。 重启再次进入Gparted光盘(用Linux的人应该不会陌生,键盘设置之类的事了),这次不是使用Gparted了,因为好像Gparted没有识别出分区。 第一步是删掉lv_swap; sudo lvremove /dev/vg_livecd/lv_swap 然后再次查看sudo lvdisplay 发现已经没有了lv_swap了 第二步是增加lv_root的容量 sudo lvextend -L +2G /dev/vg_livecd/lv_root 显示成功了,再次sudo lvdisplay就发现真的增加空间了。但是这里有个问题,之前我没有+2G前面的加号,结果总是失败,新建了一个lv,尝试中加上加号才是可行的。 这样基本就算好了但是df -h显示的是不会有变化的,因为还没有更新文件系统的磁盘大小。需要使用的命令式resize2fs  /dev/vg_livecd/lv_root但是基本总是失败的。在Gparted的光盘中只好作罢。 最后还有一个问题没有解决,那就是lv_swap的重建 sudo lvcreate -L 1.53G -n lv_swap vg_livecd sudo mkswap /dev/vg_livecd/lv_swap 两条命令均显示成功就好了。这个1.53G是用vgdisplay查出来的剩余空间. 然后就可以重启了,弹出Gparted光盘,从硬盘启动。 开机之后用root执行 resize2fs  /dev/vg_livecd/lv_root 显示成功。 然后df -h发现剩余容量已经变化,至此完全成功。

[root@localhost ~]# df -h
文件系统	      容量  已用  可用 已用%% 挂载点
/dev/mapper/vg_livecd-lv_root
                      7.5G  5.0G  2.5G  67% /
tmpfs                 495M  272K  495M   1% /dev/shm
/dev/sda1             485M   56M  405M  12% /boot

CentOS 无损调整分区大小方案

| Comments

可以看我最新更新的一篇:

centos分区调整详细

今天虚拟机的CentOS空间不足,网上大部分都是使用命令行格式化然后挂载的,不是调整分区的大小,也有一个是先转换成Ext2的,但是不放心。最后找到下面这个。

Gparted本身作为一种带有急救性质的工具,不仅拥有良好的用户界面,可视化的分区调整模式,其官方更是直接发布了ISO版本的可引导系统的Gparted恢复盘:gparted-LiveCD。这些特征对于Linux初学者来说,无疑是最合适的选择。

下面将介绍使用gparted-LiveCD对磁盘进行扩容的方法。已经在CentOS与Debian系统中得到验证。

** 

下载地址:http://sourceforge.net/projects/gparted/files/gparted/

Codeforces Round #168 (Div. 2) Convex Shape

| Comments

include

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>

using namespace std;

char map[55][55];
int n,m;
int vis2[55][55];
int minvis[55][55];
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};

struct node
{
	int x,y;
	int dir;
	int t;
};

queue<node> q;

int global_check_once;

int bfs(int x,int y)
{
	node tmp,top;
	int tx,ty;
	tmp.t=0;tmp.x=x;tmp.y=y;
	tmp.dir=-1;
	while(!q.empty())q.pop();
	memset(vis2,0,sizeof(vis2));
	memset(minvis,0,sizeof(minvis));
	q.push(tmp);
	vis2[x][y]=1;
	minvis[x][y]=0;
	//cout<<"begin to search "<<x<<" "<<y<<endl;
	while(!q.empty())
	{
		top=q.front();
		q.pop();
		//cout<<"pop "<<top.x<<" "<<top.y<<" "<<top.dir<<" "<<top.t<<endl;
		for(int i=0;i<4;i++)
		{
			tx=top.x+dx[i];
			ty=top.y+dy[i];
			
			if(tx>=0 && tx<n && ty>=0 && ty<m &&
			   map[tx][ty]=='B')// && vis[tx][ty][tmp.t][i]==0
			{
				tmp.t=top.t;
				if(i!=top.dir)tmp.t++;
			   	tmp.x=tx;tmp.y=ty;
				tmp.dir=i;
				if(vis2[tx][ty])
				{
					if(minvis[tx][ty]<tmp.t)
					{
						//cout<<"ignore "<<tx<<" "<<ty<<endl;
						continue;
					}
				}
				q.push(tmp);
				//cout<<x<<","<<y<<"push "<<tx<<" "<<ty<<" "<<i<<" "<<tmp.t<<endl;
				//vis[tx][ty][i]=1;
				vis2[tx][ty]=1;
				minvis[tx][ty]=tmp.t;
			}
		}
	}
	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	    if(map[i][j]=='B' && minvis[i][j]>2)
		{
			//cout<<"find >2 "<<"("<<x<<","<<y<<") "<<i<<" "<<j<<endl;
			return 0;
		}
	if(0==global_check_once)
	{
		for(int i=0;i<n;i++)
		  for(int j=0;j<m;j++)
		    if(map[i][j]=='B' && vis2[i][j]==0)
			{
			   //cout<<"find seperated "<<endl;
			   return 0;
			}
		global_check_once=1;
	}
	return 1;
}

int solve()
{
	global_check_once=0;
	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	    if(map[i][j]=='B')
	    {
	    	if(0==bfs(i,j))return 0;
	    }
	return 1;
}

int main()
{
	//freopen("b_in.txt","r",stdin);
	//freopen("b_out.txt","w",stdout);
	while(cin>>n>>m)
	{
		for(int i=0;i<n;i++)
		  cin>>map[i];
		if(solve())cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	//system("pause");
	return 0;
}

B. Convex Shape

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Consider an n × m grid. Initially all the cells of the grid are colored white. Lenny has painted some of the cells (at least one) black. We call a painted grid convex if one can walk from any black cell to any another black cell using a path of side-adjacent black cells changing his direction at most once during the path. In the figure below, the left grid is convex while the right one is not convex, because there exist two cells which need more than one time to change direction in their path.

 

 

You’re given a painted grid in the input. Tell Lenny if the grid is convex or not.

Input

The first line of the input contains two integers n and m (1 ≤ n, m ≤ 50) — the size of the grid. Each of the next n lines contains _m_characters “B” or “W”. Character “B” denotes a black cell of the grid and “W” denotes a white cell of the grid.

It’s guaranteed that the grid has at least one black cell.

Output

On the only line of the output print “YES” if the grid is convex, otherwise print “NO”. Do not print quotes.

Sample test(s)

input

3 4 WWBW BWWW WWWB

output

NO

input

3 1 B B W

output

YES

VIM小玩

| Comments

1.基本配置

linux的vi在~下有用户vimrc配置.在/etc下有vimrc全局配置.windows直接在安装目录下找vimrc_example.vim就可以了. 设置显示行号 set number 设置编码 set fileencoding=utf-8 (vim有4个跟编码有关系的函数.其中encoding是vim菜单等自用编码.fileencoding是编辑区的编码.vim会自动检测文件编码.所以在windows非命令行下建立文件时.默认均为gb2312如果想要存为utf8的话输入:set fileencoding=utf-8就可以了.或者在vimrc中加入检测命令.au BufWritePre *.txt set fileencoding=utf-8 检测txt文件并自动打入set fileencoding命令) 设置tab为4 set tabstop=4 设置语法高亮 syntax on 设置配色方案 colorscheme desert

2.vim多窗口使用技巧

1、打开多个窗口

打开多个窗口的命令以下几个: 横向切割窗口 :new+窗口名(保存后就是文件名) :split+窗口名,也可以简写为:sp+窗口名 纵向切割窗口名 :vsplit+窗口名,也可以简写为:vsp+窗口名

2、关闭多窗口

可以用:q!,也可以使用:close,最后一个窗口不能使用close关闭。使用close只是暂时关闭窗口,其内容还在缓存中,只有使用q!、w!或x才能真能退出。 :tabc 关闭当前窗口 :tabo 关闭所有窗口

3、窗口切换

:ctrl+w+j/k,通过j/k可以上下切换,或者:ctrl+w加上下左右键,还可以通过快速双击ctrl+w依次切换窗口。

4、窗口大小调整

纵向调整 :ctrl+w + 纵向扩大(行数增加) :ctrl+w - 纵向缩小 (行数减少) :res(ize) num  例如::res 5,显示行数调整为5行 :res(ize)+num 把当前窗口高度增加num行 :res(ize)-num 把当前窗口高度减少num行 横向调整 :vertical res(ize) num 指定当前窗口为num列 :vertical res(ize)+num 把当前窗口增加num列 :vertical res(ize)-num 把当前窗口减少num列

5、给窗口重命名

:f file

6、vi打开多文件

vi a b c :n 跳至下一个文件,也可以直接指定要跳的文件,如:n c,可以直接跳到c文件 :e# 回到刚才编辑的文件

7、文件浏览

:Ex 开启目录浏览器,可以浏览当前目录下的所有文件,并可以选择 :Sex 水平分割当前窗口,并在一个窗口中开启目录浏览器 :ls 显示当前buffer情况

8、vi与shell切换

:shell 可以在不关闭vi的情况下切换到shell命令行 :exit 从shell回到vi

DrawIt!

$vim DrawIt.vba.gz :so % :q 使用vim打开以后,就会发现命令提示中提示使用命令:so %来解亚。 3.安装 安装很容易,将解压后的相应.vim文件复制到vim的插件目录中,通常个人的插件目录为$HOME/.vim/plugin/。将帮助文档.doc复制到相应的doc文档目录中,通常为$HOME/.vim/doc/。 4.使用 1)启动和退出DrawIt。 在vim的普通模式下按下。 /di 启动 /ds 关闭 2)画图 在vim的visual block(可视块)模式下,进入可视块模式的方法是Ctrl-v组合键。选择一个矩形框,然后 /b 矩形框 /e 椭圆 3)箭头 不要进入可视模式! ^ 上箭头 /^ 粗大上箭头 v 下箭头 /v 粗大下箭头 > 右箭头 /> 粗大右箭头 < 左箭头 /< 粗大左箭头 4)斜线 PgUp 右上斜线 PgDn 右下斜线 End 左下斜线 Home 左上斜线 这四个按键刚好可以画出一个菱形,非常好记! [caption id=”attachment1376” align=”alignnone” width=”905”]vim试玩 vim试玩[/caption] [caption id=”attachment1378” align=”alignnone” width=”636”]画图。。。。 画图。。。。[/caption] [caption id=”attachment1377” align=”alignnone” width=”651”]Matrix...O\(∩_∩\)O~ Matrix…O(∩∩)O~[/caption]

[转]8种Nosql数据库系统对比

| Comments

导读:Kristóf Kovács 是一位软件架构师和咨询顾问,他最近发布了一片对比各种类型nosql数据库文章。文章由敏捷翻译 – 唐尤华编译。如需转载,请参见文后声明。 虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破。这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举。 但是NoSQL数据库之间的不同,远超过两 SQL数据库之间的差别。这意味着软件架构师更应该在项目开始时就选择好一个适合的 NoSQL数据库。针对这种情况,这里对 CassandraMongodbCouchDBRedisRiakMembaseNeo4jHBase进行了比较: (编注1:NoSQL:是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储。现今的计算机体系结构在数据存储方面要求具 备庞大的水平扩 展性,而NoSQL致力于改变这一现状。目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型数据库。 参见NoSQL词条。)  

1. CouchDB

  • 所用语言: Erlang
  • 特点:DB一致性,易于使用
  • 使用许可: Apache
  • 协议: HTTP/REST
  • 双向数据复制,
  • 持续进行或临时处理,
  • 处理时带冲突检查,
  • 因此,采用的是master-master复制(见编注2)
  • MVCC – 写操作不阻塞读操作
  • 可保存文件之前的版本
  • Crash-only(可靠的)设计
  • 需要不时地进行数据压缩
  • 视图:嵌入式 映射/减少
  • 格式化视图:列表显示
  • 支持进行服务器端文档验证
  • 支持认证
  • 根据变化实时更新
  • 支持附件处理
  • 因此, CouchApps(独立的 js应用程序)
  • 需要 jQuery程序库   最佳应用场景:适用于数据变化较少,执行预定义查询,进行数据统计的应用程序。适用于需要提供数据版本支持的应用程序。 例如: CRM、CMS系统。 master-master复制对于多站点部署是非常有用的。 (编注2:master-master复制:是一种数据库同步方法,允许数据在一组计算机之间共享数据,并且可以通过小组中任意成员在组内进行数据更新。)  

2. Redis

  • 所用语言:C/C++
  • 特点:运行异常快
  • 使用许可: BSD
  • 协议:类 Telnet
  • 有硬盘存储支持的内存数据库,
  • 但自2.0版本以后可以将数据交换到硬盘(注意, 2.4以后版本不支持该特性!)
  • Master-slave复制(见编注3)
  • 虽然采用简单数据或以键值索引的哈希表,但也支持复杂操作,例如 ZREVRANGEBYSCORE。
  • INCR & co (适合计算极限值或统计数据)
  • 支持 sets(同时也支持 union/diff/inter)
  • 支持列表(同时也支持队列;阻塞式 pop操作)
  • 支持哈希表(带有多个域的对象)
  • 支持排序 sets(高得分表,适用于范围查询)
  • Redis支持事务
  • 支持将数据设置成过期数据(类似快速缓冲区设计)
  • Pub/Sub允许用户实现消息机制   最佳应用场景:适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。 例如:股票价格、数据分析、实时数据搜集、实时通讯。 (编注3:Master-slave复制:如果同一时刻只有一台服务器处理所有的复制请求,这被称为 Master-slave复制,通常应用在需要提供高可用性的服务器集群。)  

3. MongoDB

  • 所用语言:C++
  • 特点:保留了SQL一些友好的特性(查询,索引)。
  • 使用许可: AGPL(发起者: Apache)
  • 协议: Custom, binary( BSON)
  • Master/slave复制(支持自动错误恢复,使用 sets 复制)
  • 内建分片机制
  • 支持 javascript表达式查询
  • 可在服务器端执行任意的 javascript函数
  • update-in-place支持比CouchDB更好
  • 在数据存储时采用内存到文件映射
  • 对性能的关注超过对功能的要求
  • 建议最好打开日志功能(参数 –journal)
  • 在32位操作系统上,数据库大小限制在约2.5Gb
  • 空数据库大约占 192Mb
  • 采用 GridFS存储大数据或元数据(不是真正的文件系统)   最佳应用场景:适用于需要动态查询支持;需要使用索引而不是 map/reduce功能;需要对大数据库有性能要求;需要使用 CouchDB但因为数据改变太频繁而占满内存的应用程序。 例如:你本打算采用 MySQL或 PostgreSQL,但因为它们本身自带的预定义栏让你望而却步。  

4. Riak

  • 所用语言:Erlang和C,以及一些Javascript
  • 特点:具备容错能力
  • 使用许可: Apache
  • 协议: HTTP/REST或者 custom binary
  • 可调节的分发及复制(N, R, W)
  • 用 JavaScript or Erlang在操作前或操作后进行验证和安全支持。
  • 使用JavaScript或Erlang进行 Map/reduce
  • 连接及连接遍历:可作为图形数据库使用
  • 索引:输入元数据进行搜索(1.0版本即将支持)
  • 大数据对象支持( Luwak)
  • 提供“开源”和“企业”两个版本
  • 全文本搜索,索引,通过 Riak搜索服务器查询( beta版)
  • 支持Masterless多站点复制及商业许可的 SNMP监控   最佳应用场景:适用于想使用类似 Cassandra(类似Dynamo)数据库但无法处理 bloat及复杂性的情况。适用于你打算做多站点复制,但又需要对单个站点的扩展性,可用性及出错处理有要求的情况。 例如:销售数据搜集,工厂控制系统;对宕机时间有严格要求;可以作为易于更新的 web服务器使用。

5. Membase

  • 所用语言: Erlang和C
  • 特点:兼容 Memcache,但同时兼具持久化和支持集群
  • 使用许可: Apache 2.0
  • 协议:分布式缓存及扩展
  • 非常快速(200k+/秒),通过键值索引数据
  • 可持久化存储到硬盘
  • 所有节点都是唯一的( master-master复制)
  • 在内存中同样支持类似分布式缓存的缓存单元
  • 写数据时通过去除重复数据来减少 IO
  • 提供非常好的集群管理 web界面
  • 更新软件时软无需停止数据库服务
  • 支持连接池和多路复用的连接代理

[转载]趣文:通俗解释主要编程语言及其用途

| Comments

在 Quora 网站上有这样一个问答贴:《In layman’s terms, what are the major programming languages, and what are they used for? 》如何用通俗语言来解释主要的编程语言及其用途。这个问答贴回复很多,不乏精彩回答。伯乐在线挑选得票数最高排前二的回复。编译如下:   Isaac Lewis 的回复 (3457 票,最有特色的回复,把编程语言比作女人) PHP 是十多岁的花季恋人,是你在那个夏天首次笨手笨脚寻求的女孩。但不要试图和她开始一段更严肃的关系,因为这妹纸有严重的问题。 Perl 是 PHP 的姐姐。对于你来说,或许她年龄有点大了,但在20世纪90年代,她老火了。在和 Larry Wall 有一段长期关系后,Perl 的眼光下降了,并且她现在也色衰了。“ 爷才不管你们怎么说,爷就是爱她!” Larry Wall 如是说。但其他人不是这样的。 Ruby 是脚本语言家族中的酷妹。当你首次遇见她时,由其美貌而生的摄魂大法,差点让你窒息。她也很有趣。那时候她看起来有点反应慢且傻大姐,不过过去几年中,她已成熟许多。 Python 是 Ruby 更为明智的姐姐。她优雅、漂亮、成熟。她或许是太完美了。大多数男人会喜欢说“哥们,你怎么会不喜欢 Python 呢!?”。是的,你是喜欢 Python。你是把当做了既不急躁也不很浪漫的 Ruby。(You just consider her the boring version of the edgy and romantic Ruby) Java 是一位成功的职场女性。有些和她一起共事的人认为,之所以她可以在她那个岗位,虽然能力有所欠缺,但她给中层管理人员留下了好印象。或许你认为她是那种明智类型的,你应当和她一起定居。不过你要准备好在多年之中听不到“接口类型错误、遗漏分号”这样的絮叨。 career woman C++是 Java 的表姐妹。和 Java 有很多共同点,不同的是,熙佳佳成长于更纯真的年代,她不相信要用“保护制度(protection)”。“保护制度”,我当然是在说自动内存管理。难道你以为我在说其他意思么? 是 C++ 的妈妈。如果你和一些胡须泛白的老黑客说起她的大名,他们肯定双眼一亮,然后开始忆初了。:) Objective- C  是 C 家庭的另一成员。她去一个奇特教堂回来后,就不和外面其他人约会了。 Haskell, Clojure, Scheme 和她们的朋友都是一些爱时髦、有艺术气、聪明的妹纸。或许在多年前,你在学校就和她们一起度过了一个美好的夏天。她们是第一批让你觉得有挑战的妹纸。当然,尽管你总是自问“如果 … 将会怎么样”,但你或许从没有想要严肃对她, 你或许会推迟和 C# 的 约会,是因为她家名誉有问题。但她们会告诉你,这些年来,她们已经洗掉臭名。一旦你加入我们,你就是我们的一员了,你听到了吧?你需要一个数据库?她哥哥 MSSQL 会钩住你。你需要一个住的地方?哎呀,她爸爸甚至可以给你在 Azure 大道上买套公寓。怎么样,莫非你对她们这些过度热心的亲戚有其他想法?不,你不能离开。你现在已经是她们的家庭成员,亲,听到了不? Javascript - 嘿,这不就是那个拿下你初吻的妹纸么,甚至比 PHP 还早出现。我不知道她现在在做什么。听说她近几年事业飞黄腾达了。赶上时候,旧人也能焕发光彩……(你能看到她从头到脚穿着 jQuery 设计师设计的东西)……哇,有人变成白天鹅啦…… (^__^) Tamil Selvan 的回复 (他是 Common Lisp 程序员,得票数 333 ) C                        -> 微调后的引擎 C++                    -> 能赚大钱 Java                    -> 可从银行拿回我们的钱 Python                -> 童谣 (甚至老者都能从中发现智慧…) Ruby                   -> 可从风投人那拿到钱 PHP                    -> 用于夫妻店 Erlang                 -> 可同时做多件事 Perl                     -> 和管道胶带类似 Common Lisp       -> 可用其做任何事情,但且不知该做什么 Haskell                 -> 数学系的家伙喜欢用 OCaml                 -> 搞编译器设计的家伙喜欢用 Objective -C         -> 乔布斯粉丝所用 JavaScript            -> 做网页的,到处都在用 C#                     -> 针对那些对 IT 无头绪的人的解决方案(相信 MS 会照顾好你,而不是你自己) Scala                -> 有人(paul graham)说 Java 有点,所以有极客想改变形象,他们就发明了 Scala。 英文原文,Quora,编译:伯乐在线 – 黄利民