数据加载中……

2007年10月5日

俄文网站出现乱码解决方法

有access数据库的俄文网站出现乱码的解决方法
2008年12月12日 星期五 18:34

最近站长解决了此问题,做俄文网站,后台添加数据的时候,必须做俄文版的后台,中文版的后台写数据,时候前台显示肯定会出现乱码,俄文版后台最前面必须加<%@ codepage=866%> 866代表俄文的,下面还有几种代表方式

< %@ codepage=65001%>UTF-8
<%@ codepage=936 %>简体中文
<%@ codepage=950%>繁体中文
<%@ codepage=437 %>美国/加拿大英语
<%@ codepage=932 %>日文
<%@ codepage=949 %>韩文

codepage指定了IIS按什么编码读取。
例如采用UTF-8编码,就在文件的最上面加上 <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
例如采用GBK编码,就在文件的最上面加上 <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

管理后台还要加上<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>

这一句,不然部分代码会出现乱码.

本站站长解决了此问题供大家参考.

posted @ 2010-07-15 17:16 flyleer 阅读(1622) | 评论 (2)编辑 收藏
软件项目管理实践之日计划(转载)

软件项目管理实践之日计划

 袁光东 原创

如何提高项目的生产率,保证项目按期交付是每个软件开发项目经理都需要面对的难题。关于这方面的研究,在《人月神话》、《人件》等书籍都有很详细的论述。研究表明,不同程序员之间的生产率最高差别在40倍以上。虽然笔者没有亲睹这种样例,但是笔者的开发和管理生涯中所发现的相同技术水平程序员之间的生产率最大差距可达4倍。这个数据就发生在笔者的一个项目中,这让笔者感到非常的震惊。如果说40倍的生产率差距可能会有技术能力、工作经验、熟悉程度诸多因素的影响。那么,笔者所发现的4倍生产率差距却更让笔者感到不可思议。

案例

    程序员J:四年开发经验

    程序员L:三年开发经验

    程序员Y:五年开发经验

    技术能力:Y > J > L

    J,L,Y同时进入一个项目组,开发时间为30个工作日,即6周,包括需求分析、设计、编码和集成。其中编码和单元测试时间为10个工作日(2周)。产生的工作绩效为:

 

程序员 规模(代码行)
J 1500
L 3600
Y 6000

    可见,当程序员的技能达到一定水平后,技能与生产率并不成正比,并不是技术水平越高的程序的生产率越高。

一、最后期限

    很多程序员都会有类似的经历:

    1月1日,项目经理说:“小张,在1月5日之前把这项工作做完,详细的需求文档我已经发到你的邮箱中。”

    1月1日,小张对需求文档瞥了几眼,估计2天就可以完成,嘀咕:“现在才是1月1日嘛。这项任务要1月5日才提交。我还有时间,不用管它,还是先看我的小说吧。”

    1月2日,小张继续看他那心爱的小说......

    1月3日,小张继续看他那心爱的小说......

    1月4日 9:00,小张开始看需求文档,2小时后中断,因为他需要修复系统的一个Bug。

    1月4日 18:00,小张正在埋头苦干,因为明天就要提交工作,可是一个代码还没有写呢。

    1月4日 23:00,小张完成大部分工作,下班走人。

    1月5日 9:00,项目经理问:“小张,那个功能做完了吧?”小张答道:“就快了,今天提交没有问题。”

    1月5日 14:00,小张发现有一部份代码需要重写。用户的要求是需要一个可配置的功能,而小张却写成了硬代码。

    1月5日 17:00,项目经理来到小张面前:“小张,你中午不是说今天提交没有问题吗?怎么现在还没有看你提交代码?”小张委屈地答道:“经理,遇到一点小麻烦。不过相信我,下班之前一定完成。”

    1月5日 18:00,项目经理急匆匆赶到小张的座位旁:“小张,请马上提交代码,不然就来不及了。”小张这时也急了:“你不要催我。这个功能麻烦大了,没有想象得那么简单。我今天晚上得加班。”项目经理无可奈何地走了。小张加班到凌晨1点。但程序还是有一些问题。

    1月6日,小张仍然在修改程序......

    1月7日,小张仍然在修改程序......

    1月8日,总算是修改完成。已经拖了三天,来不及测试,只能匆匆把代码提交。

    后来,又经过5次修改,直到1月20日,这个功能总算是彻底完成。

    小张向项目经理请了一周假。因为这两周来几乎每天晚上都是加班解决问题。

    许多的程序员还会有这样的经历:

    4月1日,项目经理:“小王,这个功能交给你,需求你看了吗?你看需要多长时间完成?”

    小王:“哦,经理,这个功能我刚看过,大约需要1周时间。”

    项目经理:“那就是4月5日可以提交啦?”

    小王:“是的,经理。这个功能内容很多,还要实现一个邮件功能,4月5日能提交已经是我的极限了。”

    项目经理:“那就4月5日吧。”

    4月2日,小王发现:系统中已经有一个类似的邮件功能,直接使用就可以。

    4月2日 18:00,小王已经把功能都完成了。

    4月3日 9:00,小王把功能都测试通过,并且还私下请用户帮他进行测试通过。

    4月3日 11:30,项目经理:“小王,那个功能做完了吗?”

    小王:“经理,正在做呢。你看,昨天你又叫我修改另外一个Bug。不过,经理你放心吧,4月5日一定可以提交。”(小王已经做完工作,但声称没有做完。)

    4月4日,小王专注的看着一本电子书,名字叫《The Deadline》。

    4月5日 15:00,小王把代码提交,并向经理发邮件,主题是:XXX功能已经完成。

    4月6日 9:00,项目组开会,项目经理表扬了小王,要求大家向小王学习。因为这次发布只有小王按时完成了工作。

    简直不可思议,我们的程序员就是这样工作的。是的,我也认为不可思议!可是哪个程序员敢保证自己没有这么干过呢?这就是所谓的最后期限:人们总是在最后期限才开始工作

二、热衷于加班

    在所有的软件项目组中,加班已经成了天经地义的事。甚至有些管理层认为,如果一个项目组不加班,说明项目组没有尽全力的去做事。我至今不明白这是什么道理,工作是否尽力与加班到底有何关系?工作的绩效又与加班有何种关系?

    在笔者的项目组中,笔者的客户方也曾对笔者要求项目组必须加班,遭到了笔者的拒绝。在保证每个阶段在不加班的情况下按期完成,客户方才勉强同意。事实证明,不加班也是可以把项目做完的,而且可以做得更好。

    在我的程序员生涯中,曾经两次长达4个月的封闭开发期,被要求每天从19:00-22:00集体加班。但实际情况是,每天都可能要在23:00之后才可以下班。因为项目经理没有走,所以其它开发人员也只能留下。痛苦的是,我在那段加班时间里除了看技术电子书外,找不到任何可做的事情。我相信,当时项目组有太多的人跟我一样。当我每天23:00回到宾馆时,已经完全麻木了。我无时不想那该死的项目早一天结束。在那段时间里,我最大的收获时进行了大量技术积累。项目结束时,我的加班记录累计长达30人天。

    甚至有些程序员在正常的工作时间里也是不做事的,下班前开始忙碌,加班干活。想想这样的加班又有什么效果呢?

