建国's profile小白的生活PhotosBlogLists Tools Help

建国 周

Occupation
Location
Interests
小时候有个梦想...希望长大了能够飞跃高山大海...
Lists
No list items have been added yet.
No list items have been added yet.

小白的生活

流星的许愿
July 23

如何成为一个出色的网站架构师

   一个具有一定知名度的网站,面对的问题无非是:稳定的性能、海量访问、海量数据。

   优秀的website architecture应该良好的解决上述问题,那么Terry认为应该熟悉或了解下面的技术:

  • 开发语言架构:应该至少熟悉一种web开发语言,包括java、web、python、ror等,然后采用比较稳健的、成熟的开发语言架构
  • 单点登陆
    • 自建session server,类似discuz的passport的方案
    • 目前常用的是cas sso解决方案
  • web服务器集群:
    • 负载均衡:软件比如keepalived,ultramokey.硬件如四层交换机;
    • web服务器集群方案:常用lvs 
    • web服务器选型:apache、Nginx、lighttpd
    • 其他服务器-如java 应用服务器的集群部署;
  • 利用缓存:
    • 页面静态化规则,页面缓存;缓存软件:squid,oscache,等
    • 常用数据缓存解决方案,缓存数据命中率
    • 如果采用ORM,考虑采用二级缓存
  • ajax:避免页面全局刷新,提高用户体验;合理使用,避免泛滥。
  • 数据库
    • 集群数据库
      • 如果数据库采用mysql,那么一般是master-slave,对master进行写入或更新数据,对slave进行数据的查询。如果使用hibernate那么,使用native sql太动态绑定不同的数据库表。复杂一些可以研究一下Hibernate Shards,这是google捐献给hibernate的项目的。
      • oracle数据库集群,可以采用磁盘阵列方式,oracle部署在几个服务器上,表和数据文件放在磁盘阵列上
    • 做好备份策略
    • 分清不同数据的生命周期。根据不同的生命周期,做好数据的归档/转存的工作
    • 商业数据存储首选大型商业数据库,其他数据可以用mysql等开源数据库。
  • 搜索引擎:
    • 常用的技术选型是lucene ,另外有ferret,Sphinx。
    • 分布式存储和分布式查询
    • 中文分词
  • 网络蜘蛛:
    • 知道如何抓取别人网站的网页
    • 懂得如何屏蔽未知或部分蜘蛛访问你的网站
  • seo
  • 关注互联网业内的情况
    • facebook的f8是啥回事
    • google的产品和api,了解Google Maps APIOpenSocial APIGoogle Apps等等
    • 找到sns,blog,wiki等web2.0的技术表现形式
    • guice、google toolkit、Android
    • 关注新冒出来一些网站的情况
    • 研究和分析知名网站的架构
    • 跟踪一些知名技术专家的文章或blog
    • 适当的参加一些技术或互联网聚会和话题讨论
  • 了解比较新的一些技术概念,如soa、esb、云计算、MapReduce、BigTable、Google
  • “隔河观景的心态应该尽量避免”-- 个人技术学习路上的那些事儿
July 05

个人认为ESB已经挑起了SOA大旗

ESB(企业服务总线)为分散服务提供了交互、组合和治理的基础架构。有了它,才能释放SOA的最大价值。因此,ESB成为厂商在SOA(面向服务的架构)竞争中的焦点。

    作为近两年软件领域最热门的词汇之一,SOA(Service Oriented Architecture,面向服务的架构)的概念以及SOA带来的好处,正在被用户逐步接受。Gartner的数据表明,到2007年,全球将有70%以上的大企业会将他们的应用转到SOA。但是目前CIO们最关心的是,如何才能真正实现基于SOA的应用?

    在近一段时期,多家软件厂商如IBM、Sun、BEA、Oracle等都加大了对ESB(Enterprise Service Bus,企业服务总线)产品的投入力度,并声称自己的SOA解决方案因此而更加完善,ESB成为厂商在SOA竞争中的焦点。

    ESB成为一种新的诱惑

    ESB是传统中间件技术与XML、Web服务等技术结合的产物。ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素。

    业内对ESB的定义是:它是由中间件技术实现并支持SOA的一组基础架构,支持异构环境中的服务、消息以及基于事件的交互,并且具有适当的服务级别和可管理性。

    这样的定义稍显抽象,简单地说,ESB就是试图将应用服务器上的多种逻辑层面迁移到总线以及连接点上,从而降低企业内部信息共享的成本。IBM WebSphere软件全球副总裁Sandy Carter女士介绍说,“企业服务总线是SOA中的消息框架—即消息相互交换和通信的方式,是业界标准与客户消息框架的整合。”

    ESB产品的共有特性包括:连接异构的MOM(Microsoft Operations Manager)、利用Web服务描述语言接口封装MOM协议,以及在MOM传输层上传送简单对象应用协议(SOAP)传输流的能力。大多数ESB产品支持在分布式应用之间通过中间层如集成代理实现直接对等沟通。

    ESB的出现改变了传统的软件架构,可以提供比传统中间件产品更为廉价的解决方案,同时它还可以消除不同应用之间的技术差异,让不同的应用服务器协调运作,实现了不同服务之间的通信与整合。

    从功能上看,ESB提供了事件驱动和文档导向的处理模式,以及分布式的运行管理机制,它支持基于内容的路由和过滤,具备了复杂数据的传输能力,并可以提供一系列的标准接口。

    •   在电信领域:ESB能够在全方位支持电信行业OSS(运营支撑系统)的应用整合概念,是理想的电信级应用软件承载平台。
 
    •   在电力领域:ESB能够全方位支持电力行业EMS的数据整合概念,是理想的系统数据交换平台。 

    •   在金融领域:ESB能够在全方位支持银企间业务处理平台的流程整合概念,是理想的B2B交易支撑平台。

    为SOA挑起大旗

    对于SOA的概念,不同的软件提供商有不同的定义方式。很多用户也都是从不同的视角来理解SOA,从程序员的角度,SOA是一种全新的开发技术,新的组件模型,比如说Web Service;从架构设计师的角度,SOA就是一种新的设计模式,方法学;从业务分析人员的角度,SOA就是基于标准的业务应用服务。

    SOA不仅是Web服务,如何让业务服务最大限度地复用才是SOA的核心价值。ESB为分散服务提供了交互、组合和治理的基础架构。有了它,才能释放SOA的最大价值。

    我们可以这样来理解,ESB就是在SOA架构中实现服务间智能化集成与管理的中介。而它与SOA的关系是:ESB是逻辑上与SOA 所遵循的基本原则保持一致的服务集成基础架构,它提供了服务管理的方法和在分布式异构环境中进行服务交互的功能。可以这样说,ESB是特定环境下(SOA架构中)实施EAI(enterprise application integration,企业应用集成)的方式。

    IONA公司大中国区总裁薛志勇表示,采用IONA公司的ESB产品Artix作为SOA的切入点,将可以使企业以最小的投入将已有系统纳入SOA架构。

    薛志勇称,目前ESB是SOA集成中最普遍采用的方法,传统的EAI和平台厂商是以“服务器”为中心、以“Hub”为形式的解决方案,这种方法虽然解决了信息孤岛问题,但投资大,见效慢,而且也不灵活。

    因为ESB是传统中间件技术与XML、Web服务等技术结合的产物,对企业而言,采用ESB中间件系统作为企业级信息系统整合方案中的中枢技术,可以无须添加任何软硬件设备,就可把过去、现有和未来的IT系统整合在企业级的信息应用框架下,并且能为企业提供实时、大容量的信息通信和实时控制、管理和分配消息传递的能力。

    目前,除了IONA、Tibco等专业的ESB公司外,SOA的两大领导厂商IBM和BEA也加入了ESB的阵营。

    Forrester公司分析师Mike Gilpin说:“尽管人们还不十分确定如何构建出一个完整的SOA,但他们已经知道要解决集成问题,而ESB正好能帮助他们解决该问题。”

    国内CIO对SOA早已听了很多。SOA的理念和他们所面临诸多挑战,SOA 的开放性和灵活性,给了CIO一个选择它的理由。然而,不菲的平台迁移成本以及缺少成功案例的佐证,都让CIO难下决心。

    CIO不但要考虑必须对现有产品进行集成以支持SOA的使用场景。还必须考虑如何构建面向未来的SOA应用。ESB的出现和应用恰好为这个难题提供了一个解决之道。

    甲骨文公司在去年将ESB产品内嵌在其业务流程管理产品中,今年就推出了独立的ESB产品。BEA推出了 AquaLogic Service Bus等来加强ESB的产品线。IBM在原有WBI Message Broker、WAS 6 SIBus这些集成产品之外,又推出了独立的WebSphere ESB产品。而传统的EAI厂商Tibco和WebMethods也宣布了各自的ESB产品。

    BEA公司中国区技术经理刘汩春认为:“SOA的‘服务’必须是可组装编排、可快速注册发布、质量可监控、生命周期可管理的。这样SOA才能在整个IT范围内实现服务治理和优化,从而直接推动业务的优化。而从简单的服务重用框架到SOA演进的过程中,ESB就是其中最重要的催化剂之一。”

    ESB的兴起让SOA的渐进之路可以走得更开放和平稳,而ESB也代表了中间件产品本身的进化方向,从应用领域而言,由于ESB是基于开放的Web服务而来,在SOA的发展过程中,ESB已经当仁不让地挑起大旗。

    ESB开源之路

    开源软件市场这几年的发展也早就显示出极其旺盛的生命力。Linux服务器、开源数据库、开源应用软件等产品的市场份额都已有了很大提高。开源软件已成为政府机构和企业用户节约成本的一种有效手段。

    随着Java应用服务器迅速成为一种大众化商品,企业中间件也朝着开源的方向跟进。近两年,已出现了许多极其成熟的企业服务总线实施项目。

    Sun在JavaOne大会上发布了自己的免费ESB。这个名为Java开放式企业服务总线的项目将放在Java.net上进行,第一个版本有望在今年夏末交付。Sun还计划把来自这个社区项目的代码包装成商用产品。

    Sun的应用程序以及开发者平台的市场副总经理Joe Keller说,Open ESB将会基于Java商业集成1.0规范。还提供了使用开源代码的Java系统应用程序服务器。“这将是一个推动整个世界商业的应用程序服务器,”Keller说。

    而在Sun对ESB开源前,Iona科技公司就公开了Celtix的源代码,这是采用GNU LGPL许可证的Java ESB,从而启动了ObjectWeb社区在ESB方面的工作。Iona方面声称,Celtix将支持Java商业智能(JBI)规范,该规范为跨应用集成明确规定了标准化的对象容器。

    目前市场上已经有大量BEA、IBM以及Sun Microsystems等大制造商生产的ESB产品。而ObjectWeb在上星期也接收到了法国IT服务公司BULL的源代码捐赠来加速它ESB产品发展。

    随着开源项目的这股趋势,这个领域的所有供应商都在观望哪个ESB会获得成功。IDC的副总裁Dennis Byron说:“拿IBM举例,如果不管什么原因ObjectWeb占据了市场,如同Apache Web server一样,我认为他们会毫不犹豫地支持它。”
July 03

什么是TD-SCDMA技术

 TD-SCDMA的中文含义为时分同步码分多址接入,该项通信技术也属于一种无线通信的技术标准,它是由中国第一次提出并在此无线传输技术(RTT)的基础上与国际合作,完成了TD-SCDMA标准,成为CDMA TDD标准的一员的,这是中国移动通信界的一次创举,也是中国对第三代移动通信发展的贡献。在与欧洲、美国各自提出的3G标准的竞争中,中国提出的TD-SCDMA已正式成为
全球3G标准之一,这标志着中国在移动通信领域已经进入世界领先之列。该方案的主要技术集中在大唐公司手中,它的设计参照了TDD(时分双工)在不成对的频带上的时域模式。

  TDD模式是基于在无线信道时域里的周期地重复TDMA帧结构实现的。这个帧结构被再分为几个时隙。在TDD模式下,可以方便地实现上/下行链路间地灵活切换。这一模式的突出的优势是,在上/下行链路间的时隙分配可以被一个灵活的转换点改变,以满足不同的业务要求。这样,运用TD-SCDMA这一技术,通过灵活地改变上/下行链路的转换点就可以实现所有3G对称和非对称业务。合适的TD-SCDMA时域操作模式可自行解决所有对称和非对称业务以及任何混合业务的上/下行链路资源分配的问题。

  TD―SCDMA的无线传输方案灵活地综合了FDMA,TDMA和CDMA等基本传输方法。通过与联合检测相结合,它在传输容量方面表现非凡。通过引进智能天线,容量还可以进一步提高。智能天线凭借其定向性降低了小区间频率复用所产生的干扰,并通过更高的频率复用率来提供更高的话务量。基于高度的业务灵活性,TD―SCDMA无线网络可以通过无线网络控制器(RNC)连接到交换网络,如同三代移动通信中对电路和包交换业务所定义的那样。在最终的版本里,计划让TD―SCDMA无线网络与INTERNET直接相连。

  TD-SCDMA所呈现的先进的移动无线系统是针对所有无线环境下对称和非对称的3G业务所设计的,它运行在不成对的射频频谱上。TD-SCDMA传输方向的时域自适应资源分配可取得独立于对称业务负载关系的频谱分配的最佳利用率。因此,TD-SCDMA通过最佳自适应资源的分配和最佳频谱效率,可支持速率从8kbps到2Mbps的语音、互联网等所有的3G业务。

  TD-SCDMA为TDD模式,在应用范围内有其自身的特点:一是终端的移动速度受现有DSP运算速度的限制只能做到240km/h;二是基站覆盖半径在15km以内时频谱利用率和系统容量可达最佳,在用户容量不是很大的区域,基站最大覆盖可达30-4km。所以,TD-SCDMA适合在城市和城郊使用,在城市和城郊这两个不足均不影响实际使用。因在城市和城郊,车速一般都小于200km/h,城市和城郊人口密度高,因容量的原因,小区半径一般都在15km以内。而在农村及大区全覆盖时,用WCDMA FDD方式也是合适的,因此TDD和FDD模式是互为补充的。

July 01

[口碑]牛市大潮退去时,突然发现这8家基金公司在裸泳!

