June 2007 Archives

Google收拢Linux高手 打压微软Windows

| No Comments | No TrackBacks

  28日Google推出由中国研发团队领先的Linux版本的桌面搜索。作为Google中国Linux团队的核心王咏刚和苏哲阐述了Linux桌面系统的产生过程,并透露了Google在Linux上的发展方向。

  作为Linux的重要研发力量Google一直致力于该系统相关产品研发。Google认为无论是 Linux 、Mac OS X还是Windows他们都是平等的,用户的需求才是最重要的。而由于Linux起步晚应用少,Google更应该加强在Linux领域的研发。在 Google内部Linux系统的用户量也远大于Windows,且从事Linux产品开发与服务的工作人员也要多于Windows。这对于一家综合性软 件开发公司来说是较为少见的。

  虽然Google否认目前公司对Linux的开发和推广是谋求对微软在Winows领域的垄断。但无论 是对火狐的支持,还是与开源软件社区的合作,亦或是推出Linux版本的Openoffice,人们都可以感觉到Google在Linux上的决心,也可 以感觉到Linux对于微软威胁的增大。目前Google 已经收拢了包括Linux二号人物Andrew morrtom在内的众Linux 顶尖高手。Google坦言他们也一直对Linux有着相当力度的支持。

  而自由软件领袖六月齐聚Google美国总部,“讨论”如何应对微软最近的专利威胁以及未来的发展方向也是一个很好的例证。

  Google中国核心工程师王咏刚表示,和Windows相比Linux更加开放,用户使用的所有软件 都是合法授权的;同时由于技术上的原因Linux系统更加安全;此外Linux基本可以做到一个软件包解决所有应用。他和公司的很多员工都是Linux 的忠实用户,公司绝大部分软件都是Linux 平台下开发的。Google并不会在意相比Windows,Linux相对窄小的用户群与市场。“我们只是按照用户的需求来开发Linux产品。”

  腾讯科技也注意到,随着应用的丰富和企业的推广Linux的用户数量也在增加,国内外知名的PC企业也 纷纷推出Linux操作系统的电脑。而且较之老的Linux系统,近一年推出的新Linux系统无论在界面的设置还是在操作的便捷性上都有着明显改善。 “它的软件负载更少,会让电脑的运转更加快速。”苏哲拿着它的Linux系统笔记本得益的说。

  Google中国Linux开发小组核心成员王咏刚介绍说,现在人们在办公、上网、冲浪,甚至是网游等广大领域的Linux体验和Windows已经没有明显的差距。而且随着产业链的支持Linux的发展将会越来越好。

  在中国Google也一直在强化Linux上的研发,作为Linux团队领导的王咏刚表示, Google Linux在中国最紧迫的事情就是招人。“我们实在太需要Linux方面的开发人员了!”只有开发团队丰富了Google才能提供更加丰富的Linux产 品。而作为产业的领导企业,Google的动向也将影响着Linux的走向。

  Google(谷歌)中国工程研究院副院长林斌表示:“我们的团队叫做 Linux 及开源项目研发团队,我们非常兴奋,已经建立了一支优秀、年轻有活力的研发团队。在 Linux 方面,我们专注于 Linux 客户端应用软件研发,中国的这支团队是全球 Linux 客户端软件研发的主力,今天,我们推出了我们的第一款产品。开源是谷歌一个重要方向,未来开源项目的比例会越来越大。

  我们的使命就是专注打造 Linux 开源客户端软件,在全球 Linux 桌面普及中起到很重要的作用,以我们的项目为基础来吸引和团结一批开源社区的开发者和用户。对社区来说,我们希望给社区贡献更多、更高质量的代码,为社区的发展做一些有意义的工作。 ”

  作为对抗Windows的重要力量Linux已经有了越来越的支持者,Linux的发展不仅为人们提供 了更多的选择,同时也促进Windows产业的发展。今天Linux用户已经可以安装Google Earth 和 Google Picasa、Google Talk、Goolge SketchUp、Desktop等Linux软件。

  正如王咏刚所言,“除了少数银行支付和视频播放不能实现,Linux已经和Windows的体验没有明显差别。”而随着相Google这样业界巨头对于Linux产品开发的加强,Linux将有着更好的前景。它同时也将成为Google对抗微软的又一利器。

  王咏刚和苏哲还对腾讯科技透露,作为Linux的忠实用户,他们一直保持着对Linux的热情,他们非常想开发Linux系统下的输入法和图像处理软件。相信提倡自由开发的Google很快又将会有两个新的Linux软件问世。

  谷歌Linux桌面(beta)主要特性:

  全面的索引功能——这款桌面搜索应用程序能够对用户电脑中所有主流的文件内容进行全文搜索,包括文档、 PDF文件、PS文件、源代码、网页文件、电子邮件、OpenOffice.org文档、Man和Info手册文件、文件夹、图片和音乐等等。除此之外, 它还能帮助你找到文件的原先版本。

  快速搜索框——搜索网络和计算机最快捷的方法就是使用位于桌面中央的快速搜索框,只需按两次Ctrl键,就可跳出该搜索框,输入搜索词的同时立即显示搜索结果。

  GmailTM和网页历史记录搜索——不是所有用户查找的信息都存在本地的电脑里,谷歌Linux桌面 可以让用户同时搜索Gmail,网络邮件、网络搜索历史以及万维网中的信息。因为索引是存在于本地的,所以即便处于离线状态,用户也可以查找Gmail和 网页历史记录。

  6月29日消息,本周四,搜索巨头Google终于将触角延伸到了Linux桌面平台,发布了基于Linux操作系统的Google Desktop软件服务β测试版,这也意味着未来开放资源操作系统用户也可以享受Google提供的文档搜索、电子邮件以及Gmail服务。

  据vnunet报道,不过Linux版本的软件中将不会整合小工具和工具栏,后者在Windows和苹果Mac操作系统中都被包括了。“我们将 主要精力投入到桌面搜索功能,因此其他工具和工具栏并不被支持,不过随着时间的推移,未来公司有可能将这些功能整合在最终版的软件包中。”Google公 司发言人表示。据悉,此次不被包括的小工具主要包括:新闻头条更新和电子邮件消息,以及系统内存和CPU使用情况等。前两者帮助用户在使用电脑的过程中, 随时监控新闻和邮件方面的变化。

  据悉,此次发布的β测试版将针对Debian 4.0,Fedora Core 6,Mandriva,Ubuntu 6.10和SuSE10.1以及Red Hat 5几个版本的Linux操作系统。另一方面,Google还将Picasa Google Earth和Google Toolbar整合到了Linux平台的火狐浏览器软件中。不过,考虑到Picasa服务依赖于Wine Windows模拟器技术,因此Linux版本中的软件被重新设计。目前为止,搜索巨头并未透露软件最终版本的发布时间,公司仅仅表示希望搜集尽可能多的 用户反馈,以次来保证软件的功能和质量,在发布1.0最终正式版的时候,可以完全满足用户的实际需求。

  iPhone开售首日苹果专卖店热闹非凡,员工都忙着维持秩序