三、工作成熟度与团队成熟度

    因此,我一直致力于研究提高个人工作绩效的方法和提高项目组工作绩效的方法。

    在长期的学习、摸索、实践中,我发现全心的投入工作,干好4个小时就足以把工作做好。这种全心投入产生的绩效要比以前一周所干的还要多。如果每天努力干好8个小时,你会比周围的人产生2倍以上的绩效,当然也会非常疲惫。

    在管理一个40人规模的团队时,我每天投入仅仅4个小时就足够。为什么会有这么高的工作效率?主要是长期坚持下面的方法:

    1.日计划,列出工作清单(列出当天需要做的事情)

    2.为任务划优先级(标出当天必须完成的事情)

    3.只做最重要的事情,而不是最紧急的事情

    4.绝不拖延,计划当天必须完成的事情就一定要做完才走。

    笔者长期以来在思考,这个方法能否帮助团队提高工作绩效?能否让项目组提高生产率?能否使项目按期交付和提前交付?能否帮助程序员在不加班的情况下把项目做好?

    在笔者带项目和监控项目的过程中发现,程序员工作效率不高的原因除了技能因素外,还有几个重要的因素在影响着程序员的工作绩效:

    1.工作无计划:很多程序员根本不知道每天要做哪些事情,每天必须做完哪些事情。很少有程序员对当天的工作进行计划,

    2.工作无重点:很多程序员通常按事情发生的先后顺序来做事。有时,有些程序员忙碌了一天下来却发现当天其实没有做什么有用的事情。

    3.工作无目的:程序员不知道当天要把事情做到什么程度,完全是凭心情做事,凭良心做事。事情没有做完,别人下班自己也跟着下班,认为反正明天还有时间,还没有到最后期限。

    4.工作不到位:工作起来总是觉得差不多就行。把代码写完和功能能够运行当作两回事情。工作到位就是一次就把工作做好,达到可交付。

    5.工作无积极性:被动式工作,就算工作做完也不提交,一定要等到最后期限才提交。如果比承诺时间提前提交工作,马上就会带来新的工作,多干和少干一个样,谁愿意多干呢?

    我们可以提出一个概念叫做“工作成熟度”。工作成熟度高的程序员通常会有计划性、工作有重点、有目的性、工作做到位。而成熟度低的程序员通常是无计划的,工作不分轻重,很容易被突发事件打断当前工作,工作要通过多次修改才能够完成。所以,我发现,工作成熟度对程序员生产率造成最直接的影响。

    笔者在监控项目的过程中也发现造成项目组效率低下、进度落后的一些因素:

    1.项目经理不了解项目当日状态。是的,有些项目经理根本不知道今天每个程序员会干些什么?该干些什么?

    2.项目经理不了解项目实情。没错,项目经理根本就不知道每个程序员当天干了多少活,干到什么程度,还要干多久?也就不知道项目到了什么程序,还有多少工作量要做?

    3.项目经理不知道每个人是否能够按期交货。项目经理只能是望天收成,期望程序员凭良心、凭职业道德做事。但是,至于程序是否能够按期交货,只有鬼才知道。

    4.项目经理不知道工作的重点是什么?哪些工作是本阶段必须要完成的?哪些是可以拖后的?

    5.不良沟通。项目组的沟通不良,产生大量重复代码。甚至会有两个程序同时开发一个功能,但是彼此间却不知道。

    6.信息不能共享。程序员彼此之间不知道别人干得怎么样?也不知道项目整体情况到底怎么样?这也难为程序员了,因为项目经理也不知道。

    糟糕的项目都存在着一个黑洞。通常会是在编码阶段,整个项目组就像在黑洞中穿行一样,谁也看不清对方,不知道黑洞的尽头在哪里,谁也不知道走过多少地方,还要多久才能走出黑洞。总之,项目经理只能拼命的喊:“快点,快点,兄弟们,我们的时间不多了。”所以,项目经理只能让所有的人每天加班,星期六不能休息,到最后,星期天也不能休息。

    这就是我们可以提出的另一个概念——“团队成熟度”。

    “噢,伙计,我已经听烦了。好像是有那么回事!可是又能怎么样呢?所有的项目不都是这样过来的吗?”

四、日计划做什么?

    程序员的工作成熟度直接影响了程序员的生产率;项目的团队成熟度直接影响了项目的生产率。如果我们能够提高程序员工作成熟度和团队成熟度,就一定可以提高项目的生产率。

    而程序员工作成熟度和项目团队成熟度的共同核心点就是计划。在笔者的研究和实践过程中,可以通过在项目中实施日计划来提高程序员的工作成熟度和项目的团队成熟度,从而提高程序员的生产率和项目的生产率。

    实施日计划的流程:

    1.每天8:30-8:35,项目组召开晨会。由项目经理列出每个开发人员的工作清单,并对每个工作任务标注优先级别,设定任务完成的标准,指明当日必须要完成的任务,并得到责任人的承诺。

    2.每天下班前20分钟,由项目经理依次检查开发人员的工作。评定工作是否完成。如果有开发人员未能完成任务,一起分析任务未能完成的原因。然后召开一个简单的会议,介绍当天工作的完成情况及当前阶段的项目状态,未完成任务的开发人员需要加班完成。

    每天早晨的会议我们称之为晨会,下午的会议称之为夕会。

    日计划的实施环节:设定目标,制定计划,检查,反馈。

    日计划的特点:

    1.开发人员每天在晨会承诺完成的任务必须当天完成,提倡日清日结。

    2.提交可交付的成果。(事先制定任务完成的标准,并由项目经理进行检查,评定任务是否完成。)

    3.做最重要的事情

    4.保证把工作做完

五、我们是怎么实施日计划的?

    日计划看起来非常简单,下面我们将对日计划的实践进行讨论。

    1.实施日计划对项目有什么作用?

    · 实施日计划,使项目有良好的沟通机制。每个开发人员都非常清楚项目的当前情况:项目已经完成了多少?还有多少工作没有完成?

    · 日计划提倡可交付的成果,也就是每天完成的工作都一定是可交付的。

    · 日计划提倡只做最重要的事情,使项目抓住了重点。

    · 项目经理通过实施日计划,非常清楚每个开发人员每天需要完成哪些任务,每天必须完成哪些任务,以及每个人的完成情况怎么样?项目经理充分地掌握了项目的情况,可以及时调整计划,应对各种变化。

    · 日计划实现了项目的良好沟通,每项任务都由开发人员和项目经理达成一致。

    · 日计划通过晨会和夕会实现了项目组的信息共享。

    2.实施日计划对程序员的作用

    · 日计划列出了程序员每天要做的任务清单,并且对任务确定优先级。

    · 对程序员的工作指明方向,并且要求程序员优先做最重要的任务,使程序员抓住了工作重点。

    · 日计划要求提交可交付的成果,要求程序员把工作一步要做到位,养成良好的习惯。

    · 日计划提高了程序员的工作绩效,程序员可以回到正常的工作时间,减少无谓的加班。

    · 程序员比以前完成更多的工作而获得奖励。

3.在实施日计划时,与传统项目管理的工作分配有什么不同?如何进行工作分配?

    传统项目管理的工作分配中,工作项的粒度比较粗。每一个工作项通常指一个功能。通常是把一个功能分给某程序员,甚至把一个模块分派给某个程序员。工作项的工时以周为单位,通常是一周或者两周。

 

