paulwong

#

javascript图片浏览器的核心——图片预加载

网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考虑流量的话,大可以像pconline一样每个页面只显示一张图片,让用户每看一张图片就需要重新下载一下整个页面。不过,在web2.0时代,更多人愿意用javascript来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图片。

知道了一张图片的地址,需要把它在一个固定大小的html容器(可以是div等)里边显示出来,最重要的当然是需要知道这张即将显示的图片的宽和高,然后再结合容器的宽和高,按照一定的缩放比例使图片显示出来。因此,实现图片预加载就成为图片浏览器的核心功能了。

做过图片翻转效果的朋友其实都知道,要让图片轮换的时候不出现等待,最好是先让图片下载到本地,让浏览器缓存起来。这时,一般都会用到js里边的Image对象。一般的手段无非这样:

function preLoadImg(url) {
var img = new Image();
img.src 
= url;
}


通过调用preLoadImg函数,传入图片的url,就能使图片预先下载下来了。实际上,这里用到的预下载功能也和这基本一致。图片预下载下来后,通过 img的width和height属性,就能知道图片的宽和高了。但是需要考虑到,在做图片浏览器功能时,图片都是实时显示的。比如你点了显示的按钮,这个时候才会调用上边类似的代码来加载图片。因此,如果你直接用img.width的时候,图片还没有完全下载下来。因此,需要用一些异步的方法,等到图片下载完毕的时候才会再对img的width和height进行调用。 实现这样的异步方法实际上不难,图片的下载完毕事件也很简单,就是简单的onload事件。因此,我们可以写出下面的代码:


function loadImage(url, callback) {
var img = new Image();
img.src 
= url;

img.onload 
= function()//图片下载完毕时异步调用callback函数。
callback.call(img); // 将callback函数this指针切换为img。
}
;
}


好了,再来写一个测试用例。


function imgLoaded(){
alert(
this.width);
}


<input type="button" value="loadImage" onclick="loadImage('aaa.jpg',imgLoaded)"/>

在firefox中测试一下,发现不错,果然和预想的效果一样,在图片下载后,就会弹出图片的宽度来。无论点击多少次或者刷新结果都一样。

不过,做到这一步,先别高兴太早——还需要考虑一下浏览器的兼容性,于是,赶紧到ie里边测试一下。没错,同样弹出了图片的宽度。但是,再点击load的时候,情况就不一样了,什么反应都没有了。刷新一下,也同样如此。

经过对多个浏览器版本的测试,发现ie6、opera都会这样,而firefox和safari则表现正常。其实,原因也挺简单的,就是因为浏览器的缓存了。当图片加载过一次以后,如果再有对该图片的请求时,由于浏览器已经缓存住这张图片了,不会再发起一次新的请求,而是直接从缓存中加载过来。对于 firefox和safari,它们视图使这两种加载方式对用户透明,同样会引起图片的onload事件,而ie和opera则忽略了这种同一性,不会引起图片的onload事件,因此上边的代码在它们里边不能得以实现效果。

怎么办呢?最好的情况是Image可以有一个状态值表明它是否已经载入成功了。从缓存加载的时候,因为不需要等待,这个状态值就直接是表明已经下载了,而从http请求加载时,因为需要等待下载,这个值显示为未完成。这样的话,就可以搞定了。

经过一些分析,终于发现一个为各个浏览器所兼容的Image的属性——complete。所以,在图片onload事件之前先对这个值做一下判断即可。最后,代码变成如下的样子:


function loadImage(url, callback) {
var img = new Image(); //创建一个Image对象,实现图片的预下载
img.src = url;

if (img.complete) // 如果图片已经存在于浏览器缓存,直接调用回调函数
callback.call(img);
return// 直接返回,不用再处理onload事件
}


img.onload 
= function () //图片下载完毕时异步调用callback函数。
callback.call(img);//将回调函数的this替换为Image对象
}
;
}
;

经过这么一番折腾,总算是让各个浏览器都能满足我们的目标了。虽然代码很简单,但是却把图片浏览器中最核心的问题解决掉了,接下来你所要做的,仅仅是图片如何呈现的问题了。

posted @ 2010-11-13 17:24 paulwong 阅读(313) | 评论 (0)编辑 收藏

JBPM 4入门介绍

JBPM 4入门介绍:

http://www.blogjava.net/sxyx2008/archive/2010/09/28/333256.html


跟我学JBPM4之State、Decision 、Task活动


http://www.blogjava.net/sxyx2008/archive/2010/09/29/333385.html

posted @ 2010-09-29 23:09 paulwong 阅读(233) | 评论 (0)编辑 收藏

oracle数据库换系统后恢复以前oracle数据操作方法(转)

  就在昨天,帮别人站长开发的搜商网http://www.28844.com/说系统出问题了,然后数据库我最近帮忙在调整,由于数据没有备份,好在oracle装在E盘
机房的人给他重新装了系统,只能恢复以前oracle数据
 下面是步骤