科技时代_iPhone手机正式上市销售 或撼动手机业

  一位消费者兴奋地高举刚买到的两部iPhone,苹果规定每位消费者限购两部

科技时代_iPhone手机正式上市销售 或撼动手机业

   新浪科技讯 北京时间6月30日消息,据国外媒体报道,iPhone于美国东部时间6月29日下午6点(北京时间6月30日早上6点)在全美开售,数百名狂热的苹果粉 丝成为首批iPhone的拥有者。业内认为,这款拥有音乐和视频播放功能的手机可能会撼动整个手机产业。

  狂热的粉丝

   周五下午6点前,在纽约的两家苹果专卖店外已聚集了超过600人,当专卖店打开大门时,人群中爆发出一阵欢呼声。在iPhone独家合作伙伴 AT&T的营业厅,排队的人群略少一些。在洛杉矶的一家苹果专卖点外,约200人排起了长队。这种热闹的情况通常只有在新款游戏机发售时才能遇 见。

  “市场上的手机都是垃圾,我已经换了好几个,包括价格很贵的那种,”在芝加哥一家苹果店外排队的62岁老人Albert Livingstone说,“(iPhone)是最新的玩具,我已经62,买玩具的日子所剩不多了。”

  iPhone融合了手机、网络浏览器和媒体播放器等功能于一身,技术爱好者盛赞它是一款“突破性”产品,同时担心用户可能难以适应它的触摸屏。

  苹果的赌博

   iPhone也是苹果CEO乔布斯的一场赌博,他希望在苹果畅销产品iPod的基础上拓展软件和多媒体服务。苹果希望在2008年售出1千万部 iPhone,这个数字相当于全球手机份额的1%。尽管该公司没有公布iPhone上市初期的市场目标,但分析师预计,发售数天内,最多将售出40万部 iPhone。

  “iPhone是苹果的下一个重要业务,”Gartner分析师Mark McGuire表示。

  自乔布斯今年1月公布iPhone以来,苹果股票已飙升了逾30%,最新收于122.04美元。

  一些分析师认为,未来一年,苹果股价最高还能上涨30%,不过也有分析师警告称,由于市场预期甚高,该股市盈率已经过高。Cowen &Co分析师Arnie Berman在一份研究报告中写道:“苹果股价已从一轮高涨期中受益。”

  周五的iPhone首发式也被外界看作对美国市场对高端手机需求的一次测试,而高端手机早就在部分亚洲国家流行起来。

  价格昂贵

  从首批用户来看,iPhone似乎更多吸引了年龄更大的技术迷而不是青少年,也许年轻人被iPhone高昂的价格所吓退:与AT&T签订一份为期两年的使用合同,手机价格加上服务费约为1400美元。

  一些黄牛党也从中看到了商机,据称代买或转卖的价格高达600美元。

  “我当然是雇佣兵,”在洛杉矶排队的Kyle Laurentine说,“我才17岁,用不着iPhone。我已经有iPod和手机了,两个合在一起和iPhone功能差不多。”

  iPhone可能在今年下半年进入欧洲市场,以赶上年底的假日购买潮。目前,苹果还未公布iPhone在欧洲的售价及合作运营商,不过有传言称,沃达丰有望成为苹果的合作伙伴。iPhone在亚洲的推出可能会推迟到明年。

  竞争对手的担忧

   早在上市之前,iPhone就在整个通讯行业掀起了波澜。智能手机生产商Palm表示,iPhone可能会夺走其Treo智能手机的部分订单,至少在短 期如此。“由于用户尝试iPhone手机,可能令我们的产品销售出现停滞。”Palm CEO Ed Colligan在iPhone上市前夕对媒体表示。

  在最初上市的狂热过后,iPhone的销售额是否会保持增长,目前还不得而知。著名投行Piper Jaffray的分析师本周表示,苹果2009年可能售出4500万部手机,来自手机的营收可抗衡苹果的两外两大核心业务:Mac和iPod。

  Pacific Crest分析师Andy Hargreaves认为,苹果有充足货源保证初期市场需求,他还提高了苹果的营收预期,“我们认为,苹果准备推出新的数字媒体服务,可能新增逾10亿美元的年营收,利润率有望超过平均水平。”

  据国外媒体报道,苹果在iPod音乐播放器大获成功后,再接再厉地推出无线产品iPhone,但其当前面临的手机市场品牌繁多且竞争激烈。

  芬兰诺基亚,索尼爱立信和韩国LG电子等手机厂商,均已推出了iPhone意欲挑战的音乐手机,而加拿大RIM的黑莓电子邮件设备更是备受专业人士宠爱。

  Strategy Analytics分析师David Kerr称:“iPhone会像电影‘哈利波特’那样吸引消费者兴趣,但不会像‘哈利波特’那么畅销,因为其价格过高。”

  iPhone周五在美国面市,根据不同内存售价分别为500美元和600美元,还未计入所需要的两年服务合约。而美国85%的消费者愿意为手机支付的价格不超过100美元。

  Kerr预计2007年iPhone将销出200万支,预计今年全球高端手机销量将为2000万支,而所有手机销量将为1.68亿支。

  业界人士对iPhone平滑的触摸屏赞誉有加,此外其相对宽大的屏幕,网络浏览以及媒体播放功能等亦受推崇。

  竞争对手林立

  分析师指出,高端手机中与苹果对抗的包括索尼爱立信和诺基亚等。

  索尼爱立信的Walkman手机在18个月中就销出了2500万支,远超苹果为iPhones所设1000万支的销售目标。而诺基亚最为眩目的媒体手机N95标价甚至高于iPhone,为749美元。

  但这些手机,尽管畅销欧洲,却未透过无线运营商在美国销售,因此难以到达美国消费者手中。

  LG的Prada手机往往被视作与iPhone最接近的产品,因其触摸屏技术相似,但该产品尚未投放美国市场。

  而另一个出人意料的竞争对手,可能是美国服务提供商中的后起之秀Helio推出的295美元的Ocean手机,该公司是韩国SK电讯与美国EarthLink的合资企业。

  Helio瞄准的正是与苹果类似的客户群,即热衷新技术,且出手大方的人群,迄今其已经赢得了约10万用户。(完)

  继iPod获得巨大成功后,美国苹果公司将主要精力转向苹果手机———iPhone,美国消费者终于可以在美国时间6月29日购买到iPhone。

   根据目前披露的消息,iPhone针对的还是中高端市场。iPhone的售价为4GB版本499美元,8GB版本599美元,购买者需要签约费用为 60~100美元不等的套餐两年,并支付36美元的一次性激活费用。消息灵通人士表示,根据苹果公司内部计划,iPhone最早也要到明年才会在中国等部 分亚洲国家或地区销售。

  另据了解, 苹果公司此次为了预防水货,特别在iPhone手机上设置了激活功能,用户须在购买后登录网站输入美国 社会保险号等信息,才能将手机激活。因此,在国内正式上市前,就算是购买到 水货手机,也很难正常使用。

  首批买到iPhone的用户在苹果员工的掌声中兴奋地走出专卖店

