精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

青出于藍(lán)而勝于藍(lán),這是一款脫胎于Jupyter Notebook的新型編程環(huán)境

新聞 前端
不久前,fast.ai 創(chuàng)始研究員 Jeremy Howard 撰文介紹了 fast.ai 最近提出的新型編程環(huán)境 nbdev,它基于 Jupyter Notebook 構(gòu)建,并將 IDE 編輯器的優(yōu)點(diǎn)帶入 Jupyter Notebook,可以在 Notebooks 中開(kāi)發(fā)而不影響整個(gè)項(xiàng)目生命周期。

 不久前,fast.ai 創(chuàng)始研究員 Jeremy Howard 撰文介紹了 fast.ai 最近提出的新型編程環(huán)境 nbdev,它基于 Jupyter Notebook 構(gòu)建,并將 IDE 編輯器的優(yōu)點(diǎn)帶入 Jupyter Notebook,可以在 Notebooks 中開(kāi)發(fā)而不影響整個(gè)項(xiàng)目生命周期。

  • nbdev GitHub 地址:https://github.com/fastai/nbdev/
  • nbdev 文檔:https://nbdev.fast.ai/

「我認(rèn)為,nbdev 是編程環(huán)境的一項(xiàng)巨大進(jìn)步。」——Swift、LLVM 以及 Swift Playgrounds 創(chuàng)造者 Chris Lattner

近年來(lái),我和同事 Sylvain Gugger 一直為熱愛(ài)的事情而努力工作,它就是 Python 編程環(huán)境 nbdev。nbdev 允許用戶(hù)在 Jupyter Notebook 中創(chuàng)建包含測(cè)試和豐富文檔系統(tǒng)的完整 Python 包。我們已使用 nbdev 編寫(xiě)了一個(gè)大型編程庫(kù)(fastai v2)以及多個(gè)小型項(xiàng)目。

[[313799]]

本文作者、fast.ai創(chuàng)始研究員Jeremy Howard。

nbdev 系統(tǒng)適用于「探索式編程」(exploratory programming)。我們發(fā)現(xiàn),大多數(shù)程序員將大部分工作時(shí)間用在探索和試驗(yàn)上。比如我們會(huì)試驗(yàn)從未用過(guò)的新型 API,來(lái)理解其運(yùn)作原理;我們探索正在開(kāi)發(fā)的算法的行為,以查看其處理不同數(shù)據(jù)類(lèi)型的方式;我們探索不同的輸入組合,來(lái)調(diào)試代碼……

nbdev:探索式編程

我們認(rèn)為探索流程是有價(jià)值的,應(yīng)該保存下來(lái),以便其他程序員(或自己)在六個(gè)月時(shí)間之內(nèi)能夠看到發(fā)生了什么并通過(guò)示例學(xué)習(xí)。把它看作科學(xué)期刊,你可以利用它展示自己嘗試了什么東西(包括奏效的和無(wú)效的),和為了增強(qiáng)對(duì)工作系統(tǒng)的理解付出的努力。在探索過(guò)程中,你會(huì)發(fā)現(xiàn)你理解到的某些部分對(duì)于系統(tǒng)運(yùn)行非常關(guān)鍵,所以探索應(yīng)包含測(cè)試和斷言(tests and assertions)。

當(dāng)你基于 prompt(或 REPL)開(kāi)發(fā),或者使用 notebook-oriented 開(kāi)發(fā)系統(tǒng)(如 Jupyter Notebook)開(kāi)發(fā)時(shí),「探索」是最簡(jiǎn)單的。但這些系統(tǒng)的「編程」部分沒(méi)有那么強(qiáng)大。這也是人們主要使用這類(lèi)系統(tǒng)執(zhí)行早期探索,然后轉(zhuǎn)向 IDE 或文本編輯器的原因。

轉(zhuǎn)而使用其他系統(tǒng)是為了獲得 notebook 或 REPL 不具備的功能,比如:優(yōu)秀的文檔查找功能、優(yōu)秀的語(yǔ)法高亮功能、集成單元測(cè)試,以及(關(guān)鍵的)生成最終可分發(fā)源代碼文件的能力。