一.先备份以前oracle数据,比如是在E:\oracle 将修改成E:\oracle_bak
然后开始安装oeacle,装完毕后,点击--开始---程序---Oracle - OraDb10g_home1---应用程序开发---SQL Plus
输入用户名:system、密码:www28844com、orcl,进入后输入:Connect sys/www28844com as sysdba;回车,
然后输入:shutdown immediate;关闭数据库。
二.复制E:\oracle_bak\product\10.2.0下flash_recovery_area、oradata所有文件覆盖 E:\oracle\product\10.2.0里面的flash_recovery_area、oradata。把E:\oracle_bak \product\10.2.0\admin\ordb下面的bdump、cdump、pfile、udump四个文件夹覆盖到E:\oracle \product\10.2.0\admin\ordb下面,把E:\oracle_bak\product\10.2.0\db_1\database 下面的initordb.ora、PWDordb.ora两个文件覆盖到E:\oracle\product\10.2.0\db_1\database 里。在把E:\oracle_bak\product\10.2.0\db_1\NETWORK\ADMIN\SAMPLE下的 LISTENER.ORA、SQLNET.ORA、TNSNAMES.ORA覆盖到E:\oracle\product\10.2.0\db_1 \NETWORK\ADMIN\SAMPLE里面。
第二步操作完然后在SQL Plus里输入:startup;
三. 以下操作的时候可能有会有忘记密码的,或者某种原因密码不对的,你可以在SQL Plus里修改,命令如下:alter user sys identified by www28844com;这样sys密码就改成www28844com了。
先删除原来的配置------首先打开Oracle中的SQL Plus工具,输入用户名和密码登录后,执行以下命令:
drop user sysman cascade;(这一个执行比较慢)
drop role MGMT_USER;
drop user MGMT_VIEW cascade;
drop public synonym MGMT_TARGET_BLACKOUTS;
drop public synonym SETEMVIEWUSERCONTEXT;
创建新的配置----一定要注意,下面的步骤不是在Oracle中的SQL Plus下命令,而是在本机DOS下
点击开始菜单-运行-cmd 进入命令行进行操作

C:\Documents and Settings\www28844com>emca -repos recreate
EMCA 开始于 2010-9-13 17:13:46
EM Configuration Assistant 10.2.0.1.0 正式版
版权所有 (c) 2003, 2005, Oracle。保留所有权利。
输入以下信息:
数据库 SID: orcl
监听程序端口号: 1521
SYS 用户的口令:
SYSMAN 用户的口令:
是否继续? [yes(Y)/no(N)]: y
2010-9-13 17:14:26 oracle.sysman.emcp.EMConfig perform
信息: 正在将此操作记录到 E:\oracle\product\10.2.0\db_1\cfgtoollogs\emca\orcl\emc
a_2010-9-13_05-13-45-下午.log。
2010-9-13 17:14:27 oracle.sysman.emcp.EMReposConfig dropRepository
信息: 正在删除 EM 资料档案库 (此操作可能需要一段时间)...
2010-9-13 17:14:38 oracle.sysman.emcp.EMReposConfig invoke
信息: 已成功删除资料档案库
2010-9-13 17:14:38 oracle.sysman.emcp.EMReposConfig createRepository
信息: 正在创建 EM 资料档案库 (此操作可能需要一段时间)...
2010-9-13 17:18:34 oracle.sysman.emcp.EMReposConfig invoke
信息: 已成功创建资料档案库
已成功完成 Enterprise Manager 的配置
EMCA 结束于 2010-1-28 17:18:34
C:\Documents and Settings\www28844com>emca -config dbcontrol db
EMCA 开始于 2010-9-13 17:20:29
EM Configuration Assistant 10.2.0.1.0 正式版
版权所有 (c) 2003, 2005, Oracle。保留所有权利。
输入以下信息:
数据库 SID: orcl
已为数据库 orcl 配置了 Database Control
您已选择配置 Database Control, 以便管理数据库 orcl
此操作将移去现有配置和默认设置, 并重新执行配置
是否继续? [yes(Y)/no(N)]: y
监听程序端口号: 1521
SYS 用户的口令:
DBSNMP 用户的口令:
用户名/口令无效。
DBSNMP 用户的口令:
SYSMAN 用户的口令:
用户名/口令无效。
SYSMAN 用户的口令:
通知的电子邮件地址 (可选):
通知的发件 (SMTP) 服务器 (可选):
-----------------------------------------------------------------
已指定以下设置
数据库 ORACLE_HOME ................ E:\oracle\product\10.2.0\db_1
数据库主机名 ................ yhg
监听程序端口号 ................ 1521
数据库 SID ................ orcl
通知的电子邮件地址 ...............
通知的发件 (SMTP) 服务器 ...............
-----------------------------------------------------------------
是否继续? [yes(Y)/no(N)]: y
2010-9-13 17:22:49 oracle.sysman.emcp.EMConfig perform
信息: 正在将此操作记录到 E:\oracle\product\10.2.0\db_1\cfgtoollogs\emca\orcl\emc
a_2010-9-13_05-20-29-下午.log。
2010-9-13 17:22:54 oracle.sysman.emcp.util.DBControlUtil stopOMS
信息: 正在停止 Database Control (此操作可能需要一段时间)...
2010-9-13 17:23:52 oracle.sysman.emcp.util.DBControlUtil startOMS
信息: 正在启动 Database Control (此操作可能需要一段时间)...
2010-9-13 17:24:43 oracle.sysman.emcp.EMDBPostConfig performConfiguration
信息: 已成功启动 Database Control
2010-9-13 17:24:43 oracle.sysman.emcp.EMDBPostConfig performConfiguration
警告: 无法创建 Database Control 快捷方式
2010-9-13 17:24:43 oracle.sysman.emcp.EMDBPostConfig performConfiguration

已成功完成 Enterprise Manager 的配置
EMCA 结束于 2010-9-13 17:24:43
C:\Documents and Settings\www28844com>


https://127.0.0.1:1158/em打开地址,可连接数据库实例,正常!
    写完了,大家有兴趣可以看看http://www.28844.com/ 搜索是用的lucene,  目前数据是在网上人肉,然后用程序抓取,针对的增加库里,目前搜索已经支持运算例如(1+1),还有IP
