CSS中的一些有用技术

1、滑动门技术
我这次也用到这个技术了,其实是一种互相折叠的技术,我已经使用过很多了。
这篇文章中介绍了如何在标签中使用滑动门技术,这个很有用,而且效果不错。
2、对于需要把传统html4.0转到css+xhtml的人,这篇文章很好。
一种简单的对照关系,可以让你把表格布局放到标准的css布局上面来,其实并不费力的。
不过要记住不要滥用float,否则会死的很惨。position:absolute有时也是不错的选择。
捷足先登学用CSS:HTML结构化
3、关于圆角容器
div标签很多时候类似个矩形容器,大家很爱用它。用它实现圆角容器可以让你的网页变得美观生动。
不过问题在于圆角容器会带来大量的嵌套div,不优雅。
为了优雅,可以使用javascript+dom来解决,哈哈,很不错的。
我的简历就使用了自己制作的圆角容器,自己修改javascript很好玩的,使用的东西不难看懂。后面那个网站很不错,456 Berea Street很多人都推荐。
Rounded Corners with CSS and JavaScript
Transparent custom corners and borders | 456 Berea Street
4、IE欺骗技术中的一个简单应用
圆角容器的css使用的一个解决IE对png支持不好的办法,记下来,很有用的。不过目前不知道怎么在css文件里面使用这个hack。里面的代码只对IE其作用,可以弥补IE对Web Standards支持不好的一些问题。
<!–[if lt IE 7]>
<style type="text/css">
/* Serve gif images to IE/Win pre version 7 */
.i1,
.i2 { background-image:url(css/borders.gif); }
.bt,
.bt div,
.bb,
.bb div { background-image:url(css/box.gif); }
/* Set a height to fix up some rendering issues. */
.i1,
.i3 { height:1px; }
</style>
<![endif]–>
5、关于控制框架宽度的方法
本来觉得Chinaren校友录论坛里面可以自动收缩的框架不错。可是后来发现在Firefox不能用。找了很多地方不能解决。结果闲逛的时候发现了解决方法。
框架页如下:
<FRAMESET id="_bodyframeset" rows="38,*" frameSpacing="0" frameBorder="NO">
 <FRAME id="top" src="top.htm" scrolling="no" target="body">
 <FRAMESET id="main" name="main" cols="200,9,*" frameSpacing="0" frameBorder="NO">
  <FRAME name="left" src="left.htm" scrolling="auto" target="body">
  <FRAME name="control" src="control.htm" scrolling="no">
  <FRAME name="body" id="body" src="userlist.htm" scrolling="yes">
 </FRAMESET>
</FRAMESET>
在control中的加入如下javascript函数,调用它可以自动收缩:
function shift_status()
{
 flag = !flag;
 if(flag)
 {
  if(screen.width>1024)
   window.top.document.getElementById("main").cols="200,9,*";
  else if(screen.width>800) 
   window.top.document.getElementById("main").cols="200,9,*";
  else
   window.top.document.getElementById("main").cols="160,9,*";
  GEId("menuSwitch1").src=’images/ej1_30.gif’;
  GEId("menuSwitch1").title=’隐藏’;
 }
 else
 {
  window.top.document.getElementById("main").cols="0,9,*";
  GEId("menuSwitch1").src=’images/ej1_32a.gif’;
  GEId("menuSwitch1").title=’显示’;
 }
}
原来框架页可以动过window访问到,然后就可以通过id访问它的子页面了,哈哈。不过这种Dom解析的说明网上也找不到很好的,查起来非常不方便。谁有好的资源可以告诉我。
6、一个在IE和Firefox都可以工作的灰度隐藏的Js
我了解到Firefox支持了Opcity,可以实现IE私有的filter里面的透明度的设置,所以修改了一下以前的一段js,让两个浏览器都可以实现类似的效果。不过目前在ff上没有渐变的效果,还需要改进。
<script language="javascript">
function high(which){
theobject=which
which.style.opacity=1
highlighting=setInterval("highlightit(theobject)",50)
}
function low(which){
which.style.opacity=0.25
clearInterval(highlighting)
which.filters.alpha.opacity=25
}
function highlightit(that){
if (that.filters.alpha.opacity<100){
that.filters.alpha.opacity+=10
}
else if (window.highlighting)
clearInterval(highlighting)
}
</script>
本文如果需要转载,请和我本人联系,未经同意不得专用,谢谢。

说说Displaytag


