emu in blogjava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  133 随笔 :: 93 文章 :: 833 评论 :: 2 Trackbacks

我的评论

共9页: 1 2 3 4 5 6 7 8 9 下一页 
re: IE的经典javascript异常 emu 2008-04-24 14:28  
对于“无法打开Internet站点”可以参考这篇文章
http://blogs.msdn.com/ie/archive/2008/04/23/what-happened-to-operation-aborted.aspx
呵呵,假如操作是串行的是行得通的,但是串行的操作本来也很容易处理命名冲突。如果操作是异步化的,并行发起的请求,并且请求的发起顺序和相应顺序是没有得到任何保证的,那么你说的“如果有命名冲突,则把之前的那个变量保存起来”能解决得了什么问题呢?
至于内存泄漏问题,一方面,内存泄漏要靠工具检查确认是否存在,而不是靠猜它可能存在就简单的去放弃一个做法的。二方面,就算发现了内存泄漏,应该想办法定位到内存泄漏的原因并解决它。最后,即使真的一时没有办法解决内存泄漏,带来的影响还是需要评估的?比如有的时候定时器调用函数会造成32byte的内存泄漏,能解决当然很好,不解决会有很大问题吗?IE一关掉内存就收回来了,用户又不会一直开着IE三个月不关。
呵呵网上能查得到答案的问题不要那么懒了。
嗯,我想差别还是蛮大的。
1 callback的名字如果暴露给最终编程者,首先如果有多个一模一样的callback(但是其中的数据不同),难免就要相互冲突。
2 你所说的前提如果是“用callback方式回传数据”的话,其实这个方式现在是最流行的方式了。
3 我的方案本来也不依赖iframe。只是不用iframe的话只能在IE上面用而已。
不知道你指的是不是addEventListener/attachEvent这样的?
onXXX句柄很多也可以直接赋值的,事件名全小写就好了。
呵呵我前面说过了,真正的多线程目前还不能实现(期待未来的浏览器吧)。至于同时弹出多个alert窗口并不难,也证明不了多线程。下面的代码在我的机器上可以同时弹出来若干个alert。试试不要点确定,直接把前面的拖开:)
var a=0;
for(var i=0;i<10;i++){
var x=new ActiveXObject("Microsoft.XMLHTTP");
x.onreadystatechange=function(xx){return function(){if(xx.readyState==4)alert(a++)}}(x)
x.open("get","http://127.0.0.1:44444",true);
x.send("")
}
本地44444端口上没有开任何服务的情况下测试的。
re: 为IE找个新死法 emu 2008-02-03 08:49  
嗯,IE6下的TT里面也不会“死”,而是提示内存不够,和一些IE7一样的提示。但结果还是算不出来。遨游是否也是一样的:
for(var i=0,s="0+";i<15;i++) s+=s;s+=0;
try{eval(s);}catch(e){alert(e.message)}
re: json的例子 emu 2008-01-26 10:54  
其他方式的异步指的是什么呢?用XHR异步获取script字符串后eval或者execscript吗?我前面有说过了,好处很多,天生的跨浏览器,客户端解析代价非常小,非单根结构,标记名只出现一次。也许还有其他的,暂时没想到。
或者你想研究其他异步化获取数据的方式?iframe方式我觉得没有什么竞争力了,还有些什么方式一时没想出来。
呵呵这个就太可笑了,首先,什么叫做计算机辐射?是计算机主机发射出的电磁辐射,还是CRT显示器发射出的beta射线、X射线,还是液晶显示器发出的可见光辐射,我们每个人的身体和我们身边的每样物体还会发射出红外辐射。动不动就拿一顶语焉不详的“辐射”大帽子盖到计算机或者手机头上,是一个人外行装内行的最好表现。
其次,隐形眼睛不管有没有辐射照射,在正常使用中由于接触了空气、眼睛分泌物和空气中的各种污染物等等,都必定会“渐渐地分解变质”。有数据表明所谓的“计算机辐射”会导致隐形眼睛比正常使用下“分解变质”快了多少吗?没有对比数据的话,这样诬赖原本就身份不明的“计算机辐射”同学是不厚道的。

