ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品123区,日韩欧美一区在线,麻豆久久久久久http://www.aygfsteel.com/hunteva/category/26501.html专注于Java EE企业¾U§å¼€å?/description>zh-cnMon, 05 Nov 2007 20:46:31 GMTMon, 05 Nov 2007 20:46:31 GMT60Adobe AIR 初探http://www.aygfsteel.com/hunteva/archive/2007/11/05/adobe_air.htmlKerwin WengKerwin WengMon, 05 Nov 2007 12:39:00 GMThttp://www.aygfsteel.com/hunteva/archive/2007/11/05/adobe_air.htmlhttp://www.aygfsteel.com/hunteva/comments/158351.htmlhttp://www.aygfsteel.com/hunteva/archive/2007/11/05/adobe_air.html#Feedback0http://www.aygfsteel.com/hunteva/comments/commentRss/158351.htmlhttp://www.aygfsteel.com/hunteva/services/trackbacks/158351.html好像国内对Adobe的新产品AIR反应˜q˜ä¸å¤?æˆ‘ä¸ªäºø™¯•用了下觉得其实用处还是很大的,于是我就抛砖引玉写一½‹‡ç›¸å…³ä»‹¾læ–‡ç« å§

AIR其实是一套框架和一个VM,它允许用æˆähŠŠJavascript,HTML,CSS集成到统一的客æˆïL(f¨¥ng)«¯,在用æˆäh¡Œé¢è¿è¡?避免了浏览器差异,òq¶ä¸”实现了跨òq›_°çš„通用æ€?同时又对Javascript功能˜q›è¡Œäº†å¾ˆå¤šæ‰©å±?比如è¯Õd–本地¼‚ç›˜æ–‡äšg,做跨域的˜qœç¨‹è®‰K—®,使用多媒体文件等½{?ç›æ€¿¡æ˜¯flash的底层在支持),相对于两òq´å‰çš„Flex,AIR在RIA领域无疑又是一个跨­‘?惌™±¡ä¸€ä¸?/span>以后我们可以用JS+HTML+CSS来写åŸÞZºŽhttp的远½E‹ä¸”防火墙安全的C/S应用äº?˜q˜æ˜¯è›®çˆ½å?br /> Demo在这é‡?http://labs.adobe.com/showcase/air/?promoid=BJXTF
用JS来写应用的文档在˜q™é‡Œ:http://livedocs.adobe.com/labs/air/1/devappshtml/


Adobe AIR出新版SDKå?å‡ÞZ¹Žæ„æ–™çš„æ˜¯å¾ˆå¤šä¹‹å‰çš„Demo不能跑了,ä¼?x¨¬)å‡?parsing disallowed"
,原因ž®±æ˜¯adobe换用了新的安全框æž?¼›æ­¢æŽ‰äº†Javascript中某些可能对其框架做出安全威胁的API,比如说JSON的命æ ?-eval

Adobe的官方解释是在AIR2¼›æ­¢æŽ‰äº†¾cÖM¼¼eval˜q™ç§åŠ¨æ€ä»£ç åŠ è½½æŠ€æœ¯åœ¨å…¶Application sandbox中的˜qè¡Œ,解决办法是把你有eval的应用移到Browse sandbox中执è¡?所谓的Browse sandbox意思是你的应用主页面是通过application.xml中配¾|®çš„æ šw¡µé¢æ¥ç”¨iframe引入çš?在iframe引入的页面中你就可以做eval,而把其他如跨域查询等AIR提供的高¾U§API操作攑ֈ°æ šw¡µé¢ä¸­åŽÕdš,然后通过一个parent/childSandboxBridge来做互相引用和传递数据的桥梁,
但是同时你在iframe中的js也不能直接ä‹É用AIR所提供的一些高¾U§API,比如air.trace().原文的解释在˜q™é‡Œ ,Adobe甚至˜q˜å†™äº†ä¸€½‹?a target="_blank">文章来鼓吹这¿Uæ–¹å¼å…¶å®žæ›´½W¦åˆè®¾è®¡æ¨¡å¼--æ šw¡µé¢è´Ÿè´£æ•°æ®ä¼ é€?iframe™åµé¢è´Ÿè´£ä¸šåŠ¡é€»è¾‘.但是无论如何˜q™ç¯‡æ–‡ç« ä½œäØ“(f¨´)Browse sandbox的入门来讲还是很值得¾l†è¯»çš?br />
于是¾l“合自己当前的实际需è¦?我写了一个批量查询airasia.com机票的小工具,因䨓(f¨´)airasia从来都是打广告说从多久到多久,从那里飞到那里才几块MYRèµ?/span>! ž®±æ˜¯˜q™ä¸ª"èµ?字相当关é”?.....直接造成每次我去查的时候发现因ä¸?已经快满å?äº?所以ä­h(hu¨¢n)格和òqÏx—¶çš„一æ ?甚至更高,听同事说他们都是先一天一天去查看哪天便宜ž®Þpµ¶å¿«é¢„å®?太辛苦了å?那我要查2007-11-05åˆ?008-01-31日的机票要花多少旉™—´å•?而且不查到最后一天还不知道是不是最便宜çš?嘲笑他们原始之后我就军_®šè‡ªå·±å†™ä¸ªå·¥å…·æ¥æŸ¥

