& Witty &
朋友们如果看下边儿有一大堆什么这个技术那个代码还有程序的看不懂,请直接自动快速的忽略,赶紧的蹂躏下边儿的内几个链接直接看我本人。
1. 减肥日记
2. 我,就TMD一俗人!!!
3. 生活 情感
4. 随来而去 随笔随想
聪明的人,有时候就是盲的人。
eclipse使用debugrun和jboss来调试断点
debugrun.zip是debugrun运行的批处理文件
1.将debugrun.bat复制到如下目录:
X:\…\BuildPro\jboss-4.0.3SP1\bin
其中,前面的“X:\…”为每个人的实际物理目录
2.打开debugrun.bat,找到如下内容并进行编辑
set DEBUG_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9595,server=y,suspend=n
其中,address=9595是端口号,待会儿需要在eclipse中填入的,这个可以改成你想要的,也可以不进行修改
3.双击debugrun.bat启动。
4.选择你的项目,点击工具栏中的debug按钮下的”Open Debug Diaglog…”

5.在弹出的窗口中,从左侧选择”Remote Java Application”,右键点击,选择”New”,会出现如下图:

如图,把端口号修改成debugrun中实际设置的端口号9595,然后点击”Apply”应用改变,然后点击”Debug”运行。
6.然后在eclipse中会出现如下视图,

这里就是待会儿要用到的debug试图了。
7.打开你的eclipse,首先选择一个程序来设置断点,例如:
8.好了,然后运行你的程序到你设置的断点,运行后再切换到eclipse,来看看debug视图
这个是debug窗口的左侧视图
这个是debug窗口的右侧视图
这个断点结束后,可以点击左侧视图的”Resume”来继续下面程序的执行

java的传值与传引用
java的传值与传引用
java中,基本数据类型都是传值,比如int,double,lang,
java中,对象都是传引用,
特例,String对象是传值操作
=赋值操作是传引用操作
克隆分为影子克隆和深克隆
new出一个新的对象a1,在内存中开辟出一块新的区域给a1使用。
new出一个新的对象a1,在内存中开辟出一块新的区域给a1使用。同时,将a1赋值给a2,这时,也会分配内存给a2,但是a2存放的不是与a1一样的对象,而是指向a1的指针,或者说a2是a1的引用。

一个很直接的克隆例子,先new一个a1出来,然后使用a1克隆的方法给a2赋值,这是内存会分配两个区域给a1和a2分别使用,二者互不相干。
下面来说说影子克隆与深度克隆
所以影子克隆与深度克隆一个主要的区别就在于,如果一个对象A里的成员变量B是另外一个对象,影子克隆只是克隆出一份A,但是克隆出来的A里面的B还是一个指向原来A中的一个指针,而深度克隆就是出来的A中的B也是一个新的B,与原来A中的B互不相干,说的有些绕口,下面来看图。
先假定咱们有如下的class:
class B {……}
class A { B b;}
A中的一个成员变量b是B对象。

这张图说明的是影子克隆,影子克隆的结果就是a1与a2分配出了一块内存区域,b1分配出了一块内存区域,b2也是占用了内存区域,但是它是指向b1的一个指针,对b2进行改变会影响到b1跟着改变。