其实计算机主机大多都由纯金属制成,上面如果没有开很大的口子的话,即使有电磁波辐射也不容易传到机箱外。用有机玻璃机箱的可能会有一些电磁波散射出来,不过也不必太担心,我们身边本来就充斥着电磁波。

CRT的“辐射”主要来自高压电子枪轰击荧屏产生的电离辐射和偏转线圈的电磁辐射,据说专业级的显示器会设计一个大金属网罩包裹住整个显像管及电路和电子器件,可以基本上屏蔽电磁辐射。CRT本身依靠电子轰击荧光物质而发光,这些自由飞行的电子当然也可以视作beta射线,不过大可放心它飞不到我们眼睛前面来,beta射线的非常容易被遮挡和散射,因此我们在CRT显示管里面要制造真空环境避免空气干扰它的飞行。电子打在荧光屏上的时候会激发电离辐射,这些辐射大部分会被荧光屏的玻璃给吸收掉,最终泄漏出来的辐射非常小,达到天然辐射水平,也就是说,我们每天不坐在CRT前面,从自然环境中平均受到的辐射量也有这么多,既然每天24小时的本底辐射对我们没什么影响,这样的在工作时间附加的辐射剂量对我们一样也不大可能有影响,看来对隐形眼睛也不会有什么额外的影响。更重要的是,现在大家早就在换液晶显示器了。

由于工作电压和工作频率的限制,液晶显示器几乎没有什么所谓的“辐射”,有些自作聪明的人说“由于过多的附加功能,增加了显示器的耗电量和运作功率,在某种程度上加大了电磁波的发射量以及对资源的消耗”简直是无知,照这样的说法老式电炉最有辐射了呵呵(还真的有,红外辐射)。

楼上既然可以对自己这么一无所知的东西如此外行充内行,让人怎么放心得过你卖的隐形眼镜呢?
re: 纯html的折线新画法 emu 2008-01-11 09:24  
http://labs.cloudream.name/google/chart/api.html
雷劈,不是雷辟。某些人真会给小学老师丢脸,唉...
re: IE的经典javascript异常 emu 2007-12-18 16:37  
今天又发现IE的bug,在图片的缓存策略是Cache-Control: no-cache的情况下,访问img对象的fileModifiedDate、fileCreatedDate或者mimeType,居然会抛异常。
除非打开独立的新窗口来进行计算。
内嵌的框架似乎是在同一个线程上跑的,独立的新窗口根据系统设置可以在独立的线程或者进程上跑(优化大师有这个设置项),如果有多核的话似乎还可以在不同的核上跑。
用三目运算符,有点打擦边球的味道
var a=prompt("请输入一个数",123),b=prompt("请输入一个数",123),c=a-b;
alert(a + (c?(c>>31?"小于":"大于"):"等于") + b)
面向不同的应用,我们对于“定位”的目标也许是不同的。我这里说的是,原来我们不知道脚本在进行什么操作的时候会报这个错,现在定位到了是在这样的上下文环境下这样调用造成的。至于定位到酷狗的问题,可以说是一个具体的定位,但是真正的问题是什么呢,酷狗做了什么造成得,要怎么回避呢,还要等酷狗的开发者继续定位。

pj最新发现,安装微软的去点击激活补丁,可以修复被酷狗破坏的文件,解决这个问题: http://support.microsoft.com/kb/945007
re: 在eclipse下面跑jsunit emu 2007-12-05 09:06  
报错嘛,肯定要看报什么错才知道出了什么问题啊。
re: 有点意思 emu 2007-11-15 14:35  
现在有三米深了。

这个问题的标准答案很好玩,时间复杂度连o(n)都不到,很罕见哦。
stackhuang同学给出的权威解释是:

