2011年6月30日 星期四

Python 3.3 將停止支援 OS/2, Windows 2000 以及 VMS

原文網址: Python 3.3 to Drop Support for OS/2, Windows 2000, and VMS

每隔一段時間, 我們會依據使用的狀況來縮減支援作業系統列表. 除此之外, 由於必須有人可以完成開發的工作來保證產生品質良好的發行版本, 平台上有足夠的開發人員數量也是一個很重要的考量. 像是作業系統的年紀, 以及作業系統的開發是否有遭遇到阻礙等等的其他因素, 也將會是考量的一部分.

Victor Stinner 最近在他提出了對 OS/2 支援的 最初問題 的一年之後, 提議 CPython 停止支援 OS/2 和 VMS. Victor 的詢問來自他似乎不停的花力氣在處理 Unicode 的問題上面, 尤其是 os.execvpe() 在透過 PEP 383 中的 surrogateescape handler 來支援環境變數的問題. OS/2 和 VMS 目前沒有開發團隊的代表人, 而且在發行的過程當中也沒有收到任何測試.

在寫這篇文章的過程當中 讓我想到 了從前關於移除支援 Windows 2000 的 討論, 不過之前的討論似乎被擱置了. 在當時, 將 COMSPEC 設定為 command.com 的系統也被提出要不再繼續支援. 現在開始, 他們都加入了 OS/2 和 VMS 的行列. 為了要讓開發更容易一些, Windows 2000 將會被移除, 這樣就不需要考慮那些在 2010 年結束生命的作業系統當中的老舊 API 了.

為了要開始移除對這些作業系統的支援, Victor 跟我從更新 PEP 11 開始.

PEP 11

這份 PEP 列出了不再繼續支援的作業系統, 並且解釋了把作業系統增加到這份 list 的過程.

當一個作業系統開始進入移除程序, 它將會被正式的被宣告為不再繼續支援. 這份公告通常都是在開發中的版本生效, 所以將從 Python 3.3 開始取消對於 OS/@, Windows 2000 以及 VMS 的支援.

第一個階段僅僅是袖手旁觀, 大概就像是舉起白旗一樣. 這告訴大家目前沒有人可以繼續維護程式碼並確定會有一份有品質的發行版本. 為了警告使用者這份平台將不再繼續被支援, 編譯以及安裝的過程也將可能被改變. 在 "What's New" 當中也會被註明有哪些平台將不再繼續被支援.

在一個發行周期之後, 之後的版本將會進入移除程式碼的過程. 在這次的例子來看, 程式碼可以在 3.4 版被移除. 儘管不一定所有的程式碼都會被移除, 但是開發者可能會移除任何 #ifdef, configure 或是其他過期的程式碼.

你能夠做什麼

如果你是一個 OS/2 或 VMS 的使用者, 你能夠作到這幾件事情來拯救你的平台.

成為一個維護者

一個積極的開發者就是最棒的支援. Andrew MacIntyre 成為 OS/2 的維護者有很長的一段時間了, 他在 Victor 第一次提問的時候就說過了 OS/2 對於 Unicode 的支援已經很落後了, 所以這毫無疑問的是一個需要注意的地方. VMS 目前可以從 http://www.vmspython.org 獲得一些外部的支援, 不過就如同在 issue 11918 當中討論過的, 我們還是需要某人站出來讓 VMS 上游的支援繼續下去.

如果你想要接手這兩個平台之一, 請參考 developer's guide 看看目前的發展狀況.

貢獻一台 build slave

有積極開發者的平台會有比較大的機率存活, 有 build slave 的平台存活機率將會更高. 不僅僅是存活的機會變高而已, 品質也會受到保障.

Python 使用 Buildbot 來做持續整合, bulid slaves 目前有提供 Linux, Mac, Windows, 以及 Open Indiana (Solaris) 各種不同平台, 配置的版本. 貢獻一台建構 OS/2 或是 VMS 的機器將可以讓這些平台接受到如同其他主流平台一樣的關注.

如果你可以提供你的時間或是硬體來幫助 OS/2 和 VMS 繼續存活下去, 請和 python-dev 的郵件列表連繫, 我們會協調看看你能做些什麼.

2011年6月19日 星期日

urllib/urllib2 安全性問題修正

原文的網址 urllib Security Vulnerability Fixed

