2014年9月14日 星期日

以安裝 vim 外掛 youcompleteme 為例,示範怎麼逐步認識與應用自己的 Ubuntu Linux 作業系統?

很多人在接觸 Ubuntu Linux 後,往往會有個想法:「我還可以用 Ubuntu Linux 來做什麼事情?」這篇文章嘗試藉由舉例,來說明自己怎麼逐步去利用與認識一個開源與整合眾多工具的 Ubuntu Linux 。請注意,這只是眾多整合與應用的手段之一,不是一個一定得要怎樣怎樣做的流程;任何人都可以依照自己的使用情境,選擇與重新組合自己認為最好的手段:而這也是開源工作好玩的地方之一。以下舉嘗試安裝 vim 的外掛 youcompleteme 為例。

首先因為我曾經用過 vim 中 youcompleteme 這個外掛,所以我知道有個這樣的名字與工具可以使用。所以第一個問題很自然而然地就會是:「那麼, Ubuntu 的 apt 套件庫中,是不是已經有人包好這個套件等我使用了呢?這樣我就不用自己去另外手動尋找、下載並安裝這個外掛了。」

於是我嘗試在套件庫中利用名稱當關鍵字去尋找看看

apt-cache search youcompleteme

輸出是

vim-youcompleteme - fast, as-you-type, fuzzy-search code completion engine for Vim

從輸出中我可以猜到我的確可以透過 apt 中的套件 vim-youcompleteme 來取得 youcompleteme 。所以我接著下達安裝的指令:

sudo apt-get install vim-youcompleteme

然而把這個外掛裝到作業系統之後,我不知道要怎麼在 vim 中啟用它,所以我透過下面的指令參考了一下裡面有什麼檔案。此時我心中想的是:「看看有沒有文件或是程式碼可以指引我下一步該做什麼。」。

dpkg -L vim-youcompleteme

這個指令是說,請告訴我對於已經安裝在系統上的 debian package vim-youcompleteme 這個套件,他有哪些檔案在安裝當時被放進系統裡。在輸出中我們看到:

/usr/share/doc/vim-youcompleteme/README.Debian

看起來是個說明文件,所以我們很自然地打開看看:

vim-youcompleteme

-----------------



A code completion plugin for Vim. This package designed to work with

vim-addon-manager. To use this addon install vim-addon-manager package first

and use this command:



  $ vam install youcompleteme



This plugin is not compatible with any other code competition plugins, some

of them listed below:



  * clang_complete

  * AutoComplPop

  * Supertab

  * neocomplcache

  * jedi-vim (vim-python-jedi package in Debian)



It is not recommended to use them together.


根據這份文件,我因此知道要去找 vim-addon-manager 這個工具。至此,再重複上面的步驟,只是對象換為 vim-addon-manager

apt-cache search vim-addon-manager

輸出是

editmoin - edit MoinMoin wiki pages with your favourite editor

vim-addon-manager - manager of addons for the Vim editor

vim-haproxy - syntax highlighting for HAProxy configuration files

vim-puppet - syntax highlighting for puppet manifests in vim

然後我從其中找個最像的來裝;裝之前當然可以透過 apt-cache show vim-addon-manager 來確定這些東西是不是自己所預期的。確定之後就把他裝上去:

sudo apt-get install vim-addon-manager

安裝好 vim-addon-manager 之後,就照著上面文件說明的指示來安裝 youcompleteme 囉!

vam install youcompleteme

安裝完成,開個檔案測試看看,知道果然可以用 youcompleteme了。以上至此,示範了如何在僅知道想要使用的軟體名稱下,如何進一步把他放進 Ubuntu Linux 之中以便自己利用。

本文採用的 Ubuntu Linux 為 14.04.



2014年8月14日 星期四

活用從 userspace 發送 signal 的技巧

在 Linux 核心運作的方式中,有採用到所謂「 signal 」的方式。大體上來說,這種機制就是直接針對一個程序或是很多程序,發送一個信號,而所有具有傾聽信號能力的程序,會回應某些信號,而做出某些行為。

所謂 user space ,指的是 Linux 架構下,分類程序性質的觀點之一。這個詞是相對於 kernel space 去稱呼的。一個不嚴謹的說法,可以概略地陳述為:「 user space 的程序是使用者可以直接觸及、更動、修改的,而 kernel space 則否。kernel space 的程序控制權完全掌握在核心程序本身。」

以下是 signal 在 user space 的應用的一個例子:

有的時候我們想要把自己使用過的硬碟給他人使用,但是又不希望對方有機會回復並取得自己曾經留在這顆硬碟上的資料。下面這個指令是一個常見的銷毀硬碟資料的作法:

dd if=/dev/zero of=/dev/sdX bs=1M

其中 sdX 表示硬碟裝置編號,依照實際情況可以是 sda 、 sdb 、 sdc ......etc. 。這個指令的意思就是指請把空的資料寫滿整個硬碟裝置 sdX ,並且一次寫入 1Mb 的大小。一次要寫入多少大小的 size 則 case by case ,這個參數的最佳化依照不同的環境有不同的值。

