Windows的Copycat及其他

Ubuntu 12.04发布以后,这个Linux发行版就彻底地让我失望了。臃肿的身躯加上人机交互混沌的令人发指的Unity桌面,已经跟我需要的Linux桌面系统已经相去甚远。沙扬挪拉,Ubuntu。作为一个从6.04开始使用Ubuntu的用户,我不得不跟这个桌面系统说一声再见了。不是因为它在Xeon(R) CPU E31240 + Dual-channel 8GB内存的PC上居然启动的比Windows 7还慢,也不是因为它让我连应用程序菜单在哪里都找不到,只是因为它越来越像一个Windows的Copycat。

也许Ubuntu深受很多从Windows系统迁移过来的超级用户喜爱,但是它却已经失去了很多真正的Linux Users。Linux用户与Windows用户最根本区别的在于,前者确切地知道自己真正需要什么并且知道如何获得和实现他们自身的需要——因为开源软件提供了这种自由,而后者则恰恰相反。Windows从诞生以来就是救世主,它给你一切,让你毫不怀疑的享受这种安逸,让你无法主动地寻找自己的真正需要。由此,它越来臃肿越来越庞大越来越多的消耗更多的包括硬盘,内存和计算能力在内的系统资源。其实我并不单独厌恶Windows的这种给与和扩张,因为几乎所有的商业软件都具有极强的扩张性——比如很多字处理软件都包含拼写检查这个重复的功能,而我真正厌恶的是它对用户自由的侵害。为什么这么说?因为它们将用户假设为无法学习的群体,与Windows交互的最宏观的过程可以总结为“You pay, you go”。所有的软件问题都是需要钱才能解决,而且最根本的这些问题只能由拥有源代码的私有公司解决。这是最基础的假设。如果说,对于一个家庭主妇或者某位非计算机行业/专业人士,这大概没有什么问题。但是,在这种环境之中成长起来的程序员却会慢慢失去学习的意愿和能力。如果你想用“我要将目光集中到我自己的业务上去”这样的话来辩驳的时候,你已经错了,如果你是一位程序员的话。因为那些用来调查和调整系统错误的时间——所谓的“浪费”——事实上一种必备的能力。因为你需要知道计算机的一切!

“……,我从来不把安逸和快乐看作是生活目的的本身——这种伦理基础我叫它猪栏理想。” ——爱因斯坦

对一个人来说,停止思考之日便是他的死亡之时。对程序员来说更是如此。闭源软件正在带着停止思考的你我渐渐死去。

Ubuntu有了软件商店,这是一件好事。它本来有机会开拓一个新的开源软件的开发模式。但不幸的是它却偏离的开放源代码软件的初衷。开源软件真正的意义在于“开放源代码”!而不是“免费”。假设,你买到Photoshop套件的同时可以获得它的源码,难道你不开心么,难道你不想要这样的软件么?我想有人会提到“盗版”。看上去会很复杂,但“盗版”和开源事实上不是同一个命题。闭源软件同样会被盗版。真正保护版权的是适当的法律和严格的执行。不要跟我提中国市场上猖獗的盗版,因为中国软件市场,软件人才事实上是被上述猪栏思想和猖獗的盗版所戕害的。

没有哪个商业操作系统或者Linux发行版能够提供给你那个你确切需要的软件平台。只有自己动手,对,就是自己动手,你才有可能重新控制并且掌握你的计算机,才能享受到开源软件提供给你的自由。Ubuntu 6.04推出的时候,它最成功的地方不是它的liveCD,而是那个有大约3000多行的HOWTO——一个简洁明快的Wikipage。它提供给用户一个运行良好的基础系统,并且提供了多达2万的可选软件包。它还写了一份详实的文档帮助你定制自己的系统。这就是最初的Ubuntu。如果它要模范Windows,或者像Mac OS那样仅仅将开源软件作为架子想“给用户一切”,那它就完全错了。

一声看似潇洒的沙扬挪拉不会解决任何问题。作为一个Linux User我只有自己救自己。

配置Ubuntu Jaunty和双显示器一起工作

OK. 这一篇的主旨只是为了记录我解决问题的过程。

关闭FrameBuffer设备