科技时代_iPhone正式在美发售 粉丝狂热前所未有(组图)

  苹果专卖店内工作人员忙碌的身影

科技时代_iPhone正式在美发售 粉丝狂热前所未有(组图)

  用户在苹果专卖店内试用iPhone

iPhone正式在美发售粉丝狂热前所未有(组图)

  警察在现场维持秩序

iPhone正式在美发售粉丝狂热前所未有(组图)

  新浪科技讯 美国东部时间6月29日18:00(北京时间6月30日6:00)最新消息,倍受期待的苹果iPhone手机在当地时间6月29日18:00正式发售,进入首批排队等候的用户手中。

   iPhone可以看作是手机、iPod媒体播放器和无线上网设备的结合体,依据产品配置的不同,4GB和8GB版本的零售价格分别为499美元和599 美元。iPhone将由AT&T的无线部门(即Cingular无线)独家经销。目前,iPhone仅在美国上市,其他国家暂无上市时间表。

   iPhone在苹果粉丝引发的狂热可谓前所未有,一些人早在本周一就开始在苹果专卖店前排队苦候。在美国各地的苹果专卖店和AT&T营业厅,不 论刮风下雨,都有苹果粉丝们的身影。连苹果联合创始人史蒂夫·沃兹尼亚克(Steve Wozniak)和费城市长约翰·斯瑞特(John Street) 也加入了排队大军。尽管苹果CEO乔布斯许诺赠送给沃兹尼亚克一部iPhone,他还是希望尽早购得iPhone送给子女。

   由于排队者众多,甚至有杂志专门推出了iPhone排队特刊,传授排队技巧,例如如何享受免费洗浴,如何寻找附近最便宜的餐馆等等。在排队人群中,有些 是铁杆粉丝,彻夜排队只为第一时间拿到心仪的iPhone;而有些则是精明的“黄牛党”,第一时间抢购只为卖个好价钱。

  今天在杭州举行的二00七中国行业网站投资与发展高峰论坛传出信息:依托传统产业应运而生的中国行业电子商务网站数量持续高速增长,受到已经完全崛起的中国本土民间创投资本和外国风险投资的亲睐。

  今天的论坛云集了中国化工网、中国纺织网和中国农业网等几乎所有的中国一线行业网站,而面对他们的是软银亚洲、IDG、鼎辉创投、红鼎创投、华睿投资等国内外风险投资商巨头。

  风起云涌的互联网蓝海,因细分化带来的市场想象空间有限,使得大部分中国行业网站温饱有余发展不够,风险投资的缺失让中国行业网站一直不能迈开大步。

  慧聪集团总裁郭凡生指出,技术开发和市场推动成本均高的行业网站势必要引入风投,否则很难生存发展。

   但是,行业网站本身的投资价值日益凸现却是不争的事实。二00六年十二月,浙江网盛科技在深交所上市,上市当日开盘对应的市盈率达一百四十五倍,其大受 资本的追捧形势更是极大地鼓舞和推进了中国行业网站的发展,从而使其成为VC——风险投资者的首选。据了解,此前,慧聪网、携程网、五一Job等早已在资 本市场将行业网站的投资价值充分释放。

  郭凡生认为,互联网从另外一方面讲是一种伟大的制度,制度也是企业的生命,只有那些管理先进、制度健全的行业网站才能有进一步发展的可能;网盛科技董事长孙德良表示,小门户网站可以抱团联盟,在技术、内容、经营、资本等层面进行合作,以降低成本。

   软银创投的合伙人宋安澜透露,电子商务、创新媒体、消费品和服务是软银的投资押宝重点,“我们非常注重想象空间,就是说你能够成长很大,还有几种发明创 新等,你这个发明创造有没有世界专利或国内专利的保护?只有有保护才能有足够的门槛,别人就比较难进来,这样企业也会有比较好的盈利空间。”

  业内人士分析认为,已经崛起的中国本土VC与软银、IDG等跨国VC存在很多不同,本土VC的先行者如红鼎创投试水行业网站,却分别选择网盛科技与China00一等行业网站的领先企业作为战略伙伴,其谨慎的做法,也体现着本土VC们务实的“中国式生存”。

  红鼎创投总经理刘晓人说:“目前,中国大部分的行业网站都在赚钱,这是光明,看能否成为领航世界的行业,就是我们的前途问题。”