Guido van Rossum 針對 CVE-2011-1521 中提到的 Python URL 程式庫安全性問題 最近送了一份修正. 儘管很少有安全性上的問題, 這是個讓社群了解到當問題產生時要如何報告, 處理以及修正的好機會.

報告問題

如果你在 CPython 當中發現安全性問題, 我們首先希望你隱藏問題的細節. 在確定你發現了一個真正的安全性問題之後, 產生一份簡潔但是詳細的報告是將你所知道的狀況傳達給核心開發人員的關鍵.

一份好的報告清楚的解釋這個問題會影響到系統當中的哪些相關部份. 如果這個問題發生在特定的平台或是由於相依性造成, 報告這些也會有幫助. 儘管這個漏洞通常都會在所有的有效版本當中被測試, 報告有哪些版本被影響也會有幫助. 最後, 如果你有測試資料可以重現這個問題, 也請在報告當中附上. 請將你的報告寄到 security@python.org.

在 Google Security Team 的 Niels Heinen 最近 提交了一份很好的報告. 他發現到在標準程式庫 urlliburllib2 模組當中關於 HTTP 302 處理重導的問題. 伺服器可能會將重導的要求轉至不適當的地方, 這種情況可能會造成對資料或是系統的危害. 在他的報告當中, Neils 解釋了兩種會顯露出這個問題的狀況.

首先, 由於 urllib/urllib2 支援處理 file:// 的 URL, 對於 file:///etc/passwd 的重導將會暴露出密碼資料. Neils 也解釋了重導到像是 file:///dev/zero 的系統設備可能會導致系統資源的耗損, 造成阻斷服務攻擊.

處理報告

由於安全性報告相當敏感, 僅有少數可被信賴的開發者維護著 security@python.org 的列表, 他們將會盡快地處理這些報告. 如果你希望將你傳輸的報告加密, 請參考 security news 頁面中關於 OpenPGP 的細節.

如果確定了的確有一個安全性問題, 一份公開的 bug 報告將會隨著一份修正被釋出. 在這個案例中, Guido van Rossum 在 issue #11662 當中公開了這個問題, 並且伴隨著一份修正.

解決問題

Guido 的修正所做的是限制重導只能夠重導到 http://, https:// 以及 ftp://. FTP 重導原本就被視為可接受, 它是個相當常見的重導: 鏡像下載系統會把下載的要求重導到比較近的 FTP 伺服器.

對於 Python 2.x 來說, FancyURLopenerredirect_internal 方法現在會在重導到不恰當的 URL 時產生 IOError 例外. HTTPRedirectHandlerhttp_error_302 也會作同樣的事情, 它將會產生 HTTPError 例外. 在 Python 3 當中, urllib.request 也有同樣的修正. 在這份修正中, 也包含了兩份會重導到合法以及不合法 URL 的實際測試.

對於接受修正的使用者, Python 2.5 最終的安全發行版將會很快的釋出. 儘管對於 2.6, 2.7, 3.1 以及 3.2 這些其他的維護分支來說, 目前還沒有預定的修正日期, 但是這些版本都已經收錄解決此問題的修正.

2011年6月8日 星期三

2011 Python 語言高峰會簡報

原文網址 2011 Language Summit Report

今年的Python語言高峰會(Language Summit)是在三月十日禮拜四(在PyCon的前一天)舉辨在亞特蘭大。 參與的成員來自各個跟Python有關的專案,比如說: CPython, PyPy, Jython, IronPython,以及 Parrot VMs ; Fedora, Ubuntu, 以及 Debian 的套件開發成員; Twisted 以及其它專案的成員。

開發狀況部落格

由於 python-dev mailing-list 流量十分龐大,Doung Hellmann( PSF 的Communications Officer),打算開一個部落格讓 使用者可以用比較輕易的方式得到python的開發新聞 (就是你現在看到的這個)。主題內容打算包括 PEP( Python Enhancement Proposal ),未來走向,新功能,還有重要的bug fix。 也將會包含開發流程的的改變。

這個部落格接受各種Python的實作品來發表文章,比如說儘管PyPy已經有了 自已的部落格 。 但依然歡迎在這裡發表新聞。 經過一陣相關的討論之後,我們把其它的實作品也放在 python.org 的下載頁裡了 。 這些新的實作在釋出的時後,也同時會在 python.org官方首頁 裡同步更新。

相容性警告