上周星期五,我以一千元人民币的价格淘到了垂涎已久的22存高清显示器。今天早晨送到家里,我自然是兴奋不已的打开看了。Ubuntu Jaunty启动之后可以很顺利的识别外接显示器,但是外接显示器的分辨率却不正确。使用xrandr查看,发现整个设备的大小受到限制。Thinkpad X61的spec上写的很清楚,整个图形卡的最大可表现区域是因该是外接显示器于笔记本固有显示器面积的总和,也就是2944×1080。使用xrandr -q查看,发现这个最大值并没有被正确设置。less /etx/X11/xorg.conf看到,配置文件中启用了FrameBuffer设备。立即恍然大悟。原来,早些日子,我在控制台上工作的时候,启用了FrameBuffer来获得更大的显示区域。为了支持这个控制台显示区域,X服务器只能割让一部分显示存储给FrameBuffer设备。要修改回来就是在内核参数行去掉vga=791选项——这个选项代表1024×768的FrameBuffer能力。并且,重新启动机器之后,利用sudo dpkg-reconfigure -phigh xserver-xorg来重新配制xserver。因为,从Ubuntu 8.10版本开始,这个发行版中启用了新的xserver,所以,大部分配置可以由xserver自动完成,不需要再手动更改xorg.conf配置文件了。重启xserver之后,我再用xrandr -q查看了设备能力,输入如下。这是保证双显示器expand输出的前提条件。

$ xrandr -q
Screen 0: minimum 320 x 200, current 2944 x 1080, maximum 4096 x 4096
VGA connected 1920x1080+0+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080      60.0*+
   1280x1024      75.0     60.0  
   1152x864       75.0  
   1024x768       75.0     60.0  
   800x600        75.0     60.3  
   640x480        75.0     59.9  
   720x400        70.1  
LVDS connected 1024x768+1920+0 (normal left inverted right x axis y axis) 246mm x 185mm
   1024x768       50.0 +   85.0*    75.0     70.1     60.0     40.0  
   832x624        74.6  
   800x600        85.1     72.2     75.0     60.3     56.2  
   640x480        85.0     72.8     75.0     59.9  
   720x400        85.0  
   640x400        85.1  
   640x350        85.1  

配置双显示器expand表示

利用gnome-display-properties,我可以在这里动态的设置双显示的规格。有图为证。

如果这个方法受限,那么还有一个后背方案,就是采用Intel显卡驱动官方站的指南,采用xrandr来手动配置。

更新Mesa

设置双显示expand之后,我发现小显示器的一部分不能正确更新。初次看到这个现象的时候,我开始怀疑是不是设备能力有限,不能支持这么大的屏幕显示区域。但是仔细计算了一下,这种情况应该是不可能发生的。我的图形卡支持的最大输出是2944×1080,那么宽度上1920+1024不会超过这个2944,而长度来看768小于1080。那问题出在哪里呢?我尝试关闭了“桌面效果”,也就是启用metacity来取代compiz做窗口管理器。我发现这样的话两个屏幕都是可以被正确更新的。立刻想到问题应该处在3D表示的驱动上面。也就是作为3D表示基础库的Mesa有问题。找到关键词就很容易搜索了,google之。立刻发现这个问题是出现在mesa-7.4版本之中的bug。而这个bug已经被修复了。这个时候,我想是不是可以拿到mesa的源代码,然后给它打上补丁后重新package。于是立刻行动,我用apt-get source libgl1-mesa-dev libgl1-mesa-dri那到mesa的源代码,照猫画虎的打补丁。转念一下,这个问题应该已经有很多人遇到了,因为Jaunty发布已经有近4个月的时间,不会只有我遇到这个问题。于是乎,我在launchpad上搜索一下,发现果然有新版本的mesa可以使用。因为这个PPA提供的是unstable版本软件包,所以该PPA的作者声明拒绝外部资源直接给出该PPA的使用方法用来保证每个用户都可以读到警告信息。这里就不再说到底怎么使用了。如果你想在Ubuntu中使用fresh的xorg相关软件包,那么直接点下面的连接跳转过去看看吧。
https://launchpad.net/~xorg-edgers/+archive/ppa

经过以上步骤的折腾之后,我的Ubuntu就可以使用双显示器正常工作了。写代码的时候再也不需要挤在那个1024×768的显示器上用Alt+Tab换来换去了。还有就是玩企鹅滑冰有些就更爽了。(话外音:真浪费)同学,我听见了,虽然这个安装过程还是遇到问题多多,但是谁让俺自己愿意折腾呢?由此可证,所有的GNU/Linux用户都是那“吃饱了没事撑着”的某些人。


参考URL:
http://lists.freedesktop.org/archives/xorg/2008-April/034707.html
http://www.thinkwiki.org/wiki/Xorg_RandR_1.2#Summing_up
https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/146298

打造嵌入式软件开发团队(3) 使用minicom做串口连接

minicom的初始配置