AOP和Spring事务处理

| No Comments | No TrackBacks

关键词: Spring AOP

一.为什么要用框架和模式

1.为什么要用模式?

因为模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果。而且会得到解决问题的最佳办法。

2.为什么要用框架?

因为软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。

总之:就是让开发更简单,让我们成功。

因小失大,切莫轻视JAVA异常处理

| 1 Comment | No TrackBacks

JAVA异常处理是程序开发的一个重要内容,异常处理的好坏关系到系统的健壮性和稳定度。异常处理看起来只有几个常用语句,故有些开发人员常常会对异常处 理轻视和在使用上思路模糊。近期笔者在一个开发项目中就体验到轻视异常处理的惨痛教训,因为对异常没有处理好,后果是严重影响系统稳定性。因此,笔者认为 异常处理并不是表面看起来的那么简单。本文分享在此项目过程中对异常处理的一些看法。

一. 什么是异常
在JAVA程序运行时,我们常常会出现一些非正常的现象,这种情况称为运行错误。根据其性质可以分为错误和异常。JAVA用面向对象的方法处理异常,首先 会建立类的层次。类 Throwable位于这一类层次的最顶层,只有它的后代才可以作为一个异常被抛弃。类Throwable有两个直接子类:Error和 Exception。
一般来说错误最常见的有程序进入死循环,内存泄漏等。这种情况,程序运行时本身无法解决,只能通过其他程序干预。JAVA对应的类为Error类。Error类对象由JAVA虚拟机生成并抛弃(通常JAVA程序不对这类异常进行处理)。

