2011年3月17日 星期四

網頁開發人員的IE9相容性須知

IE9正式版已經在2011/3/14 21:30 UTC-8發佈囉! (補充參考: 蘇老的IE9安裝介紹)

這次從IE8到IE9的改版,主要著眼於對HTML5與CSS3的支援(雖然我覺得對CSS3支援得不夠用力)、砍掉重練變快很多的全新Script Engine,以及整合GPU硬體加速功能,在Script執行與圖形處理速度的提升十分驚人,IE9網站上有段炫耀用的小魚影片,IE9對上Firefox 4,放250隻小魚在魚缸裡亂竄的FPS測速(Frames Per Second, 每秒鐘可以刷新幾次畫面)約為59:7,圖形處理效能推進到這種水平,預期將可衍生出許多原本不可能實現的網頁應用模式。(有種不祥預感,客戶快要開始胡思亂想,提出一些異想天開的需求了... orz)

隨著IE9正式版開放下載,網頁設計人員也必須正視現有網站對IE9的相容性,部分從IE8換成IE9的行為改變可能導致原有網頁寫法產生不同結果,MSDN上有份的Internet Explorer 9 相容性操作手冊(我建議看英文原版,內容更完整),列出從IE8到IE9有哪些變更可能影響網頁運作,值得開發人員參考。

我檢閱了一次,整理摘要如下: (以下主要針對IE8 -> IE9的變化,不含IE6/IE7 -> IE8間的差異)

