2010年3月11日
#
最近看一些代碼時,邊看邊改代碼,發現getJSON這個方法沒法正常使用。
1 var sURL= "http://api.xxxxxx.com/services/feeds/
2 xxxxxxx?format=json&callback=?";
3 $.getJSON(sURL, function(data) {
4 // do something with the JSON data returned
5 }); // end get
究其原因,發現url里有個callback,這里使用的是JSONP,一種跨域技術。
網上搜了下JSONP,多數都是在講如何使用,而沒有說明為什么它能跨域,且沒有說明url服務器端的代碼時如何生成的。
這方面,上面的文章里有比較詳細的描述。
1 function jsonp(url,callback,name, query)
2 {
3 if (url.indexOf("?") > -1)
4 url += "&jsonp="
5 else
6 url += "?jsonp="
7 url += name + "&";
8 if (query)
9 url += encodeURIComponent(query) + "&";
10 url += new Date().getTime().toString(); // prevent caching
11
12 var script = document.createElement("script");
13 script.setAttribute("src",url);
14 script.setAttribute("type","text/javascript");
15 document.body.appendChild(script);
16 }
客戶端的javascript代碼會有如上的操作,代碼不難,很容易理解,也就是加了一個script標簽。
而服務器端會返回
callbackFunction( { "x": 10, "y": 15} );
這樣的數據。
這其實是一段javascript代碼,
callbackFunction是方法名,{ "x": 10, "y": 15}是參數??蛻舳舜a里必須要有callbackFunction方法的定義。
1 public partial class JSONP : System.Web.UI.Page
2 {
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 if (!string.IsNullOrEmpty(Request.QueryString["jsonp"]) )
6 this.JsonPCallback();
7 }
8
9 public void JsonPCallback()
10 {
11 string Callback = Request.QueryString["jsonp"];
12 if (!string.IsNullOrEmpty(Callback))
13 {
14 // *** Do whatever you need
15 Response.Write(Callback + "( {\"x\":10 , \"y\":100} );");
16 }
17
18 Response.End();
19 }
20 }
之后客戶端會調用
callbackFunction。
使用JQuery的getJSON方法后,callback部分會變成如下形式。
callback=jQuery1710461701650187642_1326201333794&_=1326201356534
callbackFunction自然就是jQuery1710461701650187642_1326201333794部分了。
返回來的數據也會是
jQuery1710461701650187642_1326201333794( { "x": 10, "y": 15} ) 這種形式。
最后JQuery會調用匿名函數function(data),data即為json數據。
JQuery已經將客戶端部分實現了,服務器端也得遵循同樣的規則才能實現跨域。
*這里有一點,JQuery如何將匿名函數換名字的?有哪位大俠知道的,請用簡單的語言講解下。
記錄一個小問題。
在Win7系統上裝一個軟件時失敗,提示2個DLL沒有注冊成功。
于是準備手動注冊。
運行
cd C:\WINDOWS\system32\
regsvr32 xxx.dll
后出現如下錯誤:
The module "xxx.dll" was loaded but the call to DllRegisterServer failed with error code 0x80004005.
網上搜索一番后,找到如下地址
http://forums.cnet.com/7723-12546_102-237219.html
其中有條說run as administrator,這是權限問題,不過我登陸的就是管理員賬號,應該不存在這樣的問題。
抱著姑且一試的想法,寫了個cmd文件,右鍵run as administrator后,居然真的注冊成功了!
看來Win7系統真的很安全,就算是管理員,也得來個run as administrator后才能做一些事,是在向sudo學習么?
最近試著用html5在頁面加載mp3文件。在chrome下測試通過了,偶然的用firefox4打開,居然沒法用……
懷疑哪里寫錯了,可audio標簽也就幾個屬性而已。
幾經搜索,最后發現的真相讓我很崩潰……firefox的audio不支持播放mp3。
Codec support in modern desktop browsers Browser | Ogg Vorbis | MP3 | WAV |
FireFox 3.6+ | ? |
| ? |
Safari 5+ |
| ? | ? |
Chrome 6 | ? | ? |
|
Opera 10.5+ | ? |
| ? |
Internet Explorer 9 (beta) |
| ? | ? |
出自 http://html5doctor.com/native-audio-in-the-browser/
看了這個表之后,雖然很多瀏覽器都支持html5,但如果你想播放一個文件,任何一種格式都不能讓所有瀏覽器正常播放。
哈哈哈,html5定義了媒體標簽,但沒規定媒體的默認編碼格式,導致各瀏覽器各自為政。
真是不方便……
GD畫圖時通常顯示文字是用imagettftext方法,但它的參數必須是UTF-8編碼的。
此時得注意php文件的編碼
1.如果是UTF-8的,直接傳硬編碼字符串就可正常顯示
2.如果是gb2312或其它的,則必須進行轉換 mb_convert_encoding($str, 'UTF-8')
另外,還有一種情況,JIS-mapped Japanese Font Support被開啟時,imagettftext就必須傳SJIS編碼,傳UTF-8反而會亂碼。
此時必須將其轉碼后傳入,mb_convert_encoding($sStr,"SJIS", "UTF-8")。
以上。
在次提供TurboC3.0英文版下載。
TCPP.rar
上網須謹慎,下載請殺毒。
TC3.0窗口模式,邊框有中文亂碼。全屏就沒有。
原因是當前的code page是中文的936,可以在cmd中用chcp命令查看。
利用命令 chcp 437 改為老美的,就可以了。
具體操作
啟動TCPP.exe->File->DOS Shell->chcp 437->exit
回到TCPP后就沒亂碼了。
但這個方法治標不治本,每次啟動TCPP仍是亂碼。
另一種方法
在TCPP窗口的左上角單擊,出現菜單(包含最大化,最小化,屬性等),在默認選項的第一個頁面“選項”里Default code page選擇437 (OEM United Status)。因為我目前使用的是英文系統,不知道中文系統中是否有該項。如果沒有該項,請自行尋找方法讓它有。
之后,一切OK,至少我OK了……
中鐵快運 跨省 4.3元/KG
一般3天到,但有時貨運量大,無法確定到貨時間
上午10:30電話過去,說下午2點后才能來取貨,我說下午不在,比較緊急,實際上取貨師傅11點多就到了
來取貨的人有2人,開的是面包車,能一次運走較多貨物
貨物較散時會收15元包裝費。
一般人不支持貨到付款,只有大客戶才支持。
先交費,多退少補(一般會多收),發票不當場發,之后會聯系你或郵寄給送貨地址(具體不詳)。
我是當天要離開,沒法將發票給我,他們說會將發票和多的錢放到包裝的貨物里。
順豐快遞 跨省 1KG內20元,超過部分12元/KG
到貨很快,合肥到杭州一天內能送到。
來取貨的只有1人,開電動車,貨物較多時無法一次取完。
支持貨到付款,無包裝費。
客服說1小時內到,通常半小時左右會有取貨人來電話聯系,之后看情況,有時候半小時能到,有時候很拖。
已經有人做了介紹
http://www.hzlzh.com/sina-app-engine-beta/
對我這種平時寫點小應用自娛自樂的個人開發者來說,最重要的變化就是SAE不再免費了
1RMB=50云豆
SAE進入beta后發放給內測開發者5000云豆,我去帳號里查看時剩下4945,感覺用得有些快
平時也沒寫多少東西,也就10多個php頁面,以后還是側重玩GAE吧……
雖然SAE相比GAE規模不大,但也有些不錯的地方
譬如cron,同樣的5min間隔執行的東西,SAE比GAE更準些
譬如客戶端,雖然SAE沒法在本地執行代碼,但能從服務器下載應用的最新代碼很不錯
之前GAE寫的東西,有些是在公司電腦里寫的,有些是在家里寫的,現在都不知道家中電腦里的代碼是不是最新的了
SAE進入beta后,能在線查看修改代碼,使用的編輯器是ecoder,
http://ecoder.quintalinda.com/
SAE很多其他功能還沒用到,就不多做評價了
以下說點胡話吧
國內整體環境有些急功近利,運營1年多了,沒任何收入,SAE也是國內第一個吃螃蟹的,能否盈利也不清楚,投資者沉不住氣,SAE團隊大概也是頂不住上層的壓力,迫不得已開始收費計劃。
總感覺SAE還沒成熟到能收費的階段,因為SAE上的應用并不多,我只見到10多個而已
應用能減少建站難度。應用少會限制SAE的用途,SAE面向的群體是什么呢,現在能干什么呢?個人的話,租php空間來干嘛,主要是搭博客,建論壇,搞CMS;想創業的,大概不會選SAE,因為限制太多,不如租主機,自由度更高;企業的話,注重的是穩定,現在還不會嘗試新出來的SAE
開發SAE開源項目,SAE會獎勵云豆。應用不多這點也能靠收費來激發開發者多發開些SAE開源項目來彌補,不知效果會如何
現在還真不知道SAE會發展得如何……
預計近期SAE應該會開發注冊吧,新帳號里應該會有一些云豆,給開發者試用,然后期待這些新鮮血液帶來更多付費用戶和SAE開源項目,希望SAE能發展下去
我出差的時候(是指在日本)
張X(日本那邊的人)說:“這個叫李X的代碼寫得真爛啊。”
我:“他是我室友。”過了一會
張X:“這個叫唐XX的寫得更爛。”
我:“這個是我前室友。”再過了一會
張X很無奈地問我:“這個叫鄭X一定是你的前前室友吧?”
我。。。
今天遇到一個問題,寫了一個頁面,抓取其他某站點的內容,然后重組成新的頁面,主要是一個圖片的展示(gallery)。
但是該站點做了防盜鏈,圖片無法顯示,403.
這種盜鏈主要是靠Referer來實現的,也就是說更改了Referer就能顯示圖片,但Referer不是在頁面編碼能解決的。
Referer是瀏覽器發出的,只能更改瀏覽器才能更改Referer。
firefox有一個插件refcontrol,可以做到這一點,不過不是我要說的
繼續研究,該站提供一種embed功能,供其他頁面調用,此時就能允許其他站點直接顯示圖片。
一般網站是不提供這種功能的,所以下面方法并不是所有網站適用的。
通過對比header內容,最終知道是它在cookie里設定了一個字段,以此來判別。
那么,只要我設定該值即可。
兩種方法
1.服務器端設定set-cookie,試驗證明,此法不可行,主要是domain無法更改到對應站點的domain下
2.客戶端用javascript設定document.cookie。仍不行……,原因不明,大概也是無法改domain吧
這下只剩最后一招了,在我的頁面里直接調用embed頁面,讓它替我設cookie,如何調用呢?
首先想到用frame,試了下,frame和圖片幾乎同時發出request,這樣cookie還沒設定,請求圖片肯定403.
又想到onload,呃,是在body完了后才調用,肯定不行
后來看到,html的head里的文件先下載完畢后,再請求圖片。這點我以前也提到過,
javascript代碼的執行順序
head里主要有2種文件調用,js和css。
這里就不是什么正規寫法了,因為embed頁面既不是js文件,也不是css文件,但瀏覽器是不會管這個的,直接調用。
一般也不會這么用……旁門左道
先用了js這種,在src里寫上embed頁面地址,可以顯示圖片,但有個javascript錯誤。
接著改進,用css的,會發現最終調用了兩次,一次是在開始,還有一次是在所有其他head文件全下載完之后
有些小影響,但問題不大。
時間比較晚,就懶得加上試驗代碼,OK,就這樣,完工。
1.
http://www.jsforest.org/2010/07/29/js-this指向的小測試/
這個說是在考this的指向,實際上是在考變量的作用域。
先說其中第二題。o是一個對象,doIt是它的方法,那么doIt的this自然指向o
第二題結果為10無懸念。
再來看第一題,在doIt的內部加入了一個setTimeout方法,setTimeout又調用了一個匿名方法。
在javascript中,函數(或方法)也是對象,那么匿名方法中的this應該指向doIt,結果為20.
實際上將代碼跑了下,第一題結果為5.哪里錯了?
問題出在setTimeout。
window.setTimeout(code, delay)
When
code is executed, it is executed in the context of the Window object. If
code is a function, the Window object is the value of the
this keyword. If
code is a string, it is evaluated in the global scope with the Window object as the only object on the scope chain. This is true even if the call to
setTimeout( ) occurred within a function with a longer scope chain.
這段話說明了setTimeout不管在哪里執行,其作用域都是在Window下,this一直指向Window。
第一題的x=5是全局變量,Window作用域下的。
這題說是在考this的指向,原來最終考的是個setTimeout的問題……被耍了
2.
http://www.css88.com/archives/2429
看到這個問題,首先注意到的是第一個用了
===,第二個沒有,而javascript是個弱類型語言,使用provisionalTable[item]取值沒判斷類型。
然后,試著找了Object中判斷值是否存在的方法,譬如provisionalTable.item ,in等都沒判斷類型。
想法一,重載[]方法,不過,這個怎么重載?又不是個function
想法二,數字是利用toString()轉成字符串的,那么重載Number.prototype.toString=function(){return this;}; 6=='6'返回false了,但provisionalTable[item]取值還是一樣
想法三,provisionalTable同時存在6和'6'時,provisionalTable[item]能區分這兩者,那么在provisionalTable中加入一個設為true時,將另一個也加入,并設為false。但這樣會有效率問題,事實上,acsu提出的方法里僅僅加了個typeof方法,就將效率損失殆盡。
突然想到,這個問題不是找解決方法,而是找最優方法
嗯,作罷,效率問題不是我等小民該考慮的,這個必須從根本上重構javascript才行
不過思考下,還是能學到很多東西的
http://code.google.com/p/pubsubhubbub/
pubsubhubbub是google開發的一種Atom和RSS增強協議,能夠接近實時發布信息。
也就是說,如果blogjava支持了pubsubhubbub,我在這里發布了博客,你就可以在你的閱讀器里很快看到我的文章。
現在只有部分博客服務商提供了pubsubhubbub功能,譬如WordPress,FriendFeed,livedoor等。
pubsubhubbub的原理很簡單。它由3部分組成,pub,sub,hub(最后的bub不是的,hubbub是騷動的意思)。
pub可以看成是博客,sub是閱讀器,而hub是一個中轉站。通常是由sub向pub請求內容,而pubsubhubbub是由sub想hub請求,hub再向pub請求,多一層hub的作用是降低pub的壓力。hub收到pub的更新后,會向sub發布最新的內容。
因為不是pub直接向sub發布,所以這里說的“接近”實時發布信息。
那么如何讓博客支持pubsubhubbub呢?只需要建立一個hub服務器,然后在生產rss時加入
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/>
http://pubsubhubbub.appspot.com就是hub服務器的地址。
<?xml version="1.0"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/>