异常是程序执行时遇到的非正常情况或意外行为。一般以下这些情况都可以引发异常:代码或调用的代码(如共享库)中有错误,操作系统资源不可用,公共语言运 行库遇到意外情况(如无法验证代码)等等。常见的有数组下标越界,算法溢出(超出数值表达范围),除数为零,无效参数、内存溢出等。这种情况不像错误类那 样,程序运行时本身可以解决,由异常代码调整程序运行方向,使程序仍可继续运行直至正常结束。

JAVA对应的类为Exception类。Exception类对象是JAVA程序处理或抛弃的对象。它有各种不同的子类分别对应于不同类型的异常。 JAVA编译器要求程序必须捕获或声明所有的非运行时异常,但对运行时异常可以不做处理。其中类RuntimeException代表运行时由JAVA虚 拟机生成的异常,原因是编程错误。其它则为非运行时异常,原因是程序碰到了意外情况,如输入输出异常IOException等。

Spring事务的学习

| 1 Comment | No TrackBacks

今天对 spring AOP 事务有了一个新的认识,所以赶紧把今天的学习记下来,希望在今后的学习中能够起到一些作用,也能对今天的认识做一次总结。

Hibernate Tool 使用说明

| No Comments | No TrackBacks

使用环境:

Eclipse 3.2M3 (http://www.eclipse.org)

HibernateTools-3.1.0.beta2(http://www.hibernate.org/255.html)

插件的安装就不用多说了吧。

1、  创建cfg文件。

Ctrl + N 带出如下窗体。
New.gif

选中Hibernate Configuration File(cfg.xml)项。并Next下去。

选择配置文件的路径。

FreeMarker一篇通

| No Comments | No TrackBacks

大家看文章标题就应该知道,我想用一篇文章,把大家从对freemaker的陌生直接带入到比较深入的境界,所以不想说一些基础性的东西,如果大家不习惯我的表达方法,大可通过google去找习惯于自己阅读方式的相关文章。

我用过velocity,最近才用freemaker,才知道我以前的选择是错了,因为velocity不支持过程的调用,所以我为velocity增加 了很多的东西,写了很多代码,而且脚本也累赘得要命。freemaker首先吸引我的是它强大的过程调用和递归处理能力,其次则是xml风格的语法结构有 着明显的边界,不象velocity要注意段落之间要留空格。所以我建议大家直接使用Freemaker,虽然freemaker没有.net版本,我想 不嵌入程序中使用的话,freemaker是绝对的首选。(题外话,谁有兴趣移植一个NFreeMaker?)

在使用之前我们先要设置运行环境,在使用Freemaker的时候,我们需要下载相关的程序:
freemaker: http://freemarker.sourceforge.net/
fmpp: http://fmpp.sourceforge.net/

其中fmpp是一个freemaker的辅助工具,有了它,我们可以实现更多的功能。以下例子必须fmpp辅助。

这里我们首先提出问题。大家看如下的一个xml文件,虽然freemaker的能力不仅在于处理xml文件,但是用xml作为例子更直观一些:
xml version='1.0' encoding="gb2312" ?>
<types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:DruleForm-Lite.xsd">
<type name="Type1" >
<labels>
<label lang="zh-CN" value="投保单"/>

为什么要使用接口编程

| No Comments | No TrackBacks

进行接口的介绍,必须介绍一下程序语言发展的历史才行,鲁迅先生说过“治学先治史”,明白了程序语言发展的前世今生,才能知道为什么这么多语言为什么会这样,为什么么会那样?

计算机出现以后,科学家相继开发了多种语言,从smalltalk,Pascal,Basic,C语言,C++,java,.net等等,这些语言的发展 步伐,可以看作是从面向过程向面向对象发展的一段历史。很多面向对象的书在介绍自己的历史的时候,都会给读者介绍这一段历史,并鼓吹OO编程是多么多么的 优异。问题是,很多刚开始学程序的人根本不知道为什么要有这个转变,他们也很难理解OO语言中的虚函数,接口等概念到底为了什么而提出来。

我们在了解这一段历史以前,首先给大家介绍一个概念——“粒度”,什么是粒度?作者认为所谓粒度其实就是一个程序中使用代码单元的组合尺度,我们可以举一 个例子,沙砾——砖块——房屋模板,我们设想去修建一座房子,其实有很多中修筑方法,如果你不闲麻烦,可以使用沙砾一点点地建筑,或者将沙砾烧制为砖块, 用砖块来砌,甚至直接从工厂购买房屋的门,窗,墙组件来堆砌。这三种不同的方法代表了三种不同的组合尺度。沙砾是最小的单位,使用它搭建小的房子说不定还 可以,但是毫无疑问,我们必须使用很多很多“沙砾”,不便于管理;砖块比沙砾聚合了一层,可以用来修建较大的房子了;房屋模板是最高的尺寸,使用它可以快 速地搭建大规模的房屋。这三种尺度的区别和联系,与我们编写程序概念是有很大的相似之处的。

在早期学习Pascal,老师告诉我们这种面向过程语言的最基本的单元是过程和函数,它们是程序中的最小的组件。过程和函数可以实现最基本的代码重用,当 我们把某些固定功能的代码使用过程和函数编写后,我们可以在程序中调用它们而不必在任何需要的地方都写上这样一段代码,这样的好处是显而易见的。在一些小 型的程序里面,使用过程和函数是合适的,但是在大中型程序中,它们的弊端就显示出来,过程和函数的粒度太低了,如果我们一个系统,有10000个函数和过 程,我们的程序员将不得不花费大量的时间去寻找和维护它们,10000个没有任何关系的函数和过程的管理难度是显而易见的,就好像10000个人的企业一 样,如果没有部门和职务,这还不乱了套?!

Spring的事务管理2.0与1.2.8的区别

| No Comments | No TrackBacks

Spring1.2.8

Spring以前对一个事务拦截要通过代理实现下面的配置文件是从不同的文件中找来的,不是单独的一个Spring配置文件。

<!-- Transaction manager for a single JDBC DataSource -->
<!-- 声明一个事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<!-- 声明一个抽象Bean,这个Bean是不能实例化的,提供给其它需要AOP事务的Bean用,其它需要AOP事务的只要继承这个Bean就会被AOP接管-->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

<!-- 继承之前实现的抽象Bean,让这个Bean通过代理工厂生成,交给AOP托管。至于哪些方法被接管在控制Bean中已经配置了-->

扩展Spring系列(1)--Spring 的微内核与FactoryBean扩展机制

DreamHead在《思考微内核》十分激赏 Spring的微内核与扩展机制:
“Spring 的微内核在哪里呢?便是DI容器。而通过FactoryBean,我们可以定制自己的组件组装过程,对一个普通的JavaBean做手脚,像Spring AOP中常用的ProxyFactoryBean做的那样。如此,我们就不必把所有功能都做到Spring的DI容器中去,而是以一个 FactoryBean来对DI容器的功能进行扩展。除了Spring自身之外,现在已经有一些项目开始利用这个特性扩展Spring,比如,Acegi Security和Spring Modules。”

这确是框架容器界应该贯彻的范式,微内核提供最少的功能,而由扩展接口去增强框架的能力。下面看看Spring怎么设计,明白之后就可以开始为Spring捐献精力了:)

1、微内核的功能
1.1 DI(依赖注入)与Singleton管理
利用POJO setter的DI机制,估计每位同学随手都能写一个简单版本,不多说了。
Singleton管理说白了就是先到一个map中按id找找看有没有已存在的实例。

1.2 BeanName与BeanFactory注入
除了DI注入的属性,微内核还有什么能卖给POJO呢?就是Bean在xml 定义里的id和BeanFactory自己了。
卖的机制是让POJO 实现 BeanNameAware和BeanFactoryAware接口。BeanFactory用 if(pojo instance of BeanFactoryAware)判断到POJO需要注入BeanFactory,就调用setBeanFactory(this)将自己注入。

这种框架中基于接口的注入和调用机制在Java下挺标准的,Spring的功能多是基于这种模式提供。遗憾就是Java不支持多重继承,作为替代的接口里不能提供默认的实现,导致每一个Pojo都要很无聊的实现一遍setBeanFactory()。

关于session的详细解释

| No Comments | No TrackBacks

一、术语session

  在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。

  session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称 之为一个session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭 这个期间①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登 录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①, 其中的差别只能靠上下文来推断②。

  然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前 要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道 不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能 够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3 session”③。

  而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解 决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”⑤。由于各种用于web开发的语言在一定程度上都 提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的 javax.servlet.http.HttpSession简称为session⑥。

我们在使用struts的时候免不了生成大量的formBean,当有业务变化的时候还要修改大量的get、set方法,虽然IDE可以帮助生成这些 get、set方法,但是数量多的时候也比较麻烦!最近因为工作的需要找到了新版本struts(1.2.7)的一些新加特性,这部分特性可以使你摆脱以 前这些烦人的修改。下面我们可以看一些简单代码来了解这个新特性

//form.jsp
//*************************************************************
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ page contentType="text/html; charset=GBK" %>
<html:html>
<head>
<title>
Jsp
</title>
</head>
<body>
<html:form action="dynaAction.do" method="POST">
编号: <html:text property="custNo"/>
姓名: <html:text property="custName"/>
地址: <html:text property="address"/>
年龄: <html:text property="age"/>

Lucene 基础指南

| No Comments | No TrackBacks

作者:lighter, 江南白衣

Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大,但api其实很简单的,它最主要就是做两件事:建立索引和进行搜索。
1. 建立索引时最重要的几个术语

* Document:一个要进行索引的单元,相当于数据库的一行纪录,任何想要被索引的数据,都必须转化为Document对象存放。
* Field:Document中的一个字段,相当于数据库中的Column ,Field是lucene比较多概念一个术语,详细见后。
* IndexWriter:负责将Document写入索引文件。通常情况下,IndexWriter的构造函数包括了以下3个参数:索引存放的路径,分析 器和是否重新创建索引。特别注意的一点,当IndexWriter执行完addDocument方法后,一定要记得调用自身的close方法来关闭它。只 有在调用了close方法后,索引器才会将存放在内在中的所有内容写入磁盘并关闭输出流。
* Analyzer:分析器,主要用于文本分词。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。
* Directory:索引存放的位置。lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。
* 段:Segment,是Lucene索引文件的最基本的一个单位。Lucene说到底就是不断加入新的Segment,然后按一定的规则算法合并不同的Segment以合成新的Segment。

lucene建立索引的过程就是将待索引的对象转化为Lucene的Document对象,使用IndexWriter将其写入lucene 自定义格式的索引文件中。

Struts1和Struts2的区别和对比

| No Comments | No TrackBacks

Action 类:
• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
• Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

线程模式:
• Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
• Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Servlet 依赖:
• Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
• Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

可测性:
• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
• Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

捕获输入:
• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。
• Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。

表达式语言:
• Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
• Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).