[口碑]牛市大潮退去时,突然发现这8家基金公司在裸泳!

2007年10月份以来,中国股市如钱塘江大潮一样在一番惊天动地、惊涛拍岸的涨潮后,以迅雷不及掩耳之势一泻千里,成为全世界最熊的股市之一。

基民们把钱交给基金公司,希望的是利用专业理财的优势,尽可能在熊市中减少损失、在牛市中多获利润,要不然为什么要支付那么多管理费?

股神巴菲特说“只有在潮水退去时,你才会知道谁一直在裸泳”。在中国股市历史上最为惨烈的牛市退潮中,哪些基金公司在职裸泳?经过对比,这8家基金公司正赤身裸体、一比不挂地站在沙滩上!

中邮基金。这家基金公司旗下仅有的两支基金2008年以来的净值增长率排在主动型股票基金倒数第一、第二位,两支基金2008年以来的净值亏损都超过了44%。剔除17支被动型基金,共有172支主动型股票基金。中邮核心优选排在第177位,中邮核心成长排在第178位,净值损失幅度不仅超越了所有的主动型基金,而且超过了5支被动型基金,由此可见中邮基金公司是光着身子从家里跑到沙滩里游泳的。

长信基金。长信基金公司成立的历史不长,也就相当于18岁左右的样子。这家基金公司旗下的两支基金业绩表现也是相当的“可观”:2008年以来,长信金利基金的业绩在172支主动型基金中排在第172位,长信银利基金在172支主动型基金中排在第142位。长信基金管理公司已是到了18岁的青春妙龄,但是还是没有摆脱幼儿的习惯,竟然光着屁股在众目睽睽之下游来游去。

大成基金。大成基金管理公司是中国最早成立的10家基金公司之一,和华夏、博时等基金公司是一年出生的。按年龄,大成基金公司应是中老年人了,可是当人家华夏基金公司成为受人尊敬的长者时,大成基金公司仍然是老不知耻,说难听点是死不要脸。大家可以看看大成基金公司旗下各支基金业绩表现:大成创新成长业绩增长率在172支主动型股票基金中排在第166名,大成2020基金第154名,大成稳健基金第153名,大成精选第141名,大成积极成长第136名,大成景阳第132名。这支老牌基金公司旗下基金集体没落足以说明,大成基金公司是满脸皱纹的老年裸泳者。

融通基金。融通基金公司是小有名气的基金公司,乡里乡外的人都久闻其名。可是融通基金公司显然不太自重,在低头不见抬头见的人群中,竟然连短裤都脱光了跳到了海水里洗澡。请看融通旗下支主动型股票基金的表现:融通先锋第171名,融通行业景气第162名,融通成长第128名。融通基金公司旗下的所有股票型基金均巨幅亏损,整体落后,让我们对这家基金公司的专业能力表示严重质疑。

长盛基金。长盛也是老资格基金公司了,这家基金公司近几年以来都是破罐子破摔,旗下的所有基金都是持续低迷:成长动态精选在172支主动型股票基金中排在第164名,长盛同德排在第126名,长盛同智排在第121名。我想问问长盛基金公司,光着身子在摩肩接踵的海淮上游泳感觉真有那么好吗?

广发基金。广发基金公司曾经是非常体面的人,有人说广发是谦谦君子。可是广发基金这次存有侥幸心理,以为偶尔脱一下衣服可以神不知鬼不觉,等没人时再穿上衣服,君子的形象还会继续保持下去。可是这次大潮退去的太快,还没等广发反应过来,广发的全身已完全暴露在阳光下的沙滩上。这怨谁呢?广发基金公司旗下的所有主动型股票类基金整体萎糜:广发策略第159名,小盘第156名,广发聚丰第151名,广发大盘第137名。请问广发基金:“你还知道前100名是什么滋味吗?”

新世纪基金。新世纪基金公司是新成立的,好像是从外地迁来的新居民。可能觉得大家都不太认识,就对自己的行为不加检点了,经常不穿衣服在海滩上招摇过市。这家基金公司唯一的基金——新世纪优选分红业绩表现在172支主动型股票基金中排在第163名。

东方基金。东方基金管理公司旗下的两支主动管理型股票基金曾经是冰火两重天,东方精选曾经在牛市中有上佳表现,可是另一支基金东方龙却是典型的“东方虫”,业绩表现从来就没好过。经过这次大潮退去,东方精选和东方龙全军覆没,东方精选基金排在第160名,东方龙排在第133名。

裸泳基金,还记得您西装革履、高谈阔论鼓动投资者认购申购你们的基金产品时的形象吗?

June 25

BIRT的文档生成,渲染技术

关于编写viewer,关键在于使用ReportEngine API,这个在birt官方文档上有很详细的描述。 这里将几个主要环节总结一下:
  1. 启动ReportEngine
    这里需要注意启动ReportEngine的开销问题和图片链的协议的问题。使用 IReportEngineFactory比每次new一个出来性能方面要好很多。使用HTMLEmitterConfig可以使得生成的HTML报表中的图片的src指向一个web资源而非file资源。
    public IReportEngine getEngine() ...{
        
    try ...{
          
    if(platformContext == null...{
            platformContext 
    = new PlatformServletContext(servletContext);
          }

          engineConfig 
    = new EngineConfig();
          engineConfig.setEngineHome(
              servletContext.getRealPath(
    "/WEB-INF/platform/"));
          
    // 要求ENGINE HOME 位于WEB-INF/Platform
          engineConfig.setPlatformContext(platformContext); 
          
    //This call sets the Log directory name and level
          engineConfig.setLogConfig(getLogDir(), Level.FINE);
          
          
    //设置Emitter,渲染HTML的时候,image的地址是HTTP协议而不是File协议
          HTMLEmitterConfig emitterConfig = new HTMLEmitterConfig( );
          emitterConfig.setActionHandler(
    new HTMLActionHandler());
          HTMLServerImageHandler imageHandler 
    = new HTMLServerImageHandler();
          emitterConfig.setImageHandler(imageHandler);
          engineConfig.getEmitterConfigs().put(
    "html", emitterConfig);
          
          
    //设置日志level
          engineConfig.setLogConfig(getLogDir(), Level.WARNING);
          
    //启动Platform,创建ReportEngine
          Platform.startup(engineConfig);
          IReportEngineFactory factory 
    = (IReportEngineFactory) Platform
              .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
          engine 
    = factory.createReportEngine(engineConfig);
          engine.changeLogLevel(Level.WARNING);
          
          log.debug(
    "A new engine startup.");
        }
     catch (BirtException e) ...{
          e.printStackTrace();
        }


        
    return engine;
      }
  2. 运行报表
    我理解为编译报表文件。BIRT在渲染报表之前,要将报表编译为.rptdocument,再根据这个文件将报表渲染为HTML格式或PDF格式。编译报表使用IRunTask:
    protected void run(String rptDesign) ...{
        
    assert (context != null);

        IReportEngine engine 
    = context.getEngine();
        
    // Open a report design
        IReportRunnable design = null;
        
    try ...{
          design 
    = engine.openReportDesign(context
              .getFullRptDesignFilename(rptDesign));
          
    // Create task to run the report - use the task to
          
    // execute the report and save to disk.
          IRunTask task = engine.createRunTask(design);
          String doc 
    = context.getFullRptDocumentFilename(rptDesign);
          
    // run the report and destroy the engine
          task.run(doc);
          
          log.debug(
    "save rpt design to " + doc);
          task.close();
        }
     catch (EngineException e) ...{
          e.printStackTrace();
        }

      }
  3. 渲染报表
    BIRT支持HTML格式和PDF格式,这两种报表生成的过程相同,只是设置不同的RenderContext和RenderOptions。我们把相同的部分提取为父类的公共方法,不同的部分留给子类实现:
    IReportDocument iReportDocument = engine.openReportDocument(docFilename);
          
    //Create Render Task
          IRenderTask task = engine.createRenderTask(iReportDocument);
          task.addScriptableJavaObject(
    "jsBirtObject"
              getScriptableObject(scriptObj));
          
    if(params != null && !params.isEmpty()) ...{
            task.setParameterValues(params);
          }

          setRenderContext(task); 
    //设置Render Context,具体由子类实现
          setRenderOptions(task, out); //设置Render Options,具体由子类实现
          task.render();
          task.close();
        } 
    catch (EngineException e) ...{
          e.printStackTrace();
        }
     finally ...{
          engine.shutdown();
        }
  4. 渲染PDF和HTML报表
    • PDF
        /** *//**
         * 
      @see AbstractBirtReportParser#setRenderContext(IRenderTask)
         
      */

        @Override
        
      protected void setRenderContext(IRenderTask task) ...{
          PDFRenderContext renderContext 
      = new PDFRenderContext();
          renderContext.setEmbededFont(
      true);    
          HashMap contextMap 
      = new HashMap();
          contextMap.put( EngineConstants.APPCONTEXT_PDF_RENDER_CONTEXT, renderContext);
          task.setAppContext( contextMap );        
        }


        
      /** *//**
         * 
      @see AbstractBirtReportParser#setRenderOptions(IRenderTask, OutputStream)
         
      */

        @Override
        
      protected void setRenderOptions(IRenderTask task, OutputStream out) ...{
          RenderOptionBase options 
      = new RenderOptionBase();
          options.setOutputStream(out);
          options.setOutputFormat(RenderOptionBase.OUTPUT_FORMAT_PDF);
          task.setRenderOption(options);
        }
    • HTML
      我们要生成一个HTML的一部分,而非包含<html/>标记的完整的HTML文档
        /** *//**
         * 
      @see AbstractBirtReportParser#setRenderContext(IRenderTask)
         
      */

        @Override
        
      protected void setRenderContext(IRenderTask task) ...{
          HTMLRenderContext renderContext 
      = new HTMLRenderContext();
          renderContext.setBaseURL(context.getBaseURL());        
         
      //You must define HTMLServerImageHandler to use a URL
          renderContext.setBaseImageURL(context.getBaseImageURL());
          
      //renderContext.setImageDirectory("myimages");
          renderContext.setImageDirectory(context.getImageDirectory());
          renderContext.setSupportedImageFormats(
      "JPG;PNG");
          HashMap contextMap 
      = new HashMap();
          contextMap.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext);
          task.setAppContext( contextMap );    
        }


        
      /** *//**
         * 
      @see AbstractBirtReportParser#setRenderOptions(oIRenderTask, OutputStream)
         
      */

        @Override
        
      protected void setRenderOptions(IRenderTask task, OutputStream out) ...{
          HTMLRenderOption options 
      = new HTMLRenderOption();
          options.setOutputStream(out);
          options.setEmbeddable(
      true);
          task.setRenderOption(options);   
        }

 

May 25

首付全亏利息白付 上海夫妻先喜后悲的买房人生

要结婚了,等不下去了,房价还没有跌的趋势,和父母商量……父母愁眉苦脸,咬咬牙,养老的钱也不要了,一辈子积蓄给你吧,付个首付。儿子愁眉苦脸,咬咬牙,工资3000元,每个月还2800,30年还清,平时就靠老婆每个月2000工资过日子了,还好老婆比较懂事,不吵不闹也同意了装修结婚钱?先找亲戚借吧,平时的生活费再省点,慢慢还孩子头几年先不要了吧,否则只能天天喝粥了,但愿自己不要失业,父母不要生病。 

  勒紧裤带过了1年……

  自己的房子涨了30%,高兴……盼望天天涨,得意自己当年多么明智,早知道就再早买一点。继续勒紧裤带。 

  又过了一年……

  房价又涨了20%,算算自己身价上百万了,高兴老板真抠门,不长工资,还暗示新来的外地大学生每个月给1500,还天天义务加班……老婆又抱怨单位远,工作辛苦,想换个环境,只好装糊涂,没敢接口。老妈问什么时候要孩子……继续装糊涂同事买了新的MP3,低头看看自己老是死机的三星手机……算了,能用就行。

  时间怎么过的这么慢,才还了2年贷款,还有28年要还……不过一想到自己的房子还在涨,心里还是美滋滋的。 

  银行真不要脸,又加息了,每个月又要多还350,怎么工资不涨,唉……天天骑车上班吧。今天公司来了几个实习生,快要毕业了,正在找工作,一打听还是名牌大学的,实习期不要工资,只管饭,看把老板美的,还咕哝着,大学生就是好用,以前怎么没想到……我日! 

  最近听说二手房跌了,到家里附近的中介去一打听,好像也没怎么跌,原本120万的房现在还要115万,离当年的价还远着呢……安心。 

  老婆最近情绪不太好,老是说公司里某某又买了新车,某某又去了马尔代夫。以前不是说好了吗,人家过人家的日子,咱们过咱们的日子,家里的洗衣机坏了还没换呢,晚上回去问问老爸最近手头有没有闲钱……怎么开口呢? 

  听对门的张阿姨说,小区里好些没人住的空房最近都挂牌到中介去了,说是前两个月有不少国外资金都从楼市撤了,消息灵通的前几个月就脱手了,剩下的最近也急着找买家……琢磨着,不可能吧,昨天还人人嚷着上海房价不坑跌的,这次肯定又是谣言。 

  妈的,人算不如天算,老婆竟然怀孕了,怎么那么不小心,犹豫不决,老婆马上要30了,要还是不要……妈的真头痛!

  商量了一晚上,还是要吧,船到桥头自然直,现在开始要努力工作,努力挣钱……不过想到那批大学生还真是烦人,不给钱都那么卖力。 