继续在Open-open.com逛,看到排名很靠前的一个java taglib项目。因为一直觉得taglib没产生什么有意义的东西,只不过是规范化了很多,看到排名靠前的taglib挺奇怪,就仔细看了看。
发现原来是个表格组件。前一段时间看讲座对Dorado那个界面比较感兴趣,使用了Ajax和组件化的表格技术,数据对象通过Javascript+dom解析,类似IBM的SDO概念。觉得如果能够真正的弄好,这种可服用的表格组件非常有前途。
当然SDO已经在IBM的JSF组件里面应用了,帮定起来真的很方便,而且客户端的体验也非常的好。可是JSF的最大缺陷就是手动开发太麻烦了,培植非常繁琐,所以就依赖于IDE来自动实现JSF组件的配置,所以JSF的IDE都是由背景的,代表某一方利益的东西。比如SUN的NetBeans、IBM的那个什么5.1,而我喜欢用的Eclipse下面还没有很好的辅助IDE,Nitrox新版支持JSF了,可是没有破解,正版又老贵,Myeclipse 4.0支持了JSF,但看了看很初级。
撤了老远,其实我想说我对这种实现的很Fine的组建太感兴趣了。
马上去它的网站看:
http://displaytag.sourceforge.net/
首页的几张截图非常吸引人,它产生的表格看起来非常的棒!
听Open-open介绍,这个东西和Struts结合很顺畅,我们的项目用的Struts+Hibernate+Spring,马上加进来试验。
遇上问题,session里面的变量访问不到,很奇怪,这个东西难住我了,找不到问题。看了它们的PDF,本以为会比网站讲得详细,后来发现不过就是网站的内容的PDF版本,基本也就是个入门指南,可怜。
网站总提到TestList这个东西用来测试,找不到这个类,下了它的源码,发现在源码的例子中有,产生测试List。
然后就用这个TestList测试了一下分页、排序、导出其它格式这些功能,发现非常吸引人,一下子觉得发现了宝藏!
然后不管是否能在我们项目应用,开始修改css,把它弄到我们的项目里,然后问项目其它同仁为何不能显示出我们的List。
修改Css很顺手,嘿嘿,目前我改css已经驾轻就熟了,很快修改出自己的漂亮的样式,很满足,哈哈。
而后,我的朋友郑浩发现了不能显示的问题,因为我们用了Hibernate,它返回的List是离线的,访问的时候需要用iterator访问,可能Displaytag的机制问题,所以无法访问到。
解决方法是每次new一个新的List,复制一遍再过去。我考!这是多大的浪费呀。把它放到DAO是不可以的,这样DAO移植后绝对是浪费,把它放到bussiness层也不合理,放到MVC的Controller还差不多,但是也感觉浪费的利害。
这时有些失望,所以去Google下,发现无数人说到这个问题。尤其是使用它的自动分页,每次如果取出所有的,然后复制List,估计性能会彻底完蛋!
所以,有些失望,Displaytag最有用的功能aotopagging不能使用了……
为了做试验,进一步修改,不用它的自动分页,但是修改了MVC,让它可以访问到一个复制过的List,来显示数据。配合刚才修改的css,效果和以前的Struts tag不相上下。(靠,完全是写css的缘故,这个有什么兴奋的!)
它的表格的控制都是英文的,应该可以中文。然后google,和问郑浩,他们用了如下代码:
<display:table name="list" width="100%" cellspacing="0" cellpadding="0" class="liebiao" pagesize="15">
 <display:setProperty name="basic.msg.empty_list">没有可显示的内容</display:setProperty>
 <display:setProperty name="paging.banner.placement">bottom</display:setProperty>
 <display:setProperty name="paging.banner.full"><span class="liebiao">[<a href="{1}">首页</a>/ <a href="{2}">前一页</a>] {0} [ <a href="{3}">下一页</a>/ <a href="{4}">最后一页 </a>]</span></display:setProperty>
 <display:setProperty name="paging.banner.first"><span class="liebiao">[首页/前一页] {0} [<a href="{3}">下一页</a> <a href="{4}">最后一页</a>]</span></display:setProperty>
 <display:setProperty name="paging.banner.all_items_found"><span class="liebiao"><br><br>本栏目共{0}条,已经全部列出</span></display:setProperty>
  <display:setProperty name="paging.banner.onepage"><span></span></display:setProperty>
 <display:setProperty name="paging.banner.one_item_found"><span class="liebiao">共一条,已经列出</span></display:setProperty>
 <display:setProperty name="paging.banner.last"><span class="liebiao">[<a href="{1}">首页</a>/ <a href="{2}">前一页</a>] {0} [下一页/最后一页]</span></display:setProperty>
 <display:setProperty name="paging.banner.some_items_found"><span class="liebiao"><br><br>共有{0}条,显示第{2}至{3}条<br></span></display:setProperty>
 <display:setProperty name="paging.banner.page.link"><a href="{1}" title="前往第{0}页">{0}</a></display:setProperty>
 <display:column property="title" title="标 题"  href="detail.jsp" paramId="id" paramProperty="id" maxLength="10" width="40%" align="left"/>
 <display:column property="reportername" title="作者" maxLength="4" width="20%" align="left"/>
 <display:column property="readtimes" title="阅读次数" align="left"/>
 <display:column property="newsdate" decorator="cn.gov.bjmy.util.SimpleDateDecorator" title="新闻日期" width="16%" align="left"/>
</display:table>

