linux 使用者

我是一個 linux 使用者,與業餘的網頁開發者, 能夠寫程式解決自己的問題。 linux 使用者,代表我懂得如何聰明的使用電腦, 操作命令列介面自動化或批次操作。 web 開發者的身份,讓我能以 web 為介面, 開發跨平台的圖形介面程式。

前言

大概三年前在成功大學的 ccns 活動時, 我對自己的定位是: linux 使用者,業餘的 web 開發者。 但研究所後越來越懶,已經很久沒寫 web 了, 只是 linux 使用者的身份不變。

某天回顧自己時,發現我雖然對自己的定位很明確, 但似乎沒有寫文章介紹過,就開寫了。

在 linux 中打滾多年的使用者

我不是所謂的 專業 程式設計師, 也不寫大型的實用的程式。 對我來說,程式就是用來解決自己的問題的。 只是我在 linux 這個屎坑中打滾了比較久, 對環境比較熟悉。

然後因為想和性質類似的人交流, 就加入了程式設計的社團, 在成大是 ccns,在交大是 ccca 。 這種社團的共同點大概就是都寫程式玩 linux, 但目的卻各有不同。 有的是資安,有的是競技程式設計, 有的是深度學習、平行處理最佳化、 系統管理、遊戲設計,技能樹各有不同。 而我算是比較奇怪的一個,玩 linux 本身就是目的; 或說使用 linux 讓生活更愜意才是目的。

進階使用者的見多識廣

我把自己定位為 linux 使用者, 意思是我擅長以 linux 解決各式各樣的問題。 linux 系統的特性,鼓勵使用者學習各種技術, 因此很多技術我都碰過,但又不會真正想往更深處鑽研, 可以說是樣樣通樣樣鬆的半吊子結果。

shell 與程式語言

但作為一個 linux 使用者,使用 shell 是基本技能。 linux 離不開 shell,久了就會磨的爐火純青。

當然 sh 不是個好語言,雖然他可以做很多事, 但最終,你還是會需要一個 真正的 程式語言。 我選擇了 javascript,他的優勢是能夠在瀏覽器上執行, 在瀏覽器外則有 node 等直譯器。

至於如何區分程式語言與 shell 腳本的界線, 我把自己定位為 linux 使用者, 因此我的原則是能優雅的用 shell 解決的,就不動到程式語言。

系統管理

玩 linux 很不幸的一點, 就是必需兼任自己的系統管理員, 所以算是半專業的系統管理人。 架 server、開虛擬機、資料備份、網路管理, 這些都很基礎的會一點。 寫腳本管理機器,更是大大加分的自動化技巧。

自動化技巧

自動化是駭客文化很重要的一環, 如之前寫過的有關網頁腳本文章中提到的。 例如我手上有在維護一個固定衛星接收站, 接收儀會將每天的 gps 觀測成果存在內部儲存空間,得要定期下載庫存。 於是我就寫了一個腳本,讓伺服器每天連到接收儀自動下載。

這些自動化技巧,用 shell 都是可以輕易達成的, 對專業的開發者可能不屑一顧,對一般人來說, 可能也只是小技巧等級,上不了檯面的技能。 但當你真的能熟練使用這些 shell 與自動化技巧, 你會發現世界開擴很多,很多問題都不再是問題。

網站開發

會架站又會寫網頁,自然就可以自稱全端工程師了! 雖然現在前端已經博大精深,我似乎有跟不上時代了, 但我本來就沒有要努力追新的意思,所以就隨便吧。

我一向是以自己需求為中心。 所以懂得網站開發對我來說, 最重要的是可以維護自己的部落格、自己想做的程式, 以及可以寫腳本來 hack 別人網站。

因為我目前唯一會寫的圖形介面程式, 只有網頁程式,所以如果要開發給電腦麻瓜使用的程式, 也只能以網頁的形式發布。

而所謂 hack 不一定是滲透或攻擊別人的主機, 可能是用 wget curl 去戳別人網人網站提供的表單提交頁面。 或是指用 js 操作瀏覽器中的網站介面,自動留言或填寫表單, 例如寫 小書籤greasemonkey 腳本, 甚至是瀏覽器擴充元件。

程式設計雜務

其它我還有許多技能,程式設計必要的 git、make、測試, 我也是都摸過一點。 雖然我寫的絕大多數程式規模都用不上測試, 但我的確見識過測試的好處。

當程式規模一大,必然會面臨不確定自己的修改正不正確, 以及忘了自己改了哪些地方。 改了哪些地方就必須要靠版本控制系統, 而修改正不正確,除了直接跑跑看, 最快的方式就是跑測試,哪裡改壞了一目瞭然。 (至少比手動戳過每一個功能省時間。)

編輯器

至於編輯器,早期我是用 unix 下的標配 vim, 對 windows 使用者來說,光是一個 vim 就能做不少事了。 學了基本的取代功能,就能用編輯器產生批次的命令, 也可以用 :r !ls 之類的操作和外部互動, 或是直接從外部剪下貼上。

後來因為接觸 lisp,就開始用 emacs, 寫 emacs lisp。 在 vim 我只有把基本功能學完, 冒號的命令和多數按鍵的命令, 沒有學到進階的 vim script, 變數之類的內容。

但我在 emacs 也是用 evil, 在 emacs 裡用 vi 風格的按鍵。 因為之前看一篇文章, 與其在 vim 裡寫 vim script, 不如換到 emacs 裡用 lisp, 寫 text object 還比較舒服。

雜務

其它還有很多,是身為一個 專業使用者 的技能。 如修圖、畫圖,在 linux 上就是 gimp、inkscape。 雖然稱不上專業的設計師, 但做傳單、畫簡單的 icon,也是沒問題的。

雖然我不是太好的講者,也沒有朝這方向精進的意願, 但我會用 inkscape 和 sozi 作很酷的投影片, 或用 markdown 作一般的投影片,用瀏覽器播。 markdown 可以用 python landslide 直接生成 html, 或是寫 js 的可以用 reveal。

寫文件、寫部落格也是用 markdown,來生出網頁; 用 markdown 寫的文件也都可以用 git 管理。 markdown 文件也可以混入 html,甚至 css javascript, 來簡單更改配色,少寫一點 markdown 語法之類的。

平凡的程式人

在交大 ccca 時,我第一年為社團成員的定位是 平凡的程式人 , 其實核心就和這篇文章類似, 代表的是一種 沒有到頂尖,但已經很厲害 的程式人。 不打競技程式競賽,不打 ctf, 但有能力開發出絕大多數的程式,使用與貢獻開源軟體。 (雖然社團後來再起不能,可能代表這個觀點不是很受歡迎; 或說除了理念,人之間的連結更為重要。)

結論

最後文章有點不知所芸,有點跑題,不知道要寫什麼; 就引用前面在自動化的心得作結。

這些技巧,對專業的開發者來說可能不屑一顧,對一般人來說, 可能也只是小技巧等級,上不了檯面的技能。 但當你真的能熟練使用這些 shell 與自動化技巧, 你會發現世界開擴很多,很多問題都不再是問題。

這就是我,一個 linux 使用者,所具備的能力。