Linux哲學之美
linux就像是一個哲學的最佳實踐。如果非要對它評價,我真的不知道該怎么贊嘆,我只能自豪的說着:“linux的美麗簡直讓人沉醉。”
我只能說是我處在linux學習的修煉之路上的一個小菜鳥,linux的東西真的太豐富了,讓你感覺只要掌握了其中的一個部分,就可以在求職之路上大放光彩,因此我常常感嘆自己的弱小和無知,我離着linux的中心是多么的遙遠,我只看到眾多高聳的山峰。
Bash shell,linux kernel,linux C編程,嵌入式開發,linux 設備(驅動)編程,雲計算。。。
前面的幾個是我比較關系的方向。我現在主要在學習linux嵌入式編程方面的知識。此外就是復雜的linux編程。我在后面會說一下我對linux編程的淺薄認識。眾多的有趣的方向,常常讓我們感覺無所適從。我不談專業的知識,我就談談我學習linux的故事,以及站在專業角度上的評論和展望好了。
我們張家亮老師曾經提起說LInux的設計是行為需求驅動型。似乎是這么說的,覺得不對勁。我對linux的感覺就是自由,合作,兼容。
我的故事
第一次接觸linux的發行版是ubuntu,我相信ubuntu絕對是linux發行版中最受歡迎的,此外還有很多優秀的發行版,像是fedora,opensuse,我其實是比較喜歡fedora,穩定,優化的也比ubuntu好,而且還站在linux技術的頂端,作為Redhat的桌面版本,技術資源雄厚。高二的時候第一次接觸了Ubuntu,那個時候我正好在北京,那次我是騎自行車從山東濰坊的青雲山遲騁而去。其實應該是初二的時候第一次接觸linux,那個是計算機考試用的系統,我還記得那個小企鵝的標識。(我那個喜歡計算機的朋友給我留下了慧根,因此我選擇了信息工程,並且主攻計算機方向的技術。感謝我的那位朋友。)
我舅舅在中科院那邊學習,我去了之后,接觸了Ubuntu,那時候感覺比較有趣,原來世界上不只是有Windows,那種操作和模式完全顛覆了我對計算機操作系統的認識。當然了,那個時候,僅僅是站在表層去看待這個系統。想想三年來,桌面版的ubuntu變化其實不大。大概是因為cannical公司把精力都放在了ubuntu Touch上了吧。而且,令人欣慰的是手機版本的ubuntu做的真心不錯。我還是很喜歡這種概念的,全平台兼容的ubuntu。就是現在風頭正盛的win10的那個模式。不過我看ubuntu的這個更加“全平台”一點,應用可以同時部署在所有平台上。勢單力薄的ubuntu借助了Qt的技術積累,把Qt作為主要的開發平台。我還是比較喜歡QT。
圖1.1 Ubuntu經典的Dash界面
怎樣學習Linux,一己之見!
既然要學習Linux,最起碼需要弄明白的是什么是Linux,請你先去看一下Linux的發展史,點擊這里。然后在 Linux現在的動態,Linux是一個非常偉大的項目,現在他的生存是靠Linux基金會管理的,全球有1200家公司,12000曾經參與內核開發,當然了,這些開發者都是水准相當高的,然后集中的委員會會審查代碼和漏洞,最終確定代碼變動,這是一個非常成熟的系統,沒想到的是華為竟然是linux內核開發貢獻者的第20名。
每個人都有自己學習linux的目的和方向,有的是嵌入式開發,就想是我,那么就需要對Linux這個操作系統和硬件平台都要有一個完善的了解。有的是系統管理,也就是網站那一部分。有的是做科學計算,各個方面的計算,物理計算啊,工程計算。開發一些大型的后台系統,就像雲計算,現在非常火爆的hadoop就是一個大數據平台。做機器學習的人也是離不開Linux的。等等方向,找准方向,就可以下手了。
學習Linux有一些是必須接觸的,比如說各種命令以及shell編程,Linux操作系統的原理,linux系統編程,甚至是設備編程也是都需要的。那么就可以按照這個方向開始學習。我呢,還是覺得行為驅動好一些。也就是你為自己定制一個小任務,然后在linux這個平台上去解決掉。比如說搞一個單點動態物體跟蹤。
我的路線是這樣的,查資料之后確定這是一個圖像識別的題目,於是編譯安裝了opencv庫,之后去查詢算法(自己設計還真的不夠格),發現了很多算法,這個時候就可以一個個的甄選。這個中間過程中,其實可能遇到很多問題,比如說,dependences不對,編譯命令錯誤,編譯參數等等。很多細節問題。我本來打算用cv的,但是后來發現了一個libccv的庫,這個庫真是棒極了,封裝了常見的圖像識別算法,並且提供了接口,其中有一個TLD算法,就可以用來跟蹤單點動態物體,真是大快人心。代碼是開源的,需要自己編譯,這個過程也是遇到了很多問題,編譯完了之后的使用也是問題,這個庫還封裝了一個網絡套件,可以放在遠程段,利用網絡完成識別任務了,更讓我驚嘆的是作者還提供了js版本的代碼,簡直贊,我現在呢,就在閱讀源代碼,讓后試着去使用接口,如果整合到Qt上就可以完成很好的任務了。此外,qml支持直接嵌入js代碼,那么就不用自己寫C++的版本了,真是太贊了。
下一步就是把PC上的些工作移植到ARM7的板子上了,因為庫需要交叉編譯,然后還需要移植到板子上去,板子上還缺少一些必要的庫。反正問題還是很多的,但是這個解決的過程卻可以學到很多知識。一不小心你可能就算是一個小小的大神了。
好了,總結一下,學習linux要從學習命令開始,然后去學習這個操作系統,再就是學習linux編程,最后就可以應用你的項目了,這個應用的過程就是深入的了解這個系統,當然了那些做的比較高層的就不需要學習太多底層的知識,但是學習底層的知識卻可以讓一個高級語言程序猿寫出更加美妙和效率的代碼,這是真的!也是信息工程的學生的優勢。
圖1.2 ccv檢測人臉
Qt噠噠噠(圖形庫)
Qt是linux桌面上最常用的界面開發套件(廣義上),Qt是優秀的全平台兼容的圖形庫(狹義上)。支持mac,win,linux,wp,android,Embedded device。等等吧。我的一個朋友xuetao說在window上Qt會很慢。這個其實很正常,畢竟Qt的構建更加底層。而window就不得而知了。最起碼要比window高一層。
圖1.3 QT架構
QT在linux上構建在X11上,X11構建在X上,X構建在內核上。此外,linux還有一些其他的圖形庫。例如Gtk。Qt還多用在嵌入式開發中做圖形程序,我現在用的arm7的板子,就需要在上面做一個圖形程序,顯示相關數據,例如所做一個識別物體的程序,把找到的物體標識並且實時的顯示出來。QT的跨平台給開發者帶來了多多的便利。真的該支持一下。圖像識別就用libccv,然后將圖像內嵌在QT窗口上。圖像采集就用video4linux這個USB圖像驅動接口。把圖像緩存到內存中。其實這也是非常困難的一個事情,對現在這個水平的我來說,真的還是很難得。
我們Labor常用ARM7級別的板子開發一些非大型Application,這個時候圖形程序就是使用QT技術完成了,眾多的參考資料,成熟穩定的技術,QT社區為我們的開發提供了豐富的支持,在中國QT還是做了很多工作,每年QT都會在北京舉辦技術研討會,但是估計在中國,Qt不會有多少商業用戶,中國人的智慧是無窮的。你懂得。在開發板上移植了linux內核和一些額外的驅動,就可以移植QT圖形庫了,之后就可以脫離平台,構建優秀的圖形程序,當然了開發一個完整的應用是離不開平台的,特別是內核給我們的提供的接口,例如videoforLinux,內核上的東西,我不懂,我不太清楚那些學習Linux Kernel的開發者到底需要完成什么高大上的項目。但是,內核絕對是學習計算機的最好的資料。
大一的時候我的朋友還說要學習內核的,但是最后還是去做信號去了。
學習linux,你夠耐心嗎?
學習linux其實真的很有趣,同時也非常具有挑戰性,如果你沒有耐心,你真的可能當天就卸載了。學習linux是為了學習技術,如果你想把他當做日常使用系統,可能就難於應付了。首先他沒有
QQ,這一點很多人就無法忍受了。(我都是用手機的。)學習linux,尤其是初學者會遇到很多坑爹的事情,因為完全區別於window的一些新概念,可能真的讓人拿不住頭腦。例如說,linux發行版軟件源這個東西,就完全讓人糊塗。用linux的水貨常常問問我,去哪里下載軟件,如果非要回答,那么就去軟件中心下載,或者去支持linux的廠商那里下載linux版本的軟件。真正我們該學會的是通過終端下載軟件,這樣,我們可以下載到你想要的所有軟件包,開發庫。初學者想的就是去下載什么什么軟件來做開發,但是linux不是這樣的。我們完全可以下載相關的庫,然后用Vim在寫程序,然后去編譯鏈接和調試就OK了。例如你想做opencv的項目,那么通過軟件管理器apt-cache search opencv,這個命令查找相關的軟件包,然后去下載安裝。這些東西就不多少了,畢竟這是指導性的評論文章,不是技術文章。要說技術真的需要積累的。
ubuntu默認的國外的源列表,我們最好是換成國內的。但是校園網更新源的時候會遇到很奇怪的問題,有幾個源使無法連接的。以前我是換成公眾網的。校園網是不是做了某些特別的處理?但是更新源這件事請就讓我一個學姐搞了不知道幾天,后來她還是遇到了問題,據說一天解決了。很幸運,通常你會遇到很多網上找不到答案的問題。這真的讓人心碎!!!就像我現在遇到的,已經試着解決很多次了,好幾個月了。
圖1.4 啟動qtcreator與遇到的問題
qtcreator這個應用無法啟動,提示說找不到這個libqxcb.so的動態鏈接庫,但是這個庫其實真的在/usr/lib下面。但是為什么不行呢?我找到了一個解釋,那就是我的這個libqxcb.so應該不是qtcreator需要的那個,而系統友沒有解決這個問題的機制。實際上,我懷疑這個xcb的意思是不是libxcb而不是libqxcb反正試了很多方法,解決不了。我一個同學對我說“重裝吧”真的不能重裝,為了維護這個系統真的付出了很多心血。沒有兩三年的經驗這個東西真的玩不轉。
圖1.5 qtcreator需要的動態鏈接庫帶有xcb的部分
這些是部分qtcreator需要的動態鏈接庫,無論多么狂躁你都不可以放棄。愛情呢?當然了,我所說的這個是廣義的學習,狹義的學習應該是linux管理或者是linux編程,但是這些小小的技術問題,往往才是打開我們成功之路的鑰匙。
遇到了困難而且奇葩的問題,堅持解決!集思廣益,不要閉門造車!
就說道這里,將來繼續書寫。爭取寫一點專業的東東!可以裝X。
圖1.6 ubuntu touch
感興趣的朋友試着做一些ubuntu phone的開發吧