
其實,不只是iPad,手機也可以。
痛點
我組織過幾次線下程式設計工作坊,帶著同學們用Python處理資料科學問題。
其中最讓人頭疼的,就是執行環境的安裝。

實事求是地講,參加工作坊之前,我已經做了認真準備。
例如整合環境,選用了對使用者很友好的Anaconda。
程式碼在我的Macbook電腦上跑,沒有問題。還拿到學生的Windows 7上跑,也沒有問題。這才上傳到了Github。
在釋出的教程文章裡,我也已經把安裝軟體包的說明寫得非常詳細。

還針對 Anaconda 這一 Python 執行環境的安裝和執行,專門錄製了視訊。

但是,工作坊現場遇見的問題,依然五花八門。
有的是作業系統。例如你可能用Windows 10。實話實說,我確實沒用過。拿著Surface端詳,連安裝後的Anaconda資料夾都找不到在哪兒。
有的是編碼。不同作業系統,有的預設中文編碼是UTF-8,有的是GBK。同樣一段中文文字,我這裡顯示一切正常,你那裡就是亂碼。
有的是套件路徑。來參加工作坊前,你可能看過我一些教程,並安裝了 Python 2.7 版本 Anaconda。來到現場,一看需要 Python 3.6 版本,你就又安裝了一份新的。結果執行起來,你根本分不清執行的 Python, pip 命令來自哪一個套件,更搞不清楚軟體包究竟安裝到哪裡去了。再加上虛擬環境配置,你就要抓狂了。
還有的,甚至是網路擁塞問題。因為有時需要現場安裝呼叫體積龐大的軟體包,幾十臺電腦“預備——齊”一起爭搶有限的Wifi頻寬,後果可想而知。
痛定思痛,我決定改變一下現狀。
目前的教程只提供基礎原始碼。對於許多新手同學來說,是不夠的。
許多同學,就倒在了安裝依賴軟體包的路上,繼而乾脆放棄了。
變通的辦法有許多。例如干脆錄製程式碼執行視訊給你看。
但是正如我在《MOOC教學,什麼最重要?》一文中說過的,學習過程裡,反饋最重要。
你需要能執行程式碼,並且第一時間獲得結果反饋。
在此基礎上,你還得能修改程式碼,對比前後執行結果的差別。
我得給你提供一個直接可以執行的環境。
零安裝,自然也就沒了上述煩惱。
這個事兒可能嗎?
我研究了一下,沒問題。
只要你的裝置上有個現代化瀏覽器(包括但不限於Google Chrome, Firefox, Safari和Microsoft Edge等)就行。
IE 8.0?
那個不行,趕緊升級吧!
讀到這裡,你應該想明白了。因為只挑瀏覽器,不挑作業系統,所以別說你用Windows 10,你就是用iPad,都能執行程式碼。
嘗試
請你開啟瀏覽器,輸入這個連結(http://t.cn/R35fElv)。
看看會發生什麼?
我這裡用iPad給你演示。
一開始會有個啟動介面出來。請你稍等10幾秒鐘。

然後,你就能看到熟悉的Python程式碼執行介面了。

這個介面來自 Jupyter Lab。
你可以將它理解為 Jupyter Notebook 的增強版,它具備以下特徵:
- 程式碼單元直接滑鼠拖動;
- 一個瀏覽器標籤,可開啟多個Notebook,而且分別使用不同的Kernel;
- 提供實時渲染的Markdown編輯器;
- 完整的檔案瀏覽器;
- CSV資料檔案快速瀏覽
- ……
圖中左側分欄,是工作目錄下的全部檔案。
右側開啟的,是我們們要使用的ipynb檔案。
為了證明這不是逗你玩兒,請你點選右側程式碼上方工具欄的執行按鈕。
點選一下,就會執行出當前所在程式碼單元的結果。
不斷點選下來,你可以看見,結果都被正常渲染。

連影象也能正常顯示。

甚至連下面這種需要一定運算量的視覺化結果,都沒問題。

為了證明這不是變魔術,你可以在新的單元格,寫一行輸出語句。
就讓Python輸出你的名字吧。
假如你叫 Chuck,就這樣寫:
print("Hello, Chuck!")
複製程式碼
把它替換成你自己的姓名,看看輸出結果是否正確?

其實,又何止是iPad而已?
你如果足夠勇(sang) 於(xin) 嘗(bing) 試(kuang),手機其實也是可以的。
就像這樣。

流程
下面我給你講講,這種效果是怎麼做出來的。
我們需要用到一款工具,叫做 mybinder 。它可以幫助我們,把 github 上的某個程式碼倉庫(repo),快速轉換成為一個可執行的環境。
注意 mybinder 為我們提供了雲設施,也就是計算資源和儲存資源。因此即便許許多多的使用者同時線上使用同一份程式碼轉換出來的環境,也不會互相沖突。
我們先來看看,怎麼準備一個可供 mybinder 順利轉換的程式碼倉庫。
我為你提供的樣例在這裡(t.cn/R35MEqk):

順便說一句,這個樣例來自於我的資料科學系列教程之《如何用Python處理自然語言?(Spacy與Word Embedding)》。感興趣的同學可以點選連結,檢視原文。
在該 GitHub 頁面展示的檔案列表中,你需要注意以下3個檔案:
demo.ipynb
environment.yml
postBuild
其中demo.ipynb
就是你在上一節看到的包含原始碼的Jupyter Notebook檔案。你需要首先在本地安裝相關軟體包,並且執行測試通過。
如果在你本地執行都有錯誤,放到雲上去,想必也難以正常執行。
environment.yml
檔案非常重要,它來告訴 mybinder ,需要如何為你的程式碼執行準備環境。
我們開啟看看該檔案的內容:
dependencies:
- python=3
- pip:
- spacy
- ipykernel
- scipy
- numpy
- scikit-learn
- matplotlib
- pandas
- thinc
複製程式碼
這個檔案首先告訴 mybinder ,你的 Python 版本。我們採用的是 3.6 版。所以只需要指定 python=3
即可。mybinder 會自動為你下載安裝最新的。
然後這個檔案說明需要使用 pip 工具安裝哪些軟體包。我們需要把所有依賴的安裝包都羅列出來。
這就是之前,我總在教程裡給你說明的那些準備步驟。
但是這還沒有完,因為 mybinder 只是為你安裝好了一些軟體依賴。
這裡還有兩個步驟需要處理:
- 為了分析語義,我們需要呼叫預訓練的Word2vec模型,這需要 mybinder 為我們提前下載好。
- Jupyter Notebook 開啟後,應當使用的 kernel 名稱為 wangshuyi ,這個 kernel 目前還沒有在 Jupyter 裡面註冊。我們需要 mybinder 代勞。
為了完成上述兩個步驟,你就需要準備最後一個postBuild
檔案。
它的內容如下:
python -m spacy download en
python -m spacy download en_core_web_lg
python -m ipykernel install --user --name=wangshuyi
複製程式碼
跟它的名字一樣。它是在 mybinder 依據 environment.yml
安裝了依賴組建後,依次執行的命令。如果你的程式碼需要其他的命令提供環境支援,也可以放在這裡。
至此,你的準備工作就算結束了。
魔法表演正式開始。
請開啟 mybinder 的網址(mybinder.org/)。

在 “GitHub repo or URL” 一欄,填寫我們的 github 程式碼倉庫連結,即:
https://github.com/wshuyi/demo-spacy-text-processing
複製程式碼
我們希望一進入介面,就自動開啟 demo.ipynb
,因此需要在“Path to a notebook file (optional)”一欄填寫demo.ipynb
。
這時,你會發現“Copy the URL below and share your Binder with others:”一欄中,出現了你的程式碼執行環境網址。
https://mybinder.org/v2/gh/wshuyi/demo-spacy-text-processing/master?filepath=demo.ipynb
複製程式碼
點選右側的“複製”按鈕儲存到你的記事本里面。將來找到你轉換好的執行環境,就全靠它了。
妥善儲存地址後,點選“Launch”按鈕。

根據你的依賴安裝包數量等因素,你需要等待的時間長短不一。但是隻有第一次構建的時候,需要花一些時間。
以後每一次呼叫執行,就都會非常快了。
構建完畢後, mybinder 會自動為我們開啟對應的執行環境。

很有成就感吧!
測試一下,能夠正常執行程式碼,就證明我們成功了。
但是你會發現,不對啊!
老師你剛才用 iPad 展示的,不是高階版的 Jupyter Lab 嗎?怎麼又變成了 Jupyter Notebook 了?
我也想要高階版!
彆著急。
看看你目前的連結地址:
https://mybinder.org/v2/gh/wshuyi/demo-spacy-text-processing/master?filepath=demo.ipynb
複製程式碼
你只需要做個小小的調整,將其中的:
?filepath=
複製程式碼
替換為:
?urlpath=lab/tree/
複製程式碼
替換後的連結為:
https://mybinder.org/v2/gh/wshuyi/demo-spacy-text-processing/master?urlpath=lab/tree/demo.ipynb
複製程式碼
把它輸入到瀏覽器,看看出來的結果:

這下沒問題了吧?
原理
你是不是覺得,mybinder 很黑科技?
其實,也不算。
它只是把已有的幾項技術,連結了起來。
這大概也算是“積木式創新”的一個例項吧。
我們看看 mybinder 的說明:

可以看到,其中最為關鍵的技術,是用了 docker 。
Docker 是個什麼東西呢?
簡單來說,Docker 就是為了不同平臺上,都能夠順利執行同一份程式碼的保障工具。
你有些猶疑,這說的不是 Java 嗎?
沒錯,Java 的宣傳口號,就是一次編碼,各處執行。
它利用虛擬機器,來保障這種能力。

但是,如果你經常使用 Java 開發出來的工具,就應該瞭解痛點有哪些了。
至少,你應該對 Java 程式的執行速度,有一些體會。

上圖中,左側是虛擬機器,右側是Docker。
Docker 不但效率上要強過 Java 虛擬機器,而且它支援的程式語言也不僅僅是一種。
至於其他好處,我們們就不展開了。否則聽起來像廣告。
其實,把 github 程式碼倉庫轉換為 docker 映象(image)的工作,也不是 mybinder 自己來做的。
它呼叫的,是另外的一個工具,叫做 repo2docker(github.com/jupyter/rep…) 。

而你的瀏覽器能夠執行 Python 程式碼,是因為 Jupyter Notebook (或者Lab)本來就是建立在“瀏覽器/伺服器”(Browser / Server, B/S)結構上。
如果你已經在本地計算機安裝過 Anaconda ,那不妨看看本地執行這個語句:
jupyter lab
複製程式碼
會出現什麼?

對,它開啟了一個伺服器,然後開啟你的瀏覽器,跟這個伺服器通訊。
Jupyter 的這種設計,本身就讓它的擴充套件極為方便。
無論 Jupyter 伺服器是執行在你的本地筆記本上,還是擺在另一個大洲的機房,對你執行 Python 程式碼來說,都是沒有本質區別的。
另外,如果你以為 mybinder 只能讓你在瀏覽器上跑 Python 程式碼,那就太小瞧它了。
學過 R 的同學,請點選這個連結(t.cn/R3JLY2S),看看有什麼驚喜。
小結
總結一下,本文為你講述了以下內容:
- 如何利用 mybinder ,把一個 github repo 一鍵轉換成 Jupyter Lab 執行環境;
- 如何在各種不同作業系統的瀏覽器上,執行該環境,編寫、執行與修改程式碼;
- mybinder 轉換 github repo 的幕後英雄 docker 簡介。
我希望你能想到的,不僅僅是這點兒簡單的用途。
提幾個問題給你,作為思考題:
- 如果程式碼執行都在雲端完成,教學實驗室機房還有沒有必要預裝一大堆軟體,且不定期更新維護?
- 學校的程式設計練習、作業和考試有沒有可能通過這種方式,直接遠端進行,並且自動化評分?
- 既然應用的技術都是開源的,你有沒有可能利用這些開源工具搞個創業專案。例如提供深度學習環境,租賃給科研機構與創業公司?
期待你舉一反三,做出有趣又有意義的創新來。
討論
在 iPad 上執行 Python 程式碼的感覺怎麼樣?你用過類似的產品嗎?你覺得有了這種技術,在日常工作和學習中,還可以有哪些有趣的應用場景?歡迎留言,把你的經驗和思考分享給大家,我們一起交流討論。
如果你對我的文章感興趣,歡迎點贊,並且微信關注和置頂我的公眾號“玉樹芝蘭”(nkwangshuyi)。
如果本文可能對你身邊的親友有幫助,也歡迎你把本文通過微博或朋友圈分享給他們。讓他們一起參與到我們的討論中來。