李威 さぽている

          小說翻譯,日語相關(guān)轉(zhuǎn)移至http://blog.hjenglish.com/liwei

          2010年5月8日 #

          JSONP 跨域原理小解

          最近看一些代碼時(shí),邊看邊改代碼,發(fā)現(xiàn)getJSON這個(gè)方法沒法正常使用。

          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

          究其原因,發(fā)現(xiàn)url里有個(gè)callback,這里使用的是JSONP,一種跨域技術(shù)。
          網(wǎng)上搜了下JSONP,多數(shù)都是在講如何使用,而沒有說明為什么它能跨域,且沒有說明url服務(wù)器端的代碼時(shí)如何生成的。
          http://www.west-wind.com/weblog/posts/2007/Jul/04/JSONP-for-crosssite-Callbacks
          這方面,上面的文章里有比較詳細(xì)的描述。

           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代碼會有如上的操作,代碼不難,很容易理解,也就是加了一個(gè)script標(biāo)簽。

          而服務(wù)器端會返回
          callbackFunction( { "x": 10, "y": 15} );
          這樣的數(shù)據(jù)。這其實(shí)是一段javascript代碼,
          callbackFunction是方法名,
          { "x": 10, "y": 15}是參數(shù)。客戶端代碼里必須要有
          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 }

          之后客戶端會調(diào)用callbackFunction
          使用JQuery的getJSON方法后,callback部分會變成如下形式。
          callback=jQuery1710461701650187642_1326201333794&_=1326201356534
          callbackFunction自然就是
          jQuery1710461701650187642_1326201333794部分了。
          返回來的數(shù)據(jù)也會是jQuery1710461701650187642_1326201333794( { "x": 10, "y": 15} ) 這種形式。

          最后JQuery會調(diào)用匿名函數(shù)
          function(data),data即為json數(shù)據(jù)。

          JQuery已經(jīng)將客戶端部分實(shí)現(xiàn)了,服務(wù)器端也得遵循同樣的規(guī)則才能實(shí)現(xiàn)跨域。


          *這里有一點(diǎn),JQuery如何將匿名函數(shù)換名字的?有哪位大俠知道的,請用簡單的語言講解下。

          posted @ 2012-01-10 21:30 李威 閱讀(350) | 評論 (0)編輯 收藏

          error code 0x80004005

          記錄一個(gè)小問題。
          在Win7系統(tǒng)上裝一個(gè)軟件時(shí)失敗,提示2個(gè)DLL沒有注冊成功。
          于是準(zhǔn)備手動注冊。
          運(yùn)行
          cd C:\WINDOWS\system32\
          regsvr32 xxx.dll
          后出現(xiàn)如下錯(cuò)誤:
          The module "xxx.dll" was loaded but the call to DllRegisterServer failed with error code 0x80004005.

          網(wǎng)上搜索一番后,找到如下地址
          http://forums.cnet.com/7723-12546_102-237219.html
          其中有條說run as administrator,這是權(quán)限問題,不過我登陸的就是管理員賬號,應(yīng)該不存在這樣的問題。

          抱著姑且一試的想法,寫了個(gè)cmd文件,右鍵run as administrator后,居然真的注冊成功了!

          看來Win7系統(tǒng)真的很安全,就算是管理員,也得來個(gè)run as administrator后才能做一些事,是在向sudo學(xué)習(xí)么?

          posted @ 2011-12-06 21:13 李威 閱讀(364) | 評論 (0)編輯 收藏

          HTML5的audio標(biāo)簽很坑爹!

          最近試著用html5在頁面加載mp3文件。在chrome下測試通過了,偶然的用firefox4打開,居然沒法用……
          懷疑哪里寫錯(cuò)了,可audio標(biāo)簽也就幾個(gè)屬性而已。

          幾經(jīng)搜索,最后發(fā)現(xiàn)的真相讓我很崩潰……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/

          看了這個(gè)表之后,雖然很多瀏覽器都支持html5,但如果你想播放一個(gè)文件,任何一種格式都不能讓所有瀏覽器正常播放。
          哈哈哈,html5定義了媒體標(biāo)簽,但沒規(guī)定媒體的默認(rèn)編碼格式,導(dǎo)致各瀏覽器各自為政。
          真是不方便……

          posted @ 2011-06-11 22:30 李威 閱讀(273) | 評論 (0)編輯 收藏

          PHP GD畫圖時(shí)出現(xiàn)的文字亂碼問題

          GD畫圖時(shí)通常顯示文字是用imagettftext方法,但它的參數(shù)必須是UTF-8編碼的。
          此時(shí)得注意php文件的編碼
          1.如果是UTF-8的,直接傳硬編碼字符串就可正常顯示
          2.如果是gb2312或其它的,則必須進(jìn)行轉(zhuǎn)換 mb_convert_encoding($str, 'UTF-8')

          另外,還有一種情況,JIS-mapped Japanese Font Support被開啟時(shí),imagettftext就必須傳SJIS編碼,傳UTF-8反而會亂碼。
          此時(shí)必須將其轉(zhuǎn)碼后傳入,mb_convert_encoding($sStr,"SJIS", "UTF-8")。

          以上。

          posted @ 2011-03-31 15:46 李威 閱讀(1056) | 評論 (0)編輯 收藏

          TurboC3.0英文版中界面邊框?yàn)閬y碼問題的解決發(fā)法

          在次提供TurboC3.0英文版下載。

          TCPP.rar
          上網(wǎng)須謹(jǐn)慎,下載請殺毒。

          TC3.0窗口模式,邊框有中文亂碼。全屏就沒有。
          原因是當(dāng)前的code page是中文的936,可以在cmd中用chcp命令查看。
          利用命令 chcp 437 改為老美的,就可以了。
          具體操作
          啟動TCPP.exe->File->DOS Shell->chcp 437->exit
          回到TCPP后就沒亂碼了。
          但這個(gè)方法治標(biāo)不治本,每次啟動TCPP仍是亂碼。

          另一種方法
          在TCPP窗口的左上角單擊,出現(xiàn)菜單(包含最大化,最小化,屬性等),在默認(rèn)選項(xiàng)的第一個(gè)頁面“選項(xiàng)”里Default code page選擇437 (OEM United Status)。因?yàn)槲夷壳笆褂玫氖怯⑽南到y(tǒng),不知道中文系統(tǒng)中是否有該項(xiàng)。如果沒有該項(xiàng),請自行尋找方法讓它有。
          之后,一切OK,至少我OK了……

          posted @ 2011-01-26 19:26 李威 閱讀(712) | 評論 (0)編輯 收藏

          運(yùn)行李

          中鐵快運(yùn) 跨省 4.3元/KG
          一般3天到,但有時(shí)貨運(yùn)量大,無法確定到貨時(shí)間
          上午10:30電話過去,說下午2點(diǎn)后才能來取貨,我說下午不在,比較緊急,實(shí)際上取貨師傅11點(diǎn)多就到了
          來取貨的人有2人,開的是面包車,能一次運(yùn)走較多貨物
          貨物較散時(shí)會收15元包裝費(fèi)。
          一般人不支持貨到付款,只有大客戶才支持。
          先交費(fèi),多退少補(bǔ)(一般會多收),發(fā)票不當(dāng)場發(fā),之后會聯(lián)系你或郵寄給送貨地址(具體不詳)。
          我是當(dāng)天要離開,沒法將發(fā)票給我,他們說會將發(fā)票和多的錢放到包裝的貨物里。


          順豐快遞 跨省 1KG內(nèi)20元,超過部分12元/KG
          到貨很快,合肥到杭州一天內(nèi)能送到。
          來取貨的只有1人,開電動車,貨物較多時(shí)無法一次取完。
          支持貨到付款,無包裝費(fèi)。
          客服說1小時(shí)內(nèi)到,通常半小時(shí)左右會有取貨人來電話聯(lián)系,之后看情況,有時(shí)候半小時(shí)能到,有時(shí)候很拖。

          posted @ 2011-01-15 11:31 李威 閱讀(147) | 評論 (0)編輯 收藏

          Sina App Enginge Beta

          已經(jīng)有人做了介紹
          http://www.hzlzh.com/sina-app-engine-beta/

          對我這種平時(shí)寫點(diǎn)小應(yīng)用自娛自樂的個(gè)人開發(fā)者來說,最重要的變化就是SAE不再免費(fèi)了
          1RMB=50云豆
          SAE進(jìn)入beta后發(fā)放給內(nèi)測開發(fā)者5000云豆,我去帳號里查看時(shí)剩下4945,感覺用得有些快
          平時(shí)也沒寫多少東西,也就10多個(gè)php頁面,以后還是側(cè)重玩GAE吧……

          雖然SAE相比GAE規(guī)模不大,但也有些不錯(cuò)的地方
          譬如cron,同樣的5min間隔執(zhí)行的東西,SAE比GAE更準(zhǔn)些
          譬如客戶端,雖然SAE沒法在本地執(zhí)行代碼,但能從服務(wù)器下載應(yīng)用的最新代碼很不錯(cuò)
          之前GAE寫的東西,有些是在公司電腦里寫的,有些是在家里寫的,現(xiàn)在都不知道家中電腦里的代碼是不是最新的了
          SAE進(jìn)入beta后,能在線查看修改代碼,使用的編輯器是ecoder,http://ecoder.quintalinda.com/

          SAE很多其他功能還沒用到,就不多做評價(jià)了

          以下說點(diǎn)胡話吧
          國內(nèi)整體環(huán)境有些急功近利,運(yùn)營1年多了,沒任何收入,SAE也是國內(nèi)第一個(gè)吃螃蟹的,能否盈利也不清楚,投資者沉不住氣,SAE團(tuán)隊(duì)大概也是頂不住上層的壓力,迫不得已開始收費(fèi)計(jì)劃。

          總感覺SAE還沒成熟到能收費(fèi)的階段,因?yàn)镾AE上的應(yīng)用并不多,我只見到10多個(gè)而已
          應(yīng)用能減少建站難度。應(yīng)用少會限制SAE的用途,SAE面向的群體是什么呢,現(xiàn)在能干什么呢?個(gè)人的話,租php空間來干嘛,主要是搭博客,建論壇,搞CMS;想創(chuàng)業(yè)的,大概不會選SAE,因?yàn)橄拗铺啵蝗缱庵鳈C(jī),自由度更高;企業(yè)的話,注重的是穩(wěn)定,現(xiàn)在還不會嘗試新出來的SAE
          開發(fā)SAE開源項(xiàng)目,SAE會獎(jiǎng)勵(lì)云豆。應(yīng)用不多這點(diǎn)也能靠收費(fèi)來激發(fā)開發(fā)者多發(fā)開些SAE開源項(xiàng)目來彌補(bǔ),不知效果會如何

          現(xiàn)在還真不知道SAE會發(fā)展得如何……

          預(yù)計(jì)近期SAE應(yīng)該會開發(fā)注冊吧,新帳號里應(yīng)該會有一些云豆,給開發(fā)者試用,然后期待這些新鮮血液帶來更多付費(fèi)用戶和SAE開源項(xiàng)目,希望SAE能發(fā)展下去

          posted @ 2010-09-05 12:28 李威 閱讀(210) | 評論 (0)編輯 收藏

          笑話一則(其中的我不是博主)

          我出差的時(shí)候(是指在日本)
           張X(日本那邊的人)說:“這個(gè)叫李X的代碼寫得真爛啊。”
          我:“他是我室友。”過了一會
          張X:“這個(gè)叫唐XX的寫得更爛。”
          我:“這個(gè)是我前室友。”再過了一會
          張X很無奈地問我:“這個(gè)叫鄭X一定是你的前前室友吧?”
          我。。。

          posted @ 2010-08-26 22:43 李威 閱讀(149) | 評論 (0)編輯 收藏

          如何破掉防盜鏈機(jī)制

          今天遇到一個(gè)問題,寫了一個(gè)頁面,抓取其他某站點(diǎn)的內(nèi)容,然后重組成新的頁面,主要是一個(gè)圖片的展示(gallery)。

          但是該站點(diǎn)做了防盜鏈,圖片無法顯示,403.

          這種盜鏈主要是靠Referer來實(shí)現(xiàn)的,也就是說更改了Referer就能顯示圖片,但Referer不是在頁面編碼能解決的。

          Referer是瀏覽器發(fā)出的,只能更改瀏覽器才能更改Referer。

          firefox有一個(gè)插件refcontrol,可以做到這一點(diǎn),不過不是我要說的

          繼續(xù)研究,該站提供一種embed功能,供其他頁面調(diào)用,此時(shí)就能允許其他站點(diǎn)直接顯示圖片。
          一般網(wǎng)站是不提供這種功能的,所以下面方法并不是所有網(wǎng)站適用的。

          通過對比header內(nèi)容,最終知道是它在cookie里設(shè)定了一個(gè)字段,以此來判別。

          那么,只要我設(shè)定該值即可。
          兩種方法
          1.服務(wù)器端設(shè)定set-cookie,試驗(yàn)證明,此法不可行,主要是domain無法更改到對應(yīng)站點(diǎn)的domain下
          2.客戶端用javascript設(shè)定document.cookie。仍不行……,原因不明,大概也是無法改domain吧

          這下只剩最后一招了,在我的頁面里直接調(diào)用embed頁面,讓它替我設(shè)cookie,如何調(diào)用呢?
          首先想到用frame,試了下,frame和圖片幾乎同時(shí)發(fā)出request,這樣cookie還沒設(shè)定,請求圖片肯定403.
          又想到onload,呃,是在body完了后才調(diào)用,肯定不行
          后來看到,html的head里的文件先下載完畢后,再請求圖片。這點(diǎn)我以前也提到過,javascript代碼的執(zhí)行順序 
          head里主要有2種文件調(diào)用,js和css。
          這里就不是什么正規(guī)寫法了,因?yàn)閑mbed頁面既不是js文件,也不是css文件,但瀏覽器是不會管這個(gè)的,直接調(diào)用。
          一般也不會這么用……旁門左道
          先用了js這種,在src里寫上embed頁面地址,可以顯示圖片,但有個(gè)javascript錯(cuò)誤。
          接著改進(jìn),用css的,會發(fā)現(xiàn)最終調(diào)用了兩次,一次是在開始,還有一次是在所有其他head文件全下載完之后
          有些小影響,但問題不大。

          時(shí)間比較晚,就懶得加上試驗(yàn)代碼,OK,就這樣,完工。

          posted @ 2010-08-10 00:19 李威 閱讀(843) | 評論 (0)編輯 收藏

          javascript兩則思考

          1.
          http://www.jsforest.org/2010/07/29/js-this指向的小測試/


          這個(gè)說是在考this的指向,實(shí)際上是在考變量的作用域。
          先說其中第二題。o是一個(gè)對象,doIt是它的方法,那么doIt的this自然指向o
          第二題結(jié)果為10無懸念。

          再來看第一題,在doIt的內(nèi)部加入了一個(gè)setTimeout方法,setTimeout又調(diào)用了一個(gè)匿名方法。
          在javascript中,函數(shù)(或方法)也是對象,那么匿名方法中的this應(yīng)該指向doIt,結(jié)果為20.

          實(shí)際上將代碼跑了下,第一題結(jié)果為5.哪里錯(cuò)了?

          問題出在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不管在哪里執(zhí)行,其作用域都是在Window下,this一直指向Window。
          第一題的x=5是全局變量,Window作用域下的。

          這題說是在考this的指向,原來最終考的是個(gè)setTimeout的問題……被耍了



          2.
          http://www.css88.com/archives/2429

          看到這個(gè)問題,首先注意到的是第一個(gè)用了===,第二個(gè)沒有,而javascript是個(gè)弱類型語言,使用provisionalTable[item]取值沒判斷類型。
          然后,試著找了Object中判斷值是否存在的方法,譬如provisionalTable.item ,in等都沒判斷類型。
          想法一,重載[]方法,不過,這個(gè)怎么重載?又不是個(gè)function
          想法二,數(shù)字是利用toString()轉(zhuǎn)成字符串的,那么重載Number.prototype.toString=function(){return this;}; 6=='6'返回false了,但provisionalTable[item]取值還是一樣
          想法三,provisionalTable同時(shí)存在6和'6'時(shí),provisionalTable[item]能區(qū)分這兩者,那么在provisionalTable中加入一個(gè)設(shè)為true時(shí),將另一個(gè)也加入,并設(shè)為false。但這樣會有效率問題,事實(shí)上,acsu提出的方法里僅僅加了個(gè)typeof方法,就將效率損失殆盡。
          突然想到,這個(gè)問題不是找解決方法,而是找最優(yōu)方法
          嗯,作罷,效率問題不是我等小民該考慮的,這個(gè)必須從根本上重構(gòu)javascript才行

          不過思考下,還是能學(xué)到很多東西的

          posted @ 2010-08-05 22:07 李威 閱讀(152) | 評論 (0)編輯 收藏

          如何讓博客支持PubSubHubbub

          http://code.google.com/p/pubsubhubbub/ 
          pubsubhubbub是google開發(fā)的一種Atom和RSS增強(qiáng)協(xié)議,能夠接近實(shí)時(shí)發(fā)布信息。
          也就是說,如果blogjava支持了pubsubhubbub,我在這里發(fā)布了博客,你就可以在你的閱讀器里很快看到我的文章。
          現(xiàn)在只有部分博客服務(wù)商提供了pubsubhubbub功能,譬如WordPress,F(xiàn)riendFeed,livedoor等。

          pubsubhubbub的原理很簡單。它由3部分組成,pub,sub,hub(最后的bub不是的,hubbub是騷動的意思)。
          pub可以看成是博客,sub是閱讀器,而hub是一個(gè)中轉(zhuǎn)站。通常是由sub向pub請求內(nèi)容,而pubsubhubbub是由sub想hub請求,hub再向pub請求,多一層hub的作用是降低pub的壓力。hub收到pub的更新后,會向sub發(fā)布最新的內(nèi)容。
          因?yàn)椴皇莗ub直接向sub發(fā)布,所以這里說的“接近”實(shí)時(shí)發(fā)布信息。

          那么如何讓博客支持pubsubhubbub呢?只需要建立一個(gè)hub服務(wù)器,然后在生產(chǎn)rss時(shí)加入
          <atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/>
          http://pubsubhubbub.appspot.com就是hub服務(wù)器的地址。
          <?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.aygfsteel.com/liwei/rss的代碼即可,沒有hub的影子。
          再看一個(gè)支持的例子 http://rasjacobson.wordpress.com/feed/ ,里面有一句 <atom:link rel='hub' /> ,這個(gè)是支持的。

          具體的hub實(shí)現(xiàn)請查看
          http://code.google.com/p/pubsubhubbub/wiki/Hubs
          我這里只是個(gè)人玩玩而已,沒實(shí)力自己搭hub服務(wù)器。不過可以借助他人提供的hub服務(wù)器,譬如剛才appspot的。

          知道了原理,接下來就好辦。
          因?yàn)橐拇a才能修改生產(chǎn)的RSS,所以blogjava這種博客服務(wù)商不提供pubsubhubbub功能的話,我們這些用戶是無能為力的。

          但自建的獨(dú)立博客是能簡單支持。等咱啥時(shí)候有閑錢了,再去做吧……

          posted @ 2010-08-01 01:35 李威 閱讀(301) | 評論 (0)編輯 收藏

          GAE發(fā)布時(shí)出現(xiàn)的SSL問題

          deploy時(shí)會出現(xiàn)如下信息

          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 

          當(dāng)打開上面的頁面時(shí)會自動轉(zhuǎn)到 http://code.google.com/intl/zh-CN/appengine/kb/general.html#rpcssl ,在這里看不到任何幫助,因?yàn)間oogle還沒將這段幫助信息翻譯成中文Orz,可以到 http://code.google.com/intl/en/appengine/kb/general.html#rpcssl 查看。這里說明在用python appcfg.py update 命令時(shí)添加 --insecure 后就不會有問題。但我用GAE Launcher也無法修改命令。再讓我回到?jīng)]有Launcher,直接用命令行的時(shí)代,還真難適應(yīng)。作罷。

          我試著安裝了ssl 模塊,但無法編譯。網(wǎng)上找到了這個(gè)頁面,http://canofy.javaeye.com/blog/651968 ,該同學(xué)和我遇到了同樣的問題,并且裝了cygwin。
          貌似之后還有其他問題。不談。

          今天,我突然發(fā)現(xiàn),deploy時(shí)出現(xiàn)的ssl信息,完全可以忽視,對,可以忽視 ,之后仍會update成功的。
          通常出現(xiàn)上述ssl提示后,console會沒有任何顯示,此時(shí)不要關(guān)閉console,再次deploy時(shí)會出現(xiàn)如下信息
          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仍在進(jìn)行。請安心等待……

          最后,好嘛,一個(gè)不是問題的問題,花了我不少時(shí)間……

          posted @ 2010-05-08 12:25 李威 閱讀(751) | 評論 (1)編輯 收藏

          主站蜘蛛池模板: 临夏县| 涿州市| 抚州市| 邛崃市| 九龙坡区| 融水| 大名县| 绥阳县| 辰溪县| 安庆市| 缙云县| 乌审旗| 墨江| 江川县| 余姚市| 微博| 从化市| 武乡县| 安阳市| 澳门| 连州市| 罗源县| 黔南| 弋阳县| 建水县| 河津市| 微山县| 得荣县| 顺义区| 天津市| 开化县| 瑞昌市| 英山县| 景德镇市| 天长市| 布尔津县| 石渠县| 西华县| 呼和浩特市| 玉环县| 阳城县|