起动minicom

在终端中敲minicom,然后回车……(画外音:老兄,这个地球人都知道吧)。

$ minicom

如果你非常unlucky,发行版的默认安装中居然没有包含这个简单易用的串口连接工具,那么,找apt-get帮忙吧。

$ apt-cache search minicom
$ sudo apt-get install minicom

这里需要注意的问题是,如果你的locale设置的是中文,那么minicom打开后,那些边边角角条条框框会不能对齐,这基本山是因为程序本身不能计算双字节字符在屏幕上的正确宽度造成的,如果你英文好一些,并且不愿忍受破坏视觉的痛苦,推荐使用下面的命令启动minicom。

$ LC_ALL=C minicom

为了以后方便一些,就直接把这个命令写入$HOME/bin/里面,并且将这个路径添加进入PATH变量最前面的位置用以替换默认的minicom启动程序。

$ echo "#!/bin/sh LC_ALL=C minicom" > $HOME/bin/minicom
$ chmod +x $HOME/bin/minicom

如果minicom是第一次启动,打开之后就会遇到提示,可能有两种情况

  1. minicom说普通用户不能打开设备文件/dev/modem之类,如果你确信你需要使用这个设备进行通信,那么请用root用户或者sudo命令将这个设备文件更改访问属性;
  2. minicom说找不到默认的配置文件

恩,我们要说的就是如何给他配置起来,接着看吧。

打开配置菜单

第一次启动minicom可以使用root身份打开,并且加入-s选项,这是为了方便配置。

$ LC_ALL=C sudo minicom -s

这时回打开一个对话菜单,它长的有点像下面这个样子。

            +-----[configuration]------+                                  
            | Filenames and paths      |                                  
            | File transfer protocols  |                                  
            | Serial port setup        |                                  
            | Modem and dialing        |                                  
            | Screen and keyboard      |                                  
            | Save setup as dfl        |                                  
            | Save setup as..          |                                  
            | Exit                     |                                  
            +--------------------------+                                  

用上下键选择Serial port setup,选择进入。

    +-----------------------------------------------------------------------+
    | A -    Serial Device      : /dev/ttyS0                                |
    | B - Lockfile Location     : /var/lock                                 |
    | C -   Callin Program      :                                           |
    | D -  Callout Program      :                                           |
    | E -    Bps/Par/Bits       : 115200 8N1                                |
    | F - Hardware Flow Control : No                                        |
    | G - Software Flow Control : No                                        |
    |                                                                       |
    |    Change which setting?                                              |
    +-----------------------------------------------------------------------+

将串口的各个配置值设置成你需要的样子。按每个选项前面的字母键进入配置选单。其中,Serial Device需要指定成你实际使用的串口设备的设备文件;Lockfile Location使用默认就可以了,这个文件使用来锁定设备的,以保证不会设备被另外一个程序同时使用;Callin/out Program略去,嵌入式软件开发的时候大多不需要这个,这选项大概是留给调制解调器用的,我也不晓得;Bps/Par/Bits用来配置你的串口的通讯速度,这里我的设备选择了115200 8N1的选项,跟据你的设备选择相应的值;Hardware/Software Flow Control是RS232协议的一部分,用以控制两个设备之间消息传递的流控制——这个玩意儿一两句讲不清楚,有兴趣的话看RS232 flow control and handshaking——这个例子里选择NO。
不同的RS232连接线或者开发版的特殊设计都会导致你需要的配置与例子所说的不同,所以,还是查看一下硬件的连接方式手册再进行配置比较好。

配置完成后,在配置菜单中选择Save setup as dfl,这样就可以将配置结果保存成默认设置。

测试

如果你的开发板中已经烧入了相应的固件支持串口通信的话(一般都会有),这个时候可以给开发版加电测试一下通信状况了。如果配置没有出错,那么就应该有相应的内容表示。
值得一提的是折行控制。如果不进行选择的话,minicom提供的终端是不会折行的,也就是说你输入终端的内容在表示的时候会被短截,为了让自己看得清楚一些,可以用CTRL+A W来进行切换。

退出

在minicom的画面中按CTRL+A,接着按X键。或者CTRL+A Q。两者的区别是X会重置modem,而Q不会重置,并且Q选项需要用户确认。

此后就无须多言了,串口连接只是提供一种连接方式,连接以后根据开发板给公给你的界面,该干嘛干嘛就好了。


参考URL:
http://www.interface.co.jp/cpu/sh240_howto/howto06.asp
http://tldp.org/HOWTO/Serial-HOWTO.html