My studying notes for Java,Ruby,Ajax and other any interesting things.

星期一, 五月 19, 2008

Hibernate的get和load的区别



1、hibernate中get方法和load方法的根本区别在于:如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

2、虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。

3 get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

星期日, 五月 18, 2008

调整



〔调整落差〕

在学校里,自己的成绩好,也只是与同班同学相比。

出了社会,自己的工作的成绩,是与不同国家、不同年纪、不同背景的人比。

可能一下子会有很大的落差。

你可能说,人生不是比来比去的。

但是好朋友一定要跟你说,你可以不比,不过你不能不知道:你究竟输在那里?

找到一群可以帮助你成长的好朋友和聪明的竞争者,你就赢了别人好几步。

有一位很有智能的长者说过:「今天每一个家长都会说,『孩子,我要你赢!』但是,
却很少有家长教导说,『孩子,你该怎么输!输的原因怎么检讨出来!怎么原地爬起来
!怎样渡过人生的各种难关!』

〔工作态度〕

每天上班最好有正面的心情。用快乐的心情面对每个人,你会有很多朋友,老板也会想
教你东西,乐于与你沟通。如果与老板无法沟通,你觉得你会有加薪机会吗﹖
就算你不缺那份薪水,你也得不到新增的工作机会,来帮助你日后的发展。

【静静的吃三碗饭】

绝对没错,不要一出社会,就一天到晚与人计较或说谁谁谁没做他的工作。

真正的赢家是不出声的。

〔把掌声留给别人〕

把掌声留给别人,投资在别人的身上。
把掌声留给自己,你的荷包不会变多一点,但你的朋友会少一个。
而把掌声留给自己的伙伴,你会多一个朋友,你的荷包不会变少一点。

〔永远不要说---我已经尽力了!〕

我们可以安慰受挫折的朋友:『你已经尽力了!』

但当我们说出『我已经尽力了!』时,任何人都可以质疑你。
人们会问:『喔!真的吗?如果你是这么尽力,为什么成果是如此不堪!!』

如果你真的已经尽力了,那万一下一次不能再加力,那成果岂不更糟?!

通常,只有失败者、逃避者,才会大言不惭地说:『我已经尽力了!』

社会上的人,很务实地,从来就不会谅解一个一味地说『我已经尽力了!』的人!

你要不相信,换个说法,说『对不起!我应该可以做的更好的!如果能再有机会,我一
定尽力做好!』


你将发现,机会将源源而至。

再提醒一句,说『我已经够认真了!』、『我真的很不错!』,跟说『我已经尽力
了!』,有异曲同工之「坏」结果。

〔薪水〕

薪水与能力是相关的,但不是绝对的。
我有一个女性朋友,硕士毕业后领3万2仟的薪水;10年后,增加不到25%。

最后她的工作是被另一个刚刚硕士毕业的女生换掉。

她的问题很简单,毕业后就停止进修,她的履历表多了很多年资,但并没有很多经验。

聪明的你,一定要好好的做一张履历表。

而且你一定要知道自己那一张履历表值多少钱,说句不中听的话,至少遇到结婚或丧
事,别人才知道要怎么介绍你嘛!


很多东西不能规划,但是自己的履历表,一定要好好的规划。


〔跟对人〕

虽然【跟对人】很重要,但我要跟你说如果没跟对人,也要在他身上挤出东西来学。

我以前有一个老板,日本作风,不但吹毛求疵,还蔽护他自己的人。前一两年,我好气
他喔。

但是我发现,虽然他不是我的贵人,可是我在他身上学到他的扎实和彻底执行的工作能
力。

对那老板而言,因为我很年轻,还有很多机会。

但是有些人没被裁培,他们一辈子都起不来,他们将来都会面临被裁员的可能。

所以老板并没有错。有时候,看事情要设身处地,换成老板的眼光还看自己,往大方向
看。

〔读书〕
读书是增加知识,但也不要太相信书里面的人。

有些人读了太多书,但是不知变通,不能拿出来适应瞬息万变的社会,结果是变成读死
书了。

但是不能不读书,因为这社会,有时候很复杂,你会需要些书当精神食粮。

〔婚姻〕
家庭结构是脆弱的,禁不起任何人的刻意攻击。

婚姻是可以经营的,放弃自我主见、偶而多迁就对方一些,有时候是解决问题的好办
法。

感情是没有绝对的!不如意时,至少谢谢他
/她陪你走过往日的春夏秋冬。

但女人不能没钱,婚姻或感情出了问题,还可以有尊严地走出家门晒晒和煦的冬阳。