哈哈,这么用真的够累。不过想了想,在中小项目,利用它的自动分页还是不错的。
不过每次设置太麻烦了,查阅了下,1.0版本支持用displaytag.properties配置了,这样可以全局使用。
displaytag.properties的内容如下:(那些中文我已经转码了,使用了PropertiesEditor,这个Eclipse插件自动转码非常方便!)
basic.msg.empty_list=\u6ca1\u6709\u53ef\u663e\u793a\u7684\u5185\u5bb9
paging.banner.placement=bottom
paging.banner.full=<div class="pagelinks">[<a href="{1}">\u9996\u9875</a>/ <a href="{2}">\u524d\u4e00\u9875</a>] {0} [ <a href="{3}">\u4e0b\u4e00\u9875</a>/ <a href="{4}">\u6700\u540e\u4e00\u9875 </a>]</div>
paging.banner.first=<div class="pagelinks">[\u9996\u9875/\u524d\u4e00\u9875] {0} [<a href="{3}">\u4e0b\u4e00\u9875</a> <a href="{4}">\u6700\u540e\u4e00\u9875</a>]</div>
paging.banner.all_items_found=<div class="pagebanner"><br><br>\u672c\u680f\u76ee\u5171{0}\u6761\uff0c\u5df2\u7ecf\u5168\u90e8\u5217\
u51fa</div>
paging.banner.onepage=<div class="pagelinks">{0}</div>
paging.banner.one_item_found=<div class="pagebanner">\u5171\u4e00\u6761\uff0c\u5df2\u7ecf\u5217\u51fa</div>
paging.banner.last=<div class="pagelinks">[<a href="{1}">\u9996\u9875</a>/ <a href="{2}">\u524d\u4e00\u9875</a>] {0} [\u4e0b\u4e00\u9875/\u6700\u540e\u4e00\u9875]</div>
paging.banner.some_items_found=<div class="pagebanner">\u5171\u6709{0}\u6761\uff0c\u663e\u793a\u7b2c{2}\u81f3{3}\u6761</div>
paging.banner.page.link=<a href="{1}" title="\u524d\u5f80\u7b2c{0}\u9875">{0}</a>
export.banner=<div class="exportlinks">\u5bfc\u51fa\u4e3a\u5176\u5b83\u683c\u5f0f: {0}</div>
export.pdf=true
export.csv=false
把这个文件放到Web项目的Class目录下就可以了。解决了问题了。
用了下导出功能,支持pdf需要把itext-0.99.jar拷贝到WEB-INF/lib下面,然后再propertis配置中“export.pdf=true”。
不过发现这个用不了,后来发现原来是无法解析Struts的.do,我都是映射到/去的,而我的jsp文件不在/下面,所以路径出了问题。查了下,用这个参数指定,“requestURI="getUser.do?back=yes"”就可以了,里面是我用的struts的action的路径。
修改以后,自动排序和导出都正常了,不过发现导出csv的时候后缀是.do,靠,禁用它。(BTW:集图的时候天天CSV,哈哈,别的地方估计不常用吧。怀念COC,现在BOB却很少去)
下面是全部可运行的一个代码:
<display:table name="tablecontent" class="<%=lClass%>" defaultsort="1"
 defaultorder="descending" export="true"
 requestURI="getUser.do?back=yes">
 <display:column property="userId" title="ID" sortable="true"
  headerClass="sortable" />
 <display:column property="name" sortable="true" headerClass="sortable" />
 <display:column property="realname" />
 <display:column property="password" sortable="true"
  headerClass="sortable" />
 <display:column property="addr" title="Comments" />
</display:table>
对比一下Struts下面的相同代码:
<logic:iterate name="users" id="userlist" scope="session">
  <tr>
   <td class="frh"><bean:write name="userlist" property="userId"
    filter="true" /></td>
   <td class="fr"><bean:write name="userlist" property="name"
    filter="true" /></td>
   <td class="frh"><bean:write name="userlist" property="realname"
    filter="true" /></td>
   <td class="fr"><bean:write name="userlist" property="password"
    filter="true" /></td>
   <td class="frh"><bean:write name="userlist" property="addr"
    filter="true" /></td>
   <td class="fr"><bean:write name="userlist" property="level"
    filter="true" /></td>
   <td class="frh"><a
    href="/viewUser.do?id=<bean:write name="userlist" property="userId" filter="true" />">详细</a></td>
   <td class="fr"><a
    href="/deleteUser.do?id=<bean:write name="userlist" property="userId" filter="true" />">删除</a></td>
  </tr>
 </logic:iterate>
对比下发现差距也不大吧,不过,有了自动排序和导出,看起来满酷的。

酷是一方面,失望才是更大的。简单尝试和运行还是留下了遗憾,记录一下,如果有心人看到可以去改进:
1、不能读取Hibernate返回的离线List,这是个硬伤!不知道是不是我的使用问题。但是如果必须是在线的,那么内存浪费巨大。大的项目就用不了了!
2、所有的自动排序,自动分页,导出都是通过传统的服务器回写来实现的,看似酷,但是实际上过于简单。在Ajax很火爆的现在,技术有点落后了。
3、没有结合SDO这样的数据模型。其实和Ajax那个问题一样,没有SDO就不是组件模型。而只是一个傻瓜化的封装而已。
4、网站的文档不够详细,也不严谨,我觉得开源没有好的文档就永远火不起来。
5、我很欣赏所有的样式都依赖于css,而且东西很好扩展。但是居然网上有人抨击这种方式。我想反问那些满脑子程序的人,那些看不起美工的程序员,你们懂得程序是艺术么?你不懂css、不懂web standards、不懂xhtml、不懂xml,还有什么可混的么?
6、另一个问题。分页实现的太不优雅了。也许是taglib的限制。一次读取所有的数据,并且要求是在线的,仅仅为了分页,这太恐怖了。Hibernate不能这么用,JDBC也不能这么用!好的分页封装看来还要用别的。如此一看,这里面除了CSS提供看起来很好的表格外就只有导出功能了。
7、而悲观的是,导出功能除了花哨以外没有别的作用了,而导出功能还有更好的选择吧。
所以,一句话说。上手还算容易,可是深入难,看不到好的手册。Sample写的不错,可是缺乏与其它框架结合的例子,比如Hibernate、Struts。好多人说它好用,但是估计都是从简单的角度考虑的,性能的考虑是个问题。配置看起来还算容易,可是配置却没有文档来介绍,只能摸着石头过河。

