<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>阿当正传 &#187; Linux tips</title>
	<atom:link href="http://www.adamjiang.com/archives/category/linux-tips/feed" rel="self" type="application/rss+xml" />
	<link>http://www.adamjiang.com</link>
	<description>长脑袋的个人博客</description>
	<lastBuildDate>Tue, 15 May 2012 16:53:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>以Funtoo为基础的Linux桌面系统（2）</title>
		<link>http://www.adamjiang.com/archives/1154</link>
		<comments>http://www.adamjiang.com/archives/1154#comments</comments>
		<pubDate>Tue, 15 May 2012 16:53:14 +0000</pubDate>
		<dc:creator>jcadam</dc:creator>
				<category><![CDATA[Linux tips]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[源代码]]></category>
		<category><![CDATA[环境配置]]></category>
		<category><![CDATA[自由]]></category>

		<guid isPermaLink="false">http://www.adamjiang.com/?p=1154</guid>
		<description><![CDATA[构建自己的Linux桌面系统的第一步，就是根据Funtoo网站上提供的wiki页面，编译，安装和配置基础系统（base system）。这包括 制作一个SysRescureCD的live USB。&#187;详情 通过SysRescureCD提供的工具初始化硬盘，并且在硬盘上安装stage3——也就是最基础的根文件系统。 配置这个最基础的系统。 利用该文件系统提供的基础工具编译安装Linux内核。 安装grub2作为bootloader。 如果你对类Unix系统的基本概念非常了解，这个过程看上去应该是水到渠成的。安装的细节虽然无需多言，Funtoo提供的指南已经十分详尽，但这里却有一些非常有趣的概念值得讨论。 第一，这个安装过程的全部魔法都在chroot命令上。我一直以为这个命令是类Unix操作系统设计的精华之一。为什么这么说呢？众所周知，Linux操作系统对它的跟文件系统有一个必要的假设。即，根文件系统是一棵树。而这个树的根就是“/”。像硬盘，SSD之类的块设备可以通过“挂载”（mount）的方式，将实体的存储设备挂载到这棵逻辑中存在的树的任意节点上。当系统在这棵树上创建新文件或者修改任何既有内容时，这种变更就会被反映到实际的存储设备上。树结构的妙处在于，任意一棵子树和拥有该子树的“大树”总是相似的。当你将准备好的硬盘分区挂载到这棵树上，并且chroot进入这个树的子树，你就的到了一个全新的“根文件系统”。但于此同时，系统运行的却是原来大树中预装的Linux内核，由此来帮助新文件系统的生成。这种方法在Windows系统中听起来有点像天方夜谭但是在Linux系统中，却是司空见惯。采用这种方法可也在多个不同的根文件系统之间无缝的切换，比如，你可以在一个64位系统的根文件系统的某一棵子树上创建一个32位系统子树。这对于很多系统测试和环境搭建都不无裨益。一个典型的例子就是debian系统采用chroot的方式帮助开发者创建一个便于创建软件包的标准环境，由此，.deb包才可以避免现有系统不同配置的影响而适用与各种不同配置的系统。 第二，这个安装过程实际上那个暗示了如何从无到有得建造一个操作系统。Linux操作系统的发端就是1990年Linux写给邮件列表的那封信。在已有系统软件——包括编译器，链接器的帮助下，生产内核代码才是可能的。用软件来制造软件。这是一个非常自然的过程。我记得有一句话叫“以机器制造机器标志这第二次工业革命的开始”。而以软件制造软件也是现在软件行业的一个重要标志。也只有当这种衍生和扩展的能力和半导体的几何级数式的蓬勃发展结合起来的时候，这种能力才创造了极大的社会财富。 第三，一些配置和编译的选择也值得讨论一下。 首当其冲的就是UEFI和GPT分区。区别与传统的BIOS和MBR分区，这两个技术都有一些进步。GPT几乎是必要的（desirable）。但是，如果你的系统主板是建立在UEFI之上的话，Linux系统可能会遇到一些问题。这并不是Linux的错，而是因为大多说UEFI固件都缺乏必要的测试问题百出，以至于根本无法保证系统兼容性。对于后面这一点我实在没有什么好的建议，大概能说的只有一条，选择UEFI主板的时候一定要先调查一下再做决定。 创建分区和创建文件系统的分离是让那些在Windows中模糊成一团的操作系统概念变得更加清晰了。对文件系统的选择又是另一个问题。一般来说根据用户的实际应用应该选择不同的文件系统，比如，一些文件在处理“小文件”的时候有明显优势，一些文件系统有灵活配置的特性等等。当然，ext4文件系统适用于大多数桌面应用。虽然这个指南中仅仅提供了传统的采用/dev/sd*方式记述的/etc/fstab，但实际上Funtoo也支持UUID作为标记在/etc/fstab中使用。 对很多中文用户来说，键盘布局不是问题。因为，大多数在中国销售的计算机实际上是直接使用英语键盘布局的，所以/etc/conf.d/keymaps中采用默认值没有什么问题。我的情况比较特殊，因为日语键盘布局与英文键盘布局存在相当大的差异。我必须在上面提到的文件中制定键盘布局为jp106。如果你想在运行时改变系统的键盘布局，可以使用下面的命令。 setxkbmap xx ## xx 是两个字母的国家代码，比如us 当编译安装好的内核和基础系统可以启动以后，我尝试继续跟随Funtoo的指南对基础系统升级并且安装了X Server和必要的系统软件。这样，一个极简洁的Linux操作系统诞生了。]]></description>
			<content:encoded><![CDATA[<p>构建自己的Linux桌面系统的第一步，就是根据Funtoo网站上提供的<a href="http://www.funtoo.org/wiki/Funtoo_Linux_Installation" title="Funtoo installation" target="_blank">wiki页面</a>，编译，安装和配置基础系统（base system）。这包括</p>
<ul>
<li>制作一个SysRescureCD的live USB。&raquo;<a href="http://www.sysresccd.org/Sysresccd-manual-en_How_to_install_SystemRescueCd_on_an_USB-stick" target="_blank">详情</a></li>
<li>通过SysRescureCD提供的工具<a href="http://www.funtoo.org/wiki/Funtoo_Linux_Installation#Prepare_Hard_Disk" target="_blank">初始化硬盘</a>，并且在硬盘上<a href="http://www.funtoo.org/wiki/Funtoo_Linux_Installation#Installing_the_Stage_3_tarball" target="_blank">安装stage3</a>——也就是最基础的根文件系统。</li>
<li><a href="http://www.funtoo.org/wiki/Funtoo_Linux_Installation#Configuring_your_system" target="_blank">配置</a>这个最基础的系统。</li>
<li>利用该文件系统提供的基础工具<a href="http://www.funtoo.org/wiki/Funtoo_Linux_Installation#Configuring_and_installing_the_Linux_kernel" target="_blank">编译安装Linux内核</a>。</li>
<li><a href="http://www.funtoo.org/wiki/Funtoo_Linux_Installation#Installing_a_Bootloader" target="_blank">安装grub2</a>作为bootloader。</li>
</ul>
<p>如果你对类Unix系统的基本概念非常了解，这个过程看上去应该是水到渠成的。安装的细节虽然无需多言，Funtoo提供的指南已经十分详尽，但这里却有一些非常有趣的概念值得讨论。</p>
<p>第一，这个安装过程的全部魔法都在chroot命令上。我一直以为这个命令是类Unix操作系统设计的精华之一。为什么这么说呢？众所周知，Linux操作系统对它的跟文件系统有一个必要的假设。即，<a href="http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard" target="_blank">根文件系统是一棵树</a>。而这个树的根就是“/”。像硬盘，SSD之类的块设备可以通过“挂载”（mount）的方式，将实体的存储设备挂载到这棵逻辑中存在的树的任意节点上。当系统在这棵树上创建新文件或者修改任何既有内容时，这种变更就会被反映到实际的存储设备上。树结构的妙处在于，任意一棵子树和拥有该子树的“大树”总是相似的。当你将准备好的硬盘分区挂载到这棵树上，并且chroot进入这个树的子树，你就的到了一个全新的“根文件系统”。但于此同时，系统运行的却是原来大树中预装的Linux内核，由此来帮助新文件系统的生成。这种方法在Windows系统中听起来有点像天方夜谭但是在Linux系统中，却是司空见惯。采用这种方法可也在多个不同的根文件系统之间无缝的切换，比如，你可以在一个64位系统的根文件系统的某一棵子树上创建一个32位系统子树。这对于很多系统测试和环境搭建都不无裨益。一个典型的例子就是debian系统采用<a href="http://wiki.debian.org/Debootstrap" target="_blank">chroot的方式</a>帮助开发者创建一个便于创建软件包的标准环境，由此，<code>.deb</code>包才可以避免现有系统不同配置的影响而适用与各种不同配置的系统。</p>
<p>第二，这个安装过程实际上那个暗示了如何从无到有得建造一个操作系统。Linux操作系统的发端就是1990年Linux写给邮件列表的那封信。在已有系统软件——包括编译器，链接器的帮助下，生产内核代码才是可能的。用软件来制造软件。这是一个非常自然的过程。我记得有一句话叫“以机器制造机器标志这第二次工业革命的开始”。而以软件制造软件也是现在软件行业的一个重要标志。也只有当这种衍生和扩展的能力和半导体的几何级数式的蓬勃发展结合起来的时候，这种能力才创造了极大的社会财富。</p>
<p>第三，一些配置和编译的选择也值得讨论一下。</p>
<p>首当其冲的就是UEFI和GPT分区。区别与传统的BIOS和MBR分区，这两个技术都有一些进步。GPT几乎是必要的（desirable）。但是，如果你的系统主板是建立在UEFI之上的话，Linux系统可能会遇到一些问题。这并<a href="https://plus.google.com/102150693225130002912/posts/QLe3tSmtSM4" target="_blank">不是Linux的错</a>，而是因为大多说UEFI固件都缺乏必要的测试问题百出，以至于根本无法保证系统兼容性。对于后面这一点我实在没有什么好的建议，大概能说的只有一条，选择UEFI主板的时候一定要先调查一下再做决定。</p>
<p>创建分区和创建文件系统的分离是让那些在Windows中模糊成一团的操作系统概念变得更加清晰了。对文件系统的选择又是另一个问题。一般来说根据用户的实际应用应该选择不同的文件系统，比如，一些文件在处理“小文件”的时候有明显优势，一些文件系统有灵活配置的特性等等。当然，ext4文件系统适用于大多数桌面应用。虽然这个指南中仅仅提供了传统的采用<code>/dev/sd*</code>方式记述的<code>/etc/fstab</code>，但实际上Funtoo也支持<a href="http://www.cyberciti.biz/faq/linux-finding-using-uuids-to-update-fstab/" target="_blank">UUID作为标记</a>在<code>/etc/fstab</code>中使用。</p>
<p>对很多中文用户来说，键盘布局不是问题。因为，大多数在中国销售的计算机实际上是直接使用英语键盘布局的，所以<code>/etc/conf.d/keymaps</code>中采用默认值没有什么问题。我的情况比较特殊，因为日语键盘布局与英文键盘布局存在相当大的差异。我必须在上面提到的文件中制定键盘布局为<code>jp106</code>。如果你想在运行时改变系统的键盘布局，可以使用下面的命令。</p>
<pre>setxkbmap xx   ## xx 是两个字母的国家代码，比如us</pre>
<p>当编译安装好的内核和基础系统可以启动以后，我尝试继续跟随Funtoo的指南<a href="http://www.funtoo.org/wiki/Funtoo_Linux_First_Steps" target="_blank">对基础系统升级并且安装了X Server和必要的系统软件</a>。这样，一个极简洁的Linux操作系统诞生了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamjiang.com/archives/1154/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>以Funtoo为基础的Linux桌面系统（1）</title>
		<link>http://www.adamjiang.com/archives/1140</link>
		<comments>http://www.adamjiang.com/archives/1140#comments</comments>
		<pubDate>Mon, 14 May 2012 15:46:09 +0000</pubDate>
		<dc:creator>jcadam</dc:creator>
				<category><![CDATA[Linux tips]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[源代码]]></category>
		<category><![CDATA[环境配置]]></category>

		<guid isPermaLink="false">http://www.adamjiang.com/?p=1140</guid>
		<description><![CDATA[这个系列的最初起源是一大堆牢骚。当我觉得自己拯救自己的时候，我问了自己这样的问题——如果Ubuntu是错的，那么什么样的桌面系统是对的？也许我尚未找到答案，但至少我觉得以下几点是一个优秀的Linux桌面系统必须具备的特性 源代码是开源软件的灵魂，优秀的包管理系统是强健的骨骼；这个系统必须无缝的升级并且尽可能的贴近源码。 桌面系统必须是轻量级的；它可以快速的启动和关闭。 使用什么样的应用程序应该由用户选择，而这些应用程序之间可以通过统一接口调用。 第一个要求将我引向了Gentoo。Gentoo Linux是以源代码为基础的发行版。它最重要的特色就是portage/emerge包管理系统。每一个Gentoo软件包全部都会在初次安装时从软件的源代码编译生成。每当软件推出新版本的时候，portage/emerge可以帮助用户重新编译并且安装新版本。同时，portage/emerge还可以根据用户的需要，安装同一个软件的多个不同版本。因为不需要二进制和打包的中间过程，这种升级就真正做到了“无缝”。因为系统组建之间之间无非就是动态链接和静态链接创建的简单耦合。所以，它也消除了以二进制文件为基础的包管理系统所创建的不必要的强耦合关系。这使得用户升级和调试单独软件包是获得了充分的自由。这种自由还体现在一种叫做Overlay的机制上。Overlay就是“覆盖”的意思。Gentoo通过这种机制让用户可以创建自己的软件包,并且将这些软件包按照一定的规则排列成树状结构来覆盖/定制官方默认的编译选项和软件特性。当然，用户也可以给自己的Overlay中添加新软件。很多用户在使用Gentoo的同时会创建自己的Overlay。我也将自己的对软件包的选择固化成了一个Overlay，你可以在这里找到它。Funtoo Linux是在Gentoo项目的基础上发展起来的新项目，它区别于Gentoo的最大特色在于以git为核心的软件包更新机制（虽然现在Gentoo也支持以git为基础的同步和升级）。除此以外，Funtoo还提供了比Gentoo更优秀的用户辅助工具——比如boot-update，所以我选择了Funtoo作为基础来建造自己的桌面系统。 对于第二个问题，我的答案是Openbox。为什么不是Gnome或者KDE这样的Desktop environment？因为Gnome项目已经“误入歧途”，至少这是我通过观察得到的结论。而KDE却也不能称作“轻量级”。那么只有在众多的Window Manager（窗口管理器）中选择一款了。我最初尝试了Fluxbox，它非常优秀，可是对于cjk用户并不友好，因为我的Firefox的窗口标题连不能显示中文或者日语这些双字节文字。于是理所当然的，我选择了Openbox。Openbox的开发相对活跃，并且拥有广泛的用户基础。很多发行版都提供了Openbox软件，更有一款非常引人注目的Crunchbang发行版将Openbox作为桌面系统解决方案的基础。这也正是我学习的对象。 最后一点是最贴近用户的问题。每个人对软件的偏好不一样，所以，桌面系统中使用什么样的软件应该由用户自己来决定。一个Web开发者的桌面系统和一个Android开发者的桌面系统应当有很大的区别。比如，前者可能需要curl，bluefish，python/PHP编辑器和多个不同的浏览器——采用wine或者虚拟机安装的IE，不同版本的Firefox和Chrome——等等；而后者，则需要编译Android软件的必要的库和工具，可以运行虚拟机的Java环境，eclipse集成开发环境等等。核心工具集以外的软件，在大多数情况下只能被称作“冗余”而别无他用。当Ubuntu一股脑塞给我OpenOffice套件和Evolution的时候，往往我在安装结束后做的第一件事情就是卸载掉这些冗余。另一个问题是应用程序之间的接口。比如，Windows的COM组件，还有Mac OS的Apple Script，它们都提供了一个完全或者不完全的统一接口来解决应用程序之间通信和“宏操作”的问题。Linux桌面也同样必须拥有这样的机制，否则可能连copy/paste操作也是问题。DBus就是解决这个问题的不二之选。]]></description>
			<content:encoded><![CDATA[<p>这个系列的最初起源是一大堆<a href="http://www.adamjiang.com/archives/1125" target="_blank">牢骚</a>。当我觉得自己拯救自己的时候，我问了自己这样的问题——如果Ubuntu是错的，那么什么样的桌面系统是对的？也许我尚未找到答案，但至少我觉得以下几点是一个优秀的Linux桌面系统必须具备的特性</p>
<ul>
<li>源代码是开源软件的灵魂，优秀的包管理系统是强健的骨骼；这个系统必须无缝的升级并且尽可能的贴近源码。</li>
<li>桌面系统必须是轻量级的；它可以快速的启动和关闭。</li>
<li>使用什么样的应用程序应该由用户选择，而这些应用程序之间可以通过统一接口调用。</li>
</ul>
<p>第一个要求将我引向了Gentoo。Gentoo Linux是以源代码为基础的发行版。它最重要的特色就是portage/emerge包管理系统。每一个Gentoo软件包全部都会在初次安装时从软件的源代码编译生成。每当软件推出新版本的时候，portage/emerge可以帮助用户重新编译并且安装新版本。同时，portage/emerge还可以根据用户的需要，安装同一个软件的多个不同版本。因为不需要二进制和打包的中间过程，这种升级就真正做到了“无缝”。因为系统组建之间之间无非就是动态链接和静态链接创建的简单耦合。所以，它也消除了以二进制文件为基础的包管理系统所创建的不必要的强耦合关系。这使得用户升级和调试单独软件包是获得了充分的自由。这种自由还体现在一种叫做Overlay的机制上。Overlay就是“覆盖”的意思。Gentoo通过这种机制让用户可以创建自己的软件包,并且将这些软件包按照一定的规则排列成树状结构来覆盖/定制官方默认的编译选项和软件特性。当然，用户也可以给自己的Overlay中添加新软件。很多用户在使用Gentoo的同时会创建自己的Overlay。我也将自己的对软件包的选择固化成了一个Overlay，你可以在<a href="https://github.com/jcadam/picky-overlay" target="_blank">这里</a>找到它。<a href="http://www.funtoo.org/wiki/Welcome" target="_blank">Funtoo Linux</a>是在Gentoo项目的基础上发展起来的新项目，它区别于Gentoo的最大特色在于以git为核心的软件包更新机制（虽然现在Gentoo也支持以git为基础的同步和升级）。除此以外，Funtoo还提供了比Gentoo更优秀的用户辅助工具——比如boot-update，所以我选择了Funtoo作为基础来建造自己的桌面系统。</p>
<p>对于第二个问题，我的答案是Openbox。为什么不是Gnome或者KDE这样的Desktop environment？因为Gnome项目已经“误入歧途”，至少这是我通过观察得到的结论。而KDE却也不能称作“轻量级”。那么只有在众多的Window Manager（窗口管理器）中选择一款了。我最初尝试了Fluxbox，它非常优秀，可是对于cjk用户并不友好，因为我的Firefox的窗口标题连不能显示中文或者日语这些双字节文字。于是理所当然的，我选择了Openbox。Openbox的开发相对活跃，并且拥有广泛的用户基础。很多发行版都提供了Openbox软件，更有一款非常引人注目的<a href="http://crunchbanglinux.org/" target="_blank">Crunchbang</a>发行版将Openbox作为桌面系统解决方案的基础。这也正是我学习的对象。</p>
<p>最后一点是最贴近用户的问题。每个人对软件的偏好不一样，所以，桌面系统中使用什么样的软件应该由用户自己来决定。一个Web开发者的桌面系统和一个Android开发者的桌面系统应当有很大的区别。比如，前者可能需要curl，bluefish，python/PHP编辑器和多个不同的浏览器——采用wine或者虚拟机安装的IE，不同版本的Firefox和Chrome——等等；而后者，则需要编译Android软件的必要的库和工具，可以运行虚拟机的Java环境，eclipse集成开发环境等等。核心工具集以外的软件，在大多数情况下只能被称作“冗余”而别无他用。当Ubuntu一股脑塞给我OpenOffice套件和Evolution的时候，往往我在安装结束后做的第一件事情就是卸载掉这些冗余。另一个问题是应用程序之间的接口。比如，Windows的COM组件，还有Mac OS的Apple Script，它们都提供了一个完全或者不完全的统一接口来解决应用程序之间通信和“宏操作”的问题。Linux桌面也同样必须拥有这样的机制，否则可能连copy/paste操作也是问题。DBus就是解决这个问题的不二之选。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamjiang.com/archives/1140/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>极简主义Funtoo</title>
		<link>http://www.adamjiang.com/archives/1117</link>
		<comments>http://www.adamjiang.com/archives/1117#comments</comments>
		<pubDate>Sat, 28 Apr 2012 09:40:22 +0000</pubDate>
		<dc:creator>jcadam</dc:creator>
				<category><![CDATA[Linux tips]]></category>

		<guid isPermaLink="false">http://www.adamjiang.com/?p=1117</guid>
		<description><![CDATA[Openbox based brand new Funtoo desktop]]></description>
			<content:encoded><![CDATA[<p>Openbox based brand new Funtoo desktop</p>
<p><a href="http://www.adamjiang.com/wp-content/uploads/2012/04/2012-04-28-1335605723_1680x1050_scrot.png"><img src="http://www.adamjiang.com/wp-content/uploads/2012/04/2012-04-28-1335605723_1680x1050_scrot-300x187.png" alt="" title="2012-04-28--1335605723_1680x1050_scrot" width="300" height="187" class="alignnone size-medium wp-image-1118" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamjiang.com/archives/1117/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在mutt中使用Gmail地址簿</title>
		<link>http://www.adamjiang.com/archives/1101</link>
		<comments>http://www.adamjiang.com/archives/1101#comments</comments>
		<pubDate>Fri, 23 Dec 2011 06:54:51 +0000</pubDate>
		<dc:creator>jcadam</dc:creator>
				<category><![CDATA[Linux tips]]></category>
		<category><![CDATA[contact]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mutt]]></category>

		<guid isPermaLink="false">http://www.adamjiang.com/?p=1101</guid>
		<description><![CDATA[这又是关于mutt的记事。公司的IT着实非常落后，至今我们仍在使用微软的Office outlook作邮件客户端。没有gmail，没有webmail，倒是直到上周才为每位员工购买了一款叫做Good的Android软件来查看邮件。可是无论怎样，mutt一直是我钟爱的一款邮件客户端。它已经长在我的手指上。现在在公司的开发机器上我已经可以使用IMAP和SMTP收发邮件，也可以在mutt中使用全公司的LDAP来查找地址，所以，整个功能跟低效的Outlook没有区别，处理邮件的速度却比使用Outlook提高了至少两倍。特别是遇到跟工程师之间通信需要贴代码或者发git patch的时候尤其如此。当通过mutt使用自己的gmail的时候，我遇到了一问题，就是Gmail本身并没有提供LDAP接口用来查询地址，于是我无法套用使用公司邮件的配置来查找地址了。昨天在github上发现了一个perl脚本可以解决这个问题。 Gmail提供了API可以帮助外部应用程序取得地址簿中的数据。Ajnasz的这个脚本可以取得地址簿数据并且用查询字符串匹配，从而找到联系人的邮件地址。但是，但是原来的脚本有一个小问题——无法使用中文或者日语姓名作为查询字符串。自己动手，丰衣足食。我在原代码的基础只添加了两行代码，现在查询中文姓名也没有问题了。如果你有兴趣可以从这里拿到代码。 git clone git://github.com/jcadam/Google-Contacts-for-Mutt.git gc-mutt 这个脚本需要一个简单的配置文件用来取得Gmail数据的访问权限。你可以仿照下面这个例子做自己的配置文件。 $ vi ~/.google.ini [account] email = 'youraccount@gmail.com' password = 'Passw0rd' 为了防止其他用户访问你的文件增强安全，你可将文件的属性设置成所有者只读。 $ chmod 400 ~/.google.ini 进入contacts.pl脚本所在目录，然后不带任何参数运行这个脚本，你就可以得到整个Gmail联系人名簿。可以先测试一下。 $ cd $ ./contacts.pl 接着，在PATH变量中的任何一个目录中，通常是/usr/local/bin/或者~/bin，建立一个Shell helper了查询数据。 $ vi ~/bin/contracts #!/usr/bin/env bash ${HOME}/github/gc-mutt/contacts.pl ${1} 然后告诉mutt查询联系人时使用这个helper脚本查询。在~/.muttrc中添加如下一行即可。 set query_command="~/bin/contacts '%s'" 测试一下。在mutt中新建邮件(m)，在To:栏中直接输入联系人的名字，比如”Mark Brown”， 然后按”ctrl-t”查找地址簿。 mutt会自动查询地址布并且取回Mark的邮件地址。]]></description>
			<content:encoded><![CDATA[<p>这又是关于mutt的记事。公司的IT着实非常落后，至今我们仍在使用微软的Office outlook作邮件客户端。没有gmail，没有webmail，倒是直到上周才为每位员工购买了一款叫做Good的Android软件来查看邮件。可是无论怎样，mutt一直是我钟爱的一款邮件客户端。它已经长在我的手指上。现在在公司的开发机器上我已经可以使用IMAP和SMTP收发邮件，也可以在mutt中使用全公司的LDAP来查找地址，所以，整个功能跟低效的Outlook没有区别，处理邮件的速度却比使用Outlook提高了至少两倍。特别是遇到跟工程师之间通信需要贴代码或者发git patch的时候尤其如此。当通过mutt使用自己的gmail的时候，我遇到了一问题，就是Gmail本身并没有提供LDAP接口用来查询地址，于是我无法套用使用公司邮件的配置来查找地址了。昨天在github上发现了一个perl脚本可以解决这个问题。</p>
<p>Gmail提供了API可以帮助外部应用程序取得地址簿中的数据。<a href="https://github.com/Ajnasz">Ajnasz</a>的这个脚本可以取得地址簿数据并且用查询字符串匹配，从而找到联系人的邮件地址。但是，但是原来的脚本有一个小问题——无法使用中文或者日语姓名作为查询字符串。自己动手，丰衣足食。我在原代码的基础只添加了两行代码，现在查询中文姓名也没有问题了。如果你有兴趣可以从<a href="http://github.com/jcadam/Google-Contacts-for-Mutt">这里</a>拿到代码。</p>
<pre>
git clone git://github.com/jcadam/Google-Contacts-for-Mutt.git gc-mutt
</pre>
<p>这个脚本需要一个简单的配置文件用来取得Gmail数据的访问权限。你可以仿照下面这个例子做自己的配置文件。</p>
<pre>
$ vi ~/.google.ini
</pre>
<pre>
[account]
email = 'youraccount@gmail.com'
password = 'Passw0rd'
</pre>
<p>为了防止其他用户访问你的文件增强安全，你可将文件的属性设置成所有者只读。</p>
<pre>
$ chmod 400 ~/.google.ini
</pre>
<p>进入contacts.pl脚本所在目录，然后不带任何参数运行这个脚本，你就可以得到整个Gmail联系人名簿。可以先测试一下。</p>
<pre>
$ cd <where_gc-mutt_is>
$ ./contacts.pl
</pre>
<p>接着，在PATH变量中的任何一个目录中，通常是/usr/local/bin/或者~/bin，建立一个Shell helper了查询数据。</p>
<pre>
$ vi ~/bin/contracts
</pre>
<pre>
#!/usr/bin/env bash
${HOME}/github/gc-mutt/contacts.pl ${1}
</pre>
<p>然后告诉mutt查询联系人时使用这个helper脚本查询。在~/.muttrc中添加如下一行即可。</p>
<pre>
set query_command="~/bin/contacts '%s'"
</pre>
<p>测试一下。在mutt中新建邮件(m)，在<code>To:</code>栏中直接输入联系人的名字，比如”Mark Brown”，</p>
<p><a href="http://www.adamjiang.com/wp-content/uploads/2011/12/mutt-1.png"><img src="http://www.adamjiang.com/wp-content/uploads/2011/12/mutt-1.png" alt="" title="mutt-1" width="595" height="57" class="alignnone size-full wp-image-1103" /></a></p>
<p>然后按”ctrl-t”查找地址簿。</p>
<p><a href="http://www.adamjiang.com/wp-content/uploads/2011/12/mutt-2.png"><img src="http://www.adamjiang.com/wp-content/uploads/2011/12/mutt-2.png" alt="" title="mutt-2" width="422" height="57" class="alignnone size-full wp-image-1104" /></a></p>
<p>mutt会自动查询地址布并且取回Mark的邮件地址。</p>
<p><a href="http://www.adamjiang.com/wp-content/uploads/2011/12/mutt-3.png"><img src="http://www.adamjiang.com/wp-content/uploads/2011/12/mutt-3.png" alt="" title="mutt-3" width="447" height="50" class="alignnone size-full wp-image-1105" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamjiang.com/archives/1101/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gmail的IMAP和Mutt</title>
		<link>http://www.adamjiang.com/archives/891</link>
		<comments>http://www.adamjiang.com/archives/891#comments</comments>
		<pubDate>Fri, 27 Aug 2010 03:22:01 +0000</pubDate>
		<dc:creator>jcadam</dc:creator>
				<category><![CDATA[Linux tips]]></category>

		<guid isPermaLink="false">http://www.adamjiang.com/?p=891</guid>
		<description><![CDATA[今天我想说的还是Mutt的问题。一年以前我写了通过mutt使用gmail。现在再回头看这篇文章的内容已经有些老旧了，只好在感慨时光如梭的同时附上更新。电子邮件对我来说越来越重，相应的Mutt这个邮件客户端也是如此。就像Mutt的作者说的，所有的邮件客户端都很烂，只是Mutt烂的不那么厉害罢了。我希望这几篇文章有用。 之前的解决方法相当复杂，需要mutt, procmail, fetchmail和msmtp等等工具的配合，配置起来非常繁琐。使用了很久这个方法之后，我发现还是使用IMAP直接远程接入Gmail比较简便。但是也有相应的缺点，那就是，使用IMAP的话，你就不能在离线状态中使用mutt了。 配置Gmail的IMAP和Mutt一起工作，相比用fetchmail去pop3服务器上的邮件，这个方法主要更改以下几点： 配置Gmail的IMAP 设置远程服务器上的文件夹 设置本地计算机上的缓冲 设置远程服务器上的smtp服务 至于，邮件别名，色彩，和快捷键绑定等等，跟之前介绍的方法并无二致。 配置Gmail的IMAP 创建或者修改~/.muttrc， vi ~/.muttrc 添加如下几行来告诉mutt你是谁，这里设置的姓名和邮件地址将出现在你的邮件的头部； set from = "yourusername@gmail.com" set realname = "yourname" 接着，告诉mutt你Gmail邮箱和密码； set imap_user = "yourusername@gmail.com" set imap_pass = "yourpassword" 在初次启动mutt的时候，mutt会询问你是否接受认证文件，你只需要回答”Yes”就可以了。 设置远程服务器上的文件夹 Mutt可以自动的识别IMAP服务器上的邮件文件夹，所以这里其实不需要更多的动作。但是如果你想做一些自己的配置，可以采用下面的方法； set folder = "imaps://imap.gmail.com:993" set spoolfile = "+INBOX" set postponed ="+[Gmail]/Drafts" set trash = "imaps://imap.gmail.com/[Gmail]/Trash" 设置本地计算机上的缓冲 在本地计算机上，你需要一个缓冲来保存文件头信息，以及TLS证书等； set header_cache =~/.mutt/cache/headers [...]]]></description>
			<content:encoded><![CDATA[<p>今天我想说的还是Mutt的问题。一年以前我写了<a href="http://www.adamjiang.com/archives/33" title="通过mutt使用gmail">通过mutt使用gmail</a>。现在再回头看这篇文章的内容已经有些老旧了，只好在感慨时光如梭的同时附上更新。电子邮件对我来说越来越重，相应的Mutt这个邮件客户端也是如此。就像Mutt的作者说的，所有的邮件客户端都很烂，只是Mutt烂的不那么厉害罢了。我希望这几篇文章有用。</p>
<p>之前的解决方法相当复杂，需要mutt, procmail, fetchmail和msmtp等等工具的配合，配置起来非常繁琐。使用了很久这个方法之后，我发现还是使用IMAP直接远程接入Gmail比较简便。但是也有相应的缺点，那就是，使用IMAP的话，你就不能在离线状态中使用mutt了。</p>
<p>配置Gmail的IMAP和Mutt一起工作，相比用fetchmail去pop3服务器上的邮件，这个方法主要更改以下几点：</p>
<ol>
<li>配置Gmail的IMAP</li>
<li>设置远程服务器上的文件夹</li>
<li>设置本地计算机上的缓冲</li>
<li>设置远程服务器上的smtp服务</li>
</ol>
<p>至于，邮件别名，色彩，和快捷键绑定等等，跟<a href="http://www.adamjiang.com/archives/33" title="通过mutt使用gmail">之前介绍</a>的方法并无二致。</p>
<p><strong>配置Gmail的IMAP</strong><br />
创建或者修改<code>~/.muttrc</code>，</p>
<pre>
vi ~/.muttrc
</pre>
<p>添加如下几行来告诉mutt你是谁，这里设置的姓名和邮件地址将出现在你的邮件的头部；</p>
<pre>
set from = "yourusername@gmail.com"
set realname = "yourname"
</pre>
<p>接着，告诉mutt你Gmail邮箱和密码；</p>
<pre>
set imap_user = "yourusername@gmail.com"
set imap_pass = "yourpassword"
</pre>
<p>在初次启动mutt的时候，mutt会询问你是否接受认证文件，你只需要回答”Yes”就可以了。</p>
<p><strong>设置远程服务器上的文件夹</strong><br />
Mutt可以自动的识别IMAP服务器上的邮件文件夹，所以这里其实不需要更多的动作。但是如果你想做一些自己的配置，可以采用下面的方法；</p>
<pre>
set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set postponed ="+[Gmail]/Drafts"
set trash = "imaps://imap.gmail.com/[Gmail]/Trash"
</pre>
<p><strong>设置本地计算机上的缓冲</strong><br />
在本地计算机上，你需要一个缓冲来保存文件头信息，以及TLS证书等；</p>
<pre>
set header_cache =~/.mutt/cache/headers
set message_cachedir =~/.mutt/cache/bodies
set certificate_file =~/.mutt/certificates
</pre>
<p>别忘了创建相应的本地文件夹</p>
<pre>
mkdir -p ~/.mutt/cache
</pre>
<p><strong>设置远程服务器上的smtp服务</strong><br />
设置smtp服务器用来发送邮件</p>
<pre>
set smtp_url = "smtp://yourusername@smtp.gmail.com:587/"
set smtp_pass = "yourpassword"
</pre>
<p><strong>其他设置</strong><br />
告诉Mutt不要将邮件移动的mbox里，同时为了增强安全性，设置连续上线时间不超过900分钟；</p>
<pre>
set move = no
set imap_keepalive = 900
</pre>
<p>让mutt的配置文件成为“只读”属性。</p>
<pre>
chmod 700 .muttrc
</pre>
<p>配置结束。关于诸如色彩，快捷键，邮件编辑器等其他部分的配置，请参考<a href="http://www.adamjiang.com/_muttrc" title="my mutt configuration">我的mutt配置文件</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamjiang.com/archives/891/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>纪念MacOS 9</title>
		<link>http://www.adamjiang.com/archives/881</link>
		<comments>http://www.adamjiang.com/archives/881#comments</comments>
		<pubDate>Thu, 10 Jun 2010 03:11:49 +0000</pubDate>
		<dc:creator>jcadam</dc:creator>
				<category><![CDATA[Linux tips]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[OS 9]]></category>
		<category><![CDATA[Screenshot]]></category>

		<guid isPermaLink="false">http://www.adamjiang.com/?p=881</guid>
		<description><![CDATA[嘿，我得承认我是半个水果迷。昨天偶尔在Apple4us看到WWDC的历史中提到MacOS 9，才发现图形用户界面最初的样子是那么迷人。于是，我决定将我的GNU/Linux打扮成MacOS 9的样子。Here comes my lovely screenshot.]]></description>
			<content:encoded><![CDATA[<p>嘿，我得承认我是半个水果迷。昨天偶尔在Apple4us看到WWDC的历史中提到MacOS 9，才发现图形用户界面最初的样子是那么迷人。于是，我决定将我的GNU/Linux打扮成MacOS 9的样子。Here comes my lovely screenshot.</p>
<p><a href="http://www.adamjiang.com/wp-content/uploads/2010/06/MacOs-9-like-screen.png"><img class="size-medium wp-image-882 alignnone" title="MacOs-9-like-screen" src="http://www.adamjiang.com/wp-content/uploads/2010/06/MacOs-9-like-screen-300x225.png" alt="MacOs 9 on Gnome" width="300" height="225" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamjiang.com/archives/881/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>﻿Gmail证书变更导致的msmtp错误</title>
		<link>http://www.adamjiang.com/archives/858</link>
		<comments>http://www.adamjiang.com/archives/858#comments</comments>
		<pubDate>Fri, 28 May 2010 09:56:45 +0000</pubDate>
		<dc:creator>jcadam</dc:creator>
				<category><![CDATA[Linux tips]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mutt]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.adamjiang.com/?p=858</guid>
		<description><![CDATA[大约一年前我写了《通过mutt使用gmail》，之后因为更换新机器有没有时间再将 mutt等工具配置起来；今天重新在新的gentoo系统上配置Mutt使用gmail却发现原 来的方法出错了。 错误消息如下 msmtp: TLS certificate verification failed: the certificate hasn’t got a known issuer. 很显然，google将gmail的cert变更了。单纯的使用msmtp确认一下： % msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off SMTP server at smtp.gmail.com ([74.125.53.109]), port 587: mx.google.com ESMTP r20sm18086225wam.17 TLS certificate information: Owner: Common Name: smtp.gmail.com Organization: Google Inc Locality: Mountain View State or Province: California Country: US Issuer: Common [...]]]></description>
			<content:encoded><![CDATA[<p>大约一年前我写了《<a title="通过mutt使用gmail" href="http://www.adamjiang.com/archives/33" target="_blank">通过mutt使用gmail</a>》，之后因为更换新机器有没有时间再将</p>
<p>mutt等工具配置起来；今天重新在新的gentoo系统上配置Mutt使用gmail却发现原<br />
来的方法出错了。</p>
<p>错误消息如下</p>
<pre>msmtp: TLS certificate verification failed: the certificate hasn’t got a
known issuer.</pre>
<p>很显然，google将gmail的cert变更了。单纯的使用msmtp确认一下：</p>
<pre>% msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
SMTP server at smtp.gmail.com ([74.125.53.109]), port 587:
    mx.google.com ESMTP r20sm18086225wam.17
TLS certificate information:
    Owner:
        Common Name: smtp.gmail.com
        Organization: Google Inc
        Locality: Mountain View
        State or Province: California
        Country: US
    Issuer:
        Common Name: Google Internet Authority
        Organization: Google Inc
        Country: US
    Validity:
        Activation time: 2010年04月23日 05時02分45秒
        Expiration time: 2011年04月23日 05時12分45秒
    Fingerprints:
        SHA1: 1A:6F:48:8F:BE:5B:FD:92:D8:12:30:F9:22:CE:84:49:B3:43:BD:2C
        MD5:  60:39:DE:FB:0A:D9:9E:43:26:E7:75:AC:60:48:A1:B0
Capabilities:
    SIZE 35651584:
        Maximum message size is 35651584 bytes = 34.00 MB
    STARTTLS:
        Support for TLS encryption via the STARTTLS command
    AUTH:
        Supported authentication methods:
        PLAIN LOGIN</pre>
<p>之前使用过的Thwate Server已经过期了，Issuer字段变成了由google之间给<br />
cert。:(</p>
<p>幸好，修复这个错误非常容易，在debain或者ubuntu系统上可以安装<br />
ca-certificates包来修复这个错误。</p>
<pre># sudo apt-get install ca-certificates
# dpkg -s ca-certificates | grep Version
Version: 20090814</pre>
<p>然后，只要更改~/.msmtprc文件就可以了，将tls_trust_file改正为</p>
<pre>tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt</pre>
<p>gentoo用户需要将这个文件download下来，并且重新指定tls的位置：</p>
<p><a href="http://sysinf0.klabs.be/usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt?f=download;dist=etch;component=main;arch=i386;pkg=ca-certificates;ver=20070303" title="Equifax_Secure_CA.crt"></p>
<p>http://sysinf0.klabs.be/usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt?f=download;dist=etch;component=main;arch=i386;pkg=ca-certificates;ver=20070303</p>
<p></a></p>
<p>P.S. 博客并不适合用来记录这样内容，但是，前一篇gmail相关文章已经贴到了博<br />
客，照例还是帖一篇上来吧，各位见谅。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamjiang.com/archives/858/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置Ubuntu Jaunty和双显示器一起工作</title>
		<link>http://www.adamjiang.com/archives/643</link>
		<comments>http://www.adamjiang.com/archives/643#comments</comments>
		<pubDate>Sat, 18 Jul 2009 10:18:56 +0000</pubDate>
		<dc:creator>jcadam</dc:creator>
				<category><![CDATA[Linux tips]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[Dual Monitor]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[GFX]]></category>
		<category><![CDATA[Intel]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.adamjiang.com/?p=643</guid>
		<description><![CDATA[OK. 这一篇的主旨只是为了记录我解决问题的过程。 关闭FrameBuffer设备 上周星期五，我以一千元人民币的价格淘到了垂涎已久的22存高清显示器。今天早晨送到家里，我自然是兴奋不已的打开看了。Ubuntu Jaunty启动之后可以很顺利的识别外接显示器，但是外接显示器的分辨率却不正确。使用xrandr查看，发现整个设备的大小受到限制。Thinkpad X61的spec上写的很清楚，整个图形卡的最大可表现区域是因该是外接显示器于笔记本固有显示器面积的总和，也就是2944&#215;1080。使用xrandr -q查看，发现这个最大值并没有被正确设置。less /etx/X11/xorg.conf看到，配置文件中启用了FrameBuffer设备。立即恍然大悟。原来，早些日子，我在控制台上工作的时候，启用了FrameBuffer来获得更大的显示区域。为了支持这个控制台显示区域，X服务器只能割让一部分显示存储给FrameBuffer设备。要修改回来就是在内核参数行去掉vga=791选项——这个选项代表1024&#215;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 [...]]]></description>
			<content:encoded><![CDATA[<p>OK. 这一篇的主旨只是为了记录我解决问题的过程。</p>
<h3>关闭FrameBuffer设备</h3>
<p>上周星期五，我以一千元人民币的价格淘到了垂涎已久的22存高清显示器。今天早晨送到家里，我自然是兴奋不已的打开看了。Ubuntu Jaunty启动之后可以很顺利的识别外接显示器，但是外接显示器的分辨率却不正确。使用xrandr查看，发现整个设备的大小受到限制。<a href="http://www-06.ibm.com/jp/pc/notebooks/thinkpad/x-series/x61_lineup_4x.shtml">Thinkpad X61的spec</a>上写的很清楚，整个图形卡的最大可表现区域是因该是外接显示器于笔记本固有显示器面积的总和，也就是2944&#215;1080。使用<code>xrandr -q</code>查看，发现这个最大值并没有被正确设置。<code>less /etx/X11/xorg.conf</code>看到，配置文件中启用了FrameBuffer设备。立即恍然大悟。原来，早些日子，我在控制台上工作的时候，启用了FrameBuffer来获得更大的显示区域。为了支持这个控制台显示区域，X服务器只能割让一部分显示存储给FrameBuffer设备。要修改回来就是在内核参数行去掉vga=791选项——这个选项代表1024&#215;768的FrameBuffer能力。并且，重新启动机器之后，利用<code>sudo dpkg-reconfigure -phigh xserver-xorg</code>来重新配制xserver。因为，从Ubuntu 8.10版本开始，这个发行版中启用了新的xserver，所以，大部分配置可以由xserver自动完成，不需要再手动更改xorg.conf配置文件了。重启xserver之后，我再用<code>xrandr -q</code>查看了设备能力，输入如下。这是保证双显示器expand输出的前提条件。</p>
<pre>
$ 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
</pre>
<h3>配置双显示器expand表示</h3>
<p>利用<code>gnome-display-properties</code>，我可以在这里动态的设置双显示的规格。有图为证。<br />
<img src="http://lh4.ggpht.com/_O-FwCW3mN_w/SmGe5HBeVuI/AAAAAAAAEQo/8pbjHGx86HM/gnome-display-properties.png" /><br />
如果这个方法受限，那么还有一个后背方案，就是采用<a href="http://intellinuxgraphics.org/dualhead.html">Intel显卡驱动官方站的指南</a>，采用xrandr来手动配置。</p>
<h3>更新Mesa</h3>
<p>设置双显示expand之后，我发现小显示器的一部分不能正确更新。初次看到这个现象的时候，我开始怀疑是不是设备能力有限，不能支持这么大的屏幕显示区域。但是仔细计算了一下，这种情况应该是不可能发生的。我的图形卡支持的最大输出是2944&#215;1080，那么宽度上1920+1024不会超过这个2944，而长度来看768小于1080。那问题出在哪里呢？我尝试关闭了“桌面效果”，也就是启用metacity来取代compiz做窗口管理器。我发现这样的话两个屏幕都是可以被正确更新的。立刻想到问题应该处在3D表示的驱动上面。也就是作为3D表示基础库的Mesa有问题。找到关键词就很容易搜索了，google之。立刻发现这个问题是出现在<a href="https://bugs.freedesktop.org/show_bug.cgi?id=18100">mesa-7.4版本之中的bug</a>。而这个bug已经被修复了。这个时候，我想是不是可以拿到mesa的源代码，然后给它打上补丁后重新package。于是立刻行动，我用<code>apt-get source libgl1-mesa-dev libgl1-mesa-dri</code>那到mesa的源代码，照猫画虎的打补丁。转念一下，这个问题应该已经有很多人遇到了，因为Jaunty发布已经有近4个月的时间，不会只有我遇到这个问题。于是乎，我在launchpad上搜索一下，发现果然有<a href="https://launchpad.net/~xorg-edgers/+archive/ppa">新版本的mesa</a>可以使用。因为这个PPA提供的是unstable版本软件包，所以该PPA的作者声明拒绝外部资源直接给出该PPA的使用方法用来保证每个用户都可以读到警告信息。这里就不再说到底怎么使用了。如果你想在Ubuntu中使用fresh的xorg相关软件包，那么直接点下面的连接跳转过去看看吧。<br />
<a href="https://launchpad.net/~xorg-edgers/+archive/ppa">https://launchpad.net/~xorg-edgers/+archive/ppa</a></p>
<p>经过以上步骤的折腾之后，我的Ubuntu就可以使用双显示器正常工作了。写代码的时候再也不需要挤在那个1024&#215;768的显示器上用Alt+Tab换来换去了。还有就是玩企鹅滑冰有些就更爽了。（话外音：真浪费）同学，我听见了，虽然这个安装过程还是遇到问题多多，但是谁让俺自己愿意折腾呢？由此可证，所有的GNU/Linux用户都是那“吃饱了没事撑着”的某些人。</p>
<p>&#8211;<br />
参考URL：<br />
<a href="http://lists.freedesktop.org/archives/xorg/2008-April/034707.html">http://lists.freedesktop.org/archives/xorg/2008-April/034707.html</a><br />
<a href="http://www.thinkwiki.org/wiki/Xorg_RandR_1.2#Summing_up">http://www.thinkwiki.org/wiki/Xorg_RandR_1.2#Summing_up</a><br />
<a href="https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/146298">https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/146298</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamjiang.com/archives/643/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