绑定值到页面(view):
• Struts 1使用标准JSP机制把对象绑定到页面中来访问。
• Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

类型转换:
• Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
• Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

校验:
• Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
• Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

Action执行的控制:
• Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
• Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

方法一
使用phpmyadmin,这是最简单的了,修改mysql库的user表,不过别忘了使用PASSWORD函数。

方法二
使用mysqladmin,这是前面声明的一个特例。
mysqladmin -u root -p password mypasswd
输入这个命令后,需要输入root的原密码,然后root的密码将改为mypasswd。
把命令里的root改为你的用户名,你就可以改你自己的密码了。
当然如果你的mysqladmin连接不上mysql server,或者你没有办法执行mysqladmin,那么这种方法就是无效的,而且mysqladmin无法把密码清空。

下面的方法都在mysql提示符下使用,且必须有mysql的root权限:
方法三
mysql> Insert INTO mysql.user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES
确切地说这是在增加一个用户,用户名为jeffrey,密码为biscuit。
在《mysql中文参考手册》里有这个例子,所以我也就写出来了。
注意要使用PASSWORD函数,然后还要使用FLUSH PRIVILEGES。

方法四
和方法三一样,只是使用了REPLACE语句
mysql> REPLACE INTO mysql.user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES

方法五
使用SET PASSWORD语句,
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
拟也必须使用PASSWORD()函数,但是不需要使用FLUSH PRIVILEGES。


