david's profileThe Butterfly Effect in ...PhotosBlogLists Tools Help

Blog


    11/29/2005

    折腾够了,也该歇歇了

    听到webwork将merge with Struts的消息,我是这个高兴啊。表现层框架过于的多了,现在,一个应用最火最灵活 一个应用最广最成熟的框架要合二为一,省得我折腾了。另外,我看那JSF就更没戏了,sun真是可悲啊可悲,本以为我看看,不会赔本,现在权可以当作休闲读物来读了,未来我看表现层除了ajax框架就是struts+ww的新合体struts2.0了。不知道ww的灵活 优雅会不会并入了apache巨人旗下也变得反映迟钝。我可以放心的看webwork了,也不必担心做struts应用过于老土了。new struts + ajax。嗯,我的战线缩短了不少啊,只关注这两个方向就可了(当然是表现层)
    11/27/2005

    有知识,没文化

    有知识,没文化--自己给自己的自我感觉最贴切的评价。有教养,没修养--当然此修养的缺乏并非指的随地吐痰之类的素质问题,而是没有艺术修养,文学修养。人活过的时光无法倒流了,再怎么感慨---小时候土堆上扔石子,院子里打水枪的时间,长大了乱泡的时间要是用在读书上多好啊---也无济于事。和tt一起看文章总是被拉下一大截,哼哼,没办法,书读得少,文盲一个,案头除了电脑书就是几本心浮气躁的成功学(自动自发,卡耐基口才之类),几张一份能看半年的经济观察报加上本圣经。可惜每次睡前躺在床上都自然的习惯性的捧起了计算机书籍……文盲生涯继续着。
    今天跟tt说起来想读厚黑学,因为感觉自己无匹夫之勇却满是妇人之仁,古往今来像我这个鸟样的就没一个能干大事的。还一天心高气傲的,shit,怎么跑题到这来了。说到厚黑学里一段,讲项羽不够黑不够厚,刘邦够黑狗厚,能杀韩信--tt说,那是他老婆杀得。我哪知道?我能知道项羽和刘邦一起上过PK台就不错了……顿时感觉,自己生活太无趣了,文学素养差写不出cimego那样的诗情画意文章就罢了,俺也没想当郭敬明,可是历史知识匮乏,这辈子白活么?欧洲史匮乏就罢了,who care谁吃饱了撑的提出来君主立宪,谁提出来三权分立,可是中国历史也混沌,这不该打屁股么?
    遂决定,自己不应该沉迷于对技术的yy了,像技术图书,为啥都爱看候捷老师的?那文学功底非常人能及,而gigix 庄表伟这样的人物,一看文字就知道博览群书,你说我20多岁吊锒铛,成天AJAX J2EE的却数典忘故……
    以后枕边时间就留给伟大的文学和历史了(不过在我想读列表中,第一位可是尼古拉的遗嘱,嘿嘿,我也看看炼金术 魔法石到底怎么一回事。传说和历史,到底怎么一回事)。
    提到图书就不得不提douban.com  推荐我的朋友们,爱读书的朋友们(我也算爱读书吧,今天逛超市2/3时间在图书架子边上)都去douban看看,那里的服务才叫做贴心,那里才叫做web2.0,非要弄个RSS才叫web2.0?
    老大推荐的细节决定成败,让我最近经常反思,关注细节有习惯问题 经验问题 办事方式问题 态度问题。而豆瓣就算找对了切入点并且抓住了细节。顺便fuck一下当当网,什么玩意儿!!!
     
    废话少说,douban is really fucking cool.dangdang is really fucking shit.滴眼药去了,看电脑看的都对眼了……
    11/26/2005

    选择中

    目前正在选择比较ajax应用方案,来改善用户体验,至少可以让我以后写出更cool更友好的UI。buffalo确实使用起来让人感觉很清爽,调用十分灵活,不须多配置,而且micheal的能力毋容置疑,我们要支持国产,支持BJUG么。但是micheal的理念是One pae One application,虽然从buffalo中各取所需,但是,没办法说服公司用它,自己用吧,起码我要过几天给它研究一下,看如何与struts JSF整合再说,那样现在的项目我就可以应用。DWR没太大感觉,不过DWR可以调用配置可暴露的任何方法,包括struts action,只是actionForm没法用了,虽然我一直骂它,但是总不能做个异类吧,让同事都看不懂我的代码……暂时放着,它的代码我也没打算读,优先级在buffalo之后。要说目前首选就是ajaxanywhere,还有与JSF整合官方例子,理论上与啥整合都没问题。嗯,先搞它啦——等我回头把项目的消息删除和会社检索弄成ajax应用吓日本人一下。
    prototype真是个好东西,读这个没问档的精品工具代码,绝对的长见识,还好dev.java.net有共享出来的学习笔记
    明日任务:prototype source codes and DOJO(我也纳闷,为啥个dojo新东西就比Rico有人气呢)。
    11/24/2005

    Behaviour.js 清洁html代码

    http://bennolan.com/behaviour/   为了避免在html中引入过多的script tag,尤其现在富客户端应用很火的时候,script写的就越发的多。
    官方网站举了一个这样子的例子

    <div id="image_16209134_normal">
    <script language="Javascript">
    photo_hash['
    16209134'] = new Object();
    photo_hash['
    16209134'].title =
     '2am on Saturday';
    </script>
    <h4 id="title_div16209134" 
        style
    ="margin-bottom: 0px; margin-top: 0px;">

        2am on Saturday
    </h4>
    <script type="text/javascript">initPhotosUserPageTitle_div('16209134');</script>

    这是Flickr上面一段代码。确实,它使得代码阅读起来结构不清晰了。Behavior应用之后,不需在元素上写明触发事件要执行的方法,比如
    <a onclick="this.parentNode.removeChild(this)" href="#">
    Click me to delete me
    </a>
    而变成了
    <ul id="example">
    <li>
    <a href="/someurl">Click me to delete me</a>
    </li>
    </ul>
    那么javascript如果找到这个a链接并加上onclick事件方法的呢?采用css selector

    var myrules = {  
    '#example li' : function(el){  
    el.onclick = function(){   
    this.parentNode.removeChild(this);  
    } }};
    Behaviour.register(myrules); 确实看起来,html清爽了,但是,却引入了其他的元素。ok,我们可以为每个控件定义id,其实也未尝不可,asp.net不也是web component开发的时候都定义id的么?可似乎又脱裤子放屁之嫌。在维护一个对某一组应用相同样式或响应
    相同方法的html控件上应用behavior,有意义,起码不必每个上面都写上onclick之类的,但是对于更普遍的应用,每个html控件要做得事情是不同的啊。那个时候,不但用behavior代码量增加了,而且维护一个var myrules里的内容和去删除控件上的onclick其实工作量差不多。真正的应用可不是demo啊,列出来一排link写着remove me,然后执行一样的动作。
    不过正如我上面说的,还是有一定的应用场景的,大家可以在有此需求的时候考虑,还有一Behaviour.js

    東京ラブストーリ

    何から つためはいいのか
    わからないまま 时は流れて
    浮かんでは 消えてゆく
    ありふれたことはだけ
    君があんまりすてきだから
    ただすなおに好きと言えないび
    多分もうすぐ
    雨も止んで二人 たそがれ

    あの日あの时あの场所で
    君に会えなかったら
    ぼくは いつまでも
    见しらぬ二人の まま

    谁かが甘く诱うことはに
    もう 心 摇れたりしないで
    切ないけど そんなふうに
    心は 缚れない

    あしたになれは 君をきっと
    いまよりもっと好きになる
    そのすべてがぼくのなかで时を
    超えてゆく

    君のために 翼になる
    君を守りつづける
    柔らかく君を包む
    あの 风になる

    今 君の心が动いた
    ことは とめて 肩を寄せて
    ぼくは わすれない このひを
    君を だれにも 渡さない

    ajax 贴贴脸

    本想翻译IBM的一篇文章 Build apps using Asynchronous JavaScript with XML 但是发现不如就按照那个方式想怎么写就怎么写。之后有时间了会把其中的一个系列从基本应用到使用DWR框架的翻出来,也许对一些被AJAX buzz word一直骚扰但是没亲密接触的人有些用处。嗯,把dojo也列入计划吧,但愿我能坚持。
    由于JAVA servlet+web.xml配置起来稍显麻烦,而且此处主要介绍前端javascript,并且是入门文章,所以来个PHP版本,算是IBM意译PHP Ver.我会把code workthrough伴随在讲解当中。
    AJAX
    asynchronous javascript and xml的简称。异步是通过由XMLHttpRequest对象替代传统页面刷新式请求来实现,异步的目的是提供更加连续的 友好的用户交互。我想大多数人都讨厌等待浏览器的processBar蓝色慢慢变长的无聊过程和枯燥的白色无响应页面。

    那组成AJAX的几项关键技术 javascript css DOM XMLHttpRequest,可能只有XMLHttpRequest对我们来说是相对来说陌生的,前3项,只要做过web app的都不可以说不了解。

    XMLHttpRequestXMLHttpRequest是一个可以让用户不刷新页面的前提下直接提交和得到xml数据的对象。

    这并不是一个xx组织的标准产生物,所以要得到一个这样的对象,是通过不同浏览器的扩展来实现。IE通过ActiveX Object来提供,所以大多数ajax应用会看到对象的产生过程都有对浏览器的判断以达到兼容。不要开始大骂MS,平台给我们带来的麻烦并非都是微软造成。对于此对象,我不是个历史学家,所以只能稍微查找些资料来了解。

    It is not yet being embodied in any public standard (although something similar is in the works for the proposed W3C DOM Level 3 Load and Save spec)from XML.COM所以它不是一个标准而微软不去执行的例子。
    Microsoft first implemented the XMLHttpRequest object in Internet Explorer 5 for Windows as an ActiveX object. Engineers on the Mozilla project implemented a compatible native version for Mozilla 1.0 (and Netscape 7). Apple has done the same starting with Safari 1.2. from apple.com

    所以,可以感谢一下微软,还是做了些创新的,估计是为了他的EXChangeServerweb client端服务的……我猜我猜。

    Similar functionality is covered in a proposed W3C standard, Document Object Model (DOM) Level 3 Load and Save Specification. In the meantime, growing support for the XMLHttpRequest object means that is has become a de facto standard that will likely be supported even after the W3C specification becomes final and starts being implemented in released browsers (whenever that might be).from apple.com

    所以我们还是要通过如下代码方式创建一个对象:

    function init() {

        
    if (window.XMLHttpRequest) {

             req 
    = new XMLHttpRequest();

        }
     else if (window.ActiveXObject) {

             window.alert(
    "ActiveXObject");

             req 
    = new ActiveXObject("Microsoft.XMLHTTP");

        }


        
    var url = "server.php";

        req.open(
    "POST", url, true);

        req.setRequestHeader(
    "Content-Type","application/x-www-form-urlencoded");

    }

    通过对不同浏览器的判断,产生不同的对象。我想大至大家了解了此对象用处,http请求也是在一些标准协议中定义的header之后以名称,值对的方式来向服务器发送,作为xml天生对数据良好描述的本领,担任此任务小case,但是对于文件上穿等,还是用传统form来解决滴吧。


    备考:Table 1. Common XMLHttpRequest Object Methods

     

    Method

    Description

    abort()

    Stops the current request

    getAllResponseHeaders()

    Returns complete set of headers (labels and values) as a string

    getResponseHeader("headerLabel")

    Returns the string value of a single header label

    open("method", "URL"[, asyncFlag[, "userName"[, "password"]]])

    Assigns destination URL, method, and other optional attributes of a pending request

    send(content)

    Transmits the request, optionally with postable string or DOM object data

    setRequestHeader("label", "value")

    Assigns a label/value pair to the header to be sent with a request

    好了,废话讲完了,开始菜鸟级别的亲密接触。我想ajax是有应用场景的,那么我举个我感觉很贴切的应用场景,在论坛注册的时候,验证是否已经存在你要注册的用户名。在没有ajax之前,我们都要单独点一个button,弹出新窗口等待结果。这里面我们使用户输入完了用户名之后,不影响其正常填写其他内容,神不知鬼不觉地完成验证并提醒客户是否已经有人注册了。

    首先构建一个注册画面 regForm.php

    <html>

    <head>

    <script type="text/javascript" src="ajax.js" >

    </script>

    </head>

    <body>

    <font face="Arial,Helvetica,Verdana" size="3">

    <form name="regForm" action="reg.php">

    <b>Enter Your User ID: </b>

    <input type="text" name="userID" onblur="validate(this.form)"/> &nbsp; &nbsp;

    <!--Message -->

    <span id="msg"></span>

    <br/>

    <input type=”password” name=”pwd”/>

    .other input filed

    <hr>

    </body>

    </html>

    好啦,一个丑陋无比的注册页面搞定了。

    紧接着,完成我们的ajax.js文件

    var req;

    var url;

    定义req url全局变量 一个用来表示XMLHttpReqeust一个表示请求的服务器端资源。

    function init() {

        //。。。。。看上面

    }

    function validate(formObj) {

        init();

        req.onreadystatechange = userIDValidator;

        req.send("userID ="+formObj.userID.value);

    }

    此函数便是当用户输入完了用户名,自鸣得意的去输入其他的文本域时触发的事件,它悄悄地执行。由于在init()函数中我们如此设置req.open("POST", url, true);最后一个参数true就是异步的设置所在,如果未false,效果大家看看msn spaces的流言就知道了,叶面虽然不刷新但是要停止响应一段时间,嗯,给你点看字的机会却不让你滚动边上可爱的scroll翻页。

    既然我们设置了异步处理,那么执行完了通知谁啊?通过此句req.onreadystatechange = userIDValidator;req状态改变的时候,执行userIDValidator。这是一个回调函数的应用,不理解啥是回调没关系,总之req状态改变了,就执行此函数名字的函数(你也可以写匿名函数req.onreadystatechange=new Function{javascript真伟大}).一切就绪,向服务器发送请求。Send()方法中传递请求的参数。

    当服务器响应了呢?那就是userIDValidator要干活的时候啦。

    function userIDValidator() {

        
    if (req.readystate == 4{

             
    if (req.status == 200{

    if(req.responseText!=true”){

    window.alert(“你怎么注册别人有的用户名啊
    ?”);

    document.getElementById(“msg”).innerHTML
    =”换一个换一个”;

    }
    ;

             }


        }


    }



    req.readystate == 4代表请求响应完成 具体的代码意义如下

    0 = uninitialized
    1 = loading
    2 = loaded
    3 = interactive
    4 = complete

    req.status == 200这个是标准的http响应状态码,有些时候你的ajax应用响应石沉大海,你就可以输出这个req.status调试一下,看看是不是出现了404 202等咚咚。

    待会我们看见那个极其简单的服务器端php文件返回的text/html普通响应,所以此刻我们用req.responseText其实稍微复杂一些的应用都要返回xml作为响应结果,然后客户端用脚本解析xml文件再通过操作DOM来改变页面内对象的内容或者结构等。也可以返回的xml对象通过xslt来解析,不过增加了学习的曲线。服务器端产生xml对象也是繁琐的工程,所以出现了很多现成的框架帮助简化开发,比如国产buffalo,洋货DWR等,通过与前端dojo Rico等框架组合,产生强大的交互功能,一流的用户体验。

    那么简单的xml操作可参考ibm文章中做法:

    var messageObj = req.responseXML.getElementsByTagName("message")[0];

                
    var message = messageObj.childNodes[0].nodeValue;

                
    if (message == "true"{

                    msg.innerHTML 
    = "Subscription is valid";

                    document.forms[
    0].order.disabled = false;

                }
     else {

                    msg.innerHTML 
    = "Subscription not valid";

                    document.forms[
    0].order.disabled = true;

                }



    ok了,看看服务器端庐山真面目吧。

    <?php
    $userid = $_POST['userid'];
    echo
    "true";
    ?>

    我靠,太简单了吧,你耍我呢啊?这个……我用写全么?无非就是

    <?php
    echo
    isValide($_POST['userid']);
    ?>

    isValide()中连接数据库,查询,返回结果……

    ok,你已经可以神不知鬼不觉地检查用户名,然后突然弹出窗口提示用户,你的名字不对。

    下一教程应该是谈论对象序列化和反序列化问题 之后是DWR 之后是dojo 之后是javascriptdebug 之后是buffalo 之后是……之后是……

    11/22/2005

    没废话,就是日

    日tmd所有娱乐记者。周杰伦的歌写的也好,正好想起来了。能当娱乐记者的都不简单啊,连皮能当坦克履带用了,而且惟恐天下不乱,超级tmd该死。
    11/15/2005

    平静如死水

    生活趋于程式化
    几个常混在一起的同事,中午吃完饭了照例晒太阳。说起时间飞快,似乎都有同感。一旦生活成了规律,似乎时间就会过得飞快。和读书时再也不同。每周一还刚刚开始,似乎第二天就到了周末。重复着起床 上班  敲键盘 下班 这样平静的生活。每天期盼的似乎只剩下晚上回来跟tt做点吃的,然后看些自己喜欢的书。而每周期盼的似乎就是周五大家出去FB 然后周六打打球,看看欧洲联赛,和tt逛逛超市。几乎周末的一切活动都程式化了。
    我真的开始恐惧时间流逝的速度了,从来没有过的恐惧,转眼间我要入职半年了,回头看看,似乎我还是毫无长进。伸伸手,自己离梦想的距离,不但没有拉近,反而变得越来越远。还好,这辈子曾经优秀过,就碰到了一群比我优秀的朋友,他们的nb轨迹时不时提醒我,生活还要继续,梦想还要追逐---以至我不会麻木。吾生也有涯,吾知也无涯……
    自己感觉好象要做些什么的时候,总是突然有什么异常抛出,阻碍了自己。其实不然,哪有顺顺利利的呢,这都是机会成本。没有放弃就没有所得。Never lose my passion。
    很佩服DFLYING专注的走自己的路的信念,而我似乎总是要听下来看看别人,大家都在哪呢?可能个性不同,他是发电机,我是蓄电池,我需要停下来看大家的时候让别人给我充电。
    柜子上的书越来越多,枕边也越来越高,还好,自己再不像大学一样耽误时间。我真的很奇怪现在的自己,有些时候,因为一些事情耽误了自己的读书计划,就会内疚的很,似乎浪费了好多时间,如果早这样---这种crap还是少说得好。似乎是该放弃一些东西的时候了,我苦苦把自己休息的时间拿出来做我的研究,工作中却在研究excel;红宝书与大家日本语,矛盾却无法统一;更重要的是,我的时间,如此飞快的逝去。Stop....No one told me that life was gonna be this way.Enjoy it?No, i cann't feel large charge when i was violated.So change it step by step.Go go go,super david.
    11/14/2005

    次の記事について :老照片 from Yu,Cui

    No more comments.One sentence remind me:Never forgot your dream whatever the dream is so far away and unpractical.

    元の記事からの引用

    老照片
    一 老照片
     
      发一些小时候的照片,见证一下我的成长,呵呵.我不是怀旧的人,但我发现自己好多天没写东西了,就赶紧拿点吸引眼球的东西出来,欢迎大家围观
     
      总觉得人生很玄妙,<<重庆森林>>里面有一句台词,"每天你都会跟许多人擦肩而过,有些人可能会变成朋友,有些变成知已,所以我从不放过可以跟大家磨擦的机会。"
     
      我在想,我小时候穿着开裆裤乱跑的时候,某些人会不会曾经戴着小肚兜从我身边爬过?
     
    二 梦想
     
      "Going abroad is my dream...do you know...when I walk on the street, I can still feel my dream" 他认真的说.
      此刻我们两个人还是在Burger King里拿着"buy one and get one free"的带金券买汉堡和署条的小子.我坐在店里,听他用断续的英文讲他的故事,看他执着坚定的表情,觉得,
      人,永远也不要忘记自己的梦想.
      他是个从泰国来的学生.喝上一杯Heineken就会晕掉,然后晃到我旁边,红着脸兴奋的对我念中文.laura和milo也好奇的跟着念,但他们总念不对.比如我的名字"Yu",欧洲各国语言都没这个音,他们只能读成"You".于是他一遍一遍的叫着还算标准的"Yu",同时大笑别人念的不对.
      他家在泰国是做生意的,家境不错,但他不肯接手家族的事业,而要自己创业.他不肯花父母的钱,却要把奖学金省下来请父母到欧洲旅游.他说,他的梦想是MIT.
      这故事讲得可能有点平淡,不过现在想起当时的情景我都很感动.也许是因为自己心里也曾经有个美国梦吧.我不知道两年后我会不会去美国,但是我以我的体验告诉大家,年轻的时候,要执着一点.
      人,永远也不要忘记自己的梦想.
     
    三 搬家
     
      要搬家了,我怀疑我以后还会搬很多次家,因为我希望和不同的人住在一起,体验不同的生活.
      小时候我妈就怀疑我有两个CPU,因为我特别能折腾.现在也没有收敛,可能年轻就是不甘于平静吧.
      虽然会很怀念这个地方,但生活,还是要move on.
     
     
    11/12/2005

    Thanks giving

    Read first:
     
    我们的生活是否过于糜烂了?每周末大家沟通感情的一顿饭钱就可以帮助几个孩子读一年的书……我从不会把钱交给政府手里,但是我想,如果有机会能够到得实地,我一定会每个月都帮助一个孩子,那不到200元的学费,还不到我们一件衣服的一半……Thanks giving.有时候会抱怨上天不公,对阿,上帝偏爱我了,珍惜生活,enjoy everyday.....

     
    11/9/2005

    集成了,崩溃了

    我不知道CMMI都影响了些什么,除了留给我无尽的meeting和文档,但是迭代周期,构建频率,测试方法等等跟开发息息相关的却没有任何实质性指导。我不知道这个是不是就是根据我们这个没做前号称超级轻松 时间超级富裕tailor过的结果。
    可是CMMI就像大象,即使体格小,也是象,一旦计划制定了,似乎无论情况怎样,都无法迅速反应。像我们这个小小的,需求拿了一个多月,编码却只有 2周的项目,CMMI没有任何控制的迹象。可能说:没有CMMI你们更加混乱。会么?我看不出来还能再混乱到什么地步了。
    在客户在海外,需求不明,QA反应迟钝的情况下,CMMI只能让我们用meeting来充斥一次次等待客户确认需求的时间。
    我相信如果用敏捷方法指导开发绝对不会导致目前的混乱局面。首先测试一方面,我感觉V MODEL十分适合,在需求拿到了 demo产出的时候,function test case就应该设计出,那个时候会让我们尽可能少的去想实现,而把用户体验和功能彻底做好。而high level design完成的时候 Intergrated Unit test case就应该设计完成(也许对一个技术十分不成熟的团队来说此要求过高,大家没有任何设计测试用例的经验),当detail design完成的时候,Unite Test case 也应该随之产生,这样也不知不觉地开始了测试驱动开发。而我想周围的同事都习惯性的写好了一个功能点了部署到服务器,跑一下,出错了以后,根据tomcat可怜的报错信息开始跟踪调试,无数的log.debug更甚至无数的system.out。这个还好,仅仅影响效率而已。可是没有任何对迭代的指导,导致各自为战,马上要集成了,哇,崩溃了。一个程序集成的时候是麻烦最大的时候。大家自己的模块集成单元测试都没做好,怎么能做这种IT呢?如果我们至少一周构建一次(根据开发计划,因为我们不是一个敏捷团队),怎么会导致今天这种崩溃的局面呢?まいたな!
    事总要有人做的,程序员修炼三部曲之项目自动化之道已经躺在我的枕边。但愿我的努力和大家这次的教训能让我们下个项目在deliver之前不用再集体加班……
    11/8/2005

    偏得

    无意打开电视,居然发现大学生篮球超级联赛请来了LY.哈哈,坐在前面慢慢观看。
    大超明显是学NBA么,NBA全名星周末总是把MC那样实力的人请来清唱国歌,可惜中国的国歌不适合清唱,谁敢用国歌来展示唱功呢?除了规规矩矩的,谁也不敢拽几下子。
    还好,中场的时候LY再次出场,可惜后面伴唱的过于激动了,那声音,嗷嗷的……我都听不清了。心满意足鸟,继续看书去……
    11/7/2005

    reflection

    Reflection
    Look at me 
    You may think you see who I really am
    But you'll never know me
    Ev'ry day 
    It's as if I play a part
    Now I see 
    If I wear a mask I can fool the world
    But I can not fool my heart

    Who is that girl I see 
    Staring straight back at me
    When will my reflection show 
    Who I am inside

    I am now 
    In a world where I have to hide my heart
    And what I believe in
    But somehow 
    I will show the world What's inside my heart 
    And be loved for who I am

    Who is that gilr I see 
    Staring straight back at me
    Why is my reflection someone I don't know
    Must I pretend that I'm Someone else for all time
    When will my reflection show Who I am inside
    There's a heart that must be free to fly
    That burns with a need to know the reason why
    Why must we all conceal 
    What we think How we feel
    Must there be a secret me I'm forced to hide
    I won't pretend that I'm Someone else for all time
    When will my reflection show Who I am inside
    When will my reflection show Who I am inside
    11/6/2005

    service is software,software is service

    软件即服务,微软可能迟迟不肯承认不愿意拥抱这种趋势的原因,可能就是服务目前还停留在通过网络提供的阶段(可能也只有通过网络才能体现这一理念),而软件通过服务暴露给客户,就意味着对操作系统的淡化--这一微软赖以发家的金母鸡,当然还有office。而为何微软又开始承认此趋势呢?可能只有bill gates才知道。可能大家都这么设想软件的未来,并且Google之类的公司也一直在向此方向努力,给了微软太大的压力。www.live.com 这个被微软提升到了战略高度的雏形产物,说实话,我太笨,在没看到各种解说可评论之前还没看出来与以前myMsn有何差别。不过可能就是理念不同,将来发展方向不同吧。MyMsn主要给用户一个信息的集合点,一个个人信息的门户,当你add content的时候,你得到的是FOX BBC等新闻 天气预报等咨询。而window live add content将来可能会添加服务,软件的服务,比如微软也说过要把office作为服务提供,将以授权形式的收入转化为广告盈利。微软一直都是一个创新型的公司,不知这次的绝地反击,会给google YAHOO AOL等公司带来怎样的冲击。
    BTW,一直想实践一下webwork(or JSF)+hibernate的应用,中间搭配spring or EJB,可是总是想起码要做点有意义的东西吧。什么有意义呢?想来想去,重新发明个轮子的,谁让我没创意呢,做个个人portal。也许以后每个人的操作系统都是网络定制的呢……
    11/3/2005

    K书加乱弹JSF与domain model

    既<core J2EE Patterns>后<Patterns of Enterprise Application Architecture>也上了我的书架喽,嘿嘿。本来都决定不再blog写废话,耽误时间,但是实在高兴(有啥高兴得,又不是买不着)不过再也不同捧着那英文ebook盗版马丁老大的著作了。王怀民翻译水平还是可以的,总不能比我前两天看的core JSF再差了吧。那本句子翻译的,中国人都看不懂的中国话。马丁的这本可是推荐,五星级……
    JSF
    最近看了看JSF,本来为了给自己个解脱,不再沉迷于表现层框架,可惜,实在标准无法让我满意,我也无法像banq那样死心塌地跟随标准,那样显得太过于保守甚至愚蠢(看看专业论坛关于某种如今流行技术的争论,1 ,2年前的争论,就会有深刻感觉了)。JSF仅仅在struts基础上进步了一些,但是,由于还是无法逃脱Struts的影子,没出现大换血的情况。毕竟JSF也是struts的缔造者参与搞出来的。可能当初sun看到了struts如此流行,于是招安了再缔造下一个标准,可惜SUN总是那么没有运气,JSF JDO EJB目前都处于尴尬的局面,甚至 sun制造成了傻了吧叽的不中用标准代名词,只要是SUN搞出来的就不怎么样。
    JSF与struts的不同有以下这样几点:首先,更加灵活的POJO(JSF称之为managed bean)直接代替了以前的ActionForm。我认为这个虽然很到,但是是必然的,无甚可叫好的。ActionForm刚用感觉,哦,不错哦。可是当真正用了一段时间,真的就是感觉是个脱裤子放屁的产物。把ActionForm与各种商业上的模型产生的bean进行值得对考,或者又actionform组和几个bean组织的网。那么必然会让actionForm变得臃肿,因为有些属性是某个用户请求传递的,某个后端bean需要的,但是某些属性又是另外的bean需要的。ActionForm是粗粒度的,所以有些时候反而成了绊脚石。这个也和一个form一个action一个actionform对应关系有关。那么strus呢?一个标签<h:outputText value=#{user.name}> user为一个配置的managed bean,name是他的属性,任何组件都可以任意对应。具体到binding 组件树,渲染器暂时先不讲,我也没深研究。
    JSF的类型转换与验证,没啥多说的,凑合用,没让我兴奋(don't make me high.^_^)类型转换倒是挺方便的,起码大部分情况不需要自己手动转换类型了。(因为客户端传递过来的都是String型)
    faces-config.xml 呵呵,名字很像struts-config.xml吧。但是功能不完全一样,这个JSF配置文件主要作用就是页面导航和managed bean的配置(包括POJO赋初值,map list类型赋值等)。struts中一个form要对应一个action 而action就是要调用service层或者小项目,直接action包办一切调用DAO Layer,这里面既包含了页面的导航又隐藏着包含了要调用什么样子的逻辑。但是JSF的配置仅仅是粗粒度的页面导航和action(此action非彼struts action,后面提到)。一个典型的简单的配置就是from-view-id 比如index.jsp然后outcome配置index.jsp表单中的提交指定的处理类比如<h:commandButton action="#{action.auth}">那么如果outcome配置的名字为action就会调用其指定的类的auth方法。所以可以from view可以配置好多响应事件和转向页面。
    那么细粒度的事件驱动如何实现呢?JSF中有个理念。action处理的是页面的转向和逻辑,而actionListener处理的是页面逻辑,action不知道也不会处理页面逻辑。这样诸如联动下拉列表,就可以在下拉列表中配置actionListener来实现相应的处理。JSF的一个请求响应有相应的生命周期 从客户请求-apply request value-validate and data type transfer-update model-invoke application-response.每个阶段都可能产生事件都可能使事件监听的类做动作。而这些事件监听者的动作可以选择执行后继续生命周期流程,选择直接到输出结果,甚至全部跳过。
    等有时间了结合实例讲讲JSF开发,感觉JSF还是个过渡工程,根本无法提起开发人员的兴趣,倒是类似webwork这种灵活多变的框架深得人心,而说到事件驱动,页面组件开发,大家更愿意研究Tapestry.其实也很简单,虽然我对T正要研究但刚有个了解但他对传统html标签的低侵入就很深的人心,普通的标签加上一个专属属性id就行。而JSF因为是标准,依然要大力推广作为标准的tag。看到<h:inputSecret .....>这样的东西能让谁能够高兴得起来呢?刚刚费力气把struts标签骂了一通,反过来还要再学一次JSF标签,引用我同事jacky的一句话:那还是杀了我吧。
    而JSF的事件驱动总是让我感觉不是那么的清晰,真正的细粒度处理,还得ajax,即使asp.net以前也是要频繁的回传,而目前JSF只不过是变通了一下子,要么你就提交按钮制定action处理整体的转向和方法调用,而每个控件设置的listener只不过是在生命周期过程中伴随处理的逻辑,当然,你也可以通过处理过后直接跳过其他步骤地方式把这个actionListener抬举一下,但是用来用去,用不好还是要糊涂和混乱的。
    可能是我看JSF时间太短,也没有项目实战,有些东西体验实在不深,所以还要深入研究一下。准备对比它和tapstry啦。嗯,想着明天把公司的那几本JSF的书down下来。中译版作者逼着我看英文啊,因为看不懂他们的中国话……
    时候不早啦,看我的小品joel on software去拉,关于Domain model and anemia-object的我的认识还是以后再yy吧……这东西,是我在javaeye最近看的最爽的讨论了。

    Thanks wicket

    Not for it's another framework but it's introduction.:)
    Look,so many buzz........choose one and stick on it.
    Echo Cocoon Millstone OXF
    Struts SOFIA Tapestry WebWork
    RIFE Spring MVC Canyamo Maverick
    JPublish JATO Folium Jucas
    Verge Niggle Bishop Barracuda
    Action Framework Shocks TeaServlet wingS
    Expresso Bento jStatemachine jZonic
    OpenEmcee Turbine Scope Warfare
    JWAA Jaffa Jacquard Macaw
    Smile MyFaces Chiba JBanana
    Jeenius JWarp Genie Melati
    Dovetail Cameleon JFormular Xoplon
    Japple Helma Dinamica WebOnSwing
    Nacho Cassandra Baritus
    11/2/2005

    只能骂娘

    http://blog.yam.com/subing/archives/519476.html
    wordless.避免限于争吵与气氛,看书去……
    11/1/2005

    direction

    It seems that too many presentation-layer frameworks make me puzzled.Thought they can be easily catalog--traditional MVC(struts,webwork,Spring MVC etc)component based(tapestry,JSF etc),every FW will cost me time to know it.And there r many many other ones as shale,Turbine,wicket.....I'm not foreknow so i don't know what will be the next de facto standard instead of STRUTS.So i can only follow official standard--JSF.Though I think it's not better than Tapestry.But i need more time to care business logic layer--Spring,EJB and design patterns and Persistant layer--Hibernate JDO toqure.So i decide stick my point on JSF temporarily.
    Another direction is AJAX,it makes me feel sick now coz i metion it too many times.DWR and Buffalo are the candidates.dojo and Rico will paly as a present roll.
    OK,i feel easy now.Go away,buzzwords....
    じゃ頑張ってよ!!!!!