nbdev 將 IDE/編輯器開(kāi)發(fā)的優(yōu)勢(shì)帶入 notebook 系統(tǒng)中,以便用戶(hù)在 notebook 中完成開(kāi)發(fā),且不會(huì)影響整個(gè)項(xiàng)目生命周期。為支持此類(lèi)探索,nbdev 基于 Jupyter Notebook 構(gòu)建(這意味著,相比普通編輯器或 IDE,nbdev 能夠更好地支持 Python 的動(dòng)態(tài)特性),并針對(duì)軟件開(kāi)發(fā)添加了以下重要工具:

  • 遵循最佳實(shí)踐自動(dòng)創(chuàng)建 Python 模塊,如利用導(dǎo)出函數(shù)、類(lèi)和變量自動(dòng)定義 __all__;
  • 在標(biāo)準(zhǔn)文本編輯器或 IDE 中執(zhí)行代碼導(dǎo)航和編輯,并將所有更改自動(dòng)導(dǎo)出回 notebook 中;
  • 基于代碼自動(dòng)創(chuàng)建可搜索的超鏈接文檔,引號(hào)中的任意單詞均被超鏈接至合適的文檔,文檔站點(diǎn)的側(cè)邊欄可鏈接至每個(gè)模塊等等;
  • pip 安裝包(上傳到 PyPI);
  • 測(cè)試(在 notebook 中直接定義,可并行運(yùn)行);
  • 持續(xù)集成;
  • 版本控制和沖突處理。

下圖是 nbdev 真實(shí)源代碼中的一個(gè)片段,該片段即在 nbdev 中寫(xiě)成。

青出于蓝而胜于蓝,这是一款脱胎于Jupyter Notebook的新型编程环境

在 nbdev 源代碼中探索 notebook 文件格式。

如上圖所示,用這種方式構(gòu)建軟件時(shí),項(xiàng)目團(tuán)隊(duì)中的所有成員均可以從你為理解問(wèn)題域所做的工作中獲益,如文件格式、性能特點(diǎn)、API 邊緣案例(edge case)等。由于開(kāi)發(fā)過(guò)程在 notebook 中進(jìn)行,因此你還可以添加圖表、文本、鏈接、圖像、視頻等,這些將被自動(dòng)納入庫(kù)文檔中。定義代碼的單元格將被隱藏,并被標(biāo)準(zhǔn)化函數(shù)文檔代替,從而展示其名稱(chēng)、參數(shù)、文檔字符串和源代碼 GitHub 鏈接。

關(guān)于 nbdev 特性、安裝和使用的更多信息,參見(jiàn) nbdev 文檔:https://nbdev.fast.ai/。

下文將介紹構(gòu)建 nbdev 的原因以及 nbdev 設(shè)計(jì)原理背后的歷史和背景。首先,我們先來(lái)了解歷史。(如果你對(duì)此不感興趣,可以跳至「Jupyter Notebook 少了什么?」)

軟件開(kāi)發(fā)工具

大部分軟件開(kāi)發(fā)工具不是基于探索式編程創(chuàng)建的。大約 30 年前我剛開(kāi)始寫(xiě)代碼時(shí),瀑布軟件開(kāi)發(fā)幾乎處于壟斷地位。這種編程方法預(yù)先詳細(xì)定義整個(gè)軟件系統(tǒng),然后在編程時(shí)盡可能地靠近規(guī)格。那時(shí)我便認(rèn)為,這種方法并不適合我的工作方式。

1990 年代,事情出現(xiàn)變化,敏捷開(kāi)發(fā)開(kāi)始流行。人們開(kāi)始理解「大部分軟件開(kāi)發(fā)是迭代過(guò)程」這一現(xiàn)實(shí),并開(kāi)發(fā)出符合這一事實(shí)的工作方式。但是,當(dāng)時(shí)我們使用的軟件開(kāi)發(fā)工具并沒(méi)能完成變革,去匹配工作方式的改變。一些工具被添加到庫(kù)中,用來(lái)更輕松地執(zhí)行測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。但這些工具只是現(xiàn)有編輯器和開(kāi)發(fā)環(huán)境的輕度擴(kuò)展,并沒(méi)有真正去重新思考開(kāi)發(fā)環(huán)境應(yīng)該是什么樣子。

探索式測(cè)試是敏捷測(cè)試的重要組成部分,近年來(lái),人們對(duì)探索式測(cè)試的興趣逐漸增長(zhǎng)。我們絕對(duì)贊同這一點(diǎn),但我們認(rèn)為走的還不夠遠(yuǎn)。我們認(rèn)為在軟件開(kāi)發(fā)流程的每個(gè)部分中,探索都應(yīng)當(dāng)成為核心。

傳奇人物 Donald Knuth 走在時(shí)代前列,他想看到不同的開(kāi)發(fā)方式。1983 年,他提出了一種叫做「文學(xué)式編程」的方法,并將其描述為「結(jié)合編程語(yǔ)言和文檔語(yǔ)言,從而使寫(xiě)出來(lái)的程序比僅用高級(jí)語(yǔ)言編寫(xiě)的程序更加穩(wěn)健、更具可移植性、更容易維護(hù)、編寫(xiě)時(shí)更富有樂(lè)趣。其主要思想是將程序看作受眾為人類(lèi)而非計(jì)算機(jī)的文學(xué)作品。」