</channel>
</rss>
因此判斷博客是否正常pubsubhubbub,也很簡單,查看
http://www.tkk7.com/liwei/rss的代碼即可,沒有hub的影子。
再看一個支持的例子
http://rasjacobson.wordpress.com/feed/ ,里面有一句 <atom:link rel='hub' /> ,這個是支持的。
具體的hub實現請查看
http://code.google.com/p/pubsubhubbub/wiki/Hubs
我這里只是個人玩玩而已,沒實力自己搭hub服務器。不過可以借助他人提供的hub服務器,譬如剛才appspot的。
知道了原理,接下來就好辦。
因為要改代碼才能修改生產的RSS,所以blogjava這種博客服務商不提供pubsubhubbub功能的話,我們這些用戶是無能為力的。
但自建的獨立博客是能簡單支持。等咱啥時候有閑錢了,再去做吧……
deploy時會出現如下信息
WARNING appengine_rpc.py:399 ssl module not found.
Without the ssl module, the identity of the remote host cannot be verified, and
connections may NOT be secure. To fix this, please install the ssl module from
http://pypi.python.org/pypi/ssl .
To learn more, see http://code.google.com/appengine/kb/general.html#rpcssl

當打開上面的頁面時會自動轉到 http://code.google.com/intl/zh-CN/appengine/kb/general.html#rpcssl ,在這里看不到任何幫助,因為google還沒將這段幫助信息翻譯成中文Orz,可以到 http://code.google.com/intl/en/appengine/kb/general.html#rpcssl 查看。這里說明在用python appcfg.py update 命令時添加 --insecure
后就不會有問題。但我用GAE Launcher也無法修改命令。再讓我回到沒有Launcher,直接用命令行的時代,還真難適應。作罷。
我試著安裝了ssl 模塊,但無法編譯。網上找到了這個頁面,http://canofy.javaeye.com/blog/651968 ,該同學和我遇到了同樣的問題,并且裝了cygwin。
貌似之后還有其他問題。不談。
今天,我突然發現,deploy時出現的ssl信息,完全可以忽視,對,可以忽視 ,之后仍會update成功的。
通常出現上述ssl提示后,console會沒有任何顯示,此時不要關閉console,再次deploy時會出現如下信息
Error 409: --- begin server output ---
Another transaction by user xxxxxx is already in progress for this app and major version. That user can undo the transaction with appcfg.py's "rollback" command.
--- end server output ---