如果又没钱,又不会经营感情,这种问题,只能在家看韩剧哭死你。


〔金钱观〕
金钱是重要工具,但不是生命的全部。

人人要设法让家人丰衣足食,更要知道你钱花去那,要会管理你的收支表。

百分之90的人赚的都是计算式的财富Calculated Wealth
(相信我,英文跟计算机一样,都只是沟通的工具)。

计算式的财富就是你今年赚24万,明年你的目标应该是多少?

稳健收入的前题,是不乱换工作,而且你与你的上司
/工作伙伴合作愉快。

一定要有投资观念,投资不一定是股票那些,而是如投资外文能力,计算机能力,投资自
己的presentation
skills,或沟通能力。

投资未来,不要投资过去。


〔人格〕
人格比薪水或什么都还重要。成功的人大部份都具有好的人格特质。
许多年薪好几百万和千万的人,虽然不是每个人都是白手起家,但是只有好的人格特质
才会在业界长长久久。


只有好的人格,才能在社会上备受尊重。


〔好习惯〕
好的人格又是如何培养的呢?简单说,就是多多培养一些好习惯。以下列举21种可以改
变人生的好习惯。


1 当一个人生活枯燥的时候,他忘了用心体会是一种习惯。

2 当一个人觉得人生乏味的时候,他忘了培养幽默是一种习惯。

3 当一个人体力日差的时候,他忘了运动建身是一种习惯。

4 当一个人工作疲惫的时候,他忘了认真休息是一种习惯。

5 当一个人孤傲狂放的时候,他忘了感恩惜福是一种习惯。

6 当一个人志得意满的时候,他忘了谦冲为怀是一种习惯。

7 当一个人钱不够用的时候,他忘了投资理财是一种习惯。

8 当一个人觉得工作低迷的时候,他忘了激励自己是一种习惯。

9 当一个人怀疑自己的时候,他忘了建立自信是一种习惯。

10 当一个人忽略家人的时候,他忘了爱与关怀是一种习惯。

11 当一个人浑噩度日的时候,他忘了阅读好书是一种习惯。

12 当一个人忙于工作的时候,他忘了安排休闲是一种习惯。

13 当一个人目中无人的时候,他忘了不断学习是一种习惯。

14 当一个人服务不佳的时候,他忘了让顾客满意是一种习惯。

15 当一个人慌张失措的时候,他忘了万全准备是一种习惯。

16 当一个人推诿责任的时候,他忘了勇于承担是一种习惯。

17 当一个人肠枯思竭的时候,他忘了转型思考是一种习惯。

18 当一个人沮丧失意的时候,他忘了检讨改进是一种习惯。

19 当一个人畏惧调职的时候,他忘了提升自己是一种习惯。

20 当一个人沟通障碍的时候,他忘了真诚倾听是一种习惯。

21 当一个人业绩消退的时候,他忘了积极行动是一种习惯。

星期一, 五月 05, 2008

工作流相关术语和定义



1.1.1. 工作流
就是工作从开始到完成的过程。工作流由流程逻辑和路线规则组成。流程逻辑定义了任务的顺序和必须遵循的路线规则,还有截止期限以及由工作流引擎实现的其他业务规则
1.1.2. 流程定义(process definition)
一个图形流程定义或流程图,代表工作流的流程逻辑元素以及各元素之间的关系
1.1.3. 流程实例(process instance):
一个流程实例,通常称为工作,是一个流程定义的运行实例
1.1.4. 状态(state,或者说等待状态):
代表一种对外部参与者的依赖;这意味着在流程运行时流程引擎必须等待,直到外部参与者通知工作流系统指定的状态完成了
1.1.5. 动作(action):
在流程运行过程中,工作流系统为响应指定事件运行的一段程序逻辑;当流程运行过程中指定的事件发生时,工作流系统启动并执行这些动作
1.1.6. 流程上下文变量(process context variable):
保存每一个流程运行的上下文信息;通常在流程定义中声明这些变量,然后在流程实例生成时被实例化
1.1.7. 参与者
以下类型之一:资源集、特定资源、组织单元、角色(一个人在组织内部的作用)、人或系统(自动代理)。
1.1.8. 活动
组成流程定义中的一个逻辑步骤的任务。可以是自动的或人工的。自动指在流程操作过程中定义脚本和触发器的能力。流程定义中的特定活动可以作为无人参与的任务来运行,自动化可以在手工或人力驱动的任务中执行业务规则。常见的一种自动活动就是截止期限管理,如果某个工作项在预定的截止期限之前未能完成,该管理可以自动发送一条提醒消息或触发一个延期程序。
1.1.9. 活动所有者
活动所有者是有权宣布一个活动结束,然后推进工作到流程中的下一个活动的参与者
1.1.10. 工作所有者
工作所有者是有权整体控制流程实例执行过程的参与者
1.1.11. 工作项
代表流程实例中活动的参与者将要执行的工作