当Navigate一个网页的时候,Navigate在设置了URL以后就返回了,但Navigate设置了一个Timer,当Timer到达的时候就去显示一个页面。或者是,当页面在下载的时候,当下载完成,也会产生一个新的浏览,还有脚本也可以导致一个新的浏览。
浏览一个网页是需要一个容器的,也就是Browser。默认情况下,IE会去找这个Browser,如果找到,则在这个Browser中打开。如果找不到,就会新创建一个IE,在新的IE中打开,那么,问题就在这里,如果这个浏览操作是由一个Timer引起,新打开IE的方式是不会去停止这个Timer的,于是Timer继续运行,导致不断的打开IE窗口。
那么这个容器(Browser)怎么会不在呢?是因为对IE的使用不当造成的,如果IE没有完全释放,但同时又关闭了IE的窗口,那么就会造成IE不停的弹出。
那么这个问题为什么是随机的呢?因为受网络环境,机器CPU繁忙程度的影响,新打开一个页面的时机是不确定的

------------------------------------------------
stackhuang同学的补充解释:

大概就是,IE在浏览的时候会判断一个标志,如果true,则在当前窗口中打开,为false则在新窗口中打开,当IE窗口已经关闭的时候,如果IE释放不完全,那么可能Document对象还存在,但这个标志就为false了,于是新打开了一个IE,同时,这个操作不会返回一个成功的标志,导致开始的Timer以为没有浏览成功于是继续运行。
呵呵楼上这位兄弟是专业的
re: 走向而立之年 emu 2007-11-13 09:26  
你跑去跟大梅做同事了?
re: emu的gb2312编码 emu 2007-10-24 14:17  
偶现在读操作主要用json来解决了。写操作不主张用get方式,看来只能用form post了。
re: IE 缓存策略的BUG emu 2007-10-10 13:57  
上面的做法不算是延后吧:
<HTML>
<BODY onload="alert('onload')">
</BODY>
<SCRIPT LANGUAGE="JavaScript">
alert("test")
</SCRIPT>
</HTML>
re: json的例子 emu 2007-10-10 13:52  
在test函数里面加就可以了嘛:
for(var ar=document.getElementsByTagName("SPAN"),i=0;i<ar.length;i++)ar[i].innerHTML="loading..."
还是你想要出来沙漏图标?还是别的什么“loading效果”?
re: json的例子 emu 2007-09-20 21:38  
有必要。这里是我疏忽了。这样如何:
function test(){
    var s = document.createElement("SCRIPT");
     s.id="cgi_emotion_list";
    document.getElementsByTagName("HEAD")[0].appendChild(s);
    s.src="http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456";
     test=function(){};
}
function visitCountCallBack(data){
     document.getElementsByTagName("HEAD")[0].removeChild(document.getElementById("cgi_emotion_list"));
    for(var i in data){
        var e =document.getElementById(i);
        if(e) e.innerHTML=data[i];
    }
}
IE坏了,怎么修好IE是M$的问题,我这里讲的是问题是怎么发生的,开发人员应该怎么去修改自己的程序来回避这个问题,来让用户在用我们开发出来的程序的时候不致产生困扰,而不是在将怎么把IE修好。
我的机器没有办法重现这个问题,所以我也不知道怎么去修复。很遗憾,看来帮不了你了。
re: json的例子 emu 2007-08-31 15:55  
@huangyi
你的意思是用js返回xml字符串再parse吗?当然是可以的,我们实际应用中也有采用这样的方式。

补充一下,我同意大多数情况下xml和json主要是数据包装形式上的不同,但是我认为json和xml并不只是形式上不同,就讲最基本的数据结构吧,xml必需是单根结构的,json没有这个限制。也就是说,下面这个基本的json数据,不包一层皮是无法转换成为对应的xml表现的:

{a:1,b:2,c:3}

当然你可以说包上一层皮以后也没什么不同

<data><a>1</a><b>2</b><c>3</c></data>

不过要注意到,这个xml转换为对应的json的时候应该变成这样:

{data:{a:1,b:2,c:3}}

再举一个例子:

{toString:function(){return "abc"}}

可以转成<toString>function(){return &quot;abc&quot;}</toString>吗?试试把这个xml转回对应的json?

当然,稍微做一点点妥协和变化,我们确实是可以掩盖这些不同,让他们大多数时候可以表达几乎等同的信息:

