使用 Binder 將公開的 GitHub Repository 轉換為可互動、可執行程式碼並能在瀏覽器上一鍵啟動的 JupyterHub 伺服器,讓我們可以快速地建造出方便分享的教學環境。
- Python 3.6 JupyterLab
- Python 3.7 Jupyter Notebook
- R 3.6 JupyterHub
- R 3.6 RStudio
使用 Binder 與 GitHub 的動機
最近將原本教學大量使用的 Google Colab 轉移到了 Binder 上,起心動念的原因在於雖然 Google Colab 已經提供一個可以即時互動的筆記本環境,但是在檔案、環境與終端機的支援上還是略有不足,譬如檔案必須在每一次 Session 啟動後重新上傳、套件模組也同樣要在 Session 啟動後重新更新與安裝,而終端機的指令要透過筆記本儲存格的魔術指令(magic command !
)送出;所有這些跟筆記本環境設置(Configuration)相關的部分,都是想要改用 Binder 與 GitHub 的動機。
具體說來,我希望能夠不要在第一堂課花時間作「環境設定」,因為多數來修習將程式語言應用在資料分析領域的學員,對於終端機指令、虛擬環境或系統路徑的認識都不多,更別說每個人電腦五花八門的安裝現況(以 Python 來說就有 IDLE、PyCharm、Anaconda、VSCode 等);使用 Binder 與 GitHub 不但能夠跳過「環境設定」,還可以確保每個學員都在同樣的設置下執行課堂中的範例程式和隨堂練習。
什麼是 Binder
我目前使用的是部署於 mybinder.org、免費的 Binder,只要輸入公開的 GitHub Repository 網址,就可以即時啟動一個能夠分享給多人的雲端計算環境,將本來只能靜態展現的 Jupyter 筆記本轉換成為能夠在瀏覽器上執行、編寫的內容,運作原理大致有三個步驟:
- 輸入一個公開 GitHub Repository 網址
- Binder 會搜尋 Repository 中的環境設置檔案,例如 runtime.txt、requirements.txt、environment.yml 等,然後根據這些檔案的內容建立 Docker 映像檔
- Binder 會依據建立完成的 Docker 映像檔啟動一個 JupyterHub 伺服器
建立一個 Python 的 Binder
首先前往 GitHub 建立一個新的公開 Repository。
建立一個新的公開 Repository
接著將可以印出 Python 版本資訊的程式碼寫入 hello.py
並儲存在 Repository 之中。
# hello.py import sysmajor_version = sys.version_info.major minor_version = sys.version_info.minor print("Hello from Binder Python {}.{}!".format(major_version, minor_version))
將 hello.py
儲存在 Repository 之中
前往 mybinder.org 將 Repository 的網址輸入並點擊 launch 等待 JupyterHub 啟動。
將 Repository 的網址輸入並點擊 launch
在啟動的 JupyterHub 伺服器中新增終端機(New > Terminal)後執行 python hello.py
,觀察沒有 runtime.txt 時預設的 Python 版本為何。
觀察沒有指定 runtime.txt 時候的預設 Python 版本為何
接下來的操作會用到 Git 的分支概念,不熟悉的讀者可以放心地跳過,我們只是想透過同一個 GitHub Repository 設定不同 Python 版本的 Binder。
新增一個檔案 runtime.txt 在 Repository 之中,不過這次並不是在既有的 master 分支建立,而是儲存在取名為 3.6
的分支中。
# runtime.txt python-3.6
新增檔案 runtime.txt 在取名為 3.6
的分支中
前往 mybinder.org,這次除了將 Repository 的網址輸入以外,還要在 Git branch 的欄位輸入 3.6,才點擊 launch 等待 JupyterHub 啟動。
將 Repository 的網址與分支名稱 3.6 輸入才點擊 launch
在啟動的 JupyterHub 伺服器中新增終端機(New > Terminal)後執行 python hello.py
,觀察指定版本為 3.6 的 runtime.txt 是否有發揮作用。
觀察指定版本為 3.6 的 runtime.txt 是否有發揮作用
如果是習慣 JupyterLab 作為開發介面的使用者,可以將網址複製後加上查詢字串參數 ?urlpath=lab
就會啟動 JupyterLab。截至於此,我們簡單示範了如何使用 GitHub 分支與 Binder 建立了能在瀏覽器上一鍵啟動的 Python Jupyter 環境。
- Python 3.6 JupyterLab
- Python 3.7 Jupyter Notebook
建立一個 R 的 Binder
首先前往 GitHub 建立一個新的公開 Repository。
建立一個新的公開 Repository
接著將可以印出 R 版本資訊的程式碼寫入 hello.R
並儲存在 Repository 之中。
# hello.R r_version <- R.Version() r_version_str <- r_version$version.string sprintf("Hello from Binder %s!", r_version_str)
將 hello.R
儲存在 Repository 之中
BinderHub 預設的程式語言是 Python,因此必須先建立 runtime.txt 指定 R 語言的版本資訊,我們設定為 3.6 版本。
# runtime.txt r-3.6-2020-08-01
建立 runtime.txt 指定 R 語言的版本資訊
前往 mybinder.org 將 Repository 的網址輸入並點擊 launch 等待 JupyterHub 啟動。
將 Repository 的網址輸入並點擊 launch
在啟動的 JupyterHub 伺服器中新增終端機(New > Terminal)後執行 Rscript hello.R
。
觀察 R 語言版本為何
多數的 R 語言使用者習慣使用 RStudio 而非 JupyterNotebook 作為開發介面,只要將網址複製後加上查詢字串參數 ?urlpath=RStudio
就會直接啟動 RStudio;或者可以在 JupyterHub 首頁新增檔案時選擇 RStudio。
新增檔案時選擇 RStudio
截至於此,我們簡單示範了如何使用 GitHub 與 Binder 建立了能在瀏覽器上一鍵啟動的 R Jupyter 環境。