re: 差点被燕潘考倒了 emu 2012-08-02 10:41
re: IE这个bug真是弱爆了 emu 2011-08-30 00:47
@A1
你是看到有人这样拆script标签就以为所有的标签都要这么拆?程序员不要靠巧合编程。
把stream用fso写到文件系统呗。@Meteoric
其实不一定要用hta的,IE下htm都支持activeX,只是可能要用户确认权限。我这里是碰巧再维护个hta而已。
@ryan
http://developer.yahoo.com/performance/rules.html
ETags were added to provide a mechanism for validating entities that is more flexible than the last-modified date.
有不同的应用场景的。
re: 关于方舟子的争论 emu 2010-09-26 21:28
@1234
要是这样的话,先从我打起吧。
re: 弱视用户看到我们的页面是像这样的 emu 2010-09-26 21:27
@雨忆
那到底是啥样的?
@xs
其实也不只是并发的情况下有这个问题,当打开一些大网站的时候第一个请求如果是cache或者304response,也会有类似的问题。
有米的大网站在解决这个问题的时候比较爽快,首页反正也常更新,不要cache了,全部走http,这样还快一些。比如sina前阵子刚刚做了这样的修改。
@yukon
一些新浏览器的javascript引擎对这个问题有一些优化,但是现在浏览器的主流还是IE6,字符串拼接效率低是无疑的。
@Allen.M
抱歉,昨天可能误操作了,已经补齐。
@匿名
@jee
批评的对呵呵,有5年没写java了(c++更不要说了)。
当时脑子里面闪过了一下,override中文怎么说的来着,没细想就写成重载了。
其实这个地方并不是面向对象编程中所谓的重载或者覆盖了,不涉及到类的继承,纯粹就是一个函数覆盖一个函数。确实应该用“覆盖”的。
@xpf7622
不是“+=”效率有问题,是对字符串连续的“+=”有性能问题。在IE8以前的IE浏览器中,字符串拼接有和java中一样的问题。因此不建议在循环中对字符串使用“+=”
@Robin
呵呵,是省不少问题,但是多出来的不少问题和成本要等你做大系统的时候才会看到了
re: 白突发了回奇想 emu 2009-09-24 12:26
没有发现在post的时候加随机参数的任何必要性……
re: IE8里,“about:”又回来了 emu 2009-06-03 23:16
呵呵见到老朋友了,怀旧一下而已嘛,也没有说推荐用这个东东。
re: 脚本绑定回调:不可能完成的任务 emu 2009-05-22 11:39
IE8beta版本不支持documentFragment拥有独立的运行空间,正式版又解决了这个问题,因此写了个小判断:
var df = document.createDocumentFragment();
df.callback=function(){alert("documentFragment有独立的脚本运行空间")};
window.callback=function(){alert("不支持documentFragment独立脚本运行空间")}
var s = document.createElement("script");
df.appendChild(s)
s.src="javascript:'callback()'";
这个乱码是比较讨厌。也可以用unicode来解决呵呵:
<body>
<a href="/hello">运行 Hello Servlet</a>
<p/>
<img src="images/1.jpg">
</body>
re: 谈谈所谓云计算,也就那么回事 emu 2009-05-08 10:09
google的用户接口可以用,当然也可以做自己的,不能说google提供了一点便利就是限制大伙吧。
你说的上传图片的问题,我不大明白。
re: 我现在在哪? emu 2009-05-08 10:03
@叶子
就是纵横啊。
re: 谈谈所谓云计算,也就那么回事 emu 2009-05-07 10:59
我是玩玩性质的。不过我想再重复一下GAE自己强调的第二点优点:
--------------------------
它易于扩展。
Google App Engine 使构建可扩展的应用程序(从一个用户增加至数百万个用户)变得轻松,且无需为基础架构烦恼。
---------------------------
也就是说,如果你只是玩玩,随便写(每个account只能传10个),如果万一不小心你发现自己写的东西活了,你可以不用心急火燎的去买服务器租机房,改架构,只要把你赚到的钱给google打一点,问题就迎刃而解了。这样省了很多后顾之忧,我们要发挥创意的时候就更加自由了。
re: DiskDefrag(赛前模拟题) emu 2008-06-04 10:16
wqb的解答
#include<stdio.h>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<memory>
#include<math.h>
#include<time.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define minx(i,j) ((i)<(j)?(i):(j))
#define maxx(i,j) ((i)>(j)?(i):(j))
#define abxx(i) ((i)>0?(i):(-(i)))
#define eps 1e-9
#define mod (1<<20)
int dp[128][1<<12];
int ro[128][1<<12];
int pr[128][1<<12];
int ll[128][1<<12];
int ax[128][1<<12];
inline bool digit(char i)
{
return i>='0'&&i<='9';
}
class DiskDefrag
{
public:
void dfsoutlujing(int s,int i)
{
if(!i)return ;
while(pr[s][i]!=s)s=pr[s][i];
dfsoutlujing(ll[s][i],i^(1<<(ro[s][i])));
printf("在 %d %d 区间 放 %d 的块 需要移动的步数 %d\n",s-ll[s][i],s,ro[s][i],ax[s][i]);
}
int minMoves(vector<string> disk, int size)
{
int s=disk.size();
int len[16];
int sector[16][128];
int i;
int j;
int k;
int t;
int x;
for(i=0;i<s;i++)
{
k=-1;len[i]=0;
for(j=0;disk[i][j];j++)
{
if(digit((char)(disk[i][j])))
{
if(k==-1)k=disk[i][j]-'0';
else k=k*10+disk[i][j]-'0';
}
else if(k!=-1)
{
sector[i][len[i]++]=k;
k=-1;
}
}
if(k!=-1)
sector[i][len[i]++]=k;
}
int sum=0;
for(i=0;i<s;i++)
sum+=len[i];
if(sum>size)return -1; // 不能移动
//////////////////////////////
memset(dp,1,sizeof(dp));
for(i=0;i<128;i++)
dp[i][0]=0;
for(j=0;j<size;j++)
for(i=1;i<(1<<s);i++)
{
t=-1;
for(k=0;k<s;k++)
if(i&(1<<k))
t+=len[k];
if(t>j)
continue;
if(j)
{
dp[j][i]=dp[j-1][i];
pr[j][i]=j-1;
}
for(k=0;k<s;k++)
if(i&(1<<k))
{
t=0; // cost
for(x=0;x<len[k];x++)
if(sector[k][x]!=x+j-len[k]+1)
t++;
if(dp[j-len[k]][i^(1<<k)]+t<dp[j][i]) // 最优子结构
{
dp[j][i]=dp[j-len[k]][i^(1<<k)]+t;
ro[j][i]=k;
pr[j][i]=j;
ax[j][i]=t;
ll[j][i]=j-len[k];
}
}
}
dfsoutlujing(size-1,(1<<s)-1); // 打印路径
if(sum==size&&dp[size-1][(1<<s)-1])
return -1;
else
return dp[size-1][(1<<s)-1];
}
};
int main()
{
int i;
DiskDefrag wqb;
while(scanf("%d",&i)==1)
{
double wqbdf=clock();
int ncase;
vector<string> df;
scanf("%d",&ncase);
for(i=0;i<ncase;i++)
{
int s;
string smy;
bool flag=false;
char str[16];
scanf("%d",&s);
for(int j=0;j<s;j++)
{
if(flag)smy+=' ';
else flag=true;
scanf("%s",str);
for(int k=0;str[k];k++)
smy+=str[k];
}
df.push_back (smy);
}
scanf("%d",&i);
printf("%d\n",wqb.minMoves (df,i));
printf("%lf\n",clock()-wqbdf);
}
return 0;
}
/*
1
2
7
3 4 5 6 8 9 10
3
17 16 15
20
1
1
8
1 2 3 5 4 6 7 8
10
1
3
4
1 3 5 7
4
0 2 4 8
2
6 9
100
1
12
4
8 0 7 51
5
47 22 26 30 46
5
41 4 9 10 20
5
33 5 28 39 42
4
31 12 56 57
7
13 6 17 24 27 36 54
4
58 32 34 45
2
19 2
6
3 11 15 25 38 48
7
23 1 18 21 29 44 55
8
40 16 35 43 49 52 53 59
3
37 14 50
89
1
1
2
0 1
2
*/
re: DiskDefrag(赛前模拟题) emu 2008-06-04 10:15
hgw的解答:
#include<stdio.h>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int z[100+8][1<<12];
class DiskDefrag
{
public:
static int minMoves(vector<string> disk, int size)
{
int n,i,j,k,now,lx[12][64],my[12],get[12][100+8];
n=disk.size();
for(i=0;i<n;i++) //读入数据
{
my[i]=0; //my[i]表示第i个文件的长度
now=-1;
for(j=0;j<disk[i].size();j++)
if(disk[i][j]>='0'&&disk[i][j]<='9')
{
if(now==-1)
now=disk[i][j]-'0';
else
now=now*10+disk[i][j]-'0';
}
else if(now!=-1)
{
lx[i][my[i]++]=now;
now=-1;
}
if(now!=-1)
lx[i][my[i]++]=now;
}
memset(get,0X10,sizeof(get));
//get[i][j]表示第i个文件的最后一个扇区存放在j的移动步数
for(i=0;i<n;i++)
for(j=0;j<size;j++)
if(j+1>=my[i])
{
get[i][j]=0;
for(k=0;k<my[i];k++)
if(lx[i][my[i]-k-1]!=j-k)
get[i][j]++;
}
memset(z,0X10,sizeof(z));
/*
z[i][j]表示到第i个扇区,n个文件的二进制状态为j(1表示该文件已搞定,0表示未)的最小步数
z[i][j]=min{[i-1][j],[i-my[k]][j^(1<<k)]+get[k][i](k=0,1,2,……,n-1且(i&(1<<k))>0)}
*/
for(i=0;i<size;i++)
for(j=0;j<(1<<n);j++)
{
if(i&&z[i-1][j]<z[i][j])
z[i][j]=z[i-1][j];
for(k=0;k<n;k++)
if(j&(1<<k))
{
if(i+1>=my[k])
{
if(i-my[k]<0) //[-1][0]=0的实现
{
if(!(j^(1<<k)))
if(get[k][i]<z[i][j])
z[i][j]=get[k][i];
}
else
{
if(z[i-my[k]][j^(1<<k)]+get[k][i]<z[i][j])
z[i][j]=z[i-my[k]][j^(1<<k)]+get[k][i];
}
}
}
}
return z[size-1][(1<<n)-1];
}
};
int main() //测试数据,你blog上的那一组,期望结果:50
{
vector<string> a;
int b;
a.push_back("8 0 7 51");
a.push_back("47 22 26 30 46");
a.push_back("41 4 9 10 20");
a.push_back("33 5 28 39 42");
a.push_back("31 12 56 57");
a.push_back("13 6 17 24 27 36 54");
a.push_back("58 32 34 45");
a.push_back("19 2");
a.push_back("3 11 15 25 38 48");
a.push_back("23 1 18 21 29 44 55");
a.push_back("40 16 35 43 49 52 53 59");
a.push_back("37 14 50");
b=60;
printf("%d\n",DiskDefrag::minMoves(a,b));
return 0;
}
re: IE的经典javascript异常 emu 2008-04-24 14:28
re: 脚本绑定回调:不可能完成的任务 emu 2008-03-13 14:38
呵呵,假如操作是串行的是行得通的,但是串行的操作本来也很容易处理命名冲突。如果操作是异步化的,并行发起的请求,并且请求的发起顺序和相应顺序是没有得到任何保证的,那么你说的“如果有命名冲突,则把之前的那个变量保存起来”能解决得了什么问题呢?
至于内存泄漏问题,一方面,内存泄漏要靠工具检查确认是否存在,而不是靠猜它可能存在就简单的去放弃一个做法的。二方面,就算发现了内存泄漏,应该想办法定位到内存泄漏的原因并解决它。最后,即使真的一时没有办法解决内存泄漏,带来的影响还是需要评估的?比如有的时候定时器调用函数会造成32byte的内存泄漏,能解决当然很好,不解决会有很大问题吗?IE一关掉内存就收回来了,用户又不会一直开着IE三个月不关。
re: 脚本绑定回调:不可能完成的任务 emu 2008-03-12 01:39
嗯,我想差别还是蛮大的。
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方式我觉得没有什么竞争力了,还有些什么方式一时没想出来。
re: 辟谣:戴隐形眼镜不能烧烤 emu 2008-01-11 21:08
呵呵这个就太可笑了,首先,什么叫做计算机辐射?是计算机主机发射出的电磁辐射,还是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: Groovy 学习笔记3 运行效率 emu 2007-11-13 16:07
呵呵楼上这位兄弟是专业的
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 "abc"}</toString>吗?试试把这个xml转回对应的json?
当然,稍微做一点点妥协和变化,我们确实是可以掩盖这些不同,让他们大多数时候可以表达几乎等同的信息:
<toString type="function">function(){return "abc"}</toString>