星期三, 三月 05, 2008

使用telnet登陆smtp服务发邮件


使用telnet登陆smtp服务发邮件(带身份验证)。
2008-02-18 13:32[root@newsclub east]# telnet smtp.163.com 25 //登陆 smtp.163.com 端口号为 25
Trying 202.108.44.205...
Connected to smtp.163.com (202.108.44.205).
Escape character is '^]'.
220 163.com Coremail SMTP(Anti Spam) System
HELO localhost // 与服务器打招呼,并告知客户端使用的机器名字,可以随便填写
250 OK
AUTH LOGIN //使用身份认证登陆指令
334 dXNlcm5hbWU6
cmVkc29zMw== //输入已经base64_encode()过的用户名.
334 UGFzc3dvcmQ6
MbM2MDQ3NQ== //输入已经base64_encode()过的密码
235 Authentication successful
MAIL FROM:<redsos3@163.com> //告诉服务器发信人的地址
250 Mail OK
RCPT TO:<yourframe@21cn.com> //告诉服务器收信人的地址
250 Mail OK
DATA //正面开始传输信件的内容,且最后要以只含有 . 的特殊行结束。
354 End data with <CR><LF>.<CR><LF>
To:yourframe@21cn.com
From:redsos3@163.com
Subject:test mail
From:redsos3@163.com
test body
. //结束传输信件
250 Mail OK queued as smtp14,F0CPBFsuzUOvoDwE.41582S2
QUIT //断开连接
221 Bye
Connection closed by foreign host.
状态码说明:
220 : 服务就绪
250 :请求邮件动作正确,完成(HELO,MAIL FROM,RCPT TO,QUIT 指令执行成功会返回此信息)
235 :认证通过
221 :正在处理
354 :开始发送数据,结束以 .(DATA指令执行成功会返回此信息)
500 :语法错误,命令不能识别
550 :命令不能执行,邮箱无效
552 :中断处理:用户超出文件空间


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

   你的支持 我的坚持
  Lead to The IT Future

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

星期三, 二月 27, 2008

[fwd]论java架构设计

软件架构作为一个概念,体现在技术和业务两个方面。
从技术角度来说:软件架构随着技术的革新不断地更新其内容,软件架构建立于当前技术和一些基本原则的基础之上。
先说一些基本原则:
分层原则:分层是为了降低软件深度复杂性而使用的关键思想,就像社会有了阶级一样,软件有了层次结构。
模块化原则:模块化是化解软件广度复杂的必然手段,模块化的目的就是让软件分工。
接口实现分离原则随着软件模块化的不断深入改进,面向接口编程而不是面向实现编程可以让复杂度日趋增高的软件降低模块之间的耦合度,从而让各模块更轻松改进。从这个原则出发,软件也从微观进行了细致的规范化。
还有两个比较小但很重要的原则:
细节隐藏原则很显然把复杂问题简化,把难看的细节隐去,能让软件结构更清晰。其实这个原则使用很普遍,java/c++语言中的封装原则以及设计模式中的Facade(外观)模式就很能体现这个原则的精神。
依赖倒置原则随着软件结构的进一步发展,层与层之间、模块与模块之间的依赖逐渐加深,而层、模块的动态可插拔要求不端增大。依赖倒置原则可看视为接口实现分离原则的深化,根据此原则的精神,软件进入了工具时代。这个原则有点类似于知名的好莱坞法则:Don't call us, we'll call you。

以上这些原则奠定了我们的软件架构的价值指标。但软件架构毕竟是建立在当前技术之上的。而每一代技术都有架构模式。过去的不再说了,让我们现在就来看一下当前流行的技术,以及当前我们能采用的架构。