传统项目管理任务分配表
模块 功能  当前状态 计划开始 计划结束 实际开始 实际结束 责任人
订单管理  订单信息查询 已开始 2009-3-1  2009-3-7 2009-3-1    L
新增订单 已开始 2009-3-1  2009-3-7 2009-3-1    L
订单管理 修改订单 未开始 2009-3-1  2009-3-7     L
删除订单 未开始 2009-3-1  2009-3-7     L

    实施日计划的工作分配中,“工作项”的粒度更小。如果按照XP和Scrum的说法,功能就是指一个“故事”,完成“功能”的步骤或事件叫“任务”。

    传统项目管理的任务分配是以“故事”为最小粒度。日计划的任务分配是以“任务”为最小粒度。“任务”是指完成某一个“功能”的步骤或事件。每个人当天的任务工时总合为1人天。

    故事和任务的区别:

 

故事
任务
订单信息查询
DAO编码
DAO单元测试
业务层编码
JSP表示层编码
集成测试

    要实现订单信息查询就由右边的那些任务组成。

    开始,我不知道怎样来描述一个“功能”和实现一个功能细化的“任务”。后来,当我看到Scrum的书籍后,看到Sprint和任务板时,才知道自己的实践与Scrum的某些实践竟有如此相似之处。我困惑很久,想不到用什么词来表示一个“功能”和实现一个功能所需要的“步骤”。Scrum使用“故事”和“任务”来定义它们,我认为非常的准确到位。

    但是日计划的工作分配与Scrum的工作分配是不同的。实施日计划是由项目经理主导的;而Scrum强调由程序员主导。至于这两种方式,哪一种更好。我觉得可以结合具体的情况进行不同的实践。

    如果是程序员成熟度比较高的项目,可以由程序员来主导。程序员成熟度较低和工期很紧的项目,可以由项目经理来主导。总之,这都需要程序员和项目经理达成一致。程序员需要向项目经理承诺。

    Scrum会对每个任务进行事先估算,而日计划分配工作任务前才会进行估算,并且只为每个人分配工作量为1人天的任务总和。

 

日计划样例:2009-3-22程序员L工作计划
开发人员  今日计划工作及完成情况
序号 工作任务 优先级 完成标准 是否完成 完成百分比 完成情况 未完成原因 检查人
L 1 订单管理模块DAO实现 50 单元测试通过          
2 与用户确认页面原型 10 用户确认邮件          

    程序员L任务1的优先级为50,任务2的优先级为10。这并不表示两个任务的重要程度相差40,而是表示L当天应该先做任务1,再做任务2。

    笔者认为这种日计划更加灵活。因为项目经理可以灵活的设置任务。Scrum的任务都是依据故事。日计划甚至可以把与开发根本不相干的事情包括进来。

    当天要完成哪些任务是由项目经理先计划的,但是程序员可以提出不同的意见。双方达成一致。并且任务是可以量化和检查的。因此,事先还要设置完成标准。一旦程序员与项目经理达成一致,就相当于程序员向项目经理承诺,今天可以完成这些任务。

    对于成熟度比较高的程序员,完全可以由程序员先提出计划。然后,由项目经理进行评估和检查。双方达成一致后,就把任务放入日计划的工作任务表中。

4.为什么要检查?怎么进行检查?

    如果没有检查,计划就是无效的。

    日计划强调提交可交付的成果。虽然事先制定了标准,但是程序员和项目经理可能会对可交付成果的理解不同。项目经理如果要清楚地了解到项目状况就必须要亲自进行检查。

    如何进行检查?项目经理一定要在现场工作,最好的办法就是让他演示给你看。对于不能演示的任务就进行抽查。因为事先已经制定完成标准,大家只需要按规矩办事即可。

    并且一定要填写完成情况,以便后期的跟踪。

    5.如果程序员不能完成日计划怎么办?如何才能够使程序员能够完成日计划?

    程序员不能完成日计划时,也就是进度出现了偏差。项目经理一定要与程序员一起分析偏差的原因,并记录下来。进度发生偏差最有可能的两个原因:计划不合理和计划执行不力。

    计划不合理包括:对任务的难度和工作量估算失误,对程序员能力的估算失误,或者程序员的工作方法存在问题,需要支持和协助等。

    如果是对任务估算发生失误,就需要重新进行估算。这正是日计划和检查带来的好处。项目经理需要重新调整计划。

    如果是对程序员能力估计失误,项目经理也需要重新进行调整,如换人,或延长时间。

    如果是程序员工作方法存在问题,就一定要进行指导,或者安排其它人员进行协助。

    如果是计划执行不力,也要找到最核心的原因是什么?是意愿不高?中间去做其它事情?工作习惯如此?都需要找到核心原因,方可对症下药。

    在我的团队中,绩效考核的几个核心指标:工作效率*工作效果*工作量

    不能完成日计划,会直接影响到月底的绩效和奖金。

    如何才能够使程序员完成日计划?首先是计划一定要合理,要考虑到个体差异,分配任务在其能力范围之内。日计划一定要获得当事人的承诺。检查和跟踪一定要到位。要与考核挂勾,做到会得到什么?做不到会有什么后果?

    六、没有银弹

    是的,没有银弹。没有任何一种方法可以保证项目一定能够成功。日计划也一样。目标、计划、执行、控制构成管理的核心。所谓工作成熟度和团队成熟度其实都可以归纳为“执行力”。日计划只是一种管理实践,在不同的环境可能会有不同的实践方法,并不是一层不变的。

posted @ 2010-03-24 17:29 flyleer| 编辑 收藏
Oracle创建数据表空间,用户,授权,表,索引,簇(2008-07-26 22:38:59)

//创建临时表空间(日志文件)
create temporary tablespace test_temp
tempfile 'E:\oracle\test_temp01.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;

//创建数据表空间
create tablespace test_data
logging
datafile 'E:\oracle\test_data01.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;

//创建用户并指定表空间
create user 用户名 identified by 密码
default tablespace test_data
temporary tablespace test_temp;

//给用户授予权限

grant connect,resource to 用户名

————————————————————————————————————

create cluster s_t_cluster(tid number(8));--创建索引簇
----------------------------------------------------1
--建立簇表stu
create table stu(
       tid number(8),
       sname varchar2(50),
       sinfo varchar2(50),
       constraint pk_tid primary key(tid)
)cluster s_t_cluster(tid)
--建立簇表sc
create table sc(
       tid number(8),
       score number(8),
       constraint fk_tid foreign key(tid) references stu(tid)
)cluster s_t_cluster(tid)
------------------------------------------------------2
--建立簇索引
create index s_t_idx on cluster s_t_cluster;
------------------------------------------------------3
--插入数据
insert into stu(tid,sname,sinfo)values(1,'haha','usa');
insert into stu(tid,sname,sinfo)values(2,'gaga','Japan');
insert into sc values(1,90);
insert into sc values(2,85);
--查询
select s.sname,s.sinfo,i.score from stu s,sc i where s.tid=i.tid
--建立序列
create sequence stu_SEQ
minvalue 1
maxvalue 99999999
start with 3
increment by 1
cache 20;

--用命令插入N条数据往表stu
declare
x number;
begin
  for x in 1..100000 loop
    insert into stu values(stu_seq.nextval,'名字'||x,'地址'||x);
  end loop;
end;
---------------------------------------------
--用命令插入N条数据往表sc
declare
x number;
begin
  for x in 1..10000 loop
    insert into sc values(sc_seq.nextval,x+50);
  end loop;
end;
---------------------------------------------
--查询
select s.sname,s.sinfo,i.score from stu s,sc i where s.tid=i.tid--未加索引时的普通查询太慢了
--使用索引簇查询
select s.sname,s.sinfo,i.score from stu s,sc i where s.tid=i.tid

————————————————————————————————————————

//创建表,序列号(sequence)