所以,仅仅是结绳记事。小项目可以用。大项目用它没法发挥它带来的优势,只能使用可怜的一点点功能(我的例子只用了自动排序和导出)。不过开源项目,谁知道,没准麻雀变凤凰了呢。毕竟它的思想是对的,提供可用的Web组件(它声称要实现table、Tree等等),我也想找到一个这样的组件,那样就真的可以轻松些工作了!
等待那一天!

依赖注入DI、控制反转IoC

我也用我的话说说我的理解。
代码中的各种引用就会产生依赖。
原先用什么就在代码里声名什么,这样依赖是广泛的,任何改动丢要重新修改代码。
所以,不方便。
后来,流行工厂方法,不依赖具体类,只需要一个工厂,都准备好了。可是,这样就依赖于工厂了。如果有变动,就要修改工厂的代码。
所以,还不够理想。理想的方案是不修改代码,改变依赖之需要修改配置文件。
也就是,实现运行时依赖,而不是编译时依赖。这就是依赖注入的本质。
依赖注入DI(这是个方法),目的是实现依赖关系的完全解耦,也就是实现控制反转IoC(这是个理念)。

依赖注入就是通过IoC容器实现的一种自动依赖生成,你只需要配置依赖的字面关系,具体操作IoC容器自动完成。
Spring推荐使用的是:1、Setter 2、构造器(构造子)
关于两者的使用情景略有区别,夏昕那个文档有介绍。

用setter还是constructor。
如果依赖在生命周期不变就constructor,变就用setter。

DI实现的方式,流行的Spring实现了前两种,前两种DI都是IoC的实现。
1)通过set方法(Spring中常用这个玩意)
2)通过构造函数
3)参数传递(应该很早就开始应用了)

利用winrar自动备份重要资料

看到这个,发现很有用的文章,对于定期备份项目文件很方便。


每个人的电脑上都有很多有价值的资料,例如你写的论文、Outlook中的信件、IE收藏夹、FeedDemon中的rss链接等等,经常备份的重要性自不用多说,但怎样让备份变为轻松简单而不是繁重的劳动呢,我在网上查找了很多备份工具,发现它们要么很贵,要么存在各种缺陷(如不使用通用的压缩格式),后来发现其实只使用winrar就完全可以完成这个任务,而大部分人的电脑上都有这个压缩软件。

打开winrar的帮助主题,你会发现在winrar的命令行模式里可以指定很多参数,其格式为:

*WinRAR <command> -<switch1> -<switchN> <archive> <files> <@listfiles> <path_to_extract\> *

利用winrar可以从列表文件中读取要压缩的文件/文件夹这个功能,我们可以创建一个列表文件如C:\backup.txt,在这个文件里写入需要备份的文件/文件夹路径,格式很简单,每个路径一行即可。然后创建一个快捷方式(或批处理文件),其命令为:

*"C:\Program Files\WinRAR\WinRAR.exe" a C:\backup.rar @C:\backup.txt *

要进行备份的时候只要执行这个命令即可,这样会在C:\生成备份后的压缩文件,你最好把它转移到其他存储装置上。配合windows的计划任务,还可以进行定时自动备份。你还可以指定其他参数,例如加上-ibck可以让备份在后台执行,加上-t可以在压缩完成后验证等等,具体请参考winrar帮助主题。

这个方法的缺点是你必须自己找出那些需要备份的信息,有一些软件把信息存在注册表里不好备份,所以你可能需要在使用这种方式备份的同时手动备份注册表。不过很多专门用于备份的工具也是没有这个功能的。


以前帖子里说过用Winrar自动备份资料的方法,我现在平均每周备份两次,备份的内容包括日程(Rainlendar)、RSS频道(Rssowl)、Eclipse里的项目、常用IP设置、Outlook Express内容等等,压缩下来大约150M左右,其中主要是(带附件的)信件和项目文件占了大部分空间。

今天发现Eclipse里的一个CVS设置给搞错了,连接的是旧的CVS服务器,我在Eclipse里把服务器的地址改过来再进行Update操作,结果把我之后做的几处修改都覆盖了。还好我昨天晚上刚做了备份,这几天的工作没有白费。

类似这样的意外事件很难预料,事先做好充足的预防工作让我们有备无患,而付出的只是每周几分钟的时间,利当然远远大于弊。

关于Winrar备份我又总结了几条经验:首先可以设计两个备份任务,一个是全面备份,一个是快速备份,一些体积比较大又不是特别重要的不需要经常备份,平时每天进行快速备份,每周或每月全面备份一次就可以了;其次,在命令行里加上-ag参数可以让备份得到的压缩包文件名自动包含当前日期,从而不会覆盖掉以前的备份,该参数还可以指定日期格式,如YYYY-MM-DD等;另外,用-ms参数可以不对已经被压缩过的文件再次压缩,而是直接存放;最后,用-x命令可以排除一些我们不希望备份的文件,比如*.jar文件,一般都可以下载得到。我现在用的备份命令如下,其中backup-q.txt的内容是要备份文件的列表,得到的压缩包名像BAK20050223.rar这样:

"C:\Program Files\WinRAR\WinRAR.exe" a -agYYYYMMDD -ms -x.jar -ep2 -ibck -t c:\backup\BAK.rar @c:\backup\backup-q.txt *
这里要提醒一下,备份的文件最好定期转移到本地硬盘以外的存储地点,比如刻成光盘保存,还是不要过于相信硬盘了。