搜索,目前开发也只有我一个,也没什么前段,都是我和站长2个搞定,我主要技术,然后他就是一些想法。是在工作之外帮这个站长开发的,大家有什么好的点子,可以告诉我。我们可以一起把这个站做好一点。。

posted @ 2010-09-15 00:04 paulwong 阅读(331) | 评论 (0)编辑 收藏

如何將舊機器的資料轉移到新機器上(转)

當你買了新的iPhone,或是因為某些原因,你擁有了新的iPhone,而想將舊有iPhone/iPod Touch中的所有資料轉移過來,該怎麼做呢?

吉米現在來教你,其實非常的簡單



首先,先將舊的iPhone插上iTunes,然後在左側有寫著你iPhone名字的地方,按下滑鼠右鍵,然後按下「備份」,千萬記住,這個備份比「同步」還重要

同步不等於備份,記得喔

而若你怕忘記,你還可以先把iPhone的名字改成你自己記得的名字,例如「iPhone2G」

等他備份好之後

喔這裡在提醒一下

有那些東西會被備份下來

會被備份下來的有:

通訊錄、來電記錄、簡訊記錄、行事曆資料、AppStore下載或是購買軟體所產生的資料、用iPhone拍的照片,系統設定,這些會被記錄下來


有那些東西不會被備份下來:
iPod裡面的音樂檔案、影片檔案、電腦同步回iPhone裡面的照片、cydia安裝的軟體、cydia安裝的軟體所產生的資料...等

簡單的說,透過iTunes、原廠軟體所「產生」資料,都會被備份

而原本本來就應該存放在你電腦裡面的如「音樂檔案」「照片檔案」「App應用程式」這些都是等你重刷好之後,他會在幫你同步回去的

還有就是透過破解之後的第三方軟體、以及其軟體所產生的所有資料,都需要自己備份,例如使用Chronus軟體,將資料備份後,在透過ssh的方式將資料搬回電腦,等新的iPhone弄好之後,在透過同樣方式反向將資料扳回iPhone,在透過Chronus軟體在寫回去,搞死人了吧?

所以吉米說,若你不具備這些本事,不要玩優化,不要玩JB,不要玩破解


---------------------------------------------------
好了,備份完了,接著要拿出新的iPhone了

當然你先確保他已經是最新的軔體了,不然就是接上iTunes,用「回復」的方式來刷到最新的軔體,然後插入SIM卡讓他開通



開通之後,就會出現這個畫面啦,然後用下啦選單選擇你剛備份的那個記錄,然後就等他回復啦

他會先將資料回復回去

接著才是漫長的音樂、影片、照片、App的同步

就這樣就搞定啦!

posted @ 2010-06-24 11:22 paulwong 阅读(597) | 评论 (0)编辑 收藏

想升iOS4.0?请备份SHSH!史上最简单教程,越狱相关shsh备份提醒,小白必进学习AutoSHSH备份。

在众疯友等待4.0的心情可以理解。但是你可以忘记早起后刷牙中午休息时吃饭下午打球后乘凉晚上睡觉前洗脚,就是别忘了备份SHSH文件! 

      按照惯例,以及个人猜测,苹果极有可能在未来几天内封锁3.1.3的SHSH文件,到时候你又觉得4.0不好或者不能越狱的时候,到哪里去大热天裸求或者冰天雪地裸求恢复3.1.3的方法呢? 

   也许你已经在Cydia备份,看到Cydia顶部有“This device has SHSHs file for iphone OS..... ”,但是,你不觉得多一个本地备份自己会睡得更加踏实吗?

      无须再说,此时此刻备份SHSH没有错!


 

--------------------------------我真的是分割线-------------------------------------


此贴参考借鉴大哥RealTomandJerry精华贴:传送门http://bbs.weiphone.com/read-htm-tid-755384-page-1.html大哥的许多贴都有很大帮助,建议大家多看看。
其次:关于SHSH文件大小不同的解答,请移步freeos的解释:http://bbs.weiphone.com/read-htm-tid-768883.html


--------------------------------我真的是分割线-------------------------------------


一.使用方法:
①下载此软件:  AutoSHSH-3.1.3+3.2--RC2.rar (1187 K) 下载次数:36368  
②给你的touch,或者3GS,或者iPad关机。注意,不是锁屏,是持续按住关机键,等提示关机滑块出现再移动滑块的关机!
③完全关闭以后按住home键,就是设备正面唯一的那颗圆圆的按键不放,插上USB,没过几秒便会出现USB连接光盘的图像。

④解压并打开附件中的AutoSHSH软件
 


 














 




二.注意事项:
①本工具需要JAVA组件支持,无论你是什么系统,都需要事先安装JAVA套件,下载地址在这里:
jre-6u17-windows-i586-s.rar (14061 K) 下载次数:21152  
谢谢第三位加分童鞋提醒:如你的系统是Windows xp,需要自己安装Net.Framework。win7已经自带Net.Framework3.5,无需安装。
Net.Framework下载地址:
http://www.microsoft.com/downloads/details.aspx?FamilyID=333325fd-ae52-4e35-b531-508d977d32a6&DisplayLang=zh-cn[/url]
祝你成功!
有分加分,没分捧个人场~


--------------------------------我真的是分割线-------------------------------------

回第一个加分的童鞋
此工具其实就是集成了Umbrella的更方便的提取shsh的软件。之前版本和Umbrella没区别,而这一次RC2区别在于可以向Cydia发送提取shsh文件的请求。
简而言之,就是让Cydia也存入你的shsh文件,以后可以方便的更改74.208.10.249 gs.apple.com来恢复。而一般来说,我们要实现用Cydia备份shsh,前提必须越狱后才能装Cydia,才能点红心备份。此工具可以不越狱便让Cydia保存你的shsh,自然很好,所以才介绍给你们。。。