這表明之前的update仍在進行。請安心等待……
最后,好嘛,一個不是問題的問題,花了我不少時間……
這個不弄明白,代碼出問題了也不難以解決。
《learning Jquery 1.3》p15有一句 JavaScript code is generally run as soon as it is encountered in the browser
也就是說,瀏覽器遇到一個語句就立刻解析。貌似這個問題很快就解決了。
但javascript的寫法相當多,譬如網上很多人討論的$(document).ready(和<body onload= 執行先后問題
在p16中,提到onload to run after the page is completely loaded.即onload在頁面完全加載完之后執行
ready是firing once the DOM is loaded—without waiting for images 。ready在DOM加載完,圖片未加載時執行。
也即ready在onload之前調用。
這里就涉及html頁面的加載順序問題。網上搜到2篇相關文章。
瀏覽器做了什么?
http://www.cnblogs.com/guilipan/archive/2010/01/06/1640145.html
Javascript在頁面加載時的執行順序
http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/
看完之后,比之前明白了些,但具體的關系還是沒能理解。
一個html頁面包括head和body兩個部分,head部會調用外部CSS和JS文件,body部會調用圖片,音視頻等內容。
下載順序是html ->CSS JS ->圖片等。
解析順序是html(內部是按序執行head->body)->DOM生成 ->ready執行 ->圖片下載 ->body.onload
將以上兩者結合,html ->head(CSS JS) ->body->DOM生成 ->ready執行 ->圖片下載 ->body.onload
其中head和body部都可能包含js,按代碼順序執行。
這里就有一個疑問,瀏覽器會等待JS等文件下載完后,并順序執行該JS后再繼續執行之后的html代碼么?
按想應該不會,不然JS文件過大,會影響html頁面渲染的速度,兩者應該是異步的。
但這個異步就會將之前總結的順序攪亂。譬如onload都執行完了,包含ready的JS還沒下完,此時會發生什么?
這里說得有問題,JS未下載完,onload是不會執行的。
有待繼續總結……