在3.2版的Python 裡,我們引進了 ResourceWarning 來幫助使用者找到依賴 CPython 引用計數( reference counting ) 的程式碼。這個警告不只是要幫助使用者寫出更好的程式碼, 更可以讓使用者寫出更安全的跨VM實作品的程式碼,為了更進一步強化各種VM實作品之間的相容性, 我們提出了新型態的警告: CompatibilityWarning.

這個想法會被提出是起源於一個被PyPy開發者所發現的CPython Bug。 Issue #11455 敘述 CPython 允許使用者可以自定出 __dict__ 的key不為字串的型態。 而PyPy 及Jython 目前並不支持這種做法。理想上來說,使用者可以開啟警告來發現這種狀況,就如同 ResourceWarning 的作法一樣。

獨立標準函式庫

在 CPython 從 Subversion 轉移到了 Mercurial 之後,把Python 的標準函式庫抽離開來另外維護的想法又被提了出來。 其他的Python實作品的開發者對這轉變非常感與趣,因為這可以大大的簡化他們現在的工作流程。 現在的流程會抽出 CPython 某一個時間點的標準函式庫,為這些函式庫上些實作相關的 patch,再把 C 的 extension 換成完全 使用 Python寫的版本。

目前正在計畫把這樣的轉變寫在以後的PEP 裡。 其中有個討論是該如何訂出版號。由於標準函式將會獨立於各種實作之外,所以最可能的方向是有自已獨立的版本, 但因此,做測試時就要顧及直譯器版本,而不能像以前一樣,只要測試同時發佈的Python 直譯器就可以了。

另一個關於標準函式庫的話題是關於那些同時另外有一份C 語言 extension 的模組。 PyPy 中的一位成員,Maciej Fijalkowski 提到隨著時間的演進,這些模組之間的功能已經所差無幾了。既然有打算把標準函式獨立出去, 希望這種模組的更動可以嚴格一點,以免造成太大的負擔。也希望只有在效能太過低落的時候,才引進C 語言 extension。

效能測試

PyPy 效能研究中心( PyPy Speed Center ),很清楚的展示了PyPy 的效能強大的地方。 所以開始討論 python.org 也可以有一個類似的網站。比如像是 performance.python.org 這種名字。 而且也會評估其他各式Python 實作品的效能。除了效能之外,記憶體的使用量,語言的相容性也應該展示出來。 這將會花費不少功夫在建立基本設施上來測試各種 Python 實作品,如同現在PyPy 跟 CPython 的比較。

奧瑞岡州(Oregon) 大學Open Source 實驗室 服務的 Allison Randa 將會主持這些效能測試。 這樣子的測需要許多高效能的主機,Jesse Noller 歡迎大家捐贈機器。 有興趣的朋友,請送到 Python Software Foundation 並且看一下我們的 捐贈頁面 , 來了解我們的需求。

解除Python 3.3 的束縛

從CPython 3.3開始,我們不再凍結語言本身的變化。儘管水庫的閘門已經打開了,我們會放慢改變的速度,以期讓其它語言的實作品可以趕上Python 3.X 的進度。 目前 IronPython 以及 PyPy 已經是 2.7 相容了。而 IronPython 已經向Python 3.x 相容邁進。

3.3 預期會接納 PEP 380 , 這個 PEP 引入了新的語法,``yield from <expr>``,讓generator 可以``yield`` 另一個generator。除此之外,Python語言近期內不會有改變。

例外屬性

下一個討論的主題是讓例外(exception)提供更有的意義的屬性, 而不是讓使用者單單只靠字串訊息來判斷情勢。 比如說,當遇到ImportError時,以往要分析錯誤訊息才知道道是那個模組import 失敗了。如果可以簡單地知道是什麼模組import 發生了錯誤才是實用的做法。

實做上可能只會使用Keyword 參數來初使化這些例外物件,目前已經有現成的 ImportError Patch 可以參考。

開發者協定

我們也提到了開發者協定( Contributor Agreements ), 目前已有了大概的雛型。 其中一個啟發我們的是Google的 個人開發者協定 這個議題已經被討論了很久,很多人很期待可以明確的訂定這個協定。除此之外,我們也會確保在美國之外,這個協定也可以保持效用。

Google Summer of Code

Martin von Löwis 花了一分鐘介紹了今年的Google Summer of Code,開發者不只可以扮演導師,更可以提出你想做的計畫來讓學生完成。 而且提出計畫的人也不一定要指導學生。如果你有興趣幫忙的話,請看 PSF 的 尋求點子及導師.