在很長(zhǎng)一段時(shí)間里我為這個(gè)想法而癡迷,但很不幸這個(gè)想法并沒(méi)有成功。因?yàn)檫@樣會(huì)致軟件開(kāi)發(fā)時(shí)間變長(zhǎng),沒(méi)人認(rèn)愿意付出這種代價(jià)。

將近 30 年后,另一位變革性的思想家 Bret Victor 表達(dá)了對(duì)當(dāng)時(shí)開(kāi)發(fā)工具的深刻不滿(mǎn),并描述了如何設(shè)計(jì)「理解程序的編程系統(tǒng)」。他在突破性演講「Inventing on Principle」中表示:「我們現(xiàn)在的計(jì)算機(jī)程序概念是一串文本定義,你把它們傳遞到基于 1950 年代末 Fortran 和 ALGOL 直接得到的編譯器。但是 Fortran 和 ALGOL 語(yǔ)言是為穿孔卡片設(shè)計(jì)的啊。」

他提出了完善的示例,以及多項(xiàng)編程系統(tǒng)設(shè)計(jì)新原則。盡管沒(méi)人完全實(shí)現(xiàn)他的全部想法,但已經(jīng)有人嘗試實(shí)現(xiàn)其中的一部分。或許最知名也最完整的實(shí)現(xiàn)(包含對(duì)中間結(jié)果的展示)是 Chris Lattner 創(chuàng)建的 Swift 和 Xcode Playgrounds。

青出于蓝而胜于蓝,这是一款脱胎于Jupyter Notebook的新型编程环境

Xcode Playgrounds 的演示圖。

盡管這是一次重要飛躍,但它仍然受限于一項(xiàng)基本限制,即開(kāi)發(fā)環(huán)境的構(gòu)建初衷并不涉及此類(lèi)探索。例如,開(kāi)發(fā)環(huán)境無(wú)法捕捉探索過(guò)程,測(cè)試不能直接集成到開(kāi)發(fā)環(huán)境內(nèi),無(wú)法實(shí)現(xiàn)文學(xué)式編程的完善版本。

交互式編程環(huán)境

軟件開(kāi)發(fā)還有一個(gè)不同的方向,即交互式編程(以及相關(guān)的實(shí)時(shí)編程)。對(duì)交互式編程的嘗試在幾十年前已經(jīng)出現(xiàn),如 LISP 和 Forth REPL,它們?cè)试S開(kāi)發(fā)者在運(yùn)行的應(yīng)用程序中交互式地添加和移除代碼。Smalltalk 將其又推進(jìn)了一步,它提供了完全交互式的視覺(jué)工作區(qū)。在所有這些案例中,語(yǔ)言本身與交互式工作方式適配良好,如 LISP 的宏系統(tǒng)和「code as data」基礎(chǔ)。

青出于蓝而胜于蓝,这是一款脱胎于Jupyter Notebook的新型编程环境

Smalltalk 語(yǔ)言中的實(shí)時(shí)編程(1980)。

在今天,該方法不是最常規(guī)的軟件開(kāi)發(fā)方式,但它是科學(xué)、統(tǒng)計(jì)學(xué)和其他數(shù)據(jù)驅(qū)動(dòng)編程等多個(gè)領(lǐng)域中最流行的方法。(JavaScript 前端編程不斷從這些方法中借鑒思路,如 hot reloading 和瀏覽器內(nèi)實(shí)時(shí)編輯。)例如,1970 年代 Matlab 剛出現(xiàn)時(shí)是完全交互式的工具,現(xiàn)在仍廣泛用于工程、生物學(xué)等領(lǐng)域(目前它還提供常規(guī)軟件開(kāi)發(fā)功能)。S-PLUS 也使用過(guò)類(lèi)似的方法,與 S-PLUS 有關(guān)聯(lián)的開(kāi)源語(yǔ)言 R 目前在統(tǒng)計(jì)和數(shù)據(jù)可視化社區(qū)中非常流行。

25 年前我第一次使用 Mathematica 時(shí)非常興奮。對(duì)我而言,Mathematica 是最有可能支持文學(xué)式編程的語(yǔ)言,且不會(huì)影響生產(chǎn)效率。Mathematica 使用「notebook」界面,其行為類(lèi)似傳統(tǒng)的 REPL,但允許其他類(lèi)型的信息,如圖表、圖像、格式化文本、大綱部分等。事實(shí)上,它不僅沒(méi)有影響生產(chǎn)效率,我還使用它構(gòu)建出了之前無(wú)法構(gòu)建的東西。它幫助我在試驗(yàn)算法后立即得到視覺(jué)化反饋。