房价好像是真跌了,今天去中介打听行情,中介热情的不得了,不过一听说不是来买房了,立刻就不理人了,他妈的,狗眼看人低,想当年还打电话到我家问是不是有房要卖呢! 

  这个月银行的催缴贷款通知书好像变格式了,还附带了一份法律声明,妈的,老子什么时候说不还了,用得着那么严肃吗,今天也火大,本来还想跟老板谈谈加工资的事情,没想到还没开口,老板先发话了:小严啊,你要努力啊,你看看公司新来的员工,尽管经验不足,但是有拼劲,你们这些老员工的可要随时注意啊……我日!!! 

  又过了5个月…… 

  今天老婆回来说,按照公司规定,女职员要生孩子,最好自动离职,公司给一笔补偿金,否则到时候大家都不好看。他妈的,天下老板一般黑啊,就这几千的补偿费顶个p用啊…… 

  最后老婆还是辞职了,否则在公司天天穿小鞋,这日子还怎么过,反正再过几个月就要生了,在家歇着也好,就是生活费比较头痛,贷款……。竟然还有27年,开始觉得有点长了…… 

  最近在考虑着是不是要把房子卖了,不过要是卖了住哪里去呢?去和爸妈挤。挤?老婆这一关不好过啊,最近在家情绪也不好,还是不要惹她生气算了,怀孕的女人,唉! 

  还是忍不住,去中介转转,最近几个月,看的人多,买的人少,妈的,房价涨的时候人人抢,现在便宜了反而没人要了,中国人就是这点臭脾气,就他妈的喜欢凑热闹……先问问我这房能卖多少?什么?才80万,和我当年买的时候还便宜,这跌的也太快了吧?什么?还不一定有人买?

  回家拿计算机算了半天,把房子卖了还贷款,剩不了多少,这3年省吃俭用的钱都他妈的付了利息,我的装修啊……唉,先不告诉老婆。 

  一晚上没睡好,要是房价再跌怎么办呢,把银行寄来的法律声明拿出来看看,写的还真他妈的严重,老婆马上要生孩子,还要用钱,老爸老妈看来是无能为力了,老婆现在又没有收入,真烦人……头都要炸了。 

 终于忍不住,跟老婆商量,是不是先把房子卖了,然后租个房子,或者买个偏远小房子先住,等今后有钱了(中个500万)再买个大的。老婆倒是沉得住气,从头至尾一语不发,末了撇了我一眼:“随你便吧,我爸妈那里你自己去说”……唉,还让不让人活啊…… 

  今天到中介去挂牌,又听到个消息,说是银行为了避免风险,对房屋贷款采取更严格的审查措施,很多人想买房都贷不到款了。想当年我买这房,收入证明上随手就写了个10万/年,也没见人查吗,唉看来世道是真的变了。 

  张阿姨今天又听来个消息,说是小区里好几套房都被银行收走了,下个月准备拍卖了,真没想到也有这么一天。


  最终还是把房子卖了,也不知道这房价要跌到什么时候,买主是一对小夫妻,买来自己住,据说是觉得我家装修还不错,65万买走的,拿着钱把贷款还了,还剩1万多,父母省吃俭用一辈子的钱打了水瓢,结婚3年一分钱的积蓄都没有,老婆回了娘家,昨天去找老婆,铁将军把门……唉,今后的日子怎么过唉…… 

  一个人常常会在惶惶不安中这样度过他的一生: 

  当一个人上学时,他总会惶惶不可终日,发愁要考个好名次,上个好学校…… 

  待考上了大学,又会惶惶不可终日,发愁要找个好工作或出国…… 

  待找到了一个工作,更惶惶不可终日,发愁老板炒鱿鱼,同事落井下石…… 

  为了找到真爱,又更惶惶不可终日,发愁自己条件差,找不到好对象……

  待找到另一半,又惶惶不可终日,与别人攀比买个更大的房子更好的车子还贷款; 

  待有了孩子,又将这惶惶不可终日遗传给他,由他开始新的轮回。 

  待退休后,依靠微薄的退休金或积蓄,在惶惶不可终日中死去……

  这样的人生,我称之为狗样年华。

April 27

me

ssssssssssssssss

最近事情真多

昨天去了趟仁济医院,到了急诊室,坐了会,心理好复杂,但是上天不能改变事实,就是这样,人死了
看到被推出抢救室,套上蓝色的塑料袋,被推进了太平间,走了,感慨,人生好无奈!
我努力朝向天空,试着让眼泪不流下来,不想走,想要说,但是无法喊出,突然天空一片黑,原来你已经离开我...
April 16

看对象引用是怎样严重影响垃圾收集器的

 如果您认为 Java 游戏开发人员是 Java 编程世界的一级方程式赛车手,那么您就会明白为什么他们会如此地重视程序的性能。

  如果您认为 Java 游戏开发人员是 Java 编程世界的一级方程式赛车手,那么您就会明白为什么他们会如此地重视程序的性能。 游戏开发人员几乎每天都要面对的性能问题,往往超过了一般程序员考虑问题的范围。哪里可以找到这些特殊的开发人员呢?Java 游戏社区就是一个好去处。 虽然在这个站点可能没有很多关于服务器端的应用,但是我们依然可以从中受益,看看这些“惜比特如金”的游戏开发人员每天所面对的,我们往往能从中得到宝贵的经验。让我们开始游戏吧!

  对象泄漏

  游戏程序员跟其他程序员一样――他们也需要理解 Java 运行时环境的一些微妙之处,比如垃圾收集。垃圾收集可能是使您感到难于理解的较难的概念之一, 因为它并不能总是毫无遗漏地解决 Java 运行时环境中堆管理的问题。似乎有很多类似这样的讨论,它的开头或结尾写着:“我的问题是关于垃圾收集”。

  假如您正面遭遇内存耗尽(out-of-memory)的错误。于是您使用检测工具想要找到问题所在,但这是徒劳的。您很容易想到另外一个比较可信的原因:这是 Java 虚拟机堆管理的问题,而不会认为这是您自己的程序的缘故。但是,正如 Java 游戏社区的资深专家不止一次地解释的,Java 虚拟机并不存在任何被证实的对象泄漏问题。实践证明,垃圾收集器一般能够精确地判断哪些对象可被收集,并且重新收回它们的内存空间给 Java 虚拟机。所以,如果您遇到了内存耗尽的错误,那么这完全可能是由您的程序造成的,也就是说您的程序中存在着“无意识的对象保留(unintentional object retention)”。

  内存泄漏与无意识的对象保留

  内存泄漏和无意识的对象保留的区别是什么呢?对于用 Java 语言编写的程序来说,确实没有区别。两者都是指在您的程序中存在一些对象引用,但实际上您并不需要引用这些对象。一个典型的例子是向一个集合中加入一些对象以便以后使用它们,但是您却忘了在使用完以后从集合中删除这些对象。因为集合可以无限制地扩大,并且从来不会变小,所以当您在集合中加入了太多的对象(或者是有很多的对象被集合中的元素所引用)时,您就会因为堆的空间被填满而导致内存耗尽的错误。垃圾收集器不能收集这些您认为已经用完的对象,因为对于垃圾收集器来说,应用程序仍然可以通过这个集合在任何时候访问这些对象,所以这些对象是不可能被当作垃圾的。

  对于没有垃圾收集的语言来说,例如 C++ ,内存泄漏和无意识的对象保留是有区别的。C++ 程序跟 Java 程序一样,可能产生无意识的对象保留。但是 C++ 程序中存在真正的内存泄漏,即应用程序无法访问一些对象以至于被这些对象使用的内存无法释放且返还给系统。令人欣慰的是,在 Java 程序中,这种内存泄漏是不可能出现的。所以,我们更喜欢用“无意识的对象保留”来表示这个令 Java 程序员抓破头皮的内存问题。这样,我们就能区别于其他使用没有垃圾收集语言的程序员。

  跟踪被保留的对象

  那么当发现了无意识的对象保留该怎么办呢?首先,需要确定哪些对象是被无意保留的,并且需要找到究竟是哪些对象在引用它们。然后必须安排好 应该在哪里释放它们。最容易的方法是使用能够对堆产生快照的检测工具来标识这些对象,比较堆的快照中对象的数目,跟踪这些对象,找到引用这些对象的对象,然后强制进行垃圾收集。有了这样一个检测器,接下来的工作相对而言就比较简单了:

  等待直到系统达到一个稳定的状态,这个状态下大多数新产生的对象都是暂时的,符合被收集的条件;这种状态一般在程序所有的初始化工作都完成了之后。

  强制进行一次垃圾收集,并且对此时的堆做一份对象快照。

  进行任何可以产生无意地保留的对象的操作。

  再强制进行一次垃圾收集,然后对系统堆中的对象做第二次对象快照。

  比较两次快照,看看哪些对象的被引用数量比第一次快照时增加了。因为您在快照之前强制进行了垃圾收集,那么剩下的对象都应该是被应用程序所引用的对象,并且通过比较两次快照我们可以准确地找出那些被程序保留的、新产生的对象。

  根据您对应用程序本身的理解,并且根据对两次快照的比较,判断出哪些对象是被无意保留的。

  跟踪这些对象的引用链,找出究竟是哪些对象在引用这些无意地保留的对象,直到您找到了那个根对象,它就是产生问题的根源。

显式地赋空(nulling)变量

  一谈到垃圾收集这个主题,总会涉及到这样一个吸引人的讨论,即显式地赋空变量是否有助于程序的性能。赋空变量是指简单地将 null 值显式地赋值给这个变量,相对于让该变量的引用失去其作用

  清单 1. 局部作用域

  

public static String scopingExample(String string) {

  StringBuffer sb = new StringBuffer();

  sb.append("hello ").append(string);

  sb.append(", nice to see you!");

  return sb.toString();

  }

        当该方法执行时,运行时栈保留了一个对 StringBuffer 对象的引用,这个对象是在程序的第一行产生的。在这个方法的整个执行期间,栈保存的这个对象引用将会防止该对象被当作垃圾。当这个方法执行完毕,变量 sb 也就失去了它的作用域,相应地运行时栈就会删除对该 StringBuffer 对象的引用。于是不再有对该 StringBuffer 对象的引用,现在它就可以被当作垃圾收集了。栈删除引用的操作就等于在该方法结束时将 null 值赋给变量 sb。

  错误的作用域

  既然 Java 虚拟机可以执行等价于赋空的操作,那么显式地赋空变量还有什么用呢?对于在正确的作用域中的变量来说,显式地赋空变量的确没用。但是让我们来看看另外一个版本的 scopingExample 方法,这一次我们将把变量 sb 放在一个错误的作用域中。

  清单 2. 静态作用域

  

static StringBuffer sb = new StringBuffer();

  public static String scopingExample(String string) {

  sb = new StringBuffer();

  sb.append("hello ").append(string);

  sb.append(", nice to see you!");

  return sb.toString();

  }

        现在 sb 是一个静态变量,所以只要它所在的类还装载在 Java 虚拟机中,它也将一直存在。该方法执行一次,一个新的 StringBuffer 将被创建并且被 sb 变量引用。在这种情况下,sb 变量以前引用的 StringBuffer 对象将会死亡,成为垃圾收集的对象。也就是说,这个死亡的 StringBuffer 对象被程序保留的时间比它实际需要保留的时间长得多――如果再也没有对该 scopingExample 方法的调用,它将会永远保留下去。

一个有问题的例子

  即使如此,显式地赋空变量能够提高性能吗?我们会发现我们很难相信一个对象会或多或少对程序的性能产生很大影响,直到我看到了一个在 Java Games 的 Sun 工程师给出的一个例子,这个例子包含了一个不幸的大型对象。

  清单 3. 仍在静态作用域中的对象

  

private static Object bigObject;

  public static void test(int size) {

  long startTime = System.currentTimeMillis();

  long numObjects = 0;

  while (true) {

  //bigObject = null; //explicit nulling

  //SizableObject could simply be a large array, e.g. byte[]

  //In the JavaGaming discussion it was a BufferedImage

  bigObject = new SizableObject(size);

  long endTime = System.currentTimeMillis();

  ++numObjects;

  // We print stats for every two seconds

  if (endTime - startTime >= 2000) {

  System.out.println("Objects created per 2 seconds = " + numObjects);

  startTime = endTime;

  numObjects = 0;

  }

  }

  }

        这个例子有个简单的循环,创建一个大型对象并且将它赋给同一个变量,每隔两秒钟报告一次所创建的对象个数。现在的 Java 虚拟机采用 generational 垃圾收集机制,新的对象创建之后放在一个内存空间(取名 Eden)内,然后将那些在第一次垃圾收集以后仍然保留的对象转移到另外一个内存空间。在 Eden,即创建新对象时所在的新一代空间中,收集对象要比在“老一代”空间中快得多。但是如果 Eden 空间已经满了,没有空间可供分配,那么就必须把 Eden 中的对象转移到老一代空间中,腾出空间来给新创建的对象。如果没有显式地赋空变量,而且所创建的对象足够大,那么 Eden 就会填满,并且垃圾收集器就不能收集当前所引用的这个大型对象。所产生的后果是,这个大型对象被转移到“老一代空间”,并且要花更多的时间来收集它。

通过显式地赋空变量,Eden 就能在新对象创建之前获得自由空间,这样垃圾收集就会更快。实际上,在显式赋空的情况下,该循环在两秒钟内创建的对象个数是没有显式赋空时的5倍――但是仅当您选择创建的对象要足够大而可以填满 Eden 时才是如此, 在 Windows 环境、Java虚拟机 1.4 的默认配置下大概需要 500KB。那就是一行赋空操作产生的 5 倍的性能差距。但是请注意这个性能差别产生的原因是变量的作用域不正确,这正是赋空操作发挥作用的地方,并且是因为所创建的对象非常大。

  最佳实践

  这是一个有趣的例子,但是值得强调的是,最佳实践是正确地设置变量的作用域,而不要显式地赋空它们。虽然显式赋空变量一般应该没有影响,但总有一些反面的例子证明这样做会对性能产生巨大的负面影响。例如,迭代地或者递归地赋空集合内的元素使得这些集合中的对象能够满足垃圾收集的条件,实际上是增加了系统的开销而不是帮助垃圾收集。请记住这是个有意弄错作用域的例子,其实质是一个无意识的对象保留的例子。

April 09

创业假象

上海的创业公司,本人领衔,方向为电子商务。启动资金雄厚,目标也不邪门。这个生意的道理很简单:帮助别人,我们同时从中受益。

我们想成为一家以技术为成功增添筹码的电子商务企业;想做出一个产品体验良好且颇有亮点的网站;想做一件对人们有益让人们的生活变得更加美好的事情。

再三权衡,网站平台将采用J2EE分布式架构。

目前技术部一个人都没有,诚恳地欢迎在上海的程序员朋友加盟。拟招聘人数:5-8名。