Distutils

Distutils2 即將完成, Tarek Ziadé 提到他們下一次衝刺的目標是完成Python 3 的移植以及合併回標準函式庫。除此之外,合併後將會改成一個新名字,``packaging``, 這個 packaging 團隊還會計畫提供獨立的套件叫做 Distutils2,來持續支援 Python 2.4 到 3.2。

這個計畫目前非常成功,目前的結果在 Bitbucket, 且正在等待 合併回標準函式庫。

其他實作品的未來藍圖

IronPython 提及到了他們的未來計畫而且他們將會立即著手3.x版的開發。 他們在PyCon 上發佈了2.7 版。 2.7 版是他們的第一個基於社群的版本,因為這個計畫已經從微軟接手了過來。而且在在這幾個月內往3.x 版邁進。

Jython 最近才剛發佈了 2.5.2版,而且開始計畫 2.6版。由於2.6版和2.7版的差別不大,一些人計畫跳過2.6版,直接開發2.7版。 但是這麼做的話,開發的時程會拉得比較長。基於早點發佈,時常更新的哲學。Jython不太可能從2.6 跳到3.x 版。而會穩當地開發2.6版及2.7版。

開發讚助

讚助開發工作有機會可以讓那些不同的Python實作品加速他們的實作到相容3.x的地步。當有讚助後, 請把計畫提到PSF,才有機會可以運用那些讚助。 那些有興趣收受讚助的團體,請聯詻PSF。

基本款的Python

Jim Fulton 開始討論到他稱之為基本款(baseline) 的Python。在他佈署Python程式的經驗之中, 有太多不可預期的狀況發生。由於有 Ubuntu/Debian 的 packaging 專家,我們才可以知道問題的全貌與由來。

以Fedora 上所安裝的Python 的情況的來說,Python 以 Live CD 可以正常運作為目標,所以只安裝非常小的部份。 資料夾的位置也有所不同,比如說有一些函式庫從標凖函式庫之中移除了( 像是 distutils ),或是有一些 發行的版本提供了老舊的函式庫。

這件事還沒有明確的解法,但相關的人士已經在著手處理這個問題。

3.3 新功能

開始提到 3.3 的特色。包含了 兩個PEP :

PEP 382 , 有命名空間( name space )的套件.也討論到該怎麼和 distutils 整合。

也討論到 PEP 393, 一個較有彈性的內部字串表示。 這吸引了一些學生想在GSoC參與這個project。不過在實做上,但也要考慮效能及記憶體管理,才有可能被Python Foundation 接受。

Unladen Swallow

Unladen Swallow 現在處在"停工"的狀態,未來也不會包含在 CPython 3.3之中。 為了讓這個計畫可以有所進展,由於目前沒有專門的人來負責。 我們需要更多成員來加入這個計畫。也討論到如果需要資助才有辨法將 Unladen Swallow 的品質提昇到更高的層次的話。請有興趣的組織聯絡 PSF

雖然 Unladen Swallow 正在停工中且不確定未來走向。這個計畫還是對 Python 及其他一般 的開源計畫有很大的幫助,比如說Unladen Swallow 的效能測試可以拿來測其他語言的實作品。 Unladen Swallow 的開發者也對 LLVM 及 Clang,提供了很多的貢獻。

別的效能提昇的想法也被簡短地提到了。包括了 Dave Malcolm 的函式inline 的想法。 Martin von Löwis 提到了他正在著手的即時編譯(JIT)的擴充模組,儘管PyPy的開發者對 這一種即時編譯的效果存有疑問。

邁向非同步的開發框架(frameworks)

今天的最後一項討論是把Twisted 整合進標準函式庫裡。主要的想法的想法是想要有另一個類似 asyncore 的模組, 可以讓Twisted 或其它的非同步的框架可以較容易整合進來。

這個過程也會被寫進PEP裡面,一些人建議可以把這個PEP寫得像是WSGI一樣,但是對象是針對非同步的事件。 除了這篇PEP的作者之外,Twisted 專案以及其他的類似計畫的人都會花費心力一起完成這個Proposal。

更多資訊

想知道更多的資訊的話,請看CPython 的開發人員 Nick Coghlan 的 rough noteshighlights.

2011年6月2日 星期四

Python 3.3 中,幫助除錯的新模組-- faulthandler