create table test1(
       tid number(8),
       tname varchar2(50),
       tbd date,
       constraint pk_tid primary key(tid)
)
select * from test1
==============================================================
create sequence test1Seq --自定义的序列名
increment by 1           --每次加几个,即递增的间隔
start with 1             --从1开始计数
nomaxvalue               --不设置最大值
nocycle                  --一直累加,不循环
cache 10;
==============================================================
insert into test1(tid,tname,tbd)values(test1Seq.Nextval,'ccc',sysdate);

posted @ 2009-03-19 20:13 flyleer| 编辑 收藏
sybase的问题

      近来在做sybase的性能调试,发现我启动多线程的时候,线程会处于lock sleeping。 刚开始还以为是数据库不支持并发访问,后来想想真幼稚。。原来是我在做并发插入数据的时候,该表的锁设置为全页加锁了。 后来设置为数据行锁,这样才可以执行并发操作的测试。 但是后面又遇到一个问题,就是out of lock的问题,也就是ASE设置的锁不够用。如果是在windows下的话,可以用ASE的补助工具修改number of locks来增加更多的锁,因为设置的是数据行锁,所以,在执行Insert的时候,如果不提交事物的话,就会每一条数据加一个锁。。在增加锁的时候,必须要增加内存,也就是增加max memory。。大概一个锁占据的内存是120byte。 如果是在Linux系统的话,就修改“服务名.cfg“文件。 
     1、全页锁(allpages lock) 对查询的表及索引页加锁,也就是table lock 
       2、页锁  (data lock)     对所查询的结果所在页加锁,对索引不加锁 
    3、行锁  (row lock)      对某行数据加锁

  sybase除非对配置参数加以特定,对所有的表都予置了隐含的全页面加锁机制。

sp_configure ‘lock scheme’, [allpages | datapages | datarows]

  当数据库从原先版本的服务器中转储出来重新加载时,所有的表都被定义为全页面加锁的表。当建立一个新表时,可以不使用这个缺省值,可采用如下的句法格式:

create table <tablename>;… lock [allpages | datapages | datarows]

  为了在使用的一个表中改变加锁类型,可以采用如下的句法格式:

alter table <tablename>; lock [allpages | datapages | datarows]

posted @ 2009-03-07 15:27 flyleer| 编辑 收藏
oracle 在Linux 自启动方法

1、 修改Oracle系统配置文件/etc/oratab

/etc/oratab 格式为: SID:ORACLE_HOME:AUTO

把AUTO域设置为Y(大写),只有这样,oracle 自带的dbstart和dbshut才能够发挥作用。我的为:

TestDB:/home/oracle/product/10.2.0:Y(以oracle 10为例子)
        2、 编写服务脚本:
        如下:

 

#!/bin/bash

#

#################FUNCTION#############

#

# AutoStart Oracle and listener

# AutoStop Oracle and listener

#

#####################################

#

# Created by ZhouYS 2003-11-26

#

case "$1" in

start)

echo "Starting Oracle Databases ... "

echo "-------------------------------------------------" >> /var/log/oracle

date +" %T %a %D : Starting Oracle Databasee as part of system up." >> /var/log/oracle

echo "-------------------------------------------------" >> /var/log/oracle

su - oracle -c "dbstart" >> /var/log/oracle

echo "Done."

echo "Starting Oracle Listeners ... "

echo "-------------------------------------------------" >> /var/log/oracle

date +" %T %a %D : Starting Oracle Listeners as part of system up." >> /var/log/oracle

echo "-------------------------------------------------" >> /var/log/oracle

su - oracle -c "lsnrctl start" >> /var/log/oracle

echo "Done."

echo ""

echo "-------------------------------------------------" >> /var/log/oracle

date +" %T %a %D : Finished." >> /var/log/oracle

echo "-------------------------------------------------" >> /var/log/oracle

touch /var/lock/subsys/oracle

;;

stop)

echo "Stoping Oracle Listeners ... "

echo "-------------------------------------------------" >> /var/log/oracle

date +" %T %a %D : Stoping Oracle Listener as part of system down." >> /var/log/oracle

echo "-------------------------------------------------" >> /var/log/oracle

su - oracle -c "lsnrctl stop" >> /var/log/oracle

echo "Done."

rm -f /var/lock/subsys/oracle

echo "Stoping Oracle Databases ... "

echo "-------------------------------------------------" >> /var/log/oracle

date +" %T %a %D : Stoping Oracle Databases as part of system down." >> /var/log/oracle

echo "-------------------------------------------------" >> /var/log/oracle

su - oracle -c "dbshut" >>/var/log/oracle

echo "Done."

echo ""

echo "-------------------------------------------------" >> /var/log/oracle

date +" %T %a %D : Finished." >> /var/log/oracle

echo "-------------------------------------------------" >> /var/log/oracle

;;

restart)

$0 stop

$0 start

;;

*)

echo "Usage: oracle {start|stop|restart}"

exit 1

esac


       将脚本命名为oracle,保存在/etc/rc.d/init.d下。
       
        3、建立服务连接:

系统启动时启动数据库,我们需要以下连结∶

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

$ ln -s ../init.d/oracle /etc/rc.d/rc2.d/S99oracle

$ ln -s ../init.d/oracle /etc/rc.d/rc3.d/S99oracle

$ ln -s ../init.d/oracle /etc/rc.d/rc5.d/S99oracle #rc4.d unused

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

要在重新启动时停止数据库,我们需要以下连结∶

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

$ ln -s ../init.d/oracle /etc/rc.d/rc0.d/K01oracle # 停止

$ ln -s ../init.d/oracle /etc/rc.d/rc6.d/K01oracle # 重新启动

转贴于:Oracle认证考试_考试大    

posted @ 2008-12-26 11:54 flyleer| 编辑 收藏
井底之蛙

        最近闲来无聊,搬来同事的讲JDK6.0的书翻翻。。 感触很多,一直都听到什么JDK的一些新特性,自己也用过。但是一直不知道到底引入了哪些新特性,直到今天看了书,才知道。。唉,得鄙视下自己。。 不过看书,实在无聊,好想瞌睡。HOHO。
        还是把新特性列下,免得自己以后又不记得了。。
        1.诊断能力:这个到底有啥用,搞不很懂。。 大概是当我们的程序要生成堆栈追踪信息的时候,如果没有控制台窗口的时候,可以自己声明试采用程序来编辑而获得这些信息。。
        2.Annotation:这个到是用到过,知道是注释。它的作用是:提供了一个连接附加数据到Class,Interface,Method和Field中的能力。使用它的目的是使我们的开发和运行工具得到一个基础框架,以减少编码和发布程序时所需的额外的工作。
        3.泛型:这个用的比较多。在集合框架中经常用到。主要是使代码看上去更舒服。呵呵,节省不必要的类型转换。。
        4.自动装/拆箱:这个就是用在JAVA中的基本类型和封闭类之间的转换。。也是使代码看上面简洁。减少类型的转换。。
        5.静态引入:这个好像头一次看。。呵呵,试了一下。真的可以。。HOHO,看来我真的孤陋寡闻啊。  看来以后的代码中如果很多地方用到了静态类的属性的话,可以直接导入这个类了。。也可以减少一点代码。。不过想想其实也差不多。。
        6.格式化输入/输出:现在JAVA也可以像C语言一样使用printf打印输出信息了。其输出格式基本相同。这个我还没用过, 不过知道是比如:
   System.out.printf("%d和%f",m,n);这里告诉m,n必须是整型和浮点数。。
        7.参数数量的可变:这个是说可以向一个方法传入多个不定数量的参数,可以简单的使用...来表示一个方法接受不定数量的参数。
        8.并行工具包:这个是指提供了一个功能强大的、高层次的线程构造器。例如:线程任务框架,线程安全的队列,计时器,锁和其他的一些同步的基本类型。