因为面向对象是当前最流行开发技术,且设计模式的大量使用使面向对象的走向成熟,而数据库是当前最有效的存储结构、web界面是当前最流行的用户接口,所以当前最典型的三层次架构就架构在以上几项技术的基础之上,用数据库作存储层、用面向对象来实现业务层、用web来作为用户接口层。我们从三层次架构谈起:
因为面向对象技术和数据库技术不适配,所以在标准三层次架构的基础上,我们增加了数据持久层,来管理O-R双向映射,但目前一直没有最理想的实现技术。cmp和entity bean技术因为其实现复杂,功能前景有限,已接近被淘汰的边缘。JDO及hibernate作为o-r映射的后期之秀,尤其是hibernate,功能相当完备。推荐作为持久层的首选
在业务层,因为当前业务日趋负载,且变动频繁,所以我们必须有足够敏捷的技术来保证我们的适应变化的能力,在标准j2ee系统中session bean负责业务处理,且有不错的性能表现,但采用ejb系统对业务架构模式改变太大,且其复杂而昂贵,业务代码移植性差。而spring 作为一个bean配置的轻量级架构,漂亮的IOC模式实现,对业务架构影响小,所以推荐作为中间层业务框架。
在用户结构层,虽然servlet/jsp/jstl/javaBean 能够实现MVC架构,但终究过于粗糙。struts对MVC架构的实现就比较完美,Taperstry也极好地实现MVC架构,且采用基于事件的方式,非常诱人,惜其不够成熟,我们仍旧推荐struts作为用户接口层基础架构。
因为业务层是三层次架构中最有决定意义的,所以让我们回到业务层细致地分析一下,在复杂的业务我们常常需要以下基础服务的一种或几种:事务一致性服务acid(tool:jta/jts)、并发加锁服务concurrent&&lock、池化管理服务cache、访问控制服务(tool:jaas)、流程控制服务workflow、动态实现服务IOC,串行化消息服务(tool:jms)、负载平衡服务blance等。如果我们不采用重量级应用服务器(如weblogic,websphere,jboss等)及重量级组件(EJB),我们必须自己实现其中一些服务。虽然我们大多情况下,不需要所有这些服务,但实现起来却非易事。幸运的是我们有大量的开源实现代码,但采用开源代码却常常是件不轻松的事。

随着xml作为结构化信息传输和存储地位日渐重要,一些xml文档操作工具(DOM,Digester,SAX等)的使用愈发重要,而随着xml schema的java binding工具(jaxb,xmlbean等)工具的成熟,采用xml schema来设计xml文档格式,然后采用java binding来生成java bean 会成为主要编程模式,而这又进一步使数据中心向xml转移,使在中小数据量上,愈发倾向于以xquery为查询语言的xml数据库。最近还有一个趋势,microsoft,ibm等纷纷大量开发中间软件如(microsoft office之infopath),可以直接从xml schema 生成 录入页面等非常实用的功能。还有web service 的广泛应用,都将对软件的架构有非常重大的影响。至于面向服务架构(SOA)前景如何,三层次架构什么时候走入历史,现在还很难定论。

aop的发展也会对软件架构有很深的影响,但在面向对象架构里,无论aspectJ还是jboss-aop抑是aspectWerks、nanning都有其自身的严重问题:维护性很差,所以说它将很难走远。也许作为一个很好的思想,它将在web service里大展身手。

rdf,owl作为w3c语义模型的标志性的语言,也很难想象能在当前业务架构发挥太大影响。但如果真如它所声称那样,广泛地改变着信息的结构。那么对软件架构也会有深远影响。

有关架构设计的一些忠告:
尽量建立完整的持久对象层.可获得高回报
尽量将各功能分层,分块,每一模块均依赖假定的其它模块的外观
不能依赖静态数据来实现IOC模式,应该依赖数据特征接口,静态数据仅是数据特征接口实现方式之一
架构设计时xml是支持而不是依赖.但可以提供单一的xml版本的实现

从业务角度说:软件架构应是深刻体现业务内部规则的业务架构,但因为业务变化频纴,所以软件架构很难保持恒定不变,但业务的频繁变化不应是软件架构大规模频繁变化的原因,软件架构应是基于变化的架构。
一种业务有其在一段时间内稳定存在的理由(暂且不谈),业务内部有许多用例,每一种用例都有固定的规则,每一规则都有一些可供判定的项,每一项从某一维度来观察都是可测量的,我们的架构首先必须保证完美适应每一项每一种测量方式,很多失败的架构都是因为很多项的测量方式都发生变更这种微观变化中。

每个用例都有规则,我们在作业务用例分析,常常假定一些规则是先验的,持久稳定的,然而后来的业务改变常常又证明这种看法是错误的,然而常常我们的架构已经为之付出了不可挽回的代价。大量事实证明:规则的变化常常用例变化的根本原因。所以我们的架构要尽可能适应规则的变化,尽可能建立规则模版。

每个用例都关系着不同的角色。每一个用例的产生都必然是因为角色的变更(注意:不是替换,而是增强或减弱),所以注意角色的各种可能情况,对架构的设计有举足轻重的意义。在我们当前的三层架构里,角色完美地对应接口概念。