所以我写的½W¬ä¸€ä¸ªAIR应用ž®±æ˜¯˜q™ä¸ªAirAsiaTicketsSearch,可以扚w‡æŸ¥è¯¢æŸä¸ªæ—‰™—´ŒDµåŽ»å’ŒæŸä¸ªæ—¶é—´æ®µå›žçš„æ‰€æœ‰æœº¼œ?òq¶ä¸”把机¼œ¨ä­h(hu¨¢n)格用jQuery.tablesort¾l™æŽ’序出æ?òq¶ä¸”用jQuery.tablesort.page做了分页(说句题外è¯?jQueryçš„tablesort¼‹®å®žå¾ˆå¼ºå¤?但是在排åº?1,280.00 CNY"˜q™ç§æ•°æ®çš„æ—¶å€™è¿˜æ˜¯æœ‰é—®é¢˜).另外开发环境值得一è¯?无论是eclipse+aptana或者aptana standalone都一æ ïL(f¨¥ng)š„,aptanaž®±æ˜¯ä¸€ä¸ªEclipseçš„RCP,关键ž®±æ˜¯aptana真的是很好用的工å…?目前不仅支持AIR,而且˜q˜æ”¯æŒå¼€å‘Apple iPhone的应ç”?只是专业版要收费.....

后面¾l™å‡ºæˆªå›¾,
¾l“果发现昨天˜q˜æœ‰295.99的机¼œ?åˆîCº†ä»Šå¤©ž®±æ¶¨åˆ?49.99äº?_-!




]]>
关于Javascript闭包学习(f¨¤n)http://www.aygfsteel.com/hunteva/archive/2007/10/18/153854.htmlKerwin WengKerwin WengThu, 18 Oct 2007 05:28:00 GMThttp://www.aygfsteel.com/hunteva/archive/2007/10/18/153854.htmlhttp://www.aygfsteel.com/hunteva/comments/153854.htmlhttp://www.aygfsteel.com/hunteva/archive/2007/10/18/153854.html#Feedback14http://www.aygfsteel.com/hunteva/comments/commentRss/153854.htmlhttp://www.aygfsteel.com/hunteva/services/trackbacks/153854.html
¾l“果今天¾lˆäºŽçœ‹åˆ°ä¸€½‹?em>Morris Johns的文ç«?用了不到5分钟ž®±æŠŠé—­åŒ…是什么讲的清清楚æ¥?比如文章中有一句话:
In JavaScript, if you use the function keyword inside another function, you are creating a closure.

妈的,˜q˜æœ‰æ¯”这更简单的解释å?ä¸ÞZ»€ä¹ˆé‚£äº›å›½å†…所谓的牛ähž®±æ˜¯å†™ä¸å‡ø™¿™¿Uåã^实的è¯?ž®±éžè¦æµªè´¹è‡ªå·±å’Œåˆ«äh的时间讲一堆貌似æÕQ云的定义,我觉得他们真的该思考下自己写技术文章的目的,æ˜¯äØ“(f¨´)了在传递知è¯?˜q˜æ˜¯åœ¨æ»¡­‘Œ™‡ªå·Þqš„虚荣,如果是后è€?廸™®®ç›´æŽ¥åœ¨Tag中注æ˜?自慰è´?,免得‹¹ªè´¹å¤§å®¶çš„æ—¶é—?

在后面的文章ä¸?作者列举了很多生动的例å­?每个例子后面的解释都非常òq›_®ž,没有ä»ÖM½•ä¸ÞZº†è¡¨çŽ°è‡ªå·±èƒ½åŠ›çš„åŽä¸½è¾žè—?通过他的例子,我很快理解的闭包的特ç‚?可以用来做什ä¹?前后不到30分钟,回想我几个月前光是找合适的解释ž®±æ‰¾äº†è¿‘一个小æ—?

当我寚w—­åŒ…的特点已经谙熟于心å?作者再开始讲一些抽象的定义,让äh感觉没有一炚wšœ¼„?ž®±å¦‚作者自å·Þqš„è¯?
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.