回复11楼:自然有用。当然,你也可以等spirit破解出来后装Cydia点红心备份,只是我担心还等不到你用Cydia点红心备份,3.1.3的shsh就被apple封了。那时候就晚了,以后系统即使破解,如果崩溃,也只有干着急。当然,你们用Umbrella备份shsh到本地也是可以的,可以用其中的Tinytss工具加载欺骗apple固件验证,只是我在试验的时候发现,插上网线,修改hosts文件127.0.0.1 gs.apple.com可以回复,拔了网线就不行。总而言之,多一个途径备份shsh,多一个位置存,自然有好处。
应20 楼要求,添加java软件。。
回复第四位加分童鞋(545333):
相当于不需要,只要到了光盘加USB那个界面,此工具会自动给你提取出ECID,就出现保存shsh文件的框框,你在文件名处随便填一个名称,选个地址,保存,然后它自动给你发送请求到Cydia,然后等一会就到你选中的本地保存位置了。



声明此贴特点:
①.此备份工具适用于备份所有系列以及所有系统的ipod touch,iphone,ipad。
②.此方法无论是否越狱都可以进行备份shsh。
③.如果看到备份出来的shsh文件是一个大小约63K,以shsh为后缀名的文件,说明你成功了。
④.此贴第一步进入光盘+USB的恢复模式与其他帖子持续按住Home键+关机键不同,只需关机状态下,按住Home键不放并连接USB,可以很快进入恢复模式。如需退出,长按关机键关机后再开机。
⑤.现在只能备份3.1.3的shsh文件,无论你的设备是什么版本的系统,如3.0,3.1.2系统等,都只能备份3.1.3的shsh。

posted @ 2010-06-22 10:07 paulwong 阅读(2658) | 评论 (0)编辑 收藏

借助Spring Module项目,如何配置声明式缓存功能实现

     摘要:  前言: 本文档将讲解一下,如何借助Spring Module项目,实现配置声明性缓存功能。 说明: 本档的配置经过本人测试,都能正确运行。 运行环境: Jdk5.0, Spring-2.5, Spring-modules-0.9, ehcache-1.6.0-beta4.jar 首先创建一个StudentService服务类,本文将对其所有的以get* 方式命令的方法,进...  阅读全文

posted @ 2010-04-23 09:47 paulwong 阅读(742) | 评论 (0)编辑 收藏

jQuery 表格工具集

 

本文搜集了大量 jQuery 表格插件,帮助 Web 设计者更好地驾御 HTML 表格,你可以对表格进行横向和竖向排序,设置固定表头,对表格进行搜索,对大表格进行分页,对表格进行滚动,拖放操作等等。这些插件很多都包含详细的教程。

jQuery 表格插件

Flexigrid – Web 2.0 Javscript Grid for jQuery - 可变列宽,自动适应表头宽度,可通过 Ajax 连接 XML 数据源,类似 Ext Grid,但基于 jQuery 因此更轻量小巧。

Chromatable JQuery Plugin - 固定表头,可滚动内容区,内容区滚动的时候表头位置保持不变。

Ingrid, the jQuery Datagrid - 在 HTML 表格上加入列宽调整,分页,排序,行列式样等功能(演示)。

JQTreeTable - 在表格中加入树形结构

Scrollable HTML table - 将普通 HTML 表格变为可滚动状态。将表头部分放入 THEAD 区,内容部分放入 TBODY 区,脚注部分放入 TFOOT 区域,引用 webtoolkit.scrollabletable.js 文件,然后在每个表格后面创建 ScrollableTable() 对象即可(演示)。

KeyTable - 象 Excel 那样,在单元格之间巡游,可以现场编辑。

graphTable - 借助 flot 将 HTML 表格中的内容变成图形(演示)。

DataTables - 非常强大的 jQuery 表格插件,可变宽页码浏览,现场过滤。多列排序,自动探测数据类型,智能列宽,可从几乎任何数据源获取数据。

jqGrid Plugin - 基于 Ajax 的 jQuery 表格插件,可以 Ajax 方式从服务器端获取数据填充进来(演示)。

Visualize: Accessible Charts & Graphs from Table Elements - 从 HTML 表格收集数据,并借助 HTML5 Canvas 对象转换为图表。

Grider - 一个简单的 jQuery 插件,可以对 HTML 表格进行计算,平均,累加,最大值,最小值等。

表格功能增强

Table Drag and Drop - 通过拖放,对表格中的数据重新排列,可以设置禁止拖放的行。

Table Pagination - 在表格下方自动生成分页导航。

tableRowCheckboxToggle - 可根据 class name 对表格的行自动 check on/off

BS Table Crosshair Plugin - 鼠标在表格上移动时,所经过的单元格自动交叉加亮

jqtable2csv - 将 HTML 表格转换为 SVG 字符串。

Colorize - 自动对表格间隔行使用不同背景颜色

jExpand - 一个非常轻量的 jQuery 插件,可以展开/关闭表格单元格,使表格可以容纳更多内容。

columnHover - 鼠标经过时,可以整列加亮,甚至支持 colspans 和 rowspans

HeatColor - 根据规则,或自动对表格中的值进行分析,对不同范围的值按不同颜色区分。

Fixed Header Table - 固定表头可滚动表格

表格搜索,筛选

tableFilter - 给表格添加简单的筛选功能。

uiTableFilter - 根据条件筛选(隐藏)表格行

Tablesorter 2.0 - 将普通的,拥有 THEAD 和 TBODY 标签的表格转换为可排序表格,可以分析多种数据,支持多列排序。

