<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Habitat Framework

    專注于Java EE企業級開發
    posts - 13, comments - 81, trackbacks - 0, articles - 5
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    2008年7月23日

    Nokia在Maxis推廣Widget的時候告訴我Widget只能在S603.2上運行,所有S603.0系列手機可以通過軟件升級來支持這個新功能

    Baidu一把,發現一大把人在說不能升級到S603.2,那不和Nokia的說法矛盾,Google一把Nokia software upgrade,找到一個自動更新程序
    連上手機,可以自己幫你識別你的電話是否有最新軟件升級可用,花了10多分鐘就下載完114Mb的升級文件,然后又花了5分鐘刷機成功,開機后感覺速度沒有太大提升,反而鈴聲沒有以前清脆了,我一款短信鈴聲以前聽起來高音非常不錯,現在聽有爆音了.......馬上測試了下我自己開發的Widget,果然可以識別并提示安裝,裝好了就和普通的Symbian Application一樣,不錯,又有得玩了........

    但是由于一直沒有查到S60的版本查看方法,所以我始終不知道我到底是不是升級到了3.2,如果有人知道,麻煩留言告訴一聲

    posted @ 2008-07-23 12:44 Kerwin Weng 閱讀(301) | 評論 (0)編輯 收藏

    2007年11月5日

    好像國內對Adobe的新產品AIR反應還不多,我個人試用了下覺得其實用處還是很大的,于是我就拋磚引玉寫一篇相關介紹文章吧

    AIR其實是一套框架和一個VM,它允許用戶把Javascript,HTML,CSS集成到統一的客戶端,在用戶桌面運行,避免了瀏覽器差異,并且實現了跨平臺的通用性,同時又對Javascript功能進行了很多擴展,比如讀取本地磁盤文件,做跨域的遠程訪問,使用多媒體文件等等(相信是flash的底層在支持),相對于兩年前的Flex,AIR在RIA領域無疑又是一個跨越,
    想象一下以后我們可以用JS+HTML+CSS來寫基于http的遠程且防火墻安全的C/S應用了,還是蠻爽吧
    Demo在這里:http://labs.adobe.com/showcase/air/?promoid=BJXTF
    用JS來寫應用的文檔在這里:http://livedocs.adobe.com/labs/air/1/devappshtml/


    Adobe AIR出新版SDK后,出乎意料的是很多之前的Demo不能跑了,會出"parsing disallowed"
    ,原因就是adobe換用了新的安全框架,禁止掉了Javascript中某些可能對其框架做出安全威脅的API,比如說JSON的命根--eval

    Adobe的官方解釋是在AIR2禁止掉了類似eval這種動態代碼加載技術在其Application sandbox中的運行,解決辦法是把你有eval的應用移到Browse sandbox中執行,所謂的Browse sandbox意思是你的應用主頁面是通過application.xml中配置的根頁面來用iframe引入的,在iframe引入的頁面中你就可以做eval,而把其他如跨域查詢等AIR提供的高級API操作放到根頁面中去做,然后通過一個parent/childSandboxBridge來做互相引用和傳遞數據的橋梁,
    但是同時你在iframe中的js也不能直接使用AIR所提供的一些高級API,比如air.trace().原文的解釋在這里 ,Adobe甚至還寫了一篇文章來鼓吹這種方式其實更符合設計模式--根頁面負責數據傳遞,iframe頁面負責業務邏輯.但是無論如何這篇文章作為Browse sandbox的入門來講還是很值得細讀的

    于是結合自己當前的實際需要,我寫了一個批量查詢airasia.com機票的小工具,因為airasia從來都是打廣告說從多久到多久,從那里飛到那里才幾塊MYR! 就是這個"起"字相當關鍵......直接造成每次我去查的時候發現因為"已經快滿坐"了,所以價格和平時的一樣,甚至更高,聽同事說他們都是先一天一天去查看哪天便宜就趕快預定,太辛苦了吧,那我要查2007-11-05到2008-01-31日的機票要花多少時間啊,而且不查到最后一天還不知道是不是最便宜的,嘲笑他們原始之后我就決定自己寫個工具來查

    所以我寫的第一個AIR應用就是這個AirAsiaTicketsSearch,可以批量查詢某個時間段去和某個時間段回的所有機票,并且把機票價格用jQuery.tablesort給排序出來,并且用jQuery.tablesort.page做了分頁(說句題外話,jQuery的tablesort確實很強大,但是在排序"1,280.00 CNY"這種數據的時候還是有問題).另外開發環境值得一說,無論是eclipse+aptana或者aptana standalone都一樣的,aptana就是一個Eclipse的RCP,關鍵就是aptana真的是很好用的工具,目前不僅支持AIR,而且還支持開發Apple iPhone的應用,只是專業版要收費.....

    后面給出截圖,
    結果發現昨天還有295.99的機票,到了今天就漲到349.99了-_-!


    posted @ 2007-11-05 20:39 Kerwin Weng 閱讀(3806) | 評論 (7)編輯 收藏

    2007年10月18日

    幾個月前就想弄明白什么是閉包,聽名字多神奇,而且犀牛書上好像也沒有講到,baidu出來的結果倒是很多很準確,但是看著那些牛人們翻譯的英文文章,講了上千字我還是沒有明白什么是閉包,遇到復雜的地方沒法翻譯還只能引用原文來解釋,本來我的FF受某個插件影響開CSDN不僅慢還會停止響應10多秒,我都是忍痛點下CSDN的連接,結果看到這種垃圾文章真是讓人憤怒,寫了一大堆,最后還是不能讓人明白他到底想要解釋什么是閉包,還是炫耀他對技術的理解,還是要滿足他對翻譯的狂熱.

    結果今天終于看到一篇Morris Johns的文章,用了不到5分鐘就把閉包是什么講的清清楚楚,比如文章中有一句話:
    In JavaScript, if you use the function keyword inside another function, you are creating a closure.

    媽的,還有比這更簡單的解釋嗎,為什么那些國內所謂的牛人就是寫不出這種平實的話,就非要浪費自己和別人的時間講一堆貌似浮云的定義,我覺得他們真的該思考下自己寫技術文章的目的,是為了在傳遞知識,還是在滿足自己的虛榮,如果是后者,建議直接在Tag中注明"自慰貼",免得浪費大家的時間.

    在后面的文章中,作者列舉了很多生動的例子,每個例子后面的解釋都非常平實,沒有任何為了表現自己能力的華麗辭藻,通過他的例子,我很快理解的閉包的特點,可以用來做什么,前后不到30分鐘,回想我幾個月前光是找合適的解釋就找了近一個小時.

    當我對閉包的特點已經諳熟于心后,作者再開始講一些抽象的定義,讓人感覺沒有一點障礙,就如作者自己的話:
    If everything seems completely unclear then the best thing to do is to play with the examples. Reading an explanation is much harder than understanding examples. My explanations of closures and stack-frames etc are not technically correct - they are gross simplifications intended to help understanding. Once the basic idea is grokked, you can pick up the details later.

    最后給出那篇文章的地址,相信不懂閉包的人也能像我一樣很快就理解,同時也希望大家看完后別忘了別人踏踏實實寫技術文章的態度
    http://www.javascriptkit.com/javatutors/closures.shtml

    posted @ 2007-10-18 13:28 Kerwin Weng 閱讀(1584) | 評論 (14)編輯 收藏

    2007年10月12日

    最近寫AJAX的應用遇到很多需要豐富的Javascript集合的地方,可惜javascript沒有Java的Collection那么強大的集合類,于是打算自己嘗試寫一個模擬Set的API,結果寫出來的模擬類和Set有點不同,有一個優勢--可以有序取單個對象,但也有一個劣勢,就是刪除單個對象需要遍歷該集合,由于我的應用不大可能用到單個刪除,所以我暫時還沒有想到一種數據結構可以實現不遍歷的單個對象刪除,又能滿足現有的API都高效完成,如果誰有更好的代碼來實現請回復

    目前想到可以實現的方法:

    add(o);
    addAll(array)
    contain(o);
    get(int);
    getAll();
    sort(comparator); //傳進去的是一個fn,還沒有寫例子....
    size();
    remove();
    reverse();


    基本數據結構是兩個數組,一個是index數組,數組下標連續,用來存放第二個數組的下標,另一個是存放對象的數組,不連續,下標是對象的id或者對象中其他任何可以轉換成唯一Integer的Field(Set也要求放進去的對象必須要有hashCode嘛,不然沒法區別第一個和第二個)

    實現的API:
    function Collection(){
        this.chain=new Array();
        this.table=new Array();
    }
    Collection.prototype.get=function(i){
        return this.table[this.chain[i]];
    }
    Collection.prototype.add=function(o){
        this.table[o.id]=o;
        this.chain.push(o.id);
    }
    Collection.prototype.addAll=function(array){
        for(var _i=0;_i<array.length;_i++){
            this.add(array[_i]);
        }
    }
    Collection.prototype.contain=function(o){
        if(this.table[o.id]){
            return true;
        }else{
            return false;
        }
    }
    Collection.prototype.getAll=function(){
        tempList=new Array();
        for(var _i=0;_i<this.chain.length;_i++){
            tempList.push(this.table[this.chain[_i]]);
        }
        return tempList;
    }
    Collection.prototype.sort=function(comparator){
        this.chain.sort(comparator);
    }
    Collection.prototype.remove=function(o){
        var _var = this.chain;
        for(var _i=0;i<this.chain.length;i++){
            if(this.table[this.chain[_i]].id==o.id){
                this.table[this.chain[_i]]=null;
                this.chain.splice(_i,1);
                return;
            }
        }
    }
    Collection.prototype.size=function(){
        return this.chain.length;
    }
    Collection.prototype.reverse=function(){
        this.chain.reverse();
    }
    目前還有一個addAll方法也是暫時沒有想到有什么不用遍歷的好的實現

    前同事提供了一種完全和Set一樣的實現,效率滿高
    function Map(){
        this.obj = {};
        this.count = 0;
    }

    Map.prototype.put = function(key, value){
        var oldValue = this.obj[key];
        if(oldValue == undefined){
            this.count++;
        }
        this.obj[key] = value;
        return oldValue;
    }

    Map.prototype.get = function(key){
        return this.obj[key];
    }

    Map.prototype.remove = function(key){
        var oldValue = this.obj[key];
        if(oldValue != undefined){
            this.count--;
            delete this.obj[key];
        }
        return oldValue;
    }

    Map.prototype.size = function(){
        return this.count;
    }

    function Set(getKey){
        this.map = new Map();
        this.getKey = getKey;
    }

    Set.prototype.add = function(value){
        var key = this.getKey(value);
        this.map.put(key, value);
    }

    Set.prototype.remove = function(value){
        var key = this.getKey(value);
        this.map.remove(key);
    }
    Set.protorype.getAll=function(){
        tempArray=new Array();
        for(var i in this.obj){
           tempArray.push(i);
        }
        return tempArray;
    }

    Set.prototype.size = function(){
        return this.map.size();
    }

    還有一個朋友的實現和我最初的差不多,但是remove方法相當有創意,用正則表達式來刪除
    Collection.prototype.remove=function(o){
        var _var = this.chain;
        this.table[o.id]=null;
        var re = new RegExp("(^["+o.id+"]$)|(^["+o.id+"][,])|([,]["+o.id+"]$)","g");
        var s = "["+this.chain.toString().replace(re,"").replace(","+o.id+",",",")+"]";
        this.chain=eval(s)
    }

    有人回復說需要添加做驗證,我覺得不必了,如果添加的值和之前的一樣就直接替換好了,如果希望不被replace,直接在添加新對象之前用contain判斷一次就可以了,畢竟在我的實現中已不是完全在模擬Set了,目前更傾向于設計一個更高效和強大的集合類

    posted @ 2007-10-12 11:46 Kerwin Weng 閱讀(3544) | 評論 (2)編輯 收藏

    2007年6月13日

    使用AJAX不可以跨域一直是一個麻煩的問題,
    最近做AJAX框架時發現一種方法,不僅可以跨域,而且相比XHR可以省去很多解析XML的步驟,
    后來居然發現GoogleMap的API就在用,非常驚喜,趕快分享一下

    test.html
    <html>
    <title>Dynamic Script Object</title>
    <head/>
    <body>
     <div id="jsArea">
      <script id="js" src=testa.js></script>
     </div>
     <br>
     <input type="button" value="test" onclick="testSrc()">
    </body>
    </html>
    <script>
    //author:Kerwin.Weng
    //mail:hunteva@163.com
     function testSrc(){
      var jsObj = document.getElementById("js");
      var body = jsObj.parentNode;
      body.removeChild(jsObj);
      jsObj = null;
      var newJS=document.createElement("script");
      newJS.id = "js";
      newJS.src = "testb.js";
      body.appendChild(newJS);
      jsArea.innerHTML="Asynchronous"
     }
     var jsArea = document.getElementById("jsArea");
    </script>

    testa.js
    document.write("This is A");

    testb.js
    setTimeout(function(){jsArea.innerHTML="This is B,now imagine i'm a servlet";},100)

    測試結果表明可以在不刷新頁面的情況下更新jsArea中的內容,如果我們把testb.js換成一個servlet會怎么樣
    那不是可以在serverside直接寫數據或function給client用了嗎,完全不需要XHR來中轉,省去了不少麻煩,而且還可以實現跨域訪問

    但是有兩點要注意,testb.js用document.write沒有作用,如果不用setTimeout,會直接讓我的IE7和IE6crush,具體原因不明,有牛人知道請告訴我
    目前在FF2.0.0.4/Opera9.2/IE7/IE6下測試通過.

    由于找了好久都不知道這種方式的官方名稱,并且很明顯這不Asynchronous JavaScript and XML,這里連XML和XmlHttp的影子都沒有,
    所以為了稱呼方便我暫時叫它DSSO(DynamicSwitchScriptObject),當然這不是我發明的,Google不知道用了多久了,如果你知道準確的名字請麻煩告知我

    現在我們比較下AJAX和DSSO的特點:
    AJAX DSSO
    跨域訪問 不支持 支持
    異步操作 支持 支持(body.appendChild后不需要等到完成才會繼續,當然完整的異步訪問需要另外的pattern來支持)
    數據載體 XML或JSON或TEXT 可以直接由server寫成Javascript
    操作復雜性 需要解析XML或JSON 可以直接使用

    目前暫時想到這么多可以比的,期待大家的討論

    posted @ 2007-06-13 23:06 Kerwin Weng 閱讀(3788) | 評論 (7)編輯 收藏

    主站蜘蛛池模板: 久久亚洲国产欧洲精品一| 国产午夜亚洲精品不卡| 在线综合亚洲中文精品| 免费人成网站永久| 在线观看免费中文视频| 国产免费变态视频网址网站| 亚洲自偷自拍另类12p| 老司机午夜在线视频免费| 在线视频精品免费| 亚洲综合精品香蕉久久网| 亚洲欧洲专线一区| 免费无码毛片一区二区APP| 亚洲精品一级无码鲁丝片| 亚洲愉拍一区二区三区| 中文字幕在线免费| 亚洲1234区乱码| 午夜精品免费在线观看 | 亚洲中文字幕无码一去台湾| 日本XXX黄区免费看| 亚洲国产高清人在线| 精品国产免费人成网站| 全部免费a级毛片| 亚洲人AV在线无码影院观看| 破了亲妺妺的处免费视频国产| 亚洲图片中文字幕| 久久久免费精品re6| 中文有码亚洲制服av片| 99国产精品永久免费视频| 亚洲精品国产综合久久久久紧| 999国内精品永久免费观看| 亚洲欧美国产国产综合一区| 久99精品视频在线观看婷亚洲片国产一区一级在线 | yellow视频免费在线观看| 免费大学生国产在线观看p| 久久精品免费网站网| 亚洲综合精品一二三区在线| 四虎在线免费播放| 亚洲精品无码中文久久字幕| 怡红院亚洲怡红院首页| 午夜宅男在线永久免费观看网| 亚洲成_人网站图片|