我自己的Script如下:

O:\Eclipse\Achive\backup.txt
O:\Eclipse\Workspace\Level2Demo
O:\Eclipse\Workspace\StructDemo
O:\Eclipse\Achive\do.bat
"C:\Program Files\WinRAR\WinRAR.exe" a -agYYYYMMDD -ms -x*.jar -ep2 -ibck -t O:\Eclipse\Achive\Workspace.rar @O:\Eclipse\Achive\backup.txt
cmd

安装Together for Eclipse 7.0

这里下载Together Edithion for Eclipse 7.0,这个是官方的,要注册个用户名才可以下载。大家通过其它渠道获取也可以,但要确定是7.0的。
安装很容易,有安装向导。不过要注意它只能工作于Eclipse 3.0.x,比如3.0.2,不支持3.1final的。
很容易找到的shock的破解在Windows XP下不起作用。如果大家也使用XP,请使用附件里面的ROR的给.net版做的破解,这个也可以用,而且是唯一可用的。
使用的时候先运行一遍Together(一定要使用Together安装目录下的TogetherEC.exe运行),它提示你注册的时候退出。然后运行keygen.jar(双击就可以),然后选择你安装Together目录下的license下面的ttec.slip,然后破解完成了,运行Together就可以进去了。
界面大家自己适应一下,应该容易上手,不过画图的那个palette是自动隐藏的,你用鼠标点击就可以展开(以前因为不知道以为破解没有成功,走了很多弯路,我很笨 __)由于Together默认使用自己的Perspective,所以如果和其它版本的Eclipse共享Workspace也许会报错,需要换回Perspective才可以。

UML建模工具浅度分析

1、Rose
这个工具我不多说,它应该是最权威的,但不一定是最适合的。但是Rose仅仅是个建模工具,无异于一个画图工具。Rose画的图风格明显,一看就知道是用的Rose。不过要使用它来管理还要结合Rational的其它工具,整体使用的话很庞大。我不多评价,因为没用过,想起被人们称为“巨大”、“资源杀手”、“经常崩溃”、“价格昂贵”我就头疼。希望同组其他同学评估一下,补全。
2、Visio
这个更不用多说了,完全就是个画图工具,而且沾染了MS的风格,不开放,完全陷在自己的小圈子里面。不过有两个别的工具不具有的优点:A、速度快、图形美观、资源占用小、界面友好、容易上手……这些都是MS Office的优点 B、剪贴板格式与MS Word兼容,非常容易嵌入到Word文档中,这个是最有用的功能!
不过可惜,对UML标准也就是睁一只眼闭一支眼,不标准不兼容,且非常不合理的不支持Java,哎,只能忍痛割爱。总之Visio只能用来玩玩,画画漂亮的画骗骗小孩。
3、Together for Eclipse 7.0 or 6.3
说起它感觉就是个痛苦。首先这个东西都是收费的,所以必须破解以后才能体验。刚装上7.0没有发现画类图的工具,抓耳挠腮呀,还是没有解决。而后试验了6.3,这个能够顺利使用,建模应该是UML1.1的东西。图形非常简单,看来法国背景的Borland并没有让它看起来很漂亮,可惜。不过Together本来是仅次于Rational的业界老二,所以东西当然很强大,支持基于模式的UML建模,不过建模以后的图看起来乱七八糟的。但这是由原因的,Together更加偏重于MDA,所以它的输出应该是代码,而不是UML图,所以这个工具面向生产,能够准确的自动生成代码,也支持逆向工程(从代码生成类图),但是图都是简陋的。而我们的这次实践还没有应用MDA这样的概念,设计只是概念指导,文档是重要的输出,所以选择Together可能会是个艰难的选择。
简而言之,Together的功能我们有90%用不到,而用到的那10%还是Together的弱项,你说怎么选择。本工具可以输出XMI,可以与其他UML工具交换。Together目前最新的版本是7.0 for EC,我再找找破解,看看能否翻案,不过希望不大。
同时还要控诉以下Together for EC,我当时用6.3花了好久画的图输出时却犯难了,因为它只支持SVG格式输出。SVG是Adobe的不怎么疼的一个儿子,是一种基于XML的矢量图像格式,类似Flash,而现在Adobe鲸吞了Macromedia以后Flash就变成Adobe的养子了,如此之下SVG这个亲儿子也失宠了,可怜。倒霉的SVG与Adobe的其它东西一样,对中文字体总有点感冒,所以用IE打开乱码,要下载SVG Viewr中文版才可以解决,但是用起来还是特别别扭。在Word里面用SVG,我目前使用illustrator转化SVG为BMP,然后再到Photoshop转化为GIF,然后再嵌入Word,这也是被逼呀,没办法……
BTW:用illustrator转换SVG叶挺麻烦,每次要删除辅助线,挺麻烦的,真的让人有心理阴影,这直接造成让我放弃Together。
4、Visual Paradigm Smart Development Enviroment 3.0 for Eclipse
这个工具获得了本年的Jolt大奖,按理说会不错。体验了一下,首先是界面画画绿绿,感觉有点像是过年贴的年画,后来打听到原来Visual Paradigm是一个香港的公司,呵呵,还是国产软件呢。相比有些花哨的界面,程序的功能真的非常强大,而且在画图的时候可以从从一个个UML对象上面直接派生关系,感觉真的是Smart。
但是缺点又来了:我们工作于Eclipse,但是SDE并不是紧密结合的。分两个部分:Visual Paradigm for UML 5.0 Community Edition、SDE 3.0 for Eclipse and IBM WebSphere Studio Community Edition。后者才是SDE,也就是与Eclipse结合的建模部分,而VP for UML5.0是个比较纯粹的建模工具,它并不与Eclipse完全结合。在使用的时候SDE的Community版本无法从代码逆向工程出UML模型,而且SDE环境无法直接输出图像格式的UML图,必须先导入VP for UML5.0以后才可以输出为其它格式。这样可能会带来一些不方便,我们将无法使用代码与模型同步的功能(如果用企业版好像可以),这是个问题。
再用简单的话说,VP分两个部分,一个是SDE与Eclipse结合,一个是VP for UML5.0纯粹建模和输出UML图,但是两者结合并不紧密。且Community版本代码同步不能用,这是个麻烦。但是总体上这个工具比较强大,理念先进,且完全支持UML2.0。本工具可以输出XMI,可以与其他UML工具交换。所以作为我们的备选方案。目前本工具只支持Eclipse 3.0.x。
5、Omondo EclipseUML Free Edition 2.1.0
这个工具用的人比较多。它更接近一个Eclipse插件,虽然它不是开源的。这个工具比较纯,可以UML2.0建模,支持代码模型同步(类似MDA的方式)。
我们依然先说缺点,这个Free版本无法支持与CVS同步的项目,靠,这真的很烦,如果去掉CVS同步就可以。
说优点:EclipseUML的逆向工程能力非产好用,你可以直接托拽工程里面的类到类图里面,这个非产贴心!如此就可以代码同步了,这对贯穿项目整个生命周期非常有意义。再有,它的UML图画的非常好看,我觉的是上面几个中最棒的!简单、颜色清淡、具有阴影效果、没有锯齿和难看的图形、所有的图标与Eclipse环境统一,这样的UML图真的是别无所求了!但是,没有完美的,目前的Free版本只能输出SVG,靠,这等于和Together一样瘸腿了,不过欣慰的是Studio版支持输出Windows Metafile、CGI、JPEG格式,哈哈,而且有20天试用,如此的话我们完全可以集中输出。再说实在不行可以截图……
EclipseUML Free和前面的UML建模工具比还有个优点,它支持Eclipse 3.1,这样的话就可以和我们的最新的Eclipse3.1+Myeclipse4.0M2环境结合起来工作了,支持逆向工程,UML2.0图很标准很漂亮,CVS支持带来的问题我们可以通过维护一个没有CVS的项目来操作。
CVS项目问题和图形输出还可以通过EclipseUML Studio Edithion来解决,不过可惜的是这个版本只支持Eclipse 3.0.x,和前面那些工具一样啦……
简单的说,EclipseUML支持逆向工程、简单、图形漂亮,支持Eclipse 3.1,方便协同工作,所以应该作为我们项目的推荐方案。