技术总监1名。薪水8000-10000元。要求是J2EE+Oracle+Linux等方面的超高手,有Web 2.0开发经验。有过大中型项目开发管理经验,做事仔细认真负责。

java熟练程序员2-3名。薪水5000元左右。要求参与过大中型项目的开发,能独自完成既定模块的开发工作,编程习惯良好。懂Linux服务器维护者优先考虑。

初级java程序员:2-4名。薪水3000元左右。要求做过java开发。不熟练不要紧,咱们可以一起成长。
(注:以上所说薪水均为人民币,非美金,亦非越南盾。)

补充要求:年龄不要比我老(我1982) ,学历不要比我高(我大本)。尤其欢迎有梦想敢拼搏的年轻朋友。

办公地点在上海,张江科技园。8月份开工。公司目前还没注册,预计下月办完注册手续。

能不能成为同事,那要靠缘分;不妨先认识一下,交个朋友。我深知很多朋友对于创业型公司的警惕;当然也了解很多朋友对于创业公司的热爱。加入一个创业公司,风险与机遇并存。有可能,大家一起做出了傲人业绩;当然也有可能,我们最终黯然神伤。但可以肯定的一点就是:您的表现对这家公司的未来至关重要;您可以选择让这家公司成功,或者让这家公司失败。因为我们是一起创业的团队。

我不拿股份期权忽悠人。创业公司说这个太遥远,甚至有点扯淡。但是,当我们一起做得开心并有成就感的时候,请相信我会跟每一位同仁仔细商谈这件事情。而在此之前,每月按时给您付薪水,是我的责任所在。

 

April 07

在WEBLOGIC SERVER 10中使用JAX-WS和JAXB

摘要

  JAX-WS(Java Architecture for Web Services)是JAX-RPC的后续版本。它是一种基于标准的API,可用于编写、汇编和部署Java Web services。JAXB(Java Architecture for XML Binding)是一种Java/XML绑定技术。JAX-WS将使用JAXB处理所有的Java绑定操作。

  本文将简要介绍BEA WebLogic Server 10.1中所支持的JAX-WS 2.0和JAXB 2.0。读者可通过文章中的示例代码入门。

JAXB 2.0 Java开发人员快速指南

JAX-WS使用JAXB处理所有的Java绑定操作,因此本文将重点讨论与JAX-WS有关的JAXB。熟练的Java开发人员通常都很繁忙。考虑到这一点,我将主要讨论以下两方面内容:

目前使用JAXB 2.0可以完成的任务。
目前使用JAXB 2.0无法完成的任务。

如果您忙得连阅读这篇文章的时间都没有,请直接 下载 本文所提供的示例代码。压缩包中的README文件介绍了具体的操作步骤。


使用JAXB 2.0可以完成那些任务?

下面列出了使用JAXB 2.0可以实现的一些比较有趣的任务。我的意思并不是说使用其他Java-to-XML/XML-to-Java绑定技术就不能实现这些操作。我只是列出了使用JAXB 2.0可以完成的操作:

通过含有一个或多个<xs:schema>元素的WSDL生成Java对象图。这些<xs:schema>元素可以使用<xs:import>和<xs:include>元素引用其他的<xs:schema>元素。
通过Java对象图生成XML Schema文档。
利用快速信息集分析程序(SAX和StAX)和串行器(serializer)。
随机访问XML文档的XML信息集。
直接在XML Schema文件或外部绑定自定义文件中嵌入绑定声明。
在取消编组(unmarshalling)时使用基于事件的流模型。
编组二进制数据(比如说,处理MTOM和MIME附件)。
开发自己的插件,扩展JAXB代码生成功能。然后,这些插件(作为类封装在一个.jar文件中)可以访问JAXB生成的代码,还可生成另外的类/方法/字段/注释/评论。
编写定制代码将已有类转化为由JAXB模式编译程序生成的类。

使用JAXB 2.0无法完成的操作

下面列出了使用JAXB 2.0无法完成的操作(或者说是我不知道如何实现):

通过XML文档生成XML模式。实际上,这并没有什么大不了的。因为其他工具(如Stylus Studio、XMLSpy和XMLBuddy Pro)可以实现这一功能。
匹配StAX或SAX解析的性能指数。解析同一XML文档时,SAX需要10ms,StAX需要46ms,而JAXB 2.0需要59ms。
使用JAXB进行Java绑定的示例POJO JAX-WS Web服务
JAX-WS是一种基于标准的API,可用于编写、汇编和部署Java Web services。它使用JAXB处理所有与此相关的Java绑定操作。JAX-WS 2.0/2.1并不支持JAX-RPC或Apache Beehive XMLBean类型的使用,只支持JAXB类型的XMLBean。

JAX-WS提供了两个编程模型,用于开发Web服务端点。

1.从Java开始(Start from Java)——此编程模型使您能够充分地控制Web服务端的方法签名(method signature)中所使用的Java数据类型。在该模型中,您可以手动编写(或者使用工具生成)Java对象,这些Java对象将作为Web服务操作及JWS注释的输入参数和返回值使用。

BEA为“从Java开始”编程模型提供了jwsc Ant任务。它将Glassfish wsimport Ant任务封装在内部(即从内部调用)。因此我们不用直接在build.xml文件中使用Ant任务。

Ant Task Reference for jwsc 这篇BEA文档介绍了如何使用<jws>元素的type="JAXWS"属性生成JAXB工件。jwsc Ant任务中的<binding>子元素可用于指定所要使用的JAXB绑定自定义文件。

2.从WSDL开始(Start from WSDL)——此编程框架将通过WSDL的内容生成Web服务端点的主干代码。WSDL中<xs:schema>部分生成的Java数据类型将作为Web服务操作的输入参数和返回值使用。

BEA为“从WSDL开始”编程模型提供了wsdlc Ant任务。它将Glassfish wsimport Ant任务封装在内部。因此我们不用直接在build.xml文件中使用Ant任务。

Ant Task Reference for wsdlc 这篇BEA文档介绍了如何使用<wsdlc>元素的type="JAXWS"属性生成JAXB工件。wsdlc Ant任务中的<binding>子元素可用于指定所要使用的JAXB绑定自定义文件。

文章的其余部分将介绍如何创建、部署和测试基于POJO(Plain-Old Java Object)的JAX-WS Web服务端点,即DataStagingService。

创建定制文件

第一步需要创建一个JAX-WS定制文件。该文件还可以充当JAXB绑定定制文件,并允许我们控制JAX-WS和JAXB构建时流程,以及它们生成的工件。

定制文件是一个XML文档,它符合XML模式的http://java.sun.com/xml/ns/jaxws和http://java.sun.com/xml/ns/jaxb名称空间。有关创建该定制文件的详细信息,请参阅 JAX-WS 2.0 Beta Customizations。

DataStagingService Web服务的JAX-WS定制文件相当小,因此我列出了该文件的内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bindings
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns="http://java.sun.com/xml/ns/jaxws"
wsdlLocation="DataStagingService2.wsdl"

<bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
node="wsdl:definitions"

<package name="services.datastaging">
<jxb:javadoc>
<![CDATA[<body>Package level documentation for generated
package services.datastaging.</body>]]>
</jxb:javadoc>
</package>
<jxb:schemaBindings>
<jxb:package name="com.acmeworld.irad.services.datastaging"/>
</jxb:schemaBindings>
</bindings>
</bindings>

我将主要使用该定制文件控制生成类的Java包名。您可以在该定制文件中实现更多其他功能,请参阅 JAX-WS 2.0 Beta Customizations。

下面的清单展示了DataStagingService Web服务的WSDL中所使用的XML Schema:

<xs:schema
targetNamespace="http://services.irad.acmeworld.com/datastaging"
xmlns:tns="http://services.irad.acmeworld.com/datastaging"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"

<xs:complexType name="DataStaging">
<xs:sequence>
<xs:element name="inputURIs">
<xs:complexType>
<xs:sequence>
<xs:element name="inputURI" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="uri" type="xs:anyURI"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="DataStagingResponse">
<xs:sequence>
<xs:element name="outputURIs">
<xs:complexType>
<xs:sequence>
<xs:element name="outputURI" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="uri" type="xs:anyURI"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

<xs:element name="dataStaging" type="tns:DataStaging"/>
<xs:element name="dataStagingResponse" type="tns:DataStagingResponse"/>
</xs:schema>

此WSDL的XML Schema部分中的内容相当普通。请求和响应消息是由普通的(具有匿名和显式内容模型的)全局complexType元素一起创建的。DataStagingService是一个doc/literal样式的Web服务,因此其中含有全局元素与WSDL的<part>元素结合使用。

使用build.xml文件构建
我将使用WebLogic Server 10中附带的Eclipse IDE继续演示。WebLogic for Workshop 10中并没有特定的Eclipse IDE插件可用于JAX-WS和JAXB开发,因此我将使用build.xml Ant脚本和Ant View窗口。

这个build.xml文件的内容太长,因此我只列出了其中的重要部分。

<path id="jaxws.classpath">
<fileset dir="${bea.home}/modules">
<include name="javax.xml.stream_1.0.0.0.jar"/>
<include name="javax.jws_2.0.jar"/>
<include name="javax.xml.bind_2.0.jar"/>
<include name="javax.xml.ws_2.0.jar"/>
<include name="javax.xml.soap_1.3.0.0.jar"/>
<include name="javax.activation_1.1.jar"/>
<include name="glassfish.jaxws.rt_2.0.1.jar"/>
<include name="glassfish.jaxb_2.0.5.jar"/>
<include name="glassfish.jaxws.saaj.impl_2.0.1.jar"/>
<include name="glassfish.jaxws.tools_2.0.1.jar"/>
</fileset>
</path>

上面的清单指出了build.xml文件中所使用的<path>元素。它表示WebLogic Server 10将在其JAX-WS和JAXB实现中使用共享的Java EE库模块来实现类。如您所见,这些类来自Glassfish RI JAR,而并非由WebLogic Server 10 Web Services栈开发小组编写。共享的Java EE库模块有利于Glassfish JAR的封装,并允许将它们的单个副本用于各种内部(对于BEA)或外部用途。众所周知,这些库模块位于${BEA_HOME}/modules目录。

上述清单中的JAR位于用户定义的库中。这样更易于编写在Eclipse IDE内部使用JAX-WS和JAXB API的代码。

生成JAX-WS服务端点和JAXB类

接下来,我们将实现DataStagingService Web服务的代码。首先,运行BEA wsdlc Ant任务,目的是生成主干JAX-WS端点实现和JAXB类。

WebLogic Server 10.1将使用Glassfish Project项目中的jar文件用于其JAX-WS和JAXB实现。type="JAXWS"属性将指定使用JAX-WS和JAXB,而不是JAX-RPC。

<target name="run-wsdlc" depends="clean">
<taskdef name="wsdlc" classname="weblogic.wsee.tools.anttasks.WsdlcTask"
classpathref="compile.classpath" />

<property name="client.binding" value="custom-client.xjb"/>

<wsdlc type="JAXWS"
srcWsdl="etc/${wsdl.file.name}.wsdl"
destJwsDir="WebContent/WEB-INF/lib"
destImplDir="${src.dir}"
explode="false"
verbose="${verbose}"
debug="${debug}"
failonerror="true">
<binding dir="etc" includes="${client.binding}"/>
<classpath>
<path refid="compile.classpath"/>
</classpath>
</wsdlc>
; /target>

type="JAXWS"属性和<binding>子元素需要格外注意。

这时,我们应该能够运行Ant构建文件了。结果将生成JAX-WS端点实现的代码。由于我提供了一个定制文件,因此生成代码将位于com.acmeworld.irad.services.datastaging包中。JAX-WS端点实现的完整代码比较长,因此我只摘录了其中的一部分:

