Archive for the ‘_IT’ Category

OAuth

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

OAuth是OpenID的一个补充,但是完全不同的服务。

认证和授权过程

在认证和授权的过程中涉及的三方包括:

  • 服务提供方,用户使用服务提供方来存储受保护的资源,如照片,视频,联系人列表。
  • 用户,存放在服务提供方的受保护的资源的拥有者。
  • 客户端,要访问服务提供方资源的第三方应用,通常是网站,如提供照片打印服务的网站。在认证过程之前,客户端要向服务提供者申请客户端标识。

使用OAuth进行认证和授权的过程如下所示:

  1. 用户访问客户端的网站,想操作用户存放在服务提供方的资源。
  2. 客户端服务提供方请求一个临时令牌。
  3. 服务提供方验证客户端的身份后,授予一个临时令牌。
  4. 客户端获得临时令牌后,将用户引导至服务提供方的授权页面请求用户授权。在这个过程中将临时令牌和客户端的回调连接发送给服务提供方
  5. 用户服务提供方的网页上输入用户名和密码,然后授权该客户端访问所请求的资源。
  6. 授权成功后,服务提供方引导用户返回客户端的网页。
  7. 客户端根据临时令牌从服务提供方那里获取访问令牌。
  8. 服务提供方根据临时令牌和用户的授权情况授予客户端访问令牌。
  9. 客户端使用获取的访问令牌访问存放在服务提供方上的受保护的资源。

