Wednesday, May 27, 2009

Winxp下 gvim 编程环境搭建

更多精彩请到 http://www.139ya.com


Winxp下 gvim 编程环境搭建 : http://blog.csdn.net/minico/archive/2007/12/15/1938050.aspx

Winxp下 gvim 编程环境搭建

更多精彩请到 http://www.139ya.com

1.官方网站下载最新的gvim7.1 win32,然后选择完全安装;我是安装在d:\vim目录下面,安装后的目录结构如下:
D:\VIM
├─vim71
│ ├─autoload
│ ├─colors
│ ├─compiler
│ ├─doc
│ ├─ftplugin
│ ├─indent
│ ├─keymap
│ ├─lang
│ ├─macros
│ ├─plugin
│ ├─spell
│ ├─syntax
│ ├─tools
│ └─tutor
└─vimfiles
├─after
├─autoload
├─colors
├─compiler
├─doc
├─ftdetect
├─ftplugin
├─indent
├─keymap
├─plugin
└─syntax

2.安装常用插件:
vimdoc http://vcd.gro.clinux.org (中文)
安装 直接安装即可,安装时会自动搜索到vim的安装位置,然后安装到相应的目录
使用 :h
说明 中文帮助文档
taglist http://www.vim.org/scripts/script.php?script_id=273
安装 解压到vim71目录下面
使用 :Tlist
说明 需要Ctags产生的tags文件配合
WinManager http://www.vim.org/scripts/script.php?script_id=95
安装 解压到vim71目录下面
使用 wm,这个命令是通过在_vimrc中配置后才能有,具体配置见后面的_vimrc文件
说明 此插件的作用是将TagList窗口和netrw窗口整合起来
Ctags http://ctags.sourceforge.net
安装 解压到vim71目录下面
使用 ctags -R --c++-kinds=+p --fields=+iaS --extra=+q src
在对C++文件进行补全时,OmniCppComplete插件需要在标签文件中包含C++的额外信息,因此上面的ctags命令不同于以前我们所使用的,它专门为C++语言生成一些额外的信息.
说明 其实只是一个ctags.exe文件,用来产生tags文件供其它插件使用
MiniBufExplorer http://www.vim.org/scripts/script.php?script_id=159
安装 将minibufexpl.vim放 到vim71/plugin 文件夹中即可;
使用 打开多个文件后,自动在顶端出现文件标签,双击鼠标或者Ctrl+tab键可以切换文件;
说明  
grep http://www.vim.org/scripts/script.php?script_id=311
安装 将grep.vim放 到vim71/plugin 文件夹中即可;
使用 安装后会在菜单=》工具中增加search子菜单,也可以用命令:grep或者按照后面给出的_vimrc文件映射快捷键F3
说明 需要windows版本的grep.exe程序配合;
到http://unxutils.sourceforge.net/下载unxutils工具包里面包含grep.exe,把grep.exe放到系统c:\windows\system32下面即可。
omnicppcomplete http://www.vim.org/scripts/script.php?script_id=1520
安装 解压到vimfiles目录下面;
使用 配合后面的supertab插件,使用Tab键进行自动完成;
说明 如果要对c++文件进行自动完成,需要生成tag文件时用特殊的选项,见后面的_vimrc配置文件
a http://www.vim.org/scripts/script.php?script_id=31
安装 将a.vim放 到vim71/plugin 文件夹中即可;
使用 :A
说明 在源文件和头文件之间进行切换
Supertab http://www.vim.org/scripts/script.php?script_id=1643
安装 将supertab.vim放 到vim71/plugin 文件夹中即可;
使用 配合前面的omnicppcomplete插件,使用Tab键进行自动完成;
说明  
NERD_commenter http://www.vim.org/scripts/script.php?script_id=1218
安装 解压到vim71目录下面
使用 http://xiaobo.spaces.live.com/blog/cns!5ec21dee9b73c1a8!814.entry
说明  
lookupfile http://www.vim.org/scripts/script.php?script_id=1581
安装 解压到vimfiles目录下面;
使用 根据后面的_vimrc配置文件,使用F5键打开搜索窗口;Tab键进行选择
说明 依赖于插件genutils
genutils http://www.vim.org/scripts/script.php?script_id=197
安装 解压到vimfiles目录下面;
使用 这个插件提供了一些通用的函数,可供其它的脚本使用
说明 供lookupfile插件使用

clearcase http://p.blog.csdn.net/images/p_blog_csdn_net/minico/EntryImages/20081123/gvim.JPG
安装 解压到vimfiles目录下面;
使用 这个插件提供一些常用的clearcase命令
说明 无
3._vimrc配置文件

set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\ let cmd = '""' . $VIMRUNTIME . '\diff"'
let eq = '"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction

"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" Add by minico---begin
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

"设置帮助语言
set helplang=cn,en

"把gui的工具栏去掉(要去掉,把等号前面的加号变成一个减号即可)
set guioptions+=T

"把gui的右边的滑动条去掉
set guioptions+=r

"把gui的左边的滑动条去掉
set guioptions-=L

"把gui的菜单去掉
set guioptions+=m
filetype on
let Tlist_Show_Menu = 1

" 这项必须设定,否则出错,配置taglist的ctags路径
"let Tlist_Ctags_Cmd = 'D:\Vim\vim71\ctags.exe'


"设置Taglist
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1

" 使用F8打开Taglist
nnoremap :TlistToggle

"设置窗口大小和位置
set lines=80
set columns=200
winpos 0 0

"设置tags文件路径
set tags=G:\lwip\tags

"设置文件浏览器窗口显示方式
"通过WinManager插件来将TagList窗口和netrw窗口整合起来
let g:winManagerWindowLayout='FileExplorer|TagList'
nmap wm :WMToggle

"设置SuperTab,用tab键打开cppcomplet的自动补全功能。
let g:SuperTabRetainCompletionType=2
let g:SuperTabDefaultCompletionType=""

"显示行号
set number

"打开语法高亮显示功能
syntax enable
syntax on

"设置主题颜色
colorscheme desert

"则可以用切换到上下左右的窗口中去
let g:miniBufExplMapWindowNavVim = 1

"按F12时在一个新的buffer中打开c\h文件
nnoremap :A

"用F3调用grep查找当前光标所在处的字符串
nnoremap :Grep

"为了使用智能补全,打开文件类型检测,关闭VI兼容模式
filetype plugin indent on
set nocp

"关掉智能补全时的预览窗口,这样可以防止闪屏现象
set completeopt=longest,menu

"====================Lookupfile 相关设置========================================

let g:LookupFile_MinPatLength = 2 "最少输入2个字符才开始查找
let g:LookupFile_PreserveLastPattern = 0 "不保存上次查找的字符串
let g:LookupFile_PreservePatternHistory = 1 "保存查找历史
let g:LookupFile_AlwaysAcceptFirst = 1 "回车打开第一个匹配项目
let g:LookupFile_AllowNewFiles = 0 "不允许创建不存在的文件
if filereadable("./filenametags") "设置tag文件的名字
let g:LookupFile_TagExpr = '"./filenametags"'
endif
"nmap lk LookupFile "映射LookupFile为,lk
"nmap ll :LUBufs "映射LUBufs为,ll
"nmap lw :LUWalk "映射LUWalk为,lw

"有了上面的定义,当我输入”,lk”时,就会在tag文件中查找指定的文件名;
"当输入”,ll”时,就会在当前已打开的buffer中查找指定名字的buffer;
"当输入”,lw”时,就会在指定目录结构中查找。

"在用lookupfile插件查找文件时,是区分文件名的大小写的,
"如果想进行忽略大小写的匹配,把下面这段代码加入你的vimrc中,
"就可以每次在查找文件时都忽略大小写查找了:

" lookup file with ignore case
function! LookupFile_IgnoreCaseFunc(pattern)
let _tags = &tags
try
let &tags = eval(g:LookupFile_TagExpr)
let newpattern = '\c' . a:pattern
let tags = taglist(newpattern)
catch
echohl ErrorMsg | echo "Exception: " . v:exception | echohl NONE
return ""
finally
let &tags = _tags
endtry

" Show the matches for what is typed so far.
let files = map(tags, 'v:val["filename"]')
return files
endfunction
let g:LookupFile_LookupFunc = 'LookupFile_IgnoreCaseFunc'

"====================Lookupfile 相关设置 end========================================

"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" Add by minico---end
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


在Eclipse中使用Gvim

更多精彩请到 http://www.139ya.com

在Eclipse中使用Gvim : http://ganzhi.blogspot.com/2007/03/vimeclipse.html

Working Directory : ${project_loc}
Arguments : ${resource_loc} 或如下设置

Refresh: The selected resource

命令参数可以这样设置:
-p --remote-tab-silent ${resource_loc}
这是打开一个新的标签页,而不是一个新的vim进程。

Tuesday, May 26, 2009

不得不转的ksh 学习

更多精彩请到 http://www.139ya.com

转自 : http://blog.chinaunix.net/u1/56521/showart_1094921.html

Korn Shell
1.语法
特殊的文件

/etc/profile 在登录时首先自动执行。

$HOME/.profile 在登录时第二个自动执行。

$ENV 在创建一个新的KShell时指定要读的一个文件。
文件名元字符

* 匹配有零或零个以上字符的字符串

? 匹配任何单个字符

[abc…] 匹配括号内任何一个字符,也可用连字符指定一个范围(例如,a-z,A-Z,0-9)

[!abc…] 匹配任何不包括在括号内的字符



?(pattern) 匹配模式的零个或一个实例

*(pattern) 匹配指定模式的零个或多个实例

+(pattern) 匹配指定模式的一个或多个实例

@(pattern) 只匹配指定模式的一个实例

!(pattern) 匹配任何不匹配模式的字符串

\n 匹配与(…)中的第n个子模式匹配的文本。

~ 当前用户的主目录

~name 用户name的主目录



这个模式pattern可能是由分隔符“|”或“&”分隔的模式的序列,

例:pr !(*.o|core) | lp
引用

; 命令分隔符

& 后台执行

( ) 命令分组

| 管道

<> & 重定向符号

* ? [ ] ~ + - @ ! 文件名元字符

““ 中间的字符会逐字引用,除了`` 替换命令和$ 替换变量.

‘’ 中间的所有字符都会逐字引用