posted @ 2008-12-08 16:01 flyleer 阅读(76) | 评论 (0)编辑 收藏
几种类加载方式的区别

虚拟机加载类的途径:

1、Dog dog = new Dog();
这个动作会导致常量池的解析,Dog类被隐式装载。
如果当前ClassLoader无法找到Dog,则抛出NoClassDefFoundError。

2、Class clazz = Class.forName(“Dog”);
   Object dog =clazz.newInstance();
通过反射加载类型,并创建对象实例
如果无法找到Dog,则抛出ClassNotFoundException。

3、Class clazz = classLoader.loadClass(“Dog”);
   Object dog =clazz.newInstance();
通过反射加载类型,并创建对象实例
如果无法找到Dog,则抛出ClassNotFoundException。

那么,1和2和3究竟有什么区别呢?分别用于什么情况呢?

1和2使用的类加载器是相同的,都是当前类加载器。(即:this.getClass.getClassLoader)。
3由用户指定类加载器。

如果需要在当前类路径以外寻找类,则只能采用第3种方式。第3种方式加载的类与当前类分属不同的命名空间。
当前类加载器命名空间对其不可见。当然,如果被加载类的超类对于当前类命名空间可见的话,则可以进行强制转型。

第1和第2种情况区别不大。如果,Dog类在编译时无法得到,则使用第2种方式。

另外,第1种和第2种都会导致类被初始化,即:执行类的静态初始化语句,而第3种情况不会。
另外注意,第1种抛出Error,第2、3种抛出Exception,它们分属于不同的异常/错误分支。

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

对象实例化方式:
1、new Dog();
2、clazz.newInstance();或者clazz.getConstructor(...).newInstance(...);
3、Object.clone();//通过本地方法进行复制
4、反序列化 

posted @ 2008-11-25 14:38 flyleer| 编辑 收藏
linux问题

     最近在忙于在linux上面部署和发布项目。以前从来没有做过类似的工作,linux也是小白一个。。所以这次碰到的问题也很多。 不过还是学习了,一些比较简单的命令。。比如知道了怎么去解压.GZ文件。。tar zxvf %% ,mv 移动文件,rm 删除。。。强制删除:rm -rf 。。比如这些简单的东西。不过碰到一个问题,就是linux下面的定时任务。。在etc下面的crontab文件操作,怎么也不成功。。也调用了网上找的比如杀掉进程也不行:
[root@CHINASVRVM ~]# pkill crond
[root@CHINASVRVM ~]# pgrep crond
[root@CHINASVRVM ~]# /etc/rc.d/init.d/crond restart

这样做也不行,最后总算解决了。是使用crontab -e 这个命令是在里面定义任务。。这样才能正确执行。。HOHO.。

posted @ 2008-11-25 14:13 flyleer| 编辑 收藏
平淡

    前一段时间忙于找工作。总算那样的日子过了。。现在一切又趋于平淡。来到一家小公司,做的事,以前的公司也接触过。。也算是个金融行业吧。做的是IC卡。貌似很先进的东东。。虽然是个小公司,但是还是能够学到一点东西。。不过有时候还是很很纳闷,,不知道前进的路该如何去走,也不是特别喜欢技术,管理视乎也不行。。人生感觉很茫然。。 工资也这么低,出来也快2年了。一起出来的,很多都是5K多,多的甚至快上万了。可我还是4K多。。差距越来越大。唉。。有时候想起来真的要疯了。。 不知道明年自己可以拿多少。。

posted @ 2008-11-25 14:05 flyleer| 编辑 收藏
7.8面试

今天又去面试了。哎,现在都开始害怕面试 。自己技术太差了。。碰的问题,都回答不了。。
1.今天问了个对象实例化的几种方法,左想右想只知道new关键字。。。 后面问了别人才知道通过反射也可以。。。反射这个东西,倒是知道,但是在这个问题上,我确怎么也想不到。。还有种是类加载。实在是看不懂。。

第一种:

Test test=new Test();

第二种:

test=Class.forName(Test).newInstance();

第三种

String interceptorName="org.aaa.Test";
Class interceptorClass=Current.class.getClassLoader().loadClass(interceptorName);
Interceptor inerceptor=(Interceptor)interceptorClass.newInstance(); 


2.hibernate中session的get与Load方法的区别。。前一阵还记得,现在忘记。。 都不知道现在还记得些什么东西了。
(1)load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,在用到对象中的

其他属性数据时才查询数据库,但是万一数据库中不存在该记录,只能抛ObjectNotFoundEcception异常

,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这

个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下

session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有

对应记录存在就可以使用load方法来实现延迟加载。

(2)get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓

存中查找,还没有就查数据库,数据库中没有就返回null。

3.spring AOP中对pointcut,advice的概念的理解。。 这个我是根本就不知道啥玩意,只知道AOP的点点意思。。
4.hibernate的继承映射包含了哪几种不同的策略,并说出各自的特点。。HOHO。。这个问题,还是不知道。。以前读书的时候看过点点相关的内容,现在早就忘记的一干二净了。

posted @ 2008-07-08 16:51 flyleer 阅读(164) | 评论 (0)编辑 收藏
3.14 面试遇到的问题

   1.JDBC有几种驱动类型:  

     type   1:jdbc-odbc桥    
  type   2:本地api驱动    
  type   3:网络协议驱动    
  type   4:本地协议驱动    