最后给出那½‹‡æ–‡ç« çš„地址,ç›æ€¿¡ä¸æ‡‚闭包的äh也能像我一样很快就理解,åŒæ—¶ä¹Ÿå¸Œæœ›å¤§å®¶çœ‹å®ŒåŽåˆ«å¿˜äº†åˆ«äºø™¸ítå®žå®žå†™æŠ€æœ¯æ–‡ç« çš„æ€åº¦
http://www.javascriptkit.com/javatutors/closures.shtml


]]>
用Javascript模拟Java的Sethttp://www.aygfsteel.com/hunteva/archive/2007/10/12/152282.htmlKerwin WengKerwin WengFri, 12 Oct 2007 03:46:00 GMThttp://www.aygfsteel.com/hunteva/archive/2007/10/12/152282.htmlhttp://www.aygfsteel.com/hunteva/comments/152282.htmlhttp://www.aygfsteel.com/hunteva/archive/2007/10/12/152282.html#Feedback2http://www.aygfsteel.com/hunteva/comments/commentRss/152282.htmlhttp://www.aygfsteel.com/hunteva/services/trackbacks/152282.html
目前惛_ˆ°å¯ä»¥å®žçŽ°çš„æ–¹æ³?

add(o);
addAll(array)
contain(o);
getåQˆint);
getAll();
sort(comparator); //ä¼ è¿›åŽÈš„是一个fn,˜q˜æ²¡æœ‰å†™ä¾‹å­....
size();
remove();
reverse();


基本数据¾l“构是两个数¾l?一个是index数组,数组下标˜qžç®‹,用来存放½W¬äºŒä¸ªæ•°¾l„的下标,另一个是存放对象的数¾l?不连¾l?下标是对象的id或者对象中其他ä»ÖM½•可以转换成唯一Integerçš„Field(Set也要求放˜q›åŽ»çš„å¯¹è±¡å¿…™å»è¦æœ‰hashCodeå˜?不然没法区别½W¬ä¸€ä¸ªå’Œ½W¬äºŒä¸?

实现的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();
}
目前˜q˜æœ‰ä¸€ä¸ªaddAllæ–ÒŽ(gu¨©)³•也是暂时没有惛_ˆ°æœ‰ä»€ä¹ˆä¸ç”¨éåŽ†çš„å¥½çš„å®žçŽ°

前同事提供了一¿Uå®Œå…¨å’ŒSet一æ ïL(f¨¥ng)š„实现,效率满高
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();
}

˜q˜æœ‰ä¸€ä¸ªæœ‹å‹çš„实现和我最初的差不å¤?但是removeæ–ÒŽ(gu¨©)³•相当有创æ„?用正则表辑ּæ¥åˆ é™?br /> 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)
}

有äh回复说需要添加做验证,我觉得不必了,如果æ·ÕdŠ çš„å€¼å’Œä¹‹å‰çš„ä¸€æ ·å°±ç›´æŽ¥æ›¿æ¢å¥½äº†,如果希望不被replace,直接在添加新对象之前用contain判断一‹Æ¡å°±å¯ä»¥äº?毕竟在我的实çŽîC¸­å·²ä¸æ˜¯å®Œå…¨åœ¨æ¨¡æ‹ŸSetäº?目前更們֐‘于设计一个更高效和强大的集合¾c?br />


]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º вýÏØ| ½ºÓÏØ| ξÊÏÏØ| Ïâ»ÆÆì| ¸£°²ÊÐ| ÖÛÇúÏØ| ²áºàÏØ| ÀëµºÇø| ºìÔ­ÏØ| ʯºÓ×ÓÊÐ| ʼÐËÏØ| ÍÐÀïÏØ| ¿¦À®Ç߯ì| ´ó¹ØÏØ| ÚöáÁÊÐ| ʯÆÁÏØ| Ë«ÅÆÏØ| ÍÅ·çÏØ| ĵµ¤½­ÊÐ| Ã÷¹âÊÐ| ²ÔÄÏÏØ| ·áÄþ| ÎâÖÒÊÐ| ÔÆÑôÏØ| ÒËÕÂÏØ| ±¦ÛæÇø| ÚöáÁÊÐ| Ðû»¯ÏØ| ¼òÑôÊÐ| ÕòÄþ| ºÍÆ½ÏØ| ÂÐÄÏÏØ| °²¼ªÏØ| ÌÆÉ½ÊÐ| ¼ÃÄþÊÐ| ½¨Ë®ÏØ| Å®ÐÔ| ¸·ÄþÏØ| Àû½òÏØ| ¶«Ïç×å×ÔÖÎÏØ| Ôö³ÇÊÐ|