\ 在其后的字符会按其原来的意义逐字采用.如在””中使用 \”,\`,\$

\a 警告,\b退格,\f 换页,\n 换行,\r 回车,\ 制表符,\v 垂直制表符,

\nnn 八进制值,\xnn 十六进制值,\’ 单引号,\” 双引号,\\ 反斜线,

`` 命令的替换

$ 变量的替换
命令形式

Cmd & 在后台执行

Cmd1;cmd2 命令序列,依次执行

{cmd1;cmd2;} 将命令做为一组来执行

(cmd1;cmd2) 在子shell中,将命令做为一组执行

Cmd1|cmd2 管道;将cmd1的输出作为cmd2的输入

Cmd1 `cmd2` 命令替换;用cmd2的输出作为cmd1的参数

Cmd1$(cmd2) 命令替换,可以嵌套

Cmd$((expression)) 运算替换。用表达式结果作为参数

Cmd1&&cmd2 逻辑与。如果cmd1成功才执行cmd2

Cmd1||cmd2 逻辑或。如果cmd1成功则不会执行cmd2
重定向形式

文件描述符:

0 标准输入 stdin 默认为键盘

1 标准输出 stdout

2 标准错误 stderr



Cmd > file 将cmd的结果输出到file(覆盖)

Cmd >> file 将cmd的结果输出到file(追加)

Cmd < file 从file中获取cmd 的输入

Cmd << text 将shell脚本的内容(直到遇见一个和text一样的标记为止)作为cmd的输入

Cmd <> file 在标准输入上打开文件以便读写



Cmd >&n 将输出发送到文件描述符n。ll >&1

Cmd m>&n 将本来输出的m中的内容转发到n中。Ll 3>&2

Cmd >&- 关闭标准输出

Cmd <&n 获取输入

Cmd m<&n

Cmd <&- 关闭标准输入

在文件描述符和一个重定向符号间不允许有空格。



Cmd 2>file 将标准错误发到file中

Cmd > file 2>&1 将标准错误和标准输出都发到file

Cmd > f1 2>f2 将标准输出发到f1,标准错误发到f2

Cmd | tee files 将输出发送到标准输出和files中

Cmd 2>&1 | tee files 将输出和错误同时发到标准输出和files中
2.变量
变量替换

下列表达式中不允许使用空格。冒号是可选的,如果用冒号那么变量必须是非空的并设置了初始值。

Var=value… 将变量var 设为value

${var} 使用变量var的值;如果变量和其后面的文本是分开的则可以不加大括号。

${var:-value} 如果变量var已设置则使用它,否则使用值value

${var:=value} 如果变量var已设置则使用它,否则使用值value并将value赋给变量var

${var:+value} 如果变量var已设置则使用value,否则什么也不使用



例:echo ${u-$d};echo ${tmp-`date`}如果没设tmp,则执行date;
内置变量

$# 命令行参数的个数

$? 上一条命令执行后返回的值

$$ 当前进程的进程号(PID), 通常用于在shell脚本中创建临时文件的名称

$0 第一个参数即命令名

$n 命令行上的第n个参数

$* 将命令行上所有参数作为一个字符串

$@ 命令行上所有参数,但每个参数都被引号引起来



LINENO 脚本或函数内正在执行的命令的行号

OLDPWD 前一个工作目录(由CD设置)

PPID  当前SHELL的父进程的进程号

PWD   当前工作目录(由CD设置)

RANDOM[=n] 每次引用时产生一个随机数,如果给定n则以整数n开始

SECONDS 这个整型变量的值是指从这个shell会话启动算起所过去的秒数。但它更有用的是用脚本中的计时。

例:start=$SECONDS

read answer

finish=$SECONDS

TMOUT 如果设置了该变量,则在没有输入的情况下经过TMOUT变量所指定的秒数后,shell退出。值为0时无效。

CDPATH

允许用户使用简单文件名作为CD的参数,从而快速改变目录。设置方法与PATH类似,通常在启动文件中设置。如果CD的参数是一个绝对路径,则不会查询CDPATH.

例:CDPATH=:/u1/nr:/u1/progs:

export CDPATH

cd nr

就会进到nr中去。

注意:变量必须大写,定义后必须导出.
数组

Kshell支持一维数组,最多支持1024个元素。第一个元素为0。

Set –A name value0 value1 …

声明数组,指定的值就成为name的元素。



${name[i]} i为0至1023的值,可以是表达式。返回数组元素i

${name} 返回数组元素0

${name[*]},${name[@]} 返回所有元素

下标[*]和[@]都可以提取整个数组的内容。但当它们在引号中使用时其行为是不同的。使用@可生成一个数组,这个数组是原始数组的副本,而使用*,则生成的仅仅是具有单一元素的数组(或者是一个普通变量)。

例:set -A a "${names[*]}"

set -A b "${names[@]}"

set|head -5

a[0]='alex helen jenny scott'

b[0]=alex

b[1]=helen

b[2]=jenny

b[3]=scott

${#name[*]} 返回数组元素个数
运算符

Kshell使用C语言中的运算符。

+ 加;- 减;! 逻辑非;~ 按进制取反;* 乘;/ 除;% 求余;<< 左移;>> 右移;<= 小于等于;>= 大于等于;< 小于;

> 大于;== 相等;!= 不等;&& 逻辑与;|| 逻辑或;
3.内置命令

# 注释后面的一行



Break [n] 从for while select until循环中退出或从n次循环中退出



Case value in

Pattern1) cmds1;;

Pattern2) cmds2;;





Esac

类似于select case.例:

Case $1 in

No|yea) response=1

break;;

-[tT]) table=TRUE;;

*) echo “unknown option”;exit 1;;

Esac



Continue [n] 在for while select until循环中跳过余下的命令,继续下一次循环(或跳过n次循环)



Eval args args是一行包含shell变量的代码.eval首先进行变量扩展,并且运行由此产生的命令。在shell变量包括了重定向符号,别名或其他变量时是有用的。

例:

For option

Do

Case “$option” in

Save) out=’ > $newfile’;;

Show) out=’ | more’;;

Esac

Done

Eval sort $file $out



Exit [n] 退出脚本,退出状态为n.



Export [name=[value]…]

定义全局变量,让其它shell脚本也可以使用。无参数时输出当前定义的全局变量。



For x [in list]

Do

Commands

Done

使变量x(在可选的值列表中)执行commands,省略时假定为”$@”位置参数

例:

For item in `cat program_list`

Do

Grep –c “$item.[co]” chap*

Done



Function name{commands;} 定义一个函数



If condition1

Then commands1

[elif condition2

Then commands2]





[else commands3]

Fi

条件执行语句。



Let expressions 执行一个或多个表达式。表达式中的变量前不必有$.如果表达式中包含了空格或其他特殊字符,则必须引起来。

例:let “I = I + 1” 或 let i=i+1



Read [var1[?string]] [var2 …] 从标准输入读入一行给相应的变量,并把剩余的单词给最后一个变量。String为相应的提示信息.无参时只等待一次输入。



Readonly [var1[=value] var2[=value] …] 设置只读变量,无参时显示所有只读变量



Return [n] 用于一个函数里面返回状态



repeat word

do

commands

done

指定一个命令序列执行的次数。

例:

repeat 3

do

echo "bye"

done



Select x [in list]

Do

Commands

Done

显示一列按list中顺序编号的菜单项。让用户键入行号选择或按return重新显示。

例:

Ps3=”select thd item number:”

Select event in format page view exit

Do

Case “event” in

Format) nroff $file | lp;;

Page) pr $file | lp;;

View) more $file;;

Exit) exit 0;;

*) echo “invalid selection”;;

Esac

Done

输出为:

1. format

2. page

3. view

4. exit

select the item number:



set [options arg1 arg2 …] 无参时输出所有已知变量的值。



Shift [n] 交换位置参数(如将$2变为$1).如果给出n,则向左移动n个位置。通常用于在while循环中迭代命令行参数。N可以是一个整数表达式。



Sleep [n] 睡眠n秒钟



Test condition 或[ condition ] 判断条件,为真返回0,否则返回非0.

文件:

-a filename 如果该文件存在而为真

-d filename 如果该文件存在且为一个目录,则为真

-f filename 如果该文件存在且为一个常规文件,则为真

-L filename 如果该文件存在且为一个符号链接,为真

-r filename 如果该文件存在且用户对其有读取权限,真

-s filename 如果该文件存在且包含信息(大于0字节),真

-w filename 如果该文件存在且对其有写入权,真

-x filename 如果该文件存在且对其有执行权,真

File1 -nt file2 如果file1存在且在file2后修改则值为真(指修改时间)

File1 -ot file2 如果file1存在且在file2前修改则值为真(指修改时间)

字符串:

string 如果string不为空字符串则值为真

-n string 如果string字符长度大于0则值为真

-z string 如果string字符长度等于0则值为真

string1=sting2 如果string1等于string2则值为真

string1!=string2 如果string1不等于string2则值为真

string2可以是通配符模式。

整数比较:

-gt 大于;-ge 大于或等于;-eq 等于;-ne 不等于; -le 小于或等于; -lt 小于

组合:

! condition 如果condition为假则为真

condition1 –a condition2 如果两个条件都为真则为真

condition1 –o condition2 如果两个条件有一个为真则为真



trap [[commands] signals] 如果接收到任何的信号signals则执行命令commands.如果完全忽略commands则会重新设置由默认行为处理指定的信号。

例:

Trap “” 2 ;忽略信号2(中断,通常是ctrl+c)

Trap 2 ;恢复中断2

Trap “rm –f $tmp;exit” 0 1 2 15 ;当shell程序退出,用户退出,按ctrl+c或执行kill时删除$tmp.



Typeset [options] [var [var]…]设置变量属性

-u 将变量值中所有字母全部转换成大写

-l 将变量值中所有字母全部转换成小写

-i 将变量值设为整数类型.-ix x为相应的进制,表示时为x#变量值,可用于进制转换。

例:typeset -i2 vv vv=2 echo $vv 2#10

typeset -i 相当于integer

-L width 在width宽度之内左对齐

-R width 在width宽度之内右对齐,前面空位用空格填充

-Z width 在width宽度之内右对齐,变量如果是数字,则前面空位用零填充

如果忽略width,将使用赋给这个变量的第一个值的宽度。

-x 设置一个变量全局。typeset -x 相当于 export

-r 设置一个变量具有只读属性,在设置的同时或之前,要先给这些变量赋值。

例:typeset -r PATH FPATH=/usr/local/funcs

typeset -r 相当于 readonly

不带参数的typeset可以列出变量和变量的属性。查看指定的变量属性可用type|grep day

使用带有某一选项的typeset来看看哪一个变量具有特定的属性:typeset -z



Unset var 删除一个变量,将它置为空



Until condition

Do

Commands

Done

执行命令command直到满足条件condition.



While condition

Do

Commands

Done

如果满足条件condition则执行commands

grep 用法

更多精彩请到 http://www.139ya.com

grep 的用法
1 双引号引用
在grep命令中输入字符串参数时,最好将其用双引号括起来
2 grep选项
常用的g r e p选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文档时不显示文档名。
-l 查询多文档时只输出包含匹配字符的文档名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的任何行。
3 精确匹配
使用grep抽取精确匹配的一种更有效方式是在抽取字符串后加\>。假定现在精确抽取48,则为"48\>"
三 grep和正则表达式
使用正则表达式时最好用单引号括起来,这样能够防止grep中使用的专有模式和一些shell命令的特别方式相混淆。
1 模式范围
假定要抽取代码为484和483的城市位置,上一章中讲到能够使用[ ]来指定字符串范围,这里用48开始,
以3或4结尾,这样抽出484或483。grep '48[34]' data.f
2 不匹配行首
假如要抽出记录,使其行首不是48,能够在方括号中使用^记号,表明查询在行首开始。
grep '^[^48]' data.f
3 匹配任意字符
假如抽取以L开头,以D结尾的任何代码,可使用下述方法,因为已知代码长度为5个字符:
grep 'L...D' data.f
4 日期查询
一个常用的查询模式是日期查询。先查询任何以5开始以1 9 9 6或1 9 9 8结尾的任何记录。使用模式5..199[6,8].这意味着第一个字符为

5,后跟两个点,接着是199,剩余两个数字是6或8。
grep '5..199[6,8]' data.f
查询包含1998的任何记录的另外一种方法是使用表达式[0-9]\[8],含义是任意数字重复3次,后跟数字8,虽然这个方法不像上一个方

法那么精确,但也有一定作用。
5 使用grep匹配“和”或“或”模式
grep命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
grep -E '219|216' data.f
6 空行
结合使用^和$可查询空行。使用- n参数显示实际行数:
grep '^$' data.f
7 grep 和类名的使用
类等价的正则表达式类等价的正则表达式
[[:upper:]] [A-Z] [[:alnum:]] [0-9a-zA-Z]
[[:lower:]] [a-z] [[:space:]] 空格或t a b键
[[:digit:]] [0-9] [[:alpha:]] [a-zA-Z]

Wednesday, May 20, 2009

New and improved Apps to SD(more stable, more powerful, etc) Tutorial

更多精彩请到 http://www.139ya.com

http://forum.xda-developers.com/showthread.php?t=512743

Well, some of you may have heard my ramblings around here that I've been working with some of the devs here(JF and MartinFick deserve major praise, probably more than me) on getting a better way to do the whole apps to sd thing.

After 3 days of talking/discussing/working on it, I've finally reached the fruits of that investigation and thought I'd share. This new method uses the filesystem unionfs to essentially meld the /data directory with the /system/sd directory, so that they appear to be one. This has the potential to allow users to move specific apps to or from the sd card, is far more stable than the normal symlink method(will still boot, etc even if there's no SD card) and should be easier to set up. Now, onto the tutorial of setting this up.

BIG DISCLAIMER NOTE: This is a major hack of the phone and it is fully possible that it will break your phone(I've seen no permanently bricked phones but that doesn't make it impossible). Use this method, and my app along with it at your own risk.

REQUIREMENTS:
1: This only works on JF(possibly only on 1.5, not sure about the others) and The Dude's v.1.0 or greater. The Dude's 1.0 or greater actually does the steps in this tutorial for you so you can just run appstosd2 and set it all up from there if you're using his ROM.
2: This still requires you to have 2 partitions set up, first FAT32 and second ext2. Although you can use the appstosd2 app attached to this post and available in the market for $0.99 which will partition the card for you.
3: If you want your apps to go to the sd card, you must have a directory "/system/sd/app" If you didn't have apps to sd before on the ext2 partition do the following in terminal emulator or run my appstosd2 app after finishing the tutorial:
Code:
su
mkdir /system/sd/app
If you want the private-apps, or dalvik-cache moved you can replace "app" in that code with ""app-private", or "dalvik-cache" respectively. Do not copy "data" to the sd card. My script will delete it on the next reboot.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

Alright, first there's some files you need.
1: init.rc in .zip attached to this thread
2: a2sd.sh in .zip attached to this thread

All the above listed files should be put on your sd card(my tutorial will assume they are in the root directory of the sdcard(the topmost folder)

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

If you need to undo the normal apps to SD first do the following in the recovery terminal(it's not strictly necessary but I'd recommend it):
Code:
mount data
rm /data/app
mkdir /data/app
if you moved the dalvik cache, repeat steps 2-3 with "dalvik-cache" instead of app. Ditto with "data" for the data cache.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

Then go to terminal editor and type the following:
Code:
su
cp /sdcard/init.rc /data/
cp /sdcard/a2sd.sh /data/
Then reboot and you're set. By default all future apps are installed to the sd card. In order to move an app to the internal memory do the following in terminal emulator:

Code:
su
cp /system/sd/app/[the app you want to move] /system/intmem/app/
rm /system/sd/app/[the app you want to move]
I will be incorporating this into my appstosd app soon(probably as a JF and TheDude-only version until the rest of the devs get on board).

I have included a copy of appstosd 2, which will copy all apps from internal memory to the sd card with an option to remove them from the internal memory. This will only work if you have followed this tutorial.

If you don't have partitions set up, appstosd2 will now do that for you with user-set partition sizes.

NOTE: If you're using The Dude's ROM and find yourself with an outdated version of this since he doesn't always update his ROMs at the same time I update this, do the following in terminal emulator to update(after putting a2sd.sh from the attached a2sd.zip on your sdcard):

Code:
su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
rm /system/bin/a2sd.sh
cp /sdcard/a2sd.sh /system/bin/
reboot
For JF1.5, do the following to update:

Code:
su
rm /system/intmem/a2sd.sh
rm /system/intmem/init.rc
cp /sdcard/a2sd.sh /system/intmem/
cp /sdcard/init.rc /system/intmem/
reboot
NOTE FOR UPDATERS: If you had your data on the sdcard(/system/sd/data), it WILL GET DELETED with the new version. This is a necessity in order to get both wallpaper and protected apps working. I recommend moving it back to the phone.
Attached Files
File Type: zip AppstoSD2.zip (45.4 KB, 661 views)
File Type: zip a2sd.zip (690 Bytes, 800 views)
__________________
Device: T-Mobile G1(black)
ROM: The Dude's version 1.1a(with fixed protected apps)
118 apps with 1400 MB remaining!!!

site web de ruby

更多精彩请到 http://www.139ya.com

ruby toolbox : http://ruby-toolbox.com/

Cool websites

更多精彩请到 http://www.139ya.com

云世界 : http://icloud.cn/
这是一个好玩又有用的网站。在不同的地方使用,会有不同的体验


real time web : http://www.readwriteweb.com/archives/introduction_to_the_real_time_web.php

TwitPic lets you share photos on Twitter : http://twitpic.com/

twitter 中文用户 : http://twitter.missiu.com/

Email协议基础知识

更多精彩请到 http://www.139ya.com

转自:http://www.chinalinuxpub.com/bbs/showthread.php?t=19694

1. Email系统的基本原理
[1]internet地址
(1)标准的internet地址
所有Internet的地址通用形式为:
userid(用户标识)@domain(域名)
例:qinghua0000@sohu.com
harley@fuzzball.ucsb.edu
(2)域名与子域
用户标识不是唯一的,
唯一所具备的条件呢就是用户标识与域名的结合必须是唯一的,在同一个域中的用户标识不能相同。其中的域名包含若干子域。值得注意的 是,一种具有两个子域的地址,通常要么这个机构很小,要么很大(sohu.com)。sohu是拥有多台计算机的大机构;在这样的机构中,有一台计算机 专用作与外部世界之间电子邮件的收发。该机构的系统管理员为每个人都安排有简单化的邮件地址。以便能够在sohu.com地址上收发邮件。
一般,术语“gateway”(网关)涉及的是两个不同系统之间的连接,假如我们有一个网关(gateway),网关起着内部网络与外部世界之间的连接作用。因网关有用户标识和本地地址表;当一个邮件到达时,网关就可以校查该表,并把该邮件发送给相应的本地计算机。
(3)最高级域
一般有两种形式的最高级域:一般称之为机构域,还有一种称之为地区域。
域 类型
com 商业机构 (全称:commercialorganization)
edu 教育机构 (全称:educationalinstitution)
gov 政府部门 (全称:government)
int 国际性机构 (全称:internationalorganization)
mil 军队 (全称:military)
net 网络机构 (全称:networhimgorganization)
org 非盈利机构 (全称:non-profitorganization)
表一、最高级域机构名属性对照表
域 国家
at 奥地利 (全称:Austria)
au 澳大利亚 (全称:Australia)
ca 加拿大 (全称:Canada)
ch 瑞士 (全称:Switzerland"ConfoederationHlvetia")
cn 中国 (全称:China)
de 德国 (全称:Genmark"Deutschland")
dk 丹麦 (全称:Denmark)
es 西班牙 (全称:Spain"Espana")
fr 法国 (全称:Fance)
gr 希腊 (全称:Greece)
ie 爱尔兰共和国 (全称:Republic of Zreland)
jp 日本 (全称:Japan)
nz 新西兰 (全称:New zealand)
uk 英国 (全称:United Kingdow)
us 美国 (全称:United States)
(4)伪Internet地址
有许多机构希望与Internet相连接,但是没有时间或经费与Internet保持长期的连接。作为一个替代的方法,它们与附近的Internet点商 定,让其作为它们的邮件代理。仅从这个地址,常常无法断定计算机是否真正与Internet相连接。如果要确切知道一台计算机是否与Internet连 接,可使用host命令。
(5)IP地址与 host命令
可以在使用正规地址的任何地方使用IP地址。Internet的地址记录系统叫做域名系统或DNS。DNS是将域名地址与IP数字地址这两个版本来回转换的一种TCP/IP服务。
如果要测试 DNS,可以使用host命令。有以下两种格式:
host standard-address
host IP-address
如果你从一个标准地址入手:
host ucsd.edu
DNS将显示IP地址:
host 128.54.16.1
反之如果你从一个IP地址入手,DNS将显示标准地址。
只有Internet主机才有IP地址(仿真终端是没有的)。因此,可以使用host命令检查计算机是否与Internet直接连接。如使用host能测试出IP地址,说明该计算机是与Internet连接的。
如果指定的地址是未与Internet直接连接的计算机的。将看到:
host not found
host 命令并不适用于所有的计算机。如果你的系统没有host,请试一下nslookup或nstest。
(6)UUCP
所有Unix系统都有一个叫做UUCP的内置联网系统。UUCP是一组程序。名字UUXP来自这些程序中的一个程序,该UUCP程序将文件在Unix系统之间相互拷贝,因此这个名字的意思是“Unix到Unix拷贝”。
UUCP的功能不及TCP/IP强。例如,UUCP不能提供远程登录UUCP邮件程序比Internet慢,并更难用。但是UUCP有一个重要的优点,它 是一个标准的Unix部分(适合于绝大多数系统),它通过拨号或电缆直接连接运行,既便宜又可靠。UUCP的作用是使Unix系统连接到一起,形成一个 链。例如,假定你正在使用一台名为alpha的计算机,你的计算机就与另一台名为beta的计算机连接起来了,beta计算机与gamma计算机连 接,gamma计算机再与delta计算机连接。
它提供了一种经济的方式在计算机之间远距离传送邮件。但是,有一个重要的缺点:由于许多UUCP连接是通过电话线,而且在某些预定的时间内实现的邮件投送 可能需数小时,甚至好几天。将还种方式与Internet比较,在Internet中,连接是永久的,信息件递很迅速,常常在几秒钟内,一般在几分钟内就 可以完成。
(7)UUCP地址和Bang路径
建立一个由名字依次排列组成的地址,名字之间用!符号分开。例如,下面是一个将上面提到的用户标识发送信息的邮件命令。
mailbeta!gamma!delta!murray
在Unix术语中,!符号的专门术语名字之一是bang。因此,一个指定多重名字的UUCP地址有时叫做bang路径(bangpath)。
(8)简化的UUCP地址
为了使得UUCP获取地址方便,采取了一个叫做UUCPmappingproject(UUCP图示方案)的措施。该方案定期出版数据“地图”,发送到许 多关键UUCP计算机,当UUCP邮件到达这些计算机时,计算机可以查看这个图,确定使用的最佳路径。实质上这样可使你使用的UUCP地址与 Internet地址相同,让该系统做这项工作。
因此,有时可能看见一种使用UUCP的最高级域的地址。例如,你可以用以下地址发送邮件:
albert@gendeau.uucp
当使用这样一个地址时,就等于向邮件路由软件发出了一个信号,让它找出UUCP图示数据中的名字和指出最佳使用路径。
[2]INTERNET邮件系统
(1)intrenet电子邮件系统基础
<1> 传送受理程序
邮件系统是可输送各类信息的综合服务系统:像文献、印刷品、计算机程序等。而唯一所需的是用ASCII字码(即可用键盘录入的数据)存贮数据。 在有些情况下,也可传送非文本资料,如图像或录音。
SMTP,表示简易邮件传送协议(SimpleMailTransferProtocol),它是TCP/IP系列协议的一部分。它解释邮件的格式和说明 怎样处理投递的邮件。每一台Internet计算机在运行邮件程序时,可自动地确保邮件以标准格式选址和传送。这个程序称为传送受理程序 (transport agent),它按照SMTP协议工作并将你的邮件联系向外界发送。
在大多数系统中,传送受理程序在“后台”中运行,随时对可能收到的任何要求作出反应。在Unix系统术语中,这个程序称之为“守护神”,即智能程序(daemon)(是的,完全可以这样称呼)。
每一个Unix系统都有各种隐放在“后台”的智能程序无声地为你服务。从理论上讲,不论你的系统使用的是什么传送受理程序,只要它能用SMTP收发邮件文件就行。大多数Unix系统使用一种叫“传送邮件(sendmail)”的智能程序。
<2>电子邮件系统接口(Interface)
a. 用户邮件程序: 做为一个用户,你不会直接与你系统中的传送受理程序发生联系;只是在机器内部通过SMTP运行收发邮件,你使用的这种邮件程序叫作用户邮件程序. 最广泛使用的用户邮件程序是Unix邮件程序。BSD用户邮件程序称为mailx,SystemV用户邮件程序称为Mail。
b.Unix基础邮件程序
通用的有ELM(全屏) 、PINE(菜单驱动)、MH(文件操作者)、MUSH (Zmail)、RMAIL(Emacs是一个建立在功能强大的文本编辑程序上的完整工作环境。在Emacs环境中,你不仅能编辑文本,还能编制扩展程 序,阅读Usenet(用户网)文章,操作Rmail收发邮件)
C.邮件信头编写
标准格式的邮件是由两部分组成:“信头”和“主体”。信头包括在文件开始处的信息行。主体实际上是你所表达的信件内容。
下面是一个样本文件。信头格式在操作系统中也许有变动,但主要内容不变。
Fromrick@tsi.com WedMar3114:47:021993(From+地址+时间)
Received:fromhub.ucsb.edu by engineering.ucsb.edu
id AA15594toharley: Wed, 31Mar9313:19: 25PST
Received:from fuzzball(fuzzball.ucsb.edu)byhub.ucsb.edu;
id AA11868
Sendmail4.1/UCSB2.0sun
Wed.3lNar9313:23:58SPST for harley@cs.ucsb.edu
Received:by FUZZBALL(5.57/UCSB-V2)
id AA07200:Wed,31Mar9313:17:40PST
Received:fromtsi.combyucsd.edu;id AA03169
Send mail 5.67/UCSD-2.2 sunvia SMTP
Wed.31 Mar 9313:23:520800 for harley@fuzzball.ucsb.edu
Received:bysdcc12.UCSD.EDU(4.l/UCSDGENERIC.3)
id AA25582 to harley@fuzzball.ucsb.edu
Wed.31 Mar 9313:23:51PST
Date:Wed.31 Mar 9313:23:51PST
From:rick@tsi.com(RickStout)
MessageId:9303311840.AA067ll@tsi
X.Mailer:MailUser's Shell(7.1.27/11/90)
To:harley@fuzball.ucsb.edu
Subject:this is the subject
Cc:ad die@nipper.com kim@nipper.com
Status:Ro
Harley:I have setup an appoint ment for next Thursday afternoon.
PIease let me know if you can attend.
...Rick
来源: rick@tsi.com1993年3月31日星期三14点47分2秒
接收: from hub.ucsb.edu by engineering.ucsb.edu
id AA15594 to harley:93年3月31日星期三13:19:25PST
接收: from fuzzball(fuzzball.ucsb.edu)by hub.ucsb.edu
id AA11868
传送邮件4.1/UCSB-2.Osun
93年3月31日早期三13:23:58PST到harley@cs.ucsb.edu
接收: 由fuzzball(5.57/UCSB-v2)
id AA07200; 93年3月31日星期三,时间13:17:40PST
接收:来自tsi.com by ucsd.edu;idAA03169
传送邮件通过SMTP5.67/UCSD-2.2sun
93年3月31日星期三时间13:25:520800到harley@fuzzball.ucsb.edu
接收:由sdcc12.UCSD.EDU(4.1/UCSDGENERIC.3)
发送id AA25582至harley@fuzzball.ucsb.edu;
93年3月31日星期三;13:23:51PST
日期:93年3月31日星湖三13:23:51PST
来源: rick@tsi.com(Rick Stout)
文件标识符:93O3311840.AA06711@tsi
X-邮件者: Mail User's Shell(7.1.27/11/90)
至: harley@fuzzball.ucsb.edu
标题:具体题目
副本(Cc): addie@nipper.com kim@nipper.com
状态:RO
Harley:在下星期四下午,我安排了一次会见,请告知我你是否参加。
Rick
以上例子说明,在信头中的第一行总是单词“ From”,该行表明发信人的地址。在我们这个例子中,文件是从rick@tsi.com发来的。其它行即不必以同样的顺序显示。这取决于收发邮件系统是 怎样构成的,也取决于在你特别的邮件程序设置的是什么选择。在最初的“From”行后有十四行包括五条Received说明的技术信息。这些字行表明该文 件所取的路径、时间、日期和操作过程中每一步应使用什么程序。邮件程序常显示一个“状态”行。可是,几乎没有人知道不同的设计表示什么,这一般查不到。
d.用MIME传送二进制数据(多功能Internet邮件扩展程序)
为了收发二进制数据,你必须具有用来支持MIME的一个用户邮件程序(邮件程序);MIME标准现已成为Internet电子邮件的主流,我们现在最常使 用的电子邮件软件Eudora、Netscap e Mail、Internet Mail就是采用MIME方式。MIME定义两种编码万式:Base64与QP(Quote-Printable)。QP的规则是对于资料中的7位无须重 复编码,仅将8位的数据转成7位。QP编码适用于ASCII码的及字内容,例如我们的中文文件。而Base64 的编码规则是将整个文件重新编码成7位,通常用于传送二进制文件。编码的方式不同会影响编码之后的文件大小。而具有MIME功能的E-mail软件大都能 自动判别你的邮件是采用何种编码,然后自动选择用QP或Base64来解码。
[3]基本的网络协议
(1)SMTP
下图显示了SMTP的基本模型。发送方建立起与接收方SMTP的通信。在传输邮件之前,两个SMTP实体可以交换口令或其他鉴别信号,然后发送方发出一个 特殊命令,称为MAIL,该命令给出了发送方的标识及一些有关邮件交换的其他信息。接收方必须返回一个对MAIL命令的确认。在SMTP中,该确认可写为 250,在另一些文档中,该确认为250 OK。不管是哪一种格式,确认表示所要求的邮件操作完成了。
图一、 SMTP模型
邮件传输过程的下一步是传输RCPT命令以标识报文的目的端,接收方仍必须给出对该命令的一个确认。
第三步是发送DATA命令。发送方SMTP发出该命令提醒接收方一个报文就要到达了。在发送了该命分之后,发送方SMTP便一行接一行地发送数据,直到发送方发出了一个特殊的控制字符序列,表示报文结束了。这时,服务器使用QUIT命令终止该过程。
(1.1)地址段格式
发送方SMTP使用了一个标准的送地址和接收地址格式,它们的形式如下:
local-part@domain-name
因此SMTP名字遵从了域名系统(DNS)的概念,一些系统使用一个服务器,将该名字映射成IP地址。实际应用中,这种格式可能出现为:
Jones@beta.aus.edu
其中本地用户名为Jones,beta.aus.edu是Jones的域标识符。Iocal-part@domain-name还可能采取其他形式以表示如下含义:
² 一个直接的连接(use@host)
² 邮件接收方位于一台非SMTP主机,通过一个邮件网关接收邮件(user%remote-host@gateway-host)
² 多台主机间的应答(@host-b@host-c@hostd)
(2)POP3
首先,P O P 3服务器启动P O P 3服务,并监听110端口。当客户机要仅用P O P 3服务时,它先与 POP3服务器建立一条TCP连接。若连接成功建立,POP3服务器向客户端发送一条欢迎消息,然后客户机与POP3服务器之间就可以进入命令交互和响应 状态,直到连接关闭或异常中断。
每个POP3会话总是处于一系列的状态变化中。一旦客户机与POP3服务器之间的TCP连接建立起来并且POP3服务器的欢迎言息传到客户端。POP3会 话过程就进入认证状态。在该状态下,客户机必须进行身份验证。一旦验证通过,并且POP3服务器获得足够的资源打开用户的邮箱。这时POP3会话过程进入 “命令交互状态”。在“命令交互状态”下,客户端可以向POP3服务器提出各科服务请求,由POP3服务器完成该服务并返回成功或失败的响应信息。当客户 端发出“QUIT’命令后,POP3会话过程进入“更新状态”。在“更新状态”下,POP3服务器释放在“命令交互状态”下获得的资源,更新用户邮箱,然 后关闭TCP连接。
(2.1)POP3的基本命令
² USER
这个命令以用户的帐号名称作为参数。
² PASS
这个命令以用户的口令作为参数,缺省情况下用户的口令将以明文在网络上传输。
² STAT
该命令无参数,仅用于“命令交互状态”。
获取当前用户邮件总数和邮件总大小。POP3服务器返回一个成功的响应,以“+OK”开头,后跟一个空格字符,然后是当前用户邮箱内邮件的总数,之后又是一个空格字符,最后是用户邮件的总大小(BYTES)。
C: STAT
S: +OK 2320
² LIST
该命令可以没有参数也可以有一个参数,该参数代表邮件的序
号,但该序号不能是已删除邮件。
该命令仅用于“命令交互状态”。
C: LIST
S: +OK 2 messages( 320 octets)
S: 1 120
S: 2 200
S: .
......
C: LIST 2
S: +OK 2 200
......
C: LIST 3
S: -ERR no such mesage, only 2 message in maildrop.
² RETR
该命令必须带有一个邮件序号,该邮件序号不能是已删除邮件。
该命令仅用于“命令交互状态”。
若POP3服务器返回一个成功响应,则随后的响应属于多行响应。在首行“+OK”响应之后,POP3服务器把对应于该邮件序号的邮件发送到客户端。
C: RETR 1
S: +OK 120 octets
S: <>
C: RETR 5
S: -ERR no such message.
² DELE
该命令必须带一个邮件序号参数。仅用于“命令交互状态”
POP3服务器把该邮件标志为“已删除”,之后,任何对该邮件的操作都将返回错误。POP3服务器并不实际删除该邮件,除非POP3会话进“更新状态”。
C: DELE 1
S: +OK message 1 deleted
......
C: DELE 1
S: -ERR message 2 already deleted
² NOOP
该命令不待参数,实际上也不做任何事情。仅用于“命令交互状态”
C: NOOP
S: +OK
² RSET
该命今不带参数。仅用于“命令交互状态”。
POP3服务器将所有已被标志为删除的邮件的删除标志取消,并返回成功响应。
C: RSET
S: +OK maildrop has 2 messages ( 320 octets)
² QUIT
该命令无参数,仅用于“命令交互状态”。
POP3服务器把所有已标志为删除的邮件删除,并释放在“命令交互状态”中获得的资源,然后关闭TCP连接,POP3会话结束。
2.SMTP
1、概述
SMTP被用来在因特网上传递电子邮件。文件RFC821规定了该协议的所有细节。
协议的原理很简单。无非是一个客户端计算机向服务器发送命令,然后服务器向客户端计算机返回一些信息。客户端发送的命令以及服务器的回应都是字符串。
首先要与邮件服务器连接,服务器将返回文本。该文本包含一个三位数的代码及描述,例如:
220-ns.cinfo.ru Sendmail 8.6.12/8.6.9 ready at Wed, 22 Apr 1998 22:54:41 +0300
220 ESMTP spoken here
这些描述可能会因服务器而异。只须要知道代码所代表的意思就行了。代码220表示成功建立连接,服务器等待你的第一个命令。
向服务器传递的第一个命令是HELO. 该命令包含一个参数,即你的邮箱名。
HELO oleg
注意: 在RFC821中,HELO是一个可选择性命令,如果服务器不要求该命令的话,你可以把它忽略掉。
如果命令成功,服务器会返回一个代码为250的回应。
下一步用MAIL FROM命令告诉服务器你想发一封邮件。该命令以发信人的邮件地址为参数。
MAIL FROM: oleg@vbip.com
发完命令后,如果服务器返回一个代码为250回应,你就可以向服务器发送RCPT TO命令了。
RCPT TO命令以收信人地址为参数,是告诉服务器你想将邮件发到收信人地址处。
RCPT TO: somebody@domain.com
如果你想将邮件发给多个收件人的话。你需要多次使用RCPT TO命令,对每个命令,服务器都会返回代码为250的回应。
现在可以向服务器发送邮件正文了。
用DATA命令告诉服务器以下的内容为邮件正文。在你从服务器收到代码为354的回应后,你就可以发送邮件正文了。邮件按行发送,每行邮件以一个无回车的换行符结束,只须按回车键就行了。下面是一个例子:
Subject: My first e-mail message.
First line of a message.
Second line.
注意上面最后一行的最后一个字符是一个小数点。这是正文结束的标志。 服务器收到这个标志后,就会立即返回一个代码为250的回应以及该邮件的唯一ID号。
250 WAA10568 Message accepted for delivery
任务完成了,可以继续发送下封邮件,也可以断开同服务器的连接。如果要断开同服务器的连接就用QUIT命令。在这种情况下,服务器会返回一个代码为221的回应并断开连接。
QUIT
221 ns.cinfo.ru closing connection
2、工作机制
SMTP设计基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。
  一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命 令确认邮件是否能接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。 当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答
SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务 下时,通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。
  MAIL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径 (它用于发生错误时返回邮件)。
3、基本命令(所有的命令都是四个字母组成)
发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。回复路径就是MAIL命令的参数,而转发路径则是RCPT命令的参数,邮件日期是DATA 命令的参数。这些参数或者数据对象必须跟在命令后。这种模式也就要求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一个转发路径缓冲 区,一个邮件内容缓冲区。特定的命令产生自己的缓冲区,或使一个或多个缓冲的内容被清除
(0)HELO(HELLO)
HELO〈SP〉〈domain〉〈CRLF>
通知服务器客户的身份。 
  此命令用于向接收SMTP确认发送SMTP。参数域包括发送SMTP的主机名。接收SMTP通过连接确认命令来向发送SMTP确认接收SMTP。引命令和OK响应确认发送和接收SMTP进入了初始状态,也就是说,没有操作正在执行,所有状态表和缓冲区已经被子清除。
(1)MAIL
MAIL FROM:
此命令用于开始将邮件发送到一个多个邮箱中。参数域包括回复路径。返回路径中包括了可选的主机和发送者邮箱列表。当有主机列表时,它是一个回复路径源,它 说明此邮箱是由在表中的主机一一传递发送(第一个主机是最后一个接收到此邮件的主机)过来的。此表也有作向发送者返回非传递信号的源路径。因为每个传递主 机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可能就是空 的。
  此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
(2)RCPT(recipient)
RCPT TO:
  此命令用于确定邮件内容的唯一接收者;多个接收者将由多个此命令指定。转发路径中包括一个可选的主机和一个必须的目的邮箱。
此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个250 OK应答,并存储向前路径。如果接收者未知,接收方会返回一个550 Failure应答。此过程可能会重复若干次。
  不仅包括邮件,它是主机和目的邮箱的路由表,在其中的第一个主机就是接收命令的主机。
(3)DATA
DATA
  如果命令被接收,接收方返回一个354 Intermediate应答,并认定以下的各行都是信件内容。当信件结尾收到并存储后,接收者发送一个250 OK应答。因为邮件是在传送通道上发送,因此必须指明邮件内容结尾,以便应答对话可以重新开始。SMTP通过在最后一行仅发送一个句号来表示邮件内容的结 束,在接收方,一个对用户透明的过程将此符号过滤掉,以不影响正常的数据。
  注意:邮件内容包括如下提示:Date, Subject, To, Cc, From。
  邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。如果此命令被接收,接收方返回一个250 OK应答。DATA命令仅在邮件操作未完成或源无效的情况下失败。
(4)RSET
RSET
  此命令指示当送邮件操作将被放弃。任何保存的发送者,接收者和邮件内容应该被抛弃,所有缓冲区和状态表应该被清除,接收方必须返回OK应答。
(5)SEND
SENDFROM:〈reverse-path>
  此命令用于开始一个发送命令,将邮件发送到一个或多个终端上。参数域包括了一个回复路径,此命令如果成功就将邮件发送到终端上了。
  回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一 个主机是最后经手的主机)。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收IPCE(如 果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可能就是空的。
  此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
(6)SOML(send or mail)
SOMLFROM:〈reverse-path>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,或者传送到邮箱中。对于每个接收者,如果接收者终端打开,邮件内容将被传送到接收者的终端上,否则就送到接收者的邮箱中。参数域包括回复路径,如果成功地将信息送到终端或邮箱中此命令成功。
  回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。
  此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
(7)SAML(send and mail)
SAMLFROM:〈reverse-path>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,并传送到邮箱中。如果接收者终端打开,邮件内容将被传送到接收者的终端上和接收者的邮箱中。参数域包括回复路径,如果成功地将信息送到邮箱中此命令成功。
  回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。
  此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
(8)VRFY(verify vt.证实,查证;证明)
VRFY〈string〉
此命令要求接收者确认参数是一个用户。如果这是(已经知道的)用户名,返回用户的全名和指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区没有影响。
(9)EXPN(expand vt.扩大;使膨胀)
EXPN〈string〉
此命令要求接收者确认参数指定了一个邮件发送列表,如果是一个邮件发送列表,就返回表中的成员。如果这是(已经知道的)用户名,返回用户的全名和指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区没有影响。
(10)NOOP
NOOP
  此命令不影响任何参数和已经发出的命令。它只是说明没有任何操作而不是说明接收者发送了一个OK应答。此命令对回复路径缓冲区,转发路径缓冲区和邮件 内容缓冲区没有影响。
(11)QUIT
QUIT
  此命令指示接收方必须发送OK应答然后关闭传送信道。接收方在接到QUIT命令并做出响应之前不应该关闭通信信道。发送方在发送QUIT命令和接收到 响应之前也不应该关闭信道。即使出错,也不应该关闭信道。如果连接被提前关闭,接收方应该象接收到RSET命令一样,取消所有等待的操作,但不恢复原先已 经做过的操作。而发送方应该象接收到暂时错误(4XX)一样假定命令和操作仍在支持之中。
4、 SMTP响应
  对SMTP命令的响应是多样的,它确定了在邮件传输过程中请求和处理的同步,也保证了发送SMTP知道接收SMTP的状态。每个命令必须有且只有一个响应。
  SMTP响应由三位数字组成,其后跟一些文本。数字帮助决定下一个应该进入的状态,而文本对人是有意义的。三位的响应已经包括了足够的信息,不用再阅 读文本,文本可以直接抛弃或者传递给用户。特别的是,文本是与接收和环境相关的,所以每次接收到的文本可能不同。在附录E中可以看到全部的响应码。正规的 情况下,响应由下面序列构成:三位的数字,,一行文本和一个,或者也可以是一个多行响应。只有EXPN和HELP命令可以导致多行应答,然而,对所有命令,多行响应都是允许的。
三位的应答码每一位都有特定的意义。每一位应答表示是否是成功的,失败的或未完成的。通过这一位,不复杂的SMTP发送就可以决定下一步的操作,如果发送 方希望大概了解究竟出了什么问题,它可以检测第二位,而第三位则保存了最后更完整的信息。也就是说,从第一位到第三位,接收方可以一步比一步精确地确定接 收方的状态。
(1)对于第一位有五种可能的表示代表不同的意义:
  1yz 部分完成应答
  命令被接受,但是要求的操作被中止,原因在应答码中。发送方应该再次发送另一命令指明是否继续操作,或者放弃操作。
  2yz 全部完成应答
  要求的操作已经完成,可以开始另一个新的请求。
  3yz 需要近一步信息的部分完成应答
  命令被接受,但是要求的操作被中止,需要接收进一步的信息。发送方应该发送另一条命令指明进一步的信息。
  4yz 暂时未完成应答
  命令未被接受,要求的操作也未执行,但是发生错误的状态是暂时的,可以再一次请求操作。发送者应该返回命令序列的开始命令(如果有的话)。很难解释这 个暂时的意义,特别对于两个不同的站点来说。区别应答是属于些类还是下一类的方法是:如果能够不加任何改变地重复的再一次发送命令,就是本类的,如果不 是,就是下一类(5yz)的。
  5yz 永久未完成应答
  命令未被接受,要求的操作未完成。发送对命令的重复不起作用。即使一些出错条件已经改变,但是用户已经不希望重试,而希望在未来的某个时间再进行操作
(2)应答的第二位的意义有以下几类:
x0z 语法:此类型的应答是针对以下情况的:语法错误;符合语法但命令不存在功能;未完成或冗余的命令。
x1z 信息:此类型的应答是用于请求信息的,如状态或帮助信息。
x2z 连接:此类型的应答是关于传输信道的。
x3z 未使用。
x4z 未使用。
x5z 邮件系统:此类型的应答指明接收方邮件系统关于请求传送或其它操作的状态的
(3)第三位给出了更详细的说明。
3.POP3
POP的全称是 Post Office Protocol ,即邮局协议,用于电子邮件的接收,现在常用的是第三版 ,简称为 POP3。通过POP协议,客户机登录到服务器上后,可以对自己的邮件进行删除,或是下载到本地,下载后,电子邮件客户软件就可以在本地对邮件进行修改、 删除等。
  POP服务器一般使用的是TCP的110号端口,
  以下对几个常用的POP3命令作一个简单的介绍 :
  命令    参数    状态    描述
  ------------------------------------------
  USER    username  认可    此命令与下面的pass命令若成功,将导致状态转换
  PASS    password  认可
  APOP    Name,Digest 认可    Digest是MD5消息摘要
  ------------------------------------------
  STAT    None    处理    请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
  UIDL    [Msg#]   处理    返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的
  LIST    [Msg#]   处理    返回邮件数量和每个邮件的大小
  RETR    [Msg#]   处理    返回由参数标识的邮件的全部文本
  DELE    [Msg#]   处理    服务器将由参数标识的邮件标记为删除,由quit命令执行
  RSET    None    处理    服务器将重置所有标记为删除的邮件,用于撤消DELE命令
  TOP    [Msg#]    处理    服务器将返回由参数标识的邮件前n行内容,n必须是正整数
  NOOP    None    处理    服务器返回一个肯定的响应,不做任何操作。
  ------------------------------------------
QUIT    None    更新 退出
POP3协议的基本操作:
1. 服务器通过侦听tcp端口110开始POP3服务。
2. 当客户需要服务时,它与服务器建立连接,连接建立后,POP3服务器发送确认消息
3. 客户与服务器相互交互命令和响应,持续到连接终止。
POP3命令由一个命令和一些参数组成
POP3响应由一个状态码和一个可能跟有附加信息的命令组成。
两种状态码:确定(+OK)和错误(-ERR)
POP3在生命周期中经历的状态:“确认”―“操作”―“更新”
基础的POP3命令有:USER name 在确认状态下有效 可选的命令:APOP name digest
PASS string
QUIT
STAT 在操作状态下有效 TOP msg n
LIST [msg] UIDL [msg]
RETR msg
DELE msg
NOOP
REST
QUIT 在更新状态下有效
POP3响应有:+OK -ERR
注意:除了STAT,LIST,UIDLD的响应外,其他命令的响应都为+OK和-ERR。响应后的所有文件将被客户略去。

Tuesday, May 19, 2009

org.w3c.dom.Document

更多精彩请到 http://www.139ya.com

From : http://kickjava.com/2515.htm



import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;


File f; // The file to parse. Assume this is initialized elsewhere


// Create a factory object for creating DOM parsers
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance ( ) ;
// Now use the factory to create a DOM parser ( a.k.a. a DocumentBuilder )
DocumentBuilder parser = factory.newDocumentBuilder ( ) ;
// Parse the file and build a Document tree to represent its content
Document document = parser.parse ( f ) ;
// Ask the document for a list of all < sect1 > tags it contains
NodeList sections = document.getElementsByTagName ( "sect1" ) ;
// Loop through those < sect1 > elements one at a time, and extract the
// content of their < h3 > tags.
int numSections = sections.getLength ( ) ;
for ( int i = 0; i < numSections; i++ ) {
Element section = ( Element ) sections.item ( i ) ; // A < sect1 >
// Find the first element child of this section ( a < h3 > element )
// and print the text it contains.
Node title = section.getFirstChild ( ) ;
while ( title != null && title.getNodeType ( ) != Node.ELEMENT_NODE )
title = title.getNextSibling ( ) ;
// Print the text contained in the Text node child of this element
if ( title!=null ) System.out.println ( title.getFirstChild ( ) .getNodeValue ( ) ) ;
}


Creating XML Document using DOM

更多精彩请到 http://www.139ya.com

From : http://www.javareference.com/jrexamples/viewexample.jsp?id=63

Creating XML Document using DOM
[ contributed by Darshan Singh ]
bookmark this on del.icio.us Discuss this Example with Darshan Singh
Print E-Mail
Description:
This example reads a CSV file and creates an XML document from it. The first line in the CSV file is assumed to be the field/column names, and these names are used as element names in the XML document. Like in previous example, DocumentBuilderFactory is used to create an instance of DocumentBuilder class. This time we call newDocument method on DocumentBuilder. This method returns an instance of org.w3c.dom.Document class that is then used to create XML document by calling methods such as createElement and appendChild.


Example Code:
The main function creates an instance of CSV2XML class and calls convertFile method. This method starts reading the CSV file. It uses stringTokenizer to first get the column names (from the first row) and then the actual data items (for each row starting second row in the file) and creates XML elements.
The below code uses JAXP classes TransformerFactory and Transformer to save the document. The alternative approach would be to use org.apache.crimson.tree.XmlDocument class as below:

BufferedWriter bufferWriter = new BufferedWriter(new FileWriter(xmlFileName));

XmlDocument xDoc = (XmlDocument)newDoc;
xDoc.write(bufferWriter);

bufferWriter.close();"



/**
* DOM Example: Creating XML document by converting CSV file to XML
* First line in CSV file is field/column names -
* which is also used as element names while creating XML document
*/
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

public class CSV2XML {

// Protected Properties
protected DocumentBuilderFactory domFactory = null;
protected DocumentBuilder domBuilder = null;

// CTOR
public CSV2XML()
{
try
{
domFactory = DocumentBuilderFactory.newInstance();
domBuilder = domFactory.newDocumentBuilder();
}
catch(FactoryConfigurationError exp)
{
System.err.println(exp.toString());
}
catch(ParserConfigurationException exp)
{
System.err.println(exp.toString());
}
catch(Exception exp)
{
System.err.println(exp.toString());
}
}

public int convertFile(String csvFileName, String xmlFileName)
{
int rowsCount = -1;
try
{
Document newDoc = domBuilder.newDocument();

// Root element
Element rootElement = newDoc.createElement("CSV2XML");
newDoc.appendChild(rootElement);

// Read comma seperated file
BufferedReader csvReader;
csvReader = new BufferedReader(new FileReader(csvFileName));
int fieldCount = 0;
String[] csvFields = null;
StringTokenizer stringTokenizer = null;

// Assumption: first line in CSV file is column/field names
// As the column names are used to name the elements in the XML file,
// avoid using spaces/any other characters not suitable for XML element naming
String curLine = csvReader.readLine();
if(curLine != null)
{
stringTokenizer = new StringTokenizer(curLine, ",");
fieldCount = stringTokenizer.countTokens();
if(fieldCount > 0)
{
csvFields = new String[fieldCount];
int i=0;
while(stringTokenizer.hasMoreElements())
csvFields[i++] = String.valueOf(stringTokenizer.nextElement());
}
}

// Now we know the columns, now read data row lines
while((curLine = csvReader.readLine()) != null)
{
stringTokenizer = new StringTokenizer(curLine, ",");
fieldCount = stringTokenizer.countTokens();

if(fieldCount > 0)
{
Element rowElement = newDoc.createElement("row");

int i=0;
while(stringTokenizer.hasMoreElements())
{
try
{
String curValue = String.valueOf(stringTokenizer.nextElement());
Element curElement = newDoc.createElement(csvFields[i++]);
curElement.appendChild(newDoc.createTextNode(curValue));
rowElement.appendChild(curElement);
}
catch(Exception exp)
{
}
}

rootElement.appendChild(rowElement);
rowsCount++;
}

}

csvReader.close();

// Save the document to the disk file
TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer aTransformer = tranFactory.newTransformer();

Source src = new DOMSource(newDoc);
Result dest = new StreamResult(new File(xmlFileName));
aTransformer.transform(src, dest);

rowsCount++;
}
catch(IOException exp)
{
System.err.println(exp.toString());
}
catch(Exception exp)
{
System.err.println(exp.toString());
}

return rowsCount;
}

public static void main(String[] args)
{
try
{
if(args.length != 2)
{
System.out.println("Usage: java CSV2XML ");
return;
}
}
catch(Exception exp)
{
System.err.println(exp.toString());
}

try
{
CSV2XML csvConverter = new CSV2XML();
int rowsCount = csvConverter.convertFile(args[0], args[1]);

if(rowsCount >= 0)
{
System.out.println("CSV File " + args[0] +
"' successfully converted to XML File "+ args[1] + "\n" +
"(" + String.valueOf(rowsCount) + " rows)");
}
else
{
System.out.println("Error while converting input CSV File " + args[0] +
" to output XML File "+ args[1] + " ");
}
}
catch(Exception exp)
{
System.err.println(exp.toString());
}
}
}

Friday, May 15, 2009

Eclipse 快捷键

更多精彩请到 http://www.139ya.com


编辑相关快捷键
1、〔Alt+/〕
为用户提供内容的辅助。
2、〔Ctrl+O〕
显示类中方法和属性的大纲,快速定位。
3、〔Ctrl+/〕
为光标所在行或选定行快速添加注释或取消注释。
4、〔Ctrl+M〕
窗口的最大化和还原。
5、〔Ctrl+1〕
快速修正。

查看和定位快捷键
1、〔Ctrl+K〕、〔Ctrl+Shift+K〕
快速向下和向上查找。
2、〔Ctrl+Shift+T〕
查找构建路径中的可找到类。
3、〔Ctrl+Shift+R〕
查找构建路径重点的所有文件。
4、〔Ctrl+Shift+G〕
查找类、方法和属性的引用。
5、〔Ctrl+Shift+O〕
快速生成import。
6、〔Ctrl+Shift+F〕
格式化代码。
7、〔Alt+Shift+W〕
查找当前文件所在项目中的路径。
8、〔Ctrl+L〕
定位到当前编辑器的某一行。
9、〔Alt+<-〕、〔Alt+->〕
后退历史记录和前进历史记录。
10、〔F3〕
快速定位光标位置的某个类、方法和属性。
11、〔F4〕
显示类的继承关系。

调试快捷键
1、〔Ctrl+Shift+B〕在当前行设置断点或取消断点。
2、〔F8〕继续执行,到下一个断点或程序结束。
3、〔F11〕调试最后一次执行的程序。
4、〔Ctrl+F11〕运行最后一次执行的程序。

其他
1、〔Ctrl+F6〕、〔Ctrl+Shift+F6〕:切换到下一个编辑器或上一个编辑器。
2、〔Ctrl+F7〕、〔Ctrl+Shift+F7〕:切换到下一个视图或上一个视图。
3、〔Ctrl+F8〕、〔Ctrl+Shift+F8〕:切换到下一个视角或上一个视角
ctrl + D:删除行
ctrl + M:当前窗口的最大化或最小化
ctrl + L:跳到指定的行
ctrl + 1:代码纠错提示
alt + /:代码辅助提示
F11:运行上次运行的程序
技巧:
1、如果写的代码需要抛出或者捕捉异常,在JBuilder中,你需要首先引入这个异常类,然后再在写好的代码前后加try,catch或者在方法后面加throws,在eclipse里完全不必要这样,只需要写好代码,然后按ctrl + 1,这时会出来提示,提示你是throw还是catch这个异常,选择你需要的,按下enter就可以了。
2、在写循环或者选择条件的语句时,先写出关键字如if、while,然后按alt + /自己去看有什么好处吧。接下来会出来提示代码,按下tab可以在框框中跳,按下确定跳出代码提示。

Ctrl + Shift + T: 打开类型:显示"打开类型"对话框来在编辑器中打开类型。"打开类型"选择对话框显示工作空间中存在的所有类型如类、接口等。
Ctrl + Shift + R: 打开资源:打开"打开资源"对话框以打开工作空间中的任何资源。在Package Explorer中不必浏览文件便可快速打开任意一个文件。使用这个快捷键可以打开一个对话框,在里面输入你想查找的文件或者通配符既可。
Ctrl + O: 快速大纲:打开当前所选类型的轻量级大纲图。在一个文件中直接打开一个成员变量(如字段、方法),尤其是有许多类似的方法名的时候这个快捷键将变得非常有用。
Ctrl + L: 输入行数: 转至行:打开一个对话框,允许您输入编辑器应该跳至的行号。仅适用于编辑器。输入行号,可以快速跳转到源文件中的第N行,
Ctrl + Q: 上一个编辑位置:显示上一个编辑操作的发生位置,返回到最近的修改位置。即使你查看不同的文件时,你也可以使用该快捷键来找到你最近对文件的修改位置。尤其是在文件比较大时,显得更为有用。
Ctrl + T: 快速类型层次结构:打开当前选择的类型的轻量级层次结构查看器,可以实现快速转到一个supertype或者subtype.
Ctrl + E: 快速跳转到另外一个编辑器。注意Ctrl + F6也可以实现这个功能,在使用的时候可以注意一下他们的异同。
Ctrl + ./Ctrl +,: 在一个文件中快速定位到一个问题(如错误、警告等)
Alt +← and Alt + →: 来回跳转至你所查阅的文件
F3: 快速转到一个类型声明。同时也可以按住ctrl健并点击该超链接变量或者类或者你想查看的任何声明都可以。

Tuesday, May 12, 2009

数据结构——栈的应用,中缀表达式转换为后缀表达式

更多精彩请到 http://www.139ya.com

转自: http://blog.chinaunix.net/u/16292/showart_490167.html

把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。

加减运算符的优先级设定为1,乘除运算符的优先级设定为2,在栈中保存的特殊运算符’@’和’(’的优先级设定为0

1. 若遇到的是空格则认为是分隔符,不需要进行处理;
2. 若遇到的是数字或小数点,则直接写入到s2中,并在每个数值的最后写入一个空格;
3. 若遇到的是左括号,则应把它压入到运算符栈中,待以它开始的括号内的表达式转换完毕后再出栈;
4. 若遇到的是右括号,则表明括号内的中缀表达式已经扫描完毕,把从栈顶直到保存着的对应左括号之间的运算符依次退栈并写入s2串中;
5. 若遇到的是运算符,
5.1 当该运算符的优先级大于栈顶运算符的优先级时,表明该运算符的后一个运算对象还没有被扫描也没有被放入到s2串中,应把它暂存于运算符栈中,待它的后一个运算对象从s1串中读出并写入到s2串中后,再令其出栈并写入s2串中;
5.2 若遇到的运算符的优先级小于或等于栈顶运算符的优先级,这表明栈顶运算符的两个运算对象已经被保存到s2串中,应将栈顶运算符退栈并写入到s2串中,对于新的栈顶运算符仍继续进行比较和处理,直到被处理的运算符的优先级大于栈顶运算符的优先级为止,然后让该运算符进栈即可。
按照以上过程扫描到中缀表达式结束符’@’时,把栈中剩余的运算符依次退栈并写入到后缀表达式中,再向s2写入表达式结束符’@’和字符串结束符’{post.abstract}’,整个转换过程就处理完毕,在s2中就得到了转换成的后缀表达式。

下面是java源代码:

清单1:StackChar.java 栈


package zieckey.datastructure.study.stack;

public class StackChar
{
private int maxSize; // size of stack array

private char[] stackArray;
private int top; // top of stack


public StackChar( int maxSize )
{
this.maxSize = maxSize;// 设置数组大小

stackArray = new char[maxSize];// 创建数组

top = -1;// 还没有任何元素

}

public void push( char ch )
{// 入栈

if ( isFull() )
{
System.out.println( "Cannot insert item " + ch + "! The stack is full." );
} else
{
top++ ;
stackArray[top] = ch;
}
}

public char pop()
{// 出栈

if ( isEmpty() )
{
System.out.println( "The stack is empty." );
return 0;
} else
{
char ch = stackArray[top];
stackArray[top] = 0;
top-- ;
return ch;
}
}

public int size()
{
return top + 1;
}

public char peek()
{// 返回栈顶元素

return stackArray[top];
}

public char peekN( int n )
{// 返回index为n的元素

return stackArray[n];
}

public boolean isEmpty()
{
return ( -1 == top );
}

public boolean isFull()
{
return ( maxSize - 1 == top );
}

public void displayStack()
{
System.out.print( " Stack: " );
for ( int i = 0; i < precedencestack =" precedence(" precedencein =" precedence("> precedenceStack )
{
return 1;
} else if ( precedenceIn == precedenceStack )
{
return 0;
} else
{
return -1;
}
}

/**
* 计算传入参数的优先级
*
* @param ch
* @return
*/
public static int precedence( char ch )
{
if ( '+' == ch || '-' == ch )
{
return PrecedenceAdd;
} else if ( '*' == ch || '/' == ch )
{
return PrecedenceMultiply;
} else if ( '(' == ch )
{
return PrecedenceOpenParentheses;
} else if ( ')' == ch )
{
return PrecedenceCloseParentheses;
} else
{
return PrecedenceOthers;
}
}

private static final int PrecedenceAdd = 1;
private static final int PrecedenceMultiply = 2;
private static final int PrecedenceOpenParentheses = 0;
private static final int PrecedenceCloseParentheses = 3;
private static final int PrecedenceOthers = -1;
}


清单2:Infix2Postfix.java 中缀表达式转换为后缀表达式


package zieckey.datastructure.study.stack;

public class Infix2Postfix
{
private StackChar theStack;
private String input;
private String output = "";

public Infix2Postfix( String in ) // constructor

{
input = in;
int stackSize = input.length( );
theStack = new StackChar( stackSize/2 );
}

/**
* A*(B+C)-D/(E+F) The opThis operator has just been read from the infix
* input, while the opTop operator has just been popped off the stack.
*
* 加减运算符的优先级设定为1,乘除运算符的优先级设定为2,在栈中保存的运算符’(’的优先级设定为0
*
* 把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。
*
* 处理方法步骤:
* 1. 若遇到的是操作数,则直接写入到s2中,并在每个数值的最后写入一个空格;
* 2. 若遇到的是左括号,则应把它压入到运算符栈中,待以它开始的括号内的表达式转换完毕后再出栈;
* 3. 若遇到的是右括号,则表明括号内的中缀表达式已经扫描完毕,把从栈顶直到保存着的对应左括号之间的运算符依次退栈并写入s2串中;
* 4. 若遇到的是运算符,
* 4.1 当该运算符的优先级大于栈顶运算符的优先级时,表明该运算符的后一个运算对象还没有被扫描也没有被放入到s2串中,
* 应把它暂存于运算符栈中,待它的后一个运算对象从s1串中读出并写入到s2串中后,再令其出栈并写入s2串中;
* 4.2 若遇到的运算符的优先级小于或等于栈顶运算符的优先级,这表明栈顶运算符的两个运算对象已经被保存到s2串中,
* 应将栈顶运算符退栈并写入到s2串中,对于新的栈顶运算符仍继续进行比较和处理,
* 直到被处理的运算符的优先级大于栈顶运算符的优先级或者栈为空时为止,然后让该运算符进栈即可。
*
*/
public String doTrans()
{
char ch;
int len = input.length( );
for ( int index = 0; index < ch =" input.charAt(" output =" output"> StackChar.precedence( theStack.peek( ) ) )
{
theStack.push( ch );
} else
{
/**
* 该运算符的优先级小于或等于栈顶运算符的优先级,应将栈顶运算符退栈并写入到输出字符串中,
* 对于新的栈顶运算符仍继续进行比较和处理,直到被处理的运算符的优先级大于栈顶运算符的优先级或者栈为空时为止,
* 然后让该运算符进栈即可。
*/
while ( !theStack.isEmpty( ) )
{
if ( StackChar.precedence( ch ) > StackChar.precedence( theStack.peek( ) ) )
{
break;
} else
{
output = output + theStack.pop( );
}
}
theStack.push( ch );
}
break;
case '(' :// 当其他运算符与之比较时优先级为0。当'('与其它运算符比较时优先级最高,直接入栈

theStack.push( ch );
break;
case ')' :// 优先级为3,为最高优先级,遇到后,对栈进行出栈操作

while ( !theStack.isEmpty( ) )
{
if ( '(' != theStack.peek( ))
{
output = output + theStack.pop( );
} else
{
theStack.pop( );
break;
}
}
break;
case ' ':
break;
default : // not an operator, must be an operand

output = output + ch;// write it into output

break;
}// end switch

}
}



清单3:Postfix.java 计算后缀表示式的值


package zieckey.datastructure.study.stack;

public class Postfix
{
private String inPostfix;
private StackX theStack;
private int size;

public Postfix( String a )
{
inPostfix = a;
size = inPostfix.length( );
theStack = new StackX(size);
}

/**
* 计算数据成员 inPostfix(为后缀表达式) 的值,
*
* 方法:
* 从左至右扫描后缀表达式,遇到运算数就将其压入栈内;
* 遇到运算符就做2次出栈操作,将操作数用这个运算符进行运算,将结果压入栈中。
* 知道扫描完,最后出栈操作就是表达式的最终计算结果。
*
* @return
*/
public double calculatePostfix()
{
char chRead;
for ( int i = 0; i < chread =" inPostfix.charAt(">='0'&&chRead<='9' ) { theStack.push( (int)(chRead-'0') ); } break; } } return theStack.pop( ); } private void disposeOperator( char chRead ) { double num1; double num2; double interAns = 0; num2 = theStack.pop( ); num1 = theStack.pop( ); switch ( chRead ) { case '+' : interAns = num1 + num2; break; case '-' : interAns = num1 - num2; break; case '*' : interAns = num1 * num2; break; case '/' : interAns = num1 / num2; break; default : break; } theStack.push( interAns ); } }


清单4:InfixCalcApp.java 测试程序main


package zieckey.datastructure.study.stack;

public class InfixCalcApp
{

/**
* @param args
*/
public static void main( String[] args )
{
// TODO Auto-generated method stub

String input = "5-(8+9-5*6)/3*(5+8-9)+6/(3+5-9-8+1)";
String output;
Infix2Postfix in2post = new Infix2Postfix( input );
Postfix postfix;
output = in2post.doTrans( );
postfix = new Postfix( output );
double ans = postfix.calculatePostfix( );
System.out.println( "Postfix is : " + output );
System.out.println( "The answer is : " + ans );

}

}



运行结果:

For 5 : Stack: 5
For - : Stack: 5
For ( : Stack: - 5
For 8 : Stack: -( 58
For + : Stack: -( 58
For 9 : Stack: -(+ 589
For - : Stack: -(+ 589+
For 5 : Stack: -(- 589+5
For * : Stack: -(- 589+5
For 6 : Stack: -(-* 589+56
For ) : Stack: -(-* 589+56*-
For / : Stack: - 589+56*-
For 3 : Stack: -/ 589+56*-3
For * : Stack: -/ 589+56*-3/
For ( : Stack: -* 589+56*-3/
For 5 : Stack: -*( 589+56*-3/5
For + : Stack: -*( 589+56*-3/5
For 8 : Stack: -*(+ 589+56*-3/58
For - : Stack: -*(+ 589+56*-3/58+
For 9 : Stack: -*(- 589+56*-3/58+9
For ) : Stack: -*(- 589+56*-3/58+9-
For + : Stack: -* 589+56*-3/58+9-*-
For 6 : Stack: + 589+56*-3/58+9-*-6
For / : Stack: + 589+56*-3/58+9-*-6
For ( : Stack: +/ 589+56*-3/58+9-*-6
For 3 : Stack: +/( 589+56*-3/58+9-*-63
For + : Stack: +/( 589+56*-3/58+9-*-63
For 5 : Stack: +/(+ 589+56*-3/58+9-*-635
For - : Stack: +/(+ 589+56*-3/58+9-*-635+
For 9 : Stack: +/(- 589+56*-3/58+9-*-635+9
For - : Stack: +/(- 589+56*-3/58+9-*-635+9-
For 8 : Stack: +/(- 589+56*-3/58+9-*-635+9-8
For + : Stack: +/(- 589+56*-3/58+9-*-635+9-8-
For 1 : Stack: +/(+ 589+56*-3/58+9-*-635+9-8-1
For ) : Stack: +/(+ 589+56*-3/58+9-*-635+9-8-1+
Postfix is : 589+56*-3/58+9-*-635+9-8-1+/+
The answer is : 21.583333333333332

LC

更多精彩请到 http://www.139ya.com

http://livedocs.adobe.com/livecycle/es/sdkHelp/programmer/sdkHelp/wwhelp/wwhimpl/common/html/wwhelp.htm?context=sdkHelp&file=convertPDFToImage.64.3.html

JMS

更多精彩请到 http://www.139ya.com

WebSphere Broker JMS Transport : http://publib.boulder.ibm.com/infocenter/wmbhelp/v6r0m0/index.jsp?topic=/com.ibm.etools.mft.doc/ac24869_.htm

深入掌握JMS : http://space.itpub.net/10742815/viewspace-590834

Monday, May 11, 2009

Perforce client command line usage start up

更多精彩请到 http://www.139ya.com

转自: http://tomboxfan.javaeye.com/blog/315066

Step 1) Find where perforce is installed on the unix box.

Say this folder: /home/pvprapp1/opt/perforce



Step 2) Export the environment variable.

Issue command: EXPORT PATH=$PATH:$HOME/opt/perforce/bin

Issue command: EXPORT P4PORT=...net:1999





Step 3) At this time, you can issue p4 command, and see a help menu.

Issue command: p4



Step 4) Config the client setup.

Issue command: p4 client



Step 5) The above command will bring you to a vi editor. There, you can edit all the configurations.

Client: --- This is the P4CLIENT value

Root:

View:



Issue command: EXPORT P4CLIENT=

In your later uage, you need to put your 3 EXPORT(PATH, P4PORT, P4CLIENT) into your .bashrc in your ~ folder.



Step 6) Synchronize with Perforce to get all the source code

Issue command: p4 sync

在blogspot中贴代码

更多精彩请到 http://www.139ya.com


http://joyhero.blog.hexun.com/208_d.html

http://oylb.blogspot.com/2009/04/blogger.html

Sunday, May 10, 2009

OpenLDAP 学习笔记

更多精彩请到 http://www.139ya.com

OpenLDAP 学习笔记 : http://www.ringkee.com/note/opensource/openldap.htm

BerkeleyDB(安装篇)

更多精彩请到 http://www.139ya.com

转自 : http://hi.baidu.com/xinzsky/blog/item/78162b161288de4f21a4e9fa.html

首先简单介绍一下这玩意儿:

由美国sleepycat软件公司开发的开源嵌入式数据库的程序库,这个"嵌入式"(Embedded)有两方面含义:其一,它可以直接链接到应用程序中,与应用程序运行于相同的地址空间,因此,无论是网络上通讯或本机通讯,对数据库的操作都不需要进程间通讯,这决定了其高效的特性;其二,它可以运用于嵌入式系统中,并针对于工业级设计,已经在各种操作系统中得到广泛使用.

特点: 极轻量级.BerkeleyDB本身并非传统的关系/对象数据库,它是基于C的系列函数库,大小约300K,但是可以管理达256TB的数据库,支持几十K用户同时对其进行操纵.

适用场合: 数据量大,但数据结构不是很复杂的数据库.

好,从这里打住,我们现在要做的是安装它,关于其内部架构的问题在以后的使用中再来研究.我们以redhat9为例开始介绍其安装过程:

从其sleepycat公司官网的下载页http://dev.sleepycat.com/downloads/releasehistorybdb.html获得其安装包,现在已经更新到4.4.20.
#tar zxfv db-4.x.tgz
#cd db-4.x/build_unix

1. 如果以gcc编译的话,进行以下操作:
#vi /dist/configure 在最前面添加:CC gcc
#../dist/configure
#make
#make install
默认状态,berkeleyDB的lib和include将被安装到/usr/local/BerkeleyDB/下,需要更改这个路径的话,可以将#../dist/configure一步加上选项--prefix,例如:#../dist/configure --prefix=/opt/BerkeleyDB.
#vi /etc/ld.so.conf 并将berkeleyDB的lib路径加到该文件的最后一行,这样才能找到并加载它的库文件.ld.so.conf是什么东西?它就是系统动态链接库的配置文件。此文件内,存放着可被LINUX共享的动态链接库所在目录的名字(系统目录/lib,/usr/lib除外),各个目录名间以空白字符(空格,换行等)或冒号或逗号分隔。
#ldconfig

2. 如果以armgcc编译的话,进行以下操作:
先安装armgcc,对我说就是在/mnt/setup/program/FFT/FFT-2410光盘-V3.0/linux开发/linux交叉编译器/tool或者在gmail中附件里armgcc目录下(除了cross-armv4l-qtE-custom-1.5-3mz.i386.rpm,其他都装)
#cp /mnt/setup/program/FFT/FFT-2410光盘-V3.0/linux开发/linux交叉编译器/tool /usr/tmp/
#cd /usr/tmp/tool
#rpm -ivh *
#ldconfig
这一系列的工具将默认被装到/opt/host/arm41下.

安装db-4.4.20.tgz,你甚至可以直接修改configure文件.而对于4.3.29,则不可直接修改configure文件.
#tar zxfv db-4.x.tgz
#cd db-4.x/build_unix

#vi /dist/configure
在最前面添加以下几行:
CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar
RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib
STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip

#../dist/configure --prefix=/opt/db --host=arm41-unknown-linux(这样的话,berkeleyDB的lib和include将被装到/opt/db下.)

或者:
#env CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc \
AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar \
RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib \
STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip \
../dist/configure --prefix=/opt/db --host=arm41-unknown-linux

#make
#make install
#vi /etc/ld.so.conf 并将berkeleyDB的lib路径加到该文件的最后一行,在这里就是/opt/db/lib
#ldconfig

好,安装完了,从网上抄一段完整代码来编译一下试试:

#include
#include
#include
#include

/* DB的函数执行完成后,返回0代表成功,否则失败 */
void print_error(int ret)
{
if(ret != 0)
printf("ERROR: %s\n",db_strerror(ret));
}

/* 数据结构DBT在使用前,应首先初始化,否则编译可通过但运行时报参数错误 */
void init_DBT(DBT * key, DBT * data)
{
memset(key, 0, sizeof(DBT));
memset(data, 0, sizeof(DBT));
}

void main(void)
{
DB *dbp;
DBT key, data;
u_int32_t flags;
int ret;

char *fruit = "apple";
int number = 15;

typedef struct customer
{
int c_id;
char name[10];
char address[20];
int age;
} CUSTOMER;
CUSTOMER cust;
int key_cust_c_id = 1;

cust.c_id = 1;
strncpy(cust.name, "javer", 9);
strncpy(cust.address, "chengdu", 19);
cust.age = 32;

/* 首先创建数据库句柄 */
ret = db_create(&dbp, NULL, 0);
print_error(ret);

/* 创建数据库标志 */
flags = DB_CREATE;

/* 创建一个名为single.db的数据库,使用B+树访问算法,本段代码演示对简单数据类型的处理 */
ret = dbp->open(dbp, NULL, "single.db", NULL, DB_BTREE, flags, 0);
print_error(ret);

init_DBT(&key, &data);

/* 分别对关键字和数据赋值和规定长度 */
key.data = fruit;
key.size = strlen(fruit) + 1;
data.data = &number;
data.size = sizeof(int);

/* 把记录写入数据库中,不允许覆盖关键字相同的记录 */
ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE);
print_error(ret);

/* 手动把缓存中的数据刷新到硬盘文件中,实际上在关闭数据库时,数据会被自动刷新 */
dbp->sync();

init_DBT(&key, &data);

key.data = fruit;
key.size = strlen(fruit) + 1;

/* 从数据库中查询关键字为apple的记录 */
ret = dbp->get(dbp, NULL, &key, &data, 0);
print_error(ret);

/* 特别要注意数据结构DBT的字段data为void *型,所以在对data赋值和取值时,要做必要的类型转换。 */
printf("The number = %d\n", *(int*)(data.data));

if(dbp != NULL)
dbp->close(dbp, 0);

ret = db_create(&dbp, NULL, 0);
print_error(ret);

flags = DB_CREATE;

/* 创建一个名为complex.db的数据库,使用HASH访问算法,本段代码演示对复杂数据结构的处理 */
ret = dbp->open(dbp, NULL, "complex.db", NULL, DB_HASH, flags, 0);
print_error(ret);

init_DBT(&key, &data);

key.size = sizeof(int);
key.data = &(cust.c_id);

data.size = sizeof(CUSTOMER);
data.data = &cust;

ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE);
print_error(ret);

memset(&cust, 0, sizeof(CUSTOMER));

key.size = sizeof(int);
key.data = &key_cust_c_id;

data.data = &cust;
data.ulen = sizeof(CUSTOMER);
data.flags = DB_DBT_USERMEM;

dbp->get(dbp, NULL, &key, &data, 0);
print_error(ret);

printf("c_id = %d name = %s address = %s age = %d\n",
cust.c_id, cust.name, cust.address, cust.age);

if(dbp != NULL)
dbp->close(dbp, 0);
}
我们以gcc编译为例:
gcc test.c -ggdb -I/usr/local/BerkeleyDB.4.3/include/ -L/usr/local/BerkeleyDB.4.3/lib/ -ldb -lpthread,如果你用的是eclipse之类的工具的话,记得加上-I,-L,-l的选项哦.
如果运行时报错:error while loading shared libraries:libdb-4.3.so: cannot open shared object file: No such file or directory的错误(小乌碰到过),请检查一下是否把berkeleyDB的lib路径加入到/etc/ld.so.conf中.
结果应该是可以跑的,因为小乌郁闷了一晚上就得到这点成果.
就这样拉.关于这玩意的使用,乌焦巴弓也是个菜鸟,大家一同学习进步落,以后乌焦巴弓在学习过程中有什么总结的话,会及时的发布上来的.
...吃饭去了.
哦,对了,有什么心得或问题,请留言,

带着希望前进(转自罗彩霞博客)

更多精彩请到 http://www.139ya.com

转自: http://blog.sina.com.cn/s/blog_6003a12a0100dg30.html?tj=1


带着希望前进

1. 昨天晚上李老师说,国家教育部将出台一个新的有关高考录取的文书,具体是什么我也不知道。。,同时帮助我的朋友们也带给我很多好消息,那个时候已快凌晨了,再次感慨记者的辛苦与执着!谢谢,有你们的帮助才有今天的进展。。





2.最近压力很大,也很累,是非很多,有点力不从心。。其实,当时只是在维权无门,无路,无助的时候才走上网络,随后才有媒体的介入。。





3. 幸好,有很多善心人士的鼓励,关心与无偿帮助。让再次鼓起了勇气。。

古时候便有能百家争鸣,更何况现在是个网络发达,言论自由的新世纪呢。。





4. 先澄清一个事实吧,我不是网络上评价的那么好,也不是那么的勇敢,只是有些事可为,有些事不可为。。我相信任何一个人若与我有相同的遭遇,都会同我一样的选择,而且会做的比我更好。更改身份证号码就是同流合污,就是纵容别人二次犯罪。。





5. 可能跟我个人的世界观有关系,我相信“It is written”,所以既然是命运的安排,我就相信,命运关上一扇门的时候,一定会再开扇窗。。





6.很多时候,你可以妥协,可以和蔼,可以平易近人,但基本原则,基本立场是不能改变的。。我的立场就是不能更改我的身份证号码,身份证号码是神圣的,不容践踏的,就如人的尊严一样。他就是国家赋予你与别人不同的唯一实质性标识。。从另一个角度来说,它也是一种缘分。。





7. 总有记者问我,在此时你怎么看待与你同龄的王佳俊,或者问“你恨她么?”



我总会沉默,会叹气。。因为怎么她都比我承担着更大的压力。不过,希望此事完结后,她能做回真正的王佳俊,随父姓。中国的传统观念,姓氏是很重要的。。我一直相信她叫“罗彩霞”的时候,她肯定也是很别扭,很不情愿的。。以后她就只是王佳俊,她可以坦然的,问心无愧的生活在这个世界上。那个时候她会发现天很蓝,云很白,世界更美丽的。。我相信公众都是宽容的,人非圣贤,孰能无过,过而改之,善莫大焉。。





我从来没有恨过她,但我恨过这个社会,在我那么努力证明我就是我的时候,别人在我的陈述与证据中,相信我就是真的罗彩霞的时候,还是没有人愿意给我实质性的帮助,都互相推诿。大家可以给与同情,但都怕担责任,怕第一个伸出援助的手,自己就万劫不复。。我害怕这种人性。。

我也有万念俱灰,想放弃的时候。。但是身边有朋友,远方有亲人。。有他们的支持,我怎么都能站起来!





8. 也有记者问“你就没有想过要更改身份证号码?”



这个我立场很坚定,一、即便你以个合法的途径再给我一个合法的身份,我也不能没有过去,我要一个完整的人生;我也不希望我的未来因身份的问题受到再次影响,我没有能力,没有精力,也没有勇气去承担这个风险。。





9. 有想过么?万一你失败了怎么办?

一,我有一个信念,也就是这个信念支撑着我走下来,我一定会拿回我应得的一切,我不相信,在这个社会,还真能黑白颠倒。。只是时间长短问题,我都准备给自己一年时间。。当然我也很害怕,也很懊恼,因为此事,这一年就被耽搁了,但比起更改身份证来说,我宁愿承担这个“一年半载”。。

其次,我选择,我承担,退一万步,我这么努力,最后我还是失败,我会选择放弃一切,我不会要我的身份,也不会关心什么学历证书,学位证书,教师资格证书的。。 如果社会最终放弃了我,我也放弃这个社会!!!!



10. 幸运的是,在我发帖后,一切都有了好转,让我看到了希望,让我看到了明天,让我看到了坚持的意义。。

是这件事情教会了我,人是社会的人;是这件事情,让我看到了很多的善心;也是这件事,让我相信了中国会越来越透明,因为网络,因为媒体,因为人之初,性本善,因为被磨圆了的石头里面都隐藏了一颗方正的心。。

Jardin d'Hiver

更多精彩请到 http://www.139ya.com

Jardin d'Hiver

Keren Ann

Je voudrais du soleil vert
Des dentelles et des théières
Des photos de bord de mer
Dans mon jardin d'hiver
Je voudrais de la lumière
Comme au Nouvelle Angleterre
Je veux changer d'atmosphère
Dans mon jardin d'hiver
Ma robe à fleurs sous la pluie de novembre
Tes mains qui courent, je n'en peux plus de t'attendre
Les années passent, qu'il est loin l'âge tendre
Nul ne peut nous entendre
Je voudrais du Fred Astère
Revoir un Latécoère
Je voudrais toujours te plaire
Dans mon jardin d'hiver
Je veux déjeuner par terre
Comme au long des golfes clairs
T'embrasser les yeux ouverts
Dans mon jardin d'hiver
Ma robe à fleurs sous la pluie de novembre
Tes mains qui courent, je n'en peux plus de t'attendre
Les années passent, qu'il est loin l'âge tendre
Nul ne peut nous entendre


冬日暖房

我想要几缕清新的阳光
一些蕾丝花边和茶壶
还有海边的照片
在我的冬日暖房里

我想要一些日光
就如在新英格兰一样
我希望改变气氛
在我的冬日暖房里

你的花裙子
在十一月的雨中
我手忙脚乱
我无法再等待
岁月流逝
年少时代已远
没有人能了解我们


我想要来点Fred Astaire 的 jazz
重新看一次Latécoère
我想要永远使你喜爱
在我的冬日暖房里

我想在草地上午餐
像沿著明净的海湾
张着双眼拥吻你
在我的冬日暖房里

软件测试术语

更多精彩请到 http://www.139ya.com


GA
GA就是generally available 的缩写。字面意思是普偏可用,可以理解成是稳定版本,一般情况下基本上没有BUG了,非常稳定的版本~~

RC
RC 版。是 Release Candidate 的缩写,意思是发布候选版,该版本已经完成全部功能并清除大部分的BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。

Saturday, May 9, 2009

back to you

更多精彩请到 http://www.139ya.com

bryan adams

i have been so tired-that i could not speak
i have been so lost thatt i could not see
i wanted things that were out of reach
then i found you and you helped me through
and ya showed me what to do
and that is why i am comin back to you...


like a star that guides a ship across the ocean


that is how your love will take me home back to you


and if i wish upon that star


someday i will be where you are


and i know that day is coming soon


ya, i am coming back to you.
have been alone,
but you did not show it
have been in pain,
but you did not know it
let me do what i needed to
you were there when i needed you

mighta let you down, mighta messed you round

but ya never changed your point of view

and that is why i am comin back to you...

i am coming back to you
i am coming back to you
i am coming back to you
that day is coming soon

Forever young

更多精彩请到 http://www.139ya.com

Bob Dylan

May God bless and keep you always,
May your wishes all come true,
May you always do for others
And let others do for you.
May you build a ladder to the stars
And climb on every rung,
May you stay forever young,
Forever young, forever young,
May you stay forever young.

May you grow up to be righteous,
May you grow up to be true,
May you always know the truth
And see the lights surrounding you.
May you always be courageous,
Stand upright and be strong,
May you stay forever young,
Forever young, forever young,
May you stay forever young.

May your hands always be busy,
May your feet always be swift,
May you have a strong foundation
When the winds of changes shift.
May your heart always be joyful,
May your song always be sung,
May you stay forever young,
Forever young, forever young,
May you stay forever young.

相思鹦鹉戏耍酣睡小猫

更多精彩请到 http://www.139ya.com














Linux 操作系统集锦

更多精彩请到 http://www.139ya.com


CentOS

CentOS pub : http://www.centospub.com/

Friday, May 8, 2009

vim+ctags+gdb+cgdb+putty+cygwin+winscp

更多精彩请到 http://www.139ya.com


http://blog.chinaunix.net/u/11786/showart_1887454.html

http://easwy.com/blog/archives/vim-cscope-ctags/

有图: http://rickey-nctu.blogspot.com/2009/02/vim-taglist.html


首先说说编辑器,以前一直都是用UE写程序,UE确实很强大,可惜要money,当然你可以用什么破解版或者绿色版,不过一般外企都不允许的,所以还是老实点,学学免费而且强大的vim和emacs(这个还不是很熟)吧。

vim是vi的扩展,在windows叫gvim,linux、cygwin都有,unix有些可能还是老的vi。

vim的cool功能:多屏显示(这个时候有人刚好路过看到你的界面,会问:这是啥工具,cool)
Ctrl+w, n 新建一个窗口,在原窗口下面
Ctrl+w, o 关闭其他窗口
Ctrl+w, v 分为左右两屏,打开的是同一个文件,其中一个改动,另外一个也跟着改动,cool
Ctrl+w, h/j/k/l 在上下左右的窗口移动

ctags:在linux/cygwin环境下使用vim+ctags是不错的选择
在.vimrc中加入:
set tags=tags;
set autochdir
在最外层目录执行"ctags -R *", 可以实现ctags在不同目录的跳转了。
在vim中打开源代码,使用Ctrl+] Ctrl+t就可以自由自在的在代码中跳转,爽吧。


再说说调试器:
gdb分屏指令:(win)height, 输入之后可以看到源代码在上半屏,gdb命令在下半屏,而且上半屏可以用上下键和PageUP,PageDown操作;

cgdb: gdb的加强版,默认就有上下分屏
在代码窗口: i:焦点切换到gdb窗口 o:打开文件选择框 空格:设置或取消断点
在gdb窗口: 按ESC焦点切换到代码窗口

抛弃SecureCRT,投入putty的怀抱,原因很简单一个收费,一个免费,并且putty的功能貌似更强大。

另外cygwin默认是使用windows的cmd窗口,非常恶心,可以用putty代替它,新建一个putty的快捷方式,把命令修改为putty.exe -cygterm - 就可以了。

cygwin上安装scp:这个问题搞了我半天,原来只要装了ssh就有了,怪不得找不到。
有个叫winscp的也不错,又多一个选择,类似于ftp工具,很方便,而且免费。

附:vimrc

Wednesday, May 6, 2009

百度面试题--linux

更多精彩请到 http://www.139ya.com

转自 : http://blog.chinaunix.net/u1/53217/showart.php?id=1162477

Windows 2000/XP/2003下通过命令行添加用户

更多精彩请到 http://www.139ya.com

在本地添加帐户
net user 帐户名 密码 /add

激活禁用的用户
net uesr 帐户名 /active:yes

加入管理员组
net localgroup administrators 帐户名 /add

Tuesday, May 5, 2009

Linux命令---添加删除用户

更多精彩请到 http://www.139ya.com

Linux useradd : http://doc.linuxpk.com/301.html

useradd username -d /home/username -m

-m : 自动在home 下生成用户目录

userdel -r username

Sunday, May 3, 2009

Alfresco Module Dev

更多精彩请到 http://www.139ya.com

1. create the folder structure as Alfresco recommended. Sample : ${Alfresco_Source}\modules\avm-compare

2. code the service code

3. build them by the ANT. Sample build.xml : ${Alfresco_Source}\projects\sdk\samples\BasicAmpSample\build.xml

4. DON't deploy the generated .amp file by alfresco-mmt-3Stable.jar directly! it will damage the war file!

5. unzip the generated .amp file into a clean folder, e.g. D:\temp\alfresco_module_test

5. copy the generated .jar file to alfresco web instance, e.g. From D:\temp\alfresco_module_test\lib\baconModuleTest.jar To D:\dev\a_lab3c\tomcat\webapps\alfresco\WEB-INF\lib\baconModuleTest.jar

6. copy the folder D:\temp\alfresco_module_test\config\alfresco\module\org.alfresco.module.bacon To D:\dev\a_lab3c\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\module\org.alfresco.module.bacon

7. copy the folder D:\temp\alfresco_module_test\config\alfresco\extension\templates\webscripts To D:\dev\a_lab3c\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\templates\webscripts


8. Done

Note: maybe the file "module.properties" should be put at "D:\dev\a_lab3c\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\module\org.alfresco.module.bacon", because it's packaged into the root folder inside the .amp package, but by now the deployed module works fine without the properties file, it's just a comments for future!