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>