Type   1:   jdbc-odbc桥    
     Jdbc-odbc桥是sun公司提供的,是jdk提供的的标准api.   这种类型的驱动实际是把所有jdbc的调用传递给odbc   ,再由odbc调用本地数据库驱动代码.(   本地数据库驱动代码是指由数据库厂商提供的数据库操作二进制代码库,例如在oracle for windows中就是oci   dll  文件)   

      jdbc-odbc桥 ---- odbc---- 厂商DB代码 ----- 数据库Server     
                                          (图一)    

        只要本地机装有相关的odbc驱动那么采用jdbc-odbc桥几乎可以访问所有的数据库,jdbc-odbc方法对于客户端已经具备odbc   driver的应用还是可行的.但是,由于jdbc-odbc先调用odbc再由odbc去调用本地数据库接口访问数据库.所以,执行效率比较低,对于那些大数据量存取的应用是不适合的.而且,这种方法要求客户端必须安装odbc   驱动,所以对于基于internet   ,intranet的应用也是不合适的.因为,你不可能要求所有客户都能找到odbc   driver.     

 Type   2:   本地Api驱动    
      本地api驱动直接把jdbc调用转变为数据库的标准调用再去访问数据库.这种方法需要本地数据库驱动代码.    
   
  本地api驱动----厂商DB代码-----数据库Server     

                                       (图二)     
         这种驱动比起jdbc-odbc桥执行效率大大提高了.但是,它仍然需要在客户端加载数据库厂商提供的代码库.这样就不适合基于internet的应用.并且,他的执行效率比起3,4型的jdbc驱动还是不够高.    
   
  Type3:网络协议驱动    
          这种驱动实际上是根据我们熟悉的三层结构建立的.   jdbc先把对数局库的访问请求传递给网络上的中间件服务器.   中间件服务器再把请求翻译为符合数据库规范的调用,再把这种调用传给数据库服务器.如果中间件服务器也是用java开发的,那么在在中间层也可以使用1,2型 jdbc驱动程序作为访问数据库的方法.    
   
  网络协议驱动---------中间件服务器------------数据库Server    
                                (   图三)    
   
         由于这种驱动是基于server的.所以,它不需要在客户端加载数据库厂商提供的代码库.而且他在执行效率和可升级性方面是比较好的.因为大部分功能实现都在server端,所以这种驱动可以设计的很小,可以非常快速的加载到内存中.   但是,这种驱动在中间件层仍然需要有配置其它数据库驱动程序,并且由于多了一个中间层传递数据,它的执行效率还不是最好.     

    
  Type4   本地协议驱动    
          这种驱动直接把jdbc调用转换为符合相关数据库系统规范的请求.由于4型驱动写的应用可以直接和数据库服务器通讯.这种类型的驱动完全由java实现,因此实现了平台独立性.    
   
  本地协议驱动---------数据库Server    
                     (   图四)    
   
         由于这种驱动不需要先把jdbc的调用传给odbc或本地数据库接口或者是中间层服务器.所以它的执行效率是非常高的.而且,它根本不需要在客户端或服务器端装载任何的软件或驱动. 这种驱动程序可以动态的被下载.但是对于不同的数据库需要下载不同的驱动程序.    
   
   
  以上对四种类型的jdbc驱动做了一个说明.那么它们适合那种类型的应用开发呢?Jdbc-odbc桥由于它的执行效率不高,更适合做为开发应用时的一种过度方案,或着对于初学者了解jdbc编程也较适用.  对于那些需要大数据量操作的应用程序则应该考虑2,3,4型驱动.在intranet方面的应用可以考虑2型驱动,但是由于3,4型驱动在执行效率上比2型驱动有着明显的优势,而且目前开发的趋势是使用纯java.所以3,4型驱动也可以作为考虑对象. 至于基于internet方面的应用就只有考虑3,4型驱动了.   因为3型驱动可以把多种数据库驱动都配置在中间层服务器.所以3型驱动最适合那种需要同时连接多个不同种类的数据库, 并且对并发连接要求高的应用.   4型驱动则适合那些连接单一数据库的工作组应用.

posted @ 2008-03-14 23:41 flyleer| 编辑 收藏
format

            今天项目中碰到一个科学计算法的问题,我保存到数据库的是数字,但是从数据库中取出来在页面展现的时候确变成了科学计算法的形式了。最后查了下,发现<bean:write/>里有个属性format="##.00"这样可以就正确显示保存的数字。因为我的涉及到小数点的问题,所以我保留了两位有效数字。

posted @ 2007-11-28 16:15 flyleer| 编辑 收藏
【转】js日期时间函数

Date.prototype.isLeapYear 判断闰年
Date.prototype.Format 日期格式化
Date.prototype.DateAdd 日期计算
Date.prototype.DateDiff 比较日期差
Date.prototype.toString 日期转字符串
Date.prototype.toArray 日期分割为数组
Date.prototype.DatePart 取日期的部分信息
Date.prototype.MaxDayOfDate 取日期所在月的最大天数
Date.prototype.WeekNumOfYear 判断日期所在年的第几周
StringToDate 字符串转日期型
IsValidDate 验证日期有效性
CheckDateTime 完整日期时间检查
daysBetween 日期天数差