PicNet Table Filter - 实时的,Google 式筛选功能

jQuery tinysort - 排序

LiveFilter 1.1 - 非常轻量的表格筛选插件,部署非常简单。

jQtablesearch - 快速搜索,非常快

Quicksearch - 简单的搜索功能

jQuery 现场编辑

TableEditor – Flexible in place editing of TableSorter - 现场编辑表格内容,用户可以插入 Ajax 机制回存数据

jGridEditor - 现场编辑,可配置 Ajax 回存数据

本材料原始来源:Nope jQuery HTML Table Toolbox (原文作者:Paul Andrew)

中文编译来源:锐商企业CMS 网站内容管理系统 官方网站

posted @ 2010-04-16 11:14 paulwong 阅读(298) | 评论 (0)编辑 收藏

RUP

一 前言
軟件過程是指實施於軟件開發和維護中的階段、方法、技術、實踐及相關產物(計劃、文檔、模型、代碼、測試用例和手冊等)的集合。行之有效的軟件過程可以提高開發軟件組織的生產效率、提高軟件質量、降低成本並減少風險。

RUP具有較高認知度的原因之一恐怕是因為其提出者Rational軟件公司聚集了物件導向領域三位傑出專家Booch、Rumbaugh和 Jacobson,同時它又是物件導向開發的行業標準語言——標準建模語言(UML)的創立者。RUP是由Objectory過程演化而來。本文主要討論 RUP的主要內容和特點。

二 RUP的二維開發模型

RUP可以用二維坐標來描述。橫軸通過時間組織,是過程展開的生命週期特徵,體現開發過程的動態結構,用來描述它的術語主要包括週期 (Cycle)、階段(Phase)、迭代(Iteration)和里程碑(Milestone);縱軸以內容來組織為自然的邏輯活動,體現開發過程的靜態結構,用來描述它的術語主要包括活動(Activity)、產物(Artifact)、工作者(Worker)和工作流(Workflow)。

三 開發過程中的各個階段和里程碑

RUP中的軟件生命週期在時間上被分解為四個順序的階段,分別是:初始階段(Inception)、細化階段(Elaboration)、構建階段(Construction)和交付階段(Transition)。每個階段結束於一個主要的里程碑(Major Milestones);每個階段本質上是兩個里程碑之間的時間跨度。在每個階段的結尾執行一次評估以確定這個階段的目標是否已經滿足。如果評估結果令人滿意的話,可以允許項目進入下一個階段。

初始階段(Inception Phase)

初始階段的目標是為系統建立商業案例並確定項目的邊界。為了達到該目的必須識別所有與系統交互的外部實體,在較高層次上定義交互的特性。本階段具有非常重要的意義,在這個階段中所關注的是整個項目進行中的業務和需求方面的主要風險。對於建立在原有系統基礎上的開發項目來講,初始階段可能很短。

初始階段結束時是第一個重要的里程碑:生命週期目標(Lifecycle Objective)里程碑。生命週期目標里程碑評價項目基本的生存能力。

細化階段(Elaboration Phase)

細化階段的目標是分析問題領域,建立健全的體系結構基礎,編製項目計劃,淘汰項目中最高風險的元素。為了達到該目的,必須在理解整個系統的基礎上,對體系結構作出決策,包括其範圍、主要功能和諸如性能等非功能需求。同時為項目建立支持環境,包括創建開發案例,創建模板、準則並準備工具。

細化階段結束時第二個重要的里程碑:生命週期結構(Lifecycle Architecture)里程碑。生命週期結構里程碑為系統的結構建立了管理基準並使項目小組能夠在構建階段中進行衡量。此刻,要檢驗詳細的系統目標和範圍、結構的選擇以及主要風險的解決方案。

構建階段(Construction Phase)

在構建階段,所有剩餘的構件和應用程序功能被開發並集成為產品,所有的功能被詳細測試。從某種意義上說,構建階段是一個製造過程,其重點放在管理資源及控制運作以優化成本、進度和質量。

構建階段結束時是第三個重要的里程碑:初始功能(Initial Operational)里程碑。初始功能里程碑決定了產品是否可以在測試環境中進行部署。此刻,要確定軟件、環境、用戶是否可以開始系統的運作。此時的產品版本也常被稱為「beta」版。

交付階段(Transition Phase)

交付階段的重點是確保軟件對最終用戶是可用的。交付階段可以跨越幾次迭代,包括為發佈做準備的產品測試,基於用戶反饋的少量的調整。在生命週期的這一點上,用戶反饋應主要集中在產品調整,設置、安裝和可用性問題,所有主要的結構問題應該已經在項目生命週期的早期階段解決了。

在交付階段的終點是第四個里程碑:產品發佈(Product Release)里程碑。此時,要確定目標是否實現,是否應該開始另一個開發週期。在一些情況下這個里程碑可能與下一個週期的初始階段的結束重合。

四 RUP的核心工作流(Core Workflows)

RUP中有9個核心工作流,分為6個核心過程工作流(Core Process Workflows)和3個核心支持工作流(Core Supporting Workflows)。儘管6個核心過程工作流可能使人想起傳統瀑布模型中的幾個階段,但應注意迭代過程中的階段是完全不同的,這些工作流在整個生命週期中一次又一次被訪問。9個核心工作流在項目中輪流被使用,在每一次迭代中以不同的重點和強度重複。

商業建模(Business Modeling)

商業建模工作流描述了如何為新的目標組織開發一個構想,並基於這個構想在商業用例模型和商業對像模型中定義組織的過程,角色和責任。

需求(Requirements)

需求工作流的目標是描述系統應該做什麼,並使開發人員和用戶就這一描述達成共識。為了達到該目標,要對需要的功能和約束進行提取、組織、文檔化;最重要的是理解系統所解決問題的定義和範圍。