<toString type="function">function(){return &quot;abc&quot;}</toString>
似乎很多人看别人文章的目的不是要学习和交流,而是想找到银弹。难怪他们要失望了,我对他们也感到失望。
下面的方法可以生成一个只读的navigator对象。然后再通过dialogArguments传到modaldialog里面进行读操作应该可以回避这个问题:
function readOnlyNavigator(){
var result={};
for(var i in navigator){
if(typeof navigator[i]!="object"){
result[i]=navigator[i];
}else if(typeof navigator[i].length=="number"){
result[i]=[];
for(var j=0;j<navigator[i].length;j++)
result[i][j]=navigator[i][j].toString();
}else{
result[i]={};
}
}
//result.javaEnabled=new Function("return "+navigator.javaEnabled())
//result.taintEnabled=new Function("return "+navigator.taintEnabled())
//result.userProfile.addReadRequest=new Function("return false")
//result.userProfile.clearRequest=new Function()
//result.userProfile.doReadRequest=new Function()
//result.userProfile.getAttribute=new Function("return null")
//result.userProfile.setAttribute=new Function()
return result;
}
下半部分做了很多navigator的functions的空实现,其实并不经常用到,不需要的话可以不放那些functions进去。真的需要用的话还是需要在主页面上做一些代理方法。
这样跑到别人博客上面问问题,问不会了还要骂博主的,还真少见。楼上不敢留名,想来也是知道自己这样做是不对的。

我前面已经解释了:“一定要在modaldialog里面调,也可以通过dialogArguments对象把调用传递到外面的主页面上执行来回避这个问题”,其实并不是说这个问题解决起来有什么难的,对于有一点web开发功底的人来说,这是相当容易实现的。楼上不知道怎么实现,可以查资料,可以找人问,在这里问我也可以,何必这么失风度呢?
简单嘛,直接不要调navigator对象就可以了。一定要在modaldialog里面调,也可以通过dialogArguments对象把调用传递到外面的主页面上执行来回避这个问题。try/catch就不要试了。
呵呵玩玩而已嘛,如果苛求每个创新都一定要有使用价值,那我们的创新精神就会收到压制。
偶从来没有说过模拟多线程问题或者大计算量造成浏览器失去响应问题用command模式就可以很漂亮地轻松解决了,只是演示了如何这样做的一个方法而已。楼上各位看来对偶的期望太高了。

javascript作为一个单进程的解释语言,“活生生地把业务拆解了”恐怕是避免长时间持续运算导致浏览器失去响应的惟一出路了。command模式提供给了我们一个可能的分解计算的方式。同时把计算分解后也让多个模拟线程并行计算和按需要调度提供了可能。

楼上的最后一段偶是不同意的,用“for循环模拟多线程”是说不通的。executeCommands中的for循环是一个合理的进程调度的可能实现方式。

偶还想更正一下楼上对于设计模式的误解。“说设计模式吧,人家那是为了简化,清晰化业务模型的代码实现啊”这是楼上自己对设计模式的理解而已。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,它并不背负有“简化,清晰化业务模型”的使命,虽然有的时候它看起来确实有这样的效果。举个最常见的例子,用对象池方式来处理数据库连接(连接池),肯定要比每次访问数据库都创建连接,用完关闭连接,来得不“简化”,不“清晰”,而且带来了很多原来不曾存在的极其麻烦的问题,但是它能有效提高效率,节省资源,因此除了初学者,我们几乎从来不会尝试每次访问数据库都去创建连接。

用复杂化了业务逻辑来指责偶使用command模式的方式,就好像去指责连接池是复杂化了数据库访问的业务逻辑一样,是置我们解决了的问题于不顾,而只着眼于我们付出的代价。其实我们提供一个问题的解决方案的时候,一般并不意味着发明了银弹。