js 代码
 
  1. //---------------------------------------------------  
  2. // 判断闰年  
  3. //---------------------------------------------------  
  4. Date.prototype.isLeapYear = function()   
  5. {   
  6.     return (0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0)));   
  7. }   
  8.   
  9. //---------------------------------------------------  
  10. // 日期格式化  
  11. // 格式 YYYY/yyyy/YY/yy 表示年份  
  12. // MM/M 月份  
  13. // W/w 星期  
  14. // dd/DD/d/D 日期  
  15. // hh/HH/h/H 时间  
  16. // mm/m 分钟  
  17. // ss/SS/s/S 秒  
  18. //---------------------------------------------------  
  19. Date.prototype.Format = function(formatStr)   
  20. {   
  21.     var str = formatStr;   
  22.     var Week = ['日','一','二','三','四','五','六'];  
  23.   
  24.     str=str.replace(/yyyy|YYYY/,this.getFullYear());   
  25.     str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear() % 100).toString():'0' + (this.getYear() % 100));   
  26.   
  27.     str=str.replace(/MM/,this.getMonth()>9?this.getMonth().toString():'0' + this.getMonth());   
  28.     str=str.replace(/M/g,this.getMonth());   
  29.   
  30.     str=str.replace(/w|W/g,Week[this.getDay()]);   
  31.   
  32.     str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0' + this.getDate());   
  33.     str=str.replace(/d|D/g,this.getDate());   
  34.   
  35.     str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0' + this.getHours());   
  36.     str=str.replace(/h|H/g,this.getHours());   
  37.     str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0' + this.getMinutes());   
  38.     str=str.replace(/m/g,this.getMinutes());   
  39.   
  40.     str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0' + this.getSeconds());   
  41.     str=str.replace(/s|S/g,this.getSeconds());   
  42.   
  43.     return str;   
  44. }   
  45.   
  46. //+---------------------------------------------------  
  47. //| 求两个时间的天数差 日期格式为 YYYY-MM-dd   
  48. //+---------------------------------------------------  
  49. function daysBetween(DateOne,DateTwo)  
  50. {   
  51.     var OneMonth = DateOne.substring(5,DateOne.lastIndexOf ('-'));  
  52.     var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ('-')+1);  
  53.     var OneYear = DateOne.substring(0,DateOne.indexOf ('-'));  
  54.   
  55.     var TwoMonth = DateTwo.substring(5,DateTwo.lastIndexOf ('-'));  
  56.     var TwoDay = DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf ('-')+1);  
  57.     var TwoYear = DateTwo.substring(0,DateTwo.indexOf ('-'));  
  58.   
  59.     var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)- Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000);   
  60.     return Math.abs(cha);  
  61. }  
  62.   
  63.   
  64. //+---------------------------------------------------  
  65. //| 日期计算  
  66. //+---------------------------------------------------  
  67. Date.prototype.DateAdd = function(strInterval, Number) {   
  68.     var dtTmp = this;  
  69.     switch (strInterval) {   
  70.         case 's' :return new Date(Date.parse(dtTmp) + (1000 * Number));  
  71.         case 'n' :return new Date(Date.parse(dtTmp) + (60000 * Number));  
  72.         case 'h' :return new Date(Date.parse(dtTmp) + (3600000 * Number));  
  73.         case 'd' :return new Date(Date.parse(dtTmp) + (86400000 * Number));  
  74.         case 'w' :return new Date(Date.parse(dtTmp) + ((86400000 * 7) * Number));  
  75.         case 'q' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number*3, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());  
  76.         case 'm' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());  
  77.         case 'y' :return new Date((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());  
  78.     }  
  79. }  
  80.   
  81. //+---------------------------------------------------  
  82. //| 比较日期差 dtEnd 格式为日期型或者 有效日期格式字符串  
  83. //+---------------------------------------------------  
  84. Date.prototype.DateDiff = function(strInterval, dtEnd) {   
  85.     var dtStart = this;  
  86.     if (typeof dtEnd == 'string' )//如果是字符串转换为日期型  
  87.     {   
  88.         dtEnd = StringToDate(dtEnd);  
  89.     }  
  90.     switch (strInterval) {   
  91.         case 's' :return parseInt((dtEnd - dtStart) / 1000);  
  92.         case 'n' :return parseInt((dtEnd - dtStart) / 60000);  
  93.         case 'h' :return parseInt((dtEnd - dtStart) / 3600000);  
  94.         case 'd' :return parseInt((dtEnd - dtStart) / 86400000);  
  95.         case 'w' :return parseInt((dtEnd - dtStart) / (86400000 * 7));  
  96.         case 'm' :return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1);  
  97.         case 'y' :return dtEnd.getFullYear() - dtStart.getFullYear();  
  98.     }  
  99. }  
  100.   
  101. //+---------------------------------------------------  
  102. //| 日期输出字符串,重载了系统的toString方法  
  103. //+---------------------------------------------------  
  104. Date.prototype.toString = function(showWeek)  
  105. {   
  106.     var myDate= this;  
  107.     var str = myDate.toLocaleDateString();  
  108.     if (showWeek)  
  109.     {   
  110.         var Week = ['日','一','二','三','四','五','六'];  
  111.         str += ' 星期' + Week[myDate.getDay()];  
  112.     }  
  113.     return str;  
  114. }  
  115.   
  116. //+---------------------------------------------------  
  117. //| 日期合法性验证  
  118. //| 格式为:YYYY-MM-DD或YYYY/MM/DD  
  119. //+---------------------------------------------------  
  120. function IsValidDate(DateStr)   
  121. {   
  122.     var sDate=DateStr.replace(/(^\s+|\s+$)/g,''); //去两边空格;   
  123.     if(sDate==''return true;   
  124.     //如果格式满足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替换为''   
  125.     //数据库中,合法日期可以是:YYYY-MM/DD(2003-3/21),数据库会自动转换为YYYY-MM-DD格式   
  126.     var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2 }[\-/]{ 1 }[\d]{ 1,2 }/g,'');   
  127.     if (s==''//说明格式满足YYYY-MM-DD或YYYY-M-DD或YYYY-M-D或YYYY-MM-D   
  128.     {   
  129.         var t=new Date(sDate.replace(/\-/g,'/'));   
  130.         var ar = sDate.split(/[-/:]/);   
  131.         if(ar[0] != t.getYear() || ar[1] != t.getMonth()+1 || ar[2] != t.getDate())   
  132.         {   
  133.             //alert('错误的日期格式!格式为:YYYY-MM-DD或YYYY/MM/DD。注意闰年。');   
  134.             return false;   
  135.         }   
  136.     }   
  137.     else   
  138.     {   
  139.         //alert('错误的日期格式!格式为:YYYY-MM-DD或YYYY/MM/DD。注意闰年。');   
  140.         return false;   
  141.     }   
  142.     return true;   
  143. }   
  144.   
  145. //+---------------------------------------------------  
  146. //| 日期时间检查  
  147. //| 格式为:YYYY-MM-DD HH:MM:SS  
  148. //+---------------------------------------------------  
  149. function CheckDateTime(str)  
  150. {   
  151.     var reg = /^(\d+)-(\d{ 1,2 })-(\d{ 1,2 }) (\d{ 1,2 }):(\d{ 1,2 }):(\d{ 1,2 })$/;   
  152.     var r = str.match(reg);   
  153.     if(r==null)return false;   
  154.     r[2]=r[2]-1;   
  155.     var d= new Date(r[1],r[2],r[3],r[4],r[5],r[6]);   
  156.     if(d.getFullYear()!=r[1])return false;   
  157.     if(d.getMonth()!=r[2])return false;   
  158.     if(d.getDate()!=r[3])return false;   
  159.     if(d.getHours()!=r[4])return false;   
  160.     if(d.getMinutes()!=r[5])return false;   
  161.     if(d.getSeconds()!=r[6])return false;   
  162.     return true;   
  163. }   
  164.   
  165. //+---------------------------------------------------  
  166. //| 把日期分割成数组  
  167. //+---------------------------------------------------  
  168. Date.prototype.toArray = function()  
  169. {   
  170.     var myDate = this;  
  171.     var myArray = Array();  
  172.     myArray[0] = myDate.getFullYear();  
  173.     myArray[1] = myDate.getMonth();  
  174.     myArray[2] = myDate.getDate();  
  175.     myArray[3] = myDate.getHours();  
  176.     myArray[4] = myDate.getMinutes();  
  177.     myArray[5] = myDate.getSeconds();  
  178.     return myArray;  
  179. }  
  180.   
  181. //+---------------------------------------------------  
  182. //| 取得日期数据信息  
  183. //| 参数 interval 表示数据类型  
  184. //| y 年 m月 d日 w星期 ww周 h时 n分 s秒  
  185. //+---------------------------------------------------  
  186. Date.prototype.DatePart = function(interval)  
  187. {   
  188.     var myDate = this;  
  189.     var partStr='';  
  190.     var Week = ['日','一','二','三','四','五','六'];  
  191.     switch (interval)  
  192.     {   
  193.         case 'y' :partStr = myDate.getFullYear();break;  
  194.         case 'm' :partStr = myDate.getMonth()+1;break;  
  195.         case 'd' :partStr = myDate.getDate();break;  
  196.         case 'w' :partStr = Week[myDate.getDay()];break;  
  197.         case 'ww' :partStr = myDate.WeekNumOfYear();break;  
  198.         case 'h' :partStr = myDate.getHours();break;  
  199.         case 'n' :partStr = myDate.getMinutes();break;  
  200.         case 's' :partStr = myDate.getSeconds();break;  
  201.     }  
  202.     return partStr;  
  203. }  
  204.   
  205. //+---------------------------------------------------  
  206. //| 取得当前日期所在月的最大天数  
  207. //+---------------------------------------------------  
  208. Date.prototype.MaxDayOfDate = function()  
  209. {   
  210.     var myDate = this;  
  211.     var ary = myDate.toArray();  
  212.     var date1 = (new Date(ary[0],ary[1]+1,1));  
  213.     var date2 = date1.dateAdd(1,'m',1);  
  214.     var result = dateDiff(date1.Format('yyyy-MM-dd'),date2.Format('yyyy-MM-dd'));  
  215.     return result;  
  216. }  
  217.   
  218. //+---------------------------------------------------  
  219. //| 取得当前日期所在周是一年中的第几周  
  220. //+---------------------------------------------------  
  221. Date.prototype.WeekNumOfYear = function()  
  222. {   
  223.     var myDate = this;  
  224.     var ary = myDate.toArray();  
  225.     var year = ary[0];  
  226.     var month = ary[1]+1;  
  227.     var day = ary[2];  
  228.     document.write('< script language=VBScript\> \n');  
  229.     document.write('myDate = DateValue(''+month+'-'+day+'-'+year+'') \n');  
  230.     document.write('result = DatePart('ww', myDate) \n');  
  231.     document.write(' \n');  
  232.     return result;  
  233. }  
  234.   
  235. //+---------------------------------------------------  
  236. //| 字符串转成日期类型   
  237. //| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd  
  238. //+---------------------------------------------------  
  239. function StringToDate(DateStr)  
  240. {   
  241.   
  242.     var converted = Date.parse(DateStr);  
  243.     var myDate = new Date(converted);  
  244.     if (isNaN(myDate))  
  245.     {   
  246.         //var delimCahar = DateStr.indexOf('/')!=-1?'/':'-';  
  247.         var arys= DateStr.split('-');  
  248.         myDate = new Date(arys[0],--arys[1],arys[2]);  
  249.     }  
  250.     return myDate;  
  251. }  

