Q&A

在最後一次課上,我們回答了一些學生提出的問題:

關於學習作業系統相關題目的建議,如行程,虛擬記憶體,中斷,記憶體管理

首先,我們不確定你是否真的需要非常熟悉這些,因為他們是非常底層的題目。 如果你要開始編寫底層程式碼,如實現或者修改核心時,它們會比較重要,否則除了課上簡單瞭解的那些之外,這往往不相干。

關於這些的學習資源:

最適宜早先學習的工具有哪些

一些適合學習的內容:

我該使用 Python 還是 Bash 腳本還是其他語言

大部分時候,bash 腳本適宜一次性的簡短工作,比如你想要執行一系列指令的時候。bash 腳本有一些奇怪的地方,讓大型程式和腳本難以用 bash 實現。

因此,對於大型和/或更複雜的腳本,我們建議使用更成熟的腳本語言,比如 Python 或者 Ruby。 你可以找到人們為了解決這些語言的常見問題而編寫的無數線上資料。 如果在某種語言裡你找到了實現某種特定需求的庫,通常最好的辦法就是使用這種語言。

source script.sh./script.sh 有什麼區別

在兩種情況下,在 bash 會話中都會讀取並執行script.sh,不同之處是哪個會話在執行指令。 對於 source 指令是在當前的bash會話中執行的,因此在其執行完畢後,對當前環境的任何更改,比如更改路徑或定義函式,都會在當前會話中保留。 當如同 ./script.sh 這樣單獨執行腳本時候,當前的 bash 會話會啟動一個新的 bash 例項,然後這個例項會執行 script.sh 中的指令。 因此,如果 script.sh 更改了路徑,新的 bash 例項會更改,不過一單退出並且將控制權返回給父 bash 會話,父會話會保留在同一位置。 同樣,如果 ./script.sh 定義了要在終端中訪問的功能,要對其執行 source。否則在你執行它時,新的 bash 程序將處理函式定義,而不是當前的 shell。

各種程式套件和工具的儲存位置是什麼?如何引用它們? /bin/lib 又是什麼?

根據你在終端執行的程式,這些套件和工具會在你的 PATH 環境變數列出的地方找到。你可以使用 which 指令 (或者 type ) 來檢查你的 shell 在哪裡找到了這個程式。 通常,特定種類的檔案儲存有特定規範,檔案系統階層標準詳細介紹了這些。

我應使用 apt-get install 還是 pip install 來安裝一個 python 程式?

這個問題通常沒有合適的答案。這與使用作業系統套件管理系統還是特定語言的套件管理系統這個更打的問題有關。你需要考慮這些事情:

你應該嘗試使用一種解決方案,而不是同時使用兩種,以避免難以除錯的衝突。 我們建議儘可能使用特定於語言的管理系統,並使用隔離的環境(比如 Python 的 virtualenv)來避免汙染全域。

提升程式碼效能最簡單好用的分析工具有哪些

最簡單且十分有效的工具是 print timing。 你僅需手動計算程式不同部分消耗的時間,並重複這個過程,透過二分搜尋法找到耗時最長的部分。

若想尋找更高階的工具,Valgrind 的 Callgrind 可以使你執行程式並計算所有的時間花費,並列出所有呼叫堆疊,即哪個函式呼叫了另一個。然後,它會生成帶註釋的程式碼,其中包含每列消耗的時間。但是它會拖慢程式速度一個數量級且不支援多執行緒。 還有 perf 工具和其他語言的特定取樣分析器可以迅速給出資料。 Flamegraphs 是對取樣分析器的視覺化工具。你還可以使用針對特定語言或任務開發的工具,例如,對於網頁開發,Chrome 與 Firefox 內建的開發者工具有出色的效能分析器。

有時候,程式最慢的部分是系統等待讀取硬碟或網路包。此時,需要檢查根據硬體效能估計的理論速度是否與實際速度相符。也有專用工具來分析系統呼叫中的等待時間,比如用於跟蹤使用者程式內核的 eBPF。如果需要底層的效能分析,bpftrace 是個好選擇。

你在用什麼瀏覽器外掛

以下是我們喜歡的外掛,多數與安全性和易用性有關:

還有哪些有用的資料預處理工具

有些資料整理工具由於時間緊湊,在資料預處理課上我們沒有提及。包括 jqpup 這些分別用於 JSON 和 HTML 資料的專有解析器。Perl 程式語言也是適用於高階資料整理的管道工具。還有一個技巧是使用 column -t 指令,將不一定對齊的空格分隔文字轉化成對齊的文字。

通常來說,Vim 和 Python 也可以看作不常規的資料整理工具。對於一些複雜的多行轉換,Vim 巨集是非常寶貴的工具。你可以記錄一系列動作,並根據需求重複多次。例如,在編輯器章節的 lecture notes (和去年的課程回放)中,有一個示例,僅使用vim巨集將XML格式的檔案轉換為JSON。

對於通常以CSV格式表示的表格資料,pandas Python庫是一個很好的工具。 因為它不僅使定義復雜的操作(如分組,聯接或過濾)變得非常容易;而且還很容易繪製資料的不同屬性。它還支援匯出為多種表格式,包括XLS,HTML或LaTeX。 另外,R程式語言(可以說是不好的程式語言)具有用於計算資料統計資訊的許多功能,在作為管道的最後一步時非常有效。 ggplot2是R中不錯的繪相簿。

