<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">



<title type="text">CODING IS FUN</title>
<generator uri="https://github.com/mojombo/jekyll">Jekyll</generator>
<link rel="self" type="application/atom+xml" href="https://www.kissuki.com/feed.xml" />
<link rel="alternate" type="text/html" href="https://www.kissuki.com/" />
<updated>2022-09-09T17:56:48+08:00</updated>
<id>https://www.kissuki.com/</id>
<author>
  <name>Iven Hsu</name>
  <uri>https://www.kissuki.com/</uri>
  <email>ivenvd@gmail.com</email>
</author>


<entry>
  <title type="html"><![CDATA[Marathon 0.7.0 中的新特性]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2014/09/25/marathon-0-7-0"/>
  <id>https://www.kissuki.com/blog/2014/09/25/marathon-0-7-0</id>
  <published>2014-09-25T00:00:00+08:00</published>
  <updated>2014-09-25 23:28:26 +0800T00:00:00-00:00</updated>
  
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#mesos" term="mesos" /><category scheme="https://www.kissuki.com/tags/#marathon" term="marathon" />
  <content type="html">
  
    &lt;p&gt;&lt;a href=&quot;https://github.com/mesosphere/marathon&quot;&gt;Marathon&lt;/a&gt; 是基于 Mesos 的分布式服务管理平台，功能相当于 Upstart/systemd 等 init 系统，只不过 Marathon 是用于集群的，用于建立 PaaS 十分方便。&lt;/p&gt;

&lt;p&gt;Marathon 0.7.0 版本，带来了很多新特性，说是其诞生以来最大的改动也说不定。根据官方说明，主要有以下几点。&lt;/p&gt;

&lt;h1 id=&quot;原生-docker-支持&quot;&gt;原生 Docker 支持&lt;/h1&gt;

&lt;p&gt;就如&lt;a href=&quot;/blog/2014/08/24/mesoscon&quot;&gt;之前所说&lt;/a&gt;，Mesos 0.20 带来了原生的 Docker 支持，而不再使用不完善的 mesos-docker 或者 deimos 作为插件形式存在。&lt;/p&gt;

&lt;p&gt;现在，Marathon 不再自行调用 docker 命令，也不再借助第三方的 deimos 来调用，而是在构建任务信息的时候，直接构建 container 信息，发送给 Mesos，由 Mesos 内部的 Docker containerizer 来进行操作。&lt;/p&gt;

&lt;p&gt;这样无疑整合性更好，稳定性等方面都会有提升。&lt;/p&gt;

&lt;h1 id=&quot;应用程序组&quot;&gt;应用程序组&lt;/h1&gt;

&lt;p&gt;Marathon 现在支持将运行在其上的应用程序/服务分组，便于统一管理。&lt;/p&gt;

&lt;h2 id=&quot;组依赖&quot;&gt;组依赖&lt;/h2&gt;

&lt;p&gt;分组之后，可以指定两个组的依赖关系，比如&lt;strong&gt;Web 后端&lt;/strong&gt;组可以依赖于&lt;strong&gt;数据库&lt;/strong&gt;组。这样在启动、关闭、删除等操作时，Marathon 会考虑依赖关系，按顺序启动和关闭。&lt;/p&gt;

&lt;h2 id=&quot;组扩展&quot;&gt;组扩展&lt;/h2&gt;

&lt;p&gt;假如将应用程序 A、B、C 合并成 group1，那么如果对 group1 进行 Scale，比如增加 50% 的实例，那么 A、B、C 三个应用程序都会增加 50% 的实例。&lt;/p&gt;

&lt;p&gt;这对 Auto Scaling 很有用，Web 后端和数据库等可以根据负载大小同时进行扩展。&lt;/p&gt;

&lt;h1 id=&quot;滚动部署&quot;&gt;滚动部署&lt;/h1&gt;

&lt;p&gt;这是一个期待已久的改进。之前应用程序升级的时候，就面临一个问题：必须重启所有实例，才能使新的代码生效，而如果同时重启所有实例，就意味着服务中断。如何保证服务质量的同时进行升级，就成为一个重要问题。&lt;/p&gt;

&lt;p&gt;Marathon 0.7.0 为此问题提供了一个解决方案：你可以为应用程序指定一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;minimumHealthCapacity&lt;/code&gt; 参数，比如设置为 0.6，那就表示 Marathon 会在整个升级过程中保证 60% 的实例是正常服务的。&lt;/p&gt;

&lt;p&gt;为什么不设置成 100% 呢？这要从升级的步骤说起，假设是 60%，那么 Marathon 会：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;将旧实例 Scale 到 60%。&lt;/li&gt;
  &lt;li&gt;启动 60% 的新实例。&lt;/li&gt;
  &lt;li&gt;销毁所有旧实例。&lt;/li&gt;
  &lt;li&gt;启动剩下 40% 的新实例。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;也就是说，设置成 60% 的时候，最多会占用 120% 的集群资源（第二步）。那么如果设置成 100%，峰值就会达到 200%，需要保证集群有足够资源才行。&lt;/p&gt;

&lt;h1 id=&quot;artifact-store&quot;&gt;Artifact Store&lt;/h1&gt;

&lt;p&gt;新版 Marathon 的一个可选功能，主要是用于非 Docker 环境下，作为一个存储缓存来用。&lt;/p&gt;

&lt;p&gt;在不使用 Docker 的时候，往往是使用一个源码/二进制压缩包来部署应用程序，这时 Marathon 可以自动将这些压缩包下载，然后缓存到 HDFS 等存储上，来达到减少下载服务器压力、提高部署速度等目的。&lt;/p&gt;

&lt;p&gt;Docker 由于有自己的 Docker Repository，所以在使用 Docker 的时候不需要这个功能。&lt;/p&gt;

&lt;h1 id=&quot;健康检查&quot;&gt;健康检查&lt;/h1&gt;

&lt;p&gt;Marathon 现在支持 Mesos 的 Executor 健康检查功能，可以通过 HTTP、TCP 等方式，检查 Executor 是否处于健康状态。&lt;/p&gt;

&lt;p&gt;这对于应用程序的升级、监控等很有用处。如果使用 nginx 等做负载均衡的话，也可以据此判断是否需要分配负载到不健康的 Executor 上。&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;Marathon 现在越来越成熟了，从 0.5.1 像玩具一样的功能，慢慢成长为一个完整成熟的系统了，滚动部署、健康检查等功能的加入，说明 Marathon 已经越来越考虑生产环境下对容错、稳定性等的需求。&lt;/p&gt;

&lt;p&gt;再加上 Mesos 对 Docker 支持的完善（Mesos 0.20.1 已经&lt;a href=&quot;http://mesos.apache.org/blog/mesos-0-20-1-released/&quot;&gt;发布&lt;/a&gt;了，修复了很多 Docker 支持相关的问题），基于两者建成一个功能强大的 PaaS 系统，看来不是问题。&lt;/p&gt;

  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2014/09/25/marathon-0-7-0&quot;&gt;Marathon 0.7.0 中的新特性&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on September 25, 2014.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[《程序员》杂志约稿]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2014/09/19/programmer-article"/>
  <id>https://www.kissuki.com/blog/2014/09/19/programmer-article</id>
  <published>2014-09-19T00:00:00+08:00</published>
  <updated>2014-09-19 09:02:10 +0800T00:00:00-00:00</updated>
  
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#life" term="life" /><category scheme="https://www.kissuki.com/tags/#docker" term="docker" />
  <content type="html">
  
    &lt;p&gt;请购买&lt;a href=&quot;http://www.csdn.net/article/2014-09-01/2821476&quot;&gt;《程序员》杂志 2014.09 期&lt;/a&gt;！喏喏就是这个：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.kissuki.com/images/2014/09/programmer_cover.jpg&quot; alt=&quot;《程序员》杂志封面&quot; /&gt;&lt;/p&gt;

&lt;p&gt;看到右面最炫酷的那个标题了么？&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.kissuki.com/images/2014/09/programmer_title.jpg&quot; alt=&quot;《程序员》稿件标题&quot; /&gt;&lt;/p&gt;

&lt;p&gt;有没有发现其中一个作者很棒？没错就是我！&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.kissuki.com/images/2014/09/programmer_authors.jpg&quot; alt=&quot;《程序员》稿件作者信息&quot; /&gt;&lt;/p&gt;

&lt;p&gt;还不快去买？&lt;/p&gt;

  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2014/09/19/programmer-article&quot;&gt;《程序员》杂志约稿&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on September 19, 2014.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[MesosCon 2014]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2014/08/24/mesoscon"/>
  <id>https://www.kissuki.com/blog/2014/08/24/mesoscon</id>
  <published>2014-08-24T00:00:00+08:00</published>
  <updated>2014-08-24 23:42:02 +0800T00:00:00-00:00</updated>
  
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#mesos" term="mesos" /><category scheme="https://www.kissuki.com/tags/#docker" term="docker" />
  <content type="html">
  
    &lt;p&gt;最近有计划重拾 Blog，写一些工作相关的事情。目前做的工作和 Mesos、Docker、Spark 等相关，所以主要也就是这些。&lt;/p&gt;

&lt;h1 id=&quot;mesos-和-mesoscon&quot;&gt;Mesos 和 MesosCon&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;http://mesos.apache.org/&quot;&gt;Apache Mesos&lt;/a&gt; 是伯克利 &lt;a href=&quot;https://amplab.cs.berkeley.edu/&quot;&gt;AMPLab&lt;/a&gt; 开发的一套集群资源管理系统，简单来说就是能将各种长短任务、服务、大数据计算（比如 Hadoop、Spark、Storm）等等全都整合在一个集群中的一套系统。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://mesoscon.org/&quot;&gt;MesosCon&lt;/a&gt; 顾名思义，就是 Mesos 的技术峰会，各种使用 Mesos 技术，或者相关的公司（Twitter、Netflix、Google 等）会轮番到上面吹牛。这次是第一次 MesosCon，8 月 21 日在芝加哥举行。&lt;/p&gt;

&lt;p&gt;下面就说说一些吹牛中的亮点，完整的日程在&lt;a href=&quot;http://mesoscon14.sched.org/&quot;&gt;这里&lt;/a&gt;。&lt;/p&gt;

&lt;h1 id=&quot;mesos-0200&quot;&gt;Mesos 0.20.0&lt;/h1&gt;

&lt;p&gt;首先是 Mesos 的新版本特性：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;原生的 Docker 支持。也就是用 Docker 来隔离任务，这无疑是众望所归。&lt;/li&gt;
  &lt;li&gt;支持在一台机器上使用多个 Containerizer。如果我没理解错，意思就是现在可以让 Hadoop 运行在 CGroups 隔离上，而 Marathon 运行在 Docker 基础上。这样 Docker 更加实用化了，因为为 Hadoop 这种不怎么需要文件系统隔离的框架做个 Docker 镜像，实在不怎么值得。不过 Docker 支持应该还是处于早期状态，估计不会太稳定。&lt;/li&gt;
  &lt;li&gt;Container 级别 Containerizer 的网络监控，会将数据暴露在 HTTP endpoint 里。&lt;/li&gt;
  &lt;li&gt;框架的用户管理功能，允许授权用户来提交任务，乃至远程关闭框架。&lt;/li&gt;
  &lt;li&gt;框架的频次限制功能，这样可以保证重要性较低的框架（开发、测试的框架）不会抢占重要性较高的框架（线上框架）。&lt;/li&gt;
  &lt;li&gt;一些原本 bundle 的第三方库（glog、libev 等）被分离出来，用户可以使用系统自带的库了。&lt;/li&gt;
  &lt;li&gt;一些 HTTP endpoint 的修改。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;到目前为止，Mesos 0.20.0 还没正式发布，不过根据邮件列表，rc2 应该就是正式版本了。&lt;/p&gt;

&lt;h1 id=&quot;第一天&quot;&gt;第一天&lt;/h1&gt;

&lt;p&gt;第一天主要是各大公司介(chui)绍(xu)自己的产品，视频和 Slides 似乎还没有放出来。其中的亮点有：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/HubSpot/Singularity&quot;&gt;Singularity&lt;/a&gt;: &lt;a href=&quot;http://www.hubspot.com/&quot;&gt;HubSpot&lt;/a&gt; 开发的新的 Mesos 框架，亮点是可以同时运行和管理长短任务、一次性任务和定时任务等。从截图来看似乎还比较早期，不过文档比较全。&lt;/li&gt;
  &lt;li&gt;eBay 演示了 Mesos 上运行 YARN。&lt;/li&gt;
  &lt;li&gt;Twitter 再次演示了 Aurora。&lt;/li&gt;
  &lt;li&gt;另外 Google、Netflix、Docker、Airbnb、Atlassian、Mesosphere 等公司也都介绍了自己的相关经验。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;第二天&quot;&gt;第二天&lt;/h1&gt;

&lt;p&gt;MesosCon 第二天举行了黑客马拉松，涌现了一批有趣的项目，比如：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/mesosphere/tachyon-mesos&quot;&gt;Tachyon-Mesos&lt;/a&gt;: 在 Mesos 上运行 &lt;a href=&quot;http://tachyon-project.org/&quot;&gt;Tachyon&lt;/a&gt;。&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/opentable/mesoshub&quot;&gt;mesoshub&lt;/a&gt;: Marathon 和 HAProxy 整合的 Web UI。&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/wickman/pesos&quot;&gt;pesos&lt;/a&gt;: 纯 Python 实现的 Mesos 框架 API。&lt;/li&gt;
  &lt;li&gt;Jenkins on Mesos 的改进：在 Docker 中运行 Jenkins Slave。&lt;/li&gt;
  &lt;li&gt;HA HDFS on Mesos。&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/edpaget/riak-mesos&quot;&gt;riak-mesos&lt;/a&gt;: 在 Mesos 上运行分布式数据库 &lt;a href=&quot;http://basho.com/riak/&quot;&gt;Riak&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;总体来说 Mesos 还是欣欣向荣的，各种知名公司来抛头露面。没怎么关注 YARN 社区，不知道那边怎么样。&lt;/p&gt;

  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2014/08/24/mesoscon&quot;&gt;MesosCon 2014&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on August 24, 2014.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[最近折腾的一些新 Vim 插件]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2013/07/12/new-vim-plugins"/>
  <id>https://www.kissuki.com/blog/2013/07/12/new-vim-plugins</id>
  <published>2013-07-12T21:51:00+08:00</published>
  <updated>2013-07-12T21:51:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#vim" term="vim" />
  <content type="html">
  
    &lt;p&gt;最近又&lt;del&gt;带薪&lt;/del&gt;折腾 Vim 了，找到很多有意思的插件，在此分享一下。这里以 VAM（Vim Addon Manager）中的名字为准，大家可以直接添加这些名字安装相应插件。&lt;/p&gt;

&lt;h1 id=&quot;sensible&quot;&gt;sensible&lt;/h1&gt;

&lt;p&gt;相信大家的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.vimrc&lt;/code&gt; 里面都设置了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;syntax enable&lt;/code&gt; 之类的选项， sensible 这个插件就收集了很多这样“显而易见”应该被设置的选项，开启这个插件，让你的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.vimrc&lt;/code&gt; 干净一些吧~&lt;/p&gt;

&lt;h1 id=&quot;ctrlp&quot;&gt;ctrlp&lt;/h1&gt;

&lt;p&gt;是不是觉得 Command-T 拖慢了你的启动速度？每次更新要重新编译也很麻烦？ctrlp 是这样一个有纯 vimscript 编写的文件检索插件。&lt;/p&gt;

&lt;p&gt;它很贴心的一个功能是会根据版本控制系统自动确定项目根目录，查找文件实在是比 Command-T 死板的方式顺手多了。而且与后者的快捷键是兼容的哦。&lt;/p&gt;

&lt;h1 id=&quot;ag&quot;&gt;ag&lt;/h1&gt;

&lt;p&gt;还在用老掉牙的 ack 么？ ag 使用纯 C 编写，相比 Perl 编写的 ack 速度快了不止一倍！当然该有的功能一个不少啦，另外你还可以享受名字短 33% 带来的优势！&lt;/p&gt;

&lt;h1 id=&quot;obsession&quot;&gt;obsession&lt;/h1&gt;

&lt;p&gt;是不是觉得每次手动 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:mks&lt;/code&gt; 保存会话很不方便？本插件可以自动记录会话信息，不过美中不足是你要告诉它什么时候开始记录……&lt;/p&gt;

&lt;h1 id=&quot;vim-signify&quot;&gt;vim-signify&lt;/h1&gt;

&lt;p&gt;帅气的插件！每当你保存文件，它会在左边标示出你相对于上次 commit 添加、删除、修改的行，这下不用去看不知所云的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git diff&lt;/code&gt; 了。它还支持多种版本控制系统，虽然我只用 git ……&lt;/p&gt;

&lt;h1 id=&quot;youcompleteme&quot;&gt;YouCompleteMe&lt;/h1&gt;

&lt;p&gt;听说有 Clang 整合，所以写 C 系语言很不错，尤其可以和 Synastic 整合，实时标示出语法错误！可惜写 Python 的时候似乎不行，补全相比 neocomplcache 似乎也没啥明显优势……&lt;/p&gt;

&lt;h1 id=&quot;ultisnips&quot;&gt;UltiSnips&lt;/h1&gt;

&lt;p&gt;似乎是当前代码片段插件的首选，用了还没啥感觉……&lt;/p&gt;

&lt;p&gt;好了，就到这里了，图啥的懒得上了。大家有啥新奇插件或者好的替代品欢迎留言啊！&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2013/07/12/new-vim-plugins&quot;&gt;最近折腾的一些新 Vim 插件&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on July 12, 2013.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[在 Arch 中安装 Arch]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2013/06/30/arch-in-lxc"/>
  <id>https://www.kissuki.com/blog/2013/06/30/arch-in-lxc</id>
  <published>2013-06-30T23:48:00+08:00</published>
  <updated>2013-06-30T23:48:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#gconf" term="gconf" /><category scheme="https://www.kissuki.com/tags/#ubuntu" term="ubuntu" />
  <content type="html">
  
    &lt;p&gt;为了业界良心我又回来写博客了。&lt;/p&gt;

&lt;p&gt;工作的原因接触虚机技术比较多，周末没事就搭了个 LXC 玩玩，当然也有很大部分因素是依云兄&lt;a href=&quot;http://lilydjwg.is-programmer.com/2013/4/15/first-time-lxc.38857.html&quot;&gt;那篇文章&lt;/a&gt;的鼓动。过程稍微有点麻烦，记录一下。（什么你不知道什么是 LXC？LXC 就是那个啥啊，算了懒得解释。）&lt;/p&gt;

&lt;h1 id=&quot;参考资料&quot;&gt;参考资料&lt;/h1&gt;

&lt;p&gt;根据倒序原则，先上资料（排名不分先后 ;D）：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.archlinux.org/index.php/Linux_Containers&quot;&gt;Arch Wiki&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.funtoo.org/Linux_Containers&quot;&gt;Funtoo Wiki&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://wiki.gentoo.org/wiki/LXC&quot;&gt;Gentoo Wiki&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://lxc.sourceforge.net/man/lxc.html&quot;&gt;LXC Manual&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://lxc.teegra.net/&quot;&gt;LXC Howto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;宿主机配置&quot;&gt;宿主机配置&lt;/h1&gt;

&lt;h2 id=&quot;编译内核&quot;&gt;编译内核&lt;/h2&gt;

&lt;p&gt;这里宿主机和客户机都是
Arch，宿主机上的配置主要是重新编译内核，之前下不定决心搞就是因为这个，不过其实花不了多长时间。所需内核参数见上面的参考资料。&lt;/p&gt;

&lt;h2 id=&quot;安装工具&quot;&gt;安装工具&lt;/h2&gt;

&lt;p&gt;重启后安装 LXC 相关工具：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;yaourt &lt;span class=&quot;nt&quot;&gt;-S&lt;/span&gt; lxc bridge-utils&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;配置网络&quot;&gt;配置网络&lt;/h2&gt;

&lt;p&gt;我用的无线网卡，不能桥接，只能 NAT 转发。用有线的话估计 NetworkManager
就能配置了。&lt;/p&gt;

&lt;p&gt;这里说 NAT 转发的做法，抄自依云兄：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;brctl addbr br0
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ip a change 192.168.10.1/24 dev br0
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ip l &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;br0 up
&lt;span class=&quot;go&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;1 &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /proc/sys/net/ipv4/ip_forward
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;iptables &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; POSTROUTING &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; 192.168.10.0/24 &lt;span class=&quot;nt&quot;&gt;-j&lt;/span&gt; MASQUERADE&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;OK，搞定。&lt;/p&gt;

&lt;h1 id=&quot;安装客户机&quot;&gt;安装客户机&lt;/h1&gt;

&lt;h2 id=&quot;创建虚拟机&quot;&gt;创建虚拟机&lt;/h2&gt;

&lt;p&gt;首先保证你 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pacman.conf&lt;/code&gt; 中所有 Repo 都能连上，然后执行：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;yaourt &lt;span class=&quot;nt&quot;&gt;-S&lt;/span&gt; arch-install-scripts
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lxc-create &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;arch&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; archlinux &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-P&lt;/span&gt; vim,dhclient&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;这样就在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/lib/lxc/arch/&lt;/code&gt; 下面创建了一个 Arch Linux
模板的名叫“arch”的虚拟机，并且安装了 vim 和 dhclient 两个包。&lt;/p&gt;

&lt;p&gt;对于 btrfs 系统，LXC 很贴心地自动创建了一个
subvolume，这意味着虚拟机的克隆和快照都可以用 btrfs
本身的特性来做到，酷得想舔。&lt;/p&gt;

&lt;h2 id=&quot;修改配置&quot;&gt;修改配置&lt;/h2&gt;

&lt;p&gt;修改 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/lib/lxc/arch/config&lt;/code&gt; ，加入一行：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;nx&quot;&gt;lxc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;network&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ipv4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;192.168&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;10.2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;24&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;苦逼无线再次伤不起。&lt;/p&gt;

&lt;h2 id=&quot;启动虚拟机&quot;&gt;启动虚拟机&lt;/h2&gt;

&lt;p&gt;OK 开机：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lxc-start &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;arch&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;登陆后还是不能上网（三咒无线网卡），需要加个 route，虚拟机里执行：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ip route add default via 192.168.10.1 dev eth0&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;现在可以了欧烨。&lt;/p&gt;

&lt;h2 id=&quot;关闭虚拟机&quot;&gt;关闭虚拟机&lt;/h2&gt;

&lt;p&gt;差点忘了这事，不会关机就搞笑了：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lxc-shutdown &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;arch&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;不过 systemd 跟 LXC 默认不太兼容，需要提前在虚拟机里修复一下：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; /usr/lib/systemd/system/poweroff.target /etc/systemd/system/sigpwr.target
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;systemctl daemon-reload&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;LXC 作为 container 技术，相比 KVM、ESX
什么的优点太明显了，不仅性能高，资源占用低，文件交换也方便，管理起来应该也简单。不过听说
LXC 还不怎么成熟，隔离性貌似也不是很好，还有处理 /dev
什么的也很烦，还只能共用一个内核。谁知道呢。&lt;/p&gt;

&lt;p&gt;印象很深的是开机速度，不知道是不是 Arch
启动速度本身违法也有关系，这虚拟机开机时间就跟 ls
一下一样啊你妹，一点儿没有实感和成就感……想想 KVM + CentOS
那启动速度，真是云泥之别啊。&lt;/p&gt;

&lt;p&gt;听说 LXC 完全兼容 OpenVZ 的模板？改天试试。&lt;/p&gt;

&lt;p&gt;好的观众朋友们，本期的的讲解就到这里，我们下回见。&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2013/06/30/arch-in-lxc&quot;&gt;在 Arch 中安装 Arch&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on June 30, 2013.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[KWin 可能官方支持 Appmenu]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2012/08/21/kwin-appmenu-tries-to-be-official"/>
  <id>https://www.kissuki.com/blog/2012/08/21/kwin-appmenu-tries-to-be-official</id>
  <published>2012-08-21T02:05:00+08:00</published>
  <updated>2012-08-21T02:05:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#kwin" term="kwin" /><category scheme="https://www.kissuki.com/tags/#appmenu" term="appmenu" />
  <content type="html">
  
    &lt;p&gt;Appmenu 是什么？看视频：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://youtu.be/x1bm7Q6_SH4&quot;&gt;http://youtu.be/x1bm7Q6_SH4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;简单来说，就是通过 DBusMenu
将原本的菜单栏，变成标题栏中的一个按钮，以节省空间。视频中还支持另外一种类似全局菜单的布局，适合不同需要的人。&lt;/p&gt;

&lt;p&gt;目前这种支持是非官方的，需要通过补丁才能够使用， Arch 用户可以安装 AUR
中的 kde-workspace-appmenu 包，当然只对 KDE 用户有用……&lt;/p&gt;

&lt;p&gt;现在，作者正在努力将代码提交到主线，快的话，可能 KDE 4.10 的时候， KWin
就有这个功能啦（当然是可选的）！个人觉得这种支持对于大屏幕来说，比全局菜单更实用，大家觉得呢？&lt;/p&gt;

&lt;p&gt;如果你关注代码审核动态，可以关注 &lt;a href=&quot;https://git.reviewboard.kde.org/r/104344/&quot;&gt;KDE 的
ReviewBoard&lt;/a&gt;
，另外，项目的代码在
&lt;a href=&quot;http://gitorious.org/~megabigbug/kde-workspace-appmenu/megabigbugs-kde-workspace-appmenu&quot;&gt;Gitorious&lt;/a&gt;
，有兴趣的话可以研究一下。&lt;/p&gt;

&lt;p&gt;PS: 这年头更新技术博客的都是业界良心～ ^_^&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2012/08/21/kwin-appmenu-tries-to-be-official&quot;&gt;KWin 可能官方支持 Appmenu&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on August 21, 2012.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[那些在 Python 3 中闪亮的]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2011/11/15/whats-new-in-python-3"/>
  <id>https://www.kissuki.com/blog/2011/11/15/whats-new-in-python-3</id>
  <published>2011-11-15T13:57:00+08:00</published>
  <updated>2011-11-15T13:57:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#python" term="python" />
  <content type="html">
  
    &lt;p&gt;大家好，又到了科普时间，咳咳。&lt;/p&gt;

&lt;p&gt;距离 Python 3 发布已经有一段时间了，主流发行版都已经带了 Python 3
的软件包，甚至 Arch 等发行版还将其设为了默认的 Python
版本。多数的库也已经带了 Python 3 的支持（也有 Twisted、Django
等例外），是不是偶尔也想着要不要将自己的程序升级一下呢？&lt;/p&gt;

&lt;p&gt;昨天稍微有时间研究了一下 Python
3，就将我在文档中找到的有趣新特性分享给大家。&lt;/p&gt;

&lt;h1 id=&quot;默认返回迭代器iterator&quot;&gt;默认返回迭代器（Iterator）&lt;/h1&gt;

&lt;p&gt;print 成为一个函数、默认不用地板除（Floor
Divide）之类的我就不说了，想必地球人都知道有这么回事。&lt;/p&gt;

&lt;p&gt;值得一提的是，原来需要使用 xrange 、 iteritems
等等函数和方法才能返回的迭代器现在成为了默认，替代了原来返回列表的函数。就连
map 、 filter 、 zip 等函数都返回迭代器了。&lt;/p&gt;

&lt;p&gt;大家都知道相对于返回完整的列表，迭代器省去了一次生成所有元素的开销，并且在循环
break
的时候，就停止迭代，防止了额外的开销，所以一般情况下迭代器要比列表快得多。&lt;/p&gt;

&lt;p&gt;如果你仍然需要完整列表，可以通过 list(some_iter)
构造，不过这种问题往往使用列表解析（List comprehension）就能够解决。&lt;/p&gt;

&lt;h1 id=&quot;字符串分为-str-和-bytes&quot;&gt;字符串分为 str 和 bytes&lt;/h1&gt;

&lt;p&gt;在 Python 2 中，字符串分为 ASCII 码表示（‘some text’）和 Unicode
表示（u‘Unicode 字符串’），默认为 ASCII 码。&lt;/p&gt;

&lt;p&gt;不过在 Python 3 中，默认就是万能的 Unicode
码了，所以字符串前面不用加字母 u 也可以写 Unicode
了，当然这不是重点，重点是不会有各种 ASCII 和 Unicode
转换和混用带来的错误了。&lt;/p&gt;

&lt;p&gt;另外， Python 3 中增加了一种 bytes
对象（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;b‘\xb6\xfe\xbd\xf8\xd6\xc6\xca\xfd\xbe\xdd’&lt;/code&gt;），专门用来表示编码后的（二进制）数据，所以现在对字符串的编码就是从
str 到 bytes
的转换，反之亦然，两者不能混用，这样编码与否一目了然，免除了很多错误。&lt;/p&gt;

&lt;h2 id=&quot;源文件编码默认为-utf8&quot;&gt;源文件编码默认为 UTF–8&lt;/h2&gt;

&lt;p&gt;Python 3 在字符编码方面有很多改进，其中之一就是默认的源文件编码从 ASCII
变为 UTF–8 ，也就是说以前在文件头加上的各种花样的 coding=utf–8
不再需要了！&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# coding: UTF-8
# vim:fileencoding=UTF-8
# -*- coding=UTF-8 -*-
# vim: set fileencoding=UTF-8&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;标识符支持非-ascii-字符&quot;&gt;标识符支持非 ASCII 字符&lt;/h2&gt;

&lt;p&gt;这个自行理解，易语言表示压力很大。&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-pycon&quot; data-lang=&quot;pycon&quot;&gt;&amp;gt;&amp;gt;&amp;gt; 所有 = all
&amp;gt;&amp;gt;&amp;gt; class 男人:
...     @classmethod
...     def 包括(cls, Ta):
...         return isinstance(Ta, cls)
...
&amp;gt;&amp;gt;&amp;gt; def 一起玩(人们):
...     if 所有(男人.包括(Ta) for Ta in 人们):
...         print('他们是基友')
...     else:
...         print('他们是朋友')
...
&amp;gt;&amp;gt;&amp;gt; 小攻 = 男人()
&amp;gt;&amp;gt;&amp;gt; 小受 = 男人()
&amp;gt;&amp;gt;&amp;gt; 一起玩([小攻,小受])
他们是基友
&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h1 id=&quot;新的字符串格式化语法&quot;&gt;新的字符串格式化语法&lt;/h1&gt;

&lt;p&gt;原来的 %s %d %你妹
语法已经不推荐，并且很快会被弃用，新的字符串格式化方法（2.6 版引入）为
str.format 或者内置函数 format 。比如：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-pycon&quot; data-lang=&quot;pycon&quot;&gt;&amp;gt;&amp;gt;&amp;gt; 三青年 = {'小红':'普通青年','小明':'文艺青年','小亮':'二逼青年'}
&amp;gt;&amp;gt;&amp;gt; '{小红}说我想吃罐头，{小明}说更上一层楼，{小亮}说阿伊呀伊呦。'.format(**三青年)
'普通青年说我想吃罐头，文艺青年说更上一层楼，二逼青年说阿伊呀伊呦。'
&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h1 id=&quot;字典解析和集合解析&quot;&gt;字典解析和集合解析&lt;/h1&gt;

&lt;p&gt;有了列表解析，当然也少不了字典解析：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-pycon&quot; data-lang=&quot;pycon&quot;&gt;&amp;gt;&amp;gt;&amp;gt; {k: v + '青年' for k, v in [('小明', '文艺'), ('小红', '普通'), ('小亮', '二逼')]}
{'小明': '文艺青年', '小红': '普通青年', '小亮': '二逼青年'}
&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;还有集合解析：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-pycon&quot; data-lang=&quot;pycon&quot;&gt;&amp;gt;&amp;gt;&amp;gt; {小吃 for 小吃 in ('豆浆', '油条', '包纸')}
{'油条', '包纸', '豆浆'}
&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h1 id=&quot;有序字典与-configparser&quot;&gt;有序字典与 configparser&lt;/h1&gt;

&lt;p&gt;默认 Python 字典是无序的，不过新引入的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;collections.OrderedDict&lt;/code&gt;
类提供了一种有序字典实现，并且被 configparser 默认使用，现在使用
configparser 类就可以得到有序的 ini 格式配置文件了！&lt;/p&gt;

&lt;p&gt;而 configparser 模块现在完全支持使用类字典的方法进行读写了！你妹，&lt;a href=&quot;/blog/2010/05/07/python-ordered-dict&quot;&gt;我之前的工作&lt;/a&gt;全白做了！&lt;/p&gt;

&lt;h1 id=&quot;abc&quot;&gt;ABC&lt;/h1&gt;

&lt;p&gt;抽象基类（Abstract Base Classes），就是像 C++
里面虚类一样的东西。作为其子类，只有将所有抽象方法都实现，才能实例化。&lt;/p&gt;

&lt;p&gt;抽象基类是对 Duck Typing 的补充，由于引入了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@abstractmethod&lt;/code&gt; ，
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@abstractstaticmethod&lt;/code&gt; ， &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@abstractclassmethod&lt;/code&gt; ， &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@abstractproperty&lt;/code&gt;
四个修饰符，强制抽象方法必须实现，所以可以一定程度上避免错误，用起来感觉比
Duck Typing 安心一些。&lt;/p&gt;

&lt;h1 id=&quot;结局&quot;&gt;结局&lt;/h1&gt;

&lt;p&gt;以上就是我把 Python 3.0 到 3.2 的 What’s new 看了一遍的成果，总体来说
Python 3 本身变得更加规范，更加灵活，如果你的程序不依赖于 Python 2
特有的库的话，来试试 Python 3 很不错！&lt;/p&gt;

&lt;p&gt;结局？结局？结局就是小亮和小红幸福地生活在了一起，小明自己吃豆浆油条包纸。&lt;/p&gt;

&lt;p&gt;（完）&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2011/11/15/whats-new-in-python-3&quot;&gt;那些在 Python 3 中闪亮的&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on November 15, 2011.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[你的下一个文件系统——Btrfs]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2011/08/05/btrfs"/>
  <id>https://www.kissuki.com/blog/2011/08/05/btrfs</id>
  <published>2011-08-05T06:57:00+08:00</published>
  <updated>2011-08-05T06:57:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#btrfs" term="btrfs" />
  <content type="html">
  
    &lt;p&gt;提起 Btrfs ，相信广大折腾帝们都不会陌生，被誉为“下一代 Linux
文件系统”的它，具有扩展性好、支持数据校验、支持多设备管理等等强大特性，使得
Ext4 也只能成为悲剧的过渡产品，还不赶快找一个 Ubuntu 10.10、Fedora
15、Meego 什么的试一下？&lt;/p&gt;

&lt;p&gt;慢着！支持什么多设备、什么数据校验跟你有一毛钱关系啊？根据 &lt;a href=&quot;http://www.phoronix.com/scan.php?page=article&amp;amp;item=linux_3_filesystems&amp;amp;num=1&quot;&gt;Ext4 和
Btrfs
的对比&lt;/a&gt;
，Btrfs 在速度上似乎还差上一些呢！这么说 Btrfs 其实挺垃圾的？&lt;/p&gt;

&lt;p&gt;本文就来为你从普通[STRIKEOUT:折腾帝]用户的角度来解说一下 Btrfs
到底有什么好。如果你想从技术层面了解 Btrfs ，可以看一下《 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/&quot;&gt;新一代 Linux
文件系统 btrfs
简介&lt;/a&gt; 》。&lt;/p&gt;

&lt;p&gt;注意：Btrfs 还处于实验性阶段，截止到本文写作为止，其磁盘检查工具 Btrfsck
还不能修复文件系统，请不要在工作环境下使用
Btrfs，以免数据丢失！再次警告，这不是演习！&lt;/p&gt;

&lt;h1 id=&quot;错误修复&quot;&gt;错误修复&lt;/h1&gt;

&lt;p&gt;在正式开始讲之前，我假定你已经把系统弄坏了，你已经看到了系统提示你“You
are on your own”，“Good luck~”，很好，我之前已经说过 Btrfs
还处于实验阶段了，所以就不要妄想把你的动作片全集找回来啦，乖乖格式化掉吧~&lt;/p&gt;

&lt;p&gt;呃，当然，我们对于有共享精神的同志还是要宽容处理的，如果你真的很想找回来[STRIKEOUT:并且共享给我]，你或许可以去
&lt;a href=&quot;https://wiki.archlinux.org/index.php/Btrfs#Troubleshooting&quot;&gt;Arch Wiki&lt;/a&gt;
上看一下，那里有几条[STRIKEOUT:死马当活马医的]良策，或许可以帮你度过难关，[STRIKEOUT:铁道部]春哥保佑你。&lt;/p&gt;

&lt;h1 id=&quot;其他特性&quot;&gt;其他特性&lt;/h1&gt;

&lt;p&gt;其实 Btrfs 对于普通用户有用的、能看到的特性主要就是其包含了
&lt;strong&gt;卷管理特性&lt;/strong&gt; ，但是为了吊胃口，我们还是从其他特性开始说起吧。&lt;/p&gt;

&lt;h2 id=&quot;其他的其他&quot;&gt;其他的其他&lt;/h2&gt;

&lt;p&gt;Btrfs
支持在线的碎片整理，在线的卷增大和缩小，在线的块设备增添和删除，在线的块设备负载均衡；啥叫在线的呢？我理解就是文件系统挂载着就可以干这些事情，牛吧？虽然我不知道这些事情都是干嘛的跟我有[STRIKEOUT:毛]神马关系。&lt;/p&gt;

&lt;h2 id=&quot;可以从-ext3ext4-无痛转换&quot;&gt;可以从 Ext3/Ext4 无痛转换&lt;/h2&gt;

&lt;p&gt;不解释，详见《 &lt;a href=&quot;https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3&quot;&gt;Conversion from Ext3 and
Ext4&lt;/a&gt; 》。&lt;/p&gt;

&lt;h2 id=&quot;为-ssd-优化&quot;&gt;为 SSD 优化&lt;/h2&gt;

&lt;p&gt;Btrfs 高度为 SSD 优化，不仅提高存取效率，还延长了使用寿命。如果你在 SSD
硬盘上使用 Btrfs，那么可以在挂载选项中加入 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssd&lt;/code&gt; 来启用这一特性。&lt;/p&gt;

&lt;h2 id=&quot;支持数据压缩&quot;&gt;支持数据压缩&lt;/h2&gt;

&lt;p&gt;Btrfs 支持文件系统的压缩，这个有什么用呢？大家知道 NTFS
吧，它就支持压缩，支持压缩就可以存放更多的东西呗，动作片什么的。&lt;/p&gt;

&lt;p&gt;不过压缩可不光是这个作用，大家都知道磁盘速度很慢，总是跟不上 CPU
的处理速度，所以 CPU
常常空闲着没事干。于是牛人们就想着给它找点事干，于是就有了压缩。压缩了之后磁盘读写就少了，原来闲着的
CPU 过来帮忙压缩解压缩数据，CPU 多快啊，这一来二去， &lt;strong&gt;往往&lt;/strong&gt;
就比原来不压缩的时候速度快得多。没看内核和 Ramdisk
都变着花样的压缩么，就是这个道理。&lt;/p&gt;

&lt;p&gt;Btrfs 目前支持 lzo 和 zlib
压缩算法，而且很智能，像一些视频啊、音乐啊、图片啊，大家都知道它们本来就是压缩过存放的，再压缩也不一定减少空间，反而平白浪费
CPU，所以 Btrfs
会试着压缩一小段，如果压着困难，就会原样存放。怎么样，智能吧？&lt;/p&gt;

&lt;p&gt;如果想要启用这一特性，可以在挂载选项中加入 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compress&lt;/code&gt;
选项，你还可以手动指定压缩算法，例如 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compress=zlib&lt;/code&gt;
可以获得更高压缩比，而 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compress=lzo&lt;/code&gt; 可以获得更快的速度。&lt;/p&gt;

&lt;h1 id=&quot;卷管理&quot;&gt;卷管理&lt;/h1&gt;

&lt;p&gt;终于到正题了啊，说到卷管理，很多人可能就想到 LVM
了，没错，说的就是这个卷！不过我虽然用过 LVM
，不过用的也不熟，如果说得有错误，请偷偷告诉我……&lt;/p&gt;

&lt;h2 id=&quot;无须分区的文件系统&quot;&gt;无须分区的文件系统&lt;/h2&gt;

&lt;p&gt;初入 Linux
，最大的难点是什么？当然是分区。其实这是大多数操作系统都会共有的问题，各位
MM ，你们当时是不是找暗恋你们的 GG 帮忙分的区？各位 GG
，你们当时是不是找暗恋你们的 GG 帮忙分的区？有了 Btrfs
，你们再也不用求人了！&lt;/p&gt;

&lt;p&gt;什么 /boot 要分 200M 还有说不用单独分出来的啊，什么 /home
要分好多好多但是不能理解这是干什么用的啊，就算你已经算是 Linux
老鸟了，新换一个发行版的时候，也会犹豫 / 到底是分 15G 好还是 20G 好吧？&lt;/p&gt;

&lt;p&gt;有了
Btrfs，你只需要分一个区就可以了，除非你想要休眠功能，那可以再分一个跟内存大小一样大的
swap 分区。&lt;/p&gt;

&lt;p&gt;还在担心重装系统 /home 下文件会丢失？不用了，把 /home 分到一个单独的
&lt;strong&gt;子卷&lt;/strong&gt; 中就可以啦！担心多系统问题？把 /boot
分到一个子卷中，就可以共享啦，然后再建一个其他操作系统的 /
子卷，往里面安新的操作系统吧！&lt;/p&gt;

&lt;h2 id=&quot;子卷&quot;&gt;子卷&lt;/h2&gt;

&lt;p&gt;上面的说明让你云里雾里？好吧，我来详细指点一下，多设备我不清楚，这里只说单设备，谁有多个硬盘自己研究去。&lt;/p&gt;

&lt;p&gt;Btrfs 呢，自带了卷管理功能，所谓的卷呢，就是原来分区的概念，嗯，特别是在
LVM 中，就是这样。 LVM
中，划分子卷的时候也要指定子卷的大小，然后如果哪个子卷空间不够用了，可以用
LVM 的一套工具来改变大小。&lt;/p&gt;

&lt;p&gt;这样其实跟原来分区的概念相差也不是很大，不过 Btrfs 中的子卷不是这样。在
Btrfs
中，所有子卷共用文件系统中所有的空间，在划分的时候是无需指定大小的。比如说你有个
80G 的 SSD 硬盘，全划分到一个 Btrfs 分区
sda1，而这个分区里面又有两个子卷 A 和 B，那么只要 A + B 的空间大小不超过
80G，两个子卷中哪个多点哪个少点根本没关系！&lt;/p&gt;

&lt;p&gt;所以你再也不必为了 /boot 分小了而懊悔不已，不用为 /
分大了肉痛不已——它们共用一块空间，自身再也没有大小的概念了。&lt;/p&gt;

&lt;p&gt;你可能要问，只分成一个 Btrfs
分区，那挂载的时候怎么办呢？仍然是通过挂载参数解决，比如：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mount /dev/sda1 /mnt &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;subvol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;root
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mount /dev/sda1 /mnt/home &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;subvol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;home&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;虽然分区一样，不过由于子卷名称不一样，挂载时选择的子卷就不一样，很神奇。&lt;/p&gt;

&lt;h2 id=&quot;快照&quot;&gt;快照&lt;/h2&gt;

&lt;p&gt;子曰：快照也是一种子卷，子卷是一种特殊的快照。&lt;/p&gt;

&lt;p&gt;好，我们来挑战一下更难理解的概念—— &lt;strong&gt;快照&lt;/strong&gt;
。说到快照，就不得不提系统还原，最常见的系统还原就是 Ghost
那种啦，把文件系统整个复制一遍然后压缩成一个镜像，这个又慢又费空间，大家懂的。Windows
自己也有系统还原，似乎是基于文件级的，把重要的文件备份一下，挂掉之后还原一下，能不能恢复正常全看天命，哈哈。&lt;/p&gt;

&lt;p&gt;总之现在现实世界中各种系统还原办法还都不怎么完美（什么苹果、ZFS，我没用过的东西谁提我跟谁急！），不过在虚拟机的世界里，快照的应用已经相当广泛。嗯，或许你早已经用过
Virtualbox
的快照功能了，完全的增量备份方式，不会重复占用空间，并且可以方便地对快照进行增加和删除，是不是很爽？&lt;/p&gt;

&lt;p&gt;现在这种异次元才有的技术终于降临在 Linux 上了， Btrfs
让真机上的文件系统快照成为可能。&lt;/p&gt;

&lt;h2 id=&quot;cow&quot;&gt;COW&lt;/h2&gt;

&lt;p&gt;Btrfs 的快照功能是通过 COW(Copy on write)
技术来实现的，这种技术实现起来很难，不过说起来很简单。可能很多人听说过，
Linux 内核中创建进程时 fork() 就用了这个技术，所以据各种书籍吹嘘， Linux
下建进程要比 Windows 下快得多。&lt;/p&gt;

&lt;p&gt;举个例子，比如你把 Btrfs 分区分成了 / 和 /home
两个子卷，然后装上了系统，这时你想搞个对 /
子卷的快照，以便以后系统折腾坏了之后可以恢复过来。于是你就建了个快照，快照名叫
ooxx 好了。&lt;/p&gt;

&lt;p&gt;Btrfs
中快照的建立几乎是瞬间的事，因为实际上它并没有备份数据，而只是增加了引用计数，比如一个文件
/lib/libc.so.6 ，初始引用计数是 1，你每建立一个快照它就加 1
，所以现在你建立了 ooxx，引用数就变成了 2。&lt;/p&gt;

&lt;p&gt;如果你哪天心情好，把 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rm -rf /usr/lib&lt;/code&gt; 写成了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rm -rf /usr /lib&lt;/code&gt;
，很遗憾你的 &lt;strong&gt;默认子卷&lt;/strong&gt; 中的 /lib/libc.so.6
这个文件就没了。不过呢，这只是它的引用计数减 1 而已，快照 ooxx
中还对它持有一个引用，因此这个文件并没有真正消失，你还可以从 ooxx
中将其拷贝回来。&lt;/p&gt;

&lt;p&gt;而哪天系统升级， &lt;strong&gt;默认子卷&lt;/strong&gt; 中 /lib/libc.so.6 被升级成了
/lib/libc.so.7，那么版本 6
的引用计数也是减一，同时在默认子卷中增加了一个版本 7 的文件。而快照 ooxx
完全不受此影响。&lt;/p&gt;

&lt;p&gt;这就是
COW，也就是两者之间有差异的时候，再去修改差异的部分。如果没有差异，那么就无需重复的磁盘空间。&lt;/p&gt;

&lt;h2 id=&quot;快照也是一种子卷子卷是一种特殊的快照&quot;&gt;快照也是一种子卷，子卷是一种特殊的快照&lt;/h2&gt;

&lt;p&gt;这里反复提到 &lt;strong&gt;默认子卷&lt;/strong&gt;
，也就是刚装系统时划分的那些子卷，这些子卷跟快照又是什么关系？&lt;/p&gt;

&lt;p&gt;其实默认子卷只是一种特殊的快照而已，还记得之前说过划分子卷时要指定
&lt;strong&gt;子卷名&lt;/strong&gt; 么？其实子卷名就是快照名，一个道理，你不管 / 的子卷叫 root
，而是叫它 xxoo 也是可以的，不管 /home 的子卷叫 home，叫它 oxox
也是可以的。&lt;/p&gt;

&lt;p&gt;你可能糊涂了：快照不是死的、只读的么？怎么跟子卷又是一回事了？&lt;/p&gt;

&lt;p&gt;错！快照不是只读的！&lt;/p&gt;

&lt;p&gt;你可以把 Btrfs
中的快照想象成新建了一个一模一样的子卷，还记得之前的挂载命令么？现在你也可以使用快照名作为子卷名来进行挂载并且读写！&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mount /dev/sda1 /mnt/root &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;subvol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;root
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mount /dev/sda1 /mnt/snapshot_ooxx &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;subvol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;ooxx&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;没错！你甚至可以将默认子卷和快照同时挂载在系统上，同时进行读写，有 COW
技术的后盾，完全不用担心会有混乱！&lt;/p&gt;

&lt;p&gt;想想这个技术可以干什么？你可以挂载一下以前的快照，轻松找回误删的文件；你可以新建一个快照，全盘删除，然后装个别的系统，完全不用担心原来系统的安全[STRIKEOUT:；你甚至可以建立一个快照，专门存放各种
MV, PV, AV, GV ，只要不挂载，即使是其他 Linux 高手也很难发现]。&lt;/p&gt;

&lt;h2 id=&quot;恢复系统&quot;&gt;恢复系统&lt;/h2&gt;

&lt;p&gt;有了快照，怎么恢复系统呢？总不能把快照里面的文件都拷贝回来吧？&lt;/p&gt;

&lt;p&gt;这个问题其实前面已经解答了。大家知道 Linux
下文件系统挂载主要是两个地方，一个是内核参数（也就是 GRUB
之类的配置文件里），一个是
/etc/fstab；大家还知道快照的挂载只需要修改挂载参数中的 subvol
的值就可以了，那么事情就简单了：想要恢复到哪个快照，直接挂载它就可以啦！&lt;/p&gt;

&lt;p&gt;也就是说，系统的恢复只是改改配置文件的事，完全无需等待！当然以后可能还会有图形界面的工具出现。&lt;/p&gt;

&lt;h2 id=&quot;快照的数量&quot;&gt;快照的数量&lt;/h2&gt;

&lt;p&gt;我们可以在一个分区里面建立多少个快照？这个问题不要问我。我只能告诉你，如果你每天都在使用电脑，并且每天建立
100 个快照，那么你磁盘空间不足的时候， Btrfs 的 subvolid
肯定不会用完就是了。&lt;/p&gt;

&lt;p&gt;所以你可以没事就建建快照，玩 RPG 的都会 S/L
大法吧？说不定少做了一次快照，前面就“请英雄重新来过”了，到时候哭都来不及。
Arch 下已经有了相应的工具自动建立快照，详情自行搜索。&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;本文仅仅是从理论方面对 Btrfs
对普通[STRIKEOUT:折腾帝]用户的用处进行了阐述，如果[STRIKEOUT:我心情好]反响好的话我会写一篇实战篇，大家也可以去
&lt;a href=&quot;https://btrfs.wiki.kernel.org/index.php/Main_Page&quot;&gt;Btrfs Wiki&lt;/a&gt;
上查看更详细的理论和实践知识。&lt;/p&gt;

&lt;p&gt;根据最新接到的消息， &lt;a href=&quot;http://thread.gmane.org/gmane.comp.file-systems.btrfs/12352/focus=12370&quot;&gt;Btrfsck
将在两周之内推出一个可以修复数据的初始版本&lt;/a&gt;
，相信这个工具的推出，可以使更多折腾帝投入 Btrfs
的大潮之中，这篇文章，全当是为大家做个动员吧。&lt;/p&gt;

&lt;p&gt;最后还是提醒，折腾有风险，千万别在 Btrfs
上存放重要数据，否则追悔莫及！谢谢支持！&lt;/p&gt;

&lt;p&gt;PS:
长了草的博客，我对不起乃！我以后[STRIKEOUT:可能的话]一定痛改前非，专心写博！&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2011/08/05/btrfs&quot;&gt;你的下一个文件系统——Btrfs&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on August 05, 2011.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[Wayland 独立运行的视频一段]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2011/02/19/wayland-demo"/>
  <id>https://www.kissuki.com/blog/2011/02/19/wayland-demo</id>
  <published>2011-02-19T08:33:00+08:00</published>
  <updated>2011-02-19T08:33:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#wayland" term="wayland" />
  <content type="html">
  
    &lt;p&gt;X 的替代之一 Wayland
正在快速的开发之中，几乎每天都会收到很多来自其他开发者的补丁和反馈。随着开发的进行，在
&lt;a href=&quot;http://wayland.freedesktop.org/&quot;&gt;官方网站&lt;/a&gt; 上的
&lt;a href=&quot;http://wayland.freedesktop.org/building.html&quot;&gt;构建说明&lt;/a&gt;
也日趋完善，普通用户也可以参照这份说明，构建一份自己的 Wayland
来体验一下了。由于构建说明很简单，这里就不再重复，有兴趣的朋友可以去官方网站上看一下，如果有不懂的地方可以在本文留言。&lt;/p&gt;

&lt;p&gt;这里献上一段视频，是 Wayland 脱离 X
直接运行的情况，所以是用手机拍摄的，清晰度不是很高，不过足以说明问题（当然还是
youtube 上的，请自备工具）：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://youtu.be/9R3n7W_wfzM&quot;&gt;http://youtu.be/9R3n7W_wfzM&lt;/a&gt;&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2011/02/19/wayland-demo&quot;&gt;Wayland 独立运行的视频一段&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on February 19, 2011.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[编译最新 Git 版本 GNOME Shell（附视频）]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2011/01/22/gnome-shell-git-compiling"/>
  <id>https://www.kissuki.com/blog/2011/01/22/gnome-shell-git-compiling</id>
  <published>2011-01-22T12:02:00+08:00</published>
  <updated>2011-01-22T12:02:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#git" term="git" /><category scheme="https://www.kissuki.com/tags/#gnome" term="gnome" /><category scheme="https://www.kissuki.com/tags/#gnome-shell" term="gnome-shell" />
  <content type="html">
  
    &lt;p&gt;相信很多人都知道，GNOME 3 最早今年 4 月份就会正式发布了，甚至 &lt;a href=&quot;http://gnome3.org/&quot;&gt;GNOME 3
的官方网站&lt;/a&gt; 都已经上线，那么 GNOME 3 的重头戏，GNOME
Shell，现在已经发展到什么程度了呢？&lt;/p&gt;

&lt;p&gt;如果你注意 GNOME 3 官网的最下面，可能已经发现官方提供的方法了，那就是
jhbuild！之前也曾经试用 jhbuild 编译过 GNOME
Shell，不过最后都不能启动，这次克服了点小困难，终于成功了，简单说一下：&lt;/p&gt;

&lt;p&gt;首先你要有至少 1.9.2 版本的 xulrunner，这个根据各个发行版自己解决吧～Arch Linux 下直接安装 xulrunner 这个包即可。
依次运行下面的命令：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; /usr/lib&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.la
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; http://git.gnome.org/browse/gnome-shell/plain/tools/build/gnome-shell-build-setup.sh
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/bin/bash gnome-shell-build-setup.sh
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;~/bin/jhbuild build&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;如果是在 Arch 下，由于 python 3 为默认，编译 gjs 的时候，可能要修改一下一个脚本，将 python 改为 python2。
编译成功后，使用下面的命令运行：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/gnome-shell/source/gnome-shell/src
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;./gnome-shell &lt;span class=&quot;nt&quot;&gt;--replace&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;如果出现下面的错误：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mutter: symbol lookup error: /home/iven/gnome-shell/install/lib64/gtk-3.0/modules/libcanberra-gtk-module.so: undefined symbol: gtk_quit_ad
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;可能是 API 变动导致的，删除那个文件即可，毫无危险：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; /home/iven/gnome-shell/install/lib64/gtk-3.0/modules/libcanberra-gtk-module.so/pre&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;基本上这样就可以执行了，这里录制了一段 &lt;a href=&quot;http://www.youtube.com/embed/u86Oi4Bo6LI?rel=0&amp;amp;hd=1&quot;&gt;GNOME Shell
的演示视频&lt;/a&gt;
，不妨边编译边看（请自备犯罪工具）。&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2011/01/22/gnome-shell-git-compiling&quot;&gt;编译最新 Git 版本 GNOME Shell（附视频）&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on January 22, 2011.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[星际译王 StarDict 更新 3.0.2]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2011/01/13/stardict-3-0-2"/>
  <id>https://www.kissuki.com/blog/2011/01/13/stardict-3-0-2</id>
  <published>2011-01-13T12:52:00+08:00</published>
  <updated>2011-01-13T12:52:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#stardict" term="stardict" />
  <content type="html">
  
    &lt;p&gt;提起 Linux
桌面上的翻译软件，就不得不想起星际译王，这个东西让人又爱又恨，它几乎是
Linux 上唯一一个稳定而功能强大的字典软件，无奈 BUG
多多，许久不更新了，作者胡正似乎沉迷于佛学和写书，久久也没有更新。&lt;/p&gt;

&lt;p&gt;不过一位俄罗斯开发者 kubtek
的加入，让已经三年多没有更新过的星际译王重获了新生。事实上，从 2009 年
10 月开始，kubtek
就一直没有停止过开发星际译王，终于在两天前，发布了自开发以来第一个正式版本
3.0.2。&lt;/p&gt;

&lt;p&gt;从修订记录来看， 3.0.2 相对于 3.0.1
的主要改变有：添加日志系统、新的文本词典格式、替换了广告插件、恢复在
Windows 和 Mac OS X 上的开发工作、Windows 版本特定的一些调整、修复了
Dict.cn 插件并在未找到单词时显示单词建议，当然 BUG 修复肯定不止这些。&lt;/p&gt;

&lt;p&gt;总体来说，没有太多新的特性，属于调整期的维护版本。不过，想来在接下来的版本里，星际译王能够给我们更多惊喜。&lt;/p&gt;

&lt;p&gt;更多信息可以在
&lt;a href=&quot;http://sourceforge.net/projects/stardict/&quot;&gt;星际译王的项目主页&lt;/a&gt; 上看到。&lt;/p&gt;

&lt;p&gt;PS：考试完成，一身轻松！&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2011/01/13/stardict-3-0-2&quot;&gt;星际译王 StarDict 更新 3.0.2&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on January 13, 2011.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[使用 gtkaml 编写 GTK+ 界面]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2011/01/02/gtkaml"/>
  <id>https://www.kissuki.com/blog/2011/01/02/gtkaml</id>
  <published>2011-01-02T05:46:00+08:00</published>
  <updated>2011-01-02T05:46:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#genie" term="genie" /><category scheme="https://www.kissuki.com/tags/#gtk" term="gtk" /><category scheme="https://www.kissuki.com/tags/#gtkaml" term="gtkaml" /><category scheme="https://www.kissuki.com/tags/#gtkon" term="gtkon" /><category scheme="https://www.kissuki.com/tags/#json" term="json" /><category scheme="https://www.kissuki.com/tags/#vala" term="vala" /><category scheme="https://www.kissuki.com/tags/#xml" term="xml" />
  <content type="html">
  
    &lt;p&gt;想必大家对 &lt;a href=&quot;http://imtx.me/archives/1579.html&quot;&gt;GTK+ 跑在 HTML5 上&lt;/a&gt;
已经不感到惊讶了，那么用 XML 编写 GTK+ 界面呢？好吧，Glade
是这样做的，不过今天介绍的不是它，而是 gtkaml。&lt;/p&gt;

&lt;p&gt;按照 &lt;a href=&quot;http://code.google.com/p/gtkaml/&quot;&gt;官网的介绍&lt;/a&gt; ，gtkaml 是基于 Vala
的一种标记语言，旨在使用简洁的 XML 语法来描述 GTK+ 界面，乍看起来和
Glade 没有什么区别。&lt;/p&gt;

&lt;p&gt;不过 gtkaml 采用的是类似于 Glade 2 的转换代码方式，将 XML 转换成 Vala
代码再进行编译。不过，不用担心图形界面和实际代码分离的问题，因为 gtkaml
在 XML 中预留了 Vala
代码的空间，也就是说，你不需要面对自动转换得到的很可能难懂的代码进行修改，而只需要在
XML 中直接书写 Vala 代码即可！&lt;/p&gt;

&lt;p&gt;另外，觉得标准的 XML 太过繁复？ gtkaml 还提供了一种叫做 gtkon
的语法，允许你使用类似 JSON 的语法编写界面，语法一下子就简洁了好多，看个
Hello World 吧（来自 &lt;a href=&quot;http://code.valaide.org/content/gtkon-hello-world-using-gtkon-syntax-gtkaml-and-gtk-api&quot;&gt;Vala
Code&lt;/a&gt;
）：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-vala&quot; data-lang=&quot;vala&quot;&gt;&lt;span class=&quot;n&quot;&gt;Window&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;using&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;Gtk&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GtkHello&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;={&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WindowType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TOPLEVEL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;First GTK+ Program&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;={&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WindowPosition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CENTER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;300&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;destroy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Gtk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main_quit&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Button&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Click me!&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clicked&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;={&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Thank you&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;-{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;Gtk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;init&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GtkHello&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;show_all&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;Gtk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}-&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;怎么样？在 Vala 代码中，根本就没有怎么写与界面相关的东西，是不是很
Cool？更多代码可以看 &lt;a href=&quot;http://code.google.com/p/gtkaml/wiki/Example&quot;&gt;官方 Wiki
的样例&lt;/a&gt; 。&lt;/p&gt;

&lt;p&gt;另外，虽然 gtkaml 现在仅支持 Vala 和 GTK+，不过根据官方介绍， Genie
的支持也在计划中，而只要有 vapi 的库，都可以使用 gtkaml 而不限于
GTK+，相信 gtkaml 的前景应该不赖。&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2011/01/02/gtkaml&quot;&gt;使用 gtkaml 编写 GTK+ 界面&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on January 02, 2011.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[为 Chromium 调教的 Google Reader]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2010/12/23/google-reader-for-chromium"/>
  <id>https://www.kissuki.com/blog/2010/12/23/google-reader-for-chromium</id>
  <published>2010-12-23T20:22:00+08:00</published>
  <updated>2010-12-23T20:22:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#chromium" term="chromium" /><category scheme="https://www.kissuki.com/tags/#reader" term="reader" />
  <content type="html">
  
    &lt;p&gt;今天把 Firefox 换成了 Chromium，当然要搜搜 Chromium
的技巧什么的，之前在扩展网站上看的 Google Reader
的扩展都略过了，直到看到谷奥这篇《 &lt;a href=&quot;http://www.guao.hk/posts/appropriative-browser-for-googlereader-made-with-chrome.html&quot;&gt;当 Google Reader 遇上 Chrome——打造
GR
专属浏览器&lt;/a&gt;
》，才猛然发现， Chromium 上面居然有这么多神奇的扩展，比 Firefox 上的
Better GReader
要强上不少（油猴用户请无视），具体的配置在这里就不说了，看文章自己了解吧。&lt;/p&gt;

&lt;p&gt;上图，还能认出 Google Reader 么？&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_6pI9N0iQzXE/TROvNUSP7FI/AAAAAAAAAwE/o3Xh64nvj_Q/GoogleReader.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2010/12/23/google-reader-for-chromium&quot;&gt;为 Chromium 调教的 Google Reader&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on December 23, 2010.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[从 Firefox 到 Chromium]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2010/12/23/from-firefox-to-chromium"/>
  <id>https://www.kissuki.com/blog/2010/12/23/from-firefox-to-chromium</id>
  <published>2010-12-23T10:09:00+08:00</published>
  <updated>2010-12-23T10:09:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#chromium" term="chromium" /><category scheme="https://www.kissuki.com/tags/#firefox" term="firefox" />
  <content type="html">
  
    &lt;p&gt;以前不是没有试过 Chromium，当时好像还是 5 或者
6，体验一下，发现扩展程序很不全，功能也很单一，于是不得不放弃。&lt;/p&gt;

&lt;p&gt;这次的起因是更新了 AUR 中的 Chromium 10 之后，所有链接都莫名其妙从
Chromium 中打开，即使把 Firefox 设置成默认浏览器也不行，于是就想，
Chrome OS 都出了，不知道 Chromium 现在神马样子了，试试看吧。&lt;/p&gt;

&lt;p&gt;到 Google 浏览器扩展程序的官网上狂找一通，发现 Chromium
的扩展已经很全很完善了，Firefox 上面的扩展基本都能找到替代，功能有些比
Firefox 上面的还要强，比如 AdBlock，居然支持这样过滤广告：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_6pI9N0iQzXE/TRMYsOtMYpI/AAAAAAAAAvs/0lEdr2ZgJCE/adblock.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在翻 Wall 方面， &lt;a href=&quot;https://chrome.google.com/webstore/detail/caehdcpeofiiigpdhbabniblemipncjj&quot;&gt;Proxy
Switchy!&lt;/a&gt;
和 AutoProxy 的 list 结合实在是不二之选，详见
&lt;a href=&quot;https://autoproxy.org/zh-CN/node/73&quot;&gt;这篇文章&lt;/a&gt; 。&lt;/p&gt;

&lt;p&gt;鼠标手势有 &lt;a href=&quot;https://chrome.google.com/webstore/detail/lfkgmnnajiljnolcgolmmgnecgldgeld&quot;&gt;Smooth
Gestures&lt;/a&gt;
，不过右键还是要双击才能出菜单，不知道 ChromePlus
的鼠标手势是怎么实现的呢？&lt;/p&gt;

&lt;p&gt;Twitter 扩展 Chrome Bird 情况和 Echofon 差不多，虽然功能强大不少，但是和
Hotot 一比就是天差地别了，所以干脆卸载掉。&lt;/p&gt;

&lt;p&gt;唯一不爽的是鼠标拖拽，现在用的是 &lt;a href=&quot;https://chrome.google.com/webstore/detail/jdnejaepfmacfdmhkplckpfdcjgbeode&quot;&gt;Yet Another Google Bookmarks
Extension&lt;/a&gt;
，不过还是没有 Easy DragToGo
强力，不能在同一标签页内打开链接和搜索，求推荐类似扩展……&lt;/p&gt;

&lt;p&gt;还有些在 Firefox 里面没有用过的扩展，比如 &lt;a href=&quot;https://chrome.google.com/webstore/detail/kaielpkecabnggniojjhghggjedkecfj&quot;&gt;Auto HD for
YouTube&lt;/a&gt;
，自动选取高清版视频来播放； &lt;a href=&quot;https://chrome.google.com/webstore/detail/mgijmajocgfcbeboacabfgobmjgjcoja&quot;&gt;Google
Dictionary&lt;/a&gt;
，Google
提供的词典，不但可以划词搜索，还可以在地址栏生成一个字典按钮，星际译王可以休息了；还有
&lt;a href=&quot;https://chrome.google.com/webstore/detail/dhgpkiiipkgmckicafkhcihkcldbdeej&quot;&gt;维基百科伴侣&lt;/a&gt;
，跟 Google Dictionary
相似，生成一个维基百科的按钮，点击弹出维基百科的小主页，很方便。&lt;/p&gt;

&lt;p&gt;基本上就是这些了，总的来说，Chromium 现在已经完全可以替代
Firefox，而且其速度要比 Firefox
快得多，很多特性也很吸引人，如果你还在使用老掉牙的
Firefox，是时候体验一下 Chromium 了。&lt;/p&gt;

&lt;p&gt;最后附上我现在所使用的全部扩展：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh5.ggpht.com/_6pI9N0iQzXE/TRMctbaU_5I/AAAAAAAAAv0/qmCVUK6SwRc/extensions1.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh6.ggpht.com/_6pI9N0iQzXE/TRMctlXUayI/AAAAAAAAAv4/qoZVRSCm6mk/extensions2.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh5.ggpht.com/_6pI9N0iQzXE/TRMctxTi_YI/AAAAAAAAAv8/sXdCM5NulK4/extensions3.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2010/12/23/from-firefox-to-chromium&quot;&gt;从 Firefox 到 Chromium&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on December 23, 2010.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[关于 Linux 内核的几篇心得]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2010/12/17/linux-kernel-analysis"/>
  <id>https://www.kissuki.com/blog/2010/12/17/linux-kernel-analysis</id>
  <published>2010-12-17T10:43:00+08:00</published>
  <updated>2010-12-17T10:43:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#kernel" term="kernel" /><category scheme="https://www.kissuki.com/tags/#life" term="life" />
  <content type="html">
  
    &lt;p&gt;这学期学业繁忙，一直没什么时间更新博客，不过由于学校开了不少 Linux
的课程，对 Linux 的学习和研究可是一点也没有落下哦。&lt;/p&gt;

&lt;p&gt;其中一门课程是《Linux 操作系统分析》，推上的同学可能想起我之前说过的用
Kubuntu 的女老师了，没错，就是她！&lt;/p&gt;

&lt;p&gt;讲得如何精彩在此就不详述了，有兴趣的同学可以访问
&lt;a href=&quot;http://staff.ustc.edu.cn/~xlanchen/&quot;&gt;她的主页&lt;/a&gt;
，里面还有全套的课件可供下载。&lt;/p&gt;

&lt;p&gt;这里分享几篇我的作业，也就是老师主页上所说的
Project，希望对内核初学者有所帮助：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B8wy7lXO0eWAYjY0N2NiYzAtN2JmZi00ZmU1LWIzODgtYjA0YzBiNWFjYjA1&amp;amp;hl=zh_CN&quot;&gt;x86 架构下 Linux
的启动过程分析&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B8wy7lXO0eWAMDYzNmFmMzEtNThlOS00MGY4LTgwZTgtYjA1MTc5MWIwZmFi&amp;amp;hl=zh_CN&quot;&gt;Linux
进程调度和切换过程分析&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B8wy7lXO0eWAMGYwZDJmYzEtYzllMi00MDhhLTliYmUtZGVkODVhYWVjNmU3&amp;amp;hl=zh_CN&quot;&gt;Linux
中进程创建分析&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B8wy7lXO0eWANWY3ODBmN2QtYjhkNS00MzNjLWFhMjEtYjNhYjkxYjU0ZDE2&amp;amp;hl=zh_CN&quot;&gt;X86架构下Linux的系统调用分析&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.google.com/leaf?id=0B8wy7lXO0eWAMjBkN2E3MzktMDlhMC00NzNkLTk0ZjgtMTQ1ZTI1YmQ3NTBh&amp;amp;hl=zh_CN&quot;&gt;Linux定时器的使用与分析&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;当然，我也是初学，由于水平有限，分析得很浅显，有些不懂的问题也不方便在作业中列出，因此或是忽略掉，或是不懂装懂掉了，希望不要对人产生误导才好……&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2010/12/17/linux-kernel-analysis&quot;&gt;关于 Linux 内核的几篇心得&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on December 17, 2010.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[Marlin —— GNOME 下新文件管理器启动！]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2010/11/09/marlin-preview"/>
  <id>https://www.kissuki.com/blog/2010/11/09/marlin-preview</id>
  <published>2010-11-09T06:32:00+08:00</published>
  <updated>2010-11-09T06:32:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#gnome" term="gnome" /><category scheme="https://www.kissuki.com/tags/#gtk" term="gtk" /><category scheme="https://www.kissuki.com/tags/#marlin" term="marlin" /><category scheme="https://www.kissuki.com/tags/#nautilus" term="nautilus" />
  <content type="html">
  
    &lt;p&gt;首先得说明，这个不是 GNOME 官方的计划，而是 Elementary 项目的一部分。&lt;/p&gt;

&lt;p&gt;相信 nautilus-elementary 大家都很熟悉了，这个 Nautilus 的修改版，为
GNOME 用户提供了一个更加美观易用的文件管理器。不过， Elementary 小组为
Nautilus 做的一些修改被上游认为是 Hacks
而迟迟不被接受，现在，他们终于开始研究自己的文件管理器了！&lt;/p&gt;

&lt;p&gt;Marlin 采用 Vala 编写界面，而 C 用来编写底层函数。在界面的编写上，使用了
GTK+ 3 和其他的 GNOME3 的时髦技术；而在底层上，Marlin 则从 Nautilus 和
Thunar 里面“偷”了些代码。加上 Elementary 自己本身特长的发挥，相信 Marlin
相较于 Nautilus 会在多个方面有所突破！&lt;/p&gt;

&lt;p&gt;当然，Marlin 的代码刚刚推送上 launchpad
还不到一天，不要期待能够马上用到稳定版本，不过 bzr
版本已经可以看出它的一些特色了：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_6pI9N0iQzXE/TNjkCS12FqI/AAAAAAAAAvM/iFX09pf8s_8/marlin_preview.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;电脑上没有装 GTK+ 3 的主题引擎，所以看起来丑了点。可以看出，Marlin
现在默认是这种小栏模式，嵌套进入目录，有点像 Ranger
的样子，操作起来很方便。当然那三个五角星预示着 Marlin
肯定会有各种传统的视图模式，另外，隐藏菜单栏之类的原有功能也是少不了的。&lt;/p&gt;

&lt;p&gt;虽然，Marlin 还处于早期开发阶段，不过 Elementary
小组的品质一向很有保证，让我们见证这一文件管理器闪耀出奇迹的光吧！&lt;/p&gt;

&lt;p&gt;Marlin 的源代码目前 &lt;a href=&quot;https://launchpad.net/marlin&quot;&gt;托管在 launchpad 上&lt;/a&gt;
，可以通过下面的命令获得源代码：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bzr branch lp:marlin&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2010/11/09/marlin-preview&quot;&gt;Marlin —— GNOME 下新文件管理器启动！&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on November 09, 2010.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[Compiz 0.9.2 发布]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2010/10/25/compiz-0-9-2"/>
  <id>https://www.kissuki.com/blog/2010/10/25/compiz-0-9-2</id>
  <published>2010-10-25T19:04:00+08:00</published>
  <updated>2010-10-25T19:04:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#compiz" term="compiz" />
  <content type="html">
  
    &lt;p&gt;在使用 C++ 重写，而又沉寂了一段时间之后，Compiz 开发小组发布了新的
Compiz 0.9.2
版本，虽然仍然是实验性的版本，不过根据作者所言，这个版本已经可以用于日常应用。在
Arch 下安装新版 Compiz 的方法见&lt;a href=&quot;/blog/2010/07/15/compiz-plus-plus&quot;&gt;这里&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;这个版本修复了大量的 BUG，并且带来了一些新的特性：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;新的 &lt;strong&gt;MultiAnim&lt;/strong&gt; 类，帮助在动画中创建窗口图像的多个拷贝&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;查看最小化窗口的实时预览&lt;/strong&gt; （实验性的）&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;重写了“群组（Group）”插件&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;缩放（Scale）插件的 &lt;strong&gt;自然（Natural）&lt;/strong&gt; 模式&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;简化&lt;/strong&gt; 阴影在装饰器（Decorator）中的存储&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;此外，计划中的 0.9.4 具有如下特性：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;（通过 MPX 和 UTouch）支持多点触摸和多点输入&lt;/li&gt;
  &lt;li&gt;动画框架，允许插件轻易地创建动画，或者使用其他插件提供的动画&lt;/li&gt;
  &lt;li&gt;将插件编译进核心，大幅提高速度&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PS：此版本发现了一些 BUG，稍后会发布 0.9.2.1 版本。&lt;/p&gt;

&lt;p&gt;PS2：Ubuntu 11.04 将使用 Unity 作为 Shell，而 Unity 的窗口管理器则将由
Mutter 换成 Compiz，也就是说 Compiz 得到了来自 Canonical
的支持！事实上，至少 Compiz 的开发者之一 smspillaz &lt;a href=&quot;http://smspillaz.wordpress.com/2010/10/25/a-bright-new-future-for-compiz/&quot;&gt;已经被 Canonical
雇用&lt;/a&gt;
了……为 Compiz 光明的未来喝彩吧！&lt;/p&gt;

&lt;p&gt;相关链接：
&lt;a href=&quot;http://http://smspillaz.wordpress.com/2010/10/24/coming-in-about-30-minutes/&quot;&gt;原文&lt;/a&gt;
&lt;a href=&quot;http://lists.compiz.org/pipermail/community/2010-October/000253.html&quot;&gt;详细更新列表&lt;/a&gt;
&lt;a href=&quot;http://releases.compiz.org/0.9.2/&quot;&gt;源代码下载&lt;/a&gt;&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2010/10/25/compiz-0-9-2&quot;&gt;Compiz 0.9.2 发布&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on October 25, 2010.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[Arch Linux 下 Android 源码下载与编译]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2010/10/03/arch-linux-android-compile"/>
  <id>https://www.kissuki.com/blog/2010/10/03/arch-linux-android-compile</id>
  <published>2010-10-03T10:47:00+08:00</published>
  <updated>2010-10-03T10:47:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#android" term="android" /><category scheme="https://www.kissuki.com/tags/#arch" term="arch" /><category scheme="https://www.kissuki.com/tags/#git" term="git" />
  <content type="html">
  
    &lt;p&gt;最近工程实践的老师让我把 Android
环境搭建起来，并且将界面换成黑白的，算是一个考验，这里就记录一下具体的做法。&lt;/p&gt;

&lt;p&gt;Android 源码以前没有注意过，一直以为是 git 管理，看了一下文档，才知道
Google 在 git 上面又加了一个叫做 repo 的工具，用来管理大量的 git 仓库。&lt;/p&gt;

&lt;p&gt;repo 这个工具在 AUR 里面有，叫做“repo-git”，首先要把这个工具安好。&lt;/p&gt;

&lt;p&gt;按照 &lt;a href=&quot;http://source.android.com/source/download.html&quot;&gt;官网的下载说明&lt;/a&gt;
，安装下面几个包：gperf sdl esound wxgtk valgrind，当然 base-devel 这个
group 也肯定都要装的了。64 位系统还要装 lib32-readline 和一些其他 32
位包，不过因为我装了 wine，所以所有依赖包都已经装好了。&lt;/p&gt;

&lt;p&gt;官网说只能用 jdk5，不过我克服万难从 AUR 上安装好老掉牙没人管的 jdk5
之后，编译时提示我 jdk 版本不对，请使用 jdk6
……同学们引以为戒，官网说明已经过时了。安装好 jdk
后重启一下系统更新环境变量，当然你也可以：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; /etc/profile&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;然后随便建个目录，比如我是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/Workspace/mydroid&lt;/code&gt;，进入这个目录后：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;repo init &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; git://android.git.kernel.org/platform/manifest.git&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;这是获得最新的 git stable 源码，或者你仅仅想要 Android 2.2.1,那么：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;repo init &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; git://android.git.kernel.org/platform/manifest.git &lt;span class=&quot;nt&quot;&gt;-b&lt;/span&gt; android-2.2.1_r1&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;其实就是 git branch 的封装，manifest 是一个 git 的仓库目录，里面就一个
xml 文件，记录了各个仓库的信息，repo 根据这些信息来 clone 源码。&lt;/p&gt;

&lt;p&gt;这条命令会问你的名字和 E-mail，其实就是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.gitconfig&lt;/code&gt;
中的信息，如果你以前常用 git，直接回车即可。&lt;/p&gt;

&lt;p&gt;下面就是同步源代码了：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;repo &lt;span class=&quot;nb&quot;&gt;sync&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Android 的源代码大约有 2G，在我令人发指的网络环境下，同步了 2
天才完事，所以速度在 200K 以下的同学就不要凑热闹了，找个地方画圈圈吧……&lt;/p&gt;

&lt;p&gt;这个过程中就是一堆的 git clone、git
rebase，如果中断了，会从第一个开始慢慢扫描，直到之前中断的那个仓库，按照
git clone 不支持断点续传的习性，这个被中断的项目会被重新
clone。要知道，Google 这个脑残最恶名昭彰的一点就是把二进制文件往 git
里面放了，第 252 个仓库 prebuild
就是这么个地方，700M，我就在这里中断过……&lt;/p&gt;

&lt;p&gt;闲话少说，下面是两个针对 Arch Linux 的 Fix，一个是 Make，目前 testing
中的 make 是 3.82 版本，这个版本在编译 Android 的时候开始会出错，见
&lt;a href=&quot;http://osdir.com/ml/android-porting/2010-08/msg00302.html&quot;&gt;这个帖子&lt;/a&gt;
，所以要降级成 core/make，也就是 3.81。&lt;/p&gt;

&lt;p&gt;另外，如果用的是 64 位系统，那么要安装 multilib 源中的
gcc-multilib，否则会出现 libgcc.a 不兼容的错误。&lt;/p&gt;

&lt;p&gt;全部完成之后，直接执行 make 就可以编译源代码了，当然 Makefile
有很多规则，比如只想编译计算器这个程序，make Calculator 即可。&lt;/p&gt;

&lt;p&gt;最后就是用模拟器执行啦，建个脚本执行即可：&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ANDROID_PRODUCT_OUT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;~/Workspace/mydroid/out/target/product/generic
&lt;span class=&quot;c&quot;&gt;# PATH for Android emulator&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PATH&lt;/span&gt;:~/Workspace/mydroid/out/host/linux-x86/bin
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ANDROID_JAVA_HOME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$JAVA_HOME&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# start the emulator with debug info&lt;/span&gt;
emulator &lt;span class=&quot;nt&quot;&gt;-debug-init&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;最后是几张模拟器的图片，是我改成黑白之后的：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_6pI9N0iQzXE/TKhKNzxsg8I/AAAAAAAAAuk/tr0BDRNQOjk/android-locked.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_6pI9N0iQzXE/TKhKOMyX3mI/AAAAAAAAAuo/6ycBuskRynA/android-main.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh5.ggpht.com/_6pI9N0iQzXE/TKhKNgVapwI/AAAAAAAAAuc/0MmOlmPar5w/android-browser.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh6.ggpht.com/_6pI9N0iQzXE/TKhKN9PWEoI/AAAAAAAAAug/Fj64VvOH5tI/android-calculator.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2010/10/03/arch-linux-android-compile&quot;&gt;Arch Linux 下 Android 源码下载与编译&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on October 03, 2010.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[学生用户 Dropbox 容量翻倍！]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2010/10/03/dropbox-edu-space"/>
  <id>https://www.kissuki.com/blog/2010/10/03/dropbox-edu-space</id>
  <published>2010-10-03T07:13:00+08:00</published>
  <updated>2010-10-03T07:13:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#dropbox" term="dropbox" />
  <content type="html">
  
    &lt;p&gt;Dropbox 现在在搞活动了，看到推上还没有人说，赶紧告诉大家。&lt;/p&gt;

&lt;p&gt;Dropbox 现在正在针对学生用户（准确说是 .edu
用户）开展活动，只要收封邮件激活一下，就可以将现有的容量翻倍（最多到
18G），而邀请他人所获得的容量也会翻倍（500M/用户，最多获得 16G）。&lt;/p&gt;

&lt;p&gt;本人有学校分配的 .edu 邮箱，很容易就获得了超大容量，大家也赶快上吧～&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_6pI9N0iQzXE/TKc6j6l5rHI/AAAAAAAAAuU/WSYT4Ad12Yo/dropbox_size.png?imgmax=800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;活动页面： &lt;a href=&quot;https://www.dropbox.com/edu&quot;&gt;&lt;a href=&quot;https://www.dropbox.com/edu&quot;&gt;https://www.dropbox.com/edu&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;另外，还没有 Dropbox 的同学赶快申请一个吧，我已经受到 Dropbox
很多好处了，以前系统误操作格式化掉，很容易就从网上恢复回来，另外，不同机器之间迁移、朋友间共享文件也变得很方便。从
&lt;a href=&quot;http://www.dropbox.com/referrals/NTExMjY4OTM5&quot;&gt;我的邀请链接&lt;/a&gt;
进入，可以额外获得 250 M 流量哦！&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2010/10/03/dropbox-edu-space&quot;&gt;学生用户 Dropbox 容量翻倍！&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on October 03, 2010.&lt;/p&gt;</content>
</entry>


<entry>
  <title type="html"><![CDATA[使用 dbus-python 建立单实例进程]]></title>
  <link rel="alternate" type="text/html" href="https://www.kissuki.com/blog/2010/09/23/dbus-python-single-instance"/>
  <id>https://www.kissuki.com/blog/2010/09/23/dbus-python-single-instance</id>
  <published>2010-09-23T12:45:00+08:00</published>
  <updated>2010-09-23T12:45:00+08:00</updated>
  <author>
    <name>Iven Hsu</name>
    <uri>https://www.kissuki.com</uri>
    <email>ivenvd@gmail.com</email>
  </author>
  <category scheme="https://www.kissuki.com/tags/#dbus" term="dbus" /><category scheme="https://www.kissuki.com/tags/#python" term="python" /><category scheme="https://www.kissuki.com/tags/#yaner" term="yaner" />
  <content type="html">
  
    &lt;p&gt;D-Bus 是 Linux 系统上广泛应用的消息总线，是 Linux
桌面程序常用的消息通信机制之一，熟悉 Linux
编程的同学可能对它已经很熟悉了，不过对于我来说，看了好长时间文档才算有点收获，赶紧记录下来。&lt;/p&gt;

&lt;p&gt;大家知道 #yaner 得是个单实例（Single
Instance）程序（不知道的同学赶紧知道），之前这种单实例的特性是由网上抄来的一段代码，用
Socket
的唯一地址实现的。功能虽然实现了，不过想要进一步扩展就比较难了，好吧，相比于
D-Bus，Socket 我更是一窍不通。&lt;/p&gt;

&lt;p&gt;为什么要扩展呢？大家知道，作为一个下载器，是要支持浏览器滴，可是怎么支持浏览器呢？当然是浏览器来调用下载器的命令行。这样就要求，下载器是单实例程序的同时，运行其他实例的时候，不仅要提示用户已经有一个实例运行，还要从命令行接收参数，传输给之前存在的实例，这就需要进程间通信了。&lt;/p&gt;

&lt;p&gt;下面就是一段简单的用 D-Bus
实现的单实例类，继承这个类的类都将获得单实例特性。目前它还没有通信相关的代码，将在后面加入。&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dbus&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dbus.service&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dbus.mainloop.glib&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SingleInstanceAppMixin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Single Instance Application&quot;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bus_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;dbus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mainloop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;glib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DBusGMainLoop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_as_default&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dbus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SessionBus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bus_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dbus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BusName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bus_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;allow_replacement&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;replace_existing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;do_not_queue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dbus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exceptions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NameExistsException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Another instance is already running.&quot;&lt;/span&gt;
            &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on_instance_exists&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;on_instance_exists&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
        This method is called when an instance of the program already
        exists. It may be overwritten by subclasses.
        &quot;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sys&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;代码很简单，主要原理就是利用 D-Bus 中 BusName 的唯一性，其中 BusName
的三个 Bool 型常量的设置分别表示不允许被替换、尝试替换同名
Bus、存在同名时不加入队列，这样就可以保证存在同名 Bus 的时候出现异常了。&lt;/p&gt;

&lt;p&gt;需要注意的是 self.bus_name
将其返回结果加上引用，免得执行完函数之后销毁掉了，在调试的时候在这里卡了半天，用
vimdiff 才看出来问题所在……&lt;/p&gt;


  
  &lt;p&gt;&lt;a href=&quot;https://www.kissuki.com/blog/2010/09/23/dbus-python-single-instance&quot;&gt;使用 dbus-python 建立单实例进程&lt;/a&gt; was originally published by Iven Hsu at &lt;a href=&quot;https://www.kissuki.com&quot;&gt;CODING IS FUN&lt;/a&gt; on September 23, 2010.&lt;/p&gt;</content>
</entry>

</feed>
