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的开发吧

Linux之我见的更多相关文章

  1. 怎样安装Arch Linux以及Deepin桌面环境

    一.概述 Arch Linux 是一个轻量级的Linux发行版本,实际上,Arch Linux提供给用户很多选择,用户可以自定义自己的安装过程,不x像其他很多的Linux发行版本,安装过程甚至是一个只 ...

  2. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  3. Linux inode 之我见

    Linux硬盘组织方式为:引导区.超级块(superblock),索引结点(inode),数据块(datablock),目录块(diredtory block).其中超级块中包含了关于该硬盘或分区上的 ...

  4. 新手要想学好Linux系统就必须做好这四件事情

    一般情况下,大部分人接触Linux的机会并不多,对Linux平台下的开发更是一无所知.而现在的发展趋势却越来越表明:无论是作为一个优秀的软件开发人员,或是互联网.IT行业的从业人员,掌握Linux是一 ...

  5. linux 内核邮件列表

    第一节 - 一般性问题 1. 为什么有些时候使用“GNU/Linux"而另一些时候使用“Linux”? 答:在这个FAQ中,我们尝试使用“linux”或者“linux kernel”来表示内 ...

  6. 最适合和最不适合新手使用的几款 Linux 发行版

    大多数知名的Linux发行版都属于"比较容易使用"这一类.一些观察人士可能会驳斥这个观点,但事实上,说到Linux,大多数并非从事IT或软件开发工作的人会被最容易的使用体验所吸引. ...

  7. Linux 路线 推荐

    1.<Linux程序设计>- 靠它来入门,然后装一个linux体系,练习shell(party)和linuxC,把基础打牢: 2. <深入理解Linux内核>和<Linu ...

  8. 清华申请退学博士作品:完全用Linux工作

    http://www.cnblogs.com/cbscan/articles/3252872.html 下文地址 http://blog.oldboyedu.com/use-linux/ 按: 尽管我 ...

  9. linux内核模块

    一个简单的驱动 模块的使用能使linux内核便于裁剪,根据不同的应用需求得到一个最小的内核,同时调试内核驱动也更为方便,比如如果调试i2c驱动,如果不采用模块的方式,那么每次修改i2c驱动就得编译整个 ...

随机推荐

  1. python基础(五)缩进和选择

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例. ...

  2. x01.Game.LitSkull: 梯次防御

    1.人要有点精神 人要有点精神,否则,不是沦落为毫无意义的看客,就是退化成食色性也的动物,有被开除球籍的危险,如晚清. 2.框架 引号头文件在当前目录下搜寻,三角头文件在配置目录下搜寻,这是一个简单的 ...

  3. NYOJ-取石子

    (一) 描述一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游戏的规则是这样的.设有一堆石子,数量为N(1<=N<=1000000), ...

  4. Font Awesome使用指南

    Font Awesome介绍 Font Awesome是一款很流行的字体图标工具.随着Bootstrap的流行而逐渐被人所认识,现在FontAwesome不仅仅可以在bt上使用,还可以应用在各种web ...

  5. 嵌入式Linux 修改启动LOGO

    1.嵌入式 Linux LOGO显示原理      嵌入式Linux是直接在FrameBuffer的基础上.直接显示一个ppm格式的图象.     它 kernel/drivers/video/fbc ...

  6. QuickFIX/N 动态存储配置信息

    Acceptor或者Initiator能够为您维护尽可能多的FIX会话,因而FIX会话标识的唯一性非常重要.在QuickFIX/N中,一个FIX会话的唯一标识是由:BeginString(FIX版本号 ...

  7. java 22 - 21 多线程之多线程的代码实现方式3

    JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法 A.public static ExecutorService newCachedThreadPool() B.public s ...

  8. 使用gulp将移动端px转为rem

    使用gulp的插件可以很方便的将xp转为rem,在布局的时候使用@1x .@2x布局,即10rem=device-width:@1x即设计图为320px,1rem对应的10px像素,相对的@2x即为布 ...

  9. C# 断点续传原理与实现

    在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种.请求协议是由 客户机(浏览器)向服务器(WEB SERVER)提交请求时发 ...

  10. .NET Framework 中的所有类型

    .NET Framework 中的所有类型不是值类型就是引用类型. 值类型是使用对象实际值来表示对象的数据类型. 如果向一个变量分配值类型的实例,则该变量将被赋以该值的全新副本. 引用类型是使用对对象 ...