public com.acmeworld.irad.services.datastaging.DataStagingResponse.OutputURIs dataStaging(com.acmeworld.irad.services.datastaging.DataStaging.InputURIs inputURIs)
{
DataStagingResponse dataStagingResponse = null;
InputStream inputstream = null;

try
{
//DataStaging.InputURIs contains zero or more
//DataStaging.InputURIs.InputURI JAXB objects.
//We loop through them, and use one of their getter
//methods to print out a bound value.

DataStaging.InputURIs.InputURI inputURI = null;
List inputURIList = inputURIs.getInputURI();

for (int i = 0; i < inputURIList.size(); i++)
{
inputURI = inputURIList.get(i);
log("dataStaging(InputURIs)", "inputURI.getUri()=" + inputURI.getUri());
}

//Next, we show one way to use the JAXB API, to convert
//the DataStaging.InputURIs input parameter to a byte[].
//This byte[] will contain an XML representation of that
//input parameter.

JAXBContext jc = JAXBContext.newInstance(DataStaging.InputURIs.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JAXBElement je = new JAXBElement(
new QName("http://services.irad.acmeworld.com/datastaging","inputURIs"),
DataStaging.InputURIs.class,
inputURIs
);
marshaller.marshal(je, baos);

//We use an existing XML file for the response from the
//Web service operation. We’ll load this XML file from
//the WEB-INF/classes directory, and use the JAXB API
//to create the JAXB object of our response.
inputstream = Thread.currentThread().getContextClassLoader().getResourceAsStream("SampleDataStagingResponseDocument.xml");

jc = JAXBContext.newInstance(DataStagingResponse.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
dataStagingResponse = (DataStagingResponse)unmarshaller.unmarshal(inputstream);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
finally
{
if (inputstream != null) try {} catch (Exception e){}
}

return dataStagingResponse.getOutputURIs();
}

其中的代码注释很好地解释了其过程,因此我在此处就不再赘述了。

编译JAX-WS服务端点

BEA jwsc Ant任务用于编译JAX-WS服务端点并生成待部署的WAR文件。

<target name="run-jwsc">
<taskdef name="jwsc" classname="weblogic.wsee.tools.anttasks.JwscTask"
classpathref="compile.classpath" />

<jwsc
destdir="${domain.home}/deployments/${project.name}"
srcdir="${src.dir}/${package.path}"
classpath="WebContent/WEB-INF/lib/${wsdl.file.name}_wsdl.jar"
keepGenerated="${keep}"

<binding dir="etc" includes="${client.binding}"/>
<module explode="false" name="${portType.name}Impl">
<jws
type="JAXWS"
file="${service.name}Impl.java"
compiledWsdl="WebContent/WEB-INF/lib/${wsdl.file.name}_wsdl.jar"

<WLHttpTransport
contextPath="datastaging"
serviceUri="DataStagingService"
portName="DataStagingServicePort"
/>
</jws>
</module>
<classpath>
<path refid="compile.classpath"/>
<pathelement location="WebContent/WEB-INF/lib/${wsdl.file.name}_wsdl.jar"/>
</classpath>
</jwsc>
</target>

同样,此处的type="JAXWS"属性和<binding>子元素值得格外注意。该代码还演示了如何避免将特定于WebLogic注释(比如说@WLHttpTransport)放在JWS中。

使用build.xml文件部署

JAX-WS中有一个倍爱好评的特性,即部署描述符的使用是可选的。这种特性很好,因为它解决了多个供应商所提供的JAX-WS实现之间的可移植性问题。

基于POJO的JAX-WS Web services已封装为Java EE Web应用程序,并且WebLogic Server 10所提供的wsdeploy Ant任务可以将这些应用程序部署到运行中的WLS实例上。此处,我将在build.xml文件中使用该wsdeploy Ant任务。

<target name="deploy">
<property name="wls.username" value="weblogic"/>
<property name="wls.password" value="weblogic"/>
<property name="wls.hostname" value="localhost"/>
<property name="wls.port" value="7031"/>
<property name="wls.server.name" value="W4WPAdminServer"/>

<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"
classpathref="compile.classpath" />

<wldeploy
action="deploy"
name="${project.name}"
source="${domain.home}/deployments/${project.name}"
user="${wls.username}"
password="${wls.password}"
verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}"
/>
</target>

使用WebLogic Test Client进行测试

WebLogic Test Client是一个Java EE Web应用程序。和WebLogic Server Administration Console (console.war)一样,它自动部署于您的WebLogic Server 10.1实例中。该应用程序的URL为:

http://<host>:<port>/wls_utc

DataStagingService的WSDL的URL为:

http://<host>:<port>/datastaging/DataStagingService?WSDL

输入该WSDL URL之后,单击“Test”按钮,然后便可在接下来出现的页面中输入测试请求XML。下面是一个示例请求XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dataStaging xmlns="http://services.irad.acmeworld.com/datastaging">
<inputURIs>
<inputURI>
<uri>http://www.altova.com</uri>
</inputURI>
<inputURI>
<uri>http://www.amazon.com</uri>
</inputURI>
</inputURIs>
</dataStaging>

WebLogic Test Client相当优秀,但是它实际上并不能测试在客户端上使用JAXB和JAX-WS。最后一步将实现这一任务。

使用JAX-WS Web服务客户端进行测试

最后,我们将使用JAX-WS Web服务客户端调用DataStagingService Web服务。最后一部分的代码要比JAX-WS服务端点的代码稍微复杂一些,因此它需要使用JAXB API。

try
{
DataStagingService service = new DataStagingService(
new URL("http://localhost:7031/datastaging/DataStagingService?WSDL"),
new QName("http://services.irad.acmeworld.com/datastaging",
_properties.getProperty("datastaging.service.portName"))
);

Dispatch sourceDispatch = service.createDispatch(
new QName("http://services.irad.acmeworld.com/datastaging",
"DataStagingService"),
Source.class,
Service.Mode.PAYLOAD
);

InputStream inputstream = Thread.currentThread().getContextClassLoader().
getResourceAsStream("SampleDataStagingRequestDocument.xml");

Source responseSource = sourceDispatch.invoke(new StreamSource(inputstream));

javax.xml.transform.TransformerFactory factory =
javax.xml.transform.TransformerFactory.newInstance();

javax.xml.transform.Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "xml");

javax.xml.transform.stream.StreamResult streamResult =
new javax.xml.transform.stream.StreamResult();

streamResult.setOutputStream(new java.io.ByteArrayOutputStream());
transformer.transform(responseSource, streamResult);

System.out.println((new StringBuffer()).append("response=").
append(streamResult.getOutputStream()).toString());
}
catch(Throwable throwable)
{
throwable.printStackTrace();
System.out.println((new StringBuffer()).append("Unexpected exception: ").
append(throwable.getMessage()).toString());
}

其中大多数代码专门用于执行XSL转换,并且使用了JDK中的JAXP API类。首先,创建一个DataStagingService服务桩(stub)。该服务桩将接收一个URL对象(指向服务端点的WSDL)和一些与XML相关的内容,用于建立要调用的服务。后者将在检索WSDL之后使用。

注意,DataStagingService服务桩和相关类是由BEA clientgen Ant任务生成的。我并没展示这些代码,不过该Ant任务也拥有一个type="JAXWS"和一个<binding>子元素。

摘录代码的其余部分包括:

创建Dispatch对象,该对象用于调用Web服务操作。Dispatch对象在功能上等同于JAX-RPC中的Call对象(与DII编程模型一起使用)。
通过XML文档创建有效负载。这违背了“为各个元素实例化一个对象”的实践,JAX-RPC需要这样。
调用Web服务操作。此外需要格外小心,因为“操作名称”包装器元素并不会自动添加。如果服务端点需要一个,则需要自己添加。
使用JAXP转换类将响应从Web服务操作编组到java.io.ByteArrayOutputStream中。您可以处理所需的一切内容(比如说byte[]、String和XML)。同样,这远没有在JAX-RPC中处理JavaBean图(或javax.xml.soap.SOAPElement对象)费力。
以上是整个步骤的总结。希望您可更好的理解如何在WebLogic Server 10中使用JAX-WS 2.0和JAXB 2.0实现。这些实现中的API即可以在服务提供者端使用,也可以在服务用户端使用。请查看我所提供的示例代码,您会发现其中没有使用(或导入)任何特定于WebLogic的类。这表示该代码是完全可移植的,并且应该能够在Axis2上编译,而无需对代码(或定制文件)进行任何修改。但是,您需要修改build.xml文件,使JAX-WS和JAXB实现使用Axis2所使用的.jar文件。还需要修改用于JAX-WS、JAXB和部署的Ant任务。

一些最佳实践

以下列出了在WebLogic Server 10中使用JAX-WS和JAXB 实现的一些最佳实践:

避免在代码中使用特定于供应商的注释。这样在尝试不同供应商的JAX-WS实现时就无需对代码进行修改。通常,JAX-WS实现供应商都提供了在Ant任务中访问特定于供应商注释的方法。WebLogic Server使用的是这一选项,因此您应该利用这一特性,以避免在JWS中使用特定于供应商的注释。
在可能的地方使用JAXP StreamSource和 and StreamResult。javax.xml.transform.stream.StreamSource和javax.xml.transform.stream.StreamResult所类提供的方法可以最有效地处理Java串行化(和并行化)问题。因此,您应该尽可能地使用它们。
缓存JAXBContext对象。javax.xml.bind.JAXBContext对象是一个用于通过Java类创建JAXB对象的工厂。创建JAXBContext对象需要的开销比较大,因此应该缓存它们从而便于重用。
使用JAXBElement编组内部类。JAXB 2.0将使用内部类用于匿名complexType元素。如果您之后在Web服务操作的方法签名中使用其中某个元素,那么将在构建时接收到一个javax.xml.bind.MarshalException异常。问题是内部类并不是高级元素,因此并没有@XmlRootElement注释。解决的方法是为内部类创建一个JAXBElement对象。要了解如何创建该对象,请在DataStagingServiceImpl.java文件中搜索"JAXBElement"。
下载
wls10wss_jaxws-article1.zip——该zip文件含有本教程所使用的所有源代码。
结束语
JAX-WS和JAXB是用于构建下一代基于Java的Web服务的最有前途的两个API。如今,WebLogic Server 10 Web Services栈通过Glassfish JAR和BEA Ant任务这两个API都提供了支持。

您可以使用WebLogic Server 10 Web Services栈为任何JAX-WS实现编写、构建和部署JAX-WS Web服务,而不仅限于WebLogic Server 10中的实现。Jwsc和wsdlc Ant任务已经经过修改,现在可允许您指定生成JAX-WS和JAXB工件时所使用的定制文件。可以使用<binding>子元素实现这一目的。Jwsc和wsdlc Ant任务将从内部调用Sun的wsimport Ant任务。

希望您可以通过本文了解使用WebLogic Server 10 Web Services栈生成JAX-WS和JAXB工件是多么地容易。但是,创建定制文件却并非易事。我们可以通过定制文件影响工件的生成流程。不过也不用担心,我将在后续的几篇文章中介绍如何创建定制文件。

原文出处:http://dev2dev.bea.com/pub/a/2007/09/jax-ws-jaxb.html

作者简介

  Mike Wooten 是BEA享有声望的技术解决方案小组(Technical Solutions Group,TSG)的一名高级首席解决方案工程师。他的工作时间都在帮助将BEA客户的抽象技术概念转变为能创造价值的解决方案。这些解决方案所提供的功能往往令其竞争者们望尘莫及。
February 26

疯狂的程序员1

天已经七分黑了,屋里却还没开灯。这个全身黑衣服的男子突然像想起什么,从包里掏出烟,抽出一只,递给旁边的人:“兄弟,抽烟么?”――那烟是红塔山。

旁边那人连忙一边摆手,一边说:“不,不。”语气有点紧张,好像那黑衣服递过来的不是烟,是海洛因。

这个黑衣服的男子,后来的网名叫“绝影”。他旁边那个,后来被他们称为“土匪”。这件屋子,就是他们大学寝室。

 

第一天到学校,其实没有一点新鲜的感觉。绝影的舅舅和舅妈就在这里教书,早在这学校还不叫“大学”的时候,绝影已经在学校足球场学骑自行车了。

要说念大学,最忌讳的就是在自己家门口念。哪怕你就住北大院子,也一定要去清华。土匪觉得这学校不错,不光是土匪觉得不错,看就业形势,也的确不错。但是绝影就一肚子憋屈。

其实这间寝室和别的寝室也没什么特别,也就四张床四张电脑桌。电脑桌当然有,但是电脑就要自己往上面放。既然没有电脑,那要电脑着有什么用呢?还占着地方。唯一不同的是寝室里的一个人――和别的不一样,这间寝室有个不属于这个班的人――他叫王江。

王江他特别,不仅因为他不是这班的,还因为他吹的牛皮很特别。

大一晚上谈什么?当然是谈高考。

于是王江就叹息:哎呀,差一分呐。

土匪附和道:哎呀,就差那么五分。

王江:老天无眼,把我弄到这么个学校来。

土匪:凑合吧,四年后考研,又是条好汉。

王江:不行,我要让我老爸再想想办法。

土匪:都怪我老子没本事。比我差的都去了那学校。

王江:我老爸没问题。但我就是这么一个人,不轻易去找他的。

土匪:那你这辈子就给毁了。

王江:明天就去办退学。

土匪:你去退,我跟你一起去退。

……

两人谈得热血沸腾,仿佛他们老爸一个是教育部长,一个是清华校长,想去清华北大还不易如反掌耳。仿佛大好前途就在向他们招手,只等明天退学。

绝影跟另一个后来被叫做叫“超薄”的人一直没发话。超薄是因为听不懂他们的四川方言。绝影呢,心里一直在郁闷:要没有舅舅和舅妈,还有舅妈的爸爸,他根本就进不了这学校。不光进不了这学校,甚至进不了中国和外国任何一所大学。

 

第二天,王江去退学了。土匪没去。问土匪为什么?土匪说:“他太不成熟了。唉,年龄小,办事不牢靠。”

后来,王江的爸爸到了学校。绝影觉得王江的老爸怎么看也不像教育部长,甚至连自己的老爹都没法比。虽然经过这几天王江的洗礼,应该算是“如雷贯耳”了,但就是咋看咋不行。

他老爸不停的说:“儿哟,再考个大学要多少钱哟。这学费都交了8000多了哟……

所以最后,王江也没能退成学。不过因为这次退学风波,王江一举成为专业上的名人。为啥?为啥要退学?此地不留爷,自有留爷处。所以,退学是小事,但是敢退学就是大事了。至少有办法退了之后再弄个大学念去。

再后来,土匪和王江都当了各自班的学习委员。绝影什么也不是。绝影本来想弄个生活委员当的。因为生活委员不需要什么技术含量,而且绝影是本地人,在竞选上应该有很多优势。可是偏偏在竞选的时候,绝影住院了。

 

所谓红颜祸水。要不是因为红颜,绝影就不会住院。

说那天绝影终于约到那妹妹吃饭。那妹妹是谁?隔壁专业的。长什么样?没见过。怎么认识的?网上。所以没见过才有神秘感,绝影才那么激动。

那天中午,绝影拍了拍土匪:“走了!约会去了!”于是换鞋。这时候,一个炸雷响起,哗~~天花板上日光灯断成两截,一截摔成碎片,另一截直接插到绝影的脚背上。绝影拔出这一截,脚背上立刻露出直径两公分大的窟窿。绝影正在纳闷,这么大个洞,怎么就不见流血呢?正想着,血就开始扑扑地往外喷。

土匪傻了,但还是知道叫寝室管理员。寝室管理员也傻了,说外面下着雨呢。楼长说:你背也得把学生背到校医院去。

绝影没傻。绝影说:“等等。”拿起电话:“我来不成了。我脚上现在有个洞,正在往外喷血。”

那妹妹一听急了:“少来了第一次约会你就找借口。”

绝影仍然很平静:“真的。唉,血还在喷,真不行了。管理员要送我去医院,要不你在你们楼下等我,去校医院要从你们楼下过。你看是不是真的。”

管理员背起绝影就走。到校医院有两条路,一条是正道,直通医院。一条还得上个坡又下个坡,不过能从妹妹寝室楼下路过。绝影说:走坡路。管理员也真傻了,径直往坡上爬。

路过妹妹楼下,绝影往四周看了五遍,一个人也没有。来不急多想,就到了校医院。

因为是外伤,情况并不是很严重,也就是清洗伤口,缝针。绝影心里惦记着那妹妹,可那时候手机手机还没现在这样普及,普及的是传呼机。也就是有人找你,给你打个传呼,那小机器就滴滴地叫,上面有他的电话,你再给他打回去。

绝影跟办公室的医生说:我要打两个电话。

第一个电话,打给妹妹。妹妹又在那边说:“你肯定是骗人的,我去了,一个人也没有,还下那么大雨。”

绝影连忙解释:“真的,我已经到医院了,管理员跑的太快,比你下楼还快。要不你亲自到医院来看,我在这等你。”

第二个电话,打给舅妈:“舅妈我脚上被砸了个洞,在医院呢,你赶紧通知我妈。”

打完了。绝影就坐那等妹妹。土匪来了,超薄来了,王江来了,妹妹也来了。绝影傻了。因为这个妹妹长的实在有点抱歉。后来因为这个妹妹,绝影被他们三个,不,是全班,嘲笑了四年。

那妹妹说:“我叫朴素”。所以,以后每次嘲笑绝影的时候,只需要说两个字:朴素。

所谓红颜祸水。本来只缝了两针。没想到当天晚上就开始剧痛。绝影痛得下不了床,除了上厕所,打饭什么的都让土匪代劳,土匪不愿意,不愿意也得去,因为土匪是学习委员。后来连上厕所也不行了。干脆弄了个可乐瓶子,每天让土匪倒三次瓶子。

绝影的妈妈终于第一次来了学校。说的第一句话是:注意锁好柜子。接着就让寝室管理员背着他往校医院跑。

医生还是那个医生,说:“X光都打了,没有任何问题,再吃两道药就好了。”

绝影说:“痛的不能走路“。医生说:“那就租副拐杖去吧,押金十元,每天租金两毛。”

从校医院出来,绝影就拄了双拐杖。他说:“妈不行我还是痛,带我去城里的医院吧。”去了城里的医院,绝影就开始住院了,因为伤口已经严重感染。 

February 20

SQL好像有问题,大家看看

PROMPT VIEW sdb_vw_rpt_dailymsr_730
CREATE OR REPLACE VIEW sdb_vw_rpt_dailymsr_730 (
  no,
  stage,
  wip,
  move,
  target,
  rwip,
  qwip,
  hwip,
  bwip,
  cwip,
  wengf,
  wengl,
  wpilot,
  wprod,
  shwip,
  hotwip,
  w09l,
  w10d,
  w10h,
  w11d,
  w15l,
  cmove,
  mengf,
  mengl,
  mpilot,
  mprod,
  m09l,
  m10d,
  m10h,
  m11d,
  m15l,
  rtime,
  qtime,
  htime
) AS
select aa.stageorder no,aa.stage,wip,move,target,
    rwip,qwip,hwip,bankwip bwip,cwip,wengf,wengl,wpilot,wprod,
    shwip,hotwip,w09l,w10d,w10h,w11d,w15l,
    cmove,mengf,mengl,mpilot,mprod,m09l,m10d,m10h,m11d,m15l,
    rtime,qtime,htime
from
 (select b.stageorder,b.stage,
  nvl(sum(decode(bank,'',a.componentqty,0)),0) wip,
    --HardCode keeped
  sum(decode(a.adstatus,'Running',a.componentqty,0)) rwip,
  sum(decode(a.adstatus,'Waiting',a.componentqty,0)) qwip,
  sum(decode(a.adstatus,'Holding',a.componentqty,0)) hwip,
  sum(decode(a.adstatus,'Bank',a.componentqty,0)) bankwip,
  nvl(sum(sum(decode(a.adstatus,'Running',a.componentqty,
      'Waiting',a.componentqty,
      'Holding',a.componentqty,0)))
    over(order by b.stageorder desc),0) cwip,
        --HardCode keeped
  sum(case when a.lottype ='LF'
     and bank is null then a.componentqty else 0 end) wengf,
  sum(case when a.lottype in ('L','T')
     and bank is null then a.componentqty else 0 end) wengl,
  sum(case when substr(a.lottype,1,1) = 'P'
     and bank is null then a.componentqty else 0 end) wpilot,
  sum(case when substr(a.lottype,1,1) in ('E','M','R','B')
     and bank is null then a.componentqty else 0 end) wprod,
  sum(case when priority=1 and bank is null then a.componentqty else 0 end) shwip,
  sum(case when priority=2 and bank is null then a.componentqty else 0 end) hotwip,
    --HardCode keeped
  (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='09ULG')
     then nvl(a.componentqty,0) else null end)
  -sum(case when (technology <> '09ULG' or bank is not null) then a.componentqty else 0 end)) w09l,
  (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='10UDR')
     then nvl(a.componentqty,0) else null end)
  -sum(case when (technology <> '10UDR' or bank is not null) then a.componentqty else 0 end)) w10d,
  (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='10UHS')
     then nvl(a.componentqty,0) else null end)
  -sum(case when (technology <> '10UHS' or bank is not null) then a.componentqty else 0 end)) w10h,
  (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='11UDR')
     then nvl(a.componentqty,0) else null end)
  -sum(case when (technology <> '11UDR' or bank is not null) then a.componentqty else 0 end)) w11d,
  (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='15ULV')
     then nvl(a.componentqty,0) else null end)
  -sum(case when (technology <> '15ULV' or bank is not null) then a.componentqty else 0 end)) w15l,
  round(avg(a.runtime),1) rtime,round(avg(a.queuetime),1) qtime,
  round(avg(a.holdtime),1) htime
 from (select * from sdb_tb_info_wip_hist_730
  --HardCode keeped
   where substr(lottype,1,1) in ('E','L','T','P','R','M','B','X')
   and status not in ('Finished','Shipped','Terminated','Inventory')
   and rtrim(histdate)=to_char(sysdate,'yyyymmdd')) a,
 (select stageorder,stage from sdb_tb_info_stage
 where stagegroup='ALL'
 union all
 select unique 5000,stage from
 (select unique stage from
 sdb_tb_info_wip_hist_730 where rtrim(histdate)=to_char(sysdate,'yyyymmdd')
 union
 select unique stage
 from
 sdb_tb_wip_tito_hist a,
(select lotid,priority,productname,planname,lottype,lotowner
from sdb_tb_info_wip where lottype not in
--HardCode, 'C','V','D','Z','Y', sdb_tb_report_config
(SELECT keyvalue FROM sdb_tb_report_config WHERE linkname = 'LotType' AND keytype = 'CDType')
union
 select lotid,priority,productname,planname,lottype,lotowner
from sdb_tb_wip_ship where lottype not in
--HardCode, 'C','V','D','Z','Y', sdb_tb_report_config
(SELECT keyvalue FROM sdb_tb_report_config WHERE linkname = 'LotType' AND keytype = 'CDType')) b
where a.lotid=b.lotid(+)
and trackouttime between to_char(sysdate-1,'yyyymmdd') ||
--HardCode, ' 073000', sdb_tb_report_config
(SELECT ' '||keyvalue FROM sdb_tb_report_config WHERE linkname = 'REPORTTIMEBODER' AND keytype = 'TIMESTART1')
 and to_char(sysdate,'yyyymmdd') ||
 --HardCode, ' 073000', sdb_tb_report_config
(SELECT ' '||keyvalue FROM sdb_tb_report_config WHERE linkname = 'REPORTTIMEBODER' AND keytype = 'TIMEEND1')
and (substr(a.lottype,1,1) not in
--HardCode, 'C','V','D','Z','Y', sdb_tb_report_config
(SELECT keyvalue FROM sdb_tb_report_config WHERE linkname = 'LotType' AND keytype = 'CDType')
 or a.lottype is null)
and substr(a.lotid,1,2) not in ('EC','ED')
and trackoutstageflag = 'T')
 where stage not in (select unique stage from sdb_tb_info_stage
 where stagegroup='ALL'))  b
 where a.stage(+)=b.stage
 group by b.stageorder,b.stage order by stageorder) aa,
 (select b.stage,b.stageorder,nvl(sum(a.componentqty),0) move,target,
       nvl(sum(sum(a.componentqty))
       over (order by b.stageorder desc),0) cmove,
       --HardCode keeped
       sum(case when lottype ='LF' then a.componentqty else 0 end) mengf,
    sum(case when lottype in ('L','T') then a.componentqty else 0 end) mengl,
       sum(case when substr(lottype,1,1) ='P' then a.componentqty else 0 end) mpilot,
       sum(case when substr(lottype,1,1) in ('E','M','R','B') then a.componentqty else 0 end) mprod,
    (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='09ULG')
     then nvl(a.componentqty,0) else null end)
    -sum(case when technology <> '09ULG' then a.componentqty else 0 end)) m09l,
       (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='10UDR')
     then nvl(a.componentqty,0) else null end)
    -sum(case when technology <> '10UDR' then a.componentqty else 0 end)) m10d,
    (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='10UHS')
     then nvl(a.componentqty,0) else null end)
    -sum(case when technology <> '10UHS' then a.componentqty else 0 end)) m10h,
       (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='11UDR')
     then nvl(a.componentqty,0) else null end)
    -sum(case when technology <> '11UDR' then a.componentqty else 0 end)) m11d,
       (sum(case when b.stage in (select stage from sdb_tb_info_stage where stagegroup='15ULV')
     then nvl(a.componentqty,0) else null end)
    -sum(case when technology <> '15ULV' then a.componentqty else 0 end)) m15l
  from
  (select trackouttime,lotid,productname,location,stage,lottype,lotowner,priority,technology,
  componentqty,userid,eqpid
  from (select a.trackouttime,a.lotid,b.productname,null,null,a.workarea location,
null,a.stage,null,null,b.lottype,b.lotowner,b.priority,
substr(b.planname,2,5) technology,a.trackoutqty componentqty,
null,null,null,null,null,null,null,null,null,userid,equipmentname eqpid
from sdb_tb_wip_tito_hist a,
(select lotid,priority,productname,planname,lottype,lotowner
from  sdb_tb_info_wip where lottype not in
--HardCode, 'C','V','D','Z','Y', sdb_tb_report_config
(SELECT keyvalue FROM sdb_tb_report_config WHERE linkname = 'LotType' AND keytype = 'CDType')
union
 select lotid,priority,productname,planname,lottype,lotowner
from  sdb_tb_wip_ship where lottype not in
--HardCode, 'C','V','D','Z','Y', sdb_tb_report_config
(SELECT keyvalue FROM sdb_tb_report_config WHERE linkname = 'LotType' AND keytype = 'CDType')) b
where a.lotid=b.lotid(+)
and trackouttime between to_char(sysdate-1,'yyyymmdd') ||
--HardCode, ' 073000', sdb_tb_report_config
(SELECT ' '||keyvalue FROM sdb_tb_report_config WHERE linkname = 'REPORTTIMEBODER' AND keytype = 'TIMESTART1')
 and to_char(sysdate,'yyyymmdd') ||
--HardCode, ' 073000', sdb_tb_report_config
(SELECT ' '||keyvalue FROM sdb_tb_report_config WHERE linkname = 'REPORTTIMEBODER' AND keytype = 'TIMEEND1')
and (substr(a.lottype,1,1) not in
--HardCode, 'C','V','D','Z','Y', sdb_tb_report_config
(SELECT keyvalue FROM sdb_tb_report_config WHERE linkname = 'LotType' AND keytype = 'CDType')
 or a.lottype is null)
--HardCode, delete:and substr(a.lotid,1,2) not in ('EC','ED')
and trackoutstageflag = 'T')
--HardCode keeped
  where substr(lottype,1,1) in ('E','L','T','P','R','M','B','X'))a,
 (select stageorder,stage from sdb_tb_info_stage
 where stagegroup='ALL'
 union all
 select unique 5000,stage from
 (select unique stage from
 sdb_tb_info_wip_hist_730 where rtrim(histdate)=to_char(sysdate,'yyyymmdd')
 union
 select unique stage from
 sdb_tb_wip_tito_hist a,
(select lotid,priority,productname,planname,lottype,lotowner
from sdb_tb_info_wip where lottype not in
--HardCode, 'C','V','D','Z','Y', sdb_tb_report_config
(SELECT keyvalue FROM sdb_tb_report_config WHERE linkname = 'LotType' AND keytype = 'CDType')
union
 select lotid,priority,productname,planname,lottype,lotowner
from sdb_tb_wip_ship where lottype not in
--HardCode, 'C','V','D','Z','Y', sdb_tb_report_config
(SELECT keyvalue FROM sdb_tb_report_config WHERE linkname = 'LotType' AND keytype = 'CDType')) b
where a.lotid=b.lotid(+)
and trackouttime between to_char(sysdate-1,'yyyymmdd') ||
--HardCode, ' 073000', sdb_tb_report_config
(SELECT ' '||keyvalue FROM sdb_tb_report_config WHERE linkname = 'REPORTTIMEBODER' AND keytype = 'TIMESTART1')
 and to_char(sysdate,'yyyymmdd') ||
 --HardCode, ' 073000', sdb_tb_report_config
(SELECT ' '||keyvalue FROM sdb_tb_report_config WHERE linkname = 'REPORTTIMEBODER' AND keytype = 'TIMEEND1')
and (substr(a.lottype,1,1) not in
--HardCode, 'C','V','D','Z','Y', sdb_tb_report_config
(SELECT keyvalue FROM sdb_tb_report_config WHERE linkname = 'LotType' AND keytype = 'CDType')
 or a.lottype is null)
--HardCode, delete:and substr(a.lotid,1,2) not in ('EC','ED')
and trackoutstageflag = 'T')
 where stage not in (select unique stage from sdb_tb_info_stage
 where stagegroup='ALL')) b,