Docker 和虛擬機器有什麼區別

Docker基於一個名為容器的更通用的概念。容器與虛擬機器之間的主要區別在於,即使核心與主機相同,虛擬機器也將執行整個OS堆疊,包括核心。與其不同,容器避免執行內核的另一個例項,而是與主機共享核心。在Linux中,這是通過稱為LXC的機制來實現的,它利用一系列隔離機制來啟動一個程式,該程式認為其在自己的硬體上執行,但實際上與主機共享硬體和核心。因此,容器的開銷要低於完整的虛擬機器。 另一方面,容器的隔離性較弱,只有在主機執行相同的核心時容器才能工作。例如,如果你在 macOS 上執行 Docker,則 Docker 需要啟動 Linux 虛擬機器以獲取初始 Linux 核心,因此開銷仍然很大。最後,Docker 是容器的特定實現,它是為軟體部署量身定製的。因此有一些奇怪之處:例如,預設情況下,Docker 容器在兩次重啟之間將不會儲存任何形式的儲存。

每個作業系統的優缺點是什麼,我們如何在它們之間進行選擇(例如,為我們的目的選擇最適用的Linux發行版)?

即使有很多不同版本的 Linux 發行版,大部分發行版在大多數使用情況下的表現也相當相同。 大部分 Linux 和 UNIX 功能以及內部工作原理都可以在任何發行版中學習。 發行版之間的根本區別是發行版如何處理軟體套件更新。 某些發行版(例如 Arch Linux)使用滾動更新策略,在這種策略中,套件更新激進,也常常導致不穩定的問題。 另一方面,一些發行版(如 Debian,CentOS 或 Ubuntu LTS)發布更新要保守得多,因此通常情況下會更穩定,但要犧牲一些新功能。 我們建議使用 Debian 或 Ubuntu 來獲得輕鬆穩定的臺式機和伺服器體驗。

MacOS 是 Windows 和 Linux 之間的一個很好的折衷方案,它有靚麗的介面。 但是,MacOS 是基於 BSD 而不是 Linux ,因此係統的某些部分和命令會有所不同。 另一個值得一試的是 FreeBSD 。 即使某些程式不能在 FreeBSD 上執行,但與 Linux 相比,BSD 生態系統的碎片化程度要低得多,而且文件更為友好。 除了開發 Windows 應用程式或需要某些僅限 Windows支援的功能,例如對遊戲的驅動支援外,我們不建議使用Windows。

對於雙系統,我們認為最有效的方案是 macOS 的 bootcamp,從長遠來看,任何其他組合都可能會出現問題,特別是將其與磁碟加密等其他功能結合使用時。

Vim 還是 Emacs

我們三個人都使用 vim 作為主要編輯器,不過 Emacs 也是一個很好的替代品,很值得去同時嘗試它們來看看哪個更適合你。Emacs 與 vim 的編輯模式不同,但是這些功能可以通過 Emacs 外掛,例如 EvilDoom Emacs 實現。Emacs 的優勢是了一使用 Lisp 擴充套件。Lisp 是比 vim 預設使用的 vimscript 更優秀的腳本語言。

有哪些機器學習的注意與技巧

此課程的一些經驗教訓可以直接應用於機器學習程式。 與許多科學學科的情況一樣,在機器學習中,經常要進行一系列實驗,並檢視結果是否有效。 你可以使用 Shell 工具輕鬆,快速地搜尋這些實驗結果並以明智的方式匯總它們。 這可能意味著在給定的時間內或使用特定資料集的情況下選擇所有實驗資料。透過使用JSON檔案記錄實驗相關參數,使用我們在本課程中介紹的工具,這可以變得非常簡單。 最後,如果你不使用叢集來處理你的 GPU 相關作業,則應該研究如何使該過程自動化,因為這不僅會耗費大量時間,還會顯著消耗你的耐心。

還有什麼 Vim 小技巧

一點經驗:

雙重驗證(2FA)是什麼,我該如何使用它

雙重驗證在密碼之上給予使用者賬戶額外的保護。登入時,你不僅需要密碼,還必須以某種方式“證明”你可以訪問某些硬體裝置。最簡單的情況是接收 SMS,儘管 SMS 已經被證明有安全性問題。一個良好替代就是使用 U2F 方案,比如 YubiKey

對Web瀏覽器之間的差異有何評論

截至2020年,當前瀏覽器的格局是大多數瀏覽器都與 Chrome 很相像,因為它們使用相同的引擎(Blink)。這意味著同樣基於 Blink 的 Microsoft Edge 和基於 WebKit(與 Blink 類似的引擎)的 Safari 都是 Chrome 的較差版本。就效能和可用性而言,Chrome 是一款相當不錯的瀏覽器。如果你需要替代,建議使用Firefox。在幾乎所有方面,它都可以與 Chrome 媲美,並且它在隱私保護方面也十分出色。 另一個名為 Flow 的瀏覽器尚未完成,但它正在實現一個新的渲染引擎,該引擎有望比當前的渲染引擎更快。


Edit this page.

Licensed under CC BY-NC-SA.