posted @ 2007-10-05 17:43 flyleer| 编辑 收藏
生成随机数(转贴)

有时候在我们的网络应用中,防止程序自动登录搞破坏,我们一般都会加上验证码,这些验证码一般来说都是由人来识别的,当然,如果验证码很有规律,或者说很清楚,漂亮,那么也是可能被程序识别的,我以前就识别过某网站的验证码,因为比较有规律,所以被识别了,并且识别率达到99%左右,其实我们可以制作很复杂一点的验证码,添加一些干扰的线条或者字体变形,使程序识别的难度加大,这样,我们的目的也就达到了.

下面是生成的图片:


代码如下,JSP代码

<%@page contentType="image/jpeg"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.awt.*,javax.imageio.*,java.io.*,java.util.*,java.awt.image.*" %>
<%--
The taglib directive below imports the JSTL library. If you uncomment it,
you must also add the JSTL library to the project. The Add Library action
on Libraries node in Projects view can be used to add the JSTL 
1.1 library.
--%>
<%--
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
--%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%!String s="";%>
<%
java.util.List
<String> fonts=new ArrayList<String>();
GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
String[] names
=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
for(String s:names){
    
char c=s.charAt(0);
    
if(Character.isLowerCase(c)||Character.isUpperCase(c)){
        
    }
else{
        fonts.add(s);
    }
}
BufferedImage bi
=new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
Graphics2D g
=bi.createGraphics();
char[] cs={'0','1','2','3','4','5','6','7','8','9'};
char[] use=new char[4];
g.setColor(
new Color(240,240,240));
g.fillRect(
0,0,200,50);
for(int i=0;i<4;i++){
    Point p
=new Point(5+(i*((int)(Math.random()*10)+40)),40);
    
int size=0;
    
int[] sizes=new int[20];
    
for(int j=0;j<20;j++){
        sizes[j]
=30+j;
    }
    size
=sizes[(int)(Math.random()*sizes.length)];
    
int face=0;
    
if(Math.random()*10>5){
        face
=Font.BOLD;
    }
else{
        face
=Font.ITALIC;
    }
    use[i]
=cs[(int)(Math.random()*cs.length)];
    g.setPaint(
new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
            p.x,p.y
-size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256))));
    g.setFont(
new Font(fonts.get((int)(Math.random()*fonts.size())),face,size));
    g.drawString(
""+use[i],p.x,p.y);
}
s
=new String(use);
session.setAttribute(
"code", s);
g.setPaint(
null);
for(int i=0;i<4;i++){
    g.setColor(
new Color((int)(Math.random()*0x00FFFFFFF)));
    g.drawLine((
int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
}
Random random 
= new Random();
for (int i=0;i<88;i++) {
    
int x = random.nextInt(200);
    
int y = random.nextInt(50);
    g.setColor(
new Color((int)(Math.random()*0x00FFFFFFF)));
    g.setStroke(
new BasicStroke((float)(Math.random()*3)));
    g.drawLine(x,y,x,y);
}
OutputStream ot
=response.getOutputStream();
ImageIO.write(bi,
"JPEG",ot);
g.dispose();
ot.close();
%>

以下是Servlet代码
/*
 * Code.java
 *
 * Created on 2007年9月21日, 下午12:08
 
*/

package com.hadeslee;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Paint;
import java.awt.Point;
import java.awt.Stroke;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import javax.imageio.ImageIO;

import javax.servlet.*;
import javax.servlet.http.*;

/**
 *
 * 
@author lbf
 * 
@version
 
*/
public class Code extends HttpServlet {
    
    
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * 
@param request servlet request
     * 
@param response servlet response
     
*/
    
private List<String> fonts=new ArrayList<String>();
    
public Code(){
        initFonts();
    }
    
private void initFonts(){
        GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
        String[] names
=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
        
for(String s:names){
            
char c=s.charAt(0);
            
if(Character.isLowerCase(c)||Character.isUpperCase(c)){
                
            }
else{
                fonts.add(s);
            }
        }
    }
    
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    
throws ServletException, IOException {
        response.setContentType(
"image/jpeg;charset=UTF-8");
        OutputStream out
=response.getOutputStream();
        BufferedImage bi
=new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
        Graphics2D g
=bi.createGraphics();
        
char[] cs={'0','1','2','3','4','5','6','7','8','9'};
        
char[] use=new char[4];
        g.setColor(
new Color(240,240,240));
        g.fillRect(
0,0,200,50);
        
for(int i=0;i<4;i++){
            Point p
=getPoint(i);
            
int size=getSize();
            use[i]
=cs[(int)(Math.random()*cs.length)];
           
// g.setColor(new Color((int)(Math.random()*256),0,(int)(Math.random()*256)));
            g.setPaint(getPaint(p,size));
            g.setFont(
new Font(fonts.get((int)(Math.random()*fonts.size())),getFace(),size));
            g.drawString(
""+use[i],p.x,p.y);
        }
        g.setStroke(
new BasicStroke(1.0f));
        g.setPaint(
null);
        
for(int i=0;i<4;i++){
            g.setColor(
new Color((int)(Math.random()*0x00FFFFFFF)));
            g.drawLine((
int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
        }
        Random random 
= new Random();
        
for (int i=0;i<88;i++) {
            
int x = random.nextInt(200);
            
int y = random.nextInt(50);
            g.setColor(
new Color((int)(Math.random()*0x00FFFFFFF)));
            g.setStroke(getStroke());
            g.drawLine(x,y,x,y);
        }
        ImageIO.write(bi,
"JPEG",out);
        out.close();
        g.dispose();
    }
    
private Stroke getStroke(){
      BasicStroke bs
=new BasicStroke((float)(Math.random()*3));
      
return bs;
    }
    
private Point getPoint(int index){
        
return new Point(5+(index*((int)(Math.random()*10)+40)),40);
    }
    
private Paint getPaint(Point p,int size){
        GradientPaint gp
=new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
                p.x,p.y
-size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256)));
        
return gp;
    }
    
private int getFace(){
        
if(Math.random()*10>5){
            
return Font.BOLD;
        }
else{
            
return Font.ITALIC;
        }
    }
    
private int getSize(){
        
int[] sizes=new int[20];
        
for(int i=0;i<20;i++){
            sizes[i]
=30+i;
        }
        
return sizes[(int)(Math.random()*sizes.length)];
    }
    
    
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** Handles the HTTP <code>GET</code> method.
     * 
@param request servlet request
     * 
@param response servlet response
     
*/
    
protected void doGet(HttpServletRequest request, HttpServletResponse response)
    
throws ServletException, IOException {
        processRequest(request, response);
    }
    
    
/** Handles the HTTP <code>POST</code> method.
     * 
@param request servlet request
     * 
@param response servlet response
     
*/
    
protected void doPost(HttpServletRequest request, HttpServletResponse response)
    
throws ServletException, IOException {
        processRequest(request, response);
    }
    
    
/** Returns a short description of the servlet.
     
*/
    
public String getServletInfo() {
        
return "Short description";
    }
    
// </editor-fold>
}

posted @ 2007-10-05 17:41 flyleer| 编辑 收藏
oracle sql(转贴)

     摘要: 一 常用的SQL语句 select name,count(*) from table where .. group by ... 中能查询的字段只能为group by的字段. select * from table where rownum < 5 order by id 中查询出来的结果不是按数据中的ID排序的,而只是将select * from t...  阅读全文

posted @ 2007-10-05 17:32 flyleer| 编辑 收藏