(select stage,target from  tmp_tb_stage_target) c
  where b.stage = a.stage(+)
  and b.stage=c.stage(+)
  group by b.stage,b.stageorder,target
  order by stageorder) bb
where aa.stageorder=bb.stageorder
and aa.stage=bb.stage
order by no
/
December 11

“小白”的一生--小学生作文:记叙文

 提示:我“出生”在晚上,那晚电闪雷鸣,狂风暴雨,雷声轰隆轰隆地响着,把我从睡梦中唤醒,我用力地想把蚕子顶破,离开这个黑暗得地方
 嗨!我是小白,你一定很惊讶吧,这个名字是小主人给我取的。刚来这个新家的时候,我还是众多蚕子里的一员!我“出生”在晚上,那晚电闪雷鸣,狂风暴雨,雷声轰隆轰隆地响着,把我从睡梦中唤醒,我用力地想把蚕子顶破,离开这个黑暗得地方,我费了好大的力气才把小头探出来,我望了望四周,一切都是那么美好,我可顾不了这些,心想我的食物在哪呢?于是我慢慢悠悠的在盒子里爬来爬去寻找能吃的东西,可我怎么也找不到一小片桑叶。   漫长的黑夜过去了,一轮火红的太阳升上了天空,新的一天来临了,我的弟妹也降临了人世。突然我听见了脚步声,原来是我的小主人来了。我的小主人叫小安,她是一个爱美的小姑娘,她有一双水灵灵的大眼睛,一张红的像樱桃的小嘴,她和她的名字一样安静!小主人给我们带来了大把大把绿油油的桑叶,我们一家两百多口狼吞虎咽,一会就把桑叶“消灭”了一大半!  
 过了一个多星期,我就要开始蜕皮了,蜕皮是个很危险的事情,是我由幼虫进入成虫的第一个阶段,我找了个安静的地方停止下来不吃不喝,使尽全身的力气,想挣脱这件束缚我的小衣服,我挣扎了许久,可还是没有成功。这时,小主人来了她焦急得注视着我,她以为我死了,于是,她把我拿了起来,这时,我心里悬着,生怕她把我从窗户里扔出去。这时,小主人的妈妈走了过来,她告诉小主人,这是蚕在蜕皮不能打搅的,否则它会丧命的。小主人听了连忙把我放了回去。我的心终于像一颗石头落了地。经过了这样四次的蜕皮后,我变得胖乎乎的,可爱极了!  
 不久我的身体变得透明起来,我知道自己即将吐丝了,我要“上山”了。小主人好像早知道了,给我用小树枝给我搭了一个架子。我迫不及待得爬上了架子,找好了合适的位子,用丝给自己固定起来,我果不负众望,结了一个厚实的茧!可是天有不测风云,在我结茧没有多久,便在茧里听见了女主人和小主人的一段对话,女主人说:“听说蚕茧含有很高的蛋白质,可以用来食用,干脆把你养的蚕给它炸了吃吧,那可是一盘佳肴呀!”这时,我想这次可是在劫难逃,全身冷汗直冒。却又听见小主人说:“不嘛!我养蚕可不是吃呀,你们怎么一点爱心也没有?”小主人的一句话保住了我的小命,我安下心来。  
  没过多久,我破茧而出,变成了一只蚕蛾,交配之后产出了蚕子,蚕子黄灿灿的漂亮极了,多么像当初的我呀!  
  我的一生就这么结束了!  
 