方法六
使用GRANT ... IDENTIFIED BY语句
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
这里PASSWORD()函数是不必要的,也不需要使用FLUSH PRIVILEGES。


注意: PASSWORD() [不是]以在Unix口令加密的同样方法施行口令加密。
MySQL 忘记口令的解决办法
如果 MySQL 正在运行,首先杀之: killall -TERM mysqld。
启动 MySQL :bin/safe_mysqld --skip-grant-tables &
就可以不需要密码就进入 MySQL 了。
然后就是
>use mysql
>update user set password=password("new_pass") where user="root";
>flush privileges;
重新杀 MySQL ,用正常方法启动 MySQL 。


mysql密码清空
Windows:
1.用系统管理员登陆系统。
2.停止MySQL的服务。
3.进入命令窗口,然后进入MySQL的安装目录,比如我的安装目录是c:\mysql,进入C:\mysql\bin
4.跳过权限检查启动MySQL,
c:\mysql\bin>mysqld-nt --skip-grant-tables
5.重新打开一个窗口,进入c:\mysql\bin目录,设置root的新密码
c:\mysql\bin>mysqladmin -u root flush-privileges password "newpassword"
c:\mysql\bin>mysqladmin -u root -p shutdown
将newpassword替换为你要用的root的密码,第二个命令会提示你输入新密码,重复第一个命令输入的密码。
6.停止MySQL Server,用正常模式启动Mysql
7.你可以用新的密码链接到Mysql了。

Unix&Linux:
1.用root或者运行mysqld的用户登录系统;
2.利用kill命令结束掉mysqld的进程;
3.使用--skip-grant-tables参数启动MySQL Server
shell>mysqld_safe --skip-grant-tables &
4.为root@localhost设置新密码
shell>mysqladmin -u root flush-privileges password "newpassword"
5.重启MySQL Server


mysql修改密码
  mysql修改,可在mysql命令行执行如下:
  mysql -u root mysql
  mysql> Update user SET password=PASSWORD("new password") Where user='name';
  mysql> FLUSH PRIVILEGES;
  mysql> QUIT

 

教你如何将MySQL数据库的密码恢复