说偶偷换概念,吸引眼球,偶就实在是很无语了,分享一点技术心得用得着扣这么大的帽子给偶嘛?在楼上诸位提出更漂亮的实现之前,这是偶目前的技术能力做能做到的最漂亮的实现了,难道是特地发出来害人的?难道写blog有人给稿费的?
补充一个object克隆的简单方法,不支持function:
function objClone(o){
if(typeof o == "object"){
var r=(o.sort)?[]:{}
for(var i in o)
r[i]=objClone(o[i]);
return r;
}
return o;
}
re: 经典javascript异常 emu 2007-08-13 13:18  
数组对象自带有一点clone功能,因此对于第二个经典异常,有个简单的应对方案,不过只适用于简单类型数组对象。
<iframe src="javascript:'<script>var o=[1,2,3,&quot;abc&quot;];top.ff2=new top.Array().concat(o);<\/script>'" width=0 height=0 name="f2"></iframe>
<button onclick="f2.location='about:blank';setTimeout('alert(ff2.toString())',0)">这个方法只适用于简单类型数组对象</button>
re: hello ruby emu 2007-08-13 04:02  
module有点好玩,不过如果不在class里面玩的话,好像就找不到引用它的语法块的变量空间,指定为全局变量试试看:
module Emu
def emu
j=1
while j<=$i
print String($i)+"*"+String(j)+"="+String($i*j)+"\t"
j+=1
end
end
end

include Emu
$i=1
while $i<10
emu
$i+=1
print "\n"
end
不是FF读xml要加这一句,而是服务器输出xml的时候没有正确输出'text/xml'的情况下要加这一句。这和上面的权限问题没有什么关系。
re: 求助, 笔记本坏啦. emu 2007-07-31 13:26  
从2看起来(开机不自检),应该是纯粹的硬件故障。
我以前的笔记本电源模块彻底烧坏前几天的表现也像是这样的。
近期天气热,笔记本工作的时候有没有感觉特别烫?是否放凉了以后才可以启动?
写了个页面测试三种不同的创建document的方式的时间耗费:

<HTML>
<HEAD>
</HEAD>
<BODY>
document fragment:<span id="t1"></span><br>
htmlfile:<span id="t2"></span><br>
iframe:<span id="t3"></span><br>
<button onclick="test()">test</button>
<SCRIPT LANGUAGE="JavaScript">
var n = 100;
function test(){
var t=new Date();
for(var i=0;i<n;i++)
document.createDocumentFragment()
document.getElementById("t1").innerHTML=(new Date()-t);
if(window.ActiveXObject){
var t=new Date();
for(var i=0;i<n;i++)
new ActiveXObject("htmlfile")
document.getElementById("t2").innerHTML=(new Date()-t);
}
var t=new Date();
for(var i=0;i<n;i++){
var tt = document.createElement("IFRAME");
tt.style.display="none";
document.body.appendChild(tt);
}
document.getElementById("t3").innerHTML=(new Date()-t);
}
</SCRIPT>
</BODY>
</HTML>

在ie上基本上是个1:10:100的比例。在firefox上iframe的速度和IE差不多,documentfragment的速度快一些,但是不能创建变量空间,没有什么意义。safari创建documentfragment更快,可是创建iframe更慢了。最惨的是opera,居然每次插入不可见的iframe都会导致页面重新渲染,最终浏览器都挂掉了。
一般我都是设置一个临时cookie来监视ie关闭。在下次打开的时候如果监测不到cookie就清空数据,再重设上cookie。
技术探讨,不必这么执着于烂不烂啦,大哥
re: Ajax之异步的优势 emu 2007-06-04 13:45  
楼主“为哪些真正为祖国的物理事业做出过伟大贡献的先辈们鸣一下不平”的功力果然厉害,佩服佩服。
偶并没有否定最后的结果,只是指出测试方式的不严谨而已。ok,偶是木头脑瓜,楼主不喜欢听不同意见,偶大可以不说。
楼主没有包袱,怎么会这么累呢?
re: Ajax之异步的优势 emu 2007-06-03 23:05  
相比之下,有一个物理学家研究物理研究到30岁就放弃了,改去研究神学了,跟我们祖国的物理先驱们相比就更微不足道了对吧?
科学的地位,首先是看其成就,而不是看其牺牲了什么。相比我过的物理学先驱们,杨和李的成就不逊色于任何人,和平凡之有?
杨某的私生活既然与外人无关,就不应因此而受鄙视。
至于“处招摇放屁”,说话要就事论事,不要乱带高帽子。
new Date并不是没有偏向任何一方,而是根本不知道偏向了哪一方。
开销的“均摊”导致了糊涂账。好比我和李嘉诚各花掉1万块,我们的财富比例绝对会发生质的变化,而不会“均摊”
在“多次测试”过程中间,每次都重新引入一次的误差,是无法通过增加测试次数来平衡的。
楼主自己付出那么多去做开源是为了什么?
是一朝成名(天下熙熙,皆为名来)?
是被收购(天下攘攘,皆为利往)?
还是只是练练手,提高一下自己的水平?
还是只是漫无目的的跟风:什么都不为,我只要开源一把?
还是真的无私的只是想要为世界软件事业的发展添砖加瓦(软件事业真的缺的就是这块砖瓦吗)?
还是真的就是想要推动开源事业的历史巨轮(自己去做一个开源项目来推动是最有效的推动方式吗)?
还是想在世界开源舞台上为中国人争口气……