December 05

使用DTS数据转换抽取执行SQL Server 2000到DB2 V8的数据转换导入

使用DTS数据转换抽取执行SQL Server 2000到DB2 V8的数据转换导入

首先打开windows的ODBC 配置好DB2和SQL Server的ODBC,一般安装默认安装好数据库都自带了ODBC开启,你只要自己添加一下就可以了,

选SQL Server的ODBC最好选OLE DB,DB2的也选OLE DB,不然会出现驱动不支持的提示出错。

导出到DB2的目的地的时候一定要去掉表名上的双引号,在SQL语句里修改,否则生成的表带双引号的,查询的时候也要带双引号,比如select * from ZHOUJIANGUO."test";

还有就是要注意表所属的模式

如果出现复制错误,一定要把字段放大,在编辑的脚本里修改会覆盖默认的生成。可以执行查询,select to 1835 * from CRM_CUST,找到第1835号看看是什么列超过长度了,还有就是导入的时候如果是自增的,先去掉,等导入完成了再把db2的表该回自增主键就可以了。。。

最后祝大家好运,需要摸索...

December 03

JDBC下连接DB2 V8.2,以事实为根据

1.新建一个标准工程,导入DB2 V8的驱动(可以从DB2 V8的安装目录下找到,在lib下,是db2java.zip,把它改成db2java.jar导入到工程里面,最好把lib下所有的db2开头的jar包都导入),然后建立一个ConnectionTest.java类
/**
 * ZhouJianGuo
 * Nov 20, 2007
 */
package com.connection;
import java.sql.*;
/**
 * @author zhoujianguo
 *
 *
 */