恩,这张图说明的就是深度克隆了,给b2分配了内存,但是这时不是指向b1的一个指针了,而是实实在在的B b2对象,对b2的改变与b1没有关系。
java的深度克隆与影子克隆的实现方法,可以参考下面的资料。
参考资料:
Java基本功——Reference
dreamhead.blogbus.com/logs/2005/05/1189478.html
JAVA中的指针,引用及对象的clone
Java中的ListIterator与Iterator的区别
Java中的ListIterator与Iterator的区别
最近在使用Iterator迭代器遍历一个List,如果List里的元素满足一些条件,就要把这个List的这个元素给remove,或者给重新设置一个新值,remove很容易,在当前迭代的对象中直接调用remove方法即可。
但是要想改变元素的值,那就不可以了。
从网上搜资料,找到了ListIterator,先来简明扼要的说说二者最大的区别吧,
ListIterator迭代器可以增加元素,更新元素,并且可以从后往前的来对List进行迭代等等。
a.ListIterator有add()方法,可以向List中添加对象,而Iterator不能;
b.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以;
c.ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能;
d.都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。
因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。其实,数组对象也可以用迭代器来实现。
如何通过action来给valueList的查询条件赋值
如何通过action来给valueList的查询条件赋值
以前使用valueList来做查询条件时,总是从页面的form中进行post或者get值给valueList,比如在valueList里会有这样一段代码:
/~con1: AND fields1=[con1]~/
但是这次项目遇到的是根据不同的登录角色来进行条件不一样的查询,这个如果通过表单提交的方法就很麻烦而且从客户端浏览器的行为也容易被篡改,咱们可以这样。
在valueList对应的Action中,增加相应的doPrepare()方法,比如下面代码这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public void doPrepare() { // 账户 addParam("customerId", his.getLoginedCustomer().getId()); removeParam("receiverOrPayer"); // 支付方式 String channel = request.getParameter("channel"); if(!StringUtils.isBlank(channel)){ String[] channels = channel.split("_"); addParam("channel", channels[0]); for(int i=1; i<channels.length; i++){ addParam("channel"+i, channels[i]); } } } |
里面主要的方法就是addParam,removeParam,这样可以在把数据交给valueList前,先进行一层处理、包装,addParam可以把值传给valueList,以供使用。
为什么doPrepare会被执行呢?
这个Class声明是这样的:
1 | public class ListOrderHis extends BaseValueListAction {......} |
那么就来看看BaseValueListAction里面的内容吧,在这个Action中,有如下的一个方法:
1 2 3 4 | public void prepare() { ...... doPrepare(); } |
明白了吧,是这里来的prepare()方法调用的doPrepare()方法,咱们在子类中把doPrepare()方法给覆盖了,所以就会被执行了,那又是什么机制调用的prepare()方法呢?
那就一级一级来看吧,
这个BaseValueListAction声明如下:
1 | public class BaseValueListAction extends CRMActionSupport implements Preparable {......} |
有没有发现实现的接口里也包含了Preparable类似的词组?
那就来找Preparable看看,在前面有这样一行import代码如下:
import com.opensymphony.xwork.Preparable;
在 Preparable中的代码是如何的呢?
1 2 3 4 5 6 7 8 9 | public interface Preparable { /** * This method is called to allow the action to prepare itself. * * @throws Exception thrown if a system level exception occurs. */ void prepare() throws Exception; } |
看来只要实现这个接口的prepare方法,就可以在咱们的action执行之前来写一些代码了。
这么看来,是xwork和webwork在起作用了,在网上搜罗了相关的一些资料,发现是webwork的拦截器机制在起作用,拦截器,究其根本原因,在网上找到了如下一篇文档可以很好的说明这个问题了。
第五课: 截取器(Interceptors)
svn.opensymphony.com/svn/webwork/trunk/docs/chinese/wikidocs/TutorialLesson05.html
朋友们有空儿可以来看看。
java的Calendar对象需要注意的问题
java的Calendar对象需要注意的问题:
1.每周是从周日开始算的
周日算每周的第一天,周六算每周的最后一天。
十二月:
日 一 二 三 四 五 六
13 14 15 16 17 18 19
20 21 …
这个引发出的问题,如果计算12月17日这一周的周六周日的日期,咱们期望得到的是:
周六:12月19日,周日:12月20日,
但是实际呢?
周六:12月19日,周日:12月13日
为什么呢?因为周日是这周的第一天,所以就这样了,在咱们得到这个值后,还需要进行处理,才能按照咱们的习惯使用。
2.接着第一个问题,那咱们能不能把每周的周一定为每周的第一天呢?
Calendar有这样一个方法,setFirstDayOfWeek()
我曾经这样使用:
Calendar c = Calendar.getIntance();
c.setFirstDayOfWeek(Calendar.MONDAY);
从表面很好理解,设定c对象的每周的第一天是周一,其实不然!
Calendar.MONDAY这个常量值就是2,不可改变。
3.每年中的月份不是1-12月,是0-11月。
4.从Date转换到Calendar用如下方法:
Date d = new Date();
Calendar c = Calendar.getIntance();
c.setTime(d);
5.从Calendar转换到Date用如下方法:
Calendar c = Calendar.getIntance();
c.getTime();
6.常用的方法
在YP2G_CreditPay这个项目中,有两个文件,
/YP2G_CreditPay/src/java/com/yeepay/credit/common/CommonDate.java
/YP2G_CreditPay/src/java/com/yeepay/credit/common/CommonDateConvert.java
其中CommonDate是常用对日期操作的方法。
CommonDateConvert是对String,Date,Calendar对象互相转换的方法,
可以提供给大家使用。
下面简单的说一下CommonDate主要的一些方法。
//传入一个日期,比较是否在后两个日期的区间之中
CommonDate.isDayInSections(Calendar compareDate, Calendar beginDate, Calendar endDate)
//返回周几的具体日期
CommonDate.getCalendarByDayOfWeek(int dayOfWeek)
CommonDate.getCalendarByDayOfWeek(int dayOfWeek, Calendar calendar)
//返回calendar对象所在的这一月中,这个月的第几天的具体日期
CommonDate.getCalendarByDayOfMonth(int dayOfMonth)
CommonDate.getCalendarByDayOfMonth(int dayOfMonth, Calendar calendar)
//给出星期几,返回离当前日期未来最近的那个星期几的日期
CommonDate.getCalendarByNearlyDayOfWeek(int dayOfWeek)
//给出一个月中的第几天,返回离当前日期最近的那个星期月的那天的日期
CommonDate.getCalendarByNearlyDayOfMonth(int dayOfMonth)
//在传入的日期的基础上向后推算一天
CommonDate.addOneDayToSuspendedDate(Calendar date)
//在传入的日期的基础上向前推算一天
CommonDate.reduceOneDayToSuspendedDate(Calendar date)
//在传入的日期的基础上向后推算N天
CommonDate.addSomeDaysToSuspendedDate(Calendar date, int days)
//返回一个Calendar对象,这个Calendar对象的时区被设置为GMT+8
CommonDate.getCalendar()
//将Calendar对象设置为0点0分0秒
CommonDate.setTimeToZero(Calendar calendar)
//为传入的每周的第几天+1天,来适应Calendar对象将周日作为每周第一天的需求
CommonDate.addOneDayForCalendarWeek(int dayOfWeek)
7.可供参考的资料:
Date类学习总结(Calendar Date 字符串 相互转换 格式化)
hi.baidu.com/jiangpanfeixue/blog/item/4b778603931c16723812bb1b.html
JAVA的Date类与Calendar类
www.cnblogs.com/springcsc/archive/2009/12/03/1616347.html
Calendar 类的setFirstDayOfWeek 方法详解
ajava.org/course/java/17121.html
关于java的calendar类和date类
zhidao.baidu.com/question/56621584.html
还有白玮的有一次关于JAVA日期时间的分享,昨天我又翻了一遍,还是很有用的。我一并打包成zip包放在附件里了。
附件见这里:
java的日期和时间
db2中sql语句的另外一种update语句写法
一般的咱们常用的update语句结构如下:
1 | UPDATE TB SET FIELDNAME='FIELDNEWVALUE' WHERE xxx; |
但是今天碰到了需要更新多个字段的情况,比如需要更新10个字段,前5个字段的值来自表A,中间三个字段值来自表B,最后两个字段值来自表C,
如果要是一个一个字段的写 f=’xxx’这样太麻烦了,于是乎上网搜索,发现了另外一种写法。
1 2 3 4 5 6 7 | UPDATE TB SET (field1, field2, field3, field4......) = (SELECT field1, field2, field3, field4 FROM A JOIN B ON xxx LEFT JOIN C ON xxx WHERE TB.ID=A.ID [AND xxxx]); |
这个sql语句的意思就有些类似insert 常用的方法了,即首先在SET关键字后面写好待更新的字段列表,然后写“=”,在“=”后可以写一个联合查询,把需要的字段按照前面的顺序进行排列,再再WHERE子句中按照一定的条件进行关联,这样,update就可以了。
当遇到问题,而没有求助条件的情况下,应如何
当你遇到问题了,但是google百度都找不到解决方法,根据自己以往的经验也不能解决,想求助于人但是没有资源(比如昨天加班时别的同事都下班了),这个时候怎么办?
还是要遵守咱们的,自己思考问题的时间不能超过两个小时,以我昨天为例,一个在java application中调用jndi总是不成功,因为jndi是放在jboos或者tomcat这类容器中的,结果我就一直在试图single one解决这个问题。
其实,还有另外种方法,因为我昨天写了个添加数据库记录的service,所以要写个main方法来测试,因为没有jboos容器,一直测试不成功也解决不了jndi的调用问题,到了将近两点,已失败告终。
后来打车回家时候我在想,不应该用N多个小时来解决jndi的调用,没有求助环境,我可以先把其他的service写好,总结好遇到的问题,等到第二天上班有了同事在的时候再统一求助,这样时间规划上就会比我现在的情况要好的多。
以此为例,与大家共勉。
在时间安排上各位有什么好的建议,咱们也可以共同交流。
针对于上周风控二期项目出现问题的总结
上周的风控二期项目算是暂时的小夭折了,原因是因为需求不明确,经过梁川的分析,我总结出如下几点和大家共勉:
1.首先要做好、做精自己的工作,我理解自己的工作是本职工作,是所有向上发展的基础和本钱,所以这个首当其冲的要做好。
2.在本职工作做好以后,可以考虑做(学习)一些跟自己发展方向相关的工作,比如我想往项目管理方向发展,我就可以做一些需求分析或者设计分析的工作,但是有一点要注意,在做这些工作的时候要多和有经验的同事、领导进行交流沟通,因为他们会对你给出发展的建议,并且在你学习这些的时候使你少走弯路,试问,谁不想快速、正确、有效的发展呢?
3.要时刻保持清醒的头脑,这个我举例来说明,就拿这个风控二期的项目来说吧,由于需求之前没有形成书面的可读的文档,所以蔡柯要我总结一下需求分析,我个人对需求分析也是很感兴趣,于是就很高兴的接受了工作,做了一周的需求分析,等到梁川看到的时候,发现所做的文档并不具有很好的可读性,而且也浪费了工作时间。
如果在接受任务之前,可以自己的想想,我现阶段的主要目标是什么,目标之一是快速对java项目上手;再或者,接受之后,可以找有经验的同事、领导进行沟通和辅导,就不会出现上面所说的问题。
所以我觉得,做自己感兴趣的工作是好事,有机会做自己感兴趣的工作或者对自己发展相关的工作是好的机会,但是不要被这种好事和好机会冲昏头脑,时刻清楚自己的目标,自己的能力,才能更有效的利用时间和机会来提高自己。
——————————–
另外,对整个团队而言,在这次项目中也出现了两点很重要的问题,谢谢梁川的提醒:
1、 对协作和主动的正确理解:原来大家理解的产品提不清楚需求就由技术来代劳的思路是不正确的。协作首先意味着团队的合作,要主动去帮助协作的伙伴去一起去成长,这样才能够长远发展。
这点所犯的问题体现在这个项目上的是:产品没有形成可读的需求文档,而做为技术的我们没有要求产品出需求文档,反而是我们来做,所以这点的弊端就和梁川所说的吻合,有可能我们是在“帮助”,但是这样的“帮助”并不会对团队中的伙伴成长起到任何左右,有可能反而助长了惰性,而且,也耗费了我们做为技术的开发时间,这是件很可怕的事情,在今后的工作中必须要避免。
2、 要及时向主管反馈工作进度及需要的帮助,让主管协助协调资源,而不是闷头就做。
这点我的理解是:做一项工作尤其是一项工作的周期比较长的时候,会体现出与主管随时沟通的必要性,让主管随时了解到你的工作动态,有可能有由于自己的经验、对业务的理解认知,或者看问题的角度等因素,看不到潜在的问题,但是主管可以帮助提早发现并解决,在工作开展以及时间上就可以争取主动。
DB2 sql除法运算结果为小数时显示0的解决方法。
今天在DB2下写sql的时候遇到了这样的一个问题,
【分享点1:】
SELECT field1/field2 FROM TB;
当 field1的数值 > field2的数值时,除法得出的结果是<1的,即0.xxxxxx
这个时候在DB2的环境下SELECT出来的值是0
这个有两个解决方法
方法1:
DB CFG的一个参数MIN_DEC_DIV_3,这个参数在GET DB CFG FOR DB中并不会列出,但却可以修改。
数据库配置参数MIN_DEC_DIV_3会更改涉及小数的十进制算术运算的结果小数位。
默认值为No,则小数位计算为 31-p+s-s'。
如果设置为Yes,则小数位计算为 MAX(3, 31-p+s-s')。
这会导致十进制小数部分始终至少具有3位的小数位。精度始终为31。
这个方法貌似需要通过DBA对数据库进行设置,不太靠谱儿,有另外一种方法可以曲线救国,登场:
将sql语句修改为:
1 | SELECT CAST(field1 AS DOUBLE)/field2 FROM TB; |
就是先把field1转换成DOUBLE类型的,这样计算出来的就会得出小数点了,会显示出0.xxxxxx
【分享点2:】
额,接下来,需要对得出的小数点位数进行约束,那就用四舍五入吧,
1 | SELECT ROUND(CAST(field1 AS DOUBLE)/field2, 2) FROM TB; |
这个意思就是说四舍五入,保留两位小数点
【分享点三:】
但是如果field1或者field2有一个字段为NULL的话,那么结果为NULL,这个时候根据逻辑需要进行如下的一个操作,
如果数据列的值为NULL,将其设置为0,那么sql就要这么写
1 | SELECT ROUND(COALESCE(CAST(field1 AS DOUBLE), 0)/field2, 2) FROM TB; |
COALESCE这个函数系统的用法如下:
a. 输入参数为字符类型,且允许为空的,可以使用COALESCE(inputParameter,”)把NULL转换成”;
b. 输入类型为整型,且允许为空的,可以使用COALESCE(inputParameter,0),把空转换成0;
c. 输入参数为字符类型,且是非空非空格的,可以使用COALESCE(inputParameter,”)把NULL转换成”,然后判断函数返回值是否为”;
d. 输入类型为整型,且是非空的,不需要使用COALESCE函数,直接使用IS NULL进行非空判断。
好,就这么多了,OVER。。。
参考:
DECIMAL数据类型相除后的精度和小数位和数据库配置参数
www-01.ibm.com/support/docview.wss?uid=csc1a671ee5bc525954a4825711c002d4edb
min_dec_div_3 - 十进制分隔小数位为 3 配置参数
publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0004470.htm
windows+apache安装awstats
由于需要,需要在一台windows服务器上安装日志统计工具,自然而然的就想到了awstats。
以前有做过在linux下配置awstats,这次再试试windows的。。。
首先需要下载几个工具,当然都是运行在windows平台的。
perl5
cronolog
awstats
下载地址分别为:
perl5: www.activestate.com/activeperl/
cronolog: cronolog.org/download/index.html
awstats: awstats.sourceforge.net/#DOWNLOAD
好,先安装perl5,然后从cronolog的压缩包中把cronolog.exe提取出来,
解压缩awstats压缩包,放到你想要的目录中留待备用。
Read more »


我的简介: 谁说tmd巨蟹座傻来的?我就是tmd巨蟹里边儿最聪明的!!!