<?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; 技术文章</title> <atom:link href="http://blog.ossxp.com/category/%e6%8a%80%e6%9c%af%e6%96%87%e7%ab%a0/feed/" rel="self" type="application/rss+xml" /><link>http://blog.ossxp.com</link> <description></description> <lastBuildDate>Wed, 14 Sep 2011 03:52:03 +0000</lastBuildDate> <generator>http://wordpress.org/?v=2.9.2</generator> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>apt-cacher-ng: 万能软件包代理</title><link>http://blog.ossxp.com/2011/04/2472/</link> <comments>http://blog.ossxp.com/2011/04/2472/#comments</comments> <pubDate>Wed, 20 Apr 2011 10:40:53 +0000</pubDate> <dc:creator>蒋 鑫</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[apt-cacher-ng]]></category> <category><![CDATA[《Got Git》]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2472</guid> <description><![CDATA[在 《Git权威指南》一书中，我在介绍 Cygwin 安装时，提到了如果整个团队在使用 Cygwin，最好架设一个代理服务器，这个代理服务器就好像一个本地软件包镜像，区别在于这个软件包镜像不是上游镜像的完整克隆，而是按需镜像。即第一次安装某个软件包时，代理服务器到上游获取然后缓存并发送给请求者，当再有用户请求同样的软件包时，直接从缓存中提取。架设这样的代理服务器，只需安装和配置 apt-cacher-ng 软件即可。
Apt-cacher-ng 本身就是一个 HTTP 协议代理，但是和其他 HTTP 代理服务器的区别在于：能够“识别”出从不同站点（源）请求下载的软件包是否是同一个软件包，即源的合并功能。
支持请求重定向。即可以不直接从客户请求的地址下载，而是重定向到预先设定的可能更快的镜像进行下载。Apt-cacher-ng 本来是服务于 Debian 和 Ubuntu，但是其通用性的设计，同样可以作为 Fedora, CentOS, Cygwin 等软件包代理。核心配置就是 Repomap 指令。
Remap-RepositoryName: MergingURLs ; TargetURLs
其中：RepositoryName 是本地的软件包镜像库（目录）的名称，该名称一旦确定不要变更。例如针对不同的系统软件包镜像，写为：debian, ubuntu, centos, 或 cygwin。
MergingURLs 是用空格分割的 URL 地址或者匹配 URL 的字符串。当请求的软件包地址和这些地址匹配后，就认为是针对 RepositoryName 软件包镜像库的请求。
分号后面的 TargetURLs 也是用空格分割的 URL 地址。TargetURLs 是可选项，如果设置，则对该软件包镜像库的访问重定向由 TargetURLs 指定的地址。Cygwin 的 Remap- 的设置：
Remap-cygwin: file:cygwin_mirrors.list /cygwin ; file:backends_cygwin
其中 file:cygwin_mirrors.list 所指向的文件包含所有 Cygwin 镜像（HTTP协议）地址，每个一行，这样就不至于让 <a
href="http://blog.ossxp.com/2011/04/2472/" class="more-link">阅读全部内容 &#187;</a>]]></description> <wfw:commentRss>http://blog.ossxp.com/2011/04/2472/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>搭建本地YUM软件仓库</title><link>http://blog.ossxp.com/2011/04/2420/</link> <comments>http://blog.ossxp.com/2011/04/2420/#comments</comments> <pubDate>Tue, 12 Apr 2011 08:46:01 +0000</pubDate> <dc:creator>崔贵林</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[yum]]></category> <category><![CDATA[软件源]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2420</guid> <description><![CDATA[通过前面RPM打包的学习，我们了解了如何制作RPM软件包，然后就可以HLL地通过rpm命令安装了，但是，一个很严肃的问题是，rpm不支持解决安装依赖，如果你的软件包安装时需要依赖神马神马包的话，RPM会这样告诉你：
$ rpm -ivh ~/rpmbuild/RPMS/i386/hello-0.2-1.i386.rpm
error: Failed dependencies:
world is needed by hello-0.2-1.i386
看，rpm说，我需要整个世界，这个包木有安装，这个包你有木有？有木有？
如果很幸运，你这里刚好有一个world包，赶紧安装：
$ rpm -ivh ~/rpmbuild/RPMS/i386/world-0.1-1.i386.rpm
error: Failed dependencies:
freedom is needed by world-0.1-1.i386
看来这个世界缺少自由呀，不行，还得寻找自由。。。怎么这么麻烦？有没有更好的解决方法？
你可能想到yum了。对，yum就是为解决依赖而生的，如果说redhat的rpm就像debian里的dpkg的话，那么yum就像aptitude了。
通过yum安装yum软件仓库里的软件包，它会自动解决软件安装依赖，一条命令就全部解决。
但，如果俺们的软件包并未在yum软件仓库里咋办呢？那么，咱家就自己搭建一个yum仓库吧~
在搭建yum软件仓库之前，先了解一下yum源的配置吧。YUM源探秘
centos中yum的主配置文件在/etc/yum.conf中，粘贴如下：
[main]
cachedir=/var/cache/yum
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
distroverpkg=redhat-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1# Note: yum-RHN-plugin doesn't honor this.
metadata_expire=1h# Default.
# installonly_limit = 3# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
这又是一个INI文件。第一行的cachedir定义了缓存的目录，最后一行说的就是可以把自己的软件仓库放在这个文件里或者以repo为后缀名放在/etc/yum.repos.d目录下。
为了方便起见，最好将配置文件存放在yum.repos.d目录下，而不是修改这个文件。
在软件源列表目录/etc/yum.repo.d/下，其中有一个是必须且唯一的，就是Base源文件。源文件是ini格式的。大致结构如下： ::
[server-id]
name=
mirrorlist=
baseurl=
gpgcheck= 0,不检查，1,检查
enabled= 0,禁用，1,启用server-id，指代软件库服务器id，在生成缓存时会生成对应的目录。如果是我们自己写的配置文件，这个地方可以任意，但注意看CentOS-Base.repo文件，这个是yum软件仓库的主要配置文件，有base,updates,addons,extras,centosplus,contrib这几个章节，这是不能随意修改的，这就是传说中的Base文件。
mirrorlist和baseurl两者使用一个即可，一般大型的官网，比如centos，fedora-epel会使用mirrorlist形式的，通过传递参数，自动选择最快的源，而对于咱们自己搭建的源来说，使用baseurl即可。
上面会使用几个变量：$releasever  发行版版本，如5.5
$arch   <a
href="http://blog.ossxp.com/2011/04/2420/" class="more-link">阅读全部内容 &#187;</a>]]></description> <wfw:commentRss>http://blog.ossxp.com/2011/04/2420/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>给RPM软件包签名</title><link>http://blog.ossxp.com/2011/04/2442/</link> <comments>http://blog.ossxp.com/2011/04/2442/#comments</comments> <pubDate>Tue, 12 Apr 2011 08:17:14 +0000</pubDate> <dc:creator>崔贵林</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[安全]]></category> <category><![CDATA[rpm]]></category> <category><![CDATA[签名]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2442</guid> <description><![CDATA[我们自己制作的软件包，为了防止被篡改，一般要使用私钥进行签名，然后将公钥广而告之，下载使用软件包的话，可以通过公钥进行验证签名，从而确保文件的原始性。生成密钥对
首先我们要使用gpp来生成公私钥对。目前最先进的加密算法是RSA，所以我们使用RSA来生成密钥对：
$ gpg --gen-key
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.gpg: 已创建目录‘/home/admin/.gnupg’
gpg: 新的配置文件‘/home/admin/.gnupg/gpg.conf’已建立
gpg: 警告：在‘/home/admin/.gnupg/gpg.conf’里的选项于此次运行期间未被使用
gpg: 钥匙环‘/home/admin/.gnupg/secring.gpg’已建立
gpg: 钥匙环‘/home/admin/.gnupg/pubring.gpg’已建立
请选择您要使用的密钥种类：
(1) DSA 和 ElGamal (默认)
(2) DSA (仅用于签名)
<a
href="http://blog.ossxp.com/2011/04/2442/" class="more-link">阅读全部内容 &#187;</a>]]></description> <wfw:commentRss>http://blog.ossxp.com/2011/04/2442/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Linux下的通用打开命令</title><link>http://blog.ossxp.com/2011/04/2437/</link> <comments>http://blog.ossxp.com/2011/04/2437/#comments</comments> <pubDate>Tue, 12 Apr 2011 02:30:06 +0000</pubDate> <dc:creator>崔贵林</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[mac]]></category> <category><![CDATA[open]]></category> <category><![CDATA[通用打开]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2437</guid> <description><![CDATA[在Mac下的终端里可以输入open来打开任意类型的文件，linux下是否也有类似的命令呢？
经查，发现有三个命令可以实现类似效果：seesee通过查找在mailcap文件中设定的文件类型和应用程序映射来打开文件。系统配置文件在/etc/mailcap，用户可以自定义配置文件到~/.mailcap。
通过see调用GUI程序以后要等待程序结束才可以继续输入命令。xdg-openxdg-open使用的配置文件不详。调用程序后终端仍可继续输入命令而不必等待程序结束。gnome-opengnome-open使用GNOME文件管理来打开文件。一般和Nautilus中设定的文件关联一致。测试
我的系统为Ubuntu 11.04。
打开pdf文件，see调用了Okular打开，而xdg-open和gnome-open调用了evince。
打开jpeg文件，see调用了feh，而xdg-open和gnome-open调用了eye of gnome。
打开html文件，三者都调用了x-www-browser，这里是google-chrome。
打开utf-8编码的txt(后缀为txt)，see调用了less，xdg-open和gnome-open调用了gedit。
打开utf-8编码的txt(无后缀)，see不识别：Warning: unknown mime-type for "test_utf-8" -- using "application/octet-stream"
Error: no "view" mailcap rules found for type "application/octet-stream"而xdg-open和gnome-open处乱不惊，gedit依旧。
打开cp936编码的txt，see误以为二进制文件，强制打开后失败，退出码1：$ see test_gbk.txt
"/tmp/file1tdJGh" may be a binary file.  See it anyway?
Warning: program returned non-zero exit code #1xdg-open和gnome-open表现的很淡定，继续gedit之。总结
see的配置文件mailcap超级复杂，要自定义恐怕要费不少时间，而xdg-open/gnome-open由于和Nautilus保持一致，这样就很和谐，很方便。并且xdg-open/gnome-open在输入命令后不必等待程序结束就可以继续输入，比see要实用。
参考自：http://zh-cn.w3support.net/index.php?db=so&#38;id=264395]]></description> <wfw:commentRss>http://blog.ossxp.com/2011/04/2437/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>RPM打包step by step(2)</title><link>http://blog.ossxp.com/2011/04/2415/</link> <comments>http://blog.ossxp.com/2011/04/2415/#comments</comments> <pubDate>Fri, 08 Apr 2011 04:19:01 +0000</pubDate> <dc:creator>崔贵林</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[rpm]]></category> <category><![CDATA[打包]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2415</guid> <description><![CDATA[
在源代码中打包
仍拿前面的helloworld举例，把spec文件放到开发目录下，修改去掉补丁文件，然后打包：$ ls hello-0.2
hello.c  hello.spec  Makefile
$ tar zcvf hello-0.2.tar.gz hello-0.2
hello-0.2/
hello-0.2/Makefile
hello-0.2/hello.spec
hello-0.2/hello.c接下来就要用到rpmbuild另一个很有用的参数了：-t，可以看一个rpmbuild的man：$ man rpmbuild
NAME
rpmbuild - Build RPM Package(s)SYNOPSIS
BUILDING PACKAGES:
rpmbuild {-ba&#124;-bb&#124;-bp&#124;-bc&#124;-bi&#124;-bl&#124;-bs} [rpmbuild-options] SPECFILE ...rpmbuild {-ta&#124;-tb&#124;-tp&#124;-tc&#124;-ti&#124;-tl&#124;-ts} [rpmbuild-options] TARBALL ...<a
href="http://blog.ossxp.com/2011/04/2415/" class="more-link">阅读全部内容 &#187;</a>]]></description> <wfw:commentRss>http://blog.ossxp.com/2011/04/2415/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>RPM打包step by step(1)</title><link>http://blog.ossxp.com/2011/04/2405/</link> <comments>http://blog.ossxp.com/2011/04/2405/#comments</comments> <pubDate>Sat, 02 Apr 2011 05:09:45 +0000</pubDate> <dc:creator>崔贵林</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[未分类]]></category> <category><![CDATA[rpm]]></category> <category><![CDATA[打包]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2405</guid> <description><![CDATA[最近学习rpm打包，参考ibm文档库里rpm打包的文章，结合自己的实践，总结如下，一来备忘，二来和大家交流。
和deb打包不同，rpm打包需要特定的目录及结构。查看rpm打包目录，以下为在CentOS5.5下的输出结果：$ rpm --showrc&#124;grep _topdir
-14: _builddir  %{_topdir}/BUILD
-14: _rpmdir    %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir   %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir    %{_usrsrc}/redhat
$ rpm --showrc&#124;grep _usrsrc
-14: _topdir    %{_usrsrc}/redhat
-14: _usrsrc    %{_usr}/src
$ rpm --showrc&#124;grep _usr
-14: _defaultdocdir     %{_usr}/share/doc
-14: _topdir    %{_usrsrc}/redhat
-14: _usr   <a
href="http://blog.ossxp.com/2011/04/2405/" class="more-link">阅读全部内容 &#187;</a>]]></description> <wfw:commentRss>http://blog.ossxp.com/2011/04/2405/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>搭建本地pypi服务器</title><link>http://blog.ossxp.com/2011/03/2357/</link> <comments>http://blog.ossxp.com/2011/03/2357/#comments</comments> <pubDate>Mon, 14 Mar 2011 02:03:00 +0000</pubDate> <dc:creator>崔贵林</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[buildout]]></category> <category><![CDATA[pypi]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2357</guid> <description><![CDATA[Python中的easy_install很好很强大，后起之秀pip更是青出于蓝。有人说python中的easy_install就像ruby中的gem，perl中的cpan，我一直使用Ubuntu，因此想到的类比是debian系列中的apt。easy_install如此常见以致有不少同学以为easy_install是linux的一个命令。强大的软件包管理工具必然有一个不弱小的软件包仓库。Python的官方软件包仓库就是大名鼎鼎的PyPI。通常情况下我们都是使用easy_install或pip从PyPI仓库下载软件包并安装，很方便。但如果网络状况不好或没有网络的话这就很麻烦。幸好，Python提供了Pypi服务器软件，使得可以在本地搭建一个pypi镜像服务器，然后就可以使用自己的镜像服务器来下载安装了。Pypi服务器软件有好几个，比如PEP，yopypi，z3c.pypimirror等，还有一种是通过代理来安装的，叫做collective.eggproxy。这其中最常见的就是z3c.pypimirror了。下面讲讲如何使用pypimiror搭建PyPI镜像服务器。安装pypimirror
首先安装pypimirror。使用easy_install或pip安装：
$ sudo easy_install z3c.pypimirror
$ sudo pip install z3c.pypimirror配置并下载软件包安装完毕就要填写配置文件，需要填写的参数主要有：mirror_file_path 下载的包的存放路径
base_url 服务器地址，这个注意要和Apache上的一致！
create_indexes 布尔类型，用来在下载的每个包目录下创建索引
package_matches 这个是用户自定义的，PyPI包无数，使用正则表达式有选择地下载，要不然硬盘要爆了
lock_file_name 设置运行时锁状态文件存放位置
log_filename 设置日志文件存放位置填写完毕以后，运行pypimirror来下载软件包，配置文件名可任意，通常是pypimirror.cfg：
$ pypimirror -c -v -I pypimirror.cfg参数说明：-c 在终端显示日志
-v 冗余模式显示
-I 初始化PyPi镜像接下来可以活动活动，因为这个要运行很长时间。生成索引文件
经过漫长的等待，所有软件下载完毕，然后需要一个索引文件，这个索引文件不同于上面的包目录下的索引文件，而是所有包的索引。
$ pypimirror -c -v -i -U pypimirror.cfg参数说明：-i 创建索引
-U 更新镜像。为什么要使用-U参数呢？因为在创建索引时必须选择使用-I或者-U。-I用来初始化，-U用来更新。整合Apache
假设前面设置的下载文件存放路径为/data/pypi/files，下面把它链接到/var/www/目录下：
$ ln -s /data/pypi/files /var/www/pypi
重启Apache，访问http://localhost/pypi/ 应该就可以了。这是最简单的配置，这时的base_url就是 http://localhost/pypi/ 。使用自己的PyPI服务器
easy_install和pip中使用自己的PyPI服务器安装Pylons：
$ sudo easy_install -i http://localhost/pypi/ Pylons
$ sudo pip install -i http://localhost/pypi/ Pylons
在buildout中使用，在index字段中设置。
[buildout]
parts = instance
index = http://localhost/pypi/...使用buildout构建pypimirror
除了使用easy_install或pip安装pymirror以外，也可以通过buildout构建(参考自http://bluedynamics.com/articles/jens/setup-z3c.pypimirror )。
同时使用模板，填写参数，生成对应的配置文件。
buildout配置文件如下：
[buildout]
parts = mirror mirror-cfg[mirror]
recipe <a
href="http://blog.ossxp.com/2011/03/2357/" class="more-link">阅读全部内容 &#187;</a>]]></description> <wfw:commentRss>http://blog.ossxp.com/2011/03/2357/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>使用Buildout构建Python</title><link>http://blog.ossxp.com/2011/02/2352/</link> <comments>http://blog.ossxp.com/2011/02/2352/#comments</comments> <pubDate>Fri, 25 Feb 2011 02:56:49 +0000</pubDate> <dc:creator>崔贵林</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[buildout]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2352</guid> <description><![CDATA[系统中存在多个python版本时，如何切换到不同的版本里呢？使用update-alternative不是一个好办法，因为这样虽然修改了python的版本，但是和python相关的工具，比如easy_install, pip等，并没有一起修改，这时使用这些工具时就会出错，必须重新安装才可以。使用起来很麻烦。
解决这个办法可以使用virtualenv。virtualenv可以创建一个单独的python环境，每个环境可以使用不同的python版本。
$ virtualenv -p python2.4 virtualenv_2.4
$ virtualenv -p python2.7 virtualenv_2.7
这将创建2.4环境和2.7环境。当然前提是系统里有这两个版本的python。否则会提示不存在这个可执行脚本。
如果仅仅需要使用不同版本的软件包的话，可以使用easy_install或pip切换，或者干脆使用buildout。但buildout的功能远不止此。其实buildout也可以做到virtualenv的效果。不信？请看~
buildout.cfg配置文件：
[buildout]
python = python
parts =
python
pythonbin[python]
recipe = zc.recipe.cmmi
url = http://www.python.org/ftp/python/2.6.6/Python-2.6.6.tar.bz2
executable = ${buildout:directory}/parts/python/bin/python2.6
extra_options=
--enable-unicode=ucs4
--with-threads
--with-readline[pythonbin]
recipe = plone.recipe.command
command = ln -s ${python:executable} ${buildout:bin-directory}/python
如果是Mac环境的话，还需要在extra_options中添加一行：MACOSX_DEPLOYMENT_TARGET=10.5。
如果是Debian/Ubuntu环境的话，可能需要首先安装编译环境：
$ sudo apt-get install libreadline5-dev zlib1g-dev libbz2-dev libssl-dev libjpeg62-dev
然后使用bootstrap.py生成buildout，运行buildout就OK了！
]]></description> <wfw:commentRss>http://blog.ossxp.com/2011/02/2352/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>buildout使用小例</title><link>http://blog.ossxp.com/2010/12/2207/</link> <comments>http://blog.ossxp.com/2010/12/2207/#comments</comments> <pubDate>Fri, 10 Dec 2010 08:20:30 +0000</pubDate> <dc:creator>崔贵林</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[buildout]]></category> <category><![CDATA[egg]]></category> <category><![CDATA[setuptools]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2207</guid> <description><![CDATA[使用setuptools能够用来打包应用程序，生成egg包，但对于有些应用程序来说，可能需要依赖很多egg包，在此基础上进行开发。这时setuptools就无能为力了。幸运的是，我们还有buildout。buildout不但能够像setuptools一样自动更新或下载安装依赖包，而且还能够像virtualenv一样，构建一个封闭的开发环境。使用buildout开发Zope产品是很方便的，Plone从3.2版本开始，所有的实例都是基于buildout构建的。下面我们通过一个小例子来学习如何使用buildout。安装buildout
首先建立我们的开发目录，假设叫做buildout-demo，建立buildout配置文件buildout.cfg：
$ mkdir buildout-demo
$ cd buildout-demo
$ touch buildout.cfg
然后下载buildout的引导脚本 bootstrap.py 。运行bootstrap.py来生成buildout相关的文件和目录：
$ python bootstrap.py
Downloading http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg
Creating directory '/home/amoblin/Projects/gitar/buildout-demo/bin'.
Creating directory '/home/amoblin/Projects/gitar/buildout-demo/parts'.
Creating directory '/home/amoblin/Projects/gitar/buildout-demo/eggs'.
Creating directory '/home/amoblin/Projects/gitar/buildout-demo/develop-eggs'.
Getting distribution for 'setuptools'.
Got setuptools 0.6c12dev-r85381.
Generated script '/home/amoblin/Projects/gitar/buildout-demo/bin/buildout'.
从上面可以看出，引导脚本下载了setuptools egg包，创建了目录bin，parts，eggs，develop-eggs，在bin目录下生成了buildout脚本。没错，buildout是基于setuptools开发的。
各文件夹的作用如下:bin目录用来存放生成的脚本文件
parts目录存放生成的数据，大多用不上。
develop-eggs 存放指向开发目录的链接文件。和buildout.cfg中develop选项相关。
eggs 是存放从网络上下载下来的egg包。这些包一般在buildout.cfg中的egg选项里定义。如果运行时出现类似下面的错误：
$ python bootstrap.py
Downloading http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg
Traceback (most recent call last):
File "bootstrap.py", line 256, in &#60;module&#62;
ws.require(requirement)
File "/tmp/tmp2cI1LD/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 666, in require
<a
href="http://blog.ossxp.com/2010/12/2207/" class="more-link">阅读全部内容 &#187;</a>]]></description> <wfw:commentRss>http://blog.ossxp.com/2010/12/2207/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Vim 复制粘贴探秘</title><link>http://blog.ossxp.com/2010/12/2190/</link> <comments>http://blog.ossxp.com/2010/12/2190/#comments</comments> <pubDate>Wed, 08 Dec 2010 05:11:25 +0000</pubDate> <dc:creator>崔贵林</dc:creator> <category><![CDATA[技术文章]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[vim]]></category> <category><![CDATA[复制]]></category> <category><![CDATA[粘贴]]></category><guid
isPermaLink="false">http://blog.ossxp.com/?p=2190</guid> <description><![CDATA[Vim作为最好用的文本编辑器之一，使用vim来编文档，写代码实在是很惬意的事情。每当学会了vim的一个新功能，就会很大地提高工作效率。有人使用vim几十年，还没有完全掌握vim的功能，这也说明了vim的强大。而这样何尝不是一件好事呢，只要有的学习，就有的提高。
最近使用Vim来写博客，发现在Vim中粘贴Python代码后，缩进就全乱了。仔细研究了以下，原来是自动缩进的缘故，于是做如下设置：
:set noai nosi
取消了自动缩进和智能缩进，这样粘贴就不会错行了。但在有的vim中不行，还是排版错乱。
后来发现了更好用的设置：
:set paste
进入paste模式以后，可以在插入模式下粘贴内容，不会有任何变形。这个真是灰常好用，情不自禁看了一下帮助，发现它做了这么多事：textwidth设置为0
wrapmargin设置为0
set noai
set nosi
softtabstop设置为0
revins重置
ruler重置
showmatch重置
formatoptions使用空值下面的选项值不变，但却被禁用：lisp
indentexpr
cindent怪不得之前只设置noai和nosi不行，原来与这么多因素有关！
但这样还是比较麻烦的，每次要粘贴的话，先set paste，然后粘贴，然后再set nopaste。有没有更方便的呢？你可能想到了，使用键盘映射呀，对。我们可以这样设置：:
:map &#60;F10&#62; :set paste&#60;CR&#62;
:map &#60;F11&#62; :set nopaste&#60;CR&#62;
这样在粘贴前按F10键启动paste模式，粘贴后按F11取消paste模式即可。其实，paste有一个切换paste开关的选项，这就是pastetoggle。通过它可以绑定快捷键来激活/取消 paste模式。比如：:
:set pastetoggle=&#60;F11&#62;
这样减少了一个快捷键的占用，使用起来也更方便一些。
但，这是最方便的吗？Vimer们对高效的追求永无止境。还有其他更好地方法吗？
你可能想到了，vim寄存器。对，使用vim寄存器 &#8220;+p 粘贴即可。根本不用考虑是否自动缩进，是否paste模式，直接原文传递！:
"+p
要说vim寄存器，就要从vim文件间的复制粘贴说起。
Vim中，若要复制当前行，普通模式下按 yy 即可，在要粘贴的地方按 p 。这是vim将复制内容保存到了自己的寄存器中的缘故。如果在其他地方执行yy，新的内容将覆盖掉原寄存器中内容。如果想保存原寄存器中内容而同时增加新的内容呢？这时就要在yy前增加标签了。标签以双引号开始，跟着的是标签名称，可以是数字0-9，也可以是26个字母，然后就是复制操作，这样就把复制内容保存到该标签寄存器里。通过下面命令显示所有寄存器内容：:
:reg
其中注意两个特殊的寄存器：&#8221;* 和 &#8220;+。这两个寄存器是和系统相通的，前者关联系统选择缓冲区，后者关联系统剪切板。通过它们可以和其他程序进行数据交换。备注：若寄存器列表里无&#8221;* 或 &#8220;+ 寄存器，则可能是由于没有安装vim的图形界面所致。Debian/Ubuntu下可以通过安装vim-gnome解决。
$ sudo apt-get install vim-gnome选择缓冲区和系统剪切板啥子区别？让我们继续研究。选择缓冲区和剪切板
不同于Windows，Linux系统里存在两个剪切板：一个叫做选择缓冲区(X11 selection buffer)，另一个才是剪切板(clipboard)。
选择缓冲区是实时的，当使用鼠标或键盘选择内容时，内容已经存在于选择缓冲区了，这或许就是选择缓冲区的由来吧。
使用下面的命令查看选择缓冲区的内容：:
$ xclip -out
如果没有xclip命令，Debian/Ubuntu下可以通过如下命令安装：:
$ sudo apt-get install xclip
可以使用鼠标中键或键入Shift+Insert来粘贴选择缓冲区的内容。但对于有些GUI程序，比如gedit，只能通过鼠标中键调用选择缓冲区的内容，使用Shift+Insert的话，调用的是剪切板的内容。
剪切板和Windows的剪切板类似，在选择文字内容后，执行Ctrl + c或在菜单里选择‘复制’的话，这时内容才存放到剪切板里。
使用下面的命令查看剪切板的内容：:
$ xclip -out -sel clipboard
而使用剪切板的内容，则是Ctrl+v。 但在有些情况下，比如gnome-terminal，不能直接使用Ctrl+c，Ctrl+v，这时就要用Shift+Ctrl+c，Shift+Ctrl+v代替。原格式粘贴
好了，了解了选择缓冲区和剪切板，下面就是实现保留格式粘贴的完美解决方案：方案一：选择文本内容
vim普通模式下按 &#8220;*p 将选择缓冲区中内容粘贴进来方案二：复制文件内容
vim普通模式下按 &#8220;+ p 将剪切板内容粘贴进来这时，如果要复制的内容也是vim编辑器中的内容，那么如何复制才更方便呢？vim中的复制
vim有一个可视模式(Visual Mode)，在此模式下可以选择区域。可以在普通模式下键入v进入可视模式，也可以个性化一点，键入V进入行可视模式，或者键入Ctrl+v进入列可视模式。这时移动光标就可以选择内容了。注意这时被选内容已经实时保存于选择缓冲区了，当然你也可以键入&#8221;+y将此内容也保存到剪切板里，或者&#8221;ay将内容保存到标签为a的寄存器中。但要知道，只有前两个中的内容可以在其他程序中使用，而a寄存器中的内容只能在该vim编辑器内使用。
也可以通过鼠标来复制。这里首先要打开鼠标模式。:
:set mouse=a
这样在普通模式下可以直接使用鼠标选择区域复制到选择缓冲区。但这种情况下不能复制到剪切板。
若要使用鼠标复制内容到剪切板，则需要做如下设置：:
:set mouse=v
这种情况下，除了可以像上面一样直接使用鼠标选择区域复制到选择缓冲区以外，还可以在右键菜单中选择“复制”来保存到剪切板里。但新问题又出来了。若显示行号，也会将行号一并选择。你会想到，这好办呀，如果不需要行号的话，在复制前，先执行set nonu来取消行号显示呗。
其实没必要这样，如果不需要复制行号的话，用在可视模式下用键盘来选择不就可以吗？
并且，从上面的讨论，我们不难得出，使用选择缓冲区比使用剪切板要方便的多，可以节省很多步骤。
所以，最终我们得到了vim文件间复制粘贴的完美方案，文件传输的中转使用选择缓冲区。vim文件间复制粘贴完美方案在~/.vimrc中增加如下一行：:
set <a
href="http://blog.ossxp.com/2010/12/2190/" class="more-link">阅读全部内容 &#187;</a>]]></description> <wfw:commentRss>http://blog.ossxp.com/2010/12/2190/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (user agent is rejected)
Database Caching 7/15 queries in 0.149 seconds using disk

Served from: blog.ossxp.com @ 2012-02-11 05:33:12 -->