分析和設計(Analysis & Design)

分析和設計工作流將需求轉化成未來系統的設計,為系統開發一個健壯的結構並調整設計使其與實現環境相匹配,優化其性能。分析設計的結果是一個設計模型和一個可選的分析模型。設計模型是源代碼的抽像,由設計類和一些描述組成。設計類被組織成具有良好接口的設計包(Package)和設計子系統 (Subsystem),而描述則體現了類的對象如何協同工作實現用例的功能。

設計活動以體系結構設計為中心,體系結構由若干結構視圖來表達,結構視圖是整個設計的抽像和簡化,該視圖中省略了一些細節,使重要的特點體現得更加清晰。體系結構不僅僅是良好設計模型的承載媒介,而且在系統的開發中能提高被創建模型的質量。

實現(Implementation)

實現工作流的目的包括以層次化的子系統形式定義代碼的組織結構;以組件的形式(源文件、二進制文件、可執行文件)實現類和對像;將開發出的組件作為單元進行測試以及集成由單個開發者(或小組)所產生的結果,使其成為可執行的系統。

測試(Test)

測試工作流要驗證對像間的交互作用,驗證軟件中所有組件的正確集成,檢驗所有的需求已被正確的實現, 識別並確認缺陷在軟件部署之前被提出並處理。RUP提出了迭代的方法,意味著在整個項目中進行測試,從而儘可能早地發現缺陷,從根本上降低了修改缺陷的成本。測試類似於三維模型,分別從可靠性、功能性和系統性能來進行。

部署(Deployment)

部署工作流的目的是成功的生成版本並將軟件分發給最終用戶。部署工作流描述了那些與確保軟件產品對最終用戶具有可用性相關的活動,包括:軟件打包、生成軟件本身以外的產品、安裝軟件、為用戶提供幫助。在有些情況下,還可能包括計劃和進行beta測試版、移植現有的軟件和數據以及正式驗收。

配置和變更管理(Configuration & Change Management)

配置和變更管理工作流描繪了如何在多個成員組成的項目中控制大量的產物。配置和變更管理工作流提供了準則來管理演化系統中的多個變體,跟蹤軟件創建過程中的版本。工作流描述了如何管理並行開發、分佈式開發、如何自動化創建工程。同時也闡述了對產品修改原因、時間、人員保持審計記錄。

項目管理(Project Management)

軟件項目管理平衡各種可能產生衝突的目標,管理風險,克服各種約束併成功交付使用戶滿意的產品。其目標包括:為項目的管理提供框架,為計劃、人員配備、執行和監控項目提供實用的準則,為管理風險提供框架等。

環境(Environment)

環境工作流的目的是向軟件開發組織提供軟件開發環境,包括過程和工具。環境工作流集中於配置項目過程中所需要的活動,同樣也支持開發項目規範的活動,提供了逐步的指導手冊並介紹了如何在組織中實現過程。

五 RUP的迭代開發模式

RUP中的每個階段可以進一步分解為迭代。一個迭代是一個完整的開發循環,產生一個可執行的產品版本,是最終產品的一個子集,它增量式地發展,從一個迭代過程到另一個迭代過程到成為最終的系統。

傳統上的項目組織是順序通過每個工作流,每個工作流只有一次,也就是我們熟悉的瀑布生命週期。這樣做的結果是到實現末期產品完成並開始測試,在分析、設計和實現階段所遺留的隱藏問題會大量出現,項目可能要停止並開始一個漫長的錯誤修正週期。

一種更靈活,風險更小的方法是多次通過不同的開發工作流,這樣可以更好的理解需求,構造一個健壯的體系結構,並最終交付一系列逐步完成的版本。這叫做一個迭代生命週期。在工作流中的每一次順序的通過稱為一次迭代。軟件生命週期是迭代的連續,通過它,軟件是增量的開發。一次迭代包括了生成一個可執行版本的開發活動,還有使用這個版本所必需的其他輔助成分,如版本描述、用戶文檔等。因此一個開發迭代在某種意義上是在所有工作流中的一次完整的經過,這些工作流至少包括:需求工作流、分析和設計工作流、實現工作流、測試工作流。其本身就像一個小型的瀑布項目。

與傳統的瀑布模型相比較,迭代過程具有以下優點:

降低了在一個增量上的開支風險。如果開發人員重複某個迭代,那麼損失只是這一個開發有誤的迭代的花費。

降低了產品無法按照既定進度進入市場的風險。通過在開發早期就確定風險,可以儘早來解決而不至於在開發後期匆匆忙忙。

加快了整個開發工作的進度。因為開發人員清楚問題的焦點所在,他們的工作會更有效率。

由於用戶的需求並不能在一開始就作出完全的界定,它們通常是在後續階段中不斷細化的。因此,迭代過程這種模式使適應需求的變化會更容易些。

六 總結

RUP具有很多長處:提高了團隊生產力,在迭代的開發過程、需求管理、基於組件的體系結構、可視化軟件建模、驗證軟件質量及控制軟件變更等方面,針對所有關鍵的開發活動為每個開發成員提供了必要的準則、模板和工具指導,並確保全體成員共享相同的知識基礎。它建立了簡潔和清晰的過程結構,為開發過程提供較大的通用性。但同時它也存在一些不足: RUP只是一個開發過程,並沒有涵蓋軟件過程的全部內容,例如它缺少關於軟件運行和支持等方面的內容;此外,它沒有支持多項目的開發結構,這在一定程度上降低了在開發組織內大範圍實現重用的可能性。可以說RUP是一個非常好的開端,但並不完美。