因为MySQL密码存储于数据库mysql中的user表中,所以只需要将我windows 2003下的MySQL中的user表拷贝过来覆盖掉就行了。

在c:\mysql\data\mysql\(linux 则一般在/var/lib/mysql/mysql/)目录下有三个user表相关文件user.frm、user.MYD、user.MYI

user.frm //user表样式文件

user.MYD //user表数据文件

user.MYI //user表索引文件

为保险起见,三个都拷贝过来,不过其实如果之前在要恢复的那个MySQL上没有更改过表结构的话,只要拷贝user.MYD就行了

然后


#. /etc/rc.d/init.d/mysql stop
#. /etc/rc.d/init.d/mysql start
#mysql -u root -p XXXXXX


好了,可以用windows 2003下mysql密码登陆了


mysql>use mysql
mysql>update user set Password=PASSWORD('xxxxxx') where User='root';


这时候会出错,提示user表只有读权限

我分析了一下原因,只这样的,因为user.*文件的权限分配是windows 2003下的,在windows 2003下我ls -l一看权限是666

在linux下我一看,拷过来后权限变成了600(其实正常情况下600就行了,只不过这里的文件属主不是mysql,拷过来后的属主变为了 root,所以会出现权限不够,这时候如果你改成权限666则可以了,当然这样不好,没有解决问题的实质),在 /var/lib/mysql/mysql/下ls -l看了一下


#chown -R mysql:mysql user.*
#chmod 600 user.*


//OK,DONE

重起一下MYSQL

重新连接


mysql>use mysql
mysql>update user set Password=PASSWORD('xxxxxx') where User='root';
mysql>FLUSH PRIVILEGES;


有一点值得注意:如果你windows 下mysql如果是默认配置的话,注意要还要执行


mysql>delete from user where User='';
mysql>delete from user where Host='%';
mysql>FLUSH PRIVILEGES;


好了,到这里恢复密码过程就完成了

这个方法么就是有点局限性,你必须也具备另外的user表文件

其他还有几种方法

其它方法一(这个是网上流传较广的方法,mysql中文参考手册上的)

1. 向mysqld server 发送kill命令关掉mysqld server(不是 kill -9),存放进程ID的文件通常在MYSQL的数据库所在的目录中。


killall -TERM mysqld


你必须是UNIX的root用户或者是你所运行的SERVER上的同等用户,才能执行这个操作。

2. 使用`--skip-grant-tables' 参数来启动 mysqld。 LINUX下:


/usr/bin/safe_mysqld --skip-grant-tables , windows下c:\mysql\bin\mysqld --skip-grant-tables


3. 然后无密码登录到mysqld server ,


>use mysql
>update user set password=password("new_pass") where user="root";
>flush privileges;


。你也可以这样做:


`
mysqladmin -h hostname -u user password 'new password''


4. 载入权限表:


`
mysqladmin -h hostname flush-privileges'


或者使用 SQL 命令


`FLUSH PRIVILEGES'


5.

killall -TERM mysqld


6.用新密码登陆

其它方法二

直接用十六进制编辑器编辑user.MYD文件

不过这个里面我要说明一点,我这里编辑的时候发现个问题,加密的密码串有些是连续存储的,有些的最后两位被切开了,后两位存储在后面其他地方.这一 点我还没想明白.还有注意一点就是编辑的是加密过的密码串,也就是说你还是需要另外有user表文件。这种方法和我最上面介绍的方法的区别在于,这种方法 直接编辑linux下的user表文件,就不需要重新改文件属主和权限了 

修正一下:我在Windows下的实际操作如下

1.关闭正在运行的MySQL。

2.打开DOS窗口,转到mysql\bin目录。

3.输入


mysqld-nt --skip-grant-tables


回车。如果没有出现提示信息,那就对了。

4.再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。

5.输入mysql回车,如果成功,将出现MySQL提示符 >

6. 连接权限数据库


>use mysql;
(>是本来就有的提示符,别忘了最后的分号)


6.改密码:


> update user set password=password("123456") where user="root"; (别忘了最后的分号)


7.刷新权限(必须的步骤)


>flush privileges;


8.退出


> \q


9.注销系统,再进入,开MySQL,使用用户名root和刚才设置的新密码123456登陆。

据说可以用直接修改user表文件的方法:

关闭MySQL,Windows下打开Mysql\data\mysql,有三个文件user.frm,user.MYD,user.MYI找个知道密码的MySQL,替换相应的这三个文件,如果user表结构没改过,一般也没人去改,替换user.MYD就可以了。

也可以直接编辑user.MYD,找个十六进制编辑器,UltraEdit就有这个功能。关闭MySQL,打开user.MYD。将用户名root 后面的八个字符改为565491d704013245,新密码就是123456。或者将它们对应的十六进制数字,(左边那里,一个字符对应两个数字),改 为 00 02 02 02 02 02 02 02,这就是空密码,在编辑器右边看到的都是星号*,看起来很象小数点。重开MySQL,输入root和你的新密码。