最終,Mathematica 并沒(méi)有幫助我構(gòu)建出任何有用的東西,因?yàn)槲覠o(wú)法把自己的代碼或應(yīng)用分發(fā)給同事(除非他們花數(shù)千美元購(gòu)買(mǎi) Mathematica 許可證),無(wú)法輕松創(chuàng)建瀏覽器內(nèi)可用的 web 應(yīng)用。此外,我發(fā)現(xiàn) Mathematica 代碼通常比使用其他語(yǔ)言寫(xiě)的代碼更慢、更耗費(fèi)內(nèi)存。

因此,你可以想象 Jupyter Notebook 誕生時(shí)我有多興奮。Jupyter Notebook 和 Mathematica 的基礎(chǔ) notebook 界面一樣(盡管最初 Jupyter Notebook 的界面只有后者的一小部分功能),而且開(kāi)源了,這樣我就可以使用廣泛支持和免費(fèi)可用的語(yǔ)言寫(xiě)代碼。我曾使用 Jupyter 探索算法、API 和新的研究想法,還把它作為 fast.ai 的教學(xué)工具。很多學(xué)生發(fā)現(xiàn)它具備試驗(yàn)輸入、查看中間結(jié)果和輸出的能力,且允許修改,從而幫助他們更完備、深刻地理解正在討論的主題。

我們還使用 Jupyter Notebook 寫(xiě)了一本書(shū),這是一件很有趣的事。基于 Jupyter Notebook,我們?cè)跁?shū)中結(jié)合了 prose、代碼示例、層級(jí)結(jié)構(gòu)化標(biāo)題等,同時(shí)保證樣本輸出(包含圖表、表格和圖像)完美匹配代碼示例。

簡(jiǎn)而言之:我們真的喜歡用 Jupyter Notebook,并利用它做出了很棒的作品,學(xué)生也喜歡它。但是我們竟然沒(méi)法用它來(lái)構(gòu)建自己的軟件!

Jupyter Notebook 少了什么?

Jupyter Notebook 擅長(zhǎng)「探索式編程」中的「探索」部分,但它不太擅長(zhǎng)「編程」。例如,它沒(méi)有提供執(zhí)行以下操作的方式:

  • 創(chuàng)建模塊化可重用代碼,這些代碼可在 Jupyter 外部運(yùn)行;
  • 創(chuàng)建可搜索超鏈接文檔;
  • 測(cè)試代碼(包括通過(guò)持續(xù)集成實(shí)現(xiàn)的自動(dòng)化代碼測(cè)試);
  • 代碼導(dǎo)航;
  • 版本控制。

因此,開(kāi)發(fā)者通常需要在未得到良好集成的工具間轉(zhuǎn)換,以獲取這些工具的優(yōu)勢(shì),而在工具間來(lái)回轉(zhuǎn)換會(huì)導(dǎo)致沖突。不同工具的優(yōu)勢(shì)如下所示:

青出于蓝而胜于蓝,这是一款脱胎于Jupyter Notebook的新型编程环境

我們認(rèn)為處理這些沖突的最好方法是,利用現(xiàn)有的好用工具構(gòu)建所需的功能。例如,對(duì)于處理 pull request 和查看 diff,已經(jīng)存在一個(gè)好用工具:ReviewNB。當(dāng)你在 ReviewNB 中查看圖解版 diff 時(shí),你會(huì)突然發(fā)現(xiàn)純文本 diff 中的遺漏信息。例如,如果某個(gè) commit 使圖像生成結(jié)果變得模糊不清,或者使圖表沒(méi)有標(biāo)簽該怎么辦?當(dāng)你將這些 diff 視覺(jué)化呈現(xiàn)時(shí),你會(huì)確切了解到底發(fā)生了什么。

青出于蓝而胜于蓝,这是一款脱胎于Jupyter Notebook的新型编程环境

ReviewNB 中的視覺(jué)化 diff,展示了表格輸出的更改。

nbdev 避免了很多合并沖突,因?yàn)樗惭b了 git hook,從而首先去除引發(fā)沖突的部分元數(shù)據(jù)。如果你執(zhí)行 git pull 時(shí)出現(xiàn)合并沖突,只需運(yùn)行 nbdev_fix_merge 即可。運(yùn)行該命令時(shí),nbdev 只需使用輸出存在沖突的單元格輸出,如果單元格輸入存在沖突,那么最終 notebook 中會(huì)包含兩個(gè)單元格以及沖突標(biāo)記。這樣你就可以輕松找出它們,并在 Jupyter 中直接修復(fù)。

青出于蓝而胜于蓝,这是一款脱胎于Jupyter Notebook的新型编程环境

nbdev 中基于單元格的合并沖突示例。