dd 這個指令本身在完成工作的時候才會回報結果統計,在這之前都是「默默地」做事。可是現代的硬碟動輒數百 Gb 或甚至是數T,依照電腦效能,藉由上面的指令,有時候需要花上數十分鐘甚至數小時來抹除資料。有些使用者可能會想問:「有沒有可能請 dd 工作到一半的時候,請 dd 回報他的工作進度?」答案是:可以。

dd 這支程式有能力傾聽 signal ,並且會對 USR1 這個 signal 做出反應,因而回報進度。 dd 的使用手冊中提到:

$ man dd

......

       Sending a USR1 signal to a running 'dd' process makes it print I/O sta‐

       tistics to standard error and then resume copying.



              $ dd if=/dev/zero of=/dev/null& pid=$!

              $ kill -USR1 $pid; sleep 1; kill $pid



              18335302+0  records  in  18335302+0 records out 9387674624 bytes

              (9.4 GB) copied, 34.6279 seconds, 271 MB/s


仿照手冊中的例子,我們採用下面的指令來請 dd 回報進度:

sudo kill -USR1 `pgrep ^dd`


延伸閱讀:
http://askubuntu.com/questions/215505/how-do-you-monitor-the-progress-of-dd

2014年5月8日 星期四

初學者使用debian package上的常見迷思

下面蒐錄了幾個自己學習過程上,或是與人討論時,歸納出的幾個初學者在使用debian package時,常見的幾個迷思。

本篇文章以Ubuntu作業系統為例。

Debian package簡介
Debian package是Debian作業系統發展出來的、模組式地管理作業系統上程式的新增、移除與修改。在Linux的世界中有許多方式去管理系統中的程式,包括tar ball,rpm套件等等,debian package,也常被簡寫為deb,則是眾多管理方式中的其中一種。

Debian package管理模式是一個出色的管理方式。據說在2013年使用人口開始超過使用rpm套件的使用者。這裡有一篇不是很正式的測試指出在2010年對於同一個Linux distribution,下載deb的次數已遠大於其他的、包括tar ball形式的套件形式。請注意這些統計數字不是嚴格考證過的。

下面開始介紹幾個初學者常見的迷思。

套件只是作業系統的一部分

Ubuntu是從Debian改過來的系統,因此也承襲了Debian透過debian package來管理系統中的套件/軟件包/套件包/package的方法。事實上,整個Ubuntu作業系統大體上可以看成是許多的debian package集合而成。

透過適當地新增、刪減套件,可以發行「新的」Ubuntu。升級Ubuntu本質上可以看做是大幅度地更動許多套件的類型與版本。LUbuntu、KUbuntu或是Linux Mint等等Ubuntu延伸版本,可以概括地認為是另外不全然相同的一群debian package集合。

移除.deb可以讓系統回復到原本的狀態

安裝、升級.deb事實上大多數時候,特別是該套件牽扯到眾多的相依函式庫或是設定檔時,是一個不可逆的過程。

舉例來說,若有個.deb其中某個設定檔,是個在系統中會和人共享的設定檔。在移除.deb包的時候,有可能當初打包的debian package maintainer考量到此設定檔有可能要留給另外一個程式使用,因此不會將此設定檔移除或是做修改。

當程式很小或是系統很單純的時候,對於當初打包的人來說,考量到的因此足夠因應所有的情境,這時候的確有可能能夠真正「乾淨地」移除,使得系統回復好像從來沒有安裝過這個.deb包一樣。可惜現實世界中,一個系統通常牽扯到成千上萬個.deb包,或是一個.deb包通常足夠複雜。因此,如果是在進行除錯工作,需要回復到「乾淨的環境」以進行測試的時候,要注意移除.deb包的行為可能不是可逆的,免得想要複製的bug一直無法複製,白白花了時間。

一個程式只能包成一個package

debian package分為source packagebinary package,一個source package在編譯之後,可以產生許多個binary package。通常我們拿到的、馬上要提供給自己電腦安裝的是binary package。binary package裡面包的是已經在適當的環境與機器上面編譯好的二進位可執行檔(如果是直譯式語言通常就是程式碼),以及如何佈署的資訊。

許多專案的程式碼在開發的時候,會統一管理所有相關的程式碼。這些程式碼可能各司其職,並在必要的時候又可以互相輔助或是合作。這個統一管理的程式碼通常是被包成一包source package,透過適當的編譯產生好幾個binary package。舉例來說,一個有產生出數個binary package的典型案例可能看起來像是有:

  • 程式核心,可能會有 <套件名稱>-core 這種命名
  • 程式外掛,可能會有 <套件名稱>-plugin 這種命名
  • 程式對某種語言的函式庫包,可能會有 lib<套件名稱>-<函式庫版號> 這種命名
  • 除錯資訊,可能會有 <套件名稱>-dbg 或是 <套件名稱>-dbgsym 這種命名
  • 開發工具,可能會有 <套件名稱>-dev 這種命名
釐清這種一對多的概念,除了在看懂Launchpad這個平台的使用架構上,是很有幫助的以外。在自己選擇哪種.deb套件包安裝上,會比較了解某些套件之間可能是有關係的。在這種情形下,再搭配Launchpad或是apt這個工具,相信讀者會更清楚、輕易地知道自己可能需要哪些套件,而不至於胡亂裝了一些自己不需要的東西。

延伸閱讀
fourdollars的投影片