看到楼上说“为开源奋斗终身”,不知道所为何来呢?
测试不够严谨:
在循环中重复了1500次new Date()操作,这个构造对象的代价算谁的?
每次new Date()后去相减后累加,这里每次得到的时间差有0~1/18.6秒的误差。这个误差在最后累加起来,结果是笔糊涂帐。
最后,如楼主在另一篇文章里面提到的,循环反转也会影响结果(受教了:P)

这样的一个对比应该是稍稍合理一点点的:

var n,m;
var inc = 0
var t1 = new Date();
while(inc++<500){
for(var n in map){
m = map[n];
}
}

var t2 = new Date();
inc=0;
while(inc++<500){
for(var j=arr1.length-1;j>=0;j--){
n =arr1[j];
m =arr2[j];
}
}
var t3 = new Date();
var mapTime=(t2-t1);
var arrTime=(t3-t2);


prompt("mapTime/arrTime",mapTime +'/'+arrTime)

但是事实上,两个循环仍在相互干扰,试试简单的把一个循环的数据构造和遍历都完整的去掉,另一个立刻就会体现出来不同:

function C(i){
return i<62?
String.fromCharCode(i+=
i<26?65
:i<52?71//97-26
:-4//48-26-26
)
:i<63?'_'
:i<64?'$'
:C(i>>6)+C(i&63)
}
var map = {};
//var arr1 = [];
//var arr2 = [];
var n,m;
for(var i = 0;i<1000;i++){
var c = C(i);
map[c] = i;
// arr1.push(c);
// arr2.push(i);
}
var inc = 0
var t1 = new Date();
while(inc++<500){
for(var n in map){
m = map[n];
}
}
var t2 = new Date();
/*
inc=0;
while(inc++<500){
for(var j=arr1.length-1;j>=0;j--){
n =arr1[j];
m =arr2[j];
}
}
*/
var t3 = new Date();
var mapTime=(t2-t1);
var arrTime=(t3-t2);


prompt("mapTime/arrTime",mapTime +'/'+arrTime)

re: Ajax之异步的优势 emu 2007-06-03 15:22  
真不知道80多岁的杨某人有何值得讨厌之处。就因为满足不了楼主狭隘的世俗礼教观念吗?宁要一个从一而终默默无闻的杨某人,也不要一个老年“变节”的伟大的物理大师,这就是楼主的价值观?

楼主这篇文章也没有解决任何问题,介绍任何新的技术,和两年来的千千万万人一样,啰嗦几句“AJAX是旧药装新瓶”、“雕虫小技而已”而已。不知有何新意?为了给JSI的闪亮登场做个铺垫,把ajax先拖出来踩上两脚,顺便稍上自己一贯看不顺眼的杨某人?
区别就在于,验证页面的地址是VeriSign网站的,而不是我做的静态图。
一般来说,来自官网的页面声明的内容是可以信赖的。
共9页: 1 2 3 4 5 6 7 8 9 下一页