<?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</title>
	<atom:link href="http://blog.upsuper.org/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.upsuper.org</link>
	<description>the place where there are some ghost appearing...</description>
	<lastBuildDate>Wed, 19 Oct 2011 13:21:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>动态切换 Linux 使用的 CPU 数量</title>
		<link>http://blog.upsuper.org/dynamic-modify-cpu-number/</link>
		<comments>http://blog.upsuper.org/dynamic-modify-cpu-number/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 06:03:36 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[多核]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1220</guid>
		<description><![CDATA[由于要测试一些代码，其运行结果会受到多核并行的影响，所以希望能够调整使用的 CPU 数量。网络上之前看到的方法是在内核的启动参数上添加一个 maxcpus，但是如果这样的话每切换一次都要重启一次，是在太麻烦了。想想 Linux 应该是很强大的，所以可以动态修改 CPU 数量才对。 无意中看到 Linux 代码的 Documentation 文件夹下有个文件叫做 cpu-hotplug.txt，于是就看了一下，发现可以在 /sys/devices/system/cpu 看到代表各 CPU 的文件夹按照 cpuX 的命名方式，如 cpu0、cpu1、cpu2 等。这些文件夹里面有一个 online 文件，如果其值为0则禁用该 CPU，如果为1则启用该 CPU。注意，这里需要 root 权限哦。 因为我只要在单核和多核之间切换，所以我写了两个脚本放在 /usr/local/sbin 里面： singlecore 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash &#160; cpus_dir=&#34;/sys/devices/system/cpu&#34; &#160; for cpu in $&#40;ls &#34;$cpus_dir&#34; &#124; grep [...]]]></description>
			<content:encoded><![CDATA[<p>由于要测试一些代码，其运行结果会受到多核并行的影响，所以希望能够调整使用的 CPU 数量。网络上之前看到的方法是在内核的启动参数上添加一个 maxcpus，但是如果这样的话每切换一次都要重启一次，是在太麻烦了。想想 Linux 应该是很强大的，所以可以动态修改 CPU 数量才对。</p>
<p>无意中看到 Linux 代码的 Documentation 文件夹下有个文件叫做 cpu-hotplug.txt，于是就看了一下，发现可以在 /sys/devices/system/cpu 看到代表各 CPU 的文件夹按照 cpuX 的命名方式，如 cpu0、cpu1、cpu2 等。这些文件夹里面有一个 online 文件，如果其值为0则禁用该 CPU，如果为1则启用该 CPU。注意，这里需要 root 权限哦。</p>
<p>因为我只要在单核和多核之间切换，所以我写了两个脚本放在 /usr/local/sbin 里面：</p>
<p>singlecore</p>

<div class="wp_codebox"><table><tr id="p12203"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1220code3"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">cpus_dir</span>=<span style="color: #ff0000;">&quot;/sys/devices/system/cpu&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> cpu <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$cpus_dir</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">'cpu[0-9]\+'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #007800;">cpu_online</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$cpus_dir</span>/<span style="color: #007800;">$cpu</span>/online&quot;</span>
	<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$cpu_online</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #007800;">$cpu_online</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> = <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
	<span style="color: #000000; font-weight: bold;">then</span>
		<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$cpu_online</span>&quot;</span>
	<span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></td></tr></table></div>

<p>multicore</p>

<div class="wp_codebox"><table><tr id="p12204"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1220code4"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">cpus_dir</span>=<span style="color: #ff0000;">&quot;/sys/devices/system/cpu&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> cpu <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$cpus_dir</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">'cpu[0-9]\+'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #007800;">cpu_online</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$cpus_dir</span>/<span style="color: #007800;">$cpu</span>/online&quot;</span>
	<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$cpu_online</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #007800;">$cpu_online</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> = <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
	<span style="color: #000000; font-weight: bold;">then</span>
		<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$cpu_online</span>&quot;</span>
	<span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></td></tr></table></div>

<p>之后需要切换的时候，只要运行 sudo singlecore 或者 sudo multicore 就可以了~</p>
<p>顺便说一句，我当时在想，如果我禁用了所有的 CPU 会怎么样呢？结果发现 cpu0 是没有 online 文件的，也就是 Linux 至少保证一个 CPU 处于可用状态。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/dynamic-modify-cpu-number/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装配置 LXR</title>
		<link>http://blog.upsuper.org/setup-lxr/</link>
		<comments>http://blog.upsuper.org/setup-lxr/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 07:07:02 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[LXR]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1215</guid>
		<description><![CDATA[专业课学习操作系统，满心欢喜地以为可以是 Linux 代码导读，结果选用了一本八十年代的教材，介绍 UNIX v6 的。于是自己从图书馆借来了内核开发的入门读物《Linux 内核设计与实现》。既然是介绍内核的书，自然少不了代码，但是书中又不可能将每个提到的代码的相关信息全部写出来，这时就得自己去查看代码。查看代码的话，虽然 Linux 的代码可以很容易地得到，但那来看终归有些麻烦，各种调用需要查找半天。于是想起了很有名的一个网站 LXR：http://lxr.linux.no，Linux 交叉引用。这个网站好是好，就是网络原因速度太慢，于是就想自己装一个。 先说一句，下面的安装环境都是64位 Gentoo。 最开始找到了 LXR Cross Referencer 这个项目，一看最后更新时间还挺新，看起来是一直都还在维护的。然后在 Gentoo 的网站上查到 LXR 是可以直接用 portage 安装的，于是安装，安装相关的包，最后放弃了。出于什么原因我也不记得了，最后一个原因肯定是不好看，肯定达不到上面那个网站的效果，所以就放弃了，到那个网站上去下载 LXR 分出来的版本 LXRng。（话说这个 ng 不会是表示 next generation 吧？） 安装支持库 首先从 LXR 的网站上用 git 把代码下载下来， 1 git clone git://lxr.linux.no/git/lxrng.git 然后我打开了里面的 INSTALL 文件，里面写着好多好多库。先说结论吧，在 Gentoo 的官方源里面，有两个库是没有的，分别是 Search-Xapian 和 CGI-Ajax，这两个最后安装。 最首要的是先安装 PostgreSQL，由于 LXR 是用 Perl [...]]]></description>
			<content:encoded><![CDATA[<p>专业课学习操作系统，满心欢喜地以为可以是 Linux 代码导读，结果选用了一本八十年代的教材，介绍 UNIX v6 的。于是自己从图书馆借来了内核开发的入门读物《Linux 内核设计与实现》。既然是介绍内核的书，自然少不了代码，但是书中又不可能将每个提到的代码的相关信息全部写出来，这时就得自己去查看代码。查看代码的话，虽然 Linux 的代码可以很容易地得到，但那来看终归有些麻烦，各种调用需要查找半天。于是想起了很有名的一个网站 LXR：<a href="http://lxr.linux.no">http://lxr.linux.no</a>，Linux 交叉引用。这个网站好是好，就是网络原因速度太慢，于是就想自己装一个。</p>
<p>先说一句，下面的安装环境都是64位 Gentoo。</p>
<p>最开始找到了 <a href="http://sourceforge.net/projects/lxr/">LXR Cross Referencer</a> 这个项目，一看最后更新时间还挺新，看起来是一直都还在维护的。然后在 Gentoo 的网站上查到 LXR 是可以直接用 portage 安装的，于是安装，安装相关的包，最后放弃了。出于什么原因我也不记得了，最后一个原因肯定是不好看，肯定达不到上面那个网站的效果，所以就放弃了，到那个网站上去下载 LXR 分出来的版本 LXRng。（话说这个 ng 不会是表示 next generation 吧？）<br />
<span id="more-1215"></span></p>
<h3>安装支持库</h3>
<p>首先从 LXR 的网站上用 git 把代码下载下来，</p>

<div class="wp_codebox"><table><tr id="p121523"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1215code23"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">git</span> clone <span style="color: #c20cb9; font-weight: bold;">git</span>:<span style="color: #000000; font-weight: bold;">//</span>lxr.linux.no<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>lxrng.git</pre></td></tr></table></div>

<p>然后我打开了里面的 INSTALL 文件，里面写着好多好多库。先说结论吧，在 Gentoo 的官方源里面，有两个库是没有的，分别是 Search-Xapian 和 CGI-Ajax，这两个最后安装。</p>
<p>最首要的是先安装 PostgreSQL，由于 LXR 是用 Perl 写成的，所以在 USE 里面加入了 Perl，然后安装。安装完成以后，安装 PostgreSQL 的 Perl 库 DBD-Pg。接下去安装 Cgi-Simple、HTML-Parser、HTML-Entities、Term-ProgressBar、Devel-Size、Template-Toolkit，这些都很容易，直接安装就可以了。（虽然我确定这些包的名称还费了些时间）</p>
<p>然后是 Apache 和它的 mod_perl，因为之前安装了，并没有太大困难，这里也不详述了。</p>
<p>最麻烦的问题来了，对于源里没有的 Search-Xapian 和 CGI-Ajax 怎么办呢？先把 Xapian 的主要部分给安装了吧。</p>
<p>安装 xapian 和 xapian-bindings 这两个包。因为这两个包的最新版本对 amd64 平台都是 unstable 的，所以要在 /etc/portage/package.keywords 里面加入</p>

<div class="wp_codebox"><table><tr id="p121524"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1215code24"><pre class="text" style="font-family:monospace;">=dev-libs/xapian-1.2.7-r1 ~amd64
=dev-libs/xapian-bindings-1.2.7-r2 ~amd64</pre></td></tr></table></div>

<p>（是的，在 Gentoo 的查询系统上显示，xapian 的 1.2.5 是稳定版本，我也曾经试图安装那个版本，然后仅安装非稳定版的 -bindings，但是之后安装的 Search-Xapian 还是会要求新的 1.2.7，所以就这样吧。另外一般状况下，最前面是写 >= 的，但是我出于个人喜好和完美主义，写了 =。）接下去直接安装这两个包即可。记得检查已经在 USE 里面加入了 perl。</p>
<p>接下去安装那两个包。</p>
<p>Gentoo 有个很神奇的工具，也是我这次才发现的，叫做 g-cpan，可以把 CPAN 上面的包自动打包安装为 portage 的包。不过如果是第一次使用必须要先配置一下，在 /etc/make.conf 最后加上</p>

<div class="wp_codebox"><table><tr id="p121525"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1215code25"><pre class="text" style="font-family:monospace;">ACCEPT_KEYWORDS=&quot;amd64&quot;
PORTDIR_OVERLAY=&quot;/usr/local/portage&quot;</pre></td></tr></table></div>

<p>（虽然这个配置看过去很简单，不过因为一开始忽略了这件事情，所以纠结了很长时间……）</p>
<p>接下去用 g-cpan 安装就可以了</p>

<div class="wp_codebox"><table><tr id="p121526"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1215code26"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> g-cpan <span style="color: #660033;">-g</span> CGI::Ajax Search::Xapian
<span style="color: #c20cb9; font-weight: bold;">sudo</span> emerge CGI-Ajax Search-Xapian</pre></td></tr></table></div>

<p>至此需要安装的东西就已经全部装完了，下面进入第二阶段~</p>
<h3>配置数据库</h3>
<p>这个很简单了，不过在配置之前要先把自己将会用到的用户加入到 postgres 组里以保证可以访问。最重要的是要把之后的 apache 用户加入到 postgres 组里，否则后面会出现一些状况。</p>
<p>然后 su 到 postgres 用户里，添加用户 root，并把 root 设置为管理员（因为之后生成的时候需要用到）</p>

<div class="wp_codebox"><table><tr id="p121527"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1215code27"><pre class="bash" style="font-family:monospace;">createuser root</pre></td></tr></table></div>

<p>然后创建 LXR 的数据库</p>

<div class="wp_codebox"><table><tr id="p121528"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1215code28"><pre class="bash" style="font-family:monospace;">createdb lxrng</pre></td></tr></table></div>

<p>大体上这样就没问题了。</p>
<h3>调整配置文件并建立工作目录</h3>
<p>我出于完美主义的原因，将 LXR 的工作目录放在了 /var/lib/lxrng 里面，如果你没有那些奇怪的癖好，完全可以直接在自己的文件夹下面放置这些东西。</p>
<p>首先要设置配置文件，将 LXR 根目录下的 lxrng.conf-dist 复制为 lxrng.conf，然后打开修改。里面大体上还是比较清晰的，如果只是要做一个 Linux 代码的交叉引用的话，大体上按照里面的配置，修改第10行</p>

<div class="wp_codebox"><table><tr id="p121529"><td class="line_numbers"><pre>10
11
12
13
</pre></td><td class="code" id="p1215code29"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$gitrepo</span> <span style="color: #339933;">=</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Repo</span><span style="color: #339933;">::</span><span style="color: #006600;">Git</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'/var/lib/lxrng/repos/linux-2.6/.git'</span><span style="color: #339933;">,</span>
	  release_re <span style="color: #339933;">=&gt;</span> <span style="color: #009966; font-style: italic;">qr/^v[^-]*$/</span><span style="color: #339933;">,</span>
	  author_timestamp <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>里面的那个路径，使其指向你放置代码的 git 源（一般是代码文件夹下的 .git）。</p>
<p>如果你没有使用 git 来抓取代码，而是直接下载某个版本的代码，如 v3.1，可以放置到比如 /var/lib/lxrng/repos/linux/v3.1，那么这个部分就修改为</p>

<div class="wp_codebox"><table><tr id="p121530"><td class="line_numbers"><pre>10
11
12
</pre></td><td class="code" id="p1215code30"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Repo</span><span style="color: #339933;">::</span><span style="color: #006600;">Plain</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$plainrepo</span> <span style="color: #339933;">=</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Repo</span><span style="color: #339933;">::</span><span style="color: #006600;">Plain</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'/var/lib/lxrng/repos/linux'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>即可。（注意上面的 $gitrepo 在下面还有使用过一次，如果修改的话需要一并修改）</p>
<p>接下去是第19行</p>

<div class="wp_codebox"><table><tr id="p121531"><td class="line_numbers"><pre>19
</pre></td><td class="code" id="p1215code31"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$search</span>  <span style="color: #339933;">=</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Search</span><span style="color: #339933;">::</span><span style="color: #006600;">Xapian</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'/var/lib/lxrng/text-db/linux-2.6'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>需要在某个位置建立一个 text-db 文件夹，然后将上面的路径修改为你建立的那个文件夹的路径即可。同样的操作也发生在第29行</p>

<div class="wp_codebox"><table><tr id="p121532"><td class="line_numbers"><pre>28
29
</pre></td><td class="code" id="p1215code32"><pre class="perl" style="font-family:monospace;">	<span style="color: #666666; font-style: italic;"># Must be writable by httpd user:</span>
	<span style="color: #ff0000;">'cache'</span>	      <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'/var/lib/lxrng/cache'</span><span style="color: #339933;">,</span></pre></td></tr></table></div>

<p>注意这个文件夹需要对 apache:apache 可写。我的做法是把这个文件夹的组设置为 apache，然后设置权限为0775，当然也可以直接把所有者设置为 apache 然后保留原来权限。</p>
<p>注释掉下面这行</p>

<div class="wp_codebox"><table><tr id="p121533"><td class="line_numbers"><pre>36
</pre></td><td class="code" id="p1215code33"><pre class="perl" style="font-family:monospace;">	<span style="color: #ff0000;">'ctags_flags'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;-I<span style="color: #000099; font-weight: bold;">\@</span>$LXRng::ROOT/lxr-ctags-quirks&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span></pre></td></tr></table></div>

<p>不要问我为什么，这个我真不知道，总之如果部注释掉一会儿会出错。</p>
<p>最后是要生成引用的版本和默认显示的版本：</p>

<div class="wp_codebox"><table><tr id="p121534"><td class="line_numbers"><pre>37
38
39
</pre></td><td class="code" id="p1215code34"><pre class="perl" style="font-family:monospace;"><span style="color: #ff0000;">'ver_list'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$gitrepo</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">allversions</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
<span style="color: #ff0000;">'ver_default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'v2.6.20.3'</span><span style="color: #339933;">,</span></pre></td></tr></table></div>

<p>我强烈建议你将 $gitrepo->allversions 修改为你想看的几个版本，甚至于只有一个版本也是没有问题的即使你有完整的历史记录，因为每个版本都需要生成很长时间，而且似乎过程很不稳定，如果没有特别的原因，最好不要生成太多版本。如果是不用 git 源的话，只要把你放在那个文件夹里的对应版本号填进去就可以了，最后修改默认显示的版本。</p>
<p>如果还想添加其他的代码，只要把代码最后 return 的大括号里面的部分复制一遍，根据需要修改就可以了。</p>
<h3>初始化数据库及生成交叉引用</h3>
<p>首先要添加一个符号链接</p>

<div class="wp_codebox"><table><tr id="p121535"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1215code35"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>exuberants-ctags <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ctags-exuberants</pre></td></tr></table></div>

<p>接下去没什么太大的差别，就是进入程序所在目录，然后</p>

<div class="wp_codebox"><table><tr id="p121536"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1215code36"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>lxr-db-admin linux <span style="color: #660033;">--init</span>
.<span style="color: #000000; font-weight: bold;">/</span>lxr-genref linux</pre></td></tr></table></div>

<p>值得一说的是，这个过程非常非常非常漫长，在我的 i7 本上的虚拟机里，一跑至少三四个小时，而且看起来还很不稳定，不时会自动强制退出，而且退出以后可能会出现一些问题导致无法继续。这个问题比较严重，遇到这个问题如何解决放到之后的部分再来说吧。</p>
<h3>配置 Apache </h3>
<p>最后来配置 Apache。直接把文件夹下的 apache2-site.conf-dist-mod_perl 复制到 /etc/apache/vhosts.d/10_lxrng.con，然后打开这个文件，将里面的所有 @@LXRROOT@@ 和 @@LXRURL@@ 根据自己的情况替换为相应的路径就可以了。然后重新启动 Apache</p>

<div class="wp_codebox"><table><tr id="p121537"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1215code37"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>apache restart</pre></td></tr></table></div>

<h3>问题解决</h3>
<p>由于原来的版本在我这里基本上没什么希望能生成结束，所以我对这个程序做了一些修改，这个修改后的版本可以直接在我的 GitHub 上面找到：<a href="https://github.com/upsuper/lxrng" title="upsuper/lxrng - GitHub" target="_blank">upsuper/lxrng</a>。如果需要的话，可以不使用原来官方的代码而直接使用我修改过的代码。主要的差别有几点：一是消除了生成交叉引用时过大量的输出信息；二是增加了交叉引用生成时刷写 Xapian 索引的频率，以减少退出重做时可能出现的错误；三是修正了一些最后浏览时可能遇到的问题。</p>
<p>当然生成的时候还是可能会出错，这我也没办法。如果生成时被意外中断，重新执行又出现错误，可以将我修改的那个程序里面的 lxr-genref 第336行</p>

<div class="wp_codebox"><table><tr id="p121538"><td class="line_numbers"><pre>336
</pre></td><td class="code" id="p1215code38"><pre class="perl" style="font-family:monospace;">	<span style="color: #666666; font-style: italic;">#warn(&quot;here $docid\n&quot;);</span></pre></td></tr></table></div>

<p>的注释符去掉，重新运行 lxr-genref，然后查看当程序报错时停止的那个编号，比如 12345。然后执行 psql lxrng 进入 lxrng 数据库，执行</p>

<div class="wp_codebox"><table><tr id="p121539"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1215code39"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #993333; font-weight: bold;">FROM</span> hashed_documents <span style="color: #993333; font-weight: bold;">WHERE</span> doc_id<span style="color: #66cc66;">&gt;=</span><span style="color: #cc66cc;">12345</span></pre></td></tr></table></div>

<p>然后再次执行 lxr-genref。这个过程可能反复一两次，直到不会报错位置。</p>
<p>如果用原始版本的话，最后在浏览的时候使用搜索，有可能会出现500错误以及无法显示出来的情况，如果出现，可以参考我做的修改。</p>
<h3>后记</h3>
<p>配置这个 LXR 真是折腾死我了，费了好大功夫，最后也总算是成功了。</p>
<p>另外真是很久很久没有在这里写东西了。也正因为这个过程实在太麻烦了，所以来写一写，权当一个记录。不过现在有 GitHub 这种东西，倒是好得多了。</p>
<h3>参考文档</h3>
<ul>
<li><a href="http://mohammadthalif.wordpress.com/2010/07/24/how-to-setup-lxr-%E2%80%93-step-by-step-guide-3/" target="_blank">How to setup LXR – Step by Step guide &laquo; Mohamed Thalib&#039;s Blog</a></li>
<li><a href="http://www.kernelchina.org/node/241" target="_blank">在自己的计算机上建立lxr源代码检索服务器 | kernelchina</a></li>
<li><a href="http://wenku.baidu.com/view/8150646727d3240c8447ef2d.html" target="_blank">lxrng.install-gentoo_百度文库</a></li>
<li><a href="http://www.gentoo.org/proj/en/perl/g-cpan.xml" target="_blank">Gentoo Linux Documentation &#8212; g-cpan Guide</a></li>
</ul>
<p>（貌似还有些别的参考资料，不记得是什么了……）</p>
<h3>参考配置文件</h3>
<p>最后最后贴一下自己的配置文件吧。配置文件里面声明了两个代码，一个是 Liunx 的，一个是 UNIX v6 的，Linux 是用 git，UNIX 是代码。程序全部放在 /var/lib/lxrng 里面，代码放在 /var/lig/lxrng/repos 里。</p>

<div class="wp_codebox"><table><tr id="p121540"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
</pre></td><td class="code" id="p1215code40"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># -*- mode: perl -*-</span>
<span style="color: #666666; font-style: italic;"># Configuration file</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># </span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Index</span><span style="color: #339933;">::</span><span style="color: #006600;">PgBatch</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Repo</span><span style="color: #339933;">::</span><span style="color: #006600;">Git</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Repo</span><span style="color: #339933;">::</span><span style="color: #006600;">Plain</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Search</span><span style="color: #339933;">::</span><span style="color: #006600;">Xapian</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$linuxrepo</span> <span style="color: #339933;">=</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Repo</span><span style="color: #339933;">::</span><span style="color: #006600;">Git</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'/var/lib/lxrng/repos/linux.git'</span><span style="color: #339933;">,</span>
	  release_re <span style="color: #339933;">=&gt;</span> <span style="color: #009966; font-style: italic;">qr/^v[^-]*$/</span><span style="color: #339933;">,</span>
	  author_timestamp <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$unixrepo</span> <span style="color: #339933;">=</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Repo</span><span style="color: #339933;">::</span><span style="color: #006600;">Plain</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'/var/lib/lxrng/repos/unix'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$index</span>   <span style="color: #339933;">=</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Index</span><span style="color: #339933;">::</span><span style="color: #006600;">PgBatch</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span>db_spec <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'dbname=lxrng;port=5432'</span><span style="color: #339933;">,</span> 
					 db_user <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">,</span> db_pass <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">,</span>
					 <span style="color: #666666; font-style: italic;"># table_prefix =&gt; 'lxr'</span>
					 <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$search</span>  <span style="color: #339933;">=</span> LXRng<span style="color: #339933;">::</span><span style="color: #006600;">Search</span><span style="color: #339933;">::</span><span style="color: #006600;">Xapian</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'/var/lib/lxrng/text-db'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">return</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #ff0000;">'linux'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #ff0000;">'repository'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$linuxrepo</span><span style="color: #339933;">,</span>
	<span style="color: #ff0000;">'index'</span>       <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$index</span><span style="color: #339933;">,</span>
	<span style="color: #ff0000;">'search'</span>      <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$search</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'base_url'</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'http://upsuper-gentoo/lxr'</span><span style="color: #339933;">,</span>
	<span style="color: #666666; font-style: italic;"># Must be writable by httpd user:</span>
	<span style="color: #ff0000;">'cache'</span>	      <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'/var/lib/lxrng/cache/linux'</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'fs_charset'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'iso-8859-1'</span><span style="color: #339933;">,</span>
	<span style="color: #666666; font-style: italic;"># Tried successively</span>
	<span style="color: #ff0000;">'content_charset'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'utf-8'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'iso-8859-1'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'languages'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'C'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'GnuAsm'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'Kconfig'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	<span style="color: #666666; font-style: italic;">#'ctags_flags' =&gt; [&quot;-I\@$LXRng::ROOT/lxr-ctags-quirks&quot;],</span>
	<span style="color: #666666; font-style: italic;">#'ver_list'    =&gt; [$gitrepo-&gt;allversions],</span>
	<span style="color: #ff0000;">'ver_list'</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'v2.6.34'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'v3.0'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'ver_default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'v2.6.34'</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'include_maps'</span> <span style="color: #339933;">=&gt;</span> 
	    <span style="color: #009900;">&#91;</span>
	     <span style="color: #009900;">&#91;</span><span style="color: #000066;">qr</span><span style="color: #339933;">|^</span>arch<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">.*?</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/|,</span> <span style="color: #000066;">qr</span><span style="color: #339933;">|^</span>asm<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">.*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|,</span>
	      <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">&quot;include/asm-$_[0]/$_[1]&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	     <span style="color: #009900;">&#91;</span><span style="color: #000066;">qr</span><span style="color: #339933;">|^</span>include<span style="color: #339933;">/</span>asm<span style="color: #339933;">-</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">.*?</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/|,</span> <span style="color: #000066;">qr</span><span style="color: #339933;">|^</span>asm<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">.*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|,</span>
	      <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">&quot;include/asm-$_[0]/$_[1]&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	     <span style="color: #009900;">&#91;</span><span style="color: #000066;">qr</span><span style="color: #339933;">|^|,</span> <span style="color: #000066;">qr</span><span style="color: #339933;">|^</span>asm<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">.*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|,</span>
	      <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">map</span> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">&quot;include/asm-$_/$_[0]&quot;</span> <span style="color: #009900;">&#125;</span>
		    <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span>i386 x86_64<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	     <span style="color: #009900;">&#91;</span><span style="color: #000066;">qr</span><span style="color: #339933;">|^|,</span> <span style="color: #000066;">qr</span><span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">.*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|,</span>
	      <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">&quot;include/$_[0]&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	     <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #ff0000;">'unix'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #ff0000;">'repository'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$unixrepo</span><span style="color: #339933;">,</span>
	<span style="color: #ff0000;">'index'</span>       <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$index</span><span style="color: #339933;">,</span>
	<span style="color: #ff0000;">'search'</span>      <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$search</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'base_url'</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'http://upsuper-gentoo/lxr'</span><span style="color: #339933;">,</span>
	<span style="color: #666666; font-style: italic;"># Must be writable by httpd user:</span>
	<span style="color: #ff0000;">'cache'</span>	      <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'/var/lib/lxrng/cache/unix'</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'fs_charset'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'iso-8859-1'</span><span style="color: #339933;">,</span>
	<span style="color: #666666; font-style: italic;"># Tried successively</span>
	<span style="color: #ff0000;">'content_charset'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'utf-8'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'iso-8859-1'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'languages'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'C'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'GnuAsm'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	<span style="color: #666666; font-style: italic;">#'ctags_flags' =&gt; [&quot;-I\@$LXRng::ROOT/lxr-ctags-quirks&quot;],</span>
	<span style="color: #ff0000;">'ver_list'</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'v6'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'ver_default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'v6'</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #ff0000;">'include_maps'</span> <span style="color: #339933;">=&gt;</span> 
	    <span style="color: #009900;">&#91;</span>
	     <span style="color: #009900;">&#91;</span><span style="color: #000066;">qr</span><span style="color: #339933;">|^|,</span> <span style="color: #000066;">qr</span><span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">.*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|,</span>
	      <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">&quot;sys/$_[0]&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	     <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/setup-lxr/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>为 Linux 做一把 USB “钥匙”</title>
		<link>http://blog.upsuper.org/make-an-usb-key-for-linux/</link>
		<comments>http://blog.upsuper.org/make-an-usb-key-for-linux/#comments</comments>
		<pubDate>Fri, 14 Jan 2011 12:24:39 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[U盘]]></category>
		<category><![CDATA[验证]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1189</guid>
		<description><![CDATA[我曾经很早以前就在想，能不能将U盘作为登入我系统的验证机制。当时的想法是，这样比较有趣~不过后来发现另外一个重要的用途就是，防止在众目睽睽之下输入密码…… 这个问题提出后，邮件列表里很快就有人告诉我，Linux 已经有一个现成的机制了，这就是 pam_usb。不过我在网上搜了半晌都没搜到相关的中文资料，前几天弄成了，就写出来供大家参考~ 其实来说，是很简单的。首先，当然，要准备一个U盘~（废话），然后安装 pam_usb。在 Ubuntu 下的话，源里就有，可以输入命令 1 sudo apt-get install pamusb-tools 直接安装。当然如果你连终端也懒得打开，可以直接点击这里：安装 pamusb-tools。当然，在后面的步骤中你终归还是要打开终端的，所以还是先开了吧~这个东西目前暂时还没什么图形界面的样子（当然做一个相信也不难）。 另外，Fedora 源里有 pam_usb 包，Arch Linux 似乎在 AUR 里有，在 Gentoo 中似乎是被默认屏蔽的，可以通过下面指令安装： 1 2 echo &#34;sys-auth/pam_usb&#34; &#62;&#62; /etc/portage/package.keywords emerge -av &#34;&#62;=sys-auth/pam_usb-0.4.1&#34; 其他的发行版也可以直接从他们的项目主页下载源码包编译安装~ 安装好了以后，首先插入你作为钥匙的U盘，然后在终端中运行 1 sudo pamusb-conf --add-device MyUSBDevice 其中的 MyUSBDevice 可以任意修改，只是一个标识符而已。接下来根据提示操作即可。如果你的电脑此时连接着超过一个U盘、移动硬盘，或者某个U盘、移动硬盘包含超过一个分区（就像我给U盘分了2个区），就会提示选择安装到哪里。设置完确认保存到配置文件即可。 下面添加认证用户，下面的命令是添加我为认证用户的： 1 sudo pamusb-conf --add-user upsuper 原教程里面写的是添加 root 我认为是没有必要的，添加 sudoer 应该是已经足够了的。这条命令几乎不问什么问题，直接就完成了……这样以后在使用这把钥匙的时候就可以不需要输入相应用户的密码了。 [...]]]></description>
			<content:encoded><![CDATA[<p>我曾经很早以前就在想，能不能将U盘作为登入我系统的验证机制。当时的想法是，这样比较有趣~不过后来发现另外一个重要的用途就是，防止在众目睽睽之下输入密码……</p>
<p>这个<a href="https://groups.google.com/group/shlug/browse_thread/thread/d507a796d11df859/15b0bce269c51f7f">问题提出</a>后，邮件列表里很快就有人告诉我，Linux 已经有一个现成的机制了，这就是 pam_usb。不过我在网上搜了半晌都没搜到相关的中文资料，前几天弄成了，就写出来供大家参考~</p>
<p>其实来说，是很简单的。首先，当然，要准备一个U盘~（废话），然后安装 pam_usb。在 Ubuntu 下的话，源里就有，可以输入命令</p>

<div class="wp_codebox"><table><tr id="p118948"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code48"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> pamusb-tools</pre></td></tr></table></div>

<p>直接安装。当然如果你连终端也懒得打开，可以直接点击这里：<a href="apt:pamusb-tools">安装 pamusb-tools</a>。当然，在后面的步骤中你终归还是要打开终端的，所以还是先开了吧~这个东西目前暂时还没什么图形界面的样子（当然做一个相信也不难）。</p>
<p>另外，Fedora 源里有 pam_usb 包，Arch Linux 似乎在 AUR 里有，在 Gentoo 中似乎是被默认屏蔽的，可以通过下面指令安装：</p>

<div class="wp_codebox"><table><tr id="p118949"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1189code49"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;sys-auth/pam_usb&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>portage<span style="color: #000000; font-weight: bold;">/</span>package.keywords
emerge <span style="color: #660033;">-av</span> <span style="color: #ff0000;">&quot;&gt;=sys-auth/pam_usb-0.4.1&quot;</span></pre></td></tr></table></div>

<p>其他的发行版也可以直接从他们的<a href="http://pamusb.org/">项目主页</a>下载源码包编译安装~</p>
<p>安装好了以后，首先插入你作为钥匙的U盘，然后在终端中运行</p>

<div class="wp_codebox"><table><tr id="p118950"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code50"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> pamusb-conf <span style="color: #660033;">--add-device</span> MyUSBDevice</pre></td></tr></table></div>

<p>其中的 MyUSBDevice 可以任意修改，只是一个标识符而已。接下来根据提示操作即可。如果你的电脑此时连接着超过一个U盘、移动硬盘，或者某个U盘、移动硬盘包含超过一个分区（就像我给U盘分了2个区），就会提示选择安装到哪里。设置完确认保存到配置文件即可。</p>
<p>下面添加认证用户，下面的命令是添加我为认证用户的：</p>

<div class="wp_codebox"><table><tr id="p118951"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code51"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> pamusb-conf <span style="color: #660033;">--add-user</span> upsuper</pre></td></tr></table></div>

<p>原教程里面写的是添加 root 我认为是没有必要的，添加 sudoer 应该是已经足够了的。这条命令几乎不问什么问题，直接就完成了……这样以后在使用这把钥匙的时候就可以不需要输入相应用户的密码了。</p>
<p>最后最重要的一步，是编辑认证系统的配置文件。打开 /etc/pam.d/common-auth （对于 Gentoo 来说是 /etc/pam.d/system-auth），将下面这行插入到所有条目的前面：</p>

<div class="wp_codebox"><table><tr id="p118952"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code52"><pre class="text" style="font-family:monospace;">auth    sufficient      pam_usb.so</pre></td></tr></table></div>

<p>现在你的 USB 钥匙已经可以用了！现在，另外再打开一个终端，随便 sudo 点什么，然后你应该不会再看到输入密码的画面，取而代之的是下面的东西：</p>

<div class="wp_codebox"><table><tr id="p118953"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p1189code53"><pre class="text" style="font-family:monospace;">* pam_usb v0.4.2
* Authentication request for user &quot;upsuper&quot; (sudo)
* Device &quot;MyUSBDevice&quot; is connected (good).
* Performing one time pad verification...
* Access granted.</pre></td></tr></table></div>

<p>然后运行成功了！不仅 sudo 可以验证，包括 gksu 和登入框等等都已经可以使用这把钥匙直接略过不需要输入密码了。</p>
<p>现在你已经成功的制作了一个属于自己的 USB 钥匙！<br />
<span id="more-1189"></span><br />
现在我们看看还有什么地方可以继续改进的……</p>
<p>我们注意到，无论我们是否连接了我们的钥匙，以后 sudo 的时候都会出现那些讨厌的提示，怎么办呢……？其实这完全也是可以解决的：打开 /etc/pamusb.conf 文件，我们发现这其实根本就是一个 XML 文件……在里面的 &lt;defaults&gt; 标签中间添加</p>

<div class="wp_codebox"><table><tr id="p118954"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code54"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;option</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;quiet&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/option<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>保存后就直接生效了~</p>
<p>除此之外，我们发现在这里，我们的钥匙和原来的密码之间是一个替代的关系，如果你希望利用这个钥匙附加上密码提高安全性的话，可以将上面在 /etc/pam.d/common-auth 里面加入的那行中的 sufficient 改成 required，如果你干脆就不想再用密码了，那就把密码的那些删掉，留下一个 required 的 pam_usb~</p>
<p>话说这还真是强大呐~不过用了这个以后，你这个USB钥匙也得要好好保管鸟~不过其实对我来说最爽的无外乎以后在众目睽睽之下不需要再手动输入密码啦~</p>
<h3>参考资料</h3>
<ul>
<li><a href="http://ubuntuforums.org/showthread.php?t=17571">HOWTO: pam_usb login with USB memory stick &#8211; Ubuntu Forums</a></li>
<li><a href="http://pamusb.org/doc/quickstart">doc:quickstart    [pam_usb]</a></li>
<li><a href="http://pamusb.org/doc/configuration">doc:configuration    [pam_usb]</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/make-an-usb-key-for-linux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>由 Windows、Mac 和 Linux 想到的</title>
		<link>http://blog.upsuper.org/think-from-windows-mac-and-linux/</link>
		<comments>http://blog.upsuper.org/think-from-windows-mac-and-linux/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 22:09:10 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[随笔写写]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[信仰]]></category>
		<category><![CDATA[理想]]></category>
		<category><![CDATA[自由软件]]></category>
		<category><![CDATA[苹果]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1165</guid>
		<description><![CDATA[虽然说现在在澳洲度假，应该写的是游记，不过免不了还是胡思乱想一番，于是一早起来来写这篇文章。题目看起来很技术，其实这篇文章我一点也不准备讲技术。 我觉得，Windows 就像毒品，而 Mac 和 Linux 则是两种不同的信仰。 Mac 为什么是信仰其实并不需要多说。苹果的东西做得确实非常好，无论是外表、用户体验还是科技创新。不过果粉们选择 Mac 的理由和这些都没有关系，反倒更像某个讽刺果粉买 iPhone 的短片里说的那样，因为这是苹果。这就是一种宗教般的狂热。 而 Linux 则代表了软件界中一种开放和自由的精神，追捧它的人们所怀有的是一种乌托邦式的梦想和希望。这种精神是极有号召力的，且不说默默无闻的第二大软件公司 Oracle，也不说妇孺皆知的 IBM、Intel 和 nVIDIA，就连把 Linux 视作最大敌人之一的微软，都曾经想要为 Linux 贡献代码。 反观 Windows，虽然有无数的人离不开它，依赖它，但是同时听到的，也是种种的抱怨和不满伴随着 Windows 的成长。人们知道 Windows 有种种麻烦，而且今后可能需要为此付出许多额外的开销，但是仍然义无反顾地选择 Windows，而离开它却需要经历一个痛苦的过程，这完全与毒品无异。 可，这就是现实。绝大多数游戏除了家用机的版本外，基本只有 Windows 版；许许多多精巧有趣的小程序和专业性较强的软件，也并非全都有 Mac 和 Linux 版。这就是现实，现实和狂热的信仰，和梦想和希望之间总有那么些距离。因此有时我们不得不向现实妥协。wine (可视为 Mac 和 Linux 下的 Windows 模拟器) 就是一种妥协，Parallels (Mac 下的 Windows 虚拟机) 就是一种妥协。 但是，存在现实并不代表我们不能像 Martin Luther King [...]]]></description>
			<content:encoded><![CDATA[<p>虽然说现在在澳洲度假，应该写的是游记，不过免不了还是胡思乱想一番，于是一早起来来写这篇文章。题目看起来很技术，其实这篇文章我一点也不准备讲技术。</p>
<p>我觉得，Windows 就像毒品，而 Mac 和 Linux 则是两种不同的信仰。</p>
<p>Mac 为什么是信仰其实并不需要多说。苹果的东西做得确实非常好，无论是外表、用户体验还是科技创新。不过果粉们选择 Mac 的理由和这些都没有关系，反倒更像某个讽刺果粉买 iPhone 的短片里说的那样，因为这是苹果。这就是一种宗教般的狂热。</p>
<p>而 Linux 则代表了软件界中一种开放和自由的精神，追捧它的人们所怀有的是一种乌托邦式的梦想和希望。这种精神是极有号召力的，且不说默默无闻的第二大软件公司 Oracle，也不说妇孺皆知的 IBM、Intel 和 nVIDIA，就连把 Linux 视作最大敌人之一的微软，都曾经想要为 Linux 贡献代码。</p>
<p>反观 Windows，虽然有无数的人离不开它，依赖它，但是同时听到的，也是种种的抱怨和不满伴随着 Windows 的成长。人们知道 Windows 有种种麻烦，而且今后可能需要为此付出许多额外的开销，但是仍然义无反顾地选择 Windows，而离开它却需要经历一个痛苦的过程，这完全与毒品无异。</p>
<p>可，这就是现实。绝大多数游戏除了家用机的版本外，基本只有 Windows 版；许许多多精巧有趣的小程序和专业性较强的软件，也并非全都有 Mac 和 Linux 版。这就是现实，现实和狂热的信仰，和梦想和希望之间总有那么些距离。因此有时我们不得不向现实妥协。wine (可视为 Mac 和 Linux 下的 Windows 模拟器) 就是一种妥协，Parallels (Mac 下的 Windows 虚拟机) 就是一种妥协。</p>
<p>但是，存在现实并不代表我们不能像 Martin Luther King 那样拥有梦想，并不代表我们不能拥有狂热的信仰。向现实的妥协有时不过是为了更好的追求我们所追求的那些东西。</p>
<p>毕竟，构成这个世界的，虽然有90%的现实，但也有9%的狂热和1%的理想；</p>
<p>毕竟，hope is a good thing, and maybe the best of things.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/think-from-windows-mac-and-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>半完美解决 zip 文件中中文文件名乱码的问题</title>
		<link>http://blog.upsuper.org/a-half-perfect-solution-for-irrecognizable-encoded-chinese-filename-in-zip-file/</link>
		<comments>http://blog.upsuper.org/a-half-perfect-solution-for-irrecognizable-encoded-chinese-filename-in-zip-file/#comments</comments>
		<pubDate>Mon, 10 May 2010 14:33:46 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[zip]]></category>
		<category><![CDATA[乱码]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1154</guid>
		<description><![CDATA[前一段由于收了某个 zip 文件，用 Ubuntu 自带的归档管理器打开，哎呦，那真不是一般的蛋疼……因为里面全是中文文件名，那个乱码啊…… 于是我就下决心要解决这个问题。 虽然我的系统还在 9.10，但看到网上一篇文章教人如何在 10.04 中解决这个问题，我就了解了，这个问题至今没有解决。那么什么叫做“半完美”呢？大概意思就是说，对我来说差不多完美了，不过还是很可能出问题的…… 命令行方法 一般的方法是利用命令行的方式： 1 2 LANG=C 7z x xxxx.zip convmv -f gbk -t utf8 * 用这个方法，我就写了一个 unzip 的小脚本： 1 2 #! /bin/sh LANG=C /usr/lib/p7zip/7z x -y &#34;$1&#34; &#124; sed -n 's/^Extracting //p' &#124; sed '1!G;h;$!d' &#124; xargs convmv -f gbk -t utf8 --notest &#62;\dev\null 2&#62;\dev\null 功能就是 [...]]]></description>
			<content:encoded><![CDATA[<p>前一段由于收了某个 zip 文件，用 Ubuntu 自带的归档管理器打开，哎呦，那真不是一般的蛋疼……因为里面全是中文文件名，那个乱码啊……</p>
<p>于是我就下决心要解决这个问题。</p>
<p>虽然我的系统还在 9.10，但看到网上一篇文章教人如何在 10.04 中解决这个问题，我就了解了，这个问题至今没有解决。那么什么叫做“半完美”呢？大概意思就是说，对我来说差不多完美了，不过还是很可能出问题的……<br />
<span id="more-1154"></span></p>
<h3>命令行方法</h3>
<p>一般的方法是利用命令行的方式：</p>

<div class="wp_codebox"><table><tr id="p115460"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1154code60"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">LANG</span>=C 7z x xxxx.zip
convmv <span style="color: #660033;">-f</span> gbk <span style="color: #660033;">-t</span> utf8 <span style="color: #000000; font-weight: bold;">*</span></pre></td></tr></table></div>

<p>用这个方法，我就写了一个 unzip 的小脚本：</p>

<div class="wp_codebox"><table><tr id="p115461"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1154code61"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#! /bin/sh</span>
<span style="color: #007800;">LANG</span>=C <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>p7zip<span style="color: #000000; font-weight: bold;">/</span>7z x <span style="color: #660033;">-y</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">'s/^Extracting  //p'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'1!G;h;$!d'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">xargs</span> convmv <span style="color: #660033;">-f</span> gbk <span style="color: #660033;">-t</span> utf8 <span style="color: #660033;">--notest</span> <span style="color: #000000; font-weight: bold;">&gt;</span>\dev\null <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;</span>\dev\null</pre></td></tr></table></div>

<p>功能就是 unzip xxxx.zip 能够自动转码。内部机理我就不详细解释了，其实也不复杂。而且由于我不大会用 sed，所以用了两段，但我相信是不需要的。</p>
<p>不过这个不完美，为什么呢？因为这样我用归档管理器打开还是乱码，根本没有解决任何问题！</p>
<h3>我的半完美方法</h3>
<p>于是我就开始打 7z 程序的主意……当然最后是成功了的，这里先放对比图哈~<br />
<a href="http://blog.upsuper.org/wp-content/uploads/2010/05/Screenshot.png"><img src="http://blog.upsuper.org/wp-content/uploads/2010/05/Screenshot-300x197.png" alt="" title="Screenshot" width="300" height="197" class="alignnone size-medium wp-image-1155" /></a></p>
<p>现在做了一个 Ubuntu 的 patch 出来，需要的童鞋可以在这里下载：<a href="http://down.upsuper.org/p7zip_9.04~dfsg.1-1chinese.diff.gz">p7zip_9.04~dfsg.1-1chinese.diff.gz</a> (1.1KB)。不要看是 9.04 的，据我观察在 lucid 当中版本号还是这个，p7zip 一直没有变化过……</p>
<p>下载完以后再找个目录获取 p7zip 的代码：</p>

<div class="wp_codebox"><table><tr id="p115462"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1154code62"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #7a0874; font-weight: bold;">source</span> p7zip-full</pre></td></tr></table></div>

<p>注意这里不需要 sudo 权限，因为获取源代码是自由的~</p>
<p>然后把刚才下载的那个 patch 文件放进代码目录，一般来说应该是 p7zip-9.04~dfsg.1 目录。然后执行下面代码：</p>

<div class="wp_codebox"><table><tr id="p115463"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1154code63"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">gzip</span> <span style="color: #660033;">-cd</span> p7zip_9.04~dfsg.1-1chinese.diff.gz <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">patch</span> <span style="color: #660033;">-p1</span></pre></td></tr></table></div>

<p>然后就常规了：</p>

<div class="wp_codebox"><table><tr id="p115464"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1154code64"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">make</span> all3
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></td></tr></table></div>

<p>需要注意的是，这里安装完以后并没有覆盖原来 p7zip 包的文件，但是放在了一个更优先访问的位置，所以以后执行 7z 相关的操作都会访问这里安装的。</p>
<p>由于编译需要很长很长时间，所以我这里编译好了一份：<a href="http://down.upsuper.org/p7z-bin.tar.bz2">p7z-bin.tar.bz2</a> (1.6M)，是 Ubuntu i386 版本的，如果你也是 i386 的就可以直接下载这个，用里面的程序覆盖掉 /usr/lib/p7zip/ 里面的程序，就可以了~</p>
<p>当然，最好把相同功能的 unzip 先卸掉……</p>
<p>现在，在系统里面以任何方式查看或解压任何 zip，理论上应该不会出现乱码了，我想是这样……</p>
<h3>解决思路</h3>
<p>好了，对于只想解决问题的人，看到这里就够了。现在我想写写如何做到的。</p>
<p>我看了一下 p7zip 的代码，还算是条理相当清晰，其中最重要的部分是 ZipIn.cpp 里面的 ReadFileName 函数，我在里面读取文件名之后插入了一段使用 iconv 函数转换编码的代码。</p>
<p>其后我发现不能这样简单的转换编码，因为在 Linux 下面打包的 zip 文件，文件名是用 utf8 而非 gb18030 储存的，这样在转换的时候反而出现乱码。我观察了一下，WinRAR 能够正常读出这些文件名的编码。因此我又在另外一些相关的函数中加入了判断打包平台的代码，以确认是否要转换编码。</p>
<p>此外，由于 gb18030 是硬编码进去的，显然不太好，但我暂时想不出什么更好的解决方法。我想这对于目前的国内自己用应该是足够了，不过考虑到开源软件一向喜欢的国际化，我就实在没什么办法了……如果有人有办法，请一定告诉我！</p>
<p>不过为了平衡，我最后在 config.h 里面加入了 MY_ENCODING 宏，这样可以修改这个以改变硬编码的文字编码值，也算是一点点努力吧……</p>
<h3>一点抱怨</h3>
<p>由于是在上网本上做的，而且我不想折磨我可怜的 SSD 或者移动硬盘，因此我不得不在内存盘中进行编译。每次都是心惊胆战的，生怕内存不够用开始吃交换区……当然最后还是没有……</p>
<p>话说 Windows 混乱的内码转换害死人啊……</p>
<h3>参考资料</h3>
<ul>
<li><a href="http://linux.cn/home/space-5812-do-thread-id-3019.html">使用ubuntu 10.04中的中文乱码问题解决 &#8211; kyohand &#8211; Linux中国</a></li>
<li><a href="http://qq164587043.blog.51cto.com/261469/63349">使用iconv命令轻松实现linux下字符集编码的转换 &#8211; 国产0与1 &#8211; 51CTO技术博客</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/linux/l-diffp/index.html">用Diff和Patch工具维护源码</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/a-half-perfect-solution-for-irrecognizable-encoded-chinese-filename-in-zip-file/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>在 tty 里添加一个开机自启动的任务管理器</title>
		<link>http://blog.upsuper.org/run-top-automatical-in-tty-after-boot/</link>
		<comments>http://blog.upsuper.org/run-top-automatical-in-tty-after-boot/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 02:31:09 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[tty]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1126</guid>
		<description><![CDATA[每当感觉到系统卡的时候，最好的方法无外乎进入 tty，登入，打开一个 top 监视。可是每次到了需要的时候才去开，打开的效率自然不敢恭维。于是便想，每次开机的时候，记起来就跑到 tty 下面去先开起来。不过这件事情总归是麻烦的，于是才有了现在的方案。 既然 tty 那么多，那我们就把他利用一下吧~让他开机自动在某个 tty 里面启动 top 无疑最方便了~ 首先呢，我找到了 Ubuntu 里面 tty 配置存放的地方 /etc/init/ttyX.conf，其中的 X 便是 tty 的编号，我这里选择了 tty6.conf。打开这个文件，结构简单极了，看到里面 10 exec /sbin/getty -8 38400 tty6 就知道，肯定和 getty 有关系。man getty 里面查到可以通过 -l 参数设置登入程序替代 /bin/login。查了一下 man login，发现可以通过 -f username 的方式不进行验证地登入。 于是我就在 /bin 下面新建了一个 autologin 文件（其实理论上放哪里都可以，不过最好要用 root 权限创建，不然可以乱改就不好了），里面写上 1 2 #!/bin/sh /bin/login -f [...]]]></description>
			<content:encoded><![CDATA[<p>每当感觉到系统卡的时候，最好的方法无外乎进入 tty，登入，打开一个 top 监视。可是每次到了需要的时候才去开，打开的效率自然不敢恭维。于是便想，每次开机的时候，记起来就跑到 tty 下面去先开起来。不过这件事情总归是麻烦的，于是才有了现在的方案。</p>
<p>既然 tty 那么多，那我们就把他利用一下吧~让他开机自动在某个 tty 里面启动 top 无疑最方便了~<br />
<span id="more-1126"></span><br />
首先呢，我找到了 Ubuntu 里面 tty 配置存放的地方 /etc/init/ttyX.conf，其中的 X 便是 tty 的编号，我这里选择了 tty6.conf。打开这个文件，结构简单极了，看到里面</p>

<div class="wp_codebox"><table><tr id="p112672"><td class="line_numbers"><pre>10
</pre></td><td class="code" id="p1126code72"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">exec</span> <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>getty <span style="color: #660033;">-8</span> <span style="color: #000000;">38400</span> tty6</pre></td></tr></table></div>

<p>就知道，肯定和 getty 有关系。man getty 里面查到可以通过 -l 参数设置登入程序替代 /bin/login。查了一下 man login，发现可以通过 -f username 的方式不进行验证地登入。</p>
<p>于是我就在 /bin 下面新建了一个 autologin 文件（其实理论上放哪里都可以，不过最好要用 root 权限创建，不然可以乱改就不好了），里面写上</p>

<div class="wp_codebox"><table><tr id="p112673"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1126code73"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">login</span> <span style="color: #660033;">-f</span> upsuper</pre></td></tr></table></div>

<p>给这个文件加上可执行属性，接着将 /etc/init/tty6.conf 里面刚才那一行改成</p>

<div class="wp_codebox"><table><tr id="p112674"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1126code74"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">exec</span> <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>getty <span style="color: #660033;">-8</span> <span style="color: #660033;">-l</span> <span style="color: #ff0000;">'/bin/autologin'</span> <span style="color: #000000;">38400</span> tty6</pre></td></tr></table></div>

<p>重启。</p>
<p>进入 tty6 发现没有效果，还是提示用户名，无语……于是输入了用户名 upsuper，结果发现没有要求密码，直接进入了。我退出登入，再输入 root，发现依然没有要求密码而直接进入了 upsuper 权限。</p>
<p>再查查 man getty，发现那个请求用户名是 getty 输出的，里面提到了 -n 参数，可以消除对用户名的请求，以及 -i 参数，不输出请求前的文字（在我的 Ubuntu 里面就是“Ubuntu 9.10”）。于是上面那行被改成了</p>

<div class="wp_codebox"><table><tr id="p112675"><td class="line_numbers"><pre>10
</pre></td><td class="code" id="p1126code75"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">exec</span> <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>getty <span style="color: #660033;">-8in</span> <span style="color: #660033;">-l</span> <span style="color: #ff0000;">'/bin/autologin'</span> <span style="color: #000000;">38400</span> tty6</pre></td></tr></table></div>

<p>重新启动，发现已经可以自动进入。</p>
<p>不过我要的不是这个效果~</p>
<p>其实简单地说，我那个要实现也不难，按照现在的情况，就是在 ~/.bashrc 里面加上一行判断的事情了。不过我可不想这样。这样的话如果退出了 top 就会进入命令行。我的想法是，永远不让他进入命令行，这样看过去比较爽~</p>
<p>于是我就倒腾起了 login 程序的 FAKE_SHELL，如果在 autologin 脚本里改变环境变量，根本影响不了 login 程序，无论我改 FAKE_SHELL，还是 SHELL，都没有用，login 仍然义无反顾地进入了 bash……</p>
<p>最后我就想，唉，其实 autologin 脚本就是一正常脚本，只不过在登入的时候以 root 权限运行嘛，那我直接在里面运行 top 不久行了~考虑到权限因素，就是用 su 把权限改一下，不就解决问题了么？</p>
<p>于是最终版的 autologin 就出炉了：</p>

<div class="wp_codebox"><table><tr id="p112676"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1126code76"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #c20cb9; font-weight: bold;">su</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'/usr/bin/top'</span> upsuper</pre></td></tr></table></div>

<p>这个最后效果是什么样的呢？就是 top 以我的用户权限运行，然后点击 q 退出就会重新启动一个 top。这就是我要得效果了~很好很强大~算是合理的利用了一个 tty 了。现在只要点击 Ctrl-Alt-F6 就可以有现成的任务管理器了~</p>
<p>其实根据这个思路，tty 可以做的事情还很多。本来那个什么 -l 啦，-n 什么的，是拿来做自定义登入验证方式的，我觉得这个也大有文章可做~最后再感叹一下，Linux 实在太强大了~</p>
<p><strong>补充：</strong></p>
<p>这篇文章被我投递到了 LinuxTOY 上面，然后下面有人提到使用 htop 代替 top，我试了一下，貌似 htop 的资源占用要比 top 高出许多，因此我最后没有替换。</p>
<p>不过 htop 貌似确实好用很多，如果需要的话，只要安装 htop 后（Ubuntu 源里是有的），然后把 autologin 里面的</p>

<div class="wp_codebox"><table><tr id="p112677"><td class="line_numbers"><pre>2
</pre></td><td class="code" id="p1126code77"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">su</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'/usr/bin/top'</span> upsuper</pre></td></tr></table></div>

<p>改成</p>

<div class="wp_codebox"><table><tr id="p112678"><td class="line_numbers"><pre>2
</pre></td><td class="code" id="p1126code78"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">su</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'/usr/bin/htop'</span> upsuper</pre></td></tr></table></div>

<p>下面只要进入那个 tty 点 q 退出当前 top，马上就会自动替换为 htop 启动了~</p>
<p>还有就是，本来想写的，但写的时候忘记了。因为昨晚 G*W 非常莫名其妙的把 Google 大规模屏蔽了，于是网上查找相关资料极其不便，于是就使用了 Linux 自己的 man。这几本上也是我第一次完全依靠 man 来解决问题~Linux 的手册也还是很强悍的嘛~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/run-top-automatical-in-tty-after-boot/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>转入 Arch Linux</title>
		<link>http://blog.upsuper.org/turn-to-arch-linux/</link>
		<comments>http://blog.upsuper.org/turn-to-arch-linux/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 15:01:48 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[我的计划]]></category>
		<category><![CDATA[Arch Linux]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1064</guid>
		<description><![CDATA[过去的一段时间里看到很多关于 Arch Linux 的文章，我也对此有那么一点感兴趣了。据说这个是比 Ubuntu 要难折腾一些的，我想，这也正好测试一下我的 Linux 水平，扩充一下关于 Linux 的见识嗯~（其实说白了就是装一下13嗯……） 准备工作肯定是要有的。由于我这次又准备对硬盘分区做一番大动作，资料备份是必不可少的了。整理了一下移动硬盘里的东西，然后把 /home/upsuper 里面的大量资料和部分配置文件移入了移动硬盘，费了大概一个多小时的时间。接下去打开了我的上网本，打开当时在 LinuxToy 刊登的 Arch Linux 安装指南，这是非常必要的。对于一个用惯了 Ubuntu 这样几乎纯图形界面配置的人来说，一个更接近于 LFS 的系统没有参考自然是不敢随便动手的。 不过有了这个参考，其实 Arch Linux 说实话也就比 Ubuntu 要麻烦那么一点点了……安装的过程中虽然有很多与那个指南不一样的地方，不过因为各种原因没有一一记录下来……比较有印象的是分区，是2个主分区，4个逻辑分区。虽然很多人说过，现在已经不再需要把 /boot 单独分出来了。不过考虑到我准备将默认文件系统弄成 ext4，而 Arch Linux 默认又不提供 Grub2 作为启动器，那我就只能非常无奈的单独分出一个 /boot 了……这就是第一个主分区。另外一个主分区留了 500MB，准备改天在里面放个 FreeBSD 什么的耍耍~4个逻辑分区是不能免俗的 /tmp、根分区、/home 和交换区。本来有点想像上网本里弄得那样把 /tmp 弄到内存里面去。不过想来想去，觉得 1GB 的内存对于上网本来说够了，可是对于台机来说还是不算很大的，于是就作罢了，单独分区。给了 /tmp 1GB，交换区 512MB，根目录 20GB，剩下的就照例都给了 /home。 我在安装的时候没有如安装指南所说的使用 Arch Linux [...]]]></description>
			<content:encoded><![CDATA[<p>过去的一段时间里看到很多关于 Arch Linux 的文章，我也对此有那么一点感兴趣了。据说这个是比 Ubuntu 要难折腾一些的，我想，这也正好测试一下我的 Linux 水平，扩充一下关于 Linux 的见识嗯~（其实说白了就是装一下13嗯……）</p>
<p>准备工作肯定是要有的。由于我这次又准备对硬盘分区做一番大动作，资料备份是必不可少的了。整理了一下移动硬盘里的东西，然后把 /home/upsuper 里面的大量资料和部分配置文件移入了移动硬盘，费了大概一个多小时的时间。接下去打开了我的上网本，打开当时在 <a href="http://linuxtoy.org">LinuxToy</a> 刊登的 <a href="http://linuxtoy.org/archives/install-guide-for-arch-linux.html">Arch Linux 安装指南</a>，这是非常必要的。对于一个用惯了 Ubuntu 这样几乎纯图形界面配置的人来说，一个更接近于 LFS 的系统没有参考自然是不敢随便动手的。<br />
<span id="more-1064"></span><br />
不过有了这个参考，其实 Arch Linux 说实话也就比 Ubuntu 要麻烦那么一点点了……安装的过程中虽然有很多与那个指南不一样的地方，不过因为各种原因没有一一记录下来……比较有印象的是分区，是2个主分区，4个逻辑分区。虽然很多人说过，现在已经不再需要把 /boot 单独分出来了。不过考虑到我准备将默认文件系统弄成 ext4，而 Arch Linux 默认又不提供 Grub2 作为启动器，那我就只能非常无奈的单独分出一个 /boot 了……这就是第一个主分区。另外一个主分区留了 500MB，准备改天在里面放个 FreeBSD 什么的耍耍~4个逻辑分区是不能免俗的 /tmp、根分区、/home 和交换区。本来有点想像上网本里弄得那样把 /tmp 弄到内存里面去。不过想来想去，觉得 1GB 的内存对于上网本来说够了，可是对于台机来说还是不算很大的，于是就作罢了，单独分区。给了 /tmp 1GB，交换区 512MB，根目录 20GB，剩下的就照例都给了 /home。</p>
<p>我在安装的时候没有如安装指南所说的使用 Arch Linux 原本的源，而是转而直接使用了网易的源。由于这个原因，后面的安装配置过程异常迅速，因为网易的源在我这里的下载速度可以达到 1MB+/s！突然想起 Arch Linux 貌似还有多点下载的技术，我就不去研究了，不然可能 4MB/s、5MB/s 都能给我飙出来……接下去就直接赶英超美了……事实证明，福建电信还是比较厚道的~</p>
<p>我记得，那个 20GB 的空间，刚刚装完 Arch Linux 的核心部分，大概只占用了 8%，接着我开始大装软件。什么 python、erlang、texlive、gnome、jdk、jre、openoffice 之流都装上去，现在看看，已经占用了 33% 了……</p>
<p>因为一开始记了一张软件单子，按着单子安装软件也是十分的方便，在进入图形界面前就已经把需要的软件安装好大半了。话说 Arch Linux 的启动没有启动画面，这点让我有点不适应。而且看启动也没有加入 quiet 参数，启动过程各种信息喷涌而出。本想自己给他加上的，后来想想也就作罢了，没所谓的事情。</p>
<p>倒是字体的问题纠结了我一些时间，最后我还是从 AUR 上安装了文泉驿微米黑，然后手动把所有字体调为微米黑，现在显示效果相当赞。最后就是 Firefox 的插件问题了。因为插件我也列了张单子（这次可是准备充分嗯！），然后一个一个装上，最后用 Xmarks 同步一下书签，现在 Firefox 和我换系统之前几乎是一模一样了~当然，效率比原来那个提高了不少~</p>
<p>不得不说的是，Arch Linux 初装后的效率确实是没得说的快，比 Ubuntu 快多了。不过不知道是不是因为默认安装的东西少，还是希望这种效率能够不断保持下去。现在用 Arch，估计在以后的很长一段时间里不会再换了，也不会再重装了，Arch 你要给我好好表现~</p>
<p>最后上一张图把，超赞 <a href="http://www.bisigi-project.org/?lang=en">Bisigi</a> 的新主题 <a href="http://www.bisigi-project.org/?p=411&#038;lang=en">AirLines</a>：<br />
<a href="http://blog.upsuper.org/wp-content/uploads/2010/02/Screenshot.png"><img src="http://blog.upsuper.org/wp-content/uploads/2010/02/Screenshot-300x187.png" alt="" title="Screenshot" width="300" height="187" class="alignnone size-medium wp-image-1065" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/turn-to-arch-linux/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>wine 在终端下中文显示的问题</title>
		<link>http://blog.upsuper.org/how-to-display-chinese-for-wined-program-in-terminal/</link>
		<comments>http://blog.upsuper.org/how-to-display-chinese-for-wined-program-in-terminal/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 08:13:22 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Wine]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=959</guid>
		<description><![CDATA[众所周知，Windows 下的中文程序使用的是 GBK 或 GB18030 编码，而 Linux 下则默认是 UTF-8 编码。对于图形界面的程序，wine 对中文的处理似乎已经做的不错了，但对于文字界面就无能为力了…… 在网上找了找，发现很多人的方法是改 .profile 或者 .bashrc，在里面把 LANG 和 LC_ALL 设置为 zh_CN.gbk 或 zh_CN.gb18030。这种方法对于只在 Windows 下用终端连接 Linux 的用户当然没问题，可是对于像我这样惯用 Linux 的人怎么办？ 于是乎我就找到这么一篇文章：ubuntu下如何让terminal编码自动切换 根据这篇的做法，我先执行了 1 2 3 4 sudo mkdir /usr/lib/X11/locale sudo ln -s /usr/share/X11/locale/locale.alias /usr/lib/X11/locale/ sudo mkdir -p /usr/lib/X11/fonts/encoding/ sudo ln -s /usr/share/X11/fonts/encodings/encoding.dir /usr/lib/X11/fonts/encoding/ 然后再用 1 luit -encoding [...]]]></description>
			<content:encoded><![CDATA[<p>众所周知，Windows 下的中文程序使用的是 GBK 或 GB18030 编码，而 Linux 下则默认是 UTF-8 编码。对于图形界面的程序，wine 对中文的处理似乎已经做的不错了，但对于文字界面就无能为力了……</p>
<p>在网上找了找，发现很多人的方法是改 .profile 或者 .bashrc，在里面把 LANG 和 LC_ALL 设置为 zh_CN.gbk 或 zh_CN.gb18030。这种方法对于只在 Windows 下用终端连接 Linux 的用户当然没问题，可是对于像我这样惯用 Linux 的人怎么办？<br />
<span id="more-959"></span><br />
于是乎我就找到这么一篇文章：<a href="http://doc.linuxpk.com/40459.html">ubuntu下如何让terminal编码自动切换</a></p>
<p>根据这篇的做法，我先执行了</p>

<div class="wp_codebox"><table><tr id="p95982"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p959code82"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>X11<span style="color: #000000; font-weight: bold;">/</span>locale
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>X11<span style="color: #000000; font-weight: bold;">/</span>locale<span style="color: #000000; font-weight: bold;">/</span>locale.alias <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>X11<span style="color: #000000; font-weight: bold;">/</span>locale<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>X11<span style="color: #000000; font-weight: bold;">/</span>fonts<span style="color: #000000; font-weight: bold;">/</span>encoding<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>X11<span style="color: #000000; font-weight: bold;">/</span>fonts<span style="color: #000000; font-weight: bold;">/</span>encodings<span style="color: #000000; font-weight: bold;">/</span>encoding.dir <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>X11<span style="color: #000000; font-weight: bold;">/</span>fonts<span style="color: #000000; font-weight: bold;">/</span>encoding<span style="color: #000000; font-weight: bold;">/</span></pre></td></tr></table></div>

<p>然后再用</p>

<div class="wp_codebox"><table><tr id="p95983"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p959code83"><pre class="bash" style="font-family:monospace;">luit <span style="color: #660033;">-encoding</span> gb18030 wine program.exe</pre></td></tr></table></div>

<p>就可以正常显示中文了！</p>
<p>不过好生麻烦啊……</p>
<p>于是进一步的，把 ~/.bash_aliases 文件（不存在就新建）里面加上一行：</p>

<div class="wp_codebox"><table><tr id="p95984"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p959code84"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">wine</span>=<span style="color: #ff0000;">'luit -encoding gb18030 wine'</span></pre></td></tr></table></div>

<p>从此以后，只要在使用 windows 命令行程序的时候使用 wine program.exe 这种形式，就可以正常显示中文啦~</p>
<p>话说回来，这个方法有一个很大的问题，就是载入和退出似乎特别慢……不过能显示中文才是王道哈~</p>
<p>另外，经过特别的努力，我的 twitter 也终于申请到了，大家可以 follow <a href="http://twitter.com/upsuperx">@upsuperx</a>……</p>
<p>话说，这些资料都是 Google.cn 里面找的……如果 Google 真的退出中国，我应该去哪找资料啊……百度在技术资料这块简直是废物啊……Google 你快回来……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/how-to-display-chinese-for-wined-program-in-terminal/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>我的 Linux Deepin 体验报告</title>
		<link>http://blog.upsuper.org/my-report-of-experiencing-linux-deepin/</link>
		<comments>http://blog.upsuper.org/my-report-of-experiencing-linux-deepin/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 15:38:26 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[琐事杂谈]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux Deepin]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=940</guid>
		<description><![CDATA[文章最前面，先祝各位在新的一年里天天开心哈~ 昨天用 BT 下载了 Linux Deepin。记得当年装 XP 就一定要装 Deepin 的，觉得 Deepin 做的最好，做的最清楚。现如今 Deepin 也转投 Linux 的怀抱，是在不能不说是一件令人高兴的事情。 下面来说说 LD 吧。 我用 UNetBootin 将 LD 弄进了 U 盘里，然后通过 LiveUSB 进入了 LD。LD 给我的第一印象就是那个漂亮的时明时暗的 LD 的 Logo，接着看到了 Ubuntu 9.10 引入的 Xsplash，也很不错~由于是 LiveUSB 启动，因此启动速度不好做评述，不过感觉还是比较满意的。 进去以后看到的就是非常清爽的绿色界面，给人的第一感觉很好。桌面摆放有点 XP 的风格，不过也不尽然。菜单摆在了 Windows 最传统的开始菜单的位置，对于刚刚从 Windows 的世界里逃脱出来的人们来说，无疑是个不错的选择。图标、任务列表和提示区的排布也很符合 Windows 下的习惯。个人觉得 LD 在 Windows 的使用习惯和 Linux 的特性上做了一个较好的权衡。话说其实如果想利用漂亮吸引用户，可以考虑弄 Dock [...]]]></description>
			<content:encoded><![CDATA[<p><strong>文章最前面，先祝各位在新的一年里天天开心哈~</strong></p>
<p>昨天用 BT 下载了 Linux Deepin。记得当年装 XP 就一定要装 Deepin 的，觉得 Deepin 做的最好，做的最清楚。现如今 Deepin 也转投 Linux 的怀抱，是在不能不说是一件令人高兴的事情。</p>
<p>下面来说说 LD 吧。</p>
<p>我用 UNetBootin 将 LD 弄进了 U 盘里，然后通过 LiveUSB 进入了 LD。LD 给我的第一印象就是那个漂亮的时明时暗的 LD 的 Logo，接着看到了 Ubuntu 9.10 引入的 Xsplash，也很不错~由于是 LiveUSB 启动，因此启动速度不好做评述，不过感觉还是比较满意的。<br />
<span id="more-940"></span><br />
<a href="http://blog.upsuper.org/wp-content/uploads/2010/01/Screenshot.png"><img src="http://blog.upsuper.org/wp-content/uploads/2010/01/Screenshot-300x175.png" alt="LD 桌面第一印象" title="Screenshot" width="300" height="175" class="alignright size-medium wp-image-942" /></a>进去以后看到的就是非常清爽的绿色界面，给人的第一感觉很好。桌面摆放有点 XP 的风格，不过也不尽然。菜单摆在了 Windows 最传统的开始菜单的位置，对于刚刚从 Windows 的世界里逃脱出来的人们来说，无疑是个不错的选择。图标、任务列表和提示区的排布也很符合 Windows 下的习惯。个人觉得 LD 在 Windows 的使用习惯和 Linux 的特性上做了一个较好的权衡。话说其实如果想利用漂亮吸引用户，可以考虑弄 Dock 哈~我觉得 LD 如果能做到华丽度上比 Win7 (硬件条件允许则自动开启效果)，资源耗用下比 Win98 (如果硬件差则自动关闭不需要的东西)，那就完美了~</p>
<p><a href="http://blog.upsuper.org/wp-content/uploads/2010/01/Screenshot1.png"><img src="http://blog.upsuper.org/wp-content/uploads/2010/01/Screenshot1-300x175.png" alt="Ubuntu Tweak for LD" title="Screenshot" width="300" height="175" class="alignright size-medium wp-image-943" /></a>看了一下“开始”菜单里面的项目（开菜单的时候不能截图……囧），发现系统设置里面自带了 Ubuntu Tweak，这是个好东西啊~而且打开看，发现和我的系统里面的那个有很大不同。打开关于才发现是 0.5 的……这个不是还没发布么？不过功能多了不少，而且看起来高度模块化了，这为未来扩展提供了很大空间啊！突然想起了我的 ujudger，我也要做的有扩展性~</p>
<p><a href="http://blog.upsuper.org/wp-content/uploads/2010/01/Screenshot-1.png"><img src="http://blog.upsuper.org/wp-content/uploads/2010/01/Screenshot-1-300x226.png" alt="LD 里的 wine 记事本" title="Screenshot-1" width="300" height="226" class="alignright size-medium wp-image-945" /></a>LD 的 wine 似乎做了不少优化，特别是针对中文化方面。而且 wine 的程序字体也比较漂亮了，不像我自己调的那样……看这记事本，显示的多么完美啊~</p>
<p>关于 wine 我正好下了一个人人桌面版，便顺便试试 wine 的性能。安装界面非常完美，而且安装结束后成功地在桌面上创建了图标。不过运行起来就不是那么回事了……界面抽风似的，根本不能用……因为删了，所以没有截图……不过截图也没用就是了，如果录像绝对雷死人……</p>
<p>不过这个 wine 还可以使用“添加/删除程序”，很轻松地卸掉了用不了的人人桌面客户端……</p>
<p>此外还很惊奇地发现 Deepin 把 OOo 的启动画面也变了~绿色的~</p>
<p>话说 Deepin 的作品果然是很赞的，本土化做的相当不错，把各种必要的配置都预先做好了，Firefox 也已经安装了 DownThemAll! 等优秀插件，非常贴心。总之是非常赞的一个 Linux 的本地化发行版。很适合不会配置或懒得配置系统的人使用~</p>
<p>最后，我还给 Linux Deepin 提出了一些我自己的建议，汇集在这个帖子里面了：<a href="http://bbs.deepin.org/thread-1597392-1-2.html">个人对 LD 的一些改进建议 &#8211; 『Linux 操作系统』 &#8211;  深度技术论坛</a>，大家有空支持一下哈~</p>
<p>（话说……一边写这篇一边干别的事情，结果托了好长时间，可能有很多本来想写的没写进去，就草草收尾了……因为想睡觉了 _-b）</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/my-report-of-experiencing-linux-deepin/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>原来 Linux 也是可以死得那么惨的……</title>
		<link>http://blog.upsuper.org/it-is-possible-for-linux-to-die/</link>
		<comments>http://blog.upsuper.org/it-is-possible-for-linux-to-die/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 14:40:37 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[琐事杂谈]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[死机]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=922</guid>
		<description><![CDATA[昨天晚上我第一次看到 Linux 真正的死机：连 SysRq 都无效了……这实在不能不说是一种讽刺：我写过的被转载最多的莫过于那篇 Linux 死机了该怎么办？我却自己遇到了一次真正的，无法处理的死机…… 无图无真相，以下是我的 Tattoo 拍摄下的死机后的屏幕显示，那些是 Linux 在死机前垂死挣扎输出的信息： 下面描述一下如何变成这样的…… 首先肯定是 Ubuntu 9.10 的 bug，我关机时会卡死在 Unmounting temporary filesystems&#8230; 这里，似乎是因为 Ubuntu 9.10 对移动硬盘支持有问题的一个 bug……过了很久，系统提示 unmount 的过程超过了 120s，然后什么什么的记不清了……接着就卡死在那儿了。根据经验，这个时候可以用 SysRq 强制安全重启，我就按住 Alt+Sys Rq，这时似乎是碰到了 Win 键，这时突然屏幕上冒出大量信息，最后死机，变成上面状态…… 就是这样…… 囧啊……Linux 也能死机……我的 rp 啊……]]></description>
			<content:encoded><![CDATA[<p>昨天晚上我第一次看到 Linux 真正的死机：连 SysRq 都无效了……这实在不能不说是一种讽刺：我写过的被转载最多的莫过于那篇 <a href="http://blog.upsuper.org/what-to-do-if-linux-crash/">Linux 死机了该怎么办？</a>我却自己遇到了一次真正的，无法处理的死机……</p>
<p>无图无真相，以下是我的 Tattoo 拍摄下的死机后的屏幕显示，那些是 Linux 在死机前垂死挣扎输出的信息：<a href="http://blog.upsuper.org/wp-content/uploads/2009/11/IMAG0008.jpg"><img src="http://blog.upsuper.org/wp-content/uploads/2009/11/IMAG0008-300x225.jpg" alt="IMAG0008" title="IMAG0008" width="300" height="225" class="alignnone size-medium wp-image-924" /></a><br />
<span id="more-922"></span><br />
下面描述一下如何变成这样的……</p>
<p>首先肯定是 Ubuntu 9.10 的 bug，我关机时会卡死在 Unmounting temporary filesystems&#8230; 这里，似乎是因为 Ubuntu 9.10 对移动硬盘支持有问题的一个 bug……过了很久，系统提示 unmount 的过程超过了 120s，然后什么什么的记不清了……接着就卡死在那儿了。根据经验，这个时候可以用 SysRq 强制安全重启，我就按住 Alt+Sys Rq，这时似乎是碰到了 Win 键，这时突然屏幕上冒出大量信息，最后死机，变成上面状态……</p>
<p>就是这样……</p>
<p>囧啊……Linux 也能死机……我的 rp 啊……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/it-is-possible-for-linux-to-die/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>初探百度Hi直接打开IE的问题</title>
		<link>http://blog.upsuper.org/explore-baidu-hi-open-ie-directly/</link>
		<comments>http://blog.upsuper.org/explore-baidu-hi-open-ie-directly/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 02:43:38 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[eXeScope]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[百度Hi]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=817</guid>
		<description><![CDATA[据部分人称，百度Hi打开网页都是直接使用IE而非默认浏览器，当然我这里做不了实验……Javran 以为是因为他用的 Chrome 是百度竞争对手开发的而不支持，便托他在百度里面工作的朋友去问了下开发者，结果据说开发者说是直接调用 iexplore.exe 打开网页的 _-b 今天高中时候的贴吧上有一个人在试用了 Chrome 后称“现在终于发现IE有多么LJ了”，然后就提出了同样的问题。于是我就稍微研究了一下~ 拿 eXeScope 打开 BaiduHi.exe 文件（eXeScope 是可以完美 wine 出来的~），没有发现与 iexplore.exe 有关的字符串，有点失望。再看看目录里面如此多的 dll 文件，用 eXeScope 一个一个开过去，发现对于那里的 dll 文件 eXeScope 似乎只能看到版本信息……然后突然想到，我们可以直接去找文件中有没有 iexplore.exe 这个字符串~因为在 Linux 下，这一工作变得格外简单： 1 find -type f -print0 &#124; xargs -0 grep --binary-files=binary -l iexplore.exe 一条命令便足矣，对 Bash 稍有了解的人一定能完全理解这句话的含义~ 下面它输出了两个文件：ImEngine.dll 和 Basement.dll。用 IE 打开很可能就固化在这两个文件里面！用 MadEdit 打开这两个文件，果真发现了 iexplorer.exe。不过不敢乱改，改了也没法实验（印象中百度Hi不能被完美 [...]]]></description>
			<content:encoded><![CDATA[<p>据部分人称，百度Hi打开网页都是直接使用IE而非默认浏览器，当然我这里做不了实验……<a href="http://javran.wordpress.com.cn/">Javran</a> 以为是因为他用的 Chrome 是<a href="http://www.google.com">百度竞争对手</a>开发的而不支持，便托<a href="http://www.felix021.com/blog/">他在百度里面工作的朋友</a>去问了下开发者，结果据说开发者说是直接调用 iexplore.exe 打开网页的 _-b</p>
<p>今天高中时候的贴吧上<a href="http://tieba.baidu.com/f?kz=651151996">有一个人在试用了 Chrome 后称“现在终于发现IE有多么LJ了”</a>，然后就提出了同样的问题。于是我就稍微研究了一下~</p>
<p>拿 eXeScope 打开 BaiduHi.exe 文件（eXeScope 是可以完美 wine 出来的~），没有发现与 iexplore.exe 有关的字符串，有点失望。再看看目录里面如此多的 dll 文件，用 eXeScope 一个一个开过去，发现对于那里的 dll 文件 eXeScope 似乎只能看到版本信息……然后突然想到，我们可以直接去找文件中有没有 iexplore.exe 这个字符串~因为在 Linux 下，这一工作变得格外简单：</p>

<div class="wp_codebox"><table><tr id="p81786"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p817code86"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #660033;">-type</span> f <span style="color: #660033;">-print0</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">xargs</span> <span style="color: #660033;">-0</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">--binary-files</span>=binary <span style="color: #660033;">-l</span> iexplore.exe</pre></td></tr></table></div>

<p>一条命令便足矣，对 Bash 稍有了解的人一定能完全理解这句话的含义~</p>
<p>下面它输出了两个文件：ImEngine.dll 和 Basement.dll。用 IE 打开很可能就固化在这两个文件里面！用 MadEdit 打开这两个文件，果真发现了 iexplorer.exe。不过不敢乱改，改了也没法实验（印象中百度Hi不能被完美 wine 出来），于是接下去的实验就作罢了。</p>
<p>可是又有人报告百度Hi可以调用疼逊TT打开，我就真不知道是怎么回事了 _-b</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/explore-baidu-hi-open-ie-directly/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>关于桌面 Linux 分区的一点看法</title>
		<link>http://blog.upsuper.org/a-view-of-partition-in-linux-for-desktop/</link>
		<comments>http://blog.upsuper.org/a-view-of-partition-in-linux-for-desktop/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 14:05:52 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[分区]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=808</guid>
		<description><![CDATA[今天看了 LinuxToy 上推荐的《Arch Linux 安装指南》，看到其中关于分区的部分，我突然想写篇文章来讨论一下 Linux 中应该怎么分区、应该怎么选文件系统、应该怎么配置才会比较不错。 第一个问题是哪些东西单独分区比较好。我在 Ubuntu 的社区上看到的建议有很多种，比如最基本的把 /boot、/home 单独分出来的，也有把 /tmp、/var 或 /usr 也单独分出来的。不过根据我的观察以及设想来说，我觉得，而且我个人采用的是把 /boot、/tmp 及 /home 单独分区，为什么这样选择呢？ 首先是 /boot 区，由于装载的是启动器，一般来说比较建议单独分区，这样可以减小损坏导致完全不能启动的风险，而且由于单独分区，在磁盘上的区域较集中，对于启动效率也有一定改善吧~下面是 /tmp 区，这个区我觉得是一定要分出来的，因为这几乎是 Linux 里面操作最频繁的一个区了，各种杂七杂八的临时文件装在里面。最后是 /home 区，把这个区单独分有一个最重要的好处就是，每次重装不需要额外的备份操作，直接沿用原来的分区就可以了~此外，还有比较喜欢更多分区的人也可以考虑把 /var 也单独分出来，这个作为日志及某些服务的资料储存地的操作频繁度也是与根目录相当不同的。至于把 /usr 单独分出来，我觉得是毫无道理的……个人看法~最后，我们还有一个区，就是 swap 区，无论内存多大，都建议建一个 swap 区！ 接下来我们的问题是，每个分区该有多大？说实话，这并不是一个十分难办的问题，因为现在的 GParted 等软件能够很轻松安全的改变分区大小，如果设不好大不了花一点时间调整咯。不过还是要稍微讨论一下的。 /boot 区是一个对空间要求非常宽松的分区，一般来说可以根据自己硬盘的宽裕程度给他分 50MB-200MB 都是没什么问题的，就一堆启动文件嘛~至于 /tmp 区，据说如果要刻录 DVD，至少要给这个区留 4.2GB 以上的空间。我个人是没有 DVD 刻录机的，因此对这个不太了解，不过如果这样的话那以后刻蓝光难道要预留 25GB？我是留了 1GB 的空间，据观察利用率并不高，通常维持在 10% [...]]]></description>
			<content:encoded><![CDATA[<p>今天看了 LinuxToy 上推荐的《<a href="http://linuxtoy.org/archives/install-guide-for-arch-linux.html">Arch Linux 安装指南</a>》，看到其中关于分区的部分，我突然想写篇文章来讨论一下 Linux 中应该怎么分区、应该怎么选文件系统、应该怎么配置才会比较不错。<br />
<span id="more-808"></span><br />
第一个问题是哪些东西单独分区比较好。我在 Ubuntu 的社区上看到的建议有很多种，比如最基本的把 /boot、/home 单独分出来的，也有把 /tmp、/var 或 /usr 也单独分出来的。不过根据我的观察以及设想来说，我觉得，而且我个人采用的是把 /boot、/tmp 及 /home 单独分区，为什么这样选择呢？</p>
<p>首先是 /boot 区，由于装载的是启动器，一般来说比较建议单独分区，这样可以减小损坏导致完全不能启动的风险，而且由于单独分区，在磁盘上的区域较集中，对于启动效率也有一定改善吧~下面是 /tmp 区，这个区我觉得是一定要分出来的，因为这几乎是 Linux 里面操作最频繁的一个区了，各种杂七杂八的临时文件装在里面。最后是 /home 区，把这个区单独分有一个最重要的好处就是，每次重装不需要额外的备份操作，直接沿用原来的分区就可以了~此外，还有比较喜欢更多分区的人也可以考虑把 /var 也单独分出来，这个作为日志及某些服务的资料储存地的操作频繁度也是与根目录相当不同的。至于把 /usr 单独分出来，我觉得是毫无道理的……个人看法~最后，我们还有一个区，就是 swap 区，无论内存多大，都建议建一个 swap 区！</p>
<p>接下来我们的问题是，每个分区该有多大？说实话，这并不是一个十分难办的问题，因为现在的 GParted 等软件能够很轻松安全的改变分区大小，如果设不好大不了花一点时间调整咯。不过还是要稍微讨论一下的。</p>
<p>/boot 区是一个对空间要求非常宽松的分区，一般来说可以根据自己硬盘的宽裕程度给他分 50MB-200MB 都是没什么问题的，就一堆启动文件嘛~至于 /tmp 区，据说如果要刻录 DVD，至少要给这个区留 4.2GB 以上的空间。我个人是没有 DVD 刻录机的，因此对这个不太了解，不过如果这样的话那以后刻蓝光难道要预留 25GB？我是留了 1GB 的空间，据观察利用率并不高，通常维持在 10% 以下，但考虑到某些时候说不定会突然暴增，维持一定量给它总没什么坏处吧……然后是 swap 区，这个前人总结的很多了，这里转引一下，一般来说就是内存 1GB 以下的设为两倍内存，1GB 及以上的给个 1GB 就差不多了，当然，如果想要能够使用休眠这个功能，swap 区至少要和内存一样大，这个问题上就看个人喜好自己权衡咯。根目录依自己的情况给个 10GB、20GB 的应该是足够了，硬盘大得蛋疼的给个 50GB 我看一般来说也差不多了，我给了 20GB，安装各种软件，至今也只用了 55%。剩下的就是给 /home 目录了，各种资料尽存其中~至于部分人可能愿意分出来的 /var 区，刚刚查了一下我自己的情况，我估计要给个 1G-2G，特别是对于那些用 Debian 系却从来不清里安装包缓存的人，更要分大一点。</p>
<p>现在的问题就是，我们需要什么样的文件系统？现在主流的桌面级文件系统大概有这几个：ext3、ext4、reiserfs、jfs。其他的文件系统大体上不是淘汰过时就是支持不完善，或者难以使用。</p>
<p>这几个文件系统可谓各有千秋，首先说说 ext3，这是 Linux 中这几个文件系统经历最长时间考验的，因此应该说稳定性是很优秀的，重要的东西放在这里面自然比较安心一些，但为了能从 ext2 平稳升级，沿用了线性目录储存的方式，效率自然打了些折扣。而 ext4 刚刚进入稳定版不久，说实话，我对开源界的稳定版感觉相当不好，Ubuntu 9.04 正式版出来不到一周后我下载安装，就增加了数十个安全更新……而 ext4 亦在稳定不久后<a href="http://linuxtoy.org/archives/ext4-data-loss.html">爆出了丢失数据的 bug</a>。因此，对于 ext4 的稳定性我想还有待进一步的检验，我猜也正是这个原因 Ubuntu 9.04 最终没选择这个作为默认文件系统。但其效率确实是有提高的，我想作为一些不需要经常修改的东西存放的地方还是很好的。下面来看看 reiserfs，这是一个很优秀的文件系统，可惜作者被抓起来了……这个文件系统对于小文件的存取具有很大的优势，并且在许多测试中有不俗表现。最后是 jfs，这是一个企业级的文件系统，似乎是有很稳定的性能，不过总体性能似乎不强。</p>
<p>好了，分析完这些文件系统的特性，我们大概可以知道应该怎么做了。当然，swap 区一定要用 swap 文件系统是必然的了。我想先看看 /tmp 所在的区，我想这里面大多是小文件，而且存在时间不长，加之重启就可以消掉，对稳定性要求不高，但如果比较高效是不错的，因此我个人选择了 reiserfs。当然，有人内存够大直接把 /tmp 挂到内存里做个 tmpfs 对效率提高很有好处。然后是 /home 区，我想 ext3 作为一个成熟和稳定的文件系统，放在 /home 再合适不过了，而且 /home 区里面通常一个文件夹我们都不会存太多文件导致其效率严重下降。至于根目录，我想 ext4 和 reiserfs 应该都不是太差的选择，而 ext3 显得就不太优越了，因为根目录里面一个目录下有成百上千的文件是很常见的（如 /usr/bin、/usr/lib 之类的……），而且大多数文件是小文件，ext3 的效率实在堪忧。而相比之下，ext4 也对小文件的访问做了一些优化，而且默认开启了对树型数据结构的支持，使得其管理文件的效率也有一定的提高。至于 reiserfs 前面也说过了，显然在这里都是合适的~至于 /boot 区，我想不应该选 reiserfs 和 ext4 这样支持 extents 的文件系统，即使可以支持效率也高不了。其实我一直在想弄一个不需要载入 GRUB stage 1.5 的应该是最快的了~最后 /var 区我没有经验，就不说了……</p>
<p>最后是不是非常重要的一个问题，怎么排顺序？我们都知道在传统机械硬盘上，分区越靠前意味着寻道时间越短，也即速度越快，因此我们显然要将经常要的放前面，以提高整体效率。此外我们都知道另外一个事实，如果你的内存比较大，Linux 几乎是不使用 swap 区的。因此我一向很反对把 swap 区放在前面，取而代之我觉得应该把 /tmp 放在最前面，根目录放其次，我想内存大于 1G 的可以把 swap 扔到第三个，再大的直接扔最后一个都无所谓……这里我还基于另外一个猜想：减慢 swap 访问速度有助于在有程序异常占用内存的时候减缓其扩张进程，给我们留一点时间解决这些程序……当然，这个猜想不一定是对的哈~</p>
<p>好了，上面都是关于传统机械硬盘的，我也想谈谈固态硬盘的问题。我的上网本就是配了个 16GB SSD……</p>
<p>对于 SSD，显然应该把频繁写入的东西移走，我的基本方案就是：把 /tmp、/var/log、/var/tmp 这类文件夹直接移入内存挂载为 tmpfs，然后整个硬盘分成两个区：一个 swap，一个根目录。显然在这么小的盘里你想放什么东西几乎是不可能的，因此我挂了一个外部硬盘作为我主文件夹的一个子目录，就不把 /home 单独分出来了。而且此处使用了 ext4，因为据说 ext4 是为 SSD 优化过的。至于为什么还要给 swap，这个上面也解释过了，虽然看起来很矛盾 _-b 不过这也是没有办法的……</p>
<p>很久没写这么长的东西了……仅是小弟我的个人意见，肯定有许多不正确和不完善之处，还请各位高手多多指教。</p>
<p>参考：</p>
<ul>
<li><a href="http://www.linuxsir.org/main/?q=node/115">Linux 文件系统概述 | LinuxSir.Org</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/linux/l-jfs/">Linux日志文件系统及性能分析</a></li>
<li><a href="http://wiki.debian.org.hk/w/Filesystems_supported_by_GNU/Linux">GNU/Linux 支援的檔案系統 &#8211; OSWikiHK</a></li>
<li><a href="http://en.wikipedia.org/wiki/Ext4">ext4 &#8211; Wikipedia, the free encyclopedia</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/a-view-of-partition-in-linux-for-desktop/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linux 死机了该怎么办？</title>
		<link>http://blog.upsuper.org/what-to-do-if-linux-crash/</link>
		<comments>http://blog.upsuper.org/what-to-do-if-linux-crash/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 15:20:07 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[死机]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=788</guid>
		<description><![CDATA[Linux 会死机么？我可以很肯定地说，会！如何？很简单，我的上一篇日志就介绍了一种方法~要让 Linux 死机很容易，但难的是在死机以后如何安全的让他摆脱死机状态。 Linux 死机有很多种情况，最常见的是系统负载过高导致的。如上次介绍的 fork 炸弹就是这个原理，此外还可以运行内存耗用极大的程序（如虚拟机），也会迅速提升系统负载。由于系统负载过高导致的卡死，一定是解决的越快越好！此时必须记住的是，不能再试图依赖任何图形界面的东西，如 Gnome 的系统监视器（这是我从 Windows 遗留下来的愚昧习惯……），这只会继续加重这种卡死的局面。那怎么办？ 不要怕，Linux 最初就是不需要图形界面的，因为有一个很强大的文字界面。按 Ctrl-Alt-F1（F1-F6 一般来说都可以），然后等一会儿，就会切换到 tty，也就是所谓的文字界面。这个时候需要用用户名密码登入。注意，可能键盘输入的速度比较慢，不过应该还是可以忍受的。下面在提示符后面输入 top 回车，这时会看到一张动态的表，上面列出了耗用资源最多的进程。观察它刷新一两次，按q退出，然后输入 kill ，其中的 PID 你可以在 top 里面看到。这个时候应该会快了不少，如果你发现没有成功结束掉，就再输入 kill -KILL ，这次基本上就没问题了。 除了上面这种情况外，一些底层软件的 bug 也可能导致一些奇怪的死机问题。我某位同学近日就因为莫名其妙的死机强制重启把 ext4 的分区给伤了。（最后是 sysreccd 修复了，貌似是分区表部分损坏）据其说，死机是键鼠均无反应。一般来说，系统负载高导致的死机，在可怕键盘也会有反应，有人说如果死机到键盘无响应“负载都无限大了”，亦有人说这可能是 X Server 与驱动配合有问题导致的。不过我们考虑一下遇到这种情况怎么办？ OK，这是今天才学到的方法，叫做 reisub，这个方法可以在各种情况下安全地重启计算机。大家在键盘上找，可以找到一个叫做“Sys Rq”的键，在台机的键盘上通常与 Prt Sc 共键，在笔记本可能在其他位置，如 Delete。以台机为例，要使用这种方法需要按住 Alt-Print(Sys Rq)，然后依次按下 reisub 这几个键，按完 b 系统就会重启。 下面解释一下这个方法：其实 Sys Rq 是一种叫做系统请求的东西，按住 [...]]]></description>
			<content:encoded><![CDATA[<p>Linux 会死机么？我可以很肯定地说，会！如何？很简单，<a href="http://blog.upsuper.org/fork-bomb/">我的上一篇日志</a>就介绍了一种方法~要让 Linux 死机很容易，但难的是在死机以后如何安全的让他摆脱死机状态。</p>
<p>Linux 死机有很多种情况，最常见的是系统负载过高导致的。如上次介绍的 fork 炸弹就是这个原理，此外还可以运行内存耗用极大的程序（如虚拟机），也会迅速提升系统负载。由于系统负载过高导致的卡死，一定是解决的越快越好！此时必须记住的是，<strong>不能再试图依赖任何图形界面的东西</strong>，如 Gnome 的系统监视器（这是我从 Windows 遗留下来的愚昧习惯……），这只会继续加重这种卡死的局面。那怎么办？<br />
<span id="more-788"></span><br />
不要怕，Linux 最初就是不需要图形界面的，因为有一个很强大的文字界面。按 Ctrl-Alt-F1（F1-F6 一般来说都可以），然后等一会儿，就会切换到 tty，也就是所谓的文字界面。这个时候需要用用户名密码登入。注意，可能键盘输入的速度比较慢，不过应该还是可以忍受的。下面在提示符后面输入 top 回车，这时会看到一张动态的表，上面列出了耗用资源最多的进程。观察它刷新一两次，按q退出，然后输入 kill <PID>，其中的 PID 你可以在 top 里面看到。这个时候应该会快了不少，如果你发现没有成功结束掉，就再输入 kill -KILL <PID>，这次基本上就没问题了。</p>
<p>除了上面这种情况外，一些底层软件的 bug 也可能导致一些奇怪的死机问题。我某位同学近日就因为莫名其妙的死机强制重启把 ext4 的分区给伤了。（最后是 sysreccd 修复了，貌似是分区表部分损坏）据其说，死机是键鼠均无反应。一般来说，系统负载高导致的死机，在可怕键盘也会有反应，有人说如果死机到键盘无响应“负载都无限大了”，亦有人说这可能是 X Server 与驱动配合有问题导致的。不过我们考虑一下遇到这种情况怎么办？</p>
<p>OK，这是今天才学到的方法，叫做 reisub，这个方法可以在各种情况下安全地重启计算机。大家在键盘上找，可以找到一个叫做“Sys Rq”的键，在台机的键盘上通常与 Prt Sc 共键，在笔记本可能在其他位置，如 Delete。以台机为例，要使用这种方法需要<em>按住</em> Alt-Print(Sys Rq)，然后依次按下 reisub 这几个键，按完 b 系统就会重启。</p>
<p>下面解释一下这个方法：其实 Sys Rq 是一种叫做系统请求的东西，按住 Alt-Print 的时候就相当于按住了 Sys Rq 键，这个时候输入的一切都会直接由 Linux 内核来处理，它可以进行许多低级操作。这个时候 reisub 中的每一个字母都是一个独立操作，他们分别表示：</p>
<pre>
un<strong>R</strong>aw      将键盘控制从 X Server 那里抢回来
 t<strong>E</strong>rminate 给所有进程发送 SIGTERM 信号，让他们自己解决善后
 k<strong>I</strong>ll      给所有进程发送 SIGKILL 信号，强制他们马上关闭
  <strong>S</strong>ync     将所有数据同步至磁盘
  <strong>U</strong>nmount  将所有分区挂载为只读模式
re<strong>B</strong>oot     重启
</pre>
<p>这6个字母的顺序是不可以记错的。那怎么记呢？这里提供一个个人认为比较好的方法：单词 busier（busy 的比较级，更忙）倒过来就是了。</p>
<p>基本上就这样了，Linux 的死机本来就不多见，现在见了也可以安全解决，多好~</p>
<p>参考资料：<br />
<a href="http://en.wikipedia.org/wiki/Magic_SysRq_key">Magic SysRq key &#8211; Wikipedia, the free encyclopedia</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/what-to-do-if-linux-crash/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>fork 炸弹</title>
		<link>http://blog.upsuper.org/fork-bomb/</link>
		<comments>http://blog.upsuper.org/fork-bomb/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 04:16:44 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[嘻嘻哈哈]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[炸弹]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=784</guid>
		<description><![CDATA[Linux 的 fork 创建子进程的机制非常著名了，是一个很优美的方式。可是，这个东西是很可怕的。 记得曾经看到一个在 shell 上运行的 fork 炸弹： （严重警告不要在任何 Linux 或 UNIX 的 Shell 上实验这条命令……） 1 :&#40;&#41;&#123;:&#124;:&#38;&#125;;: 这次我用 C 写了个想试验一下资源限制是否传递到子进程，就有了下面程序： 1 2 3 4 5 6 7 8 9 10 11 12 13 #include &#60;stdio.h&#62; #include &#60;unistd.h&#62; #include &#60;sys/resource.h&#62; &#160; int main&#40;void&#41; &#123; struct rlimit rtime; rtime.rlim_cur = rtime.rlim_max = 1; setrlimit&#40;RLIMIT_CPU, &#38;rtime&#41;; while [...]]]></description>
			<content:encoded><![CDATA[<p>Linux 的 fork 创建子进程的机制非常著名了，是一个很优美的方式。可是，这个东西是很可怕的。</p>
<p>记得<a href="http://cocre.com/?p=23">曾经看到</a>一个在 shell 上运行的 fork 炸弹：<br />
（严重警告不要在任何 Linux 或 UNIX 的 Shell 上实验这条命令……）</p>

<div class="wp_codebox"><table><tr id="p78490"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p784code90"><pre class="bash" style="font-family:monospace;">:<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>:<span style="color: #000000; font-weight: bold;">|</span>:<span style="color: #000000; font-weight: bold;">&amp;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span>;:</pre></td></tr></table></div>

<p>这次我用 C 写了个想试验一下资源限制是否传递到子进程，就有了下面程序：</p>

<div class="wp_codebox"><table><tr id="p78491"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p784code91"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/resource.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">struct</span> rlimit rtime<span style="color: #339933;">;</span>
  rtime.<span style="color: #202020;">rlim_cur</span> <span style="color: #339933;">=</span> rtime.<span style="color: #202020;">rlim_max</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  setrlimit<span style="color: #009900;">&#40;</span>RLIMIT_CPU<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>rtime<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>当然，这个程序其实运行了最多卡一会儿（我差点以为被炸死了……），最后系统还是及时结束了这个疯狂的过程，此时查看系统负载，5分钟内负载高达227.x！</p>
<p>如果你想实现上面一行 shell 的功能（即直接拯救一切的那种……），只要下面代码就够了：</p>

<div class="wp_codebox"><table><tr id="p78492"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p784code92"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/fork-bomb/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ujudger 0.1 发布</title>
		<link>http://blog.upsuper.org/ujudger-0-1-release/</link>
		<comments>http://blog.upsuper.org/ujudger-0-1-release/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 02:54:48 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[Cena]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OI]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ujudger]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=781</guid>
		<description><![CDATA[曾经的曾经，很早很早以前，我发布了一个叫 ujudger-base 0.1 的东西，是用 C++ 写成的简单测评程序，仅能测试程序运行时间和内存耗用（还不准确）。 这次发布的是一个完整的测评机，支持传统题型、交互题和提交答案题，可导出测评结果。整个程序使用 Python 编写，直接把 ujudger.py 复制到待测目录下并编写 config 文件即可测评。 不过现在这个程序只有一个文字界面，非常简陋，而且安全性不佳。但现在正在撰写的 ujudger 1.0 (版本跨越大，意味着变化之巨大……) 将就这些问题有重大改进，敬请期待。 另外，有人询问是否准备让这个测评机与另一个 Windows 下的开源测评机 Cena 兼容。我的回答是，由于设计差异，可能比较困难。对比 Cena 的自定义校验器，ujudger 的自定义校验器更强大，同时 Cena 的校验器可以通过一点简单的修改或加一个脚本外壳就可以在 ujudger 中使用。在 1.0 中计划兼容 Cena 的校验器。至于配置文件，1.0 中配置文件的格式会有较大变动，不过可能可以通过转换程序将 Cena 的配置文件转为 ujudger 的。 我在 Google Code 上开了一个项目，感兴趣的同学可以关注关注~地址：http://ujudger.googlecode.com/ 最后，ujudger 0.1 的下载地址也在 Google Code 上：ujudger.py]]></description>
			<content:encoded><![CDATA[<p>曾经的曾经，很早很早以前，<a href="http://blog.upsuper.org/ujudger-base-0-1-released/">我发布了一个叫 ujudger-base 0.1 的东西</a>，是用 C++ 写成的简单测评程序，仅能测试程序运行时间和内存耗用（还不准确）。</p>
<p>这次发布的是一个完整的测评机，支持传统题型、交互题和提交答案题，可导出测评结果。整个程序使用 Python 编写，直接把 ujudger.py 复制到待测目录下并编写 config 文件即可测评。</p>
<p>不过现在这个程序只有一个文字界面，非常简陋，而且安全性不佳。但现在正在撰写的 ujudger 1.0 (版本跨越大，意味着变化之巨大……) 将就这些问题有重大改进，敬请期待。</p>
<p>另外，有人询问是否准备让这个测评机与另一个 Windows 下的开源测评机 Cena 兼容。我的回答是，由于设计差异，可能比较困难。对比 Cena 的自定义校验器，ujudger 的自定义校验器更强大，同时 Cena 的校验器可以通过一点简单的修改或加一个脚本外壳就可以在 ujudger 中使用。在 1.0 中计划兼容 Cena 的校验器。至于配置文件，1.0 中配置文件的格式会有较大变动，不过可能可以通过转换程序将 Cena 的配置文件转为 ujudger 的。</p>
<p>我在 Google Code 上开了一个项目，感兴趣的同学可以关注关注~地址：<a href="http://ujudger.googlecode.com/">http://ujudger.googlecode.com/</a></p>
<p>最后，ujudger 0.1 的下载地址也在 Google Code 上：<a href="http://ujudger.googlecode.com/files/ujudger.py">ujudger.py</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/ujudger-0-1-release/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>探秘 Linux 权限控制</title>
		<link>http://blog.upsuper.org/explore-access-control-of-linux/</link>
		<comments>http://blog.upsuper.org/explore-access-control-of-linux/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 08:09:37 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[安全]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=778</guid>
		<description><![CDATA[众所周知，Linux 的权限控制虽然很简单，但却十分严格和有效的。（和 Windows 复杂却没用的权限控制形成鲜明对比……）由于最近编写测评机，希望利用 Linux 的高安全性做运行级恶意代码防护，因此就顺带地研究了一下 Linux 的权限控制。经过这次探秘，我对 Linux 的权限有了更新的认识，确实是一个很强大的东西啊！ 由于本人的能力有限，文章中的不足和谬误也请大家多多指教！ 我想，稍微接触过一段时间 Linux 的人都会对 Linux 的权限有些许了解，其中最重要的莫过于——很多命令需要加 sudo 才能运行，而且我们也知道，sudo 几乎无所不能——不能删的就 sudo rm、不能复制 sudo cp、不能移动 sudo mv……（目前我仅发现在部分虚拟文件系统中 sudo 也没有权限做这些事情……）那么，sudo 究竟是何方神圣，Linux 又是如何确定这些权限的呢？ 说到 Linux 下的权限，一定要先说的是 Linux 下文件权限的控制。在 Linux 下，每个文件都有“所有者”和“所在组”这两个基本属性，而各种权限也是根据所有者、所在组和其他人划分的。每个文件的权限，最简单的情况下可以表示为一个3位八进制数，每一位八进制数表示一系列人的权限，如八进制数751就标示所有者有7的权限，所在组的其他人有5的权限，而既不是所有者也不在所在组的人只有1的权限。至于一位的八进制数表示的意义，我们应该将其进一步转换为3位二进制数，如7对应111，5对应101，1对应001。在这个二进制数上最高位如果为1则表示有读权限，第二位表示写权限，而最后一位表示执行权限。（说到这里我就想再插一句了，Linux 的文件是什么类型或可不可以执行，几乎完全不是根据扩展名，只有有执行权限的文件才能执行，而文件类型也是根据 MIME Type 来决定的。） 由于 Linux 里面大量的东西都可以转化为文件操作，因此这一简洁明了的设计解决了大多数权限控制的问题。不过文件归文件，那文件夹呢？文件夹应该说也是一类特殊的文件，因此也有权限控制。可对于文件夹，什么样叫“可读”，什么样叫“可写”？最奇怪的是，“可执行”？对于文件夹来说，可读就是可以列举文件列表，也就是 Linux 下的 ls 命令可以列出东西；可写就是可以在文件夹中创建文件（或许有人会问，为什么不是文件夹中文件可写？想一想~）；可执行是比较奇怪的……就是将这个文件夹当作当前文件夹的权限，在 Linux 命令中表现为 cd 是否可以使用。 好了，说完文件们，再来看看进程们。 进程的权限控制就更简单了，说白了就一句话：一个进程不能控制与其不是同一个用户下运行的进程，除非被控制的是它的子进程。事实上，一个进程有至少两个 UID 和 [...]]]></description>
			<content:encoded><![CDATA[<p>众所周知，Linux 的权限控制虽然很简单，但却十分严格和有效的。（和 Windows 复杂却没用的权限控制形成鲜明对比……）由于最近编写测评机，希望利用 Linux 的高安全性做运行级恶意代码防护，因此就顺带地研究了一下 Linux 的权限控制。经过这次探秘，我对 Linux 的权限有了更新的认识，确实是一个很强大的东西啊！</p>
<p>由于本人的能力有限，文章中的不足和谬误也请大家多多指教！<br />
<span id="more-778"></span><br />
我想，稍微接触过一段时间 Linux 的人都会对 Linux 的权限有些许了解，其中最重要的莫过于——很多命令需要加 sudo 才能运行，而且我们也知道，sudo 几乎无所不能——不能删的就 sudo rm、不能复制 sudo cp、不能移动 sudo mv……（目前我仅发现在部分虚拟文件系统中 sudo 也没有权限做这些事情……）那么，sudo 究竟是何方神圣，Linux 又是如何确定这些权限的呢？</p>
<p>说到 Linux 下的权限，一定要先说的是 Linux 下文件权限的控制。在 Linux 下，每个文件都有“所有者”和“所在组”这两个基本属性，而各种权限也是根据所有者、所在组和其他人划分的。每个文件的权限，最简单的情况下可以表示为一个3位八进制数，每一位八进制数表示一系列人的权限，如八进制数751就标示所有者有7的权限，所在组的其他人有5的权限，而既不是所有者也不在所在组的人只有1的权限。至于一位的八进制数表示的意义，我们应该将其进一步转换为3位二进制数，如7对应111，5对应101，1对应001。在这个二进制数上最高位如果为1则表示有读权限，第二位表示写权限，而最后一位表示执行权限。（说到这里我就想再插一句了，Linux 的文件是什么类型或可不可以执行，几乎完全不是根据扩展名，只有有执行权限的文件才能执行，而文件类型也是根据 MIME Type 来决定的。）</p>
<p>由于 Linux 里面大量的东西都可以转化为文件操作，因此这一简洁明了的设计解决了大多数权限控制的问题。不过文件归文件，那文件夹呢？文件夹应该说也是一类特殊的文件，因此也有权限控制。可对于文件夹，什么样叫“可读”，什么样叫“可写”？最奇怪的是，“可执行”？对于文件夹来说，可读就是可以列举文件列表，也就是 Linux 下的 ls 命令可以列出东西；可写就是可以在文件夹中创建文件（或许有人会问，为什么不是文件夹中文件可写？想一想~）；可执行是比较奇怪的……就是将这个文件夹当作当前文件夹的权限，在 Linux 命令中表现为 cd 是否可以使用。</p>
<p>好了，说完文件们，再来看看进程们。</p>
<p>进程的权限控制就更简单了，说白了就一句话：一个进程不能控制与其不是同一个用户下运行的进程，除非被控制的是它的子进程。事实上，一个进程有至少两个 UID 和 GID，它们分别是 EUID、RUID 和 EGID、RGID，其中，E 表示 effective，即所有权限控制参考的是 EUID 和 EGID，进程创建的文件的所有者和所在组也是 EUID 和 EGID 表示的用户和组。那么有人就问，R- 的那两个又是拿来干什么的呢？打酱油？非也，R 表示 real，即运行者的信息。其实一个进程可以改变自己这些 UID 和 GID，而 E- 可以修改为的值为其本身和对应的 R- 的值。不过一个程序在加载的时候 E- 和 R- 的值似乎都根据运行者的信息设置了相同的值，看起来好像没什么用，是吗？我们这里暂且不管他。</p>
<p>下面我们深入一步，看看进程调度中的 nice 值和进程的资源限制。不知道大家有没有用系统监视器调整过进程的 nice 值，nice 值是 Linux 核心调度进程的一个参考值，nice 值越高表示这个进程越不重要，优先级越低，越可以慢慢来；nice 值越低表示这个进程越重要，越要快些做。调过 nice 的人就知道，将可以控制的某个进程的 nice 值调高（优先级降低）是随便做的，但要把一个进程的 nice 值调低（提高优先级）却要输入密码（进入 root）。做过一些 Linux 相关的编程的人也应该知道，调紧一个可控进程的资源限制是可以随意调的，但调宽松也要由 root 来进行。</p>
<p>啊，root 出现了！root 是什么？root 对于 Linux 来说就是神。为什么这么说？你上面看到的所有权限控制，在 root 面前都是没用的，root 在 Linux 里可以为所欲为。是的，root 是一个完全不受权限限制的用户，这就是它可怕的地方。比如，我们在前面看到进程只能将 EUID 调整为 EUID 或 RUID，但如果 EUID 为 0（即为 root），这个进程将可以把 EUID 和 RUID 调整为任意值；同样的，这个进程将可以把 EGID 和 RGID 调整为任意值。</p>
<p>我们知道 Linux 内核加载的时候开始执行的进程 init 是以 root 运行的，而后 init 加载各个启动脚本，把各项服务封入单独的用户运作，最后根据登入信息加载用户进程。这整个过程中，只有由上而下，由 root 到普通用户的过程。理由就是 root 可以任意调整 E- 和 R-。不过如果仅是这样，这个系统估计什么也干不了……</p>
<p>我在原来的<a href="http://blog.upsuper.org/summary-of-ujudger-base-0-1-programming/">一篇日志</a>中提到过 Linux 创建子进程和运行程序的方法——fork 和 exec* 函数：fork 运行成功返回两次，一次在生成的子进程中返回0，另一次在调用的父进程中返回子进程的 pid。此时，子进程迅速继承了父进程的所有权限、变量等等等等。（Linux 的子进程采用 copy-on-write 技术分享父进程的内存）而我们前面又知道，一个进程只能让自己从 root 到普通用户，优先级从高到低，资源限制从宽到严，就像水只能从高流向低一样。但，人是往高出走的，有时我们需要 root 的权限，问：路在何方？</p>
<p>就在这时候，sudo 出现了！sudo 在 Linux 中可为无人不知无人不晓。对于 sudo 来说，只要你这个用户在 sudoer 的列表中，输入你的密码就可以让你成为 root 了，或者你输入其他用户的密码可以让你使用其他用户。可是，我们前面刚刚说过，进程只能让自己从 root 变成普通用户，那这 sudo 又是哪冒出来的呢？</p>
<p>这又要回到文件权限设置了。其实，文件权限实际上有4位八进制数。我们原来说的是3位，那还有一位是什么呢？那一位对应的3个二进制位又是三个开关，分别标示 SUID、SGID 和粘着位。SUID 是什么？它表示 saved set-user-ID，设置了它的程序在运行时有了新的选择——程序所有者的权限！也就是说，EUID 的取值在 EUID、RUID 之外多了一个选择——SUID。事实上，有设置 SUID 的程序在执行时都会自动将 EUID 设置为 SUID，这时 EUID 和 RUID 就不再是同一个值了，我们前面又知道，只要 EUID 为0这个程序就无敌了。这个过程在 fork 中无法完成，我猜想是在 exec* 函数的调用过程中进行的。我们看到，sudo 这个程序的所有者是 root，而又有设置 SUID，这表示，我们一运行 sudo，它就以 root 在运行了！很神奇不是么？通过 SUID 这种特别的机制，原来许多不可能的事成为了可能。SGID 表示的含义亦是类似的；而至于粘着位表示这个文件对于任何人都可写，但只有所有者能删除。</p>
<p>到这里，我把 Linux 基本的权限控制机制都说了一番。当然，为了更精确地进行权限控制，Linux 内核还引入了 Linux 安全模块，并可以加入 SELinux 和 AppArmor 等增强的安全机制，这让 Linux 更加安全和坚不可摧。（Windows 的权限控制在这些面前简直就是幼稚园小孩在大学教授面前……）这些我就不细致展开了，更多的信息网上很容易找到。</p>
<p>参考资料：</p>
<ul>
<li><a href="http://linuxtoy.org/docs/guide/ch17s08.html">权限管理 &#8211; 开源世界旅行手册</a></li>
<li><a href="http://www.cndw.com/tech/server/2006040430540.asp">Solaris下究竟如何使用setuid/seteuid/setreuid</a></li>
<li><a href="http://lxr.linux.no/">the Linux Cross Reference</a></li>
<li><a href="http://tech.ccidnet.com/art/741/20090623/1806969_1.html">Linux系统进程的几个用户ID及其转换方法</a></li>
<li><a href="http://idcnews.net/html/edu/20070101/291393.html">用户信息 /etc/passwd，getuid(), getpwuid()</a></li>
<li><a href="http://hi.baidu.com/phps/blog/item/7e3ba44410cf9580b3b7dc81.html">C语言系统资源控制（getrlimit &#038;&#038; setrlimit)</a></li>
<li><a href="http://bytes.com/groups/python/36126-permission-problem-os-setuid">permission problem with os.setuid</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/explore-access-control-of-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu之旅（十一）——探索VIM</title>
		<link>http://blog.upsuper.org/ubuntu-trip-11-explore-vim/</link>
		<comments>http://blog.upsuper.org/ubuntu-trip-11-explore-vim/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 10:37:50 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=772</guid>
		<description><![CDATA[很久没写日志了，前段时间本来想写一个安装 CoreAVC for Linux 的，结果它未能成功拯救我的福音战士新剧场版1080P，于是就放下了…… 这次由于对 Scribes 测试版 bug 重重的不满和随时可能丢失修改的担忧，在看了一部分《开源世界旅行手册》后，毅然决定试一试传说中的 vim。 vim 在传说中是强大的，不过说起来也还是不那么容易入门的。查了很多关于 vim 配置和操作的文章。在操作方面，vim 自带的指导、开源世界旅行手册中的相关章节和 LinuxToy 上的《高效率编辑器 VIM》让我受益匪浅。vim 自带的指导只要在终端里输入 vimtutor 就可以了，一边看着指导一边操作，学得还是挺快的，只不过指导只有繁体中文，看了不大舒服，幸好还都看懂了…… 至于配置，也看了不少地方，现在的配置文件大概是这样的： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 filetype indent on set nocompatible set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 syntax on colorscheme freya set [...]]]></description>
			<content:encoded><![CDATA[<p>很久没写日志了，前段时间本来想写一个安装 CoreAVC for Linux 的，结果它未能成功拯救我的福音战士新剧场版1080P，于是就放下了……</p>
<p>这次由于对 Scribes 测试版 bug 重重的不满和随时可能丢失修改的担忧，在看了一部分《<a href="http://linuxtoy.org/docs/guide/">开源世界旅行手册</a>》后，毅然决定试一试传说中的 vim。<br />
<span id="more-772"></span><br />
vim 在传说中是强大的，不过说起来也还是不那么容易入门的。查了很多关于 vim 配置和操作的文章。在操作方面，vim 自带的指导、开源世界旅行手册中的<a href="http://linuxtoy.org/docs/guide/ch24.html">相关章节</a>和 <a href="http://linuxtoy.org">LinuxToy</a> 上的《<a href="http://linuxtoy.org/archives/efficient-editing-with-vim.html">高效率编辑器 VIM</a>》让我受益匪浅。vim 自带的指导只要在终端里输入 vimtutor 就可以了，一边看着指导一边操作，学得还是挺快的，只不过指导只有繁体中文，看了不大舒服，幸好还都看懂了……</p>
<p>至于配置，也看了不少地方，现在的配置文件大概是这样的：</p>

<div class="wp_codebox"><table><tr id="p77294"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p772code94"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">filetype</span> <span style="color: #25BB4D;">indent</span> <span style="color: #25BB4D;">on</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">nocompatible</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">fileencodings</span>=utf<span style="color: #000000;">-</span><span style="color: #000000; font-weight:bold;">8</span>,ucs<span style="color: #000000;">-</span>bom,gb18030,gbk,gb2312,cp936
<span style="color: #804040;">syntax</span> <span style="color: #25BB4D;">on</span>
<span style="color: #804040;">colorscheme</span> freya
<span style="color: #804040;">set</span> <span style="color: #668080;">shortmess</span>=atI
<span style="color: #804040;">set</span> <span style="color: #668080;">autoindent</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">complete</span>=<span style="color: #000000;">.</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">smartindent</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">smarttab</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">expandtab</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">tabstop</span>=<span style="color: #000000; font-weight:bold;">2</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">softtabstop</span>=<span style="color: #000000; font-weight:bold;">2</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">shiftwidth</span>=<span style="color: #000000; font-weight:bold;">2</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">foldmethod</span>=<span style="color: #25BB4D;">indent</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">number</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">ambiwidth</span>=double
&nbsp;
nmap <span style="color: #668080;">&lt;F2&gt;</span> <span style="color: #000000;">:</span>tabprevious<span style="color: #000000;">&lt;</span>CR<span style="color: #000000;">&gt;</span>
nmap <span style="color: #668080;">&lt;F3&gt;</span> <span style="color: #000000;">:</span>tabnext<span style="color: #000000;">&lt;</span>CR<span style="color: #000000;">&gt;</span></pre></td></tr></table></div>

<p>其实到处都有很多 vim 的配置文件，我现在这个还算很短的，而且很简陋的，估计还会不断增加，暂且放在这里做一个纪念吧，看看以后会到怎样的境界……</p>
<p>现在用 vim 慢慢适应了不用方向键的操作了，不过不知道到底是好是坏呢……只能慢慢适应咯</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/ubuntu-trip-11-explore-vim/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>我的 lab2（一）——Windows 下的 Linux</title>
		<link>http://blog.upsuper.org/my-lab2-1-linux-under-windows/</link>
		<comments>http://blog.upsuper.org/my-lab2-1-linux-under-windows/#comments</comments>
		<pubDate>Thu, 14 May 2009 07:02:18 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[虚拟机]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=755</guid>
		<description><![CDATA[在开源界，总是有很多不可思议的东西，在没有虚拟化技术的机子中的 Windows 下跑 Linux 可以以 Native 的速度似乎很早就已经成功了。使用的是一个叫做 coLinux 的程序，它将整个 Linux 系统当做 Windows 的一个进程，其高得惊人的执行效率伴随着是相当小的资源占用。 前面其实用过 coLinux，当时使用了官方网站上提供的 Debian 镜像，可以直接使用。但这次由于某些原因，不得不使用 Ubuntu，于是就用前一段载的 DVD 安装了一个。虽然只装了基本系统，过程还是相当艰难的…… 对于没用过 coLinux 的，首先要到 SourceForge.net 上下载 coLinux-stable 和下面任意一个制作好的硬盘镜像。这些镜像除了预装系统不同外，其大小也不同，ArchLinux 的是 256MB，Debian 是 1GB，Ubuntu 是 2GB。如果空间充裕建议下 Ubuntu 版的吧，这样以后可以做的事情比较多~ 接下去安装什么的都很简单了，下载的 coLinux 安装程序按照过程安好，然后把刚才载的镜像解压到安装文件夹。你还可以在这里根据你想要的大小下载一个 Swap 的镜像，同样放到那个目录。 其实编辑一下 example.conf，把对应的文件名填上就可以打开了。不过这样不好玩，不是么？ 现在准备好 Ubuntu 9.04 DVD 的 ISO 镜像，新建一个文件叫做 ubuntu.conf，然后从 ISO 当中的 install 目录提取出 initrd.gz，备份安装文件夹中的同名文件备用。接下来新建一个文件叫做 [...]]]></description>
			<content:encoded><![CDATA[<p>在开源界，总是有很多不可思议的东西，在没有虚拟化技术的机子中的 Windows 下跑 Linux 可以以 Native 的速度似乎很早就已经成功了。使用的是一个叫做 coLinux 的程序，它将整个 Linux 系统当做 Windows 的一个进程，其高得惊人的执行效率伴随着是相当小的资源占用。<br />
<span id="more-755"></span><br />
前面其实用过 coLinux，当时使用了官方网站上提供的 Debian 镜像，可以直接使用。但这次由于某些原因，不得不使用 Ubuntu，于是就用前一段载的 DVD 安装了一个。虽然只装了基本系统，过程还是相当艰难的……</p>
<p>对于没用过 coLinux 的，首先要到 <a href="http://sourceforge.net/project/showfiles.php?group_id=98788">SourceForge.net</a> 上下载 coLinux-stable 和下面任意一个制作好的硬盘镜像。这些镜像除了预装系统不同外，其大小也不同，ArchLinux 的是 256MB，Debian 是 1GB，Ubuntu 是 2GB。如果空间充裕建议下 Ubuntu 版的吧，这样以后可以做的事情比较多~</p>
<p>接下去安装什么的都很简单了，下载的 coLinux 安装程序按照过程安好，然后把刚才载的镜像解压到安装文件夹。你还可以在<a href="http://gniarf.nerim.net/colinux/swap/">这里</a>根据你想要的大小下载一个 Swap 的镜像，同样放到那个目录。</p>
<p>其实编辑一下 example.conf，把对应的文件名填上就可以打开了。不过这样不好玩，不是么？</p>
<p>现在准备好 Ubuntu 9.04 DVD 的 ISO 镜像，新建一个文件叫做 ubuntu.conf，然后从 ISO 当中的 install 目录提取出 initrd.gz，备份安装文件夹中的同名文件备用。接下来新建一个文件叫做 ubuntu.conf，内容按照如下模版填写：</p>

<div class="wp_codebox"><table><tr id="p755104"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p755code104"><pre class="text" style="font-family:monospace;"># c:\coLinux 换成你的安装目录
kernel=&quot;c:\coLinux\vmlinux&quot;
# 这里写上你下载的镜像的文件名
cobd0=&quot;ubuntu.ext3.1gb&quot;
# 这是 swap 区的镜像的文件名，没有就可以不写了
cobd1=&quot;swap_256Mb&quot;
# 这个是 DVD 镜像的位置
cobd2=&quot;d:\share\ubuntu-9.04-dvd-i386.iso&quot;
# 以光盘启动
root=/dev/cobd2
ro
initrd=&quot;initrd.gz&quot;
#内存大小，单位 MB，如果内存大的可以适量加大，我这里总物理内存只有 256，所以才给这么些
mem=64
# 安装之前先不要启用网络，否则就后果自负了……
#eth0=pcap-bridge, &quot;colinux&quot;</pre></td></tr></table></div>

<p>接下去执行 colinux-daemon.exe @ubuntu.conf，进入安装。</p>
<p>由于 Ubuntu 的安装程序不能正确格式化磁盘，因此我们要先帮它格式化好。先点 Alt+F2 进入控制台，输入下面命令预格式化：</p>

<div class="wp_codebox"><table><tr id="p755105"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p755code105"><pre class="bash" style="font-family:monospace;">mke2fs <span style="color: #660033;">-j</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>cobd0
mkswap <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>cobd1</pre></td></tr></table></div>

<p>重启在此进入安装，此时根据提示安装即可。但有几个地方需要注意，一是可能遇到说找不到光驱，此时选择不加载外部驱动，手动指定，然后输入 /dev/cobd2 加载 DVD 镜像；问是否不加载内核模块而继续时选是；在划分磁盘时选择手动，将刚刚格式化过的 /dev/cobd0 选择使用为 ext3，保留数据挂载为 /。安装的时候最好什么额外的包都不要选，特别是 Desktop 那些，先安个基本系统就好了。最后，不要安装 grub 和 lilo，装了也会出错……所以就直接忽略就好了。</p>
<p>安装过程可能持续相当的时间，如果刚才不禁掉网络可能就跟囧了……</p>
<p>安装好以在 Monitor 菜单中选择 Power off 关机。编辑 ubuntu.conf，将 root=/dev/cobd2 修改为 root=/dev/cobd0，去掉 eth0=pcap-bridge, “colinux” 前的注释符，并把刚才备份的 initrd.gz 覆盖从 ISO 中提取出来的文件。在此执行 colinux-daemon.exe @ubuntu.conf，至此就进入了 Ubuntu 9.04。</p>
<p>登入，下面先设置更新源。我发现，如果设置了 DVD 作为更新源，绝大多数常用的软件包都不需要上网下载。现在我们知道，DVD 已经被在 /dev/cobd2 上了。现在，执行下面命令，添加 DVD 源：</p>

<div class="wp_codebox"><table><tr id="p755106"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p755code106"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>cobd2 <span style="color: #000000; font-weight: bold;">/</span>cdrom
<span style="color: #c20cb9; font-weight: bold;">sudo</span> apt-cdrom add</pre></td></tr></table></div>

<p>然后就 sudo apt-get update 一下就可以用了~</p>
<p>因为我个人习惯于是用 vim 而非 nano，因此我必经这步安装了个 vim，然后开始编辑网络。</p>

<div class="wp_codebox"><table><tr id="p755107"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p755code107"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">vim</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>network<span style="color: #000000; font-weight: bold;">/</span>interfaces</pre></td></tr></table></div>

<p>在其中写入相关的网络配置：</p>

<div class="wp_codebox"><table><tr id="p755108"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p755code108"><pre class="text" style="font-family:monospace;">auto eth0
iface eth0 inet static
	address IP地址
	netmask 255.255.255.0
	gateway 网关</pre></td></tr></table></div>

<p>由于我们选择了桥接模式，现在这个虚拟机和你的宿主机在网络上是平级的，因此可根据自己的网络配置设置。如果有需要设置 DNS 服务器的话，应该新建 /etc/resolv.conf，并按照下面格式添加 DNS 服务器：</p>

<div class="wp_codebox"><table><tr id="p755109"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p755code109"><pre class="text" style="font-family:monospace;">nameserver 218.85.157.99
nameserver 202.101.98.55</pre></td></tr></table></div>

<p>下面就运行下面的命令重开网络：</p>

<div class="wp_codebox"><table><tr id="p755110"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p755code110"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ifdown</span> eth0
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ifup</span> eth0</pre></td></tr></table></div>

<p>就可以使用了。</p>
<p>安装东西的时刻来临了！</p>
<p>不过还有一个需要的东西，就是 Xming。有了这个，你就可以实现在 Windows 下无缝使用 Linux 的界面程序了！首先要在虚拟机中安装 xterm，并在 Windows 下从<a href="http://www.straightrunning.com/XmingNotes/">这个地方</a>下载 Xming 和 Xming-fonts 并安装。</p>
<p>完成 Xming 的安装后，进入其安装目录，编辑 X0.hosts 文件，在 localhost 下面再加一行你的虚拟机的 IP 地址，最后启动 Xming。</p>
<p>在 Linux 下，你必须在输入下面命令：</p>

<div class="wp_codebox"><table><tr id="p755111"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p755code111"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">DISPLAY</span>=IP地址:<span style="color: #000000;">0</span>
xterm <span style="color: #000000; font-weight: bold;">&amp;</span></pre></td></tr></table></div>

<p>其中 IP 地址为你宿主机的 IP 地址。这时你将看到一个白色背景的终端窗口，这说明你已经成功了！现在运行任何有界面的程序，就可以在 Windows 下看到看似原生环境的界面了。</p>
<p>当然，在疯狂的安装过程中，可能会发现空间变得越来越紧张，特别是像我这样一开始选用了 1GB 的镜像来安装 Ubuntu 的人……</p>
<p>要扩大镜像文件，首先需要一个叫做 mkFile.exe 的程序，因为似乎不好找，所以就自己预编译了一个，可以点击这里下载：<a href="http://down.upsuper.org/mkFile.rar">mkFile.rar</a> (326.57KB)</p>
<p>在关闭虚拟机的情况下，执行“mkFile.exe -r -g 你的镜像文件 2”就可以将镜像文件扩大到 2GB。重新开启虚拟机，在虚拟机中执行</p>

<div class="wp_codebox"><table><tr id="p755112"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p755code112"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> resize2fs <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>cobd0</pre></td></tr></table></div>

<p>稍等片刻就完成了。</p>
<p>下面是一张我在 coLinux 中编译安装并运行出 Scribes 的截图~其实我今天做这番事最根本的动机是为了在 Windows 下看看 Scribes 的……其实还是很完美的~虽然慢了一点……<br />
<a href="http://blog.upsuper.org/wp-content/uploads/2009/05/scribes_in_colinux.png"><img src="http://blog.upsuper.org/wp-content/uploads/2009/05/scribes_in_colinux-300x225.png" alt="scribes_in_colinux" title="scribes_in_colinux" width="300" height="225" class="alignnone size-medium wp-image-757" /></a></p>
<hr />
<p>参考：<a href="http://blog.csdn.net/jnstone3/archive/2008/10/02/3010040.aspx">CoLinux入门教程</a>、<a href="http://sheng.javaeye.com/blog/360766">在coLinux上安装Ubuntu8.04</a>、<a href="http://blog.frosty-geek.net/2009/04/ext3-online-resize-with-ubuntu-810.html">ext3 online resize with Ubuntu 8.10 Intrepid</a>、<a href="http://www.oklinux.cn/html/Basic/jyjq/20081011/62040.html">将Ubuntu DVD做软件源</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/my-lab2-1-linux-under-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenGL 的小试验（三）</title>
		<link>http://blog.upsuper.org/opengl-small-test-3/</link>
		<comments>http://blog.upsuper.org/opengl-small-test-3/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 15:53:01 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=695</guid>
		<description><![CDATA[今天回家本想在我的 Ubuntu 上玩玩 OpenGL，结果花了一个下午，终于研究出些东西了…… 在 NeHe 的源代码中似乎有 Linux 的，不过一个是用 glut、一个是用 SDL、一个是用 GLX，原本看到 glut 是 OpenGL 官方的一个夸平台的简单窗口系统，结果发现全屏不能……于是就找到了 GLFW 这个东西，据说比较简单，不过还是研究了一个下午。 下面说一下研究成果吧，首先，想要用 g++ 编译用 GLFW 写的程序，一定要加这些编译参数： -lglfw -lGL -lGLU -lXrandr，特别是最后一个，是其官方参考中没有的！这个是我查了许多资料，然后瞎猜猜到的……再说说头文件，这次不需要引用3个库了，只有一个 #include &#60;GL/glfw.h&#62; 就可以了，似乎把其他的库自动引用了。另外就是，画完要用 glfwSwapBuffers(); 刷新，不然不仅什么都不会显示，而且还会死机……除此之外，还要注意那个键盘的按键，不要想当然的和 Windows 下拿去类比，根据研究发现，键盘事件交出的 key 最大可以达到 318，而且特殊键都会以这些“大值”返回，所以一定要申请好内存…… 这次主要参考了： GLFW Reference OpenGL Tutorials &#8211; Basics 以及 NeHe 的 OpenGL 教程。 这个例子是一个转动的彩色四棱锥，只有 ESC 和 F11 的键盘处理，附加帧数计算。 1 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.upsuper.org/wp-content/uploads/2009/02/screenshot-opengl-300x234.png" alt="screenshot-opengl" title="screenshot-opengl" width="300" height="234" class="alignright size-medium wp-image-696" />今天回家本想在我的 Ubuntu 上玩玩 OpenGL，结果花了一个下午，终于研究出些东西了……</p>
<p>在 NeHe 的源代码中似乎有 Linux 的，不过一个是用 glut、一个是用 SDL、一个是用 GLX，原本看到 glut 是 OpenGL 官方的一个夸平台的简单窗口系统，结果发现全屏不能……于是就找到了 GLFW 这个东西，据说比较简单，不过还是研究了一个下午。</p>
<p>下面说一下研究成果吧，首先，想要用 g++ 编译用 GLFW 写的程序，一定要加这些编译参数： -lglfw -lGL -lGLU -lXrandr，特别是最后一个，是其官方参考中没有的！这个是我查了许多资料，然后瞎猜猜到的……再说说头文件，这次不需要引用3个库了，只有一个 #include &lt;GL/glfw.h&gt; 就可以了，似乎把其他的库自动引用了。另外就是，画完要用 glfwSwapBuffers(); 刷新，不然不仅什么都不会显示，而且还会死机……除此之外，还要注意那个键盘的按键，不要想当然的和 Windows 下拿去类比，根据研究发现，键盘事件交出的 key 最大可以达到 318，而且特殊键都会以这些“大值”返回，所以一定要申请好内存……</p>
<p>这次主要参考了：<br />
<a href="http://glfw.sourceforge.net/GLFWReference26.pdf">GLFW Reference</a><br />
<a href="http://glfw.sourceforge.net/tutorials/basics.html">OpenGL Tutorials &#8211; Basics</a><br />
以及 NeHe 的 OpenGL 教程。<br />
<span id="more-695"></span><br />
这个例子是一个转动的彩色四棱锥，只有 ESC 和 F11 的键盘处理，附加帧数计算。</p>

<div class="wp_codebox"><table><tr id="p695115"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
</pre></td><td class="code" id="p695code115"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #339900;">#include &lt;unistd.h&gt;</span>
<span style="color: #339900;">#include &lt;GL/glfw.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> fullscreen<span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> active <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> keys<span style="color: #008000;">&#91;</span>GLFW_KEY_LAST<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// 为键盘按键申请空间</span>
&nbsp;
GLfloat rtri<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> initGLFW<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span>, <span style="color: #0000ff;">int</span>, <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// 帧数统计用</span>
<span style="color: #0000ff;">double</span> starttime<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> flames <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// 绘制代码</span>
<span style="color: #0000ff;">void</span> drawGLScene<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	glClear<span style="color: #008000;">&#40;</span>GL_COLOR_BUFFER_BIT <span style="color: #000040;">|</span> GL_DEPTH_BUFFER_BIT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glTranslatef<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">5.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glRotatef<span style="color: #008000;">&#40;</span>rtri, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glBegin<span style="color: #008000;">&#40;</span>GL_TRIANGLES<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #000040;">++</span>flames<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">double</span> dt <span style="color: #000080;">=</span> glfwGetTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> starttime<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dt <span style="color: #000080;">&gt;=</span> <span style="color:#800080;">5.0f</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d frames in %.1lf seconds = %.3lf FPSn&quot;</span>, flames, dt, <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>flames<span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> dt<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		flames <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		st <span style="color: #000080;">=</span> glfwGetTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	rtri <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.15f</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// 键盘处理</span>
<span style="color: #0000ff;">void</span> keyPress<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> key, <span style="color: #0000ff;">int</span> action<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	keys<span style="color: #008000;">&#91;</span>key<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> action<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>GLFW_KEY_ESC<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		active <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>GLFW_KEY_F11<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		keys<span style="color: #008000;">&#91;</span>GLFW_KEY_F11<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> GLFW_RELEASE<span style="color: #008080;">;</span>
		glfwTerminate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		fullscreen <span style="color: #000080;">=</span> <span style="color: #000040;">!</span> fullscreen<span style="color: #008080;">;</span>
		initGLFW<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Upsuper's OpenGL Test&quot;</span>, <span style="color: #0000dd;">640</span>, <span style="color: #0000dd;">480</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">void</span> quit<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> status<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	glfwTerminate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">exit</span><span style="color: #008000;">&#40;</span>status<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">void</span> quit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	quit<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">void</span> report_error<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> info<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">puts</span><span style="color: #008000;">&#40;</span>info<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	quit<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> resizeGLScene<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> width, <span style="color: #0000ff;">int</span> height<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>height <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> height <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
	glViewport<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, width, height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glMatrixMode<span style="color: #008000;">&#40;</span>GL_PROJECTION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	gluPerspective<span style="color: #008000;">&#40;</span><span style="color:#800080;">45.0f</span>, GLfloat<span style="color: #008000;">&#40;</span>width<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span>GLfloat<span style="color: #008000;">&#40;</span>height<span style="color: #008000;">&#41;</span>, <span style="color:#800080;">0.1f</span>, <span style="color:#800080;">100.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glMatrixMode<span style="color: #008000;">&#40;</span>GL_MODELVIEW<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> initGL<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> width, <span style="color: #0000ff;">int</span> height<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	glShadeModel<span style="color: #008000;">&#40;</span>GL_SMOOTH<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glClearColor<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glClearDepth<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glEnable<span style="color: #008000;">&#40;</span>GL_DEPTH_TEST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glDepthFunc<span style="color: #008000;">&#40;</span>GL_LEQUAL<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glHint<span style="color: #008000;">&#40;</span>GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> initGLFW<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> title, <span style="color: #0000ff;">int</span> width, <span style="color: #0000ff;">int</span> height<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	glfwInit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> glfwOpenWindow<span style="color: #008000;">&#40;</span>width, height, <span style="color: #0000dd;">8</span>, <span style="color: #0000dd;">8</span>, <span style="color: #0000dd;">8</span>, <span style="color: #0000dd;">8</span>, <span style="color: #0000dd;">24</span>, <span style="color: #0000dd;">0</span>, 
			fullscreen <span style="color: #008080;">?</span> GLFW_FULLSCREEN <span style="color: #008080;">:</span> GLFW_WINDOW<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
		report_error<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;ERROR: Cannot open a window.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glfwSetWindowTitle<span style="color: #008000;">&#40;</span>title<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glfwEnable<span style="color: #008000;">&#40;</span>GLFW_AUTO_POLL_EVENTS<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glfwSetKeyCallback<span style="color: #008000;">&#40;</span>keyPress<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glfwSetWindowSizeCallback<span style="color: #008000;">&#40;</span>resizeGLScene<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	initGL<span style="color: #008000;">&#40;</span>width, height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">**</span> argv<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Would you like to run in fullscreen mode? [Y/n]&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> c <span style="color: #000080;">=</span> <span style="color: #0000dd;">getchar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	fullscreen <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>c <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">'n'</span> <span style="color: #000040;">&amp;&amp;</span> c <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">'N'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>keys, <span style="color: #0000ff;">false</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	initGLFW<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Upsuper's OpenGL Test&quot;</span>, <span style="color: #0000dd;">640</span>, <span style="color: #0000dd;">480</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	st <span style="color: #000080;">=</span> glfwGetTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">do</span>
	<span style="color: #008000;">&#123;</span>
		drawGLScene<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glfwSwapBuffers<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>active<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	quit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>代码比 VC++ 的那个短好多，再次证明 Linux 是多么适用于编程……</p>
<p>同时根据帧数对比，印证了我的猜想——全屏下比较流畅！我这里全屏下 fps 达到了窗口模式的接近3倍。</p>
<p>附 makefile 文件（这也是我第一次写 makefile）：</p>

<div class="wp_codebox"><table><tr id="p695116"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p695code116"><pre class="make" style="font-family:monospace;">all<span style="color: #004400;">:</span> test1<span style="color: #004400;">.</span>cpp a<span style="color: #004400;">.</span>cpp
	g<span style="color: #004400;">++</span> test1<span style="color: #004400;">.</span>cpp <span style="color: #004400;">-</span>o test1 <span style="color: #004400;">-</span>lglfw <span style="color: #004400;">-</span>lGL <span style="color: #004400;">-</span>lGLU <span style="color: #004400;">-</span>lXrandr</pre></td></tr></table></div>

<p>最后，我还是十分高兴，那个绘制代码是我自己写出来的，不是抄的了！（虽然以前写过……）</p>
<p>写 OpenGL 就是爽……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/opengl-small-test-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 没有不能运行的脚本</title>
		<link>http://blog.upsuper.org/there-is-no-script-that-cannot-run-on-linux/</link>
		<comments>http://blog.upsuper.org/there-is-no-script-that-cannot-run-on-linux/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 14:21:20 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=670</guid>
		<description><![CDATA[很早以前，我就知道，在 Windows 里面我们可以直接运行非二进制文件的 bat/cmd 命令行文件，还有那个 vbs 脚本文件。 到了 Linux，我发现，在这里，每一样都比 Windows 里面先进……虽然不能运行 vbs 或 bat/cmd，但这里有 bash、python、perl、ruby…… 好吧，我承认还是有脚本不行的，但 Linux 下即使 bash 都比 vbs 强大…… 后来知道了 php 也可以……php-cli 模式可以在 Linux 下直接执行 php 脚本。 今天又知道了……原来 JavaScript 脚本也可以直接执行。先是把一个 JavaScript 脚本设置为可执行，但是没法运行。然后到 bash 中找什么命令能执行 JavaScript……我试了一下 javascript 命令，没有，又试了下 js，bash 提示我，在 spidermonkey-bin 包中包含这个命令。联想到刚刚看过一个资料说到 Spidermonkey 是 Firefox 的脚本解析器，我就用 apt 安装了个（今天新加的网易源实在太快了！） 随后，修改了一下脚本，大约是这个样子的： 1 2 #!/usr/bin/js print&#40;&#34;Hello [...]]]></description>
			<content:encoded><![CDATA[<p>很早以前，我就知道，在 Windows 里面我们可以直接运行非二进制文件的 bat/cmd 命令行文件，还有那个 vbs 脚本文件。</p>
<p>到了 Linux，我发现，在这里，每一样都比 Windows 里面先进……虽然不能运行 vbs 或 bat/cmd，但这里有 bash、python、perl、ruby……<br />
好吧，我承认还是有脚本不行的，但 Linux 下即使 bash 都比 vbs 强大……</p>
<p>后来知道了 php 也可以……php-cli 模式可以在 Linux 下直接执行 php 脚本。</p>
<p>今天又知道了……原来 JavaScript 脚本也可以直接执行。先是把一个 JavaScript 脚本设置为可执行，但是没法运行。然后到 bash 中找什么命令能执行 JavaScript……我试了一下 javascript 命令，没有，又试了下 js，bash 提示我，在 spidermonkey-bin 包中包含这个命令。联想到刚刚看过<a href="http://tech.sina.com.cn/s/2008-07-21/1734740604.shtml">一个资料</a>说到 Spidermonkey 是 Firefox 的脚本解析器，我就用 apt 安装了个（今天新加的网易源实在太快了！）</p>
<p>随后，修改了一下脚本，大约是这个样子的：</p>

<div class="wp_codebox"><table><tr id="p670118"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p670code118"><pre class="javascript" style="font-family:monospace;">#<span style="color: #339933;">!/</span>usr<span style="color: #339933;">/</span>bin<span style="color: #339933;">/</span>js
<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Hello world!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>执行，在 bash 中输出了 Hello world! 太高兴了！</p>
<p>Linux 下真是没有不能执行的脚本，Windows 永远也比不上……<br />
我就不理解了，这么先进的 Linux 怎么就没什么人用呢？多少功能比 Windows 方便……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/there-is-no-script-that-cannot-run-on-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>解决 MPlayer 的无法播放</title>
		<link>http://blog.upsuper.org/solution-to-the-mplayer-unable-to-play/</link>
		<comments>http://blog.upsuper.org/solution-to-the-mplayer-unable-to-play/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 11:33:39 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[动画]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=632</guid>
		<description><![CDATA[今天又是一个 rmvb 在 SMPlayer 不能播放，让我很无奈……因为实在无法忍受 RealPlayer 的画质和可操作性，就去寻找解决办法…… 用 MPlayer 打开后，提示“error opening/initializing the selected video_out (-vo) device”，然后在 Ubuntu 论坛上发现一个帖子，根据二楼的说明，将 ~/.mplayer/gui.conf 文件中的 vo_driver 修改为 x11： 2 vo_driver = &#34;x11&#34; 再开就成功了！然后在播 CLANNAD 的第 8 集，也可以了！ RealPlayer，你可以走了~o(∩_∩)o&#8230;哈哈]]></description>
			<content:encoded><![CDATA[<p>今天又是一个 rmvb 在 SMPlayer 不能播放，让我很无奈……因为实在无法忍受 RealPlayer 的画质和可操作性，就去寻找解决办法……</p>
<p>用 MPlayer 打开后，提示“error opening/initializing the selected video_out (-vo) device”，然后在 Ubuntu 论坛上发现一个<a href="http://ubuntuforums.org/showthread.php?t=20039" target="_blank">帖子</a>，根据二楼的说明，将 ~/.mplayer/gui.conf 文件中的 vo_driver 修改为 x11：</p>

<div class="wp_codebox"><table><tr id="p632120"><td class="line_numbers"><pre>2
</pre></td><td class="code" id="p632code120"><pre class="text" style="font-family:monospace;">vo_driver = &quot;x11&quot;</pre></td></tr></table></div>

<p>再开就成功了！然后在播 CLANNAD 的第 8 集，也可以了！</p>
<p>RealPlayer，你可以走了~o(∩_∩)o&#8230;哈哈</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/solution-to-the-mplayer-unable-to-play/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>令人失望的 RealPlayer 11 for Linux</title>
		<link>http://blog.upsuper.org/disappointing-realplayer-11-for-linux/</link>
		<comments>http://blog.upsuper.org/disappointing-realplayer-11-for-linux/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 03:02:37 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[视频]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=616</guid>
		<description><![CDATA[今天看澄空字幕组 CLANNAD ~After Story~ 第8集的 rmvb 文件出现了些奇特的情况，就是 SMPlayer 不能播放……原因暂未查明。 不过也因此尝试了一下 RealPlayer 这个播放 rmvb 的始祖，但它实在是令人失望。 安装上，Ubuntu 的源并没有这个软件，可能是应为不开源被开源社区排斥了，不过在 Real 的官方网站还是可以很容易地载到 DEB、RPM 或者 BIN 的安装包。速度很快，安装也很方便，在 Ubuntu 下 DEB 的安装大都是全自动化的。不过 RealPlayer 的依赖软件中，似乎有一个不是自动的，需要选择一次，安装的时候可以稍微注意一下。 虽然下载界面是全英文的，不过安装完成后却看到了熟悉的中文界面，还是很高兴的。不过下面就再也高兴不起来了。 播放 rmvb 如果按照原比例看还好，一旦放到全屏，锯齿十分明显，似乎 RealPlayer for Linux 没有对锯齿做任何处理，画质完全比不上 SMPlayer（经测试，这并非片源导致）。同时，在动作较大的部分，RealPlayer 还会出现延迟等现象……似乎 CPU 占用率很高的样子。这只是播放的问题，下面来说操作问题。我把鼠标放到屏幕最下端，竟然没有出现控制条！快捷键不习惯就算了，就连这种最基本的东西都没有……快进后退都要退出全屏才能做…… 没有 Windows 下 RealOne 的华丽界面我也就忍了，但是作为流媒体的老大之一，自己的播放器画质这样，操作性这样，我还能说什么呢？ 当然，还有一点值得肯定，就是还能出 for Linux 版……不像国内某些大公司，光顾着自己开 C2C 赚钱，推出个 IM 都不考虑咱 Linux 用户的……]]></description>
			<content:encoded><![CDATA[<p>今天看澄空字幕组 CLANNAD ~After Story~ 第8集的 rmvb 文件出现了些奇特的情况，就是 SMPlayer 不能播放……原因暂未查明。</p>
<p>不过也因此尝试了一下 RealPlayer 这个播放 rmvb 的始祖，但它实在是令人失望。<br />
<span id="more-616"></span><br />
安装上，Ubuntu 的源并没有这个软件，可能是应为不开源被开源社区排斥了，不过在 Real 的<a href="http://www.real.com/linux" target="_blank">官方网站</a>还是可以很容易地载到 DEB、RPM 或者 BIN 的安装包。速度很快，安装也很方便，在 Ubuntu 下 DEB 的安装大都是全自动化的。不过 RealPlayer 的依赖软件中，似乎有一个不是自动的，需要选择一次，安装的时候可以稍微注意一下。</p>
<p><a href="http://blog.upsuper.org/wp-content/uploads/2008/11/screenshot-realplayer.png"><img src="http://blog.upsuper.org/wp-content/uploads/2008/11/screenshot-realplayer-300x275.png" alt="" title="screenshot-realplayer" width="300" height="275" class="alignright size-medium wp-image-617" /></a>虽然下载界面是全英文的，不过安装完成后却看到了熟悉的中文界面，还是很高兴的。不过下面就再也高兴不起来了。</p>
<p>播放 rmvb 如果按照原比例看还好，一旦放到全屏，锯齿十分明显，似乎 RealPlayer for Linux 没有对锯齿做任何处理，画质完全比不上 SMPlayer（经测试，这并非片源导致）。同时，在动作较大的部分，RealPlayer 还会出现延迟等现象……似乎 CPU 占用率很高的样子。这只是播放的问题，下面来说操作问题。我把鼠标放到屏幕最下端，竟然没有出现控制条！快捷键不习惯就算了，就连这种最基本的东西都没有……快进后退都要退出全屏才能做……</p>
<p>没有 Windows 下 RealOne 的华丽界面我也就忍了，但是作为流媒体的老大之一，自己的播放器画质这样，操作性这样，我还能说什么呢？</p>
<p>当然，还有一点值得肯定，就是还能出 for Linux 版……不像国内某些大公司，光顾着自己开 C2C 赚钱，推出个 IM 都不考虑咱 Linux 用户的……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/disappointing-realplayer-11-for-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VMware Workstation 6.5.1 in Ubuntu</title>
		<link>http://blog.upsuper.org/vmware-workstation-6-5-1-in-ubuntu/</link>
		<comments>http://blog.upsuper.org/vmware-workstation-6-5-1-in-ubuntu/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 00:34:27 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VeryCD]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[虚拟机]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=611</guid>
		<description><![CDATA[在升级 Ubuntu 8.10 之后，由于内核的更新，原来编译安装的 VMware 6.0 已经不能用了，也没有兴趣再 config 一次，想到 6.5 已经出了，就干脆用 vmware-uninstall.pl 卸了……但是网上一直找不到 VMware 6.5，连 VeryCD 上都没有…… 今天又搜了一遍，发现 VMware 出了 6.5.1……最终到 VMware 的官方网站注册并下载了 VMware Workstation 6.5.1 for linux，准备发到 VeryCD 上去~ 下载来的，是一个 .bundle 的文件，不知道怎么开，网上看到Ubuntu 下安装bundle文件。原来只要把 .bundle 文件的权限添加“可以以程序执行文件”，然后直接运行就可以了。 将其权限加好后，在 sudo 下执行，发现下面的错误： Extracting VMware Installer&#8230;done. Launching a SCIM daemon with Socket FrontEnd&#8230; Loading simple Config module &#8230; Creating [...]]]></description>
			<content:encoded><![CDATA[<p>在升级 Ubuntu 8.10 之后，由于内核的更新，原来编译安装的 VMware 6.0 已经不能用了，也没有兴趣再 config 一次，想到 6.5 已经出了，就干脆用 vmware-uninstall.pl 卸了……但是网上一直找不到 VMware 6.5，连 VeryCD 上都没有……</p>
<p>今天又搜了一遍，发现 VMware 出了 6.5.1……最终到 VMware 的官方网站注册并下载了 VMware Workstation 6.5.1 for linux，准备发到 VeryCD 上去~</p>
<p>下载来的，是一个 .bundle 的文件，不知道怎么开，网上看到<a href="http://hi.baidu.com/leemuhe/blog/item/af67cb1b13c400fcae513305.html" target="_blank">Ubuntu 下安装bundle文件</a>。原来只要把 .bundle 文件的权限添加“可以以程序执行文件”，然后直接运行就可以了。</p>
<p>将其权限加好后，在 sudo 下执行，发现下面的错误：</p>
<blockquote><p>
Extracting VMware Installer&#8230;done.<br />
Launching a SCIM daemon with Socket FrontEnd&#8230;<br />
Loading simple Config module &#8230;<br />
Creating backend &#8230;<br />
Traceback (most recent call last):<br />
  File “/usr/share/scim-python/engine/__init__.py”, line 26, in <module><br />
    import scim<br />
ImportError: No module named scim<br />
ImportError: No module named engine<br />
/tmp/vmis.P26669/install/vmware-installer/vmware-installer: line 27: 26725 段错误               “$PYTHON” “$VMWARE_INSTALLER”/vmware-installer.py “$@”
</p></blockquote>
<p>不知道这是什么错误……我把 pkill 了 scim，没用，把 scim-python 文件夹重命名，还是没用……又是一番搜索，发现 Ubuntu 中文论坛上似乎有同样的问题：<a href="http://forum.ubuntu.org.cn/viewtopic.php?p=988933" target="_blank">安装VMware6.5错误，内附错误信息，请大家给我看看该怎么办。</a>根据下面一个人回复的提示，我将 /usr/share/scim-python/engine/__init__.py 文件中的 import scim 注释掉，可以正常安装。但去掉注释并没有像那人所说的依然可以安装。因此我将 import scim 的注释保留到安装完成。</p>
<p>安好后，就是注册的问题。因为 VMware 是可以先试用的，虽然 keygen 是 Windows 下的，我也 wine 不起来（好像以前可以……），于是就干脆先装了一个 Windows 在里面，然后在那里面跑 keygen，把注册码填进去。这实在不能不说是一种讽刺啊……</p>
<p>经过试用，这个版本相对原来的 6.0 在速度上有很大改进，对于我很关注的新加入的 Unity 原生窗口支持，倒是并没有期待中那么好。我主要是觉得有些地方还是不够方便，比如我的电脑等对于 Windows 很关键的东西在 Unity 中并没有出现，因此操作起来时不时还要切换回去。同时，Unity 的速度实在不敢恭维……特别是在 Compiz 下，类似迅雷那种有很多奇怪的窗口就比较累一点（因为那些提示性的“窗口”也要像普通窗口那样炫一下……）因此还是乖乖继续用原来的方式，期待 VMware 的继续改进……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/vmware-workstation-6-5-1-in-ubuntu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubuntu之旅（九）</title>
		<link>http://blog.upsuper.org/ubuntu-trip-9/</link>
		<comments>http://blog.upsuper.org/ubuntu-trip-9/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 15:03:40 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[AAC]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[正则表达式]]></category>
		<category><![CDATA[音乐]]></category>
		<category><![CDATA[音频]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=197</guid>
		<description><![CDATA[很久没继续，因为前一段时间迷恋 CLANNAD + 信息组培训…… 话说这次因为要收新歌，所以研究了一下 Ubuntu 下的音频相关，发现了一个不错的小工具 Audio-convert-mod 音频魔方，安装有一点不同，参见上一篇日志。 安装好以后发现我不得不放弃以前收集时采用的 wma 格式，因为 Linux 下似乎很难找到转为 wma 的方法（虽然最后还是被我找到了，见此处，不过不想采用），而且经过网上一番查找对比，最终选定了 AAC 格式作为新一批的收录标准格式。AAC 的优点我在这里就不多阐述了，反正好像 wma 和 mp3 和它是没得比的，唯独就是 mpc 需要考量。 完成了标准格式的选定，我还需要符合我收藏标准的标签和文件命名方式。标签方面，用 Audacious 不能修改 AAC 的标签，而传说中强大的 Kid3 修改后，就不能播放了……今天下午刚刚发现一个很好的软件 EasyTAG （可直接用 apt 安装），声称支持 AAC。不过弄了半天一直不能现实出 .aac 的文件。开始以为是没有安装依赖的 libmp4v2，不过安装了还是没有。在官方的手册上看了一会儿，突然发现那里面只提到用 mpeg4ip 以兼容 mp4！！！我把扩展名改为 .mp4，EasyTAG 可以找到了，修改后重命名回去也可以正常播放。成功了哈~ 最后是关于命名的问题。我的命名一向是“轨道编号-歌曲名”的方式命名的，但是网上下载的歌曲却多是“轨道编号.歌曲名”的。以前在 Windows 下用一个叫做拖把更名器的东西，还是很好用的。于是就在想 Linux 下有没有这样的东西呢？经过查找，发现了 rename 这个命令。这个命令支持 Perl 的正则表达式，因此功能变得十分强大，比如我的问题只要 1 [...]]]></description>
			<content:encoded><![CDATA[<p>很久没继续，因为前一段时间迷恋 CLANNAD + 信息组培训……</p>
<p>话说这次因为要收新歌，所以研究了一下 Ubuntu 下的音频相关，发现了一个不错的小工具 Audio-convert-mod 音频魔方，安装有一点不同，参见<a href="http://blog.upsuper.org/installation-of-audio-convert-mod/">上一篇日志</a>。</p>
<p>安装好以后发现我不得不放弃以前收集时采用的 wma 格式，因为 Linux 下似乎很难找到转为 wma 的方法（虽然最后还是被我找到了，见<a href="http://semson.blogspot.com/2008/05/linux-audoi-wma.html" target="_blank">此处</a>，不过不想采用），而且经过网上一番查找对比，最终选定了 AAC 格式作为新一批的收录标准格式。AAC 的优点我在这里就不多阐述了，反正好像 wma 和 mp3 和它是没得比的，唯独就是 mpc 需要考量。</p>
<p>完成了标准格式的选定，我还需要符合我收藏标准的标签和文件命名方式。标签方面，用 Audacious 不能修改 AAC 的标签，而传说中强大的 Kid3 修改后，就不能播放了……今天下午刚刚发现一个很好的软件 EasyTAG （可直接用 apt 安装），声称支持 AAC。不过弄了半天一直不能现实出 .aac 的文件。开始以为是没有安装依赖的 libmp4v2，不过安装了还是没有。在官方的手册上看了一会儿，突然发现那里面只提到用 mpeg4ip 以兼容 mp4！！！我把扩展名改为 .mp4，EasyTAG 可以找到了，修改后重命名回去也可以正常播放。成功了哈~<br />
<span id="more-197"></span><br />
最后是关于命名的问题。我的命名一向是“轨道编号-歌曲名”的方式命名的，但是网上下载的歌曲却多是“轨道编号.歌曲名”的。以前在 Windows 下用一个叫做拖把更名器的东西，还是很好用的。于是就在想 Linux 下有没有这样的东西呢？经过查找，发现了 rename 这个命令。这个命令支持 Perl 的正则表达式，因此功能变得十分强大，比如我的问题只要</p>

<div class="wp_codebox"><table><tr id="p197123"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p197code123"><pre class="bash" style="font-family:monospace;">rename <span style="color: #ff0000;">'s/(\d{2})\.(.*)/$1\-$2/'</span> <span style="color: #000000; font-weight: bold;">*</span></pre></td></tr></table></div>

<p>就可以了。其中</p>

<div class="wp_codebox"><table><tr id="p197124"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p197code124"><pre class="regular" style="font-family:monospace;">s/(\d{2})\.(.*)/$1\-$2/</pre></td></tr></table></div>

<p>就是 Perl 的正则表达式，具体的使用方法可以参看<a href="http://blog.csdn.net/dreamnear/archive/2007/11/08/1872965.aspx" target="_blank">Perl正则表达式详解</a>，不过要特别注意的是，rename 推荐使用“$1”、“$2”这样的形式代替“\1”、“\2”，这似乎和 Perl 不大一样？</p>
<p>后面的 * 就是尝试对每一个文件重命名咯，很简单的。不过正则表达式可能要学一点时间，另外推荐我看的正则表达式的教程：<a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm" target="_blank">正则表达式30分钟入门教程</a>，写得比较不错，虽然和 Perl 的有些许不同，不过大同小异，学学也无妨。况且这个写得比较容易入门的说~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/ubuntu-trip-9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装Audio-convert-mod</title>
		<link>http://blog.upsuper.org/installation-of-audio-convert-mod/</link>
		<comments>http://blog.upsuper.org/installation-of-audio-convert-mod/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 14:30:06 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=158</guid>
		<description><![CDATA[今天下了 CLANNAD 的原声碟，想要转换格式进入我的音乐收藏。因为废掉了 Windows，在 Ubuntu 下也需要找一个好的转换软件代替。在网上查找了一番，发现一个很方便的东西 Audio-convert-mod，不过安装它不是那么一帆风顺的。 首先，从官方网站下载了源码包，因为没有提供 deb 包……然后解压后，在里面运行 1 2 3 sudo ./configure --prefix=/usr sudo make sudo make install 安装完成（我本来是没有用 sudo 和那个 &#8211;prefix 参数的，结果怎么弄都弄不清楚）。 在 bash 中执行 audio-convert-mod 提示： 1 python: can't open file '/usr/share/local/share/audio-convert-mod/acm-runapp.pyw': [Errno 2] No such file or directory 经过调查，发现 acm-runapp.pyw 出现在 /usr/share/audio-convert-mod 里，而根本不存在 /usr/share/local 这个目录……于是我就突发奇想，把 /usr 链接到 /usr/share/local 上，结果就可以了： [...]]]></description>
			<content:encoded><![CDATA[<p>今天下了 CLANNAD 的原声碟，想要转换格式进入我的音乐收藏。因为废掉了 Windows，在 Ubuntu 下也需要找一个好的转换软件代替。在网上查找了一番，发现一个很方便的东西 Audio-convert-mod，不过安装它不是那么一帆风顺的。</p>
<p>首先，从<a href="http://www.diffingo.com/content/view/13/47/lang,en/" target="_blank">官方网站</a>下载了源码包，因为没有提供 deb 包……然后解压后，在里面运行</p>

<div class="wp_codebox"><table><tr id="p158128"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p158code128"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></td></tr></table></div>

<p>安装完成（我本来是没有用 sudo 和那个 &#8211;prefix 参数的，结果怎么弄都弄不清楚）。</p>
<p>在 bash 中执行 audio-convert-mod 提示：</p>

<div class="wp_codebox"><table><tr id="p158129"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p158code129"><pre class="text" style="font-family:monospace;">python: can't open file '/usr/share/local/share/audio-convert-mod/acm-runapp.pyw': [Errno 2] No such file or directory</pre></td></tr></table></div>

<p>经过调查，发现 acm-runapp.pyw 出现在 /usr/share/audio-convert-mod 里，而根本不存在 /usr/share/local 这个目录……于是我就突发奇想，把 /usr 链接到 /usr/share/local 上，结果就可以了：</p>

<div class="wp_codebox"><table><tr id="p158130"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p158code130"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span></pre></td></tr></table></div>

<p>唉……有些东西还真是麻烦……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/installation-of-audio-convert-mod/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ujudger-base 0.1 编写小结</title>
		<link>http://blog.upsuper.org/summary-of-ujudger-base-0-1-programming/</link>
		<comments>http://blog.upsuper.org/summary-of-ujudger-base-0-1-programming/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 03:38:24 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ujudger]]></category>
		<category><![CDATA[源代码]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=124</guid>
		<description><![CDATA[昨天说今天要写一篇来说说 ujudger-base 用到的技术层的资料，今天就来试着写一写，顺便自己复习一下相关的东西。 这些大多是参考网上资料及 man 手册得到的，有错误的地方请多指教！ 最早查早的资料是关于创建子进程的。在查找了很多资料后，我发现，在 Linux 下创建子进程只有一个方法—— fork 函数和 vfork 函数。两个函数有些许的不同，但他们的用法却大体相同，即从调用函数开始，程序分岔为父进程和子进程两个完全相同的程序。最神奇的地方出现了：这个函数一旦调用成功将会返回两次！不知道在哪里看到这个说明，让我瞬间领悟了这个函数的用法。这个函数会在父进程和子进程各返回一次，父进程中返回子进程的 pid ，子进程中返回 0。如果调用错误，则返回一次 -1，并将具体的错误编号放入 errno （需引用 errno.h）。于是我们可以用一个很简短的程序来说明这个函数的用法： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include &#60;iostream&#62; extern &#34;C&#34; &#123; #include [...]]]></description>
			<content:encoded><![CDATA[<p>昨天说今天要写一篇来说说 ujudger-base 用到的技术层的资料，今天就来试着写一写，顺便自己复习一下相关的东西。</p>
<p>这些大多是参考网上资料及 man 手册得到的，有错误的地方请多指教！<br />
<span id="more-124"></span><br />
最早查早的资料是关于创建子进程的。在查找了很多资料后，我发现，在 Linux 下创建子进程只有一个方法—— fork 函数和 vfork 函数。两个函数有些许的不同，但他们的用法却大体相同，即从调用函数开始，程序分岔为父进程和子进程两个完全相同的程序。最神奇的地方出现了：这个函数一旦调用成功将会返回两次！不知道在哪里看到这个说明，让我瞬间领悟了这个函数的用法。这个函数会在父进程和子进程各返回一次，父进程中返回子进程的 pid ，子进程中返回 0。如果调用错误，则返回一次 -1，并将具体的错误编号放入 errno （需引用 errno.h）。于是我们可以用一个很简短的程序来说明这个函数的用法：</p>

<div class="wp_codebox"><table><tr id="p124138"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p124code138"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">extern</span> <span style="color: #FF0000;">&quot;C&quot;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #339900;">#include &lt;unistd.h&gt;</span>
	<span style="color: #339900;">#include &lt;sys/types.h&gt;</span>
	<span style="color: #339900;">#include &lt;errno.h&gt;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">**</span> argv<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> child <span style="color: #000080;">=</span> fork<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>child <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;This is subprocess! &quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;My pid is &quot;</span> <span style="color: #000080;">&lt;&lt;</span> getpid<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>child <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;An error occurred! &quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Error Number: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000ff;">errno</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;This is parent process! &quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;My pid is &quot;</span> <span style="color: #000080;">&lt;&lt;</span> getpid<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;My child's pid is &quot;</span> <span style="color: #000080;">&lt;&lt;</span> child <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>创建了子进程就要运行别的程序了，在 Linux 中需要使用 exec 族函数。这些函数包括：</p>

<div class="wp_codebox"><table><tr id="p124139"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p124code139"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> execl<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>path, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>arg, ...<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> execlp<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>file, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>arg, ...<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> execle<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>path, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>arg,
    ..., <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> <span style="color: #0000ff;">const</span> envp<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> execv<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>path, <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #0000ff;">const</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> execvp<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>file, <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #0000ff;">const</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>他们的不同用法可以参考 man 手册，不过我个人比较喜欢 execl 所以就小小介绍一下。execl 是我认为这里面最简单的一个函数了！用法就是 execl(欲执行的程序的绝对路径, 参数0, 参数1, &#8230;, NULL); 如果不返回就调用成功了（又一个奇怪的函数），因为原来的进程内容被新的程序覆盖了。返回就说明必定出错……同样的错误代码存于 errno。下面用一个小小的程序来说明一下：</p>

<div class="wp_codebox"><table><tr id="p124140"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p124code140"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">extern</span> <span style="color: #FF0000;">&quot;C&quot;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #339900;">#include &lt;unistd.h&gt;</span>
	<span style="color: #339900;">#include &lt;errno.h&gt;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">**</span> argv<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> child <span style="color: #000080;">=</span> fork<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>child <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		execl<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;/bin/ls&quot;</span>, <span style="color: #FF0000;">&quot;ls&quot;</span>, <span style="color: #FF0000;">&quot;..&quot;</span>, <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;An error occurred in execl()! &quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Error Number: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000ff;">errno</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>child <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;An error occurred in fork()! &quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Error Number: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000ff;">errno</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;This is parent process!&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>其中 execl 的参数 0 是必须要有的，可以为空串或者欲执行程序的名称（如该例中为 ls）。使用过 C++ 的 argv 的应该都知道，argv[0] 是程序名称。参数列表要以一个 NULL 结尾，否则应该会出错。另外就是，欲执行的程序也可以用形如“./prog”来表示运行当前目录下的程序。</p>
<p>开始的时候我有些不明白，Linux 为什么要弄得这么麻烦，多一个步骤。不过后来想想，觉得这样也不错，父进程甚至可以“要求”子进程做一些事情，比如 ptrace me…… <img src='http://blog.upsuper.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>下面来说说关于获取进程运行时间和占用内存的问题。我原来想单单通过 getrusage 函数来获取，但后来发现这个函数不但获取不了内存耗用（返回 0），而且也不能了解程序是否结束……后来发现一个很不错的函数 wait4 ，拥有全部 getrusage 的功能，并且还更强大！根据 man 手册，wait4 的定义是 pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage); 这告诉我们，wait4 不但可以返回 rusage 结构的资料，还有退出时的返回值 status （突然想起来，ujudger-base 0.1 里忘记监视 status 的值了……）。同时，man 手册告诉我们，如果 options 设为 WNOHANG ，那么函数将不会等待而立即返回，如果没有 pid 指定的进程已经结束，则返回 0。这样我们就有了一个可以等待程序结束的方法了！不过这里获得的 rusage 其实和 getrusage 一样，只有时间可以收集到……收集到的时间是以 struct timeval 的格式存储的，timeval 的定义为：</p>

<div class="wp_codebox"><table><tr id="p124141"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p124code141"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> timeval <span style="color: #009900;">&#123;</span>
	time_t		tv_sec<span style="color: #339933;">;</span>     <span style="color: #808080; font-style: italic;">/* seconds */</span>
	suseconds_t	tv_usec<span style="color: #339933;">;</span>    <span style="color: #808080; font-style: italic;">/* microseconds */</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>一个是秒，一个是微秒（1μs=1&#215;10<sup>-6</sup>s），还是蛮精确的吧？</p>
<p>有了这个，我们还需要一点东西，来等待。虽然 wait4 可以自己等待，但我们不希望他在等待的时候我们什么也不能做不是？经过查找，我发现 Linux 下有一个叫 sleep 的函数，但这个函数的等待时间单位是秒……我觉得好郁闷……后来知道还有一个叫 usleep 的函数，等待时间是以微秒记，这才是我们需要的！（虽然根据实验，这个函数的计时是有点误差的）下面把前面的函数全部联合起来写一个小程序（我觉得已经有些许接近 ujudger-base 0.1 了……）：</p>

<div class="wp_codebox"><table><tr id="p124142"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code" id="p124code142"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">extern</span> <span style="color: #FF0000;">&quot;C&quot;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #339900;">#include &lt;unistd.h&gt;</span>
	<span style="color: #339900;">#include &lt;errno.h&gt;</span>
	<span style="color: #339900;">#include &lt;sys/types.h&gt;</span>
	<span style="color: #339900;">#include &lt;sys/time.h&gt;</span>
	<span style="color: #339900;">#include &lt;sys/resource.h&gt;</span>
	<span style="color: #339900;">#include &lt;sys/wait.h&gt;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">**</span> argv<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> child <span style="color: #000080;">=</span> fork<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>child <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		execl<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;./test&quot;</span>, <span style="color: #FF0000;">&quot;&quot;</span>, <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;An error occurred in execl()! &quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Error Number: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000ff;">errno</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>child <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;An error occurred in fork()! &quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Error Number: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000ff;">errno</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;This is parent process!&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Start waiting...&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> status<span style="color: #008080;">;</span>
		rusage usage<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>wait4<span style="color: #008000;">&#40;</span>RUSAGE_CHILDREN, <span style="color: #000040;">&amp;</span>status, WNOHANG, <span style="color: #000040;">&amp;</span>usage<span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			usleep<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">100</span> <span style="color: #000040;">*</span> <span style="color: #0000dd;">1000</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Sleep for 100ms</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">double</span> usertime <span style="color: #000080;">=</span> <span style="color: #0000ff;">static_cast</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">double</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>usage.<span style="color: #007788;">ru_utime</span>.<span style="color: #007788;">tv_sec</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> 
			<span style="color: #0000ff;">static_cast</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">double</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>usage.<span style="color: #007788;">ru_utime</span>.<span style="color: #007788;">tv_usec</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> <span style="color:#800080;">1e6</span><span style="color: #008080;">;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Time used: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> usertime <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;s&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>其中的“./test”的代码：</p>

<div class="wp_codebox"><table><tr id="p124143"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p124code143"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">**</span> argv<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Test start!&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">1000000000</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Test end!&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>测 ujudger-base 的时候也是用类似的程序测试的。</p>
<p>最后就是关于运行时获取程序各项信息的方法。查找了许多资料后，开始使用的读取内存耗用的方法是读取 /proc/&lt;pid&gt;/statm 文件的方法，后来使用因为想要实时获取已经耗用的时间而最终转而读取 /proc/&lt;pid&gt;/stat 文件。这两个文件的相关说明在“man proc”中已经很详细了，这里就不一一说明了。我所用到的是 stat 里面的 utime 和 rss。utime 获取的单位为 jiffies，将其转换为时间需要一个宏 JIFFIES_TO_NS。我在 include 里面没有找到这个宏的定义，这里给出来：</p>

<div class="wp_codebox"><table><tr id="p124144"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p124code144"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;sys/param.h&gt; // For HZ below</span>
<span style="color: #339933;">#define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ))</span></pre></td></tr></table></div>

<p>这个宏将 jiffies 转换为纳秒（1ns=1&#215;10<sup>-9</sup>s）。而 rss 获取的内存单位为 pages，可以将其乘以 getpagesize 函数来获得进程占用的内存空间（单位：字节）。不过这里的 rss 获得的似乎和系统监视器中获得的数据不大一样，根据对比，系统监视器获得的应该是 statm 文件中的 data 数据。这个部分的代码可以参看 ujudger-base 中getrunstat 函数。</p>
<p>总体上说，这次这个 ujudger-base 0.1 中用到的技术就这些了。写的同时也发现昨晚那个程序不完善的地方，一个是读取 rss 的时候直接乘4（<< 2）而不是乘以 getpagesize() ；一个是没有检验程序返回值（通常运行时错误都已这种形式表达）；还有就是没有处理 execl 可能发生的错误……稍微修改一下……</p>
<p>发布修改后的新版本：<a href="http://ujudger.upsuper.org/src/ujudger-base-0.1.1.cpp">ujudger-base-0.1.1.cpp</a> (3.9 KB)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/summary-of-ujudger-base-0-1-programming/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ujudger-base 0.1 Released</title>
		<link>http://blog.upsuper.org/ujudger-base-0-1-released/</link>
		<comments>http://blog.upsuper.org/ujudger-base-0-1-released/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 14:45:21 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[我的计划]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ujudger]]></category>
		<category><![CDATA[源代码]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=122</guid>
		<description><![CDATA[经过我许多的资料查找和编写，终于完成了ujudger-base的第一个版本！ ujudger 是我准备编写的基于 Linux 的测评程序，采用 GPL 协议。由于一直以来找不到 Linux 下的测评程序，因此准备自己写一个。ujudger 的 u 既是取我网名的第一个字母，也是 ubuntu 的第一个字母，表示这个程序应该会在 ubuntu 下完成编写。而 ujudger-base 是 ujudger 的基础程序，表现 ujudger 的测评核心，即耗时和内存耗用的取得。使用 time 命令和系统监视器监视器的资料对比一下，ujudger-base 获得的信息还是比较体现程序的真实情况的。 ujudger-base 并不复杂，不过也不简单（自少我这么觉得）。在编写的过程中，开始不知道 Linux 下的进程控制，后来知道了 fork() 函数。开始觉得很奇怪，后来也就慢慢明白了。不就是返回两次么，有什么了不起的~然后就是exec族的函数，成功了就不返回了_-b 然后就是等待的办法。网上有些人是直接用 wait4 快速返回来等待，但我觉得这样很影响速度，因此采用了 usleep 等待 100ms（有没有一点像 Cena 的方法？）。 同时，我还查找了有关程序运行数据读取的相关问题，最后采用的是读取 /proc/&#60;pid&#62;/stat 文件的方法。具体采用的一些技术层的资料我准备明天发一篇来讲。 除此之外就是几乎第一次大规模的采用 C++ 的推荐风格编写程序（以前写OI的程序，为了效率不得不放弃许多 C++ 优美的特性），因此有写丑的地方也请多多指教。 里面的注释很多了，由于我的英语水平有限（My English is limited!），如果注释有什么语法错误，也请多多指教！ 点击这里下载源代码：ujudger-base-0.1.cpp (3.6 KB)]]></description>
			<content:encoded><![CDATA[<p>经过我许多的资料查找和编写，终于完成了ujudger-base的第一个版本！</p>
<p>ujudger 是我准备编写的基于 Linux 的测评程序，采用 GPL 协议。由于一直以来找不到 Linux 下的测评程序，因此准备自己写一个。ujudger 的 u 既是取我网名的第一个字母，也是 ubuntu 的第一个字母，表示这个程序应该会在 ubuntu 下完成编写。而 ujudger-base 是 ujudger 的基础程序，表现 ujudger 的测评核心，即耗时和内存耗用的取得。使用 time 命令和系统监视器监视器的资料对比一下，ujudger-base 获得的信息还是比较体现程序的真实情况的。<br />
<span id="more-122"></span><br />
ujudger-base 并不复杂，不过也不简单（自少我这么觉得）。在编写的过程中，开始不知道 Linux 下的进程控制，后来知道了 fork() 函数。开始觉得很奇怪，后来也就慢慢明白了。不就是返回两次么，有什么了不起的~然后就是exec族的函数，成功了就不返回了_-b</p>
<p>然后就是等待的办法。网上有些人是直接用 wait4 快速返回来等待，但我觉得这样很影响速度，因此采用了 usleep 等待 100ms（有没有一点像 Cena 的方法？）。</p>
<p>同时，我还查找了有关程序运行数据读取的相关问题，最后采用的是读取 /proc/&lt;pid&gt;/stat 文件的方法。具体采用的一些技术层的资料我准备明天发一篇来讲。</p>
<p>除此之外就是几乎第一次大规模的采用 C++ 的推荐风格编写程序（以前写OI的程序，为了效率不得不放弃许多 C++ 优美的特性），因此有写丑的地方也请多多指教。</p>
<p>里面的注释很多了，由于我的英语水平有限（My English is limited!），如果注释有什么语法错误，也请多多指教！</p>
<p>点击这里下载源代码：<a href="http://ujudger.upsuper.org/src/ujudger-base-0.1.cpp">ujudger-base-0.1.cpp</a> (3.6 KB)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/ujudger-base-0-1-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubuntu之旅（七）——LaTeX归来</title>
		<link>http://blog.upsuper.org/ubuntu-trip-7-latex-return/</link>
		<comments>http://blog.upsuper.org/ubuntu-trip-7-latex-return/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 04:12:03 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[TexLive]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=119</guid>
		<description><![CDATA[今天最主要的成绩就是终于把LaTeX环境给弄好了！主要参考了这些资料：TeXLive 2007 CJK Chinese Howto、TeXLive 2007中文配置指南 #18，似乎是同一个人的，很厉害的说！ 原来是想依赖apt-get的，但是看到要下载大达500MB+的文件，而且最近源的速度似乎很慢，下了几个包就放弃了。想起原来看到过的TexLive光盘，可以下载来看看。因为知道那个也有900MB+大，就开VMware到Windows下开迅雷下（Wine下的迅雷我始终不能正常使用，不知何故）。开始的时候下的也很慢，不过后来不知什么时候突然蹿到1MB+/s，下了大约半个小时就下完了，比起源里面那个一会儿告诉我半小时一会儿告诉我17小时要好多了…… 下载后解压，然后 1 2 3 4 sudo mkdir /media/texlive sudo mount -o loop texlive2007-live-20070212.iso /media/texlive cd /media/texlive sudo ./install-tl 然后按I开始安装。安装过程是全自动化的，不需要动什么，不过在安装的过程中可以预先做下一步。 为了使之能正常使用，需要编辑/etc/environment，在PATH的最前面加上“/usr/local/texlive/2007/bin/i386-linux:”，我的改完以后看起来像这样： 1 PATH=&#34;/usr/local/texlive/2007/bin/i386-linux:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games&#34; 现在重启一下。 重启后试了一下已经好的LaTeX环境： 1 2 3 4 \documentclass{article} \begin{document} Hello World! \end{document} 1 pdflatex test.tex 可以看到那些熟悉的文件，特别是那个PDF。打开看，“Hello World!” 接下来来中文支持。 看到先人们说那篇“Howto”的方法太慢，又查到了一个快的方法，就是用mkfont脚本。需要的话可以点击这里下载：mkfont.tar.gz (96.83 KB) 解压后把需要的字体文件逐个拷贝到mkfont所在文件夹，然后执行mkfont。具体的我以楷体为例： 1 time ./mkfont.sh simkai.ttf [...]]]></description>
			<content:encoded><![CDATA[<p>今天最主要的成绩就是终于把LaTeX环境给弄好了！主要参考了这些资料：<a href="http://mailboxpublic.googlepages.com/texlive2007cjkchinesehowto" target="_blank">TeXLive 2007 CJK Chinese Howto</a>、<a href="http://bbs.ctex.org/viewthread.php?tid=38043&#038;page=2#pid288649" target="_blank">TeXLive 2007中文配置指南 #18</a>，似乎是同一个人的，很厉害的说！</p>
<p><span id="more-119"></span></p>
<p>原来是想依赖apt-get的，但是看到要下载大达500MB+的文件，而且最近源的速度似乎很慢，下了几个包就放弃了。想起原来看到过的TexLive光盘，可以下载来看看。因为知道那个也有900MB+大，就开VMware到Windows下开迅雷下（Wine下的迅雷我始终不能正常使用，不知何故）。开始的时候下的也很慢，不过后来不知什么时候突然蹿到1MB+/s，下了大约半个小时就下完了，比起源里面那个一会儿告诉我半小时一会儿告诉我17小时要好多了……</p>
<p>下载后解压，然后</p>

<div class="wp_codebox"><table><tr id="p119153"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p119code153"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>texlive
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-o</span> loop texlive2007-live-<span style="color: #000000;">20070212</span>.iso <span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>texlive
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>texlive
<span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>install-tl</pre></td></tr></table></div>

<p>然后按I开始安装。安装过程是全自动化的，不需要动什么，不过在安装的过程中可以预先做下一步。</p>
<p>为了使之能正常使用，需要编辑/etc/environment，在PATH的最前面加上“/usr/local/texlive/2007/bin/i386-linux:”，我的改完以后看起来像这样：</p>

<div class="wp_codebox"><table><tr id="p119154"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p119code154"><pre class="text" style="font-family:monospace;">PATH=&quot;/usr/local/texlive/2007/bin/i386-linux:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games&quot;</pre></td></tr></table></div>

<p>现在重启一下。</p>
<p>重启后试了一下已经好的LaTeX环境：</p>

<div class="wp_codebox"><table><tr id="p119155"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p119code155"><pre class="latex" style="font-family:monospace;"><span style="color: #E02020; ">\</span><span style="color: #800000;">documentclass</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">article</span><span style="color: #E02020; ">}</span>
<span style="color: #C00000; font-weight: normal;">\begin</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">document</span></span><span style="color: #E02020; ">}</span>
	Hello World!
<span style="color: #C00000; font-weight: normal;">\end</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">document</span></span><span style="color: #E02020; ">}</span></pre></td></tr></table></div>


<div class="wp_codebox"><table><tr id="p119156"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p119code156"><pre class="bash" style="font-family:monospace;">pdflatex test.tex</pre></td></tr></table></div>

<p>可以看到那些熟悉的文件，特别是那个PDF。打开看，“Hello World!”</p>
<p>接下来来中文支持。</p>
<p>看到先人们说那篇“Howto”的方法太慢，又查到了一个快的方法，就是用mkfont脚本。需要的话可以点击这里下载：<a href="http://down.upsuper.org/mkfont.tar.gz">mkfont.tar.gz</a> (96.83 KB)</p>
<p>解压后把需要的字体文件逐个拷贝到mkfont所在文件夹，然后执行mkfont。具体的我以楷体为例：</p>

<div class="wp_codebox"><table><tr id="p119157"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p119code157"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">time</span> .<span style="color: #000000; font-weight: bold;">/</span>mkfont.sh simkai.ttf simkai kai</pre></td></tr></table></div>

<p>前面那个time是用来计时的，我看了一下，在我的机上，一个字体大概需要用2分半左右生成。</p>
<p>另外就是宋体，宋体必须要用Windows 98所带的宋体，不然不支持。如果手头有Windows 98的安装盘可以找到很多cab的那个目录，执行：</p>

<div class="wp_codebox"><table><tr id="p119158"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p119code158"><pre class="bash" style="font-family:monospace;">cabextract <span style="color: #660033;">-F</span> simsun.ttf cab目录<span style="color: #000000; font-weight: bold;">/</span>Win98_58.cab</pre></td></tr></table></div>

<p>即可获得可用的宋体。如果实在没有，可以点击这里下载：<a href="http://down.upsuper.org/simsun.ttf.7z">simsun.ttf.7z</a> (4.8 MB)</p>
<p>接下来与楷体一样的，执行</p>

<div class="wp_codebox"><table><tr id="p119159"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p119code159"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">time</span> .<span style="color: #000000; font-weight: bold;">/</span>mkfont.sh simsun.ttf simsun song</pre></td></tr></table></div>

<p>同样的方法我还转换了黑体和仿宋。</p>
<p>最后找到主文件夹下有一个“texmf”文件夹，将里面的东西拷贝到“~/.texlive2007/texmf-var”文件夹下即可。</p>
<p>下面来测试一下各个字体：</p>

<div class="wp_codebox"><table><tr id="p119160"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p119code160"><pre class="latex" style="font-family:monospace;"><span style="color: #E02020; ">\</span><span style="color: #800000;">documentclass</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">article</span><span style="color: #E02020; ">}</span>
<span style="color: #E02020; ">\</span><span style="color: #800000;">usepackage</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">CJKutf8</span><span style="color: #E02020; ">}</span>
<span style="color: #C00000; font-weight: normal;">\begin</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">document</span></span><span style="color: #E02020; ">}</span>
<span style="color: #C00000; font-weight: normal;">\begin</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">CJK*</span></span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">UTF8</span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">song</span><span style="color: #E02020; ">}</span>
你好!
<span style="color: #C00000; font-weight: normal;">\end</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">CJK*</span></span><span style="color: #E02020; ">}</span>
<span style="color: #C00000; font-weight: normal;">\begin</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">CJK*</span></span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">UTF8</span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">kai</span><span style="color: #E02020; ">}</span>
你好!
<span style="color: #C00000; font-weight: normal;">\end</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">CJK*</span></span><span style="color: #E02020; ">}</span>
<span style="color: #C00000; font-weight: normal;">\begin</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">CJK*</span></span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">UTF8</span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">hei</span><span style="color: #E02020; ">}</span>
你好!
<span style="color: #C00000; font-weight: normal;">\end</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">CJK*</span></span><span style="color: #E02020; ">}</span>
<span style="color: #C00000; font-weight: normal;">\begin</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">CJK*</span></span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">UTF8</span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">fang</span><span style="color: #E02020; ">}</span>
你好!
<span style="color: #C00000; font-weight: normal;">\end</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">CJK*</span></span><span style="color: #E02020; ">}</span>
<span style="color: #C00000; font-weight: normal;">\end</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">document</span></span><span style="color: #E02020; ">}</span></pre></td></tr></table></div>

<p>成功了！而且还可以正常复制中文，在Windows下也可以正常查看！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/ubuntu-trip-7-latex-return/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu之旅（六）</title>
		<link>http://blog.upsuper.org/ubuntu-trip-6/</link>
		<comments>http://blog.upsuper.org/ubuntu-trip-6/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 14:45:49 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[tor]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Wine]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=118</guid>
		<description><![CDATA[又想起原来的百战天虫，觉得Ubuntu下玩不了实在是可惜啊。虽然据说Ubuntu下有一个仿虫子的游戏——Wormsx，不过个人感觉还是比不过百战天虫。 研究了一下Wine，但终是没有成功地跑起来。后来改用Cedega，终于成功了！ Cedega的安装是参考这篇文章的。至于下载，因为文件太大了，我也没法放过来，这是下载链接，失效不做保证……下载后只要在安装的时候去掉自动升级（Check for Updates），并且点击安装本地包（Install Local Package）就可以不用交钱了。其他还是比较简单的，一步一步安装就可以了。安装完以后就到“应用程序”菜单里的“游戏”找，就可以看到了。 另外终于知道LAMP Server那个包在新立得的哪里了……大家自己去探究吧……安装完以后发现什么Apache、MySQL的服务全部都自动启动，貌似很耗资源的样子，就想不让他们自动启动。找一下资料，发现一个叫bum的小程序，可以直接用apt-get安装，安装后在sudo下运行即可，很方便易用的。 还有就是破网了。在Windows下的时候有几个相当不错的小程序，现在只能用tor了。tor和privoxy的安装都很简单，直接用apt-get，只不过安装完后要编辑/etc/privoxy/config文件，在第一行加上 1 forward-socks4a / localhost:9050 . 注意最后那一个点！ 觉得只有tor看了不爽，又想起了Windows下用的那个图形界面的Vidalia。Ubuntu下不能用apt-get安装的软件就是比较麻烦！从Vidalia的网站上下载了源代码安装包（连deb包都没有……），然后参考上面的文章开始安装。先是用apt-get很轻松的安装了qt4-dev-tools和qt4-designer，再输入 1 cmake . &#38;&#38; make 直接提示没有安装cmake……安装完后再次输入，提示“CMake Error: Qt qmake not found!“，查一下qmake是什么……bash提示说包含在libqt4-dev和qt3-dev-tools中，我就又用apt-get安装了libqt4-dev，终于可以正常安装了！另外提醒，千万不要把它解压到含中文的文件夹，解压到中文文件夹不知道什么地方有问题，就安装不下去了…… 最后执行“sudo make install“就可以了，一定要用sudo，不然会出错……运行Vidalia，不能正常连接到tor，我无语…… 大概就这样吧，在Ubuntu下还有太多东西可以写了……很多做了就忘了，慢慢来吧。不过我觉得Ubuntu真的已经可以顶替Windows了。]]></description>
			<content:encoded><![CDATA[<p>又想起原来的百战天虫，觉得Ubuntu下玩不了实在是可惜啊。虽然据说Ubuntu下有一个仿虫子的游戏——Wormsx，不过个人感觉还是比不过百战天虫。</p>
<p>研究了一下Wine，但终是没有成功地跑起来。后来改用Cedega，终于成功了！</p>
<p><span id="more-118"></span></p>
<p>Cedega的安装是参考<a href="http://blog.csdn.net/guo_wangwei/archive/2007/05/18/1615415.aspx" target="_blank">这篇文章</a>的。至于下载，因为文件太大了，我也没法放过来，<a href="http://linuxdesktop.cn/wp-content/uploads/2007/05/cedega.6.0.tar.bz2">这是下载链接</a>，失效不做保证……下载后只要在安装的时候去掉自动升级（Check for Updates），并且点击安装本地包（Install Local Package）就可以不用交钱了。其他还是比较简单的，一步一步安装就可以了。安装完以后就到“应用程序”菜单里的“游戏”找，就可以看到了。</p>
<p>另外终于知道LAMP Server那个包在新立得的哪里了……大家自己去探究吧……安装完以后发现什么Apache、MySQL的服务全部都自动启动，貌似很耗资源的样子，就想不让他们自动启动。找一下资料，发现一个叫bum的小程序，可以直接用apt-get安装，安装后在sudo下运行即可，很方便易用的。</p>
<p>还有就是破网了。在Windows下的时候有几个相当不错的小程序，现在只能用tor了。tor和privoxy的安装都很简单，直接用apt-get，只不过安装完后要编辑/etc/privoxy/config文件，在第一行加上</p>

<div class="wp_codebox"><table><tr id="p118163"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p118code163"><pre class="text" style="font-family:monospace;">forward-socks4a / localhost:9050 .</pre></td></tr></table></div>

<p><strong>注意最后那一个点！</strong></p>
<p>觉得只有tor看了不爽，又想起了Windows下用的那个图形界面的Vidalia。Ubuntu下不能用apt-get安装的软件就是比较麻烦！从<a href="http://www.vidalia-project.net/download.php" target="_blank">Vidalia的网站</a>上下载了源代码安装包（连deb包都没有……），然后参考<a href="http://trac.vidalia-project.net/wiki/InstallSource" target="_blank">上面的文章</a>开始安装。先是用apt-get很轻松的安装了qt4-dev-tools和qt4-designer，再输入</p>

<div class="wp_codebox"><table><tr id="p118164"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p118code164"><pre class="bash" style="font-family:monospace;">cmake . <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">make</span></pre></td></tr></table></div>

<p>直接提示没有安装cmake……安装完后再次输入，提示“CMake Error: Qt qmake not found!“，查一下qmake是什么……bash提示说包含在libqt4-dev和qt3-dev-tools中，我就又用apt-get安装了libqt4-dev，终于可以正常安装了！<strong>另外提醒，千万不要把它解压到含中文的文件夹，解压到中文文件夹不知道什么地方有问题，就安装不下去了……</strong></p>
<p>最后执行“sudo make install“就可以了，<strong>一定要用sudo</strong>，不然会出错……运行Vidalia，不能正常连接到tor，我无语……</p>
<p>大概就这样吧，在Ubuntu下还有太多东西可以写了……很多做了就忘了，慢慢来吧。不过我觉得Ubuntu真的已经可以顶替Windows了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/ubuntu-trip-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