nbdev 只需創(chuàng)建標(biāo)準(zhǔn) Python 模塊,即可創(chuàng)建模塊化可重用代碼。nbdev 尋找代碼單元格中的特殊注釋?zhuān)?#export(表示該單元格應(yīng)被導(dǎo)出至 Python 模塊)。在 notebook 開(kāi)頭處使用特殊注釋?zhuān)蓪⒚總€(gè) notebook 與特定 Python 模塊結(jié)合起來(lái)。文檔站點(diǎn)(使用 Jekyll,以便得到 GitHub Pages 的直接支持)基于 notebook 和特殊注釋自動(dòng)創(chuàng)建。我們編寫(xiě)了自己的文檔系統(tǒng),因?yàn)楝F(xiàn)有方法(如 Sphinx)無(wú)法提供我們所需的全部功能。

至于代碼導(dǎo)航,大部分編輯器和 IDE(如 vim、Emacs 和 vscode)中內(nèi)置有一些不錯(cuò)的功能。GitHub 的網(wǎng)頁(yè)界面甚至直接支持代碼導(dǎo)航(目前尚處于測(cè)試階段,僅針對(duì)特定選中項(xiàng)目,如 fast.ai)。因此我們確保 nbdev 導(dǎo)出的代碼可在任意系統(tǒng)中直接導(dǎo)航和編輯,且任意編輯均被自動(dòng)同步至 notebook。

至于測(cè)試,我們已經(jīng)編寫(xiě)了自己的簡(jiǎn)單庫(kù)和命令行工具。作為探索和開(kāi)發(fā)(以及文檔)流程的一部分,測(cè)試可直接在 notebook 中編寫(xiě),命令行工具在所有 notebook 中并行運(yùn)行測(cè)試。notebook 的天然有狀態(tài)(natural statefulness)是開(kāi)發(fā)單元測(cè)試和集成測(cè)試的重要方式。你無(wú)需使用特殊語(yǔ)法來(lái)學(xué)習(xí)創(chuàng)建測(cè)試套件,只需使用 Python 中的常規(guī) collection 和 looping 結(jié)構(gòu),這樣要學(xué)習(xí)的新概念就少得多了。

這些測(cè)試還可以在普通的持續(xù)集成工具中運(yùn)行,它們對(duì)測(cè)試錯(cuò)誤源提供明確信息。默認(rèn) nbdev 模板集成了 GitHub Actions,以實(shí)現(xiàn)持續(xù)集成等功能。

動(dòng)態(tài) Python

在常規(guī)編輯器或 IDE 中完全支持 Python 的一大挑戰(zhàn)是,Python 具備強(qiáng)大的動(dòng)態(tài)特性。例如,你可以在任意時(shí)間向類(lèi)中添加方法,使用元類(lèi)系統(tǒng)改變創(chuàng)建類(lèi)的方式以及類(lèi)的工作方式,使用裝飾器改變函數(shù)和方法的運(yùn)行方式。微軟開(kāi)發(fā)了 Language Server Protocol,可用于開(kāi)發(fā)環(huán)境,以獲取自動(dòng)補(bǔ)全、代碼導(dǎo)航等所需的當(dāng)前文件和項(xiàng)目信息。但是,對(duì)于真正動(dòng)態(tài)的語(yǔ)言(如 Python),此類(lèi)信息通常只是猜測(cè),因?yàn)樘峁┱_信息需要運(yùn)行 Python 代碼(出于種種原因,Python 無(wú)法執(zhí)行該操作,例如寫(xiě)代碼時(shí)代碼可能處于混亂狀態(tài),導(dǎo)致所有文件被刪除)。

另一方面,notebook 包含實(shí)際運(yùn)行的 Python 解釋器實(shí)例,這完全在你的掌控之中。因此,Jupyter 可以基于代碼的實(shí)際狀態(tài)提供自動(dòng)補(bǔ)全、參數(shù)列表和上下文相關(guān)文檔。例如,在使用 Pandas 時(shí),我們得到 DataFrames 所有列名的 tab 自動(dòng)補(bǔ)全。我們發(fā)現(xiàn) Jupyter Notebook 的這一特性提高了探索式編程的生產(chǎn)效率。無(wú)需作出任何更改,它就能在 nbdev 中良好運(yùn)行。而這只是基于 Jupyter Notebook 構(gòu)建開(kāi)發(fā)環(huán)境所免費(fèi)獲取的部分 Jupyter 功能而已。

現(xiàn)狀

伴隨著 nbdev 的開(kāi)發(fā),我們使用 nbdev 從頭編寫(xiě)了 fastai v2。fastai v2 為構(gòu)建深度學(xué)習(xí)模型提供豐富、結(jié)構(gòu)完善的 API,將于 2020 年上半年發(fā)布。目前其功能完善,早期使用者已經(jīng)使用預(yù)發(fā)布版本搭建了很酷的項(xiàng)目。我們還在 fastai v2 中編寫(xiě)了其他項(xiàng)目,其中一些將在未來(lái)幾周發(fā)布。