下午,又峰回路转了,对本来在待定状态的Together 7改变了看法。

先是发现以前用的破解方法没有错,而且是在Win XP里面唯一有效的方式,如果决定用,我们就可以破解它。
然后发现原来我以为Together 7没法画图,其实是个低级错误,里面的面板学习VS.net是自动隐藏的,所以我一直没有发现,今天仔细看就看到了(可能写作业的时候太紧张了)。
图好象不是UML2.0的,但是这不算个问题。
图形还是比较平淡,就是很基本的那种,也没有颜色,就是黑白的。可是隐藏在后面的是巨强大的MDA功能,支持画图自动生成代码,而且画图的时候可以使用内置的模式的模版,还可以自定义模式,很强大的。然后发现不能导出单一的图,本来觉得又要失望了……谁知山穷水尽疑无路,柳暗花明又一村,发现居然可以Export一个整体报告出来,输出的时候图像可是可以是BMP、JPG、SVG等等,并且连JavaDoc也一并生成了,还有个很酷的applet树……绝对的爽!

所以基本上Together7还是具有老二的风范的,应该推荐。而Rational系统ZH同学说还是不太稳定,且4CD的体积看了绝对受不了(谁喜欢肥girl?),so,这个老二是绝对值得考虑的!

也就是说:
现在可以考虑的是Together、VP SDE、EclipseUML。Together的类图缺写颜色,但是功能全。VP SDE大家好像都不太喜欢,花花绿绿让人……而且没什么绝招吸引人。EclipseUML的最大优点是支持Eclipse 3.1,可是Free版本没法与有CVS的项目工作,而Studio版只能用20天且不支持Eclipse 3.0.2。所以综述,目前UML工具只能在Eclipse 3.0.2下工作,能够完美注册使用,且能够提供完整解决方案的就是Together for Eclipse 7.0,所以,我最终认为它就是最值得推荐的!

最后我们画个表格来对比一下这几个建模工具:

工具名称 版本 与EC结合 UML2.0兼容 逆向工程 输出图形格式 注册 图形美观 界面友好 MDA支持 支持EC版本 支持CVS 结论
Rational Rose 2003 × × × All 必须 7/10 ? × × × ×
MS Visio 2003 Sp1 × × × All 必须 7/10 10/10 × × × ×
Together 7.0 for EC × SVG 必须 4/10 6/10 3.0.x 推荐
VP SDE 3.0 for EC ×(注册) SVG、PNG、JPG 免费 8/10 7/10 ×(注册) 3.0.x 备选
EclipseUML 2.1.0 Free SVG(其它需要注册) 免费 9/10 8/10 3.1 ×(注册) 推荐