(From http://zh.wikipedia.org/wiki/OAuth)

5.png

twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,比如像feedtwitterrss2twitter推特中文圈(这个目前好像有点问题转回来的时候是个错误地址) 这种网站就是这个效果。其实这都是拜 OAuth所赐。

OAuth是什么?

OAuth是一个开放的认证协议,让你可以在Web或桌面程序中使用简单而标准的,安全的API认证。

OAuth有什么用?为什么要使用OAuth?

网络开放是一个不变的趋势,那么不可避免的会有各种网络服务间分享内容的需要。

举个我们身边国内的例子吧:比如人人网想要调用QQ邮箱的联系人列表,现在的方法是你需要在人人网输入你的QQ号,QQ密码才能调用,虽然网站上可能都自谓“不保留QQ用户名密码”,但是大家信吗?

OAuth就是为了解决这个问题而诞生的,用户访问第三方资源,不再需要网站提交你的用户名,密码。这样好处自己是安全,而且不会泄露你的隐私给不信任的一方。

OAuth原理

OAuth中有三方:一,用户;二,Consumer(不知杂翻译,类似上面的 twitterfeed 角色);三,服务提供商(如上例的twitter角色)。

一,Consumer 向 服务提供商 申请接入权限

可得到:Consumer Key,Consumer Secret。twitter申请oauth的话,在 setting – connection – developer 里面申请。 同时给出三个访问网址:

  1. request_token_url = ‘http://twitter.com/oauth/request_token’
  2. access_token_url = ‘http://twitter.com/oauth/access_token’
  3. authorize_url = ‘http://twitter.com/oauth/authorize’

二,当Consumer接到用户请求想要访问第三方资源(如twitter)的时候

Consumer需要先取得 请求另牌(Request Token)。网址为上面的 request_token_url,参数为:

  1. oauth_consumer_key:Consumer Key
  2. oauth_signature_method:签名加密方法
  3. oauth_signature:加密的签名 (这个下面细说)
  4. oauth_timestamp:UNIX时间戳
  5. oauth_nonce:一个随机的混淆字符串,随机生成一个。
  6. oauth_version:OAuth版本,可选,如果设置的话,一定设置为 1.0
  7. oauth_callback:返回网址链接。
  8. 及其它服务提供商定义的参数

这样 Consumer就取得了 请求另牌(包括另牌名 oauth_token,另牌密钥 oauth_token_secret。

三,浏览器自动转向服务提供商的网站:

网址为 authorize_url?oauth_token=请求另牌名

四,用户同意 Consumer访问 服务提供商资源

那么会自动转回上面的 oauth_callback 里定义的网址。同时加上 oauth_token (就是请求另牌),及 oauth_verifier(验证码)。

五,现在总可以开始请求资源了吧?

NO。现在还需要再向 服务提供商 请求 访问另牌(Access Token)。网址为上面的 access_token_url,参数为:

  1. oauth_consumer_key:Consumer Key
  2. oauth_token:上面取得的 请求另牌的名
  3. oauth_signature_method:签名加密方法
  4. oauth_signature:加密的签名 (这个下面细说)
  5. oauth_timestamp:UNIX时间戳
  6. oauth_nonce:一个随机的混淆字符串,随机生成一个。
  7. oauth_version:OAuth版本,可选,如果设置的话,一定设置为 1.0
  8. oauth_verifier:上面返回的验证码。
  9. 请求 访问另牌的时候,不能加其它参数。

这样就可以取得 访问另牌(包括Access Token 及 Access Token Secret)。这个就是需要保存在 Consumer上面的信息(没有你的真实用户名,密码,安全吧!)

六,取得 访问另牌 后,

Consumer就可以作为用户的身份访问 服务提供商上被保护的资源了。提交的参数如下:oauth_consumer_key:Consumer Key

  1. oauth_token:访问另牌
  2. oauth_signature_method:签名加密方法
  3. oauth_signature:加密的签名 (这个下面细说)
  4. oauth_timestamp:UNIX时间戳
  5. oauth_nonce:一个随机的混淆字符串,随机生成一个。
  6. oauth_version:OAuth版本,可选,如果设置的话,一定设置为 1.0
  7. 及其它服务提供商定义的参数

OAuth安全机制是如何实现的?

OAuth 使用的签名加密方法有 HMAC-SHA1,RSA-SHA1 (可以自定义)。拿 HMAC-SHA1 来说吧,HMAC-SHA1这种加密码方法,可以使用 私钥 来加密 要在网络上传输的数据,而这个私钥只有 Consumer及服务提供商知道,试图攻击的人即使得到传输在网络上的字符串,没有 私钥 也是白搭。

私钥是:consumer secret&token secret  (哈两个密码加一起)

要加密的字符串是:除 oauth_signature 外的其它要传输的数据。按参数名字符排列,如果一样,则按 内容排。如:domain=kejibo.com&oauth_consumer_key=XYZ&word=welcome………………….

前面提的加密里面都是固定的字符串,那么攻击者岂不是直接可以偷取使用吗?

不,oauth_timestamp,oauth_nonce。这两个是变化的。而且服务器会验证一个 nonce(混淆码)是否已经被使用。

那么这样攻击者就无法自已生成 签名,或者偷你的签名来使用了。

(From http://kejibo.com/oauth/)

 

OAuth_Authentication_Flow

(From http://home.open-open.com/space-361-do-blog-id-3342.html)

Gedit中文乱码

缺省配置下,用 Ubuntu 的文本编辑器(gedit)打开 GB18030/GBK/GB2312 等类型的中文编码文本文件时,将会出现乱码。

出现这种情况的原因是,gedit 使用一个编码匹配列表,只有在这个列表中的编码才会进行匹配,不在这个列表中的编码将显示为乱码。您要做的就是将 GB18030 加入这个匹配列表。

  • 命令行方式,适用于所有 Ubuntu 用户。

复制以下命令到终端中,然后回车即可:

gconftool-2 –set –type=list –list-type=string /apps/gedit-2/preferences/encodings/auto_detected “[UTF-8,CURRENT,GB18030,BIG5-HKSCS,UTF-16]”

  • 图形化方式,适用于 Ubuntu 用户,而不适用于 KUbuntu/XUbuntu 用户。

您可以遵循以下步骤,使您的 gedit 正确显示中文编码文件。

  1. 按下 Alt-F2,打开“运行应用程序”对话框。
  2. 在文本框中键入“gconf-editor”,并按下回车键,打开“配置编辑器”。
  3. 展开左边的树节点,找到 /apps/gedit-2/preferences/encodings 节点并单击它。
  4. 双击右边的 auto_detected 键,打开“编辑键”对话框。
  5. 单击列表右边的“添加”按钮,输入“GB18030”,单击确定按钮。
  6. 列表的最底部新增加了一个“GB18030”。单击选中它,并单击右边的 “向上” 按钮直到 “GB18030” 位于列表的顶部为止。
  7. 单击确定按钮,关闭配置编辑器。

现在,您的 gedit 应该能够顺利打开 GB18030 编码的文本文件了。

汇编:显示存储器与直接写屏等

显示存储器与直接写屏:

;*******************************************************************************************************************************************

;用直接写屏方式变化色彩显示26个字母   

   ;A904
.MODEL        SMALL
.CODE
START:
MOV       AH,0
MOV       AL,3        ;设置80*25 文本16 色
INT       10H
MOV       BX,0B800H   ;显存中起始段地址
MOV       DS,BX
MOV       SI,0
MOV       DL,41H      ;字符的ASCII码
MOV       BL,80H      ;设置彩色文本显示字符属性
MOV       CX,26       ;字符个数
L1:  MOV       [SI],DL
MOV       [SI+1],BL   ;送显示字符的属性
ADD       SI,2
INC       DL
INC       BL
LOOP      L1
MOV       AH,4CH
INT       21H
END       START
;*******************************************************************************************************************************************

;从键盘缓冲区读出键值并显示字符和扫描码

 ;*******************************************************************************************************************************************

        CODE SEGMENT

            ASSUME CS:CODE
KB_BUFFER_HEAD  =         DS:[1AH]
KB_BUFFER_TAIL  =         DS:[1CH]
BUFFER  =         1EH
END_BUFFER  =         3EH
BUFFER_SEG  =         40H

      START:
MOV       AX,BUFFER_SEG
MOV       DS,AX

     WAITKB:  MOV       BX,KB_BUFFER_HEAD
CMP       BX,KB_BUFFER_TAIL
JE        WAITKB
MOV       BX,KB_BUFFER_HEAD
MOV       DX,[BX]
CMP       DL,13
JE        EXIT
MOV       AH,2
INT       21H
MOV       DL,DH
MOV       AH,2
INT       21H
ADD       BX,2
CMP       BX,END_BUFFER
JB        KEEP
MOV       BX,BUFFER
KEEP:  MOV       KB_BUFFER_HEAD,BX
STI
LOOP      WAITKB
EXIT:
MOV       AH,4CH
INT       21H


        CODE  ENDS
END       START
;*******************************************************************************************************************************************

子程序设计:用堆栈传递参数或参数地址

本题有利于理解堆栈,其中有类似于指针的指针

;*******************************************************************************************************************************************
 
DATA  SEGMENT
                  DW        50 DUP (?)
TOS  LABEL     WORD
ARY  DW        100 DUP (4)
NUM  DW        100
SUM  DW        ?
ATYPE  DW        2
DATA  ENDS

 

        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA,SS:DATA
  MAIN  PROC      FAR
MOV       AX,DATA
MOV       SS,AX
LEA       SP,TOS  ; ss:sp  >> data:tos

          ;ds和0 压入堆栈,以便返回dos
PUSH      DS
XOR       AX,AX
PUSH      AX
MOV       AX,DATA
MOV       DS,AX       ;ds=ss

         ;参数地址压入堆栈
LEA       BX,ARY
PUSH      BX
LEA       BX,NUM
PUSH      BX
LEA       BX,SUM
PUSH      BX
CALL      PROSUM2
RET
 MAIN  ENDP

;————————————————————————————————————————————————————–
  PROSUM2  PROC      NEAR
MOV       BP,SP
MOV       SI,[BP+6]
MOV       DI,[BP+4]
MOV       CX,[DI]
MOV       DI,[BP+2]
XOR       AX,AX
CMP       ATYPE,1
JZ        SUMBYTE

  NEXT:  ADD       AX,[SI]
ADD       SI,2
LOOP      NEXT
MOV       [DI],AX
JMP       EXIT

 SUMBYTE:  ADD       AL,[SI]
ADD       SI,1
LOOP      SUMBYTE
MOV [DI],AL

        EXIT:  RET       6
PROSUM2  ENDP
      
  CODE  ENDS
              END       MAIN

;*******************************************************************************************************************************************

 

;冒泡排序法

;*******************************************************************************************************************************************

DATA  SEGMENT
A  DW        9,4,26,85,38
DATA  ENDS
CODE  SEGMENT
ASSUME    CS:CODE,DS:DATA
START:
MOV       AX,DATA
MOV       DS,AX
MOV       DI,4

        LP1:  MOV       CX,DI
MOV       BX,0
LP2:  MOV       AX,A[BX]
CMP       AX,A[BX+2]
JGE       CONT
XCHG      AX,A[BX+2]
MOV       A[BX],AX
CONT:  ADD       BX,2
LOOP      LP2
DEC       DI
JNZ       LP1
MOV       AH,4CH
INT       21H
CODE  ENDS
END       START
;*******************************************************************************************************************************************

编译和链接

 #include <stdio.h>
  int main()
  {
  
          printf("Hello World\n");
          return 0;
  }

         
Linux 下 GCC 
1.预编译
gcc -E hello.c -o hello.i
或cpp hello.c>hello.i
2.编译
gcc -S hello.i -o hello.s

以上可以通过:gcc -S hello.i -o hello.s
也可以直接调用/usr/lib/gcc/i486-linux-gnu/4.3/ccl hello.c
3.汇编
  as hello.s -o hello.o
或者 gcc -c hello.s -o hello.o
以上过程可以直接:gcc -c hello.c -o hello.o
4.链接 
ld -static /usr/lib/crt1.o /usr/lib/crti.o
 /usr/lib/gcc/i486-linux-gnu/4.3/crtbeginT.o 
-L/usr/lib/gcc/i486-linux-gnu/4.3 -L/usr/lib 
-L/lib hello.o --start-group -lgcc -lgcc_eh -lc 
--end-group /usr/lib/gcc/i486-linux-gnu/4.3/crtend.o
 /usr/lib/crtn.o

Vim

在终端 输入以下命令来编辑vimrc配置文件:
sudo vim /etc/vim/vimrc 或者 sudo gedit /etc/vim/vimrc

1、显示行号

在文件末端添加一新行,输入 set nu

2、语法高亮
在文件中找到 “syntax on   这一行,去掉前面的双引号”,双引号是注释的意思

3、自动缩进

在文件末尾添加一行,输入  set autoindent
在添加一行,输入         set cindent
其中 autoindent 是自动缩进; cindent是特别针对 C语言语法自动缩进

注意:如果设置好以上设置后,VIM没有作出相应的动作,那么请你把你的VIM升级到最新版,一般只要在终端输入以下命令即可:sudo apt-get install vim

set showmatch “高亮显示匹配的括号

set tabstop=4 “设置tab键为4个空格

4.代码格式化

格式化全文: gg=G

自动缩进当前行: ==

格式化当前光标接下来的10行: 10=

格式化选定的行: v   (向上下选择)=

5. 改变窗口大小 *window-resize*

                                                *CTRL-W_=*
CTRL-W =        使得所有窗口 (几乎) 等宽、等高,但当前窗口使用 'winheight' 和
                'winwidth'。

:res[ize] -N                                    *:res* *:resize* *CTRL-W_-*
CTRL-W -        使得当前窗口高度减 N (默认值是 1)。
                如果在 'vertical' 之后使用,则使得宽度减 N。

:res[ize] +N                                    *CTRL-W_+*
CTRL-W +        使得当前窗口高度加 N (默认值是 1)。
                如果在 'vertical' 之后使用,则使得宽度加 N。

:res[ize] [N]
CTRL-W CTRL-_                                   *CTRL-W_CTRL-_* *CTRL-W__*
CTRL-W _        设置当前窗口的高度为 N (默认值为最大可能高度)。

z{nr}<CR>       设置当前窗口的高度为 {nr}*<a name="CTRL-W_CTRL-W_<*
CTRL-W <        使得当前窗口宽度减 N (默认值是 1)。

                                                *">CTRL-W_>*
CTRL-W >        使得当前窗口宽度加 N (默认值是 1)。

:vertical res[ize] [N]                  *:vertical-resize* *CTRL-W_bar*
CTRL-W |        设置当前窗口的宽度为 N (默认值为最大可能宽度)。

布线问题 分支限界

//============================================================================
// Name        : lab6_1_2.cpp
// Author      : Binda
// Version     :
// Copyright   : Copyright © 2010- 2011
// Description :布线问题
//============================================================================

#include <iostream>
#include<stdio.h>
using namespace std;
#define N 8
typedef struct {
	int row;
	int col;
} Position;
typedef struct {
	//struct Position;
	int row[10000];
	int col[10000];
	int end;
	int begin;
} Queue;
int grid[100][100];
Position start, finish;
int PathLen = 0;
Position * path;
int n, m, a, b, x;
void printGrid()
{
	 for(int i=0;i<N+2;i++){
				  for(int j=0;j<N+2;j++)
				  {
				     printf(" %.2d",grid[i][j]);
				  }
				  cout<<endl;
		}
}
bool FindPath(Position start, Position finish) {//计算从起点位置start到目标位置finish的最短布线路径,找到最短布线路//径则返回true,否则返回false
	if ((start.row == finish.row) && (start.col == finish.col)) {
		PathLen = 0;
		return true;
	} //start=finish
	//设置方格阵列“围墙”
	int i;
	for (i = 0; i <= m + 1; i++)
		grid[0][i] = grid[n + 1][i] = 1; //顶部和底部
	for (i = 0; i <= n + 1; i++)
		grid[i][0] = grid[i][m + 1] = 1; //左翼和右翼
	int j;
	//初始化相对位移
	Position offset[4];
	offset[0].row = 0;
	offset[0].col = 1;//右
	offset[1].row = 1;
	offset[1].col = 0;//下
	offset[2].row = 0;
	offset[2].col = -1;//左
	offset[3].row = -1;
	offset[3].col = 0;//上
	int NumOfNbrs = 4;//相邻方格数
	Position here, nbr;
	here.row = start.row;
	here.col = start.col;
	grid[start.row][start.col] = 2;
	//标记可达方格位置
	//LinkedQueue<Position> Q;
	Queue Q;
	Q.end = 0;
	Q.begin = 0;
	do {//标记相邻可达方格
		for (i = 0; i < NumOfNbrs; i++) {
			nbr.row = here.row + offset[i].row;
			nbr.col = here.col + offset[i].col;
			if (grid[nbr.row][nbr.col] == 0) {
				//该方格未被标记
				grid[nbr.row][nbr.col] = grid[here.row][here.col] + 1;//统计步数
				if ((nbr.row == finish.row) && (nbr.col == finish.col))
					break; //完成布线
				//Q.Add(nbr);
				Q.col[Q.end] = nbr.col;
				Q.row[Q.end] = nbr.row;
				Q.end++;
			}
		}
		//是否到达目标位置finish?
		if ((nbr.row == finish.row) && (nbr.col == finish.col)){
			//return true;
			break;//完成布线
		}
		//活结点队列是否非空?
		if (Q.begin == Q.end)
			return false;//无解
		else {
			here.row = Q.row[Q.begin];
			here.col = Q.col[Q.begin];
			Q.begin++;//取下一个扩展结点
		}
	} while (true);
	//构造最短布线路径
	PathLen = grid[finish.row][finish.col] - 2;
	path = new Position[PathLen];
	//从目标位置finish开始向起始位置回溯
	here = finish;
	for (j = PathLen - 1; j >= 0; j--) {
		path[j] = here;
		//找前驱位置
		for (i = 0; i < NumOfNbrs; i++) {
			nbr.row = here.row + offset[i].row;
			nbr.col = here.col + offset[i].col;
			if (grid[nbr.row][nbr.col] == j + 2)
				break;
		}
		here = nbr;//向前移动
	}
	return true;
}
int main() {
	int j;
	printf("输入电路板区域n*m和封锁的格数x:\n");
	//  cin>>n>>m>>x;
	n = 8;
	m = 8;
	// x=16;
	//printf("输入封锁的坐标:\n");
	for (a = 0; a < n + 2; a++)
		for (b = 0; b < m + 2; b++)
			grid[a][b] = 0;

	/* for( x = x ; x >= 1 ; x -- )
	 {
	 cin >> a >> b ;
	 grid[a][b]= 1;
	 }*/
	//设置障碍
	for (int i = 1; i <= 5; i++)
		for (int j = 4; j <= 5; j++)
			grid[i][j] = 1;

	for (int i = 6; i <= 8; i++)
		for (int j = 7; j <= 8; j++)
			grid[i][j] = 1;
     printGrid();
	//printf("输入起始位置和结束位置:\n");
	//cin>>start.row>>start.col>>finish.row>>finish.col;
	start.row = 3;
	start.col = 2;
	finish.row =5;
	finish.col = 6;
	if (FindPath(start, finish)) {
		printf("输出路径长度及途中坐标:");
		cout << PathLen << endl;
		cout << start.row << " " << start.col << endl;
		for (j = 0; j < PathLen; j++)
			cout << path[j].row << " " << path[j].col << endl;
	} else
	cout << "No Solution!" << endl;
	printGrid();
	delete[] path;
	return 0;
}

svn 命令 (更新中)

1.删除文件内容
svn rm https://algorithm-proj.googlecode.com/svn/trunk/lab6/lab6_1 -m "It's totally a mesh"
 
2. 取出文件夹内容
svn checkout https://algorithm-proj.googlecode.com/svn/trunk/demo/LCS
3. 列出文件夹内容
svn ls https://algorithm-proj.googlecode.com/svn/trunk/demo/LCS
4.提交
svn commit /home/binda/LCS -m "JUST TEST SVN ON LINUX"