我們發(fā)現(xiàn)使用 nbdev 比使用傳統(tǒng)編程工具的生產(chǎn)效率高 1-2 倍。對(duì)我而言這是一個(gè)巨大的驚喜。我已經(jīng)寫(xiě)了 30 多年代碼,試過(guò)幾十個(gè)構(gòu)建程序的工具、庫(kù)和系統(tǒng),我原本沒(méi)想到生產(chǎn)效率還有如此大的提升空間。現(xiàn)在,我對(duì)未來(lái)感到振奮,我覺(jué)得開(kāi)發(fā)者效率還有很大的提升空間,我期望看到人們用 nbdev 創(chuàng)建新的項(xiàng)目。

 

責(zé)任編輯:張燕妮 來(lái)源: 機(jī)器之心
相關(guān)推薦

2021-06-08 10:10:25

SQLMyBatisFluent MyBa

2013-04-09 14:04:21

基礎(chǔ)架構(gòu)數(shù)據(jù)中心產(chǎn)品核心交換機(jī)

2012-04-24 09:55:29

.NET

2012-10-29 09:55:52

HadoopImpalaDremel

2020-03-06 15:38:10

編程語(yǔ)言PythonJava

2011-08-29 15:46:34

Android智能手機(jī)

2021-04-27 09:00:59

PythonAidLearning編程神器

2014-12-08 09:47:48

Go

2015-09-23 17:39:52

Github開(kāi)源工具

2025-02-17 14:06:15

2015-12-14 10:33:38

2015-09-28 09:56:17

Github開(kāi)源工具編程

2020-09-24 05:50:46

PythonJupyter Not編程語(yǔ)言

2022-11-14 11:52:34

DataspellJupyterLabNotebook

2019-07-19 09:35:28

Linux發(fā)行版MX Linux

2022-02-16 09:01:33

編程工具Node-RED編輯器

2021-04-18 20:46:30

工具代碼編程

2018-03-24 17:02:17

數(shù)據(jù)泄露Facebook

2024-08-16 08:31:05