相关连接:
http://www.borland.com/us/products/together/index.html
http://www.visual-paradigm.com/product/vpuml/productinfovpumlce.jsp
http://www.omondo.com/还有一个准备看看:
http://argouml.tigris.org/
看过了,是个纯Java实现,不能与Eclipse协同。总的来说比较一般,就是个建模工具,估计也没有Rose友好,所以不做近一部考察啦。

Struts入门应该注意什么?

我认为五点最重要:
1、找一个好的IDE,因为开发Struts应用这样拥有大量XML配置工作的工程最好有一个具有代码生成的IDE。你可以选择Eclipse+Myeclipse或者Eclipse+Lomboz或者JBuilder这样的成熟IDE。
2、速食化的文章看上一两篇就可以了,主要了解一些基本结构就可以了,学习技术光靠吃方便面是肯定不够的。
3、学习Struts这样地开源框架要特别注意版本的区别,1.0 1.1 1.2的Struts都有很大区别,看文章、书都要先搞清楚版本,否则你连一个helloworld也别想搞定。现在书大部分都是1.1的,但是目前应该学习1.2,两者的区别可以参考Apache Jakarta项目的说明。
4、参考一个简单的Demo,实现CRUD操作的就可以,你需要理解一下MVC在Struts中的对应机制。
5、选择一本好书开始认真学习,例如:Manning出版的Struts in Action,OReilly出版的Programming_Jakarta_Struts,还有Jakarta Struts Live。这几本都是经典。

Java&UML,又一些牢骚

这算一种言论而以,站在Java阵营,要能够接受各种忽悠。
这里有几个概念UML&MDA、建模工具&代码生成、软件过程&设计。
MDA是否会顺利,是否要真正自动不需要人的介入没有定论,也就是说出代码是不可能没有人的,难道程序员想要谋杀程序员?
代码生成,需要,但不是全部需要,是通过模型生成这种整体解决还是局部的自动化生成更好用现在也没有定论。这就好像XML与J2EE的关系,XML很好,但是多了你觉得写他们是不是非常的累?比如Struts、Hibernate、Spring这些,哪个的XML不是写到你头疼?
软件过程这个就更不好说了,没有人说一定要自上而下的设计,很多敏捷方法都是边写代码边设计。所以关于这个问题,还是邓爷爷说的:“不管黑猫白猫,逮到耗子就是好猫!”,方法学是为你服务的,你不要被它套牢。

还有,记得哪个大师说,什么设计都是瞎掰,你最终交付的只是你的代码!设计和软件过程是为了保证代码质量的方法,但这种方法从来不唯一,开发过程、OO产生以前,还是有很多高质量的代码,所以……。
当然,不是做起义的农民,只是在想:
UML表示静态很好,那就用它表示静态。
动态,你可以用那些蹩脚的图,当然也可以通过其它的各种定势来暗示实现时的动态关系,毕竟程序员不是傻子,都有一定的悟性。
再下面,关于建模技术真的不太了解了,期待郑浩给点好的例子,还有介绍你的经验,我们很期待。
BTW:我以为是动态语言,眼花了。ZH推荐了Ruby on rails,这东西真的够震撼,绝对提升效率,同样还有Python on Zope,然后又发现Google的大量代码使用了Python(Google主要用C++、Java、Python),而Python作为胶水代码具有超级高的效率,星战3也用了Python,靠,动态语言真厉害。看看而以,现在暂时坚持Java不动摇。

Java框架学习感想——版本差异害死人

版本差异害死人。
说实话,有时怀念用MS的编程环境,都是人家制定好的,不用东那么多脑子选择用什么编程环境、用什么语言、用什么技术等等。
而入了JAVA的伙,学习J2EE,那么多的开源框架,选择就要花费很大的工夫,因为选错了以后修改起来成本可就大了。关键是框架曾出不穷,都宣传自己多么先进,哎,绝对眼花缭乱。而即使选定了框架,如果遇到版本升级,那也有可能是天翻地覆的变化,设让人家是开源的,变化从来多讲究设计精良,并不考虑那么多升级成本问题。
经常面对要学习的新框架、新技术,对于程序员来说是个挑战,很累,但是保持了你的先进性,并且多动脑子还是有益的。而版本变化,只能说学习成本好高,但是选择了Java和开源你就要接受这种高学习成本,有什么办法呢。
我只是发发牢骚,书还是要看的,UML、Paterns、Hibernate、Spring这些都是要抽时间好好看看的,这里结绳记事。
今天好不容易把上次那个Spring step by step搞定了,一直调不通的JSTL的问题原来还是个版本问题。
报错如下:
org.apache.jasper.JasperException: /jsp/hello.jsp(9,34) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
意思是找不到对应的属性,属性不接受表达式。
1.1的URI是<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
1.0的URI是<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
而1.0的版本不支持表达式,所以要用1.1的,而如果又正巧用了1.0的声明,那就会遇到与我一样的问题。
所以,记住修改URI为http://java.sun.com/jsp/jstl/core就好了。
版本差异,呵呵,J2SE1.4&J2SE1.5、Struts 1.1&1.2、Spring 1.1&1.2、Hibernate 2&3、Tapestry 3&4,太多了……
这是常见的对比的冤家:Linux v.s Windows 、 Java v.s .NET 、 OpenOffice.org v.s Microsoft Office System 、 PS2 v.s XBox 、 Palm v.s Windows CE 、 Symbian v.s Microsoft Smart Phone……