在一个系统里很多用例都相互关联,考虑到每个用例均有可能有不同的特例,所以在架构设计中,尽量采用依赖倒置原则。如架构许可可采用消息通信模式(JMS)。这样可降低耦合度。

现在我们谈一下业务稳定存在理由对业务的影响。存在即是合理,在这里当然是正确的。业务因人而存在,所以问业务存在的理由即是问不同角色的需要这项业务的理由以及喜欢不喜欢当前业务用例的理由,所有这样的角色都应该在系统里预留。《待续》
在架构设计中有几个原则可以考虑:
用例尽量细分
用例尽量抽象
角色尽量独立
项测量独立原则
追求简单性
这里未提供相关的例子,例子会在以后的更新时提供。

业务和模式之间的关系
业务中的一些用例之间的关系常常和一些常规的模式很相似。但随着时间的演化,慢慢地和先前的模式有了分歧。这是个正常的现象。但这对系统架构却要求非常高,要求系统架构能适应一些模式的更替。在这里我们尽可能早地注意到用例之间的相互角色变化,为架构更新做好准备.
第一部分完.

lazet
lazett@gmail.com

星期二, 一月 22, 2008

[fwd]Erlang快速入门



Erlang超快速入门

日期:2007-04-06

目录
1 开始使用erlang
2 使用Erlang作为计算器
3 编辑前面的表达式
4 编译你的第一个程序
5 深入了解Erlang

1 开始使用erlang

如果你在unix系统下输入 erl ,或者在Window$系统下双击Erlang的图标,你可以看到一些提示:
os prompt > erl
Eshell V5.5.4 (abort with ^G)
1> _

其中 “>”提示符意味着系统正在等待输入。

2 使用Erlang作为计算器
1> 213183682167*12937192739173917823.
27579983733990928813319999135233
2> _

记住每个表达式以英文句号结束

3 编辑前面的表达式

可以使用简单的emacs命令获取前面的表达式。常见的几个如下:Unix键 Win$键 说明
^P Up 获取前一行(previous)
^N Down 获取下一行(next)
^A Home 到行首
^E End 到行尾
^D Del 删除光标前字符
^F Left 向前移动一个字符
^B Right 向后移动一个字符
Return Enter 执行当前命令


注意:^X意味着Control+X 。

尝试按下Control+P来查看结果。

译者注:一位朋友提示如上的快捷键是在unix系统之下的,Window$下的快捷键附在了如上列表后的括号内。另外,在Unix系统下使用Control+G的退出方式,在Window$下使用Control+C来退出。

4 编译你的第一个程序

把如下内容输入到一个文件里:
-module(test).
-export([fac/1]).

fac(0) -> 1;
fac(N) -> N * fac(N-1).

把这些存储到文件 test.erl 中,文件名必须与模块名相同。

编译这个程序使用如下命令,并且运行:
3> c(test).
{ok,test}
4> test:fac(20).
2432902008176640000
5> test:fac(40).
815915283247897734345611269596115894272000000000
6> _

现在可以做些其他有趣的事情了。

[fwd]Erlang初体验



久闻erlang大名,随着身边的一些项目开始采用erlang,看来不得不好好学习一下erlang了,以后也可以跟人说,今天你lang了吗

1.编译
在mac下,安装还是很简单的
引用
port install erlang
一切ok了

2.erlang的交互环境
由于一直搞python,所以很喜欢语言拥有一个shell交互环境,erlang也为我们提供了一个,在命令行下输入:
引用
erl
http://www.haokanbu.com/p/49620/

3.编辑器
工欲善其事必先利其器,我的开发环境:
http://www.haokanbu.com/p/49619/

4.尝试erlang的分布式编程
学习erlang,主要的目的就是学习他在分布式方面的使用
概念:
引用
节点是分布式Erlang的核心概念。在一个分布式Erlang应用中,术语(term)节点(node)意味着一个可以加入分布式 transactions的运行系统。通过一个称为net kernal的特殊进程,一个独立的Erlang系统可以成为一个分布式Erlang系统的一部分。当net kernal进程启动的时候,我们称系统是alive的。
在erlang中创建一个节点,非常容易:
引用
erl -sname node1
给一个节点发送消息:
引用
{Name, Node} ! Mess.
更详细的说明参见这里:
http://dennis-zane.javaeye.com/blog/94015

5.Unit Test in Erlang
除了写代码,我们还要保证质量,erlang也有相应的unitest方案:
https://support.process-one.net/doc/display/CONTRIBS/EUnit
中文说明:
http://erlang-china.org/start/unit_test_in_erlang.html

参考资料:
Erlang超快速入门
http://erlang-china.org/start/fast-start.html