2014-12-16 10:11:22

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久99这里只有精品| 欧美亚洲高清| 91久久线看在观草草青青| 欧美久久在线| 一级片在线免费观看视频| 成人高清电影网站| 精品少妇一区二区三区在线视频| 免费国产黄色网址| 在线国产情侣| 成熟亚洲日本毛茸茸凸凹| 欧美在线观看日本一区| 小泽玛利亚一区| 香蕉久久夜色精品国产使用方法| 欧美日韩精品电影| 免费看黄在线看| 川上优的av在线一区二区| 国产主播一区二区三区| 欧美一级视频免费在线观看| 日本妇女毛茸茸| 国产免费播放一区二区| 亚洲成人激情图| 国产原创精品在线| 黄色18在线观看| 亚洲人成网站在线| 日本中文不卡| 天天舔天天干天天操| 蜜桃av噜噜一区| 91高清视频免费| 欧美片一区二区| 日韩成人综合| 亚洲欧美日韩天堂一区二区| 久草福利在线观看| 黄色精品视频网站| 色婷婷av一区二区三区软件| 黄页免费在线观看视频| www国产在线观看 | 自拍视频一区二区| 久久99精品久久久野外观看| 在线免费观看一区| 妺妺窝人体色www在线小说| 在线观看a级片| 中文字幕一区视频| 亚洲成人18| 精品99又大又爽又硬少妇毛片| 波多野结衣中文字幕一区 | 99热这里只有精品在线| 免费不卡在线观看| 国产精品久久激情| 波多野结衣绝顶大高潮| 日韩专区在线视频| 国产aaa精品| 天堂а√在线中文在线新版| 夜夜精品视频| 97视频国产在线| 精品久久免费视频| 亚洲精品乱码久久久久久蜜桃麻豆| 麻豆乱码国产一区二区三区| 我要看一级黄色录像| 青青草原综合久久大伊人精品| 国产亚洲精品久久久优势| 亚洲最大成人网站| 国产伦一区二区三区| 国产午夜精品视频免费不卡69堂| 伊人网伊人影院| 欧美日韩中字| 久久精品2019中文字幕| 人妻久久一区二区| 欧美日韩综合| 91禁国产网站| 狠狠狠狠狠狠狠| 免费观看日韩av| 国产日韩在线播放| 国产99对白在线播放| 国产suv一区二区三区88区| 国产精品推荐精品| 三级毛片在线免费看| 久久久综合激的五月天| 少妇特黄a一区二区三区| 天堂аⅴ在线地址8| 亚洲色图欧美在线| 成人免费播放器| 亚洲成人人体| 欧美精品黑人性xxxx| av不卡中文字幕| 亚洲最好看的视频| 久久精品99久久久香蕉| 国产在线免费视频| 久久婷婷激情| 亚洲a在线观看| 天堂中文在线看| 中日韩av电影| www.一区二区.com| 厕沟全景美女厕沟精品| 欧美精三区欧美精三区| 制服丝袜第一页在线观看| 精品99久久| 欧美福利视频在线观看| 日韩免费av网站| 国产精品88av| 日韩欧美亚洲v片| 污污的网站在线免费观看| 色悠悠久久综合| 麻豆网站免费观看| 国产精品片aa在线观看| 欧美精品免费在线观看| 欧美黄色一级大片| 国产91精品免费| 亚洲成人午夜在线| 多野结衣av一区| 91精品国产综合久久久久久久| 国产熟女高潮一区二区三区 | 69视频免费看| 成人免费黄色在线| 亚洲欧美久久234| 亚洲天堂av在线| 日韩欧美一区二区不卡| 久久久久久成人网| 亚洲欧美日韩综合国产aⅴ| 亚洲jizzjizz日本少妇| 国产51人人成人人人人爽色哟哟 | 美女福利精品视频| 国产乱码在线观看| 91在线播放网址| 成人在线免费观看视频网站| 99tv成人影院| 自拍偷拍亚洲精品| 国产真人无遮挡作爱免费视频| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 日韩精品 欧美| 日本成人精品| 久久亚洲影音av资源网| 在线免费a视频| 亚洲国产精品国自产拍av| 三级4级全黄60分钟| 日韩欧美四区| 国产91|九色| 深夜福利在线观看直播| 亚洲国产综合视频在线观看| 精品人妻人人做人人爽夜夜爽| 日本一区二区高清不卡| 国产不卡在线观看| 日本精品专区| 精品久久久久久中文字幕大豆网| wwwxxx色| 韩日成人av| 亚洲aaaaaa| 国产区在线观看| 欧美日韩国产美| 国产欧美一区二区三区在线观看视频| 视频精品一区二区| 久久久久一区二区| 美女网站在线看| 亚洲国产第一页| 国产精品第56页| 99精品国产91久久久久久| 日韩中文字幕在线免费| 爱高潮www亚洲精品| 久久999免费视频| 国产丝袜在线视频| 亚洲青青青在线视频| 国产熟女高潮视频| 真实原创一区二区影院| 欧美亚洲第一区| 欧美日韩视频精品二区| 日本韩国视频一区二区| 全黄一级裸体片| 丝袜诱惑亚洲看片| 色99中文字幕| 色婷婷成人网| 麻豆国产va免费精品高清在线| 国产成年妇视频| 亚洲五码中文字幕| 日韩片在线观看| 亚洲电影成人| 开心色怡人综合网站| 黑人巨大精品欧美一区二区桃花岛| 亚洲剧情一区二区| 亚洲精品国产精品乱码视色| 国产精品高潮久久久久无| 任你躁av一区二区三区| 一本久道综合久久精品| 日本免费一区二区三区| 日本亚洲欧洲无免费码在线| 麻豆成人在线看| 精品资源在线看| 欧美日韩视频在线第一区 | 三级av免费观看| 91精品国产91久久综合| 99视频国产精品免费观看| 俄罗斯一级**毛片在线播放| 日韩精品高清在线观看| 久草热在线观看| 一区二区在线看| 日本xxxx免费| 久久精品亚洲| 国产91av视频在线观看| 超碰97久久国产精品牛牛| 欧美中在线观看| 色哟哟免费在线观看| 亚洲国产日韩欧美在线图片 | 18视频免费网址在线观看| 91精品免费观看| 国产精品自拍99| 国产精品电影院| 日本特黄在线观看| 首页国产欧美日韩丝袜| 香蕉视频免费版| 午夜先锋成人动漫在线| 成人自拍性视频| 三上悠亚激情av一区二区三区| 久久精品视频网站| 日韩av免费观影| 日韩色视频在线观看| 精品国产午夜福利| 亚洲一区二区欧美日韩| 又色又爽的视频| youjizz国产精品| 中文字幕在线视频精品| 先锋影音久久| 日韩亚洲欧美一区二区| 婷婷五月色综合香五月| 国产精品10p综合二区| **精品中文字幕一区二区三区| 国产激情视频一区| 亚洲美女尤物影院| 69av在线播放| 成人免费网站观看| 国内精品久久久久久久| 色a资源在线| 久久综合色影院| 久久99精品久久| 日韩在线免费av| 91免费在线| 日韩av网址在线观看| 色网站免费观看| 欧美变态tickle挠乳网站| 91亚洲欧美激情| 欧美剧在线免费观看网站 | 欧美日韩亚洲综合一区| 天堂网免费视频| 色婷婷久久一区二区三区麻豆| 日韩精品视频免费看| 一区二区三区加勒比av| 久久久精品少妇| 欧美极品美女视频| 国产毛片久久久久久久| 99re热视频精品| 精品人妻伦一二三区久| av在线不卡观看免费观看| 国产av一区二区三区传媒| 国产高清在线观看免费不卡| 人人爽人人爽av| 国产综合久久久久久久久久久久| 永久免费的av网站| 久久精品久久99精品久久| 亚洲 欧美 另类人妖| 久久草av在线| 在线观看免费不卡av| 看片的网站亚洲| 加勒比av中文字幕| 国产成人av网站| jjzz黄色片| 成人黄页毛片网站| 亚洲激情 欧美| 久久精品在这里| 久久丫精品忘忧草西安产品| 国产欧美一区二区精品性色超碰| 亚洲午夜久久久久久久国产| 亚洲视频在线一区| 蜜臀久久精品久久久用户群体| 亚洲三级电影网站| 精品无码免费视频| 色婷婷激情综合| 国产精品久久欧美久久一区| 精品欧美一区二区久久| 青青草免费在线| xvideos亚洲人网站| 超碰97免费在线| 日韩美女免费视频| 第四色男人最爱上成人网| 91久久中文字幕| 国产精品一线| 欧美成人蜜桃| 欧美 日韩 国产 一区| 日本一区午夜艳熟免费| 国产精品日韩久久久| 国产精品少妇在线视频| 国产资源精品在线观看| 欧美xxxx×黑人性爽| 国产亚洲精品bt天堂精选| 日韩高清dvd碟片| 亚洲国产aⅴ成人精品无吗| 中文人妻av久久人妻18| 欧美另类变人与禽xxxxx| 飘雪影视在线观看免费观看 | 国产精品伦子伦| 国产精品热久久久久夜色精品三区| 三级av在线免费观看| 欧美日韩中国免费专区在线看| 国产91一区二区三区| 男女污视频在线观看| 精品亚洲一区二区三区| 国产在线更新| 欧美在线观看日本一区| av在线国产精品| 欧洲精品久久| 欧美暴力喷水在线| 成人午夜视频免费在线观看| 精品一区二区三区久久| 久操视频免费看| 亚洲另类色综合网站| 亚洲欧美综合自拍| 69久久99精品久久久久婷婷| 手机在线观看毛片| 日韩有码在线视频| 在线观看爽视频| av一区二区三区免费| 成人激情视频| 怡红院av亚洲一区二区三区h| 日韩av一区二区在线影视| xxxx黄色片| 亚洲女同一区二区| 天天干天天操天天操| 日韩精品电影网| 欧美人动性xxxxz0oz| 国产精品视频地址| 欧美猛男同性videos| 日韩精品一区在线视频| 国产一区福利在线| 日本免费www| 图片区小说区区亚洲影院| 国产免费黄色片| 精品国产拍在线观看| 日韩欧美一区二区三区在线观看 | 91啪九色porn原创视频在线观看| 顶级黑人搡bbw搡bbbb搡| 一本到不卡精品视频在线观看 | 成人在线爆射| 精品视频导航| 亚洲一区区二区| 日韩无码精品一区二区| 一区二区三区美女视频| 99久久国产热无码精品免费| 最好看的2019年中文视频| 电影一区二区三| 美国av一区二区三区| 久久精品系列| 国产又粗又猛又爽视频| 日韩欧美在线视频免费观看| 日本福利午夜视频在线| 91a在线视频| 奇米777国产一区国产二区| 少妇久久久久久被弄到高潮| 国产一区二区三区精品视频| 无码人妻精品中文字幕| 欧美精品99久久久**| 国产在线一区二区视频| 91久热免费在线视频| 91精品综合久久久久久久久久久 | 青青视频免费在线观看| 国模娜娜一区二区三区| 人人爽人人爽人人片| 欧美理论片在线| 大黄网站在线观看| 国产精品视频500部| 影音先锋国产精品| 在线观看一区二区三区四区| 亚洲国产视频网站| 亚洲精选一区二区三区| 国内揄拍国内精品| 欧美黑人巨大videos精品| 少妇高潮喷水久久久久久久久久| 国产喂奶挤奶一区二区三区| 最近中文字幕在线免费观看| 中文字幕成人在线| 日本成人手机在线| 少妇av一区二区三区无码| 国产视频一区在线观看| 国产三级三级在线观看| 欧美激情乱人伦| 偷拍亚洲精品| 精品少妇在线视频| 99视频热这里只有精品免费| 欧美激情黑白配| 在线观看欧美成人| 欧美成年网站| 久久久久久久午夜| 亚洲视频资源在线| 色哟哟国产精品色哟哟| 国产精品成久久久久三级| 午夜精品视频| 一起草在线视频| 91精品国产乱码久久蜜臀| 在线免费看h| 精品一区二区三区毛片| 国产调教视频一区| 可以免费看毛片的网站| 国产一区红桃视频| 男人的天堂亚洲在线| 欧美丰满艳妇bbwbbw|