原文網址 New faulthandler module in Python 3.3 helps debugging

當一名使用者跟你回報你的程式當掉或是卡住不動了,有的時候你只能盡力收集程式運行時資料, 並且確立使用方式來重現當時的狀況。 但就算你已經很清楚使用者如何使用你的程式,你也常常無法重現一樣的症狀,因為使用者的執行環境跟你的不一樣, 比如說作業系統或是編譯器的不同。如果運氣夠好的話,使用者可以安裝除錯工具,但大部份的情況下你只能期待另一個人在出了一樣的錯後能提供更多資訊來幫助你找到問題的根源。

嚴重錯誤

Python 3.3 加入了一個新的模組 faulthandler 來幫助程式設計師面對這個問題。 faulthandler 讓你在發生嚴重錯誤 時可以追朔執行過的程式碼。比如說數學運算時,分母為零( division by zero) 、異常中止( abort )、匯流排錯誤( bus error )。 你可以在你程式中使用 faulthandler.enable() 來開啟這個功能。或是在Python啟動時指定 -X faulthandler 這個選項。又或著是設定 PYTHONFAULTHANDLER=1 這個環境變數。 開啟後,程行遇到問題當掉後就可以看到類似下面的畫面:

Fatal Python error: Segmentation fault

Current thread 0x00007f7babc6b700:
  File "Lib/test/crashers/gc_inspection.py", line 29 in g
  File "Lib/test/crashers/gc_inspection.py", line 32 in <module>
Segmentation fault

運行超時( Timeout )

faulthandler 也可以偵測程式執行超時( timeout )。使用 faulthandler.dump_tracebacks_later(later) 來開始計算程式的運作時間, faulthandler.cancel_dump_tracebacks_later() 可以停止計時。 當執行超時發生,的產生的結果如下:

Timeout (0:01:00)!
Current thread 0x00007f987d459700:
  File "Lib/test/crashers/infinite_loop_re.py", line 20 in <module>

使用 repeat=True ,則每一次超出執行時間都會印出如上的畫面,或著指定 exit=True 來立刻關閉程式。 但這比較不安全,比如說這樣做沒有確實清空檔案的緩衝區。

由發出訊號來觀察執行狀況

我們更可以靠發出訊號給程式來追朔執行狀況,你可以用 faulthandler.register(signal) ,指定用發出訊號的方式趨使程式印出程式的執行狀況。 比如說在 UNIX上,你可以使用 SIGUSR1 : kill -USR1 <pid> 來讓你的程式印出當時的情況。 不過windows 是沒有這個功能的。 輸出會如下:

Current thread 0x00007fdc3da74700:
  File "Lib/test/crashers/infinite_loop_re.py", line 19 in <module>

另外,你可以用 faulthandler.dump_traceback() 來在任何時候自已印出執行狀況。

安全性考量以及所用的輸出檔案

由於安全性的考量 faulthandler 預設是關閉的。 會這麼做的主要原因是它會輸出結果到 sys.stderr 但如果sys.stder 被關閉了,且 sys.stderr 檔案描述子( file descriptor )被重用了, 我們的執行狀況就會被輸出到其他的地方,像是管線 (pipe)、socket、 或是某些檔案。這樣有可能讓存在程式中的敏感資料無意間洩露出去。 faulthandler 預設是使用 sys.stderr ,不過你可以選擇別的檔案。參考 faulthandler documentation 來了解更多的資訊。

舊的Python 也可以用

faulthandler 將會以第三方模組的型式放在 PyPI 上, 並且支援 Python 2.5 到 3.2。 但與3.3版相較,最大的不同是在 dump_tracebacks_later 的實作上: Python 3.3 使用執行緒並且運用一個有time out 機制的 lock。 而第三方函式庫實作的版本是使用 SIGALRM 以及 alarm()

Lock timeout 是 Python 3.3 的新功能,它計算時間的精準度可以達到百萬之一秒。 而使用 alarm() 的舊版 Python 的計時精準度只能達到秒的程度。 而且使用 SIGALRM 有可能中斷正在執行的系統呼叫( system call ),產生 EINTR 錯誤 (譯注: 關於 EINTR, 可以參考這篇 Python - Pipe 在 Signal 發生時的處理事項 ) 。

它真的有用

這個新的 faulthandler 模組已經幫助我們找到我們自已的編譯程式中存在的 race conditions。我們期望這也可以為你帶來幫助。