posted @ 2010-03-26 10:29 paulwong 阅读(226) | 评论 (0)编辑 收藏

RUP overview

作者:李訓軍博士

隨著現代信息產業的蓬勃發展,軟件開發已經成為一項浩大繁複的工程。 就像是建造一座宏偉的宮殿, 從計劃、設計到施工, 每一個環節都必須嚴格把關, 稍有不慎, 整個工程就會失敗。 據統計, 僅在美國, 每年就有180,000個信息技術項目, 耗資大約$2500億美元, 其中25-30%的項目會流產。 由此可見, 由於管理不善和設計上的失誤所造成的損失是巨大的。現代軟件開發的管理和方法論顯得比以往任何時候都更為重要。

軟件開發的過程由方法論和工具構成(process = methodology + tools)。正如裝配電子設備一樣,僅有工具就可以勝任裝配任務。但為了減少失誤和提高效率,人們往往採用流水線作業,流水線作業便是一種應用於電子設備裝配中的方法論。目前,信息技術市場流行的方法論有RUP(Rational Unified Process), The Zachman Framework, XP (Extreme Programming)等。在這些方法論中,最流行的要數RUP。RUP是由Rational Software公司首創的。因它與當前流行的JAVA, J2EE技術和麵向對象的設計思想(OOAD)緊密的結合在一起,所以在大型的信息技術項目中得到了廣泛的應用。在這篇文章中,我們試圖對RUP的特點作一個初步的探討,並且討論它是如何貫穿在整個軟件開發的生命週期之中的。

RUP最重要的它有三大特點:1)軟件開發是一個疊代過程,2)軟件開發是由Use Case驅動的,3)軟件開發是以構架設計(Architectural Design)為中心的。

按照傳統的瀑布(Waterfall)開發模式,軟件開發大致經歷如下幾個步驟:商務需求分析(Business Requirement Analysis),系統分析(System Analysis),系統設計(System Design),開發實現(Implementation),測試(Test),發佈(Deployment),系統支持(Supporting)和系統變更管理(Change Management)。傳統的瀑布開發模式假定在進行新的開發過程時,上一個過程已經完成,而且不會回到上一個過程。初看起來,這似乎是一個非常合理,高效率的解決方案,但20多年的實踐證明,這個開發模式存在著很大的弊病,原因是軟件開發是一個非常複雜的工程,有諸多的因素影響工程的效率和成敗。軟件開發需要許多不同背景的個人和團隊參與。由於這些複雜性,在軟件開發的整個生命週期中每一個階段都有可能留下隱患和錯誤。如果等到系統已經開發實現完畢,在測試階段發現了重大問題,這時的返工將會造成人力、物力、財力及時間上的巨大浪費。鑑於以上的考慮,RUP強調軟件開發是一個疊代模型(Iterative Model),RUP定義了四個階段(Phase):開端(Inception),闡述 (Elaboration),建造(Construction),過渡(Transition)。其中每個階段都有可能經歷以上所提到的從商務需求分析開始的各個步驟,只是每個步驟的高峰期會發生在相應的階段。例如開發實現的高峰期是發生在建造階段。實際上這樣的一個開發方法論是一個二維模型。這種疊代模型的實現在很大程度上提供了及早發現隱患和錯誤的機會,因此被現代大型信息技術項目所採用。

RUP 的另一大特徵是Use Case 驅動。Use Case 是RUP方法論中一個非常重要的概念。簡單地說,一個 Use Case就是系統的一個功能。例如在一個基於電子商務的醫療系統中,病人可以坐在家裡通過網上瀏覽器與醫生約定看病的時間 (Make appointment),這樣,「Make appointment」就是系統的一個Use Case。在系統分析和系統設計中, Use Case被用來將一個複雜的龐大系統分割、定義成一個個小的單元,這個小的單元就是Use Case,然後以每個小的單元為對象進行開發。按照 RUP, Use Case貫穿整個軟件開發的生命週期。在商務需求分析中,客戶或用戶對Use Case進行描述,在系統分佈和系統設計過程中,設計師對Use Case進行分析,在開發實現過程中,開發編程人員對Use Case進行實現,在測試過程中,測試人員對Use Case進行檢驗。

RUP的第三大特徵是它強調軟件開發是以構架為中心的。構架設計(Architectural Design)是系統設計的一個重要組成部分。在構架設計過程中,設計師(Architect)必須完成對技術和運行平台的選取,整個項目的基礎框架(Framework)的設計,完成對公共組件的設計,如審計(Auditing)系統,日誌(Log)系統,錯誤處理(Exception Handling)系統,安全 (Security)系統等。設計師必須對系統的可擴展性(Extensibility),安全性(Security),可維護性 (Maintainability),可延拓性(Scalability),可重用性(Reusability)和運行速度(Performance)提出可行的解決方案。

在RUP方法論中,不同的角色可以從不同的側面來認識同一個項目。RUP定義了「4+1」個場景(View): Use Case場景(Use Case View),邏輯場景(Logic View),進程場景(process View),實現場景 (Implementation View)和發佈場景(Deployment View)。在Use Case場景中,客戶和商務分析員對 Use Case進行描述,在邏輯場景中,設計師對系統進行分析和設計,在進程場景中,設計師對系統可能出現的併發性,運行速度和分佈特性進行描述。實現場景則反映了程序開發員開發實現的過程。發佈場景是描述系統管理員和組裝人員實施系統發佈和管理的過程。值得強調的是,系統構架的設計是在邏輯場景中描述的。