public class ConnectionTest {
 /**
  *
  */
 public ConnectionTest() {
  // TODO Auto-generated constructor stub
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  String url="jdbc:db2://localhost:6789/TENWA";
  String user="TENWA";
  String password="tenwa";
  try {
   System.out.println("begin class.forname...");
   Class.forName("COM.ibm.db2.jdbc.net.DB2Driver").newInstance();
   System.out.println("begin connection...");
   try {
    System.out.println("begin conn...");
    Connection conn= DriverManager.getConnection(url,user,password);
    System.out.println("begin statement...");
    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    String query = "select * from zhoujianguo.crm_bp";
    ResultSet rs=stmt.executeQuery(query);
    System.out.println("resultset...");
    while(rs.next())
    {
     System.out.println("ok");
    }
    rs.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}
当你运行上面的代码进行测试的时候一定要确保db2jstrt所在的端口是6789
你可以使用 DB2 命令行工具(CLP)来测试,可以通过在命令行中键入 db2cmd 进入 DB2 CLP,然后在提示符下键入 db2,就会进入DB2 CLP 的交互界面。

这个命令行工具可以完成图形化工具所做的所有管理配置工作,并且可以节省很多内存资源。

实验中,我们首先需要用命令连接到一个数据库:

示例如下,在命令行提示符后键入

CONNECT TO TENWA USER tenwa USING tenwa

该命令表示使用用户名为 tenwa(大写的用户名也可以),密码为 tenwa(密码一定要小写,一般密码都小写,我就错在这里),连接至数据库 tenwa(大小写无所谓),紧接着会返回连接后的数据库相关信息。然后就可以在命令行提示符后直接键入各种 DDL 或 DML 语句来执行各种操作。

以上测试没问题的话,会返回一些信息认证

db2 => connect to tenwa user tenwa using tenwa

   数据库连接信息

 数据库服务器         = DB2/NT 8.2.5
 SQL 授权标识         = TENWA
 本地数据库别名       = TENWA

最后,我们还可以使用 DB2 UDB 随产品发布的一个图形化管理工具――命令中心(Command Center)来验证我们的实验。

还有最后一步一定要启动数据库实例,在控制台里找到你的数据库,在右下角有个按钮叫连接,点下就可以启动数据库实例了,不然会抛出出错

COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] SQL1032N  未发出启动数据库管理器的命令。  SQLSTATE=57019

好了,实例启动了以后,就可以测试了

November 19

MyEclipse6.0下配置WebSphere6.0

1.安装WebSphere Application Server ND V6.0 WIN C587UML.iso里的WAS下的install.exe进行安装,安装的时候类是Weblogic一样,Websphere里面有一个叫profiles的,类是Weblogic的Domins,用户可以通过开始菜单里的websphere新建profiles,weblogic也可以额,weblogic还多了一个命令行的创建,websphere创建好了以后多了以下一个目录
C:\WebSphere\AppServer\profiles\TenwaAppServer01\installedApps\AdminNode01Cell
下面是其中的端口配置图
 
MyEclipse下的Websphere配置类是如下图,jdk一定要用websphere的,在websphere的java目录下
 
然后新建立一个web project,然后导出的时候一定要注意,不能采用myeclipse的直接部署,要右几项目,选择 j2ee打包方式,然后再到websphere的控制台区载入该war包,然后保存启动该工程就可以了!
 
November 13

JSF经验总结“奇怪问题”(持续补充。。。)

1.JSF的id号重复问题,将造成其后相同id的组件无法正常执行。
如:两个<t:dataTable>,除非其 value 属性调用的为同一 Managed Bean 的方法,否则第二个将不会显示任何内容。


2.JSF中凡具有列表功能的组件,如:<t:dataTable>、<t:selectItems>
在其 Managed Bean 返回 List 之前,一定要判断此 List 是否为 null,如为 null 则进行取操作。
    public List getRights() {
        if (rightList == null) {
              rightList = rightService.loadRights();
        }
       
        return rightList;
    }
这是因为JSF会执行两次Managed Bean的方法,如果此List从数据库中取出,将会占用不必要的系统资源。


3.如果一个页面中要多次使用同一 Managed Bean 中的同一方法的返回值,且该方法的返回值是从数据库取得的,那么也应像(2)一样判断是否为 null。

4.很经典的 PropertyNotFoundException 问题
错误代码如下:
private SysUser user;
public SysUser getUser() {...}
public void setUser(...) {...}

更正代码如下:
private SysUser user = new SysUser();
...

5.<h:form>的重要意义
不多费话,以下引用一段原文:
Tomahawk 1.1.3 has been released. There is one major change that users will need to be aware of. In order to be compatible with the Reference Implmentation (RI), all command links and components that use command links must now be enclosed within an <h:form> element. This means that components that make use of command links (like tree2) must now be inside an <h:form> in order to work properly. For those using the MyFaces Core JSF implementation, there is a tweak to faces-config.xml that will allow your existing pages to work without changing them.

接下来说说我碰到的情况(Myfaces1.1.1 & Tomahawk 1.1.3):本人贯用作案手法是 <t: ...>
a.页面上半部分是一个 <t:dataTable>、中间是一个 <t:selectOneMenu>、下半部分是另一个 <t:dataTable>;
b.改变中间 <t:selectOneMenu> 的值会触发表单提交来动态改变下半部分 <t:dataTable> 的内容;
c.起初中间部分和下半部分分别包含在各自的 <h:form> 中,根据“b”步骤操作,结果令人瞠目结舌;
d.后将上半部分 <t:dataTable> 也包含在一 <h:form> 中问题解决。

6.value & valueChangeListener
value & valueChangeListener 属性基本上是个JSF组件就会有!又说费话了。
valueChangeListener 常用在 <t:selectOneMenu> 这类组件上,用于改变值后提交表单(当然,提交表单要靠JS了)进行页面刷新;其和 Managed Bean 的一个方法进行绑定,表单提交后可通过此方法获得改变后的值,或执行其它方法。
注意我说的是表单中只有一个 <t:selectOneMenu> 的情况,如果还有提交按钮之类东西的话,我想大多数情况不会这么用了。
此时切记在如下代码情况下,不要同时使用 value & valueChangeListener:
private String state;
public String getState()...
public void setState()...

private void doSomething()...
public void changeState(ValueChangeEvent vce) {
  state = vce.getNewValue();
  doSomething(); // 此方法中用到了变量 state
}
此时会存在小小的“冲突”,但足以致命,doSomething()方法中 state 的值变为了 null

7.<t:commandLink>
表单中当点击 <t:commandLink> 提交表单并做表单有效性校验(JS)时,如:
<t:commandLink value="提交" action="#{testHandler.test}" onclick="check();" />

check() 方法中只可 return false,也即表单内容无效时,而当表单通过验证后切不可 return true,否则表单是无法提交的。因为JSF会为 <t:commandLink> 生成提交表单的 JS,而如果表单验证的 JS 返回了 true,后台的 JS 也就自然没法执行了。。。

8.你需要用到像 .net 一样的,当页面加载时执行 Managed Bean 中方法的功能吗?
那么学习一下如何用 http://sourceforge.net/projects/jsf-comp/ 的 On-Load 子项目吧,其它方法只能让你头破血流,还有那丑陋的页面代码!!!
September 25

SWT Designer6.4.1 Eclipse插件 注册破解(可是最新的额)

WindowBuilder Pro v6.4.1 这是目前最新的版本,支持Eclipse2.2, Eclipse 3.0,Eclipse 3.1, Eclipse 3.2Eclipse 3.3

注册和激活(使用注册机)

WindowBuilder Pro,SWT Designer V6.X for eclipse2.2 注册过程

首先自己到如下任意一个地址下载注册机:

http://www.enfull.com/china/Programming/{4A767857-E603-428D-B30D-ED66D99F1997}.htm

<1>重新启动Eclipse,选择Window > Preferences,如果有 Designer 一项证明安装成功了。然后选择Designer > License并点击Registration and Activation 按钮,打开注册向导.

<2> 解压Instantiations.WindowBuilder.Pro.v6.1.1.Incl.Keymaker-ZWT.rar 。得到的文件夹下包含:

<3>破解补丁使用方法:

a.首先获得网卡的MAC(也就是物理地址)地址,使用ipconfig/all就可以获得。

b.运行注册机,就是那个Keygen.jar文件,首先输入你的MAC地址。

c.点击Keygen ,即生成license文件(serial numberactivation key)

<4>请务必Copy至下图中对应的serial numberactivation key

a. 前面三部做好之后,点击Finish.现在界面显示变成下图,看看可以了吧

b. 注册完后,我们同时也看到已经把GWT Designer给注册了! 

September 04

Hibernate下各种Cache的缓存配置和特性

You have the option to tell Hibernate which caching implementation to use by specifying the name of a class that implements org.hibernate.cache.CacheProvider using the property hibernate.cache.provider_class.
 我整理了下,具体看下面的表格
Cache Provider class Type Cluster Safe Query Cache Supported
Hashtable (not intended for production use) org.hibernate.cache.HashtableCacheProvider memory   yes
EHCache org.hibernate.cache.EhCacheProvider memory, disk   yes
OSCache org.hibernate.cache.OSCacheProvider memory, disk   yes
SwarmCache org.hibernate.cache.SwarmCacheProvider clustered (ip multicast) yes (clustered invalidation)  
JBoss TreeCache org.hibernate.cache.TreeCacheProvider clustered (ip multicast), transactional yes (replication) yes (clock sync req.)

 

August 31

枫泾古镇自驾游手册

有些地方并不遥远,有些岁月浓缩方寸,枫泾,不近亦不远,就在沪杭高速公路的拐角,周末俱乐部的食客们一起逃逸出沸腾的城市,来到这个属于上海金山的小镇,不仅大饱口福,还意外收获了一车往昔生活的古风情韵。

  上海出发往沪杭高速,枫泾总是必经之地,印象中已近嘉善的枫泾属于浙江,不曾料想小小古镇是在上海金山的版图内。在枫泾收费口过后2公里就能抵达古镇,以前无数次从她门前匆匆而过,这天我们拐进连接的320国道,从第一个红绿灯右转,水乡情幽不在远方,随着高大“枫泾”牌楼赫然亮相眼前。

  画里画外民生百态

  牌坊直走,路标指示前方250米就是旅游区,却先遇见了三叉路口,举棋不定间询问路人,向左向右都可以走通,于是向左走到丁蹄作坊,见识一下好吃的丁蹄怎样做出来。而后沿着街市往古镇里走,路两边繁荣热闹,许多商业小铺和小吃店,人来人往,过了马路不多会儿突然小巷幽深起来,外围热闹,里弄幽深,如闺秀含蓄典雅。

  别小瞧了这古镇,画馆、名居、老商铺几十米就能撞到一个,文化气息很浓郁,北大街静静的巷子里,有丁聪漫画陈列馆;和平路上坐落着“红胜火”农民画展厅,遇见了画主人陈修,色彩绚烂的乡土生活场景竟出自于这位秀雅的女子笔下;和平街上的“三百行”博物馆,从古至今的灯和篮子,全被聚集一堂,三百六十行也被图文并貌展现于此;古戏台还没开演,喜庆音乐已喧天热闹,这里其实是城隍庙广场,贴街临河,戏台对面有家晨社茶馆,当地人老人三三两两地在阳光下看景、喝茶、聊天,与农民画里浓郁的生活气息遥相呼应。TIPS:

  ◆金山区枫泾古镇成市于宋,建镇于元,已有1500多年历史,所谓“三画一棋”,即漫画家丁聪、国画大师程十发、围棋国手顾水如、金山农民画等文化民俗在这里可以找寻。贴水枕河的民居散发出水乡情韵,质朴生动。

  雕梁画栋岁月悠悠

  穿梭游走在古巷幽弄,一幢幢木楼花窗,一只只竹篮,一盏盏明灯,三百六十行当,深邃的防空洞,军大衣、毛主席像章、粮票、布票,救火会……仿佛踏入了时光隧道,不觉今夕是何年。古镇西首的枫泾三桥,清风桥、竹行桥、北丰桥,三桥相连,连接河岸茶楼、长廊,串起众多的景观,从和平路登上镇东的泰平桥,这座古镇上最高的桥,俯视桥廊风光,长长黑色廊棚逶迤地沿河铺展开来,大红灯笼高悬屋檐,雕梁画栋,廊下有人家门户敞开,聊天、做生意,一幅幅平实的生活场景。桥下的市河很清澈,此水由天目山而来通往黄浦江,清代中后期这里交通便利,商业繁荣,舟船停泊,码头堆货,形成这半岸廊棚,可蔽风遮雨,下雨不湿鞋,盛夏不撑伞。

  TIPS

  ◆枫泾古镇保留完好的建筑群有和平街、生产街、北大街,市河成丁字形垂直,向三面河道望去,一望三座桥,三望九座桥,三桥景区的两岸,老屋河埠、石桥流水、浓厚的古色古香味道。

  古镇美食串串吃

  一路走来,吃了状元糕,嚼着豆腐干,拿着萝卜干,拎着丁碲,走到传说中的“唔呶喔哩”,眼前一惊,“好兴致”,枕河的街边,也就是饭店门前的廊棚下竟然有一桌人在兴致勃勃地喝酒吃饭,眼见绿绿水芹,忍不住口水暗流,一大块豆腐状的东东上整齐的小孔里冒着热气,名曰“吴越豆腐”,连豆腐都非同凡响,中午吃定这里了。河边怕冷,我们选择了里弄,掀起蓝布印花的门帘,只见人影穿梭,灯笼高悬,瞧见长廊里两边小厅包间,中间石桥流水相间相连,不仅融入江南小桥、流水、人家的意境,店家巧妙利用空间,在竹筐里盛着河鲜置于水中。不等菜谱上来,脱口就问螺蛳、蚬子有吗,剽窃一下别人的点菜创意,点个吴越豆腐、水芹干丝,另外要了门前水篮里的昂刺鱼,还有糖醋排骨、菌菇汤和咸菜肉丝面,满满一桌扫荡一空,再回首记住:古镇中心生产街65号“我家里来”。

  TIPS

  ◆古镇枫泾餐饮业很繁荣,景点外围的小吃饭店已经是比较多,景点内的旅游指定饭店有两家,一家是泰平桥下的“泰平桥酒家”,一家就是闻名的“唔呶喔哩”,这里菜肴注重原汁原味的本地特色,吴越豆腐、清炒螺蛳、菜汁蚬子、红烧肉、昂刺鱼等都是其店的拿手好菜。

  ■前世今生:枫泾水乡古镇,古时有“三步一座桥、一望十条巷”之誉,元末明初时与南浔、王江泾、盛泽共称为江南四大名镇,小镇方圆2.09平方公里,建筑遗产、文物古迹、传统文化保存完好,2005年被冠以“中国历史文化名镇”的称号。

  ■古镇风情:探秘丁蹄去老作坊,欣赏绘画去丁聪漫画馆,参观传统文化去三百馆,了解历史去人民公社旧址和毛泽东像章珍藏馆,感受民俗文化去金山农民画展和民间剪纸展,观赏古建筑到程十发祖居,市河周围的三桥景观和长廊街一带都是古民居。

  ■传统美食:“枫泾四宝”闻名已久,丁义兴蹄子,经过八道工序精制而成,冷吃香蒸吃糯,酒饭皆宜;桂花状元糕,香甜松脆,老少皆宜,现在除了桂花口味还有芝麻味;天香豆腐干,味道咸甜香鲜,小酌或充当零食,也可做荤、素菜的配料;金枫牌黄酒,是精糯米和小麦酿造成,香醇味甘。

 

August 06

关于SOA的七个关键性问题解答

对于SOA,尤其是像开发人员和CIO等仍有若干关键问题需要回答。

  Web  服务以及越来越多的面向服务架构(Service Oriented Architecture,SOA)已经在市场上投放了大量广告。两者都可以给企业带来广泛的短期和长期利益。但对于SOA,尤其是像开发人员和CIO等仍有若干关键问题需要回答。

  问:SOA的前提是能够使应用程序像服务那样工作。软件如何像服务一样工作呢?

  答:没有SOA,软件包是被编写为独立的(self-contained)软件,即在一个完整的软件包中将许多应用程序功能整合在一起。实现整合应用程序功能的代码通常与功能本身的代码混合在一起。我们将这种方式称作软件设计"单一应用程序"。与此密切相关的是,更改一部分代码将对使用该代码的代码具有重大影响,这会造成系统的复杂性,并增加维护系统的成本。而且还使重新使用应用程序功能变得较困难,因为这些功能不是为了重新使用而打的包。

  SOA旨在将单个应用程序功能彼此分开,以便这些功能可以单独用作单个的应用程序功能或"组件"。这些组件可以用于在企业内部创建各种其他的应用程序,或者如有需要,对外向合作伙伴公开,以便用于合作伙伴的应用程序。

  "服务"的概念是要使用与实施细节无关的标准化接口来构建这些"组件"。针对一套应用程序服务的Web服务描述语言文档,描述需要作为请求特殊服务(例如,"检查库存"功能可能需要零件数)输入来传输的数据名称和类型,并描述服务响应的细节(它可能返回表示库存中零件数量的一个整数)。

  这些详细信息看上去好像与 JavaC++、COBOL 等中实施的功能相同,因此,服务的请求程序无需知道使用的何种语言,而且可以使用任何语言来编写请求程序。这就使一个平台上的服务可以和为另一个平台编写的应用程序集成。互操作性的关键是请求和响应消息,例如,使用SOAP消息发送,其消息使用 XML 编写代码。

  问:请举例说明 SOA 如何使企业受益。

  答:关键的优势是互操作性,可以使用任何平台之间的功能,而与编程的语言、操作系统和计算机类型等等无关。在上述示例中,"检查库存"功能可能已经编写为一个应用程序要求的服务,例如,监控库存并在需要时自动重新定购的服务,但我们后来发现,同样的服务无需修改即可用于支持由员工使用的基于 Web 的库存监控工具。

  就内部而言,应用程序的重复使用是一项关键优势,因为它可以降低开发成本。服务的重复使用,其长期作用在于减少企业中冗余的功能,简化基础架构,从而降低维护代码的成本。通过按服务的使用者来组织应用程序,与传统的编程技术相比,我们获得一个要灵活敏捷得多的集成模型,使我们可以迅速修改业务流程模型。

  就外部而言,为服务交互而详细定义的"合同" 使业务合作伙伴之间的交互"自由联合",提供集成所必需的稳定性,并提供更改基层软件(underlying software)问题的一个解决方案。当保留了相同的消息格式时,支持该格式的软件只要仍然支持消息合同,则可以按需进行更改。只要它支持相同的消息格式,甚至可以使用另一种编程语言的实施来完全替换系统,请求程序无需更改。当消息合同不断发展而必须更改时,与相当困难的任务,即支持多个版本的程序 API 和文件格式相比,它使用版本控制(versioning),更容易作为过渡策略支持多个版本的应用程序。

  这些是部分关键益处,还有许多其他益处。

  问:SOA与Web服务以及SOA和网格计算之间是何关系

  答:SOA是一种面向业务应用程序系统的体系架构设计风格,但可以应用于其他系统,包括中间件技术,例如网格计算。

  Web服务是可以用于创建SOA的一套标准。尽管没有Web服务标准也可能创建SOA(例如,在SOAP之前,人们已经在HTTP或JMS上使用XML来实现相似的结果),但运用Web服务标准却是我们目前针对与外部软件交互的最佳方法。

  网格计算是一种系统管理策略,其目标是最大限度地减少硬件资源的使用。例如,当突然的需求溢出指定的服务器时,它可能临时将一些请求转向相对没那么繁忙的服务器。网格计算设计为一种面向服务架构(用于调整网格计算的服务叫做网格服务)。

  随着我们转向SOA,我们将看到该方法用于支持各种其他新的系统功能。另外一个示例是自主计算伙子管理系统。事实上,SOA是Web服务高级功能的基础,例如WS-Trust和联合身份识别管理规范。

  问:因为还没有通用互操作性标准,SOA最大的问题不仍然是供应商中心性(vendor-centricity)吗?

  答:有一些基本标准正好适用于Web服务,它们可以用于实施面向服务架构。XML和XML方案分别自1998年和2001年就已成为标准。SOAP 1.2自2003年6月成为标准。UDDI在2003年夏天标准化。WS-Security在2004年4月成为标准。

  除了著名标准机构(例如W3C和OASIS)支持的这些正式标准以外,许多"技术建议书规范"也被广泛接受,并作为事实标准得到充分支持。例如,直到 W3C完成WSDL 2.0为止,要求在其产品中支持Web服务的大多数供应商都支持WSDL 1.1规范。

  事实上,目前大部分软件供应商对Web服务标准的支持,已导致使用Web服务来广泛实施SOA。

  问:SOA如何影响SLA?而您如何让SLA适合您的SOA?

  答:当前企业之间的SOA实施通常侧重于改善合作伙伴之间现有业务的效率。同样,性能保证的概念并不是像方便的互操作性和自由联合集成那样的问题,它们可以借助Web服务标准来实现。

  当服务成为企业付费的产品时,对特定水平的性能或可用性的保证,以及其它服务质量注意事项具有更为重要的作用。我们可以想象这在将来会成为一个常见要求,正在进行这方面的工作以支持该模型。

  问:我如何着手构建 SOA?

  答:最佳的方法时开始构建较小的SOA,侧重于提高当前缺乏效率的交互性。例如,假设使用一个系统上需要重新键入到另一个系统的打印报告,将两个计算机系统紧密联系在一起,这会消耗时间、浪费成本,导致出错,而且数据无法保持罪行。可以设计一个简单的基于Web服务SOA项目,直接链接信息,将含更新的SOAP消息发送到合作伙伴系统,而不是打印报告。

  开始简单的SOA使企业可以在作出大投资之前先衡量ROI,并在出现大的问题之前获得小改善的经验。

  CIO在购买软件时应该询问供应商关于对Web服务和SOA的支持,作为一个重要的注意事项。应该检查新应用程序的开发,以便考虑是否某些应用程序功能可能需要用于其他目的,以及可以嵌入对Web服务标准的支持以支持重复使用。

  最终要完成大规模的企业转型,可能需要通过建立企业服务总线(形成SOA的骨干网或神经系统)来开始该工作。然后以企业合理的节奏,将服务提供商何服务请求程序逐渐添加到ESB。随着IT的SOA的增长,ESB成为在服务水平上连接应用程序,并调节消息流量以提高效率和可靠性的一种有力方式。

  问:管理SOA需要哪些新的服务管理技能?

  答:在运用Web服务之前,因缺乏标准和自由联合的策略,合作伙伴整合受到严重限制。随着我们开始使用Web服务和SOA来整合合作伙伴,我们可以发现,使用业务合作伙伴所提供的功能的IT系统已经开始依赖于这些功能的可用性。我们从内部管理我们自己服务的可用性转向要求监视和管理(可能有许多)企业之间的可用性。这明显大大增加了管理IT系统的复杂性,但它也带来了巨大的价值,这就是为什么许多企业要转到这个方向的原因。

  Web应用程序系统正在不断发展以支持Web服务标准。"Web服务分布式管理"或WSDM标准正在由OASIS开发,对Web服务管理提供标准化的支持,通过使用Web服务来实现对不同平台的管理,满足涉及独立业务实体的大规模SOA对分布式管理的要求。

 
July 24

Eclipse基金会JSR-220ORM项目介绍:

 

The JSR220-ORM project provides Eclipse tooling for implementations of the JSR 220 (EJB 3) persistence and JSR 243 (JDO 2) specifications. This project will track the changes to these specifications, so that as they merge together towards a common persistence standard, appropriate tooling will be fully implemented by this project. The over arching goal of this project is to provide visual development tools that facilitate round trip engineering and to provide an implementation that is extensible to accommodate new types of input and generate artifacts for alternative runtimes. 访问JSR-220ORM项目的主页,下载plug-in和开发手册。 项目主页: http://www.eclipse.org/jsr220orm/

 
小白的创意|false|
Photo 1 of 2