1. 不再支援document.createElement("
")這種直接帶入HTML Tag的寫法,必須先createElement("div")後再加料
2. 寫法在IE9中,window["x"]會傳回OBJECT與EMBED元素的集合,原本IE8會忽略Fallback用EMBED,只傳回OBJECT。
3. 對Web Server傳回Response Header的text/css, text/plain, X-Content-Type-Options: nosniff處理原則改變。
4. 不支援arguments.caller屬性
5. 網頁中如有,過去IE8會交給SVG外掛顯示(如: Adobe SVG Viewer),IE9改由原生(Native,內建)SVG功能直接解析處理
6. var fn=document.writeln; fn("
")的寫法會出錯,需改成fn=document.writeln.bin(document)或fn.call(document, "
");
7.
, document.getElementById("x").myAttr在IE9將傳回undefined,需回歸使用getAttribute("myAttr")。**這點值得特別注意**
8. IE9在iFrame自DOM移除後,iFrame window會立即被移除(避免持續佔用記憶體)無法再被存取,若試圖執行其中的Javascript Function,會出現Can't execute code from a freed script錯誤。
9. IE9的User Agent字串會變成:
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
網站如果有依UserAgent資訊做差異化處理時要考量此變化。
10. 不再支援動態VML(不知道這是啥的人就直接略過囉,XD)
11. for (var p in obj)的列舉結果與IE8不同,
例如: var obj = {first : "prop1", second: "prop2", 3: "prop3"}; IE8列舉結果為first, second, 3,IE9則為3, first, second,數字優先。var obj = { first: "prop1", toString : "Hello" },在IE8只會出現first(因為toString名稱與內建方法相同),而在IE9則會得到first, toString。
12. IE9預設會使用Streaming SIMD Extensions 2 (SSE2)加速運算,若平台支援SSE2,某些浮點運算結果會因此有細微差異。例如: Math.sin(6.28318530717958620000); IE8=>2.4492127076447545e-16, IE9+SSE2=>2.4492935982947064e-16
13. 泰文及東亞字型可能會變小! 先前IE8在處理9pt以下中文字型時會自動放大,IE9則力求原汁原味向其他Browser看齊,所以...
14. 間接呼叫window.eval,如: var indirectEval = eval; indirectEval(...),會在全域執行,故無法取得區域變數(Local Scope) (但會這樣搞的人應該不多吧?)
15. IE8 Array的數目若超過2147483647,會以負數表示,例如: arr["-2147483645"],IE9則不會。(誰會搞這麼大的陣列呀?)
16. Overlapping Elements Are Cloned (坦白說,不管是中文翻譯或是英文原版,我都沒看懂, 有人知道的話請分享一下。原文)
17.

…

的寫法要改成

…

18. styleSheet.title在IE9裡變成唯讀不能修改
19. Table物件行為改變:
* tBody中額外的thead, tfoot將不再顯示
* 的顯示順序: thead -> 非tfoot -> tfoot
* rows屬性傳回所有(含thead, tfoot, 直接隸屬的)
* getElementByTagName, HtmlElement.children不傳回comment node
20. IE9調整了圖形排版尺寸規則以求與他家瀏覽器一致,簡單來說,有些字型大小會與IE6/7/8不同,最常見的影響是會產生非預期的換行。
21.

Text

中的空白在IE9中會被保存,="\n Text ",而在IE8中原本為"Text"。用個範例:



Text


Text




IE8會得到:
t1=Text
t2=Text

IE9則是:
t1=
Text
t2=Text

22. attachEvent、detachEvent、createEventObject、fireEvent這些IE獨創的玩法被標成"過時不建議使用",未來將會被移除,請大家乖乖改用W3C標準做法addEventListener、removeEventListener、createEvent、dispatchEvent取代之。

2011年3月12日 星期六

2011年3月11日 星期五

Mac OSX 10.6 安裝Python 2.6.5 備忘錄

Snow Leopard原本內建的Python 2.6.1在使用urllib的urlopen()時
Python會有crash的風險
官網說,Python2.6.3以後的版本就修正好了的樣子
現在去抓就是Python2.6.5,那就來裝Python2.6.5吧~
測試環境OS,Mac OSX 10.6(Snow Leopard)
抓了官網上的python-2.6.5-macosx10.3-2010-03-24.dmg
安裝完之後發現site-packages不相通
所以原本安裝的module都不能import,淦!
只好一個一個module重裝一遍,2.6.5的site-packages位置在:
/Library/Frameworks/Python.framework/Version/2.6/lib/python2.6/site-packages
進去看果然全是空的。
module重裝到pycurl時,一直報錯丫丫丫丫!
後來同事找出問題點,Mac OSX原本附的Python 2.6.1是x86_64版
但我Download下來的dmg包會安裝成32bit版本
所以改用tar ball包來自行編譯x86_64版本
這個版本:Python 2.6.5 bzipped source tarball(http://www.python.org/ftp/python/2.6.5/Python-2.6.5.tar.bz2)
$ tar -xvzpf Python-2.6.5.tar.bz2
$ cd Python-2.6.5
$ ./configure –with-universal-arch=x86_64 –enable-universalsdk=/Developer/SDKs/MacOSX10.6.sdk –enable-framework=/Library/Frameworks –with-framework-name=Python2.6.5
這裡configure的參數說明:
–with-universal-arch=x86_64 (指定編譯成x86_64,如果不給這個參數,預設是i386,也就是32-bit版)
README底下的說明是用–with-universal-archs,但在執行時又報錯,要我用–with-universal-arch
後來發現,如果要用–with-universal-archs,其後的參數要用intel(i368和x86_64混合)
不然就要用–with-universal-arch,並指定’x86_64′
–enable-universalsdk=/Developer/SDKs/MacOSX10.6.sdk (指定OSX的SDK版本,這裡採用OSX 10.6)
–enable-framework=/Library/Frameworks (指定安裝在/Library/Frameworks路徑底下)
–with-framework-name=Python2.6.5 (指定安裝在/Library/Frameworks路徑底下的目錄名稱)
因為Python 2.6.1和Python 2.6.5(i386或x86_64)都是Python2.6,所以用Python2.6.5來區隔一下
$ make
$ sudo make install
雖然make install這裡,README有建議不要用sudo(superuser)來執行,但是權限上會有寫入的問題
還是得sudo一下,嘖嘖。
安裝完之後再到使用者的家目錄底下($ cd ~/),修改一下.base_profile
將原本指向舊Python的路徑改成新的Python路徑
這是我的:
# Setting PATH for MacPython 2.6
# The orginal version is saved in .bash_profile.pysave
# PATH="/Library/Frameworks/Python.framework/Versions/2.6/bin:${PATH}" (<這舊的)
PATH="/Library/Frameworks/Python2.6.5.framework/Versions/2.6/bin:${PATH}" (<這新的)
export PATH
儲存之後,關掉Terminal再進Terminal執行python
就是新的python2.6.5環境啦~

reference: http://chibakuma.net/blog/?p=107

2011年3月7日 星期一

用 JSONView 看 JSON 資料…

之前是用 Force Content-Type 強制把 application/json 轉成 text/plain 然後直接看原始輸出的 JSON document。但如果遇到 JSON 很長一串的時候 (把空白及換行抽掉),看起來就很麻煩…

Firefox 上的 JSONView 可以同時處理 application/json 會跳出下載頁,以及排版的問題。以「emma.pixnet.cc/album/elements?set_id=15345490&user=nico」這個 JSON 輸出來說,這樣就好讀很多:



不過會把 url 轉成可點選連結的功能好像關不掉…

reference:http://blog.gslin.org/archives/2011/03/07/2494/%E7%94%A8-jsonview-%E7%9C%8B-json-%E8%B3%87%E6%96%99

2011年3月6日 星期日

Avoid drop box file permission issues

%chmod +a "username allow list,add_file,search,delete,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown,file_inherit,directory_inherit" /Users/username/Public/Drop Box

2011年2月9日 星期三

find out the biggest total size of image size * request times

cat searchDateLog.txt | grep " 200 " | grep ".jpg" | cut -d ' ' -f 7,10 | sort | uniq -c | awk '{print $1*$3," ",$2}' | sort -n -r | head -n 100

2011年1月18日 星期二

facebook是如何管理代碼的

原文在此 ,看完之後,終於明白為什麼優秀的工程師都去了/想去facebook,因為那裡是工程師們的天堂。

譯文:

我對facebook的運轉著迷。 這是一個很獨特的環境,不容易被複製(他們的體係並不適合所有的公司,即使他們努力嘗試過)。 下面是我和facebook的朋友們關於他們如何開發和管理項目的記錄。

現在距離我收集的這些信息又過去6個月了,我相信facebook肯定又對他們的項目開發實踐進行了改進。 所以這些記錄可能會有點過時。 同時facebook的工程師驅動文化也越來越為大眾所知。 非常感謝那些幫助我整理這篇文章的facebook的朋友們。

記錄:

截止到2010年6月,facebook有將近2000名員工,10個月前只有1100名,一年之間差不多翻了一番。
兩個最大的部門是工程師和運維,每個部門大概都是400-500人。 這兩個部門人數大約佔了公司的一半。
產品經理與工程師的比例大約為1-7到1-10。
每個工程師入職時,都要接收4-6週的培訓,通過修補bugs和聽高級開發工程師的課程來熟悉facebook。
培訓結束後,每個工程師都可以接觸線上的數據庫(更大的權力意味著更大的責任,也有一份"勿做清單",不然可能會被開,比如共享用戶的隱私數據)。
有非常牢靠的安全體系,以免有人不小心/故意做了些不好的事。
每個工程師可以修改facebook的任何代碼,隨時可以遷入。
濃厚的工程師驅動文化。 "產品經理基本可以被忽略",這是facebook一名員工的話。 工程師可以修改流程的細節,重新安排工作任務,隨時植入自己的想法。
在每月的跨部門會議上,由工程師來匯報工作進度,市場部和產品經理會出席會議,也可以做些簡短的發言,但如果說得太多,很可能就會被打小報告。 他們確實想讓工程師來主導產品的開發,對自己的產品負責。
項目需要的資源都是自願的
一個產品經理把工程師們召集到一起,讓他們對他的想法產生興趣。
工程師們決定開發那些讓他們感興趣的特性。
工程師跟他們的經理說:"我下週想開發這5個新特性"。
經理會讓工程師獨立開發,可能有時會讓他優先完成一些特性。
工程師獨立完成所有的特性——前端/後端/數據庫,等等所有相關的部分。 如果需要得到設計人員的幫助,需要先讓設計人員對你的想法產生興趣。 其他如架構之類的也一樣。 但總體來說,工程師要獨立完成所有的任務。
對於某個特性是否值得開發的爭論,通常是這麼解決的:花一個星期的時間完成他,並在小部分人群中(如1%)進行測試。
工程師常常希望解決難題,這能獲得聲望和尊敬。 他們很難對前端項目或UI設計產生太大的興趣。 這跟其他公司可能正好相反。 在facebook,後端任務,比如新的feed算法,廣告投放算法,memcache優化等等,是工程師真正感興趣的。
所有的代碼修改都要進行審核(通過一個或多個工程師),但News Feed是個例外,因為太重要了,Zuckerberg會親自review。
所有的修改至少要被一個人審核,而且這個系統可以讓任何人很方便地審核其他人的代碼,即使你沒有邀請他
工程師負責測試,代碼修復,和維護自己的項目。
每個辦公室或通過VPN連接的員工會使用下一版的facebook,這個版本的facebook會經常更新,通常比公開的早1-12小時。 所有的員工被強烈建議提交bugs,而且通常會很快被修復。
很奇怪只有很少的QA或自動測試——"大部分工程師都能寫出基本沒有bug的代碼,只是在其他公司他們不需要這麼做。如果有QA部門,他們只要把代碼寫完,扔給他們就行了"
[針對上一條]我們有自動測試,代碼發布前必須要通過測試。 我們不相信"所有的工程師都能寫出沒有bug的代碼",畢竟這是一個商業公司。
很奇怪,缺少產品經理的影響和控制——產品經理是很獨立的和自由的。 產生影響力的關鍵是與工程師和工程師的領導們們搞好關係。 需要大致了解技術,不要提一些愚蠢的想法。
所有提交的代碼每週二打包一次。
只要多一分努力,終於一天會發生改變。
星期二的代碼發布,需要所有的提交過代碼的工程師在場。
代碼打包前,工程師必須在一個特殊的IRC channel上。
運維執行打包過程
facebook有大約60000台服務器
有9個代碼發布級別
最小的級別只有6台服務器
星期二的代碼發布會先發佈到6台服務器上,運維組會檢測這6台服務器的反應,保證代碼正常工作,然後再提交到下一級
如果發佈出現了一些問題(如報錯等等),那麼就停止下一級的部署,提交出錯代碼的工程師負責修復問題,然後從頭繼續發布。
所以一次發布可能會經歷幾次重複:1-2-3-fix. 回到1. 1-2-3-4-5-fix. 回到1. 1-2-3-4-5-6- 7-8-9
運維組是受過嚴格訓練,倍受尊敬,而且有商業意識的。 他們的工作包括分析錯誤日誌,負載和內存狀態等等。 還包括用戶行為。
代碼發布期間,運維組使用IRC-based頁面系統,可以通過facebook/email/irc/im/sms ping每一個工程師,如果需要他們注意的話。 對運維組不做回應是一件很羞愧的事。
代碼一旦發佈到第9級,並且穩定運行,就算發布成功了。
如果一個特性沒有按時完成,也沒什麼大不了的,下次完成時一併發布即可。
如果被svn-blamed,public shamed或工作經常疏忽就很可能被開除。 "這是一個高效的文化"。 不夠高效或者不夠聰明的員工會被剔除。 管理層會在6個月的時間裡觀察你表現,如果不合格,只能說再見。 每一級都是這個待遇,即使是C級別和VP級別,如果不夠高效,也會被開除。
被責罵不會導致解僱。 我們特別尊重別人,原諒別人。 大部分高級工程師都或多或少犯過一些嚴重的錯誤,包括我。 但沒有人因此被解僱。
我也沒有遇到過因為上面提到過的犯錯誤而被解僱。 有些人犯了錯,他們會非常努力地去修復,也讓其他人得到了學習。

--EOF--
若無特別說明,本站文章均為原創,轉載請保留鏈接,謝謝

reference : http://blog.leezhong.com/translate/2011/01/18/how-facebook-ships-code.html

wibiya widget