RUP還定義了4個模型,即Use Case模型(Use Case Model),分析模型 (Analysis Model),設計模型(Design Model)和實現模型(Implementation Model)。Use Case模型包含Use Case Diagram和Use Case文檔。Use Case模型是其他三個模型的基礎,分析模型即是概念模型 (Conceptual Model),是系統分析所得到的結果,分析模型包含了類圖(Class Diagram),次序圖 (Sequence Diagram)以及活動圖(Activity Diagram)。設計模型則是構架設計和系統設計的結果。當設計模型完成後,開發編程人員便可以進行編程了。設計模型主要包含了類圖,次序圖和狀態圖(State Chart Diagrams)。分析模型和設計模型看起來有許多相似之處,但兩者的含義有本質的區別。分析模型強調的是問題的範圍,但並不給出解決問題的方案,分析模型並不涉及具體的技術和平台。例如它並不關心是否應用 EJB或一般的JAVA BEANS,系統是安裝在WebSphere或是在WebLogic。但是與之相反,設計模型要考慮這些細節,而且要提供解決這些問題的全部方案。當然設計模型是建立在分析模型之上的,分析模型中的一個類可直接映射成為設計模型中的類,但這種映射關係一般並不是一一對應的,最後一個模型是實現模型。實現模型包含構件圖(Component Diagram),從這個模型出發,開發編程人員可以產生骨架源程序 (Skeleton Source Code),也可以從源程序出發更新設計模型。

目前應用於系統分析和設計的工具主要有Rational Rose和Together Software Center (TogetherJ)。JAVA和J2EE的開發工具有IBM Websphere Application Developer(WSAD), Borland Jbuilde和WebGain VisualCafe. WSAD和WebSphere Application Server應用在一起,使得服務器端的排錯和系統的發布變得非常的容易。Jbuilder和VisualCafe一般與WebLogic Server緊密結合在一起。目前WebSphere Server和WebLogic Server佔據了Application Server市場的66%,其中 WebSphere Server佔據了37%,成為同類產品的No.1。在單位測試和集成測試中,廣泛應用的工具和框架有Junit, JunitPerf和Cactus.。

綜上所述,軟件開發的方法論已經成為現代軟件工程過程中不可缺少的一個重要部分。是目前在Java/J2EE和麵向對象的大型項目中廣泛被採用的一種方法論。他對整個軟件開發的生命週期提供了基礎框架和指導。RUP, UML/Rational Rose, Java/J2EE, WSAD, Websphere Application Server和Oracle這樣的技術、工具和平台的組合是目前許多公司、政府信息技術項目中採用的方案。因此,RUP的知識和經驗也是現在求職市場所需求的熱門技能。

posted @ 2010-03-25 18:17 paulwong 阅读(197) | 评论 (0)编辑 收藏

Javascript 篇 之 扩展String 函数

/**
 * @brief  扩展原生字符串 
 
*/


var StringEx = 

    
/**
     * @brief 去除字符串前后空格
     
*/

    trim : 
function()
    
{
        
return this.replace(/(^\s*)|(\s*$)/g, "");
    }
,
    
    
/**
     * @brief 去除左边空格
     
*/

    ltrim : 
function()
    

        
return this.replace(/(^\s*)/g, ""); 
    }
,
    
    
/**
     * @brief 去除右边空格
     
*/

    rtrim : 
function()
    

        
return this.replace(/(\s*$)/g, "");      
    }
,
    
    
/**
     * @brief 避免XSS 攻击
     
*/

    avoidXSS : 
function()
    
{
        
var strTemp = this.replace(/&/g, "&amp;");
        strTemp 
= strTemp.replace(/</g, "&lt;");
        strTemp 
= strTemp.replace(/>/g, "&gt;");
        strTemp 
= strTemp.replace(/\"/g, "&quot;");
        return strTemp;    
    } ,
    
    /**
     * @brief 获取字符串的字节长度 汉字默认双字节
     */
    byteLength : function()
    {
          return this.replace(/[^\x00-\xff]/g,
"**").length;
    },
    
    /**
     * @brief     除去HTML标签
     * @example    <div id=
"test1">aaaa</div>  =>  aaaa 
     */
    removeHTML : function()
    {
        return this.replace(/<\/?[^>]+>/gi, '');
    },
    
    /**
     * @brief      格式化字符串
     * @example 
"<div>{0}</div>{1}".format(txt0,txt1)
     */
    format : function()
    {
        var args = [];
        
        for (var i = 0, il = arguments.length; i < il; i++)
        {
            args.push(arguments[i]);
        }
        
        return this.replace(/\{(\d+)\}/g, function(m, i)
        {
            return args[i];
        });
    },
    
    /**
     * @brief 字符串转数字
     */
    toInt : function() 
    {
        return Math.floor(this);
    }    
}


for (var it in StringEx) 
{
    String.prototype[it] = StringEx[it];
}


test:


    var strTest = "   -{0}这里是扩展原生字符串test{1}- ";
            
            alert(strTest.length);                 
// output : 26
            alert(strTest.ltrim().length);      // 23
            alert(strTest.rtrim().length);      // 25
            
            alert(strTest.byteLength());        
// 36
            
            alert(strTest.format(
"abc","def")); //   -abc这里是扩展原生字符串testdef- 
            
            
var strNumber = "89989";
            
            alert(
typeof strNumber.toInt());    // number
            
            
var domTest = document.getElementById("test1").outerHTML;
            
            alert(domTest);
            
            alert(domTest.avoidXSS());
            alert(domTest.removeHTML());


下载 string.js 及  demo 

posted @ 2010-03-25 00:38 paulwong 阅读(181) | 评论 (0)编辑 收藏

仅列出标题
共91页: First 上一页 76 77 78 79 80 81 82 83 84 下一页 Last