回复Dadou:关于.NET和java性能问题

一个很好的讨论,可以参见通告的连接……
信里面很多高手进行了分析,感觉很有意思,我也写了一点,搅一搅局,哈哈:
看了大家的讨论,我很感兴趣。下面的成绩如果是相邻的,那说明测试了两次,就是两个毫秒的差值。
讨论Java和.Net感觉比较奇怪的。一直都是J2EE和.Net的对比,这个才是门当户对,他们都是面向应用的。况且需要解决的企业程序算法的量比较小,用到这么多ArrayList其实并不常见。
废话一句,J2EE和.Net经常出现的Web应用中,这里的响应速度才决定很多,Yujie引用的那段话说得很公平,因为社区里的人都会维护自己社区的利益,没有自己人会说真话,对于他们并不需要那么多性能测试,只需要你用好,因为一个好的J2EE应用和一个差的J2EE应用型能何止相差100倍??!!我坚持认为平台并不能决定一切,而应用的设计和实现质量才会比较强的影响性能。
然后,关于虚拟机,.Net Framwork 1.1 2.0的差距好像比较大,这个需要考虑一下,不过看Yujie的对比MS实现的虚拟机看样子不容乐观。
Balder真是让我崇拜,钻研的很深,而且解释的非常到位,我觉得没法更加深入剖析了。但是利用Native方法的东西用来和受控的代码对比,性能差距就是会很大,尤其是这个数字被放到到那么大的时候。
再提,测试中使用了256MB内存的机器,而WinXP SP1跑JVM绝对会使用大量虚拟内存,WinXP会占用18x内存(乐观情况,一般2xx),因为javaw.exe绝对会变得庞大,调用虚拟内存造成的性能损失就更加非线性了,所以,我下面的测试用了1G内存,基本上保证物理内存。然后,CPU也是个问题,尤其适用P4的时候,我不知道Mobile的里面是否支持HT,如果支持HT的JVM和.Net虚拟机的效率会受到它们被编译的时候的编译器的优化的影响,并且影响很大,所以我测试使用了AMD Athlon XP(@2083Mhz)的机器,减少一些影响。
废话说了一大堆,我下面的测试主要针对程序在JVM里面运行的一些影响因素的评估,并且从这些因素里面我们能够发现这个测试的一些不妥当之处。
Balder原始程序:
首先验证一下程序在JRE 1.5(5.0)和1.4.2里面的差别。
JRE 5.0
36657ms
36953ms
JRE 1.4.2
32531ms
34140ms
发现性能居然是1.4.2更好,个人认为也许是5.0 JVM里面对资源利用的一些优化造成的吧,5.0利用资源比较小气,嘿嘿。同时这里提出一个问题,这个测试没有考虑内存占用的问题,因为JVM和.Net虚拟机(CLR?)对物理内存的利用不一定一样的,JVM吃内存是非常有名的,所以更多物理内存带来的效率提升需要考虑进去,还有就是CPU资源的利用,他们在运行的时候到底用了多少时间片?需要用CPU占有率衡量一下,这个也是没有考虑进来的地方,都是潜在的不公平的地方。
去除掉CMovieInfo里面的Math.random()方法。
33593ms
这里random被执行了20000*4次,是最主要的调用random的地方,看来这个的影响并不大。也许是static方法放在虚拟机里面所以对性能影响不大吧。
我把Demo的removeArrayList()里面的删除的random去掉,直接每次删除第1个节点。
75609ms
74859ms
哈哈,这样其实才像个测试,这是一种最坏的情况,每次删除前面的节点,后面的节点就需要蠕动过来,程序彻底没有了random的干扰,并且测试最差情况。这样可以减少随机数产生的测试偏差,而且同时发现Yujie的程序里面random的种子是固定的,这样生成序列应该是固定的(如果是在C语言里面),这对测试不公平。
然后,再修改一下,每次删掉ArrayList的尾巴(mylist.remove(mylist.size()-1)),结果让我瞠目结舌!运行几次都是0ms!
0ms
瓦赛,我终于发现看齐来公平的测试后面隐藏的危险,因为移除的位置太重要了,我怀疑只是
移除尾巴的时候编译器和JVM都有特别的优化。
然后,继续测试一下去除尾巴前面那个(mylist.remove(mylist.size()-2))。
16ms
也就是说不会全部优化掉,但是差距绝对是戏剧性的!如果把他们花成曲线那会是什么样子??我觉得有时间我们可以写个用JFreeChart画一个变化的曲线图,估计很有价值。还没有完,我们可以量化一下random()和new对象CMovieInfo所花费的时间,我们保持删除尾巴的操作(mylist.remove(mylist.size()-1)),只是恢复CMovieInfo的代码到最原来的状态,也就是包含那些random()。
16ms
16ms
很稳定,原来random()即使执行了那么多次对性能造成的损失也可以忽略了。
这里插一句,我在画Wave图的时候发现毫秒不够用,想找个更小的时间单位的实现,但是发现没有,请问哪位知道除了对时间点求平均值的方法外有没有更好的表示时间的小单位?
最后BTW:如果把这个东西整理一下,发个帖子,估计会火得不得了,哈哈:D