<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
        <title>Yume</title>
        <description>Yume - Zang MingJie</description>
        <link>http://blog.kghost.info</link>
        <link>http://blog.kghost.info</link>
        <lastBuildDate>2026-10-18T21:26:30+08:00</lastBuildDate>
        <pubDate>2026-10-18T21:26:30+08:00</pubDate>
        <ttl>1800</ttl>


        <item>
                <title>滑块游戏</title>
                <description>&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
  MathJax.Hub.Config({
    tex2jax: {
      inlineMath: [ [&apos;$&apos;,&apos;$&apos;] ],
      processEscapes: true
    }
  });
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML&quot;&gt;
&lt;/script&gt;
&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;div style=&quot;float:right;&quot;&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;four-rings-square-sliding-puzzle.jpg&quot;
src=&quot;data:image/jpeg;base64,
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&quot;&gt;
&lt;/div&gt;
&lt;p&gt;想必大家小时候都玩过右边这个玩具，在一个 $ 3\times 3 $ 的盒子里面，移动 8 块方块，最终拼成一个图案。这个看似简单的问题，寻找最优解竟然是 NP 完全的，但是本文的目的不是寻找最优解，只是简单的寻找一个解而已。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_是否所有排列都有解&quot;&gt;&lt;/a&gt;是否所有排列都有解&lt;/h2&gt;
&lt;p&gt;假设我们把里面的 8 个小方块全部挖出来，然后再随机装回去，那么这样装回去肯定能够拼回原样么？答案是不能，下面解释一下为什么不能。&lt;/p&gt;
&lt;p&gt;首先介绍一个概念，逆序数&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;設 $ A $ 為一個有 $ n $ 個數字的有序集 $ (n&amp;gt;1) $，其中所有數字各不相同。&lt;/p&gt;
&lt;p&gt;如果存在正整數 $ i, j $ 使得 $ 1 \le i \lt j \le n $ 而且 $ A_{ i } \gt A_{ j } $，&lt;/p&gt;
&lt;p&gt;則 $ \left&amp;lt; { A }_{ i },{ A }_{ j } \right&amp;gt; $ 這個有序對稱為 $ A $ 的一個逆序對&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;逆序数就是 $ A $ 中所有逆序对的数量&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ inv(A)=\# \left\{\ \left&amp;lt; { A }_{ i },{ A }_{ j } \right&amp;gt; \mid i \lt j \ and \ { A }_{ i } \gt { A }_{ j } \right\} $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为了方便理解，这里举例说明一下：&lt;/p&gt;
&lt;p&gt;$ \left\{\ 1,2,3,4,5 \right\} $ 五个顺序的数，逆序数为0&lt;/p&gt;
&lt;p&gt;$ \left\{\ 1,2,4,3,5 \right\} $ 交换3-4，有一个逆序对 $ \left&amp;lt; 4, 3 \right&amp;gt; $，所以逆序数是1&lt;/p&gt;
&lt;p&gt;$ \left\{\ 1,2,5,4,3 \right\} $ 交换3-5，产生三个逆序对 $ \left&amp;lt; 5, 4 \right&amp;gt;,\left&amp;lt; 5, 3 \right&amp;gt;,\left&amp;lt; 4, 3 \right&amp;gt; $，所以逆序数是3&lt;/p&gt;
&lt;p&gt;下面进入正题，首先我们给 8 个方块编号，然后定义其逆序数就是按照行列顺序组成数列的逆序数，例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ inv(\begin{bmatrix} 5 &amp;amp; 8 &amp;amp; 1 \\ &amp;amp; 9 &amp;amp; 2 \\ 4 &amp;amp; 6 &amp;amp; 3 \end{bmatrix})=inv(\left\{\ 5,8,1,9,2,4,6,3 \right\} ) $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们考虑移动方块对其逆序数的影响，每次操作可以把空方块上下左右四个方向其中某个方向的方块移动到空方块的位置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
明显左右移动不会影响其逆序数：
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;$ inv(\begin{bmatrix} 5 &amp;amp; 8 &amp;amp; 1 \\ &amp;amp; 9 &amp;amp; 2 \\ 4 &amp;amp; 6 &amp;amp; 3 \end{bmatrix})=inv(\begin{bmatrix} 5 &amp;amp; 8 &amp;amp; 1 \\ 9 &amp;amp; &amp;amp; 2 \\ 4 &amp;amp; 6 &amp;amp; 3 \end{bmatrix}) $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
上下移动相当于把某数字往前移动 2 位，或者往后移动 2 位
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;$ inv(\begin{bmatrix} 5 &amp;amp; 8 &amp;amp; 1 \\ &amp;amp; 9 &amp;amp; 2 \\ 4 &amp;amp; 6 &amp;amp; 3 \end{bmatrix})=inv(\left\{\ 5,8,1,9,2,4,6,3\right\} )\\ inv(\begin{bmatrix} 5 &amp;amp; 8 &amp;amp; 1 \\ 4 &amp;amp; 9 &amp;amp; 2 \\ &amp;amp; 6 &amp;amp; 3 \end{bmatrix})=inv(\left\{\ 5,8,1,4,9,2,6,3\right\} ) $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里只讨论向下移动对逆序数的影响，由于对称性，向上移动相同。向下移动就是把某个数在序列中往后移动两位，由于除了受影响的这三个数，其他数前后的顺序都没有变化，所以不会影响逆序数，我们把这三个数拿出来，分析逆序数的变化：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ inv\left( \left\{\ a,b,c \right\} \right) -inv\left( \left\{\ b,c,a \right\} \right) =\begin{cases} -2 &amp;amp; \left\{\ a \lt min\left( b,c \right) \right\} \\ 0 &amp;amp; \left\{\ min\left( b,c \right) \lt a \lt max\left( b,c \right) \right\} \\ 2 &amp;amp; \left\{\ a&amp;gt;max\left( b,c \right) \right\} \end{cases} $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可以看出所有移动都不会改变逆序数的奇偶性，由于最终目标的逆序数是 0，所以如果初始状态的逆序数的是奇数，那么将会出现无解的情况。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_解法&quot;&gt;&lt;/a&gt;解法&lt;/h2&gt;
&lt;p&gt;首先，我们需要找到一个方法在不改变逆序数的情况下，随意移动空位，明显在同一行移动空位是非常简单的：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ \begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 3 \\  &amp;amp; 4 &amp;amp; 5 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 3 \\ 4 &amp;amp;  &amp;amp; 5 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 3 \\ 4 &amp;amp; 5 &amp;amp;  \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix} $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面是在不同行移动空位的方法，经过 12 步移动，我们可以把空位在上下行之间移动：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ \begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 3 \\  &amp;amp; 4 &amp;amp; 5 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix}  &amp;amp; 2 &amp;amp; 3 \\ 1 &amp;amp; 4 &amp;amp; 5 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix} 2 &amp;amp;  &amp;amp; 3 \\ 1 &amp;amp; 4 &amp;amp; 5 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\\ \leftrightarrow \begin{bmatrix} 2 &amp;amp; 3 &amp;amp;  \\ 1 &amp;amp; 4 &amp;amp; 5 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix} 2 &amp;amp; 3 &amp;amp; 5 \\ 1 &amp;amp; 4 &amp;amp;  \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix} 2 &amp;amp; 3 &amp;amp; 5 \\ 1 &amp;amp;  &amp;amp; 4 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\\ \leftrightarrow \begin{bmatrix} 2 &amp;amp;  &amp;amp; 5 \\ 1 &amp;amp; 3 &amp;amp; 4 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix}  &amp;amp; 2 &amp;amp; 5 \\ 1 &amp;amp; 3 &amp;amp; 4 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 5 \\  &amp;amp; 3 &amp;amp; 4 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\\ \leftrightarrow \begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 5 \\ 3 &amp;amp;  &amp;amp; 4 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 5 \\ 3 &amp;amp; 4 &amp;amp;  \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix}\leftrightarrow \begin{bmatrix} 1 &amp;amp; 2 &amp;amp;  \\ 3 &amp;amp; 4 &amp;amp; 5 \\ 6 &amp;amp; 7 &amp;amp; 8 \end{bmatrix} $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;结合使用这里两种方法，我们可以在保证数列不变的情况下，随意调整空位的位置，那么剩下的思路就相当清晰了，我们通过调整空位的位置，使上下移动能够减少逆序数，然后不断减少整个数列的逆序数，最后使得其逆序数为 0，然后把空位调整到要求位置就可以了。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_实现&quot;&gt;&lt;/a&gt;实现&lt;/h2&gt;
&lt;p&gt;根据上面的思路，实现起来相当简单：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#008080&quot;&gt;Puzzle&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; m&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; Array&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;Int&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;])&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; space &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;m.indexOf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;

  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;swap&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;Int&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; j&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;Int&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;this&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Puzzle(m.slice(0,i)++Array(m(j))++m.slice(i+1,j)++Array(m(i))++m.slice&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;9&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; u &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;swap&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;space&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; space&lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; d &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;swap&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;space&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; space&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; l &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;swap&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;space&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; space&lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; r &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;swap&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;space&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; space&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;

  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;moveSpace&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;Int&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; Puzzle &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; space&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;this&lt;/font&gt;&lt;/b&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; space&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;space &lt;font color=&quot;#990000&quot;&gt;%&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; u&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;r&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;r&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;d&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;l&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;u&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;l&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;d&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;r&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;r&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;u &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; l
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;space &lt;font color=&quot;#990000&quot;&gt;%&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; d&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;l&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;l&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;u&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;r&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;d&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;r&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;u&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;l&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;l&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;d &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; r
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;).&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;moveSpace&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; solve&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; Puzzle &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; seq &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;m.filter&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;!&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;-&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; until &lt;font color=&quot;#993399&quot;&gt;6&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;seq&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;seq&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;moveSpace&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;).&lt;/font&gt;d&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;solve
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;moveSpace&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;override&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; toString &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt;
    &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;-&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; until &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;yield&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;m.slice&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;*&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;i*3+3).mkString(&quot;,&quot;)).mkString&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#CC33CC&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#CC33CC&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;测试一下：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Puzzle(Array&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;4&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;5&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;8&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;6&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;7&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)).&lt;/font&gt;solve&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;结果太长，这里就不贴了，有兴趣可以自己跑一下&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2013/05/30/sliding-puzzle/</link>
                <guid>http://blog.kghost.info/2013/05/30/sliding-puzzle</guid>
                <pubDate>2013-05-30T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>多线程程序中使用 Fork/Exec</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_什么是_fork&quot;&gt;&lt;/a&gt;什么是 fork&lt;/h2&gt;
&lt;p&gt;fork 是 linux 用来创建新进程的唯一方法，虽然我们在日常使用中，不会直接调用 fork，但是经常会间接使用 fork，所有编程语言中，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
python 的 os.spawn*
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
java 的 Process 类
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些都是使用 fork 创建新进程，然后在新进程中调用 exec 系列函数。下面介绍一下 fork 的使用：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;pid_t fork(void);&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;fork 会创建一个新进程，新创建的子进程继承父的所有属性，除了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
进程id：系统会分配一个新的进程 ID 给 fork 出来的子进程
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
除了调用 fork 的线程，其他线程强制终止
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里使用一段代码介绍如何使用 fork/exec&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#008080&quot;&gt;pid_t&lt;/font&gt; pid &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fork&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// error process&lt;/font&gt;&lt;/i&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// parent&lt;/font&gt;&lt;/i&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;waitpid&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;...);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// child&lt;/font&gt;&lt;/i&gt;

  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;execv&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;prog&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;...);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;fork/exec 的用法很简单，下面介绍一下使用的时候需要注意的问题&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_关闭文件&quot;&gt;&lt;/a&gt;关闭文件&lt;/h2&gt;
&lt;p&gt;由于 fork 会继承父进程的所有打开的文件，而且 exec 函数不会关闭这些文件，所以需要在运行 exec 前确保这些文件被关闭，下面两种方法&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;_手动关闭所有文件&quot;&gt;&lt;/a&gt;手动关闭所有文件&lt;/h3&gt;
&lt;p&gt;在调用 exec 前，遍历并关闭所有文件，如果调用 exec 前没有关闭这些文件，子进程可以任意读写这些文件，可能会引起安全问题。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
login 程序执行 shell 时没有关闭 /etc/shadow 文件
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
webserver 调用 CGI 时没有关闭与客户端之间的 socket 文件
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，必须在调用 exec 之前关闭所有子进程不需要使用的文件描述符。例如 ptyhon 的 subprocess.Popen 类：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt;&lt;/b&gt; subprocess&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Popen&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;args&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; bufsize&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; executable&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;None&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; stdin&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;None&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; stdout&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;None&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; stderr&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;None&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; preexec_fn&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;None&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; close_fds&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;False&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; shell&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;False&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; cwd&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;None&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; env&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;None&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; universal_newlines&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;False&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; startupinfo&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;None&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; creationflags&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;提供了一个 close_fds 参数，如果开启这个参数，python 会遍历所有文件描述符，从 0 到 SC_MAX_FD，调用 close 关闭这些文件。&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;MAXFD &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; os&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;sysconf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;SC_OPEN_MAX&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;_close_fds&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;self&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; but&lt;font color=&quot;#990000&quot;&gt;):&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;hasattr&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;os&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&apos;closerange&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;):&lt;/font&gt;
        os&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;closerange&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; but&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
        os&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;closerange&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;but &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; MAXFD&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; i &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;in&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;xrange&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; MAXFD&lt;font color=&quot;#990000&quot;&gt;):&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; but&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;continue&lt;/font&gt;&lt;/b&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;try&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;
                os&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;close&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;except&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;pass&lt;/font&gt;&lt;/b&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;如果在一些特定环境下，ulimit 的最大文件描述符数量设置得非常大，并且程序又需要频繁创建子进程，那么关闭每次都需要关闭大量文件描述符会浪费掉大量 CPU 资源，在优化程序的时候特别要注意这点。&lt;/p&gt;
&lt;p&gt;同时 Java 也提供了，process 类，但是 Java 中做了一些优化，通过遍历 /proc/self/fd 拿到打开的文件，然后仅仅关闭这些文件，下面是 Java 中 Process 类的 jni 代码：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;((&lt;/font&gt;dp &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;opendir&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;FD_DIR&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; NULL&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;((&lt;/font&gt;dirp &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;readdir64&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;dp&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;!=&lt;/font&gt; NULL&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; fd&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;isAsciiDigit&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;dirp&lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt;d_name&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;])&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt;
        &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;strtol&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;dirp&lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt;d_name&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; NULL&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;10&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;gt;=&lt;/font&gt; from_fd &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;restartableClose&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;closedir&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;dp&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;虽然说 Java 的版本比 Python 快很多，但是仍然需要额外的操作，下面介绍 Linux 下特有（非 POSIX 接口）的方法。&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;_使用_close_on_exec_关闭文件&quot;&gt;&lt;/a&gt;使用 close_on_exec 关闭文件&lt;/h3&gt;
&lt;p&gt;close on exec，从这个东西的名字就可以看出，可以在调用 exec 的时候自动关闭这个文件，我们只需要给文件描述符设置这个 flag&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fcntl&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; F_SETFD&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; FD_CLOEXEC&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;那么在执行到 exec 的时候，这个 fd 就会被自动关闭。&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;File descriptor flags 与 File status flags

为了搞清楚这两个东西的关系，需要理解 File descriptor 与 File description

 * File descriptor：文件描述符，通过 dup 可以复制文件描述符，得到两个不同的文件描述符
 * File description：文件对象，通过 dup 得到的两个文件描述符指向同一个文件对象

 * File descriptor flags：File descriptor 对应的 flag
 * File status flags：File description 对应的 flag

所以 dup 得到的两个不同的文件描述符拥有不同的 File descriptor flags，但是却共享 File status flags

下面是几个典型的 flags:

File descriptor flags
 * CLOSEXEC

File status flags
 * O_NONBLOCK
 * O_DIRECT&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;我们可以为每个 fd 设置 close-on-exec，那么在 exec 的时候文件就会被自动关掉。但是在多线程中就不是那么简单了，考虑下面这个场景：&lt;/p&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-04-27-fork-multi-thread__1.png&quot;
src=&quot;data:image/png;base64,
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
gg==&quot;&gt;
&lt;/div&gt;
&lt;p&gt;由于线程1在调用 open 后，未来得及调用 fcntl设置 close-on-exec，线程2调用了 fork，子进程中线程1会被强行终止，无法设置 close-on-exec，虽然父进程中线程1仍然能够正确执行，但是子进程与父进程的 fd 不共享 File descriptor flags，所以子进程的 fd 没有 close-on-exec，在调用 exec 的时候会泄漏 fd。所以，必须保证 open 与设置 close-on-exec 为原子操作，为此，linux 修改了所有会新建 fd 的 API：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
open
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
opendir
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
socket
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
accept
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
pipe2
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
dup3
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在某些操作系统中，由于系统没有提供上述 API，无法保证打开文件描述符与设置 close-on-exec 的原子性，则需要通过额外的锁来控制：&lt;/p&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-04-27-fork-multi-thread__2.png&quot;
src=&quot;data:image/png;base64,
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&quot;&gt;
&lt;/div&gt;
&lt;p&gt;golang 为了保证移植性，使用的就是此方法。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_死锁&quot;&gt;&lt;/a&gt;死锁&lt;/h2&gt;
&lt;p&gt;考虑下面这个场景：&lt;/p&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-04-27-fork-multi-thread__3.png&quot;
src=&quot;data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAANIAAAFeCAIAAAB//tYCAAAXeElEQVR4Xu2dfWwUxf/HF1r6hC0t
CIKVLyAUjBJQ2pi05ZkaYiKRP0ASIiL8raKJiTEx0UCUIGKEgIpNBAyG8JAICZSqUBJaArRSWmlI
aEEpAgVjobSlUijl9/ndlNl17rrc3u7tzGzfrz8u8/DZ7cznXrc7eyx7xgMAfMcQGwCIP9AOSMDU
rhuAOAPtgASgHZAAtAMSgHZAAtAOSADaAQlAOyABaAckAO2ABKAdkAC0AxKAdkAC0A5IANoBCUA7
IAFoByQA7YAEoB2QALQDEoB2QALQDkgA2gEJQDsgAWgHJADtgAS81M6whQeIm/mIdQB1dXUff/zx
c889J2VU7I/2Bg8QN/MR6wCqq6vffvvtnJycpKSkJ554YtasWfv37/9vuDO81M5KxKxFbPQT6wCe
ffZZ0o7kU2pU9o1+Yh3A5MmT161bV1NT09bWVl9f/9JLL1HXN998898tHNB3tbNv9JOIA4jY6Cc2
A2hsbKSu0aNHix1RI0G73bt3T58+PSsra/DgwfPmzbtw4YK1999//12xYsXQoUP79+/P2o8ePVpU
VJSenp6RkVFQUCAc3n/88Ue2YXJy8vjx4z/66KM7d+7w3m3bto0dOzYtLW3KlClbt25lkZat/5+I
jX4ScQCsUbVcMa5fv05ddMIVO6JGgnZ0xKa1wq1bt1auXEnVGTNmWHvXrl1Lvffu3WONZWVliYmJ
lPqGhobm5uYlS5ZQDCWF7/ODDz4oKSmhg39LS8vnn39OvR9++CHr+uWXX6haWFh4MQQVbEYlNPpJ
xAGwRtVyxXj//fepa+LEiWJH1EjQ7vjx46xK2TRCnzxrb1VVlblBdzclkRpra2tZ9dq1a1SlT6o1
hnP37l3qffrpp1l15syZVD127BirVlRUsD9hbhAiYqOfRBwAa1QtVwQt8ljXjh07xL6okaAdP7Df
v3/fGsbKnZ2d5gbd3XTMZ+1WEhISWC8d7d98882nnnqKPuW8l59x6MRE1dbWVlZl75zRy6iERj+J
OADWqFqu2DGyX79+69evF7ocIUG73lrCe7sfppJSJrQz5s6da4TOFH///TdVaa1j3YmQSipE/BMR
G/0k4gDCG60t4b3d8c/V6tWrjZBzxcXF1vYYUF07dvCnlbXQzqC1s2FJ1pEjR6w7oZWQEcWJI2Kj
n0QcQHijtSW8tzvOuVq1apUROjp+//33vDFmVNeuvLycrpjGjBlDq5z29vazZ89u3rw5Ly+P9c6Z
M4c2odUGdZ04cSInJ8e6k9LSUiOKZXLERj+JOIDwRmtLeG93PHP1ySefGKHz9Q8//MBaXKK6dkRl
ZeX8+fOHDBlCOR03btzSpUtPnjzJuq5cufLaa6/RCYLW2s8///z27duFndBHk1bNqampdEm4ZcsW
oZdVrfAuP4n4p8MbrS3hvYw45YqVw+HbOiVe2gFgA7QDEtBMO1qRiE1AQzTTzs16AqgDtAMSgHZA
AtAOSADaAQlAOyABaBdYVP6yCdoFFpVzBe0Ci8q5gnaBReVcQbvAonKuoF1gUTlX0C6wqJwraBdY
VM4VtAssKucK2gUWlXMF7QKLyrmCdoFF5VxBu8Cicq6gXWBROVdx0W7IkCGGbtCYxWlojtHXtKMJ
873pAo25paWlra2to6Ojs7Ozq6tLnJVuQDsNoDE3NjY2NTU1NzeTfMLDlHQE2mkAjfnMmTMNDQ2X
L18m8+iYJ85KN6CdBtCYKyoqampqyDw65tEBT5yVbkA7DaAxl5SUkHl0zKOzLa3zxFnpBrTTACP0
VNTS0tLKykr27F9xVroB7TQA2vmJmXZeEkOcY6+dEUJsdYgnO7EC7fzETDsviSHOsRfCE2M82YkV
aOcnZtp5SQxxjr0QnhjjyU6sQDs/MdPOS2KIc+yFEIz5+eefp06dmpaWlpqaWlhYSFVL7AO6rly0
aNHw4cOTk5Nzc3P37t3L2oWdUFh2dnZCQsKGDRt4oyOgnZ+YaeclMcQ50WtHkvXv3z8/P//ixYuN
jY1UoCo3jwwgF0eOHHno0KG2trbq6urFixeH76S8vDwzMzM9Pf3AgQOsJQagnZ+YaeclMcQ50WvH
ngh+7NgxVmXPpaeDH6uyh4vzI5wVvhPqTUlJITVra2vFICdAOz8x085LYohzoteODmZUpiMZq7Jf
4aBGVmW/73Hjxg1WtcJ2UlxcTCfWvLy8q1evihEOgXZ+Yqadl8QQ58SsHRWoSraxKtPu5s2brGqF
7SQjI4Nei4qKIsY4Atr5iZl2XhJDnBO9dsJJlgqG5SQ7e/Zsqu7bt49VrbCdVFVVsXv7JkyYUF9f
LwY5Adr5iZl2XhJDnBO9duySguSj64lLly5RwXpJceLECVq3jRo1qqysrL29vaamZsGCBcJO6urq
RowYQeWsrCy68mC9MQDt/MRMOy+JIc6JXrsHD79ASQ1RUFBAb7wl9gFdKCxcuHDYsGHJyclTpkyJ
+AXK+fPnSU2qJiYmbtq0ydzYCdDOT8y085IY4hx77dQE2vmJmXZeEkOcA+1UANppALTzEzPtvCSG
OAfaqQC00wBo5ydm2nlJDHEOtFMBaKcB0M5PzLTzkhjiHGinAtBOA6Cdn5hp5yUxxDk6PgNl4MCB
0M434qId0dLS0tjYeObMmYqKipKSkh0eYYSOSXEC/0/WN+KlXVtbW1NTEx02ampq6L0s9QhKpdjk
HXgqgG/ES7uOjg46T12+fJneRTp+VHoEpVJs8g48A8U34qVdZ2cnHTDo/aMjB52zGjyCUik2eQee
+OQb8dKuq6uL3jk6ZtBbSOukZo+gVIpN3oHn2/lGvLSLEyqnUjVUzhW0Cywq5wraBRaVcwXtAovK
uYJ2gUXlXEG7wKJyrqBdYFE5V9AusKicK2gXWFTOFbQLLCrnCtoFFpVzBe0Ci8q5gnaBReVcQbvA
onKuoF1gUTlX0C6wqJwraBdYVM4VtAssKucK2gUWlXMF7QKLyrmCdoFF5VxBu8Cicq7iop2Oz0Ch
MYvT0Byjr2ln6PnEJ/w/Wd8w085LYohzNNUOTwXwDTPtvCSGOEdT7fAMFN8w085LYohzNNUOT3zy
DTPtvCSGOEdT7fB8O98w085LYohzNNVuB57m6Rdm2nlJDHEOtFMBaBdfjBBiq0OgnZ+YaeclMcQ5
7iVwBLSLCLSLL9AuItDuwdixY6nx9OnTbP9Dhw4dNmxYd+jPV1dXU1dOTg4PZj9snJaWlpqaWlhY
yH9M+8FDw3bu3Jmfnz9w4ED2h6zaHTt2bNCgQVRds2YN3yoaoJ2fmGnnJTHEOeHavfXWW9T45Zdf
UvnUqVNMFBKOquvWraPyO++8wyLZz7iTVRcvXmxsbKSC9Wfc2Ya5ublkcFdXl7WRCocOHSIXExIS
iouLWVf0GNDOR8y085IY4hwmgZUDBw5Q4yuvvELlzz77jImyevVqqlIjlQ8ePMgi6fBGVTposWpF
RQVV6eDHqmzD3377jVWtjfv27UsOsWfPHmtvlBjQzkfMtPOSGOIcI0y7jo6OlJSUjIwMOkTNmDGD
zoOZmZmzZs2iKpXpZEoBLJLKtHlbWxurtra2UpUaWZUZdvfuXVa1Ng4YMIBed+3aZe2KHlna9c27
dcy085IY4hwjTDti7ty51F5WVpaUlLQwBBWOHDlCjS+//DIPE7SjAlVpnceqbNo82Nq4cePGfv36
TZw48cqVK0JANBiStAufjvoYru/WMXfFS2KIcyKm8quvvqJ2dg7dsmXL1q1bqTBt2jR63bBhAw8T
TrJUMMJOsjxYaPz222/JvNGjR9fX1wsxj8SAdlFjuL5bx9wVL4khzomYynPnzjE/yIxr165dv36d
CqyF3mYexi4pSD6a2KVLl6gQfknBg8Mb6WKCdkuXyXTh8t+oR2BAu6gxXN+tY+6Kl8QQ5/SWSvY1
Cl2HsuqLL75IVWr8b1TPFyipIQoKCkgF3vVI7Qg6lJKp6enphw8ftkQ9AmgXPYbru3XMXfGSGOIc
TVMJ7aLEcH23jrkrXhJDnKNpKqFdlLjPlbkrXhJDnNM3UxkbfTNX5q54SQxxTt9MZWzY52rfvn20
9qWlqn2YPUYIsdUF7nNl7oqXxBDneDtJf3Cfytiwz9X//vc/CqirqxM7nADt1MV9KmPDPleeGOPJ
Tqy4z5W5K14SQ5zj7ST9wX0qY8MmV0wXDm9/5B06d+7cWbFixdChQ+nszBt5DF1+ZmdnJyQkWL+l
d4ThOlfmrnhJDHGOdZK64D6VsWGfK8GYB9HdofPFF19EvEOHKC8vz8zMTE9PP3DgAGuJAfe5MnfF
S2KIc+xTqSbuUxkb9rkK1y7mO3SosHfv3pSUlJEjR9bW1loDnOI+V+aueEkMcY6Od1UMHDjQZSpj
w3CoXcx36BQXF9OJNS8v7+rVq9beGDDU1I5oaWmhUwAtI+jjWFJSssMj2ITjhMtv3mNDsEqAGWNt
ifkOnYyMDHotKiq6efOmEOAUQ1ntKB1NTU00ppqaGnovSz2CJiw2eYfLf2eMjXBLrIRrFPMdOlVV
VewsNGHChBju0LFiKKtdR0cHjeby5cs0LDp+VHoETVhs8g6Xd1XERrglVsI1cnOHTl1d3YgRI6ic
lZV16NAhISx61NWus7OTDhg0IDpyUIIaPMII3SUVJ1zeQxYb4ZZYiaiRmzt0zp8/P2rUKKomJiZu
2rTpv4HRoq52dPVO7xwdM+gtpHVSs0fQhMUm73B5x2xshFuiPupqFycMhf9bSmxAux7EEJWAdioA
7bQH2vUghqgEtFMBaKc90K4HMUQloJ0KQDvtgXY9iCEqAe1UANppT9+8WwfayacP3q0D7eTTB+/W
gXby6YN360A7+fTBu3WgnXz64N06mmmXk5MjNoFeUPkjqpl2IHqgnVuWLVtGSSwoKLh37x5vpHJ+
fj61L1++3BILeoB2brl9+/akSZMoj6tWreKNK1eupJbJkydTryUW9ADtPODcuXMZGRkDBgyoqqqi
Kr1SmVqoXQwFIaCdN+zevZtS+cwzz/zzzz/0SuU9e/aIQeAh0M4z3n33XcpmdnY2vb733ntiN7AA
7TyjqamJ/ewJvVJZ7AYWoJ1nvPrqq5TNOXPm0Ov8+fPFbmAB2nnD+vXrKZWzZ8/u6uqaNWuWEfod
FTEIPATaeUB1dXVycvJjjz32xx9/UJVeqUwt1C6GghDQzi2tra3jx4+nPH799de8cdOmTdRC7dRr
iQU9QDu3LFmyhC3p7t+/zxupzBZ5b7zxhhkKHgLtgASgHZAAtAMSgHZAAtAOSADaAQlAOyABaAck
AO2ABKAd6JWPQxgWqCoExNabk5Nj09ttu+0je10C7SRjKHxM6g33CkI7yeionfsxQzvJuH8L/cf9
mKGdZNy/hf7jfszQTjLu10n+A+2ABNx/VKAdkAC0Uxr2nZnY6hBPduIt0E5pPDHGk514C7STjP06
yRNjPNmJt0A7ydgLIRhTWlo6derUtLS01NTUwsJCqlpiu3///fdFixYNHz48OTk5Nzf3p59+Yu3C
TigsOzs7ISFh/fr1vNER9h+VaIB2koleO5Ksf//++fn5f/7558WLF6lAVW7eyZMnycWRI0f++uuv
ra2tp06dWrx4cfhOjh49mpmZmZ6evn//ftYSA/ZjjgZoJxn7t9BqDB3eqFxRUcGq5eXlVKWDH6uy
/7vJj3BW+E6oNyUlhdSsqakRg5xgP+ZogHaSsX8LrdrRwYzK/P+i37p1i6rUyKp05jVCz8hmVSts
J9999x2dWPPy8q5cuSJGOMR+zNEA7SRjv06y0Y4KVCXbWJVpd+PGDVa1wnaSkZFBr0VFRRFjHAHt
Ao5VO+EkSwXDcpKdPXs2Vffu3cuqVthOKisr2e+bTZgwweUjUO0/KtGgmXbuJ6wXVu3YJQXJR9cT
jY2NVLBeUhw/fpzWbaNGjTp8+HBbW9vp06cXLFgg7OTMmTMjRoygclZWFl15sF4paKYdfw/6CFbt
uh9+gZIaoqCg4ODBg5bYbrpQWLhw4bBhw5KTk6dMmRLxC5SGhgZSk6qJiYkbN240N/YXaAckAO0k
09eWDQxoJxkdZ+T+o6KZdu4nrBo6aud+zJppFzzcv4X+437M0E4y7t9C/3E/ZmgnGR2XDdAOSMD9
R0Uz7dxPGKiAZtq5P7yrif0DR2LrZYXeeu23jabXDdAusKicK2gXWDw8OHkOtAMS0Ew7lT/BIHo0
0w4EA2gHJADtAovKCxJoF1hUvvzSTDuVP8GqAe08Q+VUqobKuYJ2gUXlXEG7wKLyggTaAQnEVzv7
Wxhi6OUxEXvtt42yF/hAfLUDICJx0Q7HD2BPXLQzNFyBBe+jovKMoF0POo7ZHpVnBO160HHM9qg8
I2jXg45jtkflGcVFO5VXFb2h8psUGyrPKC7auYF9lya2OiSGnej4UbFH5RlBOyABaAckIEG7cCes
LUKvIr87A7wlLtrZrypIiH79+gktEbVT53dngLfERTvrkSYc6qUDj9ASUTs/f3fG/qOiIyrPSGnt
/PzdGf5HA4PKM5KjHZ0refXOnTtW1axlP393hv/RwKDyjCRol5SURAHt7e2seuLECatq1rKfvzvD
/2hgUHlGcdHOflUxffp0ysinn35KRy9acr3wwgtW1axlP393RuU3KTZUnlFctLPnwoUL8+bNGzx4
8KBBgwoKCnbt2tWbdt0+/u6M/UdFR1SekQTtAIB2QALQDkggLtqpvKoAKhAX7VS+huqN4H1UVJ4R
tOtBxzHbo/KMoF0POo7ZHpVnBO160HHM9qg8o7hop/KqojdUfpNiQ+UZxUu70D8T9CBYqGyvtSqF
R47QUa81ILzXsqnjXiEgBuKiXfxwP2HV0HFGhuvjqGbauZ+waug4I/djhnaS0XFG7scM7SSj44zc
jxnaSUbHGblfj2qmnfsJq0bwZhQNmmkHggG0AxKAdkAC0A44xv16VDPt3E9YNSLO6OjRo0VFRenp
6RkZGQUFBdbHaCxbtowufnNzc7u6uqhKr+y/3i1fvjyazbt7f3BM9Li/+tZMO/cTVo3wGZWVlSUm
Jk6fPr2hoaG5uXnJkiUUs3XrVtZ7+/btSZMmUcvmzZupunHjRipPnjy5o6Mjms1tHhwTPeFjdgq0
k0z4jNj/I66trWXVa9euUXX8+PE84Ny5c3QYe/zxx6mQlZU1aNCg+vp63mu/uc2DY6InfMxOgXaS
CZ8Re8iGgPDUmJ07dxqh/3NOr3v27LF22W9u8+CY6DHCxuwUaCeZ8BkxM65fvy60W1m7di3FPPnk
k/S6Zs0aa5f95jYPjomeiOtRR2imnfsJq0b4jGbOnElm7N69W2jnVFVVJSUl0TXBX3/9ReYNGDCg
srKS99pvbvPgGD/RTLu+QHl5OVk1ZsyY48ePt7e3nz17lq4e8vLyWC9dB4wbN47U2bZtG1W3b99O
ZWq5detWNJvbPDjGT6CditDRa/78+UOGDCGBSKmlS5fSFSjrev311w3LY6+IadOmUQu18xabzbt7
f3CMn0A7IAFoBxwTvh51imbauZ+waug4o/Crb6dopp37CauGjjNyP2ZoJxkdZ+R+zNBOMjrOyP2Y
oZ1kdJyR+/WoZtq5n7BqBG9G0aCZdiAYQDtV+DjsUSPq98YMtAMSgHZAAppp59VBvi+gcq40087Q
8OsGWaicK2gXWFTOFbQLLCrnCtoFFpVzpZl2Ki+TVUPlXGmmHQgG0A5IANoBCUA7IAHNtFN5mawa
KudKM+1U/lJANVTOFbQLLCrnCtoFFpVzBe0Ci8q50kw7lZfJqqFyrjTTDgQDaAckAO2ABKAdkIBm
2qm8TFYNlXOlmXYqfymgGirnCtoFFpVzBe0Ci8q5gnaBReVcaaadystk1VA5V5ppB4IBtAMSgHZA
AtAOSADaAQlAOyABaAckAO2ABKAdkAC0AxKAdkAC0A5IANoBCUA7IAFoByQA7YAEoB2QALQDEoB2
QALQDkgA2gEJQDsgAWgHJADtgASgHZAAtAMSgHZAAtAOSADaAQlAOyABaAckEEE7AHwD2gEJQDsg
gf8DMIybZv/k1ZgAAAAASUVORK5CYII=&quot;&gt;
&lt;/div&gt;
&lt;p&gt;由于持有锁的线程1被强行终止了，子进程中将永远无法获取到锁，于是程序死锁。解决这个问题的方法也非常简单，在 fork 之后，exec 之前不要使用任何锁。说来简单，但是实际上陷阱非常多，因为 libc 里面有大量函数使用了锁，例如最常用的 malloc/free 函数中就有锁。如果在进程1申请内存的时候进程2调用了 fork，并且在 exec 之前尝试申请内存就会产生死锁。POSIX 标准维护了一个函数列表 Async-signal-safe functions，需要确保程序在 exec 之前不会调用任何此列表之外的任何函数，exec 后会重置所有进程状态，之前线程获取的锁会直接被销毁。&lt;/p&gt;
&lt;p&gt;但是有时程序的执行并不是可控的，比如 Java 程序随时可能会执行 gc 代码，如果在 exec 前启动了 gc 代码可能会导致死锁，所以必须做特殊处理避免此类情况出现。反观 python，本文中提到的这些问题 python 完全没有考虑到，python 提供了原生的 fork 与 exec 调用，fork 与 exec 之间很可能会产生 gc，所以如果想给 python 添加多线程支持，就必须伤筋动骨得大改了。&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2013/04/27/fork-multi-thread/</link>
                <guid>http://blog.kghost.info/2013/04/27/fork-multi-thread</guid>
                <pubDate>2013-04-27T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>网络虚拟化技术（二）: TUN/TAP MACVLAN MACVTAP</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_tun_设备&quot;&gt;&lt;/a&gt;TUN 设备&lt;/h2&gt;
&lt;p&gt;TUN 设备是一种虚拟网络设备，通过此设备，程序可以方便得模拟网络行为。先来看看物理设备是如何工作的：&lt;/p&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-03-27-linux-network-tun__1.png&quot;
src=&quot;data:image/png;base64,
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
7LPPUlNT+c86KKGcknDv16+fOOsoSWEP6jtV4RiBJd5y+SSu3KMcKubn4Bj3Kzq14t69e51vunL3
eb/i7WuuvvpqWRk1apRjvMtNW7i1qiifBrVz5nEYq1MS7mQ3xwishHrN/W9/+5tj/LtEs807c+0d
d9zx9Sl4ojvvvFPrdIy1RPHBcKeYmYElflvmkksuOXbsmDalMdd6Z64VkapW4vDbMk1NTV26dOnU
qZP6VsP19fWo5Obmaq9N+blfIj8Y7hSzsIE1Y8aM1NTU66+//sMPP2xubq6qqsKF/FVXXaW1hV3r
kblWhvvRo0c/++wz+XvuixcvNju1infa2ldeecUxvjOA8ePHO8Zbivq5XyI/GO4Us0iBtXHjRkRe
r1690tPTs7KyzjnnnO9///taT6S1XphrRbjjmwZcqsftL1THjBmDyrJly9QiLF26FHXMqkU/90vk
B8OdYuYnsLiWKD4Y7hQzP4HFtUTxwXCnmPkJLK4lig+GO8XMDCznRPn5+SNGjDB/qik69ZJn5trT
db/e+VlL5EeihLs4OeXmu+++m5ubi8r06dPVBo05lZ6efs4559x9992HDh1SZ3/605+KTbWojjVm
G0nmc6I+UU1NTWVlZRdeeCEqs2fPPrExzFrvzLWn5X6rqqoc5T+ww+TJk1G55557ZCUvL88J/VWX
n/sl8iMRw33NmjXZ2dlpaWkvvPBC2AaNnDp27Fh1dfVtt93mKL+pJmZTUlJw5ptLtLEmylR7Zj4n
5hO1ceNGVMy/yDfXemeuPV33e+6556K4fft2sTlw4EBs9u/fX2yijk30tIVbSxQfCRfuy5cv7xii
vSW3eRpL2tSBAwewiQt/dfbMM8+84IILtP+abY41UabaM/M5MZ+ohoYGx3iDl7Zwa70z156u+/3h
D3+I4l/+8heMA4GA+DQAF/WooI4xetrCrSWKj8QK91deeQWnJYL4rbfeCtugFQVtav/+/djs2rWr
Oiv+r8Jjjz1mLtGWq6JMtWfmc2I+URs2bHBO/RX06bpfEd8//vGPMZ47dy7GI0eOdI7/y47bb78d
4+effz7sWqL4SKxwT0tLw0f11RhJNGjUqbYTX5a566671FlMXXbZZfiGQLzptrlco90yqcznRH2i
mpqa1q9fL177njVr1omNYdZ6Z649XfcrXnYXb+Z+ww03pKam/ve//8XRe91116Hyne98xzn+9u7m
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
AABJRU5ErkJggg==&quot;&gt;
&lt;/div&gt;
&lt;p&gt;所有物理网卡收到的包会交给内核的 Network Stack 处理，然后通过 Socket API 通知给用户程序。下面看看 TUN 的工作方式：&lt;/p&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-03-27-linux-network-tun__2.png&quot;
src=&quot;data:image/png;base64,
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
cURqjrpD6f777//3v/999OhRPBE+/vjjSPjTn/4kulCQUJW7deu2atWqyspKVPQJEyaILnVX9X5u
ksFSRw6YF5Js6SnkTwZLnW3WRVwll+aysjI8seHJCeusGgcUObS3bt0qNvft24dNPOj8tI8opeLN
N99E5MYbb0T71VdfFQloYPP6669He8mSJSITj3HYXL9+vdgsLCzEJh7yxKYYuHnzZrGpBtHAs1Sz
Zs1QcoqLi9UEDUrI8OHDUWvFQEhJSXn++edlgtxhLN9//z0S8KgqNkeOHIlN+SSnkruy+bkJBksd
OWBeSLKlp5A/GSx1tsVfxNVVft68eWjfcsstWlx8DVCDyhF1J0I4HEYCFnq0x48fjyLRvXt3NLCJ
5yo8I8pvnuHxCGPxbCQ2jxw5gk0ExabY83fffSc21SBqFV5i0KBBe/fuVXtjqaqqQkGdOnVqZmam
cfJXUK2f//79+3/961937doVn6roBfHl0x9+OiFxvhza0M/NYKkjB8wLSbb0FPIng6XONm0R14il
WbSRPGzYMGyuWbNGjYuVHau/OexkarI0ZMgQBEtLS7Ozs++999577rknKysL6ziCeJKTaVqpQwOb
eEWxGXXPIohnUHwcNWrUt99+qyXE98477xiR78DJiPVVRo8ebUS+YnngwAFsHj9+XM0RJyTq657a
52aw1JED5oUkW3oK+ZPBUmebtohr1BUcduzYIX4KQ41feumlaC9evFimaVJSUqyvMm3aNCPyPTl8
3LBhw4cffojG7373O3x86KGHZJr2BUw0DMsXMGWyGvzoo4/Ev+Lr27fvzp07tZw4RDXt3bu3jFg/
/1atWhlKAV67dq36mYwYMQLtZcuWmQN+cmqfm8FSRw6YF5Js6SnkTwZLnW3aIq5RV3Bh+vTpIijj
hYWFTZs27d69OyrWsWPHtm/f/txzzw0aNEgO6dy5M5K3bdsmIz/8VLTS09O7du0qPhP59UCUPZkm
fiwFBS8UCu3ZswcN64+lyGQt+Omnn55xxhlo43lx1apVWpqAYnPfffe9//77eL7Ewxme0h588EEM
efbZZ2WO9fMX3437+9//juPduHEj6qL6meA8NGvW7Kyzzlq9evXRo0eLioquvfZa0dWgz00yWOrI
AfNCki09hfzJYKmzTS7QUakruPDdd98NGDBAi+MxZezYsXhSQc3r1avXzTffjEVZ9s6fP79jx47a
kNra2rZt2yLyhz/8QUTuvPNObCIof5ZSEL9s0DwiLy8PK77ssn56WnD37t0oOdhEEZ07d+7Jif9v
3Lhxubm5OTk52DmKKArP8OHDFy1apOZYP/+9e/def/312dnZeMY9//zz5U/WyCHFxcXXXXddhw4d
kDBw4MCov2xQ7+cmGSx15IB5IcmWnkL+ZLDU2aYu0ORNLHXkhHkhyZaeQv7EUmcfS533sdSRE+aF
JFt6CvkTS519LHXex1JHTpgXkmzpKeRPLHX2sdR5H0sdOWFeSLKlp5A/sdTZx1LnfSx15IR5IcmW
nkL+xFJnH0ud97HUkRPmhSRbegr5E0udfSx13sdSR06YF5Js6SnkTyx19rHUeR9LHTlhXkiypaeQ
P7HU2cdS530sdeSEeSHJlp5C/sRSZ5/4Y4zkZS1btmSpo1PGUhdYBktdQ4TD4VAoVFJSUlhYWFBQ
sNDnjMgzUMBgXjA7mCPMFOZLn0Ki2FjqAoulrkEqKyvLy8vxuFBUVIT1dIXPYfb1kP9hXjA7mCPM
FOZLn0Ki2FjqAoulrkGqqqoqKirKysqwkuK5YZPPYfb1kP9hXjA7mCPMFOZLn0Ki2FjqAoulrkFq
amrwoIA1FE8MoVBol89h9vWQ/2FeMDuYI8wU5kufQqLYWOoCi6WuQWpra7F64lkBy2g4HK7wOcy+
HvI/zAtmB3OEmcJ86VNIFBtLXWCx1CUzzj6RiqUusLjYJTPOPpGKpS6wuNglM84+kYqlLrC42CUz
zj6RiqUusLjYJTPOPpGKpS6wuNglM84+kYqlLrC42CUzzj6RiqUusLjYJTPOPpGKpS6wuNglM84+
kYqlLrC42CUzzj6RiqUusLjYJTPOPpGKpS6wuNglM84+kYqlLrC42CUzzj6RiqUusLjYJTPOPpGK
pS6wuNglM84+kYqlLrC42CUzzj6RiqUusLjYJTPOPpGKpS6wuNglM84+kYqlLrC42CUzzj6RiqUu
sLjYJTPOPpGKpS6wuNglM84+kYqlLrC42CUzzj6RiqUusLy52LVr184IFhyRfpAeYHhy9okaC0td
YHlzscNnJa+0YMARhcPhysrKqqqqmpqa2tpa/Zgbgzdnn6ixmDesbOkp5E/eXOwCWepCoVB5eXlF
RQUKHqqdfsyNwZuzT9RYzBtWtvQU8idvLnaBLHUlJSW7du0qKytDtcOznX7MjcGbs0/UWMwbVrb0
FPInby52gSx1hYWFRUVFqHZ4tsODnX7MjcGbs0/UWMwbVrb0FPInby52gSx1BQUFqHZ4tguFQuFw
WD/mxuDN2SdqLOYNK1t6CvmTNxe7QJa6hQsXrlixYtOmTXiwq6io0I+5MXhz9okai3nDypaeQv6U
mpp64sQJPdrYWOpcgHnH7OtRoiRm3rCypaeQP7Vq1erIkSN6tLGdQqkzIvToqbrllluwt7y8vNra
WhlEe8iQIYhPnjxZybXFg6UO847Z16NEScy8YWVLTyF/6tGjx2effaZHG9spFK3ElrqqqqoBAwZg
h9OnT5fBRx55BJHc3Fz0Krm2eLDUYd4x+3qUKImZN6xs6SnkT2PGjMESrEcb2ykUrcSWOti5c2fr
1q3T09M3b96MTXxEGxHE9VQbPFjq8Plg9vUoURIzb1jZ0lPIn5566qlrrrlGjza2hhYtUeckNWhN
U9uLFy/Oz8/PysrKzs7Gul9aWqrmoxc5/fr1Q2XCR7TffPNNNcE+w3ulDvOO2dejREnMvGFlS08h
fzp06FCHDh1WrlypdzQqrUTZEbWwpaSkaBGZI9q5ublbtmw5cuSI+OLkJZdcoubDXXfdhXiXLl3w
8e6779Z67TM8Vuow45h3zL7eQZTEzBtWtvQU8q3ly5fjsWbmzJmff/653tdItKJlh1rGZCQtLU2L
yBzR3rBhg9isrKzEZkZGhpkd8c0336Snp6MLH9HWeu0zPFPqMMuYa8w45l3vI0pu5g0rW3oK+VlR
UdH48eM7d+4sCoAXyCvNJusow0apq6mpEZt1kfqq7QGuuuoqBEeOHImPY8eO1XrtEzv3Aswy5hoz
rl8EREnPvGFlS08hShzDUnLqJdZxLZKamio3UdXUnKj5WmT27NmIjBgx4sSJE8OHD0d7zpw5aoJ9
hmee6ogoFvOGlS09hShxtJJjR0pKijaqadOmiBw7dkxsbty4US1m1sKmRbZs2ZKRkZGZmfnFF19g
Ex/RRgRxmWMfSx2R95k3rGzpKUSJcwqlTnz1ddu2bTKSn5+PyKOPPlpZWVlcXHzBBRfYL3UY0qdP
H2w+/fTTMmHevHmIII5eGbTJYKkj8jzzhpUtPYUocbQiZMf8+fM7duyolqvS0tIxY8ZkZ2e3adMm
Ly9v0aJFaq/atkYmTZpkRL5FV6dc/WiLb9rddNNNMmiTwVJH5HnmDStbegpR4mhFKABY6oi8z7xh
ZUtPIUocljoicp95w8qWnkKUOCx1ROQ+84aVLT2FKHFY6ojIfeYNK1t6ClHisNQRkfvMG1a29BSi
xGGpIyL3mTesbOkpRInDUkdE7jNvWNnSU4gSh6WOiNxn3rCypacQJQ5LHRG5z7xhZUtPIUqcdu3a
GcHSsmVLljoij2OpI7eFw+FQKFRSUlJYWFhQULDQ/3AUOBYcEY4LR6cfMBE1NpY6cltlZWV5eTke
gIqKilAhVvgfjgLHgiPCceHo9AMmosbGUkduq6qqqqioKCsrQ23Ak9Am/8NR4FhwRDguHJ1+wETU
2FjqyG01NTV49EFVwDNQKBTa5X84ChwLjgjHhaPTD5iIGhtLHbmttrYW9QBPPygM4XC4wv9wFDgW
HBGOC0enHzARNTaWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIi
CjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiW
OiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCjiWOiIiCrgopY6I
iCiQWOqIiCjgWOqIiCjg/g8Tr0wq25T8rQAAAABJRU5ErkJggg==&quot;&gt;
&lt;/div&gt;
&lt;p&gt;普通的网卡通过网线收发数据包，但是 TUN 设备通过一个文件收发数据包。所有对这个文件的写操作会通过 TUN 设备转换成一个数据包送给内核；当内核发送一个包给 TUN 设备时，通过读这个文件可以拿到包的内容。&lt;/p&gt;
&lt;p&gt;如果我们使用 TUN 设备搭建一个基于 UDP VPN，那么整个处理过程就是这样：&lt;/p&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-03-27-linux-network-tun__3.png&quot;
src=&quot;data:image/png;base64,
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
27Y9evQYPXr0nDlzKioqjDAVaXahWdwXdjNmzBg0aJDZG6cmzuxtFvujtOBlxW233SZXk0XV0NCg
O6U9atQo6b/99tttsclZGVPYyROcNm1anz598vLyCgoK+vbtO3nyZCOmsbFuOMequU733m9srEyl
+nsr+fn5jU1rY2OBdEukIN0yQ4BgcCZKldxPx//w4f79+3/729/KK0rnzp2XL1/ujDR60DyWu8rp
1KlTxcXFP/zhD80TcWrizN6mMx6lpS6r1NbWXnrppXLBBx98UHf+4he/kJ6hQ4fKWVtsclZmFHbz
5s3Lycm5/vrry8rK6urq5Jm+8MIL48ePN8KSjnXJOVbN9ek07/3Gxi5YsMCK/8E8+bpw4ULzdFxj
Y4F0S6Qg3TJDgGBwJkqd3LUjR470799f3kbv3LnT3u8ci+ax3FVOb7/9tkSuXbvWPBGnJs7sbTrj
UVrqstqePXs6deqUm5u7bds2OZSv0pYe6TdDk7EyoLDbsGFDVlbWyJEjz/nHQZ1j3XOOVXNt70nH
3m9srPqp7dy5c634z3TN03GNjQXSLZGCdMsMAYLBmSidyV08//zz0jl9+nR7pzMMzWO5q5zuu+++
jh071tfXq8PnnntOXnTbt28/bNiwxYsXq4nTwVIcTJw4UeKlZpKXyZUrV6p+9UdoX3zxRR25dOlS
K/4XaNWh/VHUNTUVYG87e1Rbrj9mzJjCwsKuXbtOnjy5vLzcHi9nJebiiy+Wsky+Svull16yB6Rg
ZUBhp/6Km9wTo9/JOdY951g1d0Zni+/9pGNlKqV/yJAh0lZLQnrMoEbGAj5IpCDdMkOAYHAmyqTJ
vbKyUjrPP/98e6czDM1juSvspCabOnWqar/++usy6vLLL4/FSUNNnDq7fv36Nm3aSGm1b9++o0eP
zpgxQ05J8SenfvWrX1nx/xVaX/bqq6+Wnvnz56tD+6OcaaSMy8rKMnp0jGoPHTp0+/btx44dU79m
veqqq+zx4p577pH+Xr16ydfGfrmclJUBhd15550nnR9++KHR7+Qc655zrJo7o7PF937SsbNnz5b+
Rx55RNoPP/ywtOfMmWMGNTIW8EEiBemWGQIEgzNRJk3u9fX10pmbm2vvdIaheSwXhd2BAweknHrm
mWfU4dixY2XUW2+9pQ43btyoJk4dSkkn7Z07d6rDgwcPWvH/WF3an332Wdu2baXs+/TTT+VQvkq7
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&quot;&gt;
&lt;/div&gt;
&lt;p&gt;数据包会通过内核网络栈两次。但是经过 App 的处理后，数据包可能已经加密，并且原有的 ip 头被封装在 udp 内部，所以第二次通过网络栈内核看到的是截然不同的网络包。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_tap_设备&quot;&gt;&lt;/a&gt;TAP 设备&lt;/h2&gt;
&lt;p&gt;TAP 设备与 TUN 设备工作方式完全相同，区别在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
TUN 设备的 /dev/tunX 文件收发的是 IP 层数据包，只能工作在 IP 层，无法与物理网卡做 bridge，但是可以通过三层交换（如 ip_forward）与物理网卡连通。
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
TAP 设备的 /dev/tapX 文件收发的是 MAC 层数据包，拥有 MAC 层功能，可以与物理网卡做 bridge，支持 MAC 层广播
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a name=&quot;_macvlan&quot;&gt;&lt;/a&gt;MACVLAN&lt;/h2&gt;
&lt;p&gt;有时我们可能需要一块物理网卡绑定多个 IP 以及多个 MAC 地址，虽然绑定多个 IP 很容易，但是这些 IP 会共享物理网卡的 MAC 地址，可能无法满足我们的设计需求，所以有了 MACVLAN 设备，其工作方式如下：&lt;/p&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-03-27-linux-network-tun__4.png&quot;
src=&quot;data:image/png;base64,
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&quot;&gt;
&lt;/div&gt;
&lt;p&gt;MACVLAN 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡。单独使用 MACVLAN 好像毫无意义，但是配合之前介绍的 network namespace 使用，我们可以构建这样的网络：&lt;/p&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-03-27-linux-network-tun__5.png&quot;
src=&quot;data:image/png;base64,
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
06dfunSJP/a+O79ztw/FLLF669Ytsco7l5SUNPrtTGwrW0uOvA1Q3K3+KTiBAjTNET88eEDy+DqA
PdDoRTVx4kTN8nGqVP7iiy+oPGnSJLZJfAr9/bOqvWjWJBrSMyN3AWdf57LVTytY3nCX7WLVb2F/
e75w4QKr0o2L5kZ/e6ZbMbp7lg+0KaTRsx1MiZSe2at7/pDCwsIpU6b4+/uzRkLZjj/2vju/Y9NH
v8q/nYn9Xxm9CBM7sLXEbl/0iY/SPwUn0ILx8/NbsWLF9u3bExISTp065fTHeQKfpiYR5/e+VacX
VWxsLG3q378/leknlQ8ePMg2iXvQ379YttfiIE29eOUC1tPnJbkLOHshsd+diu+wkLAbEbHFdvmK
LbNnz9aEd25v3ryZqh9//DHv7DgFlzsF/fHjx8sH2hTS6NkOpoT9adbeL7e5a9eusb/qeXl58Ubb
ubOlfzxSlf1qhL9WoGgodnj55ZepvG3bNt7fHmm3TKOn4IQ5c+aEhISsXr16586dSUlJZ8+epVef
dOsmzyU4wHaaHCHNr37V6UXVYPniONr6/fff08+goKCGu9lC3IP+/sWyvRYHaerFKxewnj4vyV3A
2QuJbi/491vfuHHjzJkztNbFm126EaE9nz59mrfYLl+xhV6i9ujRg+LjJYtBgwbRHmiliv0dpOBy
nzFjxrx58+QDbQpp9GwHU7J3717N/lvDhg4dun79+vPnz9fV1e3atYvaR4wYwR9rO3e29I9HqrI/
BH755Ze0VFJSUvhfiNhWWkIdO3bs3bs33dZUV1dnZGS88cYb/LEi8VH6p+CEcePGRURESCsHb9t2
jjj7jpOWjX71QRbV3LlzqSf7viLxwhT3oL9/sWyvxUGaevHKBaynz0tyF3D2QiKpqanSF2rR8uJb
ly1b1r179yYt6Ozs7NGjRz9sER4eTitV6NsECi73kSNHRkdHywfaFNJY2Q6mLZqCPn36UAwKDg5e
vny5+BC6O6S7eQpeHTp08Pf3nzp1KnunDH+gNHe2pK361cuXL4vfzrRmzRqpQ2Zm5tixYx999FHq
MHDgQNt39DDio/RPwQk0Su++++6GDRtiYmJ++eUXSvyVlZV427ZzxMl1nLQq9KsPsqjose3atdMs
b5ehMm8X96C/f+m5Gm1xkKZevHIB6+nzktwFnL2QVKbgcqf70cLCQvlAQRmUhrt27Tp//vxNmzbF
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
ACjn/wHIRm+78iTTLgAAAABJRU5ErkJggg==&quot;&gt;
&lt;/div&gt;
&lt;p&gt;由于 macvlan 与 eth0 处于不同的 namespace，拥有不同的 network stack，这样使用可以不需要建立 bridge 在 virtual namespace 里面使用网络。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_macvtap&quot;&gt;&lt;/a&gt;MACVTAP&lt;/h2&gt;
&lt;p&gt;MACVTAP 是对 MACVLAN的改进，把 MACVLAN 与 TAP 设备的特点综合一下，使用 MACVLAN 的方式收发数据包，但是收到的包不交给 network stack 处理，而是生成一个 /dev/tapX 文件，交给这个文件：&lt;/p&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-03-27-linux-network-tun__6.png&quot;
src=&quot;data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAwIAAAEYCAIAAABgDNY7AAA1cklEQVR4Xu3de3hU1b3/8eGWQAJo
SFORi5aAqC2KBfJYgqaoWP5QbGorLSoH4Tmt2qPHejwcah+L1uLD4/WgVgQ9lpuAGLkpBEQICJEA
iRCIXANIQiAhIRBICAkE+X1/WWXNdk0yhGFmZ8/s9+uPPOs2M/uyZu3PZCYZz3kAAABX8pgNAAAA
7kAMAgAALuWNQd8BAAC4ADEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4
FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEI
AAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4
FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIAAC4FDEIABoVHx/vcRPZX/MQABGNGAQAjZJkoNdG
N5D9raioqKysrK6urq2traurM48IEFm8k1+XzCEA4FYujEEFBQXFxcXl5eUShiQJmUcEiCzeya9L
5hAAcCsXxqC8vLz8/PyioiJJQtXV1eYRASKLd/LrkjkEANzKhTEoMzMzNzdXklBxcXFlZaV5RIDI
4p38umQOAQC3cmEMSk9PlySUl5dXUFBQUVFhHhEgsngnvy6ZQwDArVwYg+bOnbt8+fJNmzbl5+eX
l5ebRwSILN7Jr0vmEABwK2KQeUSAyOKd/LpkDgEAtyIGmUcEiCzeya9L5hAAcCtikHlEgMjinfy6
ZA4BALcKRQx68803PfXeeusts6+5EYPgNt7Jr0vmEABwq6DHILnP66+/vlW9G2644TvLKuwExCC4
jXfy65I5BADcKugxaMWKFXKfv/71r++//34pfPHFF7pL/YpoxowZ/fr1a9++vYSk999/v4m9wUIM
gtt4J78umUMAwK2CHoPuu+8+uc81a9asXr1aCr/85S91lwo699xzz6FDh4qLi6Ug1WnTpjWlN1iI
QXAb7+TXJXMIALhVcGPQgQMHWrVqddNNN6mqFKRaUFCgqiro7Nq1S1WlINU+ffo0pTdYiEFwG+/k
1yVzCAC4VXBj0Lhx4+QOp06dqqpSkOqf//xnVVVBp6amRlVPnz4t1ZiYmKb0BgsxCG7jnfy6ZA4B
ALcKYgySBPODH/xApRkraVThRlUb+32P/95g8RCD4DLeya9L5hAAcCtP8GLQ9OnT5d7uvvtua+Nd
d93lqf/g83nLp38OHz5cXFx87733SvWDDz5QI/33BgsxCG7jnfy6ZA4BALcKYgxKSkpSIcPaOGfO
HGmUrvMXgo6kpb59+8bGxl5//fVTpkzRI/33BgsxCG7jnfy6ZA4BALcKYgy6KBV0zNYL/PcGCzEI
buOd/LpkDgEAt7IheWj+g47/3mAhBsFtvJNfl8whAOBWNiQPzX/Q8d8bLMQguI138uuSOQQA3MqG
5OEoxCC4jXfy65I5BADcihhkHhEgsngnvy6ZQwDArYhB5hEBIot38uuSOQQA3IoYZB4RILJ4J78u
mUMAwK2IQeYRASKLd/LrkjkEANyKGGQeESCyeCe/LplDAMCt4uPj6/9Q3S1iY2OJQXAVYhAA+FNR
UVFQUJCXl5eZmZmenj7XFp7638o0C9lH2VPZX9lr2XfzcACRhRgEAP5UVlYWFxfn5+fn5uZKPlhu
C4lBZpNdZB9lT2V/Za9l383DAUQWYhAA+FNdXV1eXl5UVCTJIC8vb5MtJAaZTXaRfZQ9lf2VvZZ9
Nw8HEFmIQQDgT21tbWVlpWSC4uLigoKCfFtIDDKb7CL7KHsq+yt7LftuHg4gshCDAMCfuro6SQPV
1dUSCyoqKsptITHIbLKL7KPsqeyv7LXsu3k4gMhCDAIAx5EYZDYBCAFiEAA4DjEIsAcxCAAchxgE
2IMYBACOQwwC7EEMAgDHIQYB9iAGAYDjEIMAexCDAMBxiEGAPYhBAOA4xCDAHsQgAHAcYhBgD2IQ
ADgOMQiwBzEIAByHGATYgxgEAI5DDALsQQwCAMchBgH2IAYBgOMQgwB7EIMAwHGIQYA9iEEA4DjE
IMAexCAAcBxiEGAPR8QgTz0/jTU1NS+++GLv3r2jo6Pbtm3buXPnpKQkY6TBt6tNmzbXXHPNH//4
xxMnTujbAoAD6UUMQEiFRwwaN26clN99991Tp04VFhbOmzcvOTm5wZEG3XXu3LmioqIxY8ZI9cEH
HzTHAYCTNLamAQiu8IhB3bt3l/LRo0e/P+RfGry5YnSVlZVJNS4uzjIEABynsTUNQHCFRwyKj4+X
cp8+fcaOHbto0SLjXa0Gb64YXaWlpVLt1KmTZQgAOE5jaxqA4AqPGDRv3ryEhATVIqKjo3/3u9+V
lJRYRxqMO7G+Kfb444+rXgBwJr2IAQip8IhBora2dsWKFQ899FCHDh1U17333tvgSCvVZdWjR4/K
ykpzHAC3Ur9sRlPIsTIPHxDmHBGDWrZsKU+wM2fO6BYpS4u0W0b9y9mzZ5988knpbd++vWpRz8/v
j/oX3XX69OmcnJykpCSpTp482RwHwK1kTdCrH/yTY1VRUSGvJKurq+WlaV1dnXk0gXDjnd66ZA4J
vR/96Efy7Nq1a5du2bFjh6f+NzeWUV5Hjx6V3h/84Aeq2pQYpBw6dCgqKioxMZFnLwCFGNR0cqwK
CgqKi4vLy8slDEkSMo8mEG6801uXzCGh97//+7/y7Bo6dOjOnTvlRYb8HDJkiLRIuxpw8803v/zy
y19//bV67r399tvS+9RTT6nepscg8atf/Upa0tLSrI0AXIsY1HRyrPLy8vLz84uKimQ1luXaPJpA
uPFOb10yh9hixowZt9122xVXXNGyZUv5KWVp0b2pqak33njjlVde2aZNm6ioKCn/7W9/0y9EVNYx
WLv0/YiFCxdKy8CBA62NAFzLQwxqMjlWmZmZubm5koSKi4v5nCUigHd665I5BAAiFzGo6eRYpaen
SxLKy8srKCioqKgwjyYQbrzTW5fMIQAQuYhBTSfHau7cucuXL9+0aVN+fn55ebl5NIFw453eumQO
AYDIRQxqOmIQIo93euuSOQQAIlfTY9DIkSN79+5tttZTH0M0WwNifZQg3q0YPXq03FtycnJdXZ1u
lPLAgQOlfcyYMZaxDSMGIfJ4p7cumUMAIHI1MWecO3cuISHh6aefNjvqBSuvGI8SrLtVqqurb775
ZrnDCRMm6Ma///3v0tK3b1/ptYxtGDEIkcc7vXXJHAIAkauJOSMrK0tGrly50uyoF6y8YjxKsO5W
27NnT8eOHdu0aZOTkyNV+SllaZF2c2hDiEGIPN7prUvmEACIXE3MGc8991yHDh1qa2tVdebMmT17
9oyJienXr9+MGTOMvLJu3bohQ4bIeEkYycnJS5cuVe0//elPZdgnn3yiR6alpUmL3ImqWh9F3aem
bzJnzhzVEh0d3bt3b7mJ3irVLtsjdyjbJls4a9YsfUNFHl3G3HDDDRJi5KeU58+fb4xpjIcYhIjj
nd66ZA4BgMhlTRh+SIK5//77VfmLL76QWw0aNKignhRU/lC9q1evbt26dUpKyt69e48dOzZy5EgV
TaTrH//4h6f++xD13d5zzz3S8s4776iq9VHON/LboHHjxi1btqyqqurEiROvvvqqDHj22WdVlxo/
cODAAwcOFBYWqg3LyMj4/h2c/9Of/iTtXbt2lZ+Nvc3XIA8xCBHHO711yRwCAJHLN2f4Onz4cIsW
LT744ANVHTx4sNxq/fr1qvrVV19Z84oEIClv27ZNVY8cOSJV9ann48ePt23bVkJSSUmJVOWnlNu1
ayft530e5XwjMcjq7NmzMiAxMVFV1XjZHlVVG3bHHXd4b1BPHrdNmzbSJT/VljSRhxiEiOOd3rpk
Drl01113nXo2AkCzkxXJXKQsPH5zhvL+++9LQJGYoqqdOnWSW1VWVqrqyZMn1QOpakxMjPXRlVat
Wqnehx56SKqvv/66lF977TUpP/zww6rLeJTzDcWg0tLSRx55pFu3bpKf9J23bNnSOt7YsPj4eO/t
6/3yl7+U9rvuukt+pqamGr1+ePzGIFZ+2M//s7spvNNbl8whABC5PE2IQZIV+vfvr6tGDJKCWpFV
VcUgySt6vFVGRob03nTTTVKWn1Jes2aN6jIe5XxDMWjo0KGe+nfBysrKpFpTU2Mdo8rGhhkx6K23
3pLGO++889y5c3fccYeU3377besAPzx+YxAQjrzTW5fMIQAQuYyc4au2trZ9+/bjx4/XLT//+c89
jb8ppt4ys34O2koesWfPnjLgvffek5+9evX6rn4h9n0U0aJFC2PzOnToYA06EqGsD63Kft4U27Jl
S3R0tDzQt99+K1X5KWVpkXY9xg8PMQgRxzu9dckcAgCRy8gZvlasWCFjNm7cqFs+//xzT+Mfkc7M
zIyKiurRo8eGDRtOnTq1c+dOSTwDBgzQN3/ppZdkcLt27eTnxIkTVaPvo4guXbpI444dO3SLeifr
jTfekHuWwfp9KNWrymrD9Eek9Z/fS3jq3bu3tLz77rv6DidPnuyp/+iSjlZ+eIhBiDje6a1L5hAA
iFw6QzTmqaeeSkhIOHfunLVx2rRpiYmJEmX69u07ffp0axYR2dnZqamp8fHxkod69eo1atQoyQ26
9/Dhw61atfLUf2BIfxKosUe56qqrrHcu44cPH96pU6fo6Ohbbrll9uzZ1l5Vlu2RrZJtkyim/kJN
UX+zJkHqO8vSL2UVrf7t3/5NNzbGQwxCxPFOb10yhwBA5NIZojGSY5oSES5TUB7FGolCgRiEyOOd
3rpkDgGAyBXS3GAzYhBwqbzTW5fMIQAQuUKaG2xGDAIulXd665I5BAAiV0hzQ4QhBiHyeKe3LplD
gkS9TNHVrKysuLg4aXn55ZetAwy+XW3atLnmmmv++Mc/njhxwtr72GOPqaq10Vo2+A4D4EIeYlCT
eYhBiDje6a1L5pAgsQaOjIyM9u3bt2rV6p///GeDAwy669y5c0VFRWPGjJHqgw8+aO1t0aJFZmam
702MssFPFwA38BCDmsxDDELE8U5vXTKHBIkOHEuWLGlbb9GiRQ0O8GV0lZWVSTUuLs7ae8UVV/zk
Jz+pra31vYlxcys/XQDcwEMMajIPMQgRxzu9dckcEiQqcHz88cdt2rSRyLJmzZoGBxiNitFVWloq
1U6dOll71T8BmzBhgu9NjJtb+ekC4AYeYlCTeYhBiDje6a1L5pAgUYFD/dMw63thmhpgsHZ99/03
xR5//HFrr3QNGjSobdu28uS03qSJ9wzAnTzEoCbzEIMQcbzTW5fMIUGiAsekSZPkZ8eOHVevXt3g
AKNRUV1WPXr0qKystPZKYfv27VFRUUOGDLE2GmWDny4AbhAfH6/WAVxUbGwsMQgRxu4YJIV33nmn
RYsW7dq1++yzzxoc4Et3nT59OicnJykpyVP/LpjRK8aPHy/lmTNnWhutZYOfLgAuUVFRUVBQkJeX
l5mZmZ6ePtcBPPW/d3EgOT5ylORYyRGT42YeSiDcNEMMEu+9954koTZt2syePbvBAQaj69ChQ1FR
UYmJiXV1dUav5KQbbrghISHB2tj0ewbgQpWVlcXFxfn5+bm5uXKNX+4Asi6ZTc4gx0eOkhwrOWL6
V/JA+GqeGCSmTZvWst67777b4AAr365f/epX0pKWlubb++WXX0rGsjb63lzz0wXAJaqrq8vLy4uK
iuTqnpeXt8kBZF0ym5xBjo8cJTlWcsTkuJmHEgg3zRaDxIcffqg+MT1x4kQ9wNDYbRcuXCgtAwcO
bLD3D3/4g+/NDRftAuAStbW1lZWVcl0vLi4uKCjIdwBZiMwmZ5DjI0dJjpUcMf0PSoDwZV8MAgBn
qqurkyt6dXW1XNorKirKHUBikNnkDHJ85CjJsZIjpj6WAIQ1YhAAOA6/lgbsQQwCAMchBgH2IAYB
gOMQgwB7EIMAwHGIQYA9iEEA4DjEIMAexCAAcBxiEGAPYhAAOA4xCLAHMQgAHIcYBNiDGAQH4bu+
nU/OkXnaEAIeYhBgC2IQHESWfj0P4Uxyjvg/wjYgBgH28C5uumQOAexCDHI+OUd8q5QNiEGAPbyL
my6ZQwC7EIOcT84R3zFuA2IQYA/v4qZL5hDALsQg55NzlJmZmZubK0mouLi4srLSPIsIBmIQYA/v
4qZL5hDALsQg55NzlJ6eLkkoLy+voKCgoqLCPIsIBmIQYA/v4qZL5hDALsQg55NzNHfu3OXLl2/a
tCk/P7+8vNw8iwgGYhBgD+/ipkvmEMAuxCDnIwbZgxgE2MO7uOmSOQSwi/8Y5Kl3yy23nD171rfd
2uLHJQ2+fJf6cIsXL05JSUlISGjVqlX79u27d+9+6623Wgdc6h36EdhdeYhBtvAQgwBbeBc3XTKH
AHbxf1VWl23x8ssv+7ZbW/y4pMGX75IebsqUKTL4xRdfPHr0aFVV1datWydNmtS3b1/rmEu6Q/8C
uysPMcgWHmIQYAvv4qZL5hDALv6vyuqyfdVVV8XExOzfv99otwz055IGX75LerhevXrJ4BMnTpgd
Fpd0h/4FdlceYpAtPMQgwBbexU2XzCGAXfxfldVl+6OPPpKfQ4cONdp1dd26dUOGDOnQoUPHjh2T
k5OXLl1qjNRUY2JiopQ3b96sqrfffntKSooqf/3119LVs2dPVRWff/75bbfdJjmsXbt2gwYNkqru
UvdZU1Pz1FNPJSQktGzZUjfqMXl5eV27dm3VqtVbb72lGzW5Wxk8bNgwCRnHjh0zuxvZfjFnzhzV
Eh0d3bt37+eee662tlb3yoP+9re/7dy5s/T2799/0aJFqt24E//bpnmIQbbwEIMAW3gXN10yhwB2
sV6VfenLtgQFKXz44YdGu1i9enXr1q0lx+zdu1eSxMiRI6VrxowZvneiPfroo9Ly9ttvS1lu0qqe
SiFvvvmmdD3++ONqpIQeCTcDBw48cOBAQUGBFKSqk5C659dee23Lli11dXXWRlWWfHbllVdKPrMm
M6uXXnpJjVcklDz00EOyR9Yx1jvUxo0bt2zZsqqqqhMnTrz66qsy4Nlnn1VdElYksXXv3n3lypWV
lZWS9h588EHVZb2ri26b5iEG2cJDDAJs4V3cdMkcAtjF9wJvpS/bRUVFHTt2TEhIkGuwtV1IAJLy
tm3bVPXIkSNS7d2794X7aCBGzJ8/X1p+97vfSXn27NlqgBSkOnz4cCkvXLhQjRw0aJBUv/rqK1XN
zMyU6m233aaq6oY5OTmqam2UwqJFi9q2bStxZOvWrdYBBokXd9xxh+QwdUPRokWL999/Xw/Qd9iY
s2fPyoDExERVveuuu6SqfwNkpe+qidumeIhBtvAQgwBbeBc3XTKHAHbxf4G3JoDJkydLefTo0Ua7
el/JIKmiwTtRKioqZICEACmPGDFCAkSPHj2kINWuXbu2bt1af1inXbt2ctvKykpVPXnypFSlUVXV
PZ85c0ZVrY2SY+QhBgwYcPjwYWtvY6qrqyVsjR8/vn379p7vvyvnu/2lpaWPPPJIt27dZFNVr1Bv
yZ2/cED8vMV2qdvmIQbZwkMMAmzhXdx0yRwC2MW4wBvUZVuVZfDtt98u1dWrV1vb1VVfkoH3Zt9n
HawNHDhQGvfv39+pU6exY8f+93//d1xcnFzjpXHQoEF6mBGDpCBVeURVbfCeVWPHjh3l55AhQ44f
P24M8G/JkiWe+k/86BbfRxk6dKin/l2wsrIyqdbU1FjHqAPS4OMGtm0eYpAtPMQgwBbexU2XzCGA
XYwLvMF6dRe7du1Snwi2tg8ePFjKn3zyiR5maNGihe+jPP/88576zwDJzw0bNmRlZUnh97//vfz8
29/+pocZb4pJwePzppgebG3Mzs6Oj4+XwvXXX79nzx5jjB8qaV133XW6xXf7O3To4LGEszVr1li3
5M4775Ty4sWLvTe4ILBt8xCDbOEhBgG28C5uumQOAexiXOAN1qu7MmHCBNWo2zMzM6Oionr06CFp
5tSpUzt37nzvvfcGDBigb9KlSxcZvGPHDt1y/kKgadOmTbdu3dSW6PeYJBLpYeoj0hKGCgoKCgsL
peD7EWk92Gj85ptvrr76ainHxcWtXLnSGKZIEPmf//mfVatW7d+/v6ampqys7IUXXpCbTJ06VY/x
3X716Z833nhD9nfjxo2SmaxbIsehbdu21157bUZGRlVVVW5u7m9+8xvVdUnbpnmIQbbwEIMAW3gX
N10yhwB20RfvBlmv7sqZM2duvvlmoz07Ozs1NTU+Pl7yUK9evUaNGiUXbN07bdq0q666yrhJXV3d
lVdeKS3/+Z//qVqefPJJqUqj/psvRf3BfLt6ycnJkgZ0l+/mGY179+6VOCJVCVjvvPPO9wf+f/ff
f3/fvn0TEhLkziVgSSi544470tLSrGN8t//w4cPDhw/v1KlTdHT0Lbfcoj/lrW+ydevWBx544Ic/
/KEM6NevX4N/MH/RbdM8xCBbeIhBgC28i5sumUMAu1gv3nAmYpA9iEGAPbyLmy6ZQwC7EIOcjxhk
D2IQYA/v4qZL5hDALsQg5yMG2YMYBNjDu7jpkjkEsAsxyPmIQfYgBgH28C5uumQOAexCDHI+YpA9
iEGAPbyLmy6ZQwC7EIOcjxhkD2IQYA/v4qZL5hDALsQg5yMG2YMYBNjDu7jpkjkEsAsxyPmIQfYg
BgH28C5uumQOAexCDHI+YpA9iEGAPbyLmy6ZQwC7qC+3gpPFxsYSg2zgIQYBtiAGwVkqKioKCgry
8vIyMzPT09PnhjlP/e9OIoycFzk7co7kTMn5Mk8hgoEYBNiDGARnqaysLC4uzs/Pz83NlWvt8jAn
FzOzKfzJeZGzI+dIzpScL/MUIhiIQYA9iEFwlurq6vLy8qKiIrnK5uXlbQpzcjEzm8KfnBc5O3KO
5EzJ+TJPIYKBGATYgxgEZ6mtra2srJTra3FxcUFBQX6Yk4uZ2RT+5LzI2ZFzJGdKzpd5ChEMxCDA
HsQgOEtdXZ1cWaurq+USW1FRUR7m5GJmNoU/OS9yduQcyZmS82WeQgQDMQiwBzEICCEuZggMMwew
BzEICCEuZggMMwewBzEICKGAL2aeev5bDHv27Lnvvvs61JPC3r17zREIH/7PNYBgIQYBIRTwxcw3
9Pi2WJWVlXXp0iUpKelgvf79+3fr1q2c/20YtvycawBBRAwCQijgi5lv6PFtsfrrX/8qvYsXL1bV
BQsWSPX555///iiEDT/nGkAQEYOAEPJzMVu7du2QIUM6dOjQsWPH5OTkJUuW6C6VeDRrY1paWkpK
SlxcXKdOnYYNG7Zv3z7V269fP+k9ePCgqhYUFEh1wIABqoqwo887gJAiBgEh1NjFLCMjo3Xr1hJo
8uu/lmvkyJEycvr06XqANQBZW/r27bt58+YTJ068+OKLUv35z3+ueiVOSbWmpkZVq6urpSoBy3t7
hJXGZg6A4CIGASHU2MVMApB0bd26VVVLSkqk2rt3bz2gsRiUlZWlqpKEpBodHa2qLVu2lOq5c+dU
ta6uTqqtWrVSVYSdxmYOgOAiBgEh1NjFLCYmRsUaK2tqUS2WW/yrRf++RxKPdYz6bdDp06dVld8G
hTvj7AMIEWIQEEKNXcxUDDpy5IjZcYE14jSlRX02qLCwUFUPHDjg4bNB4cw41wBChBgEhFBjF7PB
gwd76j/vbHZc0KJFCz+hx7flueee81j+Umz+/Pke/lIsnDU2cwAEFzEICKHGLmbr1q2Liorq0aNH
VlZWVVXVjh07pk6dav3lTZcuXeS227dv1y3+Y1BpaWnnzp2TkpKK6vXv31/u4ejRo9bxCCONzRwA
wUUMAkLIz8Vs06ZNqamp8fHxkod69eo1atSojRs36t5//vOfV111lTXo+I9BYvfu3ffee2/7esOG
DduzZ49lLMKMn5kDIIiIQUAIcTFDYJg5gD2IQUAIcTFDYJg5gD2IQUAIcTFDYJg5gD2IQUAIcTFD
YJg5gD2IQUAIcTFDYJg5gD2IQUAIcTFDYJg5gD2IQUAIcTFDYJg5gD2IQUAIcTFDYJg5gD2IQUAI
cTFDYJg5gD2IQXCompqarl27euBsV199tXnmEAweYhBgC2IQHGrLli19+vTR0xIOlJOTc+ONN1ZU
VFRWVlZXV9fW1tbV1ZknEgEhBgH20AsaMQjOMmPGjBEjRuhpCQeaMmXKsGHDCgsLS0pKjh07VlVV
debMGfNEIiDEIMAeekEjBsFZxo4dO3HiRD0t4UB/+MMfnnjiie3bt+/fv7+4uPj48eM1NTXmiURA
iEGAPfSCRgyCswwdOnTJkiV6WsKBbr311pdeemnDhg3ffPPNgQMHysrKTp8+bZ5IBIQYBNhDL2jE
IDhLly5dCgsL9bSE08g5iouLmzp16sqVK7Ozs3fv3l1SUlJdXW2eSASEGATYQ69pxCA4SGlpqVxi
9ZyEA+Xn58fExEybNm3RokVr167Ny8s7dOgQMShYiEGAPfSaRgyCg6xatSolJUXPSTjQrFmzevXq
NXPmzCVLlnz11Vc7d+4sKSmpra01zyUCQgwC7KHXtJDHoB49esgTOzc3V7eMHj1aWh566CHdsmXL
FmmJjY1VH7RU/5hE98I9Jk2a9MQTT+g5CQd6+umnBw8ePHv27GXLlm3YsGHPnj1lZWVnz541zyUC
wtIH2EOvaSGPQf/+7/8uT+y33npLt1x//fXS8qMf/Ui3SK+03HfffapKDHKtMWPGTJ06Vc9JONAv
fvGLhx9++KOPPlqxYkV2dva+ffuOHTt27tw581wiICx9gD30mhbyGDR37lx5Yj/wwAOqevTo0RYt
Wqigc+jQIdUovVKdPHmy92ZwpaSkpKysLD0n4UCJiYnPPvtsWlraqlWrNm/efODAgRMnTpgnEoEi
BgH20GtayGPQkSNHJPd07txZVT/99FN5nkdFRclPWUlVo/RKdf/+/apq/W2QKp8+ffqpp55KSEho
2bKlal+7du2QIUM6dOjQsWPH5OTkJUuWqHaEr7q6utjY2MrKSj0n4TTyTJQnr7xiWbhw4Zo1a7Zt
23bw4MFTp06Z57IJZs+erZ7d0dHRvXv3fu6556z/fMh/bwTTSx+AkNLLWshjkOjbt688t3fv3i3l
P//5z1J++OGH5ed//dd/SYu0S/nGG2/U49XyZy2/+uqr8rpTf/4gIyOjdevWKSkp+fn55eXlI0eO
lDHTp0/X94BwtGvXrp49e+oJCQfKzMyUVyPyXJPXM+vWrdu+ffvhw4cD+6dB48aNS09Pl9RbUVHx
yiuvyFP42WefbWJvBCMGAfbQy5odMeiZZ56R5/b7778vZckuUs7JyZGfP/vZz6Tl//7v/zwXIpHi
G4Oys7N173cX7mTr1q2qWlJSIlV5yWgdg7Dz8ccfp6am6gkJB3r99dflVc2sWbOWLl26fv16Sa5H
jhy5/G/SkHuQp3BiYqLZUc9/b4TRSx+AkNLLmh0xSFZMeW6PGjWqtrY2Jiama9eu0iiLWlRUlLyO
lHbpXbFihR7vG4OMP8eVO1HtVq1atbKOCYr4+HjzYcKc7JG5k44xvp6ekHAgebbec889c+bMWb58
+caNG/Pz848ePRrA96pKeHrkkUe6devWunVrPTn1W97+e4Ml8p7doePkdQMIjF7W7IhBlZWVknh6
9OixYcMGeUb9+te/lsYHH3xQyuvWrZM8FBsba/29unri+ZY1FYNkrTTag04eRR+fyCB75NgvBk9N
TU1LSzO3GE5y6623Pvroo/Pmzfviiy9ycnL2799//PjxAP5MbOjQoZ7697lKS0ulKk9/6zPdf2+w
RN6zO3ScvG4AgfFOb10yhwSVehtLvTv2yiuvSMubb74p5T/96U/yc9iwYdbB1iWvweVv8ODBHssn
rEMn8hZK2aOCgoLi4uLy8nJZ1Bz1X+969uy5e/duc4vhJAkJCRMmTJg/f35GRkZubq7MJZlF5ols
gg4dOshUPHnypKquXr3a+kz33xsskffsDh0nrxtAYLzTW5fMIUH1wgsvyBNJrW5r166Vlo0bN3rq
/2Wi/HznnXesg61LXoPL37p169Svl7Kysqqqqnbs2DF16tQBAwYYwy5f5C2Uskd5eXn5+flFRUWy
ojnnOxDkmieT4dy5c+YWwzHkKijPuw8++GDRokVffvmlTCSZRYFNobvuukum4uuvvy7P3w0bNlx3
3XXWZ7r/3mCJvGd36Dh23QAC5p3eumQOCarMzEy1kLVp00b9ea28nmjXrp1q1H8qr1iXPGvZatOm
TampqfHx8bIu9+rVa9SoUZKrzEGXzRNxC6XskZwLeR0vK5pc1QJ7KR8K69evT0pKMjcXTrJgwYJr
r712xowZn332mcwiefkhUyiwv2M/dOjQ8OHDO3XqFB0dfcstt3z44YfWZ7r/3mCJvGd36Dh23QAC
5p3eumQOQSQulLJH6enpsqLJa7uCgoKKigpzn5vJlClTxowZY24unOQvf/lLcnKyhBKZQllZWbt3
7y4tLQ3fr9GIvGd36Dh23QAC5p3eumQOQSQulLJHc+fOXb58+aZNm9R/XTL3uZk88cQTkyZNMjcX
TnLfffcNHz78o48++vzzz7Ozs/fu3Xvs2LHw/bRs5D27Q8ex6wYQMO/01iVzCCJxoXTscpaSkpKR
kWFuLpzkhhtueOaZZ9LS0lauXLl58+Zvv/02rL9GI/Ke3aHj2HUDCJh3euuSOQQhWyg99fy3GGTp
kdfiHepJYd++feaIpnHschYXF1dWVmZubtMYR2/x4sU9e/Zs2bKl/0NqddHjrzV9pM1CvWF1dXUx
MTFvvvnmggULVq9evXXr1sLCwqqqKvNEho+QHq4I43HqugEEzDu9dckcgpAtlL5XLN8Wq6NHj3bp
0iUpKamoXv/+/bt163bs2DFzXBM4czkrKCiQHTS3tcmMo3fNNddI9ZtvvrEMuQj/x9+q6SNtFuoN
27JlyxVXXDF9+nRJmevWrZPDG/DXaDhESA9XKIT6FPvhceS6AVwO7/TWJXMIQrZQ+i5nvi1Wf/3r
X6X3008/VdWFCxdK9YUXXvj+qCZx5nL22WefDR061NzWQPk/mA1q+k2aPjLCTJky5cc//vGsWbOW
LFmyfv36nTt3HjlyJKz/f0zYncdmnHseR64bwOXwTm9dMofgMhZKebk8ZMiQDh06dOzYMTk5eenS
pbpLrWWatfGTTz5JSUmJi4vr1KnTsGHD9u/fr3r79esnvUVFRapaWFgo1QEDBqjqJfE4cjmbOHHi
2LFjzW1tMt8jqX1/oNfMmTN79uwZExMjx3bGjBnWwXKcR40a1a1bt+jo6B49ejz44INr165VXd+/
70bvXPXOnj37Jz/5idzJTTfdJBNgwoQJXbp0kUe87bbbtm/fbh0/Z84cdRP9beoSL3RvXl7eb3/7
286dO0tv//79Fy1aZLmpl3WT/OxCwB577LG7775bNnXZsmUbN27cs2dPYF+j4Rx+zqAfl3Ry33jj
DU/914DI6fv9739/8uRJ3dXgaf3pT3/qqV8H9LC0tDRpUSuAlR7Q2EOoYTK35bayYTLbJcLqW10q
jyPXDeByeKe3LplDEOhCuXr16tatW0ugUX9KM3LkSLUe6QHGQqZb+vbtu2XLFlnI/v73v0v15z//
uepV/3ZSXxrVdwtIwNI3bzpnLmcjRoyQXGJua5MZx9P38Bq++OILGTBo0KCCelKw3kQOu5QXLlxY
XV0th2jatGnWf2h00Ts/f2FMamqqBIV58+ap6v333y9HWw6+lAcOHGgdP27cOMkWVVVVJ06cePXV
Vz313yOhuuQ0tWvXrnv37itXrqysrNy8ebNkGuttNeuG+d+FwMh8Hj16tOzOihUrcnJy9u3bF9jX
aDjHRc9jgy7p5L7wwguSiuQJ+8EHH0jXf/zHf6j2xk7rP/7xDxl277336nu45557PPX/YPZ8I3Ov
sYdQg2VjDhw4IC+c1CQP+K8QPI5cN4DL4Z3eumQOQaALpfrmkG3btqnqkSNHpCqv8vUA3+VMtWzY
sEFVJQl56n83oKrq077fXThtcu3x1H+VrKpeEmcuZ3369MnNzTW3tcmM4+l7eA3qy1jWr1+vql99
9ZX1Juo/m6v/de69zQUXvfPzF8bs3LlTyhJErNWzZ89KOSoqyrzNBWpAYmKiqqr/p9zYb4CsrBvm
fxcC07Vr1/Hjx3/yySdyKZWwLvFRf9lFmNKH65JYz6bvyW3RokWDJ7eurk6GXXPNNara2GmVZNm2
bVt5EVVSUiJV+SllCUzSfv5ic894CDVY5raqqkl+xx13eG9wKTyOXDeAy+Gd3rpkDrl0+n/eRxJ9
fJpOffOrwZpaVIvlFv9q0b/v+a5+jdZj1G+DampqVPUyfxvkQHLxsL4NdKnUnTRW9dWpUycZIK/C
VVWFTn2T2267TVXlPN5yyy1PPfXUoUOH9G0veufnL4yRi6K1eubMGWtVDy4tLW3w29RVr5pLTfk4
vPVu/e9CAOQyLOdIb17EMPezCdQNm3Jyv/322wceeKBz587qZYynaaf1oYce8tR/kYiUX3vtNSk/
/PDDqst654qfh1BVY5LHx8d7b3wpPMQgRBzv9NYlcwgCfb2o1ji5vJkdF/guZ/5b1CcDDh48qKry
QtwTQZ8N2rJlS58+fcwNvRTG0fM9mAYjBknBepPCwsLRo0d3795dNQpJFfq2F73z8z5j/Ff1t6mr
/xcgYdc6QM0l9csA/6y38r8LAZAJ06VLlxkzZnz66aeZmZnbt28P+Gs0nEMfrktiPc7+q7fffruU
3377bTlQkpOsXX5Oa0ZGhnTddNNNUpafUl6zZo3qMh7rvN+HUGVjkhODAM07vXXJHIJAF0r1nov1
c44G9cLa2mJdv3xbnnvuOY/lL8UWLFgg1eeff14PbjoHLmdycR0xYoS5oZfCOHq+B9OgPjrT2Jti
2okTJ9SnPWJjY3Wj77nz5X97jKr6VZ++XMk1zzrgzjvvlPLixYv1+MYYd6s0uAsBmDBhQlJS0ocf
frh06dKsrKxdu3ZJypfrrnkuw4rv4WoK4zj7qaq3Jqurq6Wcm5tr7fJzWmXDevbsKb3vvfee/OzV
q9d3F9Zr37nn5yFUmTfFgMZ4p7cumUMQ6EIpL5ejoqJ69OixYcOGU6dO7dy5U1Y06y9v5IW13POO
HTt0i3X98m0pKyvr3LmzXIcO1evfv7/cg6xE1vFN5MDlbOzYsRMnTjQ39FIYR8/3YBo+//xzT+Mf
kR44cOC8efO+/fbb2tra9PR0aR8yZIi+re+58+V/e4yq+pjIG2+8IVNl48aN+p1l1StTqG3bttde
e21GRkZVVZVc6n7zm9/o21pZb+V/FwIwfPjw1NRUY+aE9Z+JfRfos9s4fX6qP/vZzzz1f1MmkfHu
u++2dvk/rS+99JKMVN88bX1q+M49Pw+hymqS649Ir1y5Ut/2knict24Al8k7vXXJHIJAF0qRnZ0t
l434+HjJQ/J6btSoUbJ86N5p06ZdddVVvmuWHuDbsmfPnnvvvbd9vWHDhslKZBl7CRy4nA0dOnTJ
kiXmhl4K41j5HkxfcgoSExPlStO3b9/p06dbb5KVlTVixAi5REVHR3fv3n3MmDHq86r6hsa582X0
+q8ePnzY+m3qckkzBmzduvWBBx744Q9/KAP69evn+7laxXor/7sQADlKTz755McffyzX0a+//loC
VkVFRVj/mdh3gT67jbPjpyp5JTk5WU7BNddcM3nyZGOkn9MqU6JVq1ae+g8USlm3+849Pw+hyjK3
5dzJPJdXZdY/Vr1UHuetG8Bl8k5vXTKHINCF0skcuJzJa1x5tWpuKBxD4s4VV1zxyiuvzJ8/f/Xq
1bm5uXK+KisrzRMZbiLv2W1ljUSXz4HrBnCZvNNbl8whiMSF0mnLWWlpaVxcnLmVcBKZJzExMdOm
TVu0aNHatWvz8vIOHTpUXV1tnstwE3nPbitiEOCfd3rrkjkEkbhQOm05W7VqVUpKirmVcJJZs2b1
6tVr5syZS5Ys+eqrr3bu3FlSUhLWX6OhRN6z24oYBPjnnd66ZA5BJC6UTlvOJk2a9MQTT5hbCSd5
+umnBw8ePHv27GXLlm3YsGHPnj1lZWVnz541z2W4ibxnd+g4bd0ALp93euuSOQSRuFA6bTkbM2bM
1KlTza2Ek/ziF794+OGHP/rooxUrVmRnZ+/bt+/YsWPh/vno7yLx2R06Tls3gMvnnd66ZA5BJC6U
TlvOkpKSsrKyzK2EkyQmJj777LNpaWmrVq3avHnzgQMHTpw4YZ7IMBR5z+7Qcdq6AVw+7/TWJXMI
InGhdNRyVldXFxsbq/9zIBzo9OnTUVFRkydPXrhw4Zo1a7Zt23bw4MFTp06Z5zIMRd6zO3QctW4A
QeGd3rpkDkEkLpSOWs527drVs2dPcxPhJJmZmQkJCdOnT//000/XrVu3ffv2w4cPSzYyz2UYirxn
d+g4at0AgsI7vXXJHIJIXCgdtZx9/PHHqamp5ibCSV5//fW+ffvOmjVr6dKl69evl+R65MiRcP8a
DSXynt2h46h1AwgK7/TWJXMIvvsuPj7eE1liY2Ods5yNr6dnIBxo1KhR99xzz5w5c2TObNy4UebM
0aNHw/1rNJTIe3aHjqPWDSAo9CpHDLqIioqKgoKCvLy8zMzM9PT0ueFP9kL2RfZI9kv2ztxhG6Wm
pqalpekZCAe69dZbH3300Xnz5n3xxRc5OTn79+8/fvx4BPyZmBJ5z+7Qcc66AQSFXuWIQRdRWVlZ
XFwsL4Byc3NlFVge/mQvZF9kj2S/mvcrEXr27Ll79249A+FACQkJEyZMmD9/fkZGhkwbuQQ275wJ
rsh7doeOc9YNICj0KkcMuojq6ury8vKioiJ5/ssroU3hT/ZC9kX2SParGb8S4eTJk7GxsefOndMz
EE4jF7yoqKgPPvhg0aJFX375pcwcmTbNOGeCLvKe3aHjkHUDCBa90BGDLqK2tlZe+sgzXy4J8lI4
P/zJXsi+yB7JfjXjVyKsX78+KSlJTz840IIFC6699toZM2Z89tlnmZmZO3bskJlTU1NjnsuwFXnP
7tBxyLoBBIte6IhBF1FXVyfPeXn1I0/+ioqK8vAneyH7Insk+9WMn3WdMmXKmDFj9PSDA/3lL39J
Tk7+8MMP09PTs7Kydu/eXVpaGgFfo6FF3rM7dByybgDBohc6YhCaxxNPPDFp0iQ9/eBA99133/Dh
wz/66KPPP/88Ozt77969x44d4xIIIALohY4YhOaRkpKSkZGhpx8c6IYbbnjmmWfS0tJWrly5efPm
b7/9NjK+RgMA9EJHDELziIuLKysr09MPTlNXVxcTE/Pmm28uWLBg9erVW7duLSwsrKqqMk8kAIQh
vdYRg9AMCgoKunTpouceHGjLli1XXHHF9OnTFy9evG7dum+++SZivkYDAPRaRwxCM/jss8+GDh2q
5x4caMqUKT/+8Y9nzZq1ZMmS9evX79y588iRI/yJEIDIoNc6YhCawcSJE8eOHavnHhzoscceu/vu
u+fMmbNs2bKNGzfu2bMnYr5GAwD0WkcMQjMYMWLEzJkz9dyDA6WkpIwePXrevHkrVqzIycnZt29f
JH2NBgCX02sdMQjNoE+fPrm5uXruwYG6du06fvz4Tz75JCMjY8uWLQUFBSdPnjRPJACEJ73WEYPQ
DK6++mrzO6zhMFdeeeV77723cOHCL7/8ctu2bUVFRadOnTJPJACEJ2IQmll1dXVJScnu3buzs7NX
rlw5f/588yut0dwkA2VkZOTk5OTn5x85ciSSvkYDgMsRg9DMTp8+XVZWduDAgW+++WbDhg2rVq0y
v9IazW3NmjWSgXbu3Hnw4MHjx4+fOXPGPIsAEJ6IQWhmNTU1cmUtLi7ev3//9u3b5XJrfqU1mltu
bu7u3bsLCwslsFZWVvJnYgAiBjEIzezMmTNVVVXHjh0rKSmRC+2+ffvMr7RGcztw4MDhw4ePHj16
8uRJia38mRiAiEEMQjPjy72dT32p+KlTpyQDRdIXywMAMQgAALgUMQgAALgUMQgAALgUMQgAALgU
MQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgA
ALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgUMQgAALgU
MQgAALgUMQgAALgUMQgAALhUAzEIAADAVYhBAADApYhBAADApf4fwP/kmAMDbt0AAAAASUVORK5C
YII=&quot;&gt;
&lt;/div&gt;
&lt;p&gt;由于 MACVLAN 是工作在 MAC 层的，所以 MACVTAP 也只能工作在 MAC 层，不会有 MACVTUN 这样的设备。&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2013/03/27/linux-network-tun/</link>
                <guid>http://blog.kghost.info/2013/03/27/linux-network-tun</guid>
                <pubDate>2013-03-27T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>网络虚拟化技术（一）: Linux网络虚拟化</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;笔者现在在做云计算的网络设计，涉及到上百台服务器与交换机，在实测前必须进行原型测试，但是我只有一个工作用开发机，本文介绍一种方法，使用这一台机器模拟数十台服务器以及路由器的网络环境。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Linux的网络虚拟化是LXC项目中的一个子项目，LXC包括文件系统虚拟化，进程空间虚拟化，用户虚拟化，网络虚拟化，等等 &lt;span class=&quot;footnote&quot;&gt;&lt;br&gt;[ &lt;a href=&quot;http://lxc.sourceforge.net/index.php/about/kernel-namespaces/&quot;&gt;LXC内核命门空间&lt;/a&gt; ]&lt;br&gt;&lt;/span&gt;，这里使用LXC的网络虚拟化来模拟多个网络环境。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_创建虚拟网络环境&quot;&gt;&lt;/a&gt;创建虚拟网络环境&lt;/h2&gt;
&lt;p&gt;使用命令&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip netns add net0&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;可以创建一个完全隔离的新网络环境，这个环境包括一个独立的网卡空间，路由表，ARP表，ip地址表，iptables，ebtables，等等。总之，与网络有关的组件都是独立的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ip命令需要root权限的，但是由于本文大量使用ip命令，于是笔者给ip命令添加了capability，使普通用户也能使用ip命令&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用命令&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip netns list
net0&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;可以看到我们刚才创建的网络环境&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_进入虚拟网络环境&quot;&gt;&lt;/a&gt;进入虚拟网络环境&lt;/h2&gt;
&lt;p&gt;使用命令&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net0 `&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;command&lt;/font&gt;&lt;/b&gt;`&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;我们可以在 net0 虚拟环境中运行任何命令&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net0 bash
$ ip ad
&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; lo&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;LOOPBACK&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; mtu &lt;font color=&quot;#993399&quot;&gt;65536&lt;/font&gt; qdisc noop state DOWN
    link/loopback &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt; brd &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这样我们可以在新的网络环境中打开一个shell，可以看到，新的网络环境里面只有一个lo设备，并且这个lo设备与外面的lo设备是不同的，之间不能互相通讯。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_连接两个网络环境&quot;&gt;&lt;/a&gt;连接两个网络环境&lt;/h2&gt;
&lt;p&gt;新的网络环境里面没有任何网络设备，并且也无法和外部通讯，就是一个孤岛，通过下面介绍的这个方法可以把两个网络环境连起来，简单的说，就是在两个网络环境之间拉一根网线&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip netns add net1&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;先创建另一个网络环境net1，我们的目标是把net0与net1连起来&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip link add &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;type&lt;/font&gt;&lt;/b&gt; veth
$ ip ad
&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; lo&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;LOOPBACK&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; mtu &lt;font color=&quot;#993399&quot;&gt;65536&lt;/font&gt; qdisc noop state DOWN
    link/loopback &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt; brd &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;
&lt;font color=&quot;#993399&quot;&gt;81&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; veth0&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;BROADCAST&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;MULTICAST&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; mtu &lt;font color=&quot;#993399&quot;&gt;1500&lt;/font&gt; qdisc noop state DOWN qlen &lt;font color=&quot;#993399&quot;&gt;1000&lt;/font&gt;
    link/ether &lt;font color=&quot;#993399&quot;&gt;12&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;39&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;09&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;81&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;3a&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;dd brd ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff
&lt;font color=&quot;#993399&quot;&gt;82&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; veth1&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;BROADCAST&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;MULTICAST&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; mtu &lt;font color=&quot;#993399&quot;&gt;1500&lt;/font&gt; qdisc noop state DOWN qlen &lt;font color=&quot;#993399&quot;&gt;1000&lt;/font&gt;
    link/ether &lt;font color=&quot;#993399&quot;&gt;32&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;4f&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;cc&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;79&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;1b brd ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这里创建连一对veth虚拟网卡，类似pipe，发给veth0的数据包veth1那边会收到，发给veth1的数据包veth0会收到。就相当于给机器安装了两个网卡，并且之间用网线连接起来了&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; veth0 netns net0
$ ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; veth1 netns net1&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这两条命令的意思就是把veth0移动到net0环境里面，把veth1移动到net1环境里面，我们看看结果&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip ad
&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; lo&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;LOOPBACK&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; mtu &lt;font color=&quot;#993399&quot;&gt;65536&lt;/font&gt; qdisc noop state DOWN
    link/loopback &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt; brd &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;
$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net0 ip ad
&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; lo&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;LOOPBACK&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; mtu &lt;font color=&quot;#993399&quot;&gt;65536&lt;/font&gt; qdisc noop state DOWN
    link/loopback &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt; brd &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;
&lt;font color=&quot;#993399&quot;&gt;81&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; veth0&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;BROADCAST&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;MULTICAST&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; mtu &lt;font color=&quot;#993399&quot;&gt;1500&lt;/font&gt; qdisc noop state DOWN qlen &lt;font color=&quot;#993399&quot;&gt;1000&lt;/font&gt;
    link/ether &lt;font color=&quot;#993399&quot;&gt;12&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;39&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;09&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;81&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;3a&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;dd brd ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff
$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net1 ip ad
&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; lo&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;LOOPBACK&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; mtu &lt;font color=&quot;#993399&quot;&gt;65536&lt;/font&gt; qdisc noop state DOWN
    link/loopback &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt; brd &lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;00&lt;/font&gt;
&lt;font color=&quot;#993399&quot;&gt;82&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; veth1&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;BROADCAST&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;MULTICAST&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; mtu &lt;font color=&quot;#993399&quot;&gt;1500&lt;/font&gt; qdisc noop state DOWN qlen &lt;font color=&quot;#993399&quot;&gt;1000&lt;/font&gt;
    link/ether &lt;font color=&quot;#993399&quot;&gt;32&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;4f&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;cc&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;79&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;1b brd ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;ff&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;veth0 veth1已经在我们的环境里面消失了，并且分别出现在net0与net1里面。下面我们简单测试一下net0与net1的联通性&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net0 ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; veth0 up
$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net0 ip address add &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;24&lt;/font&gt; dev veth0
$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net1 ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; veth1 up
$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net1 ip address add &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;24&lt;/font&gt; dev veth1&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;分别配置好两个设备，然后用ping测试一下联通性：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net0 ping -c &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;
PING &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;56&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;84&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; bytes of data&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;
&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; bytes from &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;icmp_req&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;ttl&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;time&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.101&lt;/font&gt; ms
&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; bytes from &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;icmp_req&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;ttl&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;time&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.057&lt;/font&gt; ms
&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; bytes from &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;icmp_req&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;ttl&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;time&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.048&lt;/font&gt; ms

--- &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt; ping statistics ---
&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; packets transmitted&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; received&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;%&lt;/font&gt; packet loss&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; time 1999ms
rtt min/avg/max/mdev &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0.048&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.068&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.101&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.025&lt;/font&gt; ms&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_一个稍微复杂的网络环境&quot;&gt;&lt;/a&gt;一个稍微复杂的网络环境&lt;/h2&gt;
&lt;div&gt;
&lt;img style=&quot;border-image: none 0; padding: 0; margin: 0;&quot; alt=&quot;2013-02-29-linux-network-emulator__1.png&quot;
src=&quot;data:image/png;base64,
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
K04lAAAAAElFTkSuQmCC&quot;&gt;
&lt;/div&gt;
&lt;p&gt;创建虚拟网络环境并且连接网线&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;ip netns add net0
ip netns add net1
ip netns add bridge
ip link add &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;type&lt;/font&gt;&lt;/b&gt; veth
ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; dev veth0 name net0-bridge netns net0
ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; dev veth1 name bridge-net&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; netns bridge
ip link add &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;type&lt;/font&gt;&lt;/b&gt; veth
ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; dev veth0 name net1-bridge netns net1
ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; dev veth1 name bridge-net&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; netns bridge&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;在bridge中创建并且设置br设备&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; bridge brctl addbr br
ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; bridge ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; dev br up
ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; bridge ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; dev bridge-net&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; up
ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; bridge ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; dev bridge-net&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; up
ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; bridge brctl addif br bridge-net&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;
ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; bridge brctl addif br bridge-net&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;然后配置两个虚拟环境的网卡&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net0 ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; dev net0-bridge up
ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net0 ip address add &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;24&lt;/font&gt; dev net0-bridge&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net1 ip link &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;set&lt;/font&gt;&lt;/b&gt; dev net1-bridge up
ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net1 ip address add &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;24&lt;/font&gt; dev net1-bridge&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;测试&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ip netns &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;exec&lt;/font&gt;&lt;/b&gt; net0 ping -c &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;
PING &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;56&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;84&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; bytes of data&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;
&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; bytes from &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;icmp_req&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;ttl&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;time&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.121&lt;/font&gt; ms
&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; bytes from &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;icmp_req&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;ttl&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;time&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.072&lt;/font&gt; ms
&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; bytes from &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;icmp_req&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;ttl&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;time&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.069&lt;/font&gt; ms

--- &lt;font color=&quot;#993399&quot;&gt;10.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1.2&lt;/font&gt; ping statistics ---
&lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; packets transmitted&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt; received&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;%&lt;/font&gt; packet loss&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; time 1999ms
rtt min/avg/max/mdev &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0.069&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.087&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.121&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0.025&lt;/font&gt; ms&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_配置lldpd检查线路链接情况&quot;&gt;&lt;/a&gt;配置lldpd检查线路链接情况&lt;/h2&gt;
&lt;p&gt;随着虚拟网络环境增加，环境中网卡数量也在不断增加，经常会忘记环境中哪些网卡连接到哪里，通过 lldp &lt;span class=&quot;footnote&quot;&gt;&lt;br&gt;[ &lt;a href=&quot;http://en.wikipedia.org/wiki/Link_Layer_Discovery_Protocol&quot;&gt;Link Layer Discovery Protocol&lt;/a&gt; ]&lt;br&gt;&lt;/span&gt; 协议，我们可以清楚看到每个网卡连接到了哪些环境中的哪个网卡。&lt;/p&gt;
&lt;p&gt;github 上有一个 lldp 在 linux 下的开源实现 &lt;span class=&quot;footnote&quot;&gt;&lt;br&gt;[ &lt;a href=&quot;https://github.com/vincentbernat/lldpd&quot;&gt;implementation of IEEE 802.1ab (LLDP)&lt;/a&gt; ]&lt;br&gt;&lt;/span&gt;，通过在每个环境中起一个 lldp daemon，我们就可以实时查看每个网卡的连接情况&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bridge 上 lldp 的数据&lt;/b&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;$ lldpcli show neighbors

LLDP neighbors:

Interface:    bridge-net0, via: LLDP, RID: 2, Time: 0 day, 00:06:53
  Chassis:
    ChassisID:    mac 82:be:2a:ec:70:69
    SysName:      localhost
    SysDescr:     net0
    Capability:   Bridge, off
    Capability:   Router, off
    Capability:   Wlan, off
  Port:
    PortID:       mac 82:be:2a:ec:70:69
    PortDescr:    net0-bridge

Interface:    bridge-net1, via: LLDP, RID: 1, Time: 0 day, 00:06:53
  Chassis:
    ChassisID:    mac b2:34:28:b1:be:49
    SysName:      localhost
    SysDescr:     net1
    Capability:   Bridge, off
    Capability:   Router, off
    Capability:   Wlan, off
  Port:
    PortID:       mac b2:34:28:b1:be:49
    PortDescr:    net1-bridge&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2013/03/01/linux-network-emulator/</link>
                <guid>http://blog.kghost.info/2013/03/01/linux-network-emulator</guid>
                <pubDate>2013-03-01T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>理解函数语言</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;对于熟悉对象语言的程序员来说，函数语言显得有些深奥，特别是满眼看不懂的名词，什么 lambda，high order function， currying，很多不知所谓的名词构成了一道阻碍学习之路的长城。本文的目的就是介绍一下函数语言的特等，其与对象语言的主要区别在哪里，以及对函数语言普遍的误区。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;a name=&quot;_误区_1_函数语言就是操作各种函数的语言&quot;&gt;&lt;/a&gt;误区 1: 函数语言就是操作各种函数的语言&lt;/h2&gt;
&lt;p&gt;函数语言这个名词自身就很容易引起这种偏颇的理解，很多人在初学函数语言的时候，看到示例程序里面把函数作为参数传来传去，就会以为函数语言的目的就是把函数作为参数。所有程序的目的都是为了操作数据，虽然函数语言提供了把函数作为参数的特性，但是最终的目的仍然是为了操作数据。把函数作为参数只是为了更方便得操作数据。比如 map 函数，用于把一个列表映射成另一个列表：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;List&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; map &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;  &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// get List(2, 3, 4)&lt;/font&gt;&lt;/i&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;虽然 map 函数的参数是一个函数，但是它的目的是为了生成数据的列表，所有的函数都是操作数据的，脱离了数据，函数也就毫无意义&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_误区_2_函数语言很难理解&quot;&gt;&lt;/a&gt;误区 2: 函数语言很难理解&lt;/h2&gt;
&lt;p&gt;其实正好相反，函数语言提供了更高层的抽象，实际上比其他语言更容易理解。觉得函数语言难于理解是由于受现有语言影响太深。比如下面两段代码：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;10&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i&lt;font color=&quot;#990000&quot;&gt;++)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; until &lt;font color=&quot;#993399&quot;&gt;10&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; foreach print&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;如果拿给不懂任何编程的人看，他更容易理解哪个呢？对于更加复杂的代码，很多人理解的时候，是使用脑内模拟执行，跟踪调试的方法，这种理解程序的方法是最不可取的！很多关于编程的等级考试以及招聘笔试都会有理解程序的题目，回想一下你是怎么做这些题目的？是否是脑内模拟执行的呢？如果是，你已经被万恶的教育制度毒害了，请立刻忘记此方法！下面教你学会函数语言的思考方式。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_函数式思考_1_考虑整体_不要考虑个体&quot;&gt;&lt;/a&gt;函数式思考 1: 考虑整体，不要考虑个体&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;写一段程序，求 1 + 2 + 3 + &amp;#8230; + 100&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;很多人就在想了，那不就是 1 + 2 = 3，然后再 + 3 = 6，然后再 + 4 = 10 &amp;#8230;&amp;#8230; 于是&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; sum &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;100&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i&lt;font color=&quot;#990000&quot;&gt;++)&lt;/font&gt;  sum &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; i&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;很对，但是你的思想被局限在一个一个数相加的过程中了，你*一步一步*得把所有数加起来。现在换个思维方式，1 加到 100，无非就是把所有数都加起来么，那么我加起来就对了么：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; to &lt;font color=&quot;#993399&quot;&gt;100&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; reduce &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;对于 reduce 函数怎么实现，大家都是高手，这里不需说明，基本所有的函数语言都有这个 reduce 的实现。这里我们把 1 到 100 这 100 个数字作为一个整体去理解，而不是分割得看成 100 个单独的数字。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_函数式思考_2_循序渐进_由简入繁&quot;&gt;&lt;/a&gt;函数式思考 2: 循序渐进，由简入繁&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;写一段程序，返回 100 内所有奇数&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;100&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;doSth&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;不做评论，c/java 程序员的标准答案。现在我们重新审题，返回 100 内：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; to &lt;font color=&quot;#993399&quot;&gt;100&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;所有奇数：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; to &lt;font color=&quot;#993399&quot;&gt;100&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; filter &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;%&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这就是函数式程序员与传统程序员的区别，传统程序员：我需要 1 3 5 &amp;#8230;.，函数式程序员：我需要 100 以内的数，我还需要一个过滤奇数的函数。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_应用示例&quot;&gt;&lt;/a&gt;应用示例&lt;/h2&gt;
&lt;p&gt;或许所说的几点过于教条，难于理解，下面举几个简单的例子：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;把一个字符序列转换成比特序列 （一字节 = 8比特）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你是不是再想：把第一字节转行成8比特，然后把第二字节转行成8比特，然后&amp;#8230;&amp;#8230;打住！我们需要的是把毎字节转换成8比特。那么怎么把毎字节转换成8比特呢？你是不是在想：拿出第一比特，然后再拿出第二比特&amp;#8230;&amp;#8230;再次打住！上面说了，要从整体考虑，我们要拿出所有比特：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; masks &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; to &lt;font color=&quot;#993399&quot;&gt;7&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;).&lt;/font&gt;reverse map &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&amp;lt;&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;然后：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;charToBits&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;byte&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;Byte&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; masks map &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; mask &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;byte &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&lt;/font&gt; mask&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;!&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;最后，我们需要操作的是 Byte序列：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;charSeqToBits&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bytes&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; Seq&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;Byte&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;])&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; bytes flatMap charToBits&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;怎么样？有没有什么感悟呢？&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2012/10/16/understand-functional-programming/</link>
                <guid>http://blog.kghost.info/2012/10/16/understand-functional-programming</guid>
                <pubDate>2012-10-16T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>Linux的控制台（TTY/PTY）与多任务（MULTI-TASKING）</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;Linux是一个多任务操作系统，可以方便的在一个控制台（或shell）下同时执行多条命令，达到这样的目标并不是一件容易的事情。本文帮助理解下面几个跟控制台有关的概念：tty/pty，control terminal，session，process group，signal；并设计实现一个多任务控制程序&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;a name=&quot;_bash_的多任务支持&quot;&gt;&lt;/a&gt;bash 的多任务支持&lt;/h2&gt;
&lt;p&gt;熟悉Linux的同学都知道，bash支持同时跑多个任务，下面先简单演示一下 bash 的多任务。首先，运行一个 cat 命令，然后通过 Ctrl+Z 中断这个 cat 回到 bash：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ cat
&lt;font color=&quot;#990000&quot;&gt;^&lt;/font&gt;Z
&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]+&lt;/font&gt;  Stopped                 cat&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;然后，我们可以再运行一个 cat 任务，这回让 cat 干点活，继续用 Ctrl+Z 中断：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ cat /dev/urandom &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; /dev/null
&lt;font color=&quot;#990000&quot;&gt;^&lt;/font&gt;Z
&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]+&lt;/font&gt;  Stopped                 cat /dev/urandom &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; /dev/null&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这样我们就有了两个 cat 任务在后台，通过 bash 内置的 jobs 命令可以查看后台的任务：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;jobs&lt;/font&gt;&lt;/b&gt;
&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt;-  Stopped                 cat
&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]+&lt;/font&gt;  Stopped                 cat /dev/urandom &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; /dev/null&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;大家可以看到，这两条命令都处于 Stopped 状态，现在我们通过 bg 命令让第二个 cat 在后台运行：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;bg&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;
&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]+&lt;/font&gt; cat /dev/urandom &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; /dev/null &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&lt;/font&gt;
$ &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;jobs&lt;/font&gt;&lt;/b&gt;
&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]+&lt;/font&gt;  Stopped                 cat
&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt;-  Running                 cat /dev/urandom &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; /dev/null &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这时可以看到，第二个 cat 变成蓝 Running 状态，同时我机器的 CPU 温度也飚上来了。我们还可以通过 fg 命令让第一个 cat 到前台执行：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;fg&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;
cat&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;现在这个 cat 又恢复到等待我的输入的状态了。这样看来，好像 multi-tasking 是一件非常简单的事情，那么请尝试回答下面几个问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Q1. 如何中断/继续程序的运行？&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Q2. 如何防止后台运行的程序互相抢夺控制台输入？&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;a name=&quot;_tty_signal_转换&quot;&gt;&lt;/a&gt;TTY - signal 转换&lt;/h2&gt;
&lt;p&gt;首先，回答第一个问题&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Q1. 如何中断/继续程序的运行？&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很简单，通过两个 signal 就可以控制程序中断/运行：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ man &lt;font color=&quot;#993399&quot;&gt;7&lt;/font&gt; signal
       &lt;font color=&quot;#990000&quot;&gt;...&lt;/font&gt;
       SIGCONT   &lt;font color=&quot;#993399&quot;&gt;19&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;18&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;25&lt;/font&gt;    Cont    Continue &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; stopped
       SIGSTOP   &lt;font color=&quot;#993399&quot;&gt;17&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;19&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;23&lt;/font&gt;    Stop    Stop process
       &lt;font color=&quot;#990000&quot;&gt;...&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;于是某同学就在 bash 的代码里面找关于这两个 signal 的代码，但是他只找到了 fg/bg 命令给程序发送了 SIGCONT，没有找到关于 SIGSTOP 的代码，于是有了下面的问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Q1.1: 什么程序给 cat 发送了 SIGSTOP 信号？&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过本小节标题也可以看出，signal 其实是 TTY 发送的：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ stty -a
speed &lt;font color=&quot;#993399&quot;&gt;38400&lt;/font&gt; baud&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; rows &lt;font color=&quot;#993399&quot;&gt;51&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; columns &lt;font color=&quot;#993399&quot;&gt;185&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; line &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#990000&quot;&gt;....&lt;/font&gt; susp &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;^&lt;/font&gt;Z&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;....&lt;/font&gt;
&lt;font color=&quot;#990000&quot;&gt;....&lt;/font&gt;
&lt;font color=&quot;#990000&quot;&gt;....&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;看到了里面的 susp = ^Z 了么，这个设置的意思就是一旦 TTY 收到了 Ctrl-Z 就会把其转换成 SIGSTOP 信号？同理我们可以设置 Ctrl-N 为挂起的快捷键&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ stty susp &lt;font color=&quot;#990000&quot;&gt;^&lt;/font&gt;N
$ cat
&lt;font color=&quot;#990000&quot;&gt;^&lt;/font&gt;N
&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]+&lt;/font&gt;  Stopped                 cat&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;由于所有的信号都是 tty 控制的，我们也可以修改 Ctrl-C/S/Q 等所有信号快捷键的行为，那么这里又有了下面这个问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Q3. 哪些程序会收到 TTY 来的信号？如果当前 TTY 来的信号所有程序都能收到，那么 Ctrl-C 会不会连后台程序一起杀掉？&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个问题先卖个关子，下面介绍一下process group。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_process_group&quot;&gt;&lt;/a&gt;process group&lt;/h2&gt;
&lt;p&gt;这里先启动一些进程：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ google-chrome &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&lt;/font&gt;
&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;26077&lt;/font&gt;
$ cat &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt; cat
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;我在这个 bash session 里面启动了3个进程，一个 google-chrome，两个 cat。chrome 又继续启动了很多进程。为了方便理解画张图，理清 TTY，session 与 process group 之间的关系：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;              ┌─────────────────────────────────────┐
              │ Session                             │
┌─────┐  One  │  ┌────────────────────────────────┐ │
│ TTY │&amp;lt;──on─&amp;gt;│  │ Process group                  │ │
└─────┘  One  │  │   bash                         │ │
              │  └────────────────────────────────┘ │
              │  ┌────────────────────────────────┐ │
              │  │ Active process group           │ │
              │  │   cat                          │ │
              │  │   cat                          │ │
              │  └────────────────────────────────┘ │
              │  ┌────────────────────────────────┐ │
              │  │ process group                  │ │
              │  │   /opt/google/chrome/chrome    │ │
              │  │    \_ /opt/google/chrome/chrome│ │
              │  │    \_ /opt/google/chrome/chrome│ │
              │  │    \_ /opt/google/chrome/chrome│ │
              │  └────────────────────────────────┘ │
              └─────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;每个 TTY 对应一个 session，session 是由 login (ssh/getty/&amp;#8230;) 程序创建的，bash 仅仅是继承了这个 session。每个 session 里面有若干个 process group，每当 bash 创建（fork）一个进程的时候，在运行程序（exec*）前，都会为这个进程创建一个新的 process group。每个 process group 中只有一个 group 处于 active 状态，由 bash 控制哪个进程处于 active 状态。每个 process group 里面有若干个进程。为什么要这样设计，且听我慢慢道来。大家是否还记得前面留下的两个悬而未决的问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Q2. 如何防止后台运行的程序互相抢夺控制台输入？
Q3. 哪些程序会收到 TTY 来的信号？如果当前 TTY 来的信号所有程序都能收到，那么 Ctrl-C 会不会连后台程序一起杀掉？&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有了 process group 的概念，回答这两个问题就非常简单了，只有处于 Active 内的进程能够获取控制台输入，并且 signal 只发送给 Active 内的进程。当有后台运行的进程想要读取控制台的时候（比如后台运行一个 cat），tty 会向其发送 SIGSTOP 信号，挂起此程序，你会发现，企图让 cat 后台运行是不可能的。当用户按下 Ctrl-C 或者 Ctrl-Z 的时候，只有前台的进程会收到相应的信号，并执行相应的操作。由于 bash 的特殊设计，用户是无法让两个程序同时读取控制台的，如果有人实在无聊，写了个程序 fork 出几个前台进程读取控制台（比如笔者），还是会出现抢占的现象：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;main&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fork&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;())&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;execlp&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;awk&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;awk&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;{ print &lt;/font&gt;&lt;font color=&quot;#CC33CC&quot;&gt;\&quot;&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;parent:&lt;/font&gt;&lt;font color=&quot;#CC33CC&quot;&gt;\&quot;&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt; $0 }&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt;
                &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;execlp&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;awk&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;awk&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;{ print &lt;/font&gt;&lt;font color=&quot;#CC33CC&quot;&gt;\&quot;&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;child:&lt;/font&gt;&lt;font color=&quot;#CC33CC&quot;&gt;\&quot;&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt; $0 }&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;用户的输入会随机传给 parent 或者 child，并且结果是不可预测的。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_多任务控制的实现&quot;&gt;&lt;/a&gt;多任务控制的实现&lt;/h2&gt;
&lt;p&gt;前面介绍的多任务控制的原理，下面我们设计一个多任务控制程序，实现和 bash 一样的功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
在前台有任务执行的时候等待
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;set processGroups

&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;startCommand&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;char&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;*&lt;/font&gt;cmd&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; pid &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fork&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;waitpid&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// 等待命令返回（结束或者挂起）&lt;/font&gt;&lt;/i&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; status&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; mypid &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;getpid&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;
    pgid &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;setpgid&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// 建立新的 process group&lt;/font&gt;&lt;/i&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;tcsetpgrp&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pgid&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// 设置当前 group 为 active&lt;/font&gt;&lt;/i&gt;
    processGroups&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;add&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;mypid&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;exec&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;cmd&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// 运行命令&lt;/font&gt;&lt;/i&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
可以随时挂起前台执行的任务
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;挂起程序完全由 tty 完成，只需要在 waitpid 后面检查前台程序是结束了，还是被挂起了，如果是挂起了，需要把控制台输入权限返还给 bash：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#990000&quot;&gt;...&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;switch&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;startCommand&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;cmd&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; exit&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;
  processGroups&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;remove&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;break&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; suspend&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;break&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// do nothing&lt;/font&gt;&lt;/i&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;tcsetpgrp&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;getpgid&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;());&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// 拿回 active process group&lt;/font&gt;&lt;/i&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
bg 命令切换后台执行任务
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只需要向程序发送 SIGCONT 信号：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#009900&quot;&gt;void&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;bg&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;issuspended&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;kill&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; SIGCONT&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
fg 命令把任务切换到前台
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先让程序继续执行，然后转移 active process group：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fg&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;bg&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;tcsetpgrp&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;getpgid&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;waitpid&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
jobs 命令查看当前任务
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;pid &lt;font color=&quot;#008080&quot;&gt;in&lt;/font&gt; processGroups&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#008080&quot;&gt;print&lt;/font&gt; pid&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这样我们就实现了一个多任务控制程序，由于 tty 设备的存在，使得实现多任务控制轻松了很多。Windows 下是没有 tty 设备的，于是控制台程序就有很多限制，比如无法实现一个能够获取 Ctrl-C 输入的控制台程序，只有去拦截 interrupt 信号。上面这些内容估计只有 bash 的设计师才会关注，但是下面的内容就是几乎每个 linux 程序员都会关注的内容。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_daemon_程序的实现&quot;&gt;&lt;/a&gt;daemon 程序的实现&lt;/h2&gt;
&lt;p&gt;daemon 进程就是要与 TTY 划开界限，所有东西都不依赖 TTY，那么结果就非常简单了，因为 TTY 和 session 是一一对应的关系，我们新建一个 session 就等于把与原来 TTY 有关的东西完全抛开了：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#009900&quot;&gt;void&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;daemonize&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;char&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;*&lt;/font&gt;cmd&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;close&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;close&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;close&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fork&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;())&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;exit&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;setsid&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;exec&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;cmd&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;为什么这里需要 fork ？ 请查阅此文章： &lt;a href=&quot;http://stackoverflow.com/questions/2613104/why-fork-before-setsid&quot;&gt;http://stackoverflow.com/questions/2613104/why-fork-before-setsid&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2012/08/20/tty-multi-tasking/</link>
                <guid>http://blog.kghost.info/2012/08/20/tty-multi-tasking</guid>
                <pubDate>2012-08-20T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>RaspBerry Pi 七宗罪，Pi 极为不靠谱的测评报告</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;2.29 号下单的 RaspBerry PI (以下简称 RPI) 终于在 5.30 号到了，何等漫长的等待阿&amp;#8230; 闲话少说，使用了快一个月，列举一下 RPI 的数宗罪&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;a name=&quot;_外壳&quot;&gt;&lt;/a&gt;外壳&lt;/h2&gt;
&lt;p&gt;RPI 只提供裸版，各路豪杰都在给 RPI DIY 外壳，但是这个外壳确实不是一件容易的事情，Dell 的服务器部门有超过一半的科研经费花在机箱内部布局以及供电和散热上。RPI 的供电和散热都没有，而供电和散热，却又是 RPI 最严重的问题，后面会抱怨更多跟供电和散热有关的问题。由于没有外壳，在给 RPI 拔插设备的时候，就很难下手，只能按住接地的部分操作，而且上面突出的针脚又很多，稍不小心就会碰到某些阵脚，导致重启/死机/无法启动等问题。回去买一桶乐高积木，搭一个外壳出来试试。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_bootloader&quot;&gt;&lt;/a&gt;Bootloader&lt;/h2&gt;
&lt;p&gt;RPI 由于没有集成存储芯片(节约成本)，所以靠 SD 卡引导，但是支持众多型号的 SD 卡不是一件容易的事情。芯片中只提供了几百字节的 GPU 代码空间，用于从 SD 卡中加载 bootloader，所以就有一些型号的 SD 卡无法使用。但这还不是最严重的问题，当 RPI 无法启动的时候，就不得不排查很多问题，供电，SD卡，显示。普通的硬件产品，例如家用电脑，路由器，手机，都是有内部存储的，系统从内部存储引导，引导出错会给出出错信息用于排查错误。RPI 直接从外设引导，出问题排查时会有些麻烦，要尝试各种不同的电源，各种不同型号的 SD 卡，刷写不同的系统到 SD 卡上。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_cpu&quot;&gt;&lt;/a&gt;CPU&lt;/h2&gt;
&lt;p&gt;RPI 的 CPU 标称 700 MHz ARM11，没有接触过 ARM 的可能不知道这个是什么概念，我们做一个简单的对比：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
2003 年主流配置，赛扬 1.7G，256MB 内存，编译内核：5～10 分钟
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
RPI，700 MHz ARM11，256MB 内存，编译内核：6 小时
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RPI 刚出来的几天，众多 Geek 的 RPI 都在忙于编译内核，直到有人研究出来如何 CrossCompile，才把 RPI 从编译内核的苦海中解救出来&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_rtc&quot;&gt;&lt;/a&gt;RTC&lt;/h2&gt;
&lt;p&gt;RTC (Real-time clock) 是所有桌面/手持设备必备的部件，用于在系统启动的时候告诉系统当前时间。缺少 RTC 的系统在启动后无法获取当前时间，关机重启后系统时间就清零，给使用带来众多不便，虽然能够通过 NTP 启动后自动获取时间，但是没有网络的环境就悲剧了 (Model A 是不带以太网口的)。时间是系统中很重要的部分，很多服务都依赖时间，比如 802.1X，WPA2-enterprise，HTTPS，总之，需要使用证书认证的部分都将无法工作。RPI 不包含 RTC 的主要原因就是其成本太高了，需要 RTC 芯片以及一块在断电后仍能供电的电池，大概需要 3～5 刀 (RPI Model A $25)。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_usb&quot;&gt;&lt;/a&gt;USB&lt;/h2&gt;
&lt;p&gt;RPI 的 USB 是问题最严重的部分了，为了配合 RPI 的低功耗，板载的两个 USB 端口的输出功率被限制在 140mA 以下，就是说几乎全部的读卡器/外接硬盘/无线网卡都将无法使用。即使你的电源再牛逼，也无法把功率送到 USB 口。当然，没有 Geek 解决不了的问题，各路神仙都出现，自己 mod USB 供电电路。最简单的方法就是 &lt;a href=&quot;http://www.raspberrypi.org/phpBB3/viewtopic.php?f=63&amp;amp;t=8591&quot;&gt;直接短接 USB 电流限制部分&lt;/a&gt; 。不过还有新问题，USB 是支持 HotPlug 的，当插入一个新 USB 设备的时候，会有很大的瞬间电流，而 RPI 的供电电路只有一个电容做缓冲，一旦这个电流超过此电容整流能力，会导致核心电压下降，结果就是导致重启。于是又有 Geek mod 了给一个 USB 供电的电容。道路真是坎坷阿，估计下个版本这些问题都会修正。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_温度感应器&quot;&gt;&lt;/a&gt;温度感应器&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;data:image/jpg;base64,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&quot; class=&quot;img-polaroid&quot; style=&quot;display: inline; float: right;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在基本所有的家用 PC 内部都有数个温度感应器，分布在 CPU/GPU/电源/硬盘等重要部位。Intel CPU 内部的温度感应器甚至可以控制 CPU 运行频率，在温度低的时候如果有突发任务，可以短时间超频处理，超频幅度达到 3～4 倍（看我20倍界王拳，迷）。RPI 虽然功率很小，但是其芯片也非常小，热量有可能散发不出去，右边是某人给 CPU 和 Ethernet 芯片加了散热器。没有温度感应器，在芯片过热的情况下，可能会直接导致死机。RPI 论坛上已经有不少人在抱怨 RPI 无故死机的问题。&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_结论&quot;&gt;&lt;/a&gt;结论&lt;/h2&gt;
&lt;p&gt;RPI 终归是个 Geek 的玩具，在 RPI 上面你会碰到各种各样没有遇到过的硬件问题，RPI 离产品化距离相当遥远。不过 RPI 的出现，应该能够推动低功耗，低成本家用设备的普及。StackOverflow 竟然开了  &lt;a href=&quot;http://raspberrypi.stackexchange.com/&quot;&gt;RPI 专版&lt;/a&gt; ，我被雷到了。虽然 RPI 有这么多的缺点，但是 $35 买个玩具还是很值的。&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2012/06/25/raspberry-pi-review/</link>
                <guid>http://blog.kghost.info/2012/06/25/raspberry-pi-review</guid>
                <pubDate>2012-06-25T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>高阶流程控制语句（五）: 用 delimited continuation 实现 RAII</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_什么是raii&quot;&gt;&lt;/a&gt;什么是RAII？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization&quot;&gt;RAII&lt;/a&gt; 就是在进入代码块的时候运行构造函数，在退出代码块的时候运行析构函数。C++ 原生支持 RAII：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#008080&quot;&gt;Resource&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Resource&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; init&lt;font color=&quot;#990000&quot;&gt;...;&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;font color=&quot;#990000&quot;&gt;~&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Resource&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; fini&lt;font color=&quot;#990000&quot;&gt;...;&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;main&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;font color=&quot;#008080&quot;&gt;Resource&lt;/font&gt; resource&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_raii_的实现_using&quot;&gt;&lt;/a&gt;RAII 的实现: using&lt;/h2&gt;
&lt;p&gt;C#有个语法糖 using，支持对 IDispose 接口的 RAII：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;using&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;MyResource&lt;/font&gt; myRes &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;MyResource&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;())&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    myRes&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;DoSomething&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;展开成实际代码就是：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#008080&quot;&gt;MyResource&lt;/font&gt; myRes&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;MyResource&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;try&lt;/font&gt;&lt;/b&gt;
&lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    myRes&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;DoSomething&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;finally&lt;/font&gt;&lt;/b&gt;
&lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;myRes&lt;font color=&quot;#990000&quot;&gt;!=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;((&lt;/font&gt;IDisposable&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;myRes&lt;font color=&quot;#990000&quot;&gt;).&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Dispose&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Scala 可以自己实现 using 函数：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; using&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;T &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; dispose&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; Unit &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;R]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;resource&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;T)(block:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;T&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; R&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; res &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; resource
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;try&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;block&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;res&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;finally&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;res &lt;font color=&quot;#990000&quot;&gt;!&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; res&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;dispose
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;使用起来也跟 C# 的方法差不多：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#008080&quot;&gt;Res&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;init&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; dispose &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;fini&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; work &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;work&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;using&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; Res&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;work &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这个实现有个麻烦的地方，如果多层 using 套用的话，代码会乱成一坨：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;using&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; Res&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; res1 &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;using&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; Res&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; res2 &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;using&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; Res&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; res3 &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
      &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;using&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; Res&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; res4 &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
        doSomething
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_raii_的实现_reset_shift&quot;&gt;&lt;/a&gt;RAII 的实现: reset/shift&lt;/h2&gt;
&lt;p&gt;现在我们用 reset/shift 实现 RAII&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;import&lt;/font&gt;&lt;/b&gt; scala&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;continuations&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; managed&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;T &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; dispose&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; Unit &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;}]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;resource&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; T&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; T &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;@&lt;/font&gt;&lt;/b&gt;suspendable &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt;
  shift &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; k &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; res &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; resource
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;try&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;k&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;res&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;finally&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      res&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;dispose
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;与之前的 using 实现类似，但是 using 使用一个闭包 block 作为参数，这里没有使用闭包作为参数，而是使用了 shift 捕获了后续的代码块，赋给 shift 的参数 k，我们先调用 k 然后再调用 dispose，可以做到析构函数类似的效果。这样 managed 函数在使用的时候也比 using 方便很多，需要做的就是在用 reset 把变量的作用域包起来：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#008080&quot;&gt;Res&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;name&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; String&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;init: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; name&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; dispose &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;fini: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; name&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; work &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;work: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; name&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; res &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;managed&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Res&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;X&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  res&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;work
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;init: X
work: X
fini: X&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这样使用多个资源也不会出现嵌套的问题了，而且会按照初始化相反的顺序进行析构：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; res1 &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;managed&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Res&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;A&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; res2 &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;managed&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Res&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;B&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; res3 &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;managed&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Res&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;C&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; res4 &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;managed&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Res&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;D&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  res1&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;work
  res2&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;work
  res3&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;work
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;init: A
init: B
init: C
init: D
work: A
work: B
work: C
fini: D
fini: C
fini: B
fini: A&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_备注_scala_中_continuation_的使用&quot;&gt;&lt;/a&gt;备注: Scala 中 continuation 的使用&lt;/h2&gt;
&lt;p&gt;从官网下载 Scala 解压后 bin 目录下有名称为 scala 的可执行文件，如果要使用 continuation 必须添加参数 -P:continuations:enable，下面是以运行本文中的例子：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ &lt;font color=&quot;#990000&quot;&gt;./&lt;/font&gt;scala &lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;P&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt;continuations&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt;enable
Welcome to Scala version &lt;font color=&quot;#993399&quot;&gt;2.9&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;OpenJDK &lt;font color=&quot;#993399&quot;&gt;64&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;Bit Server VM&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Java &lt;font color=&quot;#993399&quot;&gt;1.6&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;0&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#993399&quot;&gt;24&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;).&lt;/font&gt;
Type in expressions to have them evaluated&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;
Type &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt;help &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; more information&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;

scala&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;import&lt;/font&gt;&lt;/b&gt; scala&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;continuations&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;
&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;import&lt;/font&gt;&lt;/b&gt; scala&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;continuations&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;

scala&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; managed&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;T &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; dispose&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; Unit &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;}]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;resource&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; T&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; T &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;@&lt;/font&gt;&lt;/b&gt;suspendable &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   shift &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; k &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;     &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; res &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; resource
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;     &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;try&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;       &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;k&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;res&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;     &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;finally&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;       res&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;dispose
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;     &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
managed&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;T &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;&amp;lt;:&lt;/font&gt;&lt;/b&gt; AnyRef&lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; dispose&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Unit}]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;resource&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; T&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;T &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;@&lt;/font&gt;&lt;/b&gt;scala&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;continuations&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;cpsParam&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt;

scala&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#008080&quot;&gt;Res&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;name&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; String&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;init: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; name&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; dispose &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;fini: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; name&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; work &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;work: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; name&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
defined &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#008080&quot;&gt;Res&lt;/font&gt;

scala&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; res &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;managed&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Res&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;X&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   res&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;work
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
init&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; X
work&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; X
fini&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; X

scala&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2012/05/16/abstract-control-5-delimited-continuation-raii/</link>
                <guid>http://blog.kghost.info/2012/05/16/abstract-control-5-delimited-continuation-raii</guid>
                <pubDate>2012-05-16T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>高阶流程控制语句（四）: 实战 delimited continuation</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;前面大量篇幅介绍了很多理论知识，这次介绍一下 delimited continuation 的一个应用，使用 Scala 的 reset/shift 实现一个单线程的 Echo Server&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先看一下下面这段代码：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;object&lt;/font&gt;&lt;/b&gt; Echo &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;extends&lt;/font&gt;&lt;/b&gt; App &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; server &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; ServerSocketChannel&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;open
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.socket.bind&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;InetSocketAddress&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;12345&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    server&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;accept &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; c&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; SocketChannel &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Accept: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isOpen &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isConnected&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
          &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; bb &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;ByteBuffer.allocateDirect&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1024&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
          &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
              &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Read: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
              bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;flip
              &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;hasRemaining&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Write: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                    bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;clear
                    c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
              &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
              &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
              &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
              c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
          &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;AcceptBlock&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这看起来像是一个 Echo Server，不过写出这种代码的哥们估计第二天就会被炒鱿鱼了。众所周知，实现单线程的多 TCP 连接程序，肯定要使用 Select/Epoll 这些多路 IO 复用机制，如果不使用这些机制，就会像上面这段程序一样，只能处理一条连接。但是这段程序并不是一无是处，它*逻辑清晰，简单易懂*。几十行代码一气呵成，把需要的逻辑都包含了：接受连接，读取数据，返回数据。后来我想尝试用 Java NIO 写了一下 Echo Server，不过在我动手前，我的脑袋已经被各种回调扭成麻花了，如果没有 mina netty 这种框架，写网络程序无异于自杀。&lt;/p&gt;
&lt;p&gt;回到上面那段有问题的程序，将错就错，先使用多线程，让它能跑起来：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;object&lt;/font&gt;&lt;/b&gt; EchoMultiThread &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;extends&lt;/font&gt;&lt;/b&gt; App &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; server &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; ServerSocketChannel&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;open
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.socket.bind&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;InetSocketAddress&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;12345&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    server&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;accept &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; c&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; SocketChannel &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
        &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Thread&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; Runnable &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;  &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// &amp;lt;============================= 1&lt;/font&gt;&lt;/i&gt;
          &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;override&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; run &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// &amp;lt;==================================== 2&lt;/font&gt;&lt;/i&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Accept: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isOpen &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isConnected&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
              &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; bb &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;ByteBuffer.allocateDirect&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1024&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
              &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Read: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;flip
                  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;hasRemaining&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Write: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;clear
                        c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
                    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
              &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
            &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
          &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// // &amp;lt;================================================== 3&lt;/font&gt;&lt;/i&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)).&lt;/font&gt;start &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// &amp;lt;=============================================== 4&lt;/font&gt;&lt;/i&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;AcceptBlock&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;上面加了四行代码，把这段程序变成多线程，跑起来了，不过离我们的目标还有一段距离，我们需要使用单线程和 Java NIO 把这段程序跑起来。分析一下这段程序，主线程阻塞在外层 while 循环，所有子线程阻塞在里面的 while 循环，如果我们能够使用 reset/shift 把这两个 while 循环变成可中断的，那么问题不就解决了么？&lt;/p&gt;
&lt;p&gt;先把这段程序中，需要使用线程的部分用 reset 包起来&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;object&lt;/font&gt;&lt;/b&gt; Echo &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;extends&lt;/font&gt;&lt;/b&gt; App &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; server &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; ServerSocketChannel&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;open
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.socket.bind&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;InetSocketAddress&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;12345&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.configureBlocking&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;false&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// &amp;lt;=================================== here it is the main thread&lt;/font&gt;&lt;/i&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      server&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;accept &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; c&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; SocketChannel &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
          reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// &amp;lt;=========================== here it is child threads&lt;/font&gt;&lt;/i&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Accept: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.configureBlocking&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;false&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isOpen &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isConnected&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
              &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; bb &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;ByteBuffer.allocateDirect&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1024&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
              &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Read: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;flip
                  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;hasRemaining&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Write: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;clear
                        c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
                    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
              &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
            &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
          &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
          &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;AcceptBlock&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;然后找到需要阻塞的地方 shift 出去，shift 的时候把 continuation 函数注册到 Selector 里面:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;object&lt;/font&gt;&lt;/b&gt; Echo &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;extends&lt;/font&gt;&lt;/b&gt; App &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; selector &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; Selector&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;open
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; server &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; ServerSocketChannel&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;open
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.socket.bind&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;InetSocketAddress&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;12345&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.configureBlocking&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;false&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      server&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;accept &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; c&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; SocketChannel &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
          reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Accept: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.configureBlocking&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;false&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isOpen &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isConnected&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
              &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; bb &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;ByteBuffer.allocateDirect&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1024&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
              &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Read: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;flip
                  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;hasRemaining&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Write: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// &amp;lt;=============================== May block here&lt;/font&gt;&lt;/i&gt;
                        shift&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; cont &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                          &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.register&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;selector&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; SelectionKey&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;OP&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;WRITE&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; cont&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;clear
                        c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
                    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// &amp;lt;===================================== May block here&lt;/font&gt;&lt;/i&gt;
                  shift&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; cont &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.register&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;selector&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; SelectionKey&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;OP&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;READ&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; cont&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
              &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
            &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
          &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
          &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;AcceptBlock&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
          &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// &amp;lt;============================================= May block here&lt;/font&gt;&lt;/i&gt;
          shift&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; cont &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.register&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;selector&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; SelectionKey&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;OP&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;ACCEPT&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; cont&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
          &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;最后，加上 Selector 的 select 部分，select 成功后调用 shift 时存放在 attachment 中的 continuation 函数。为了编译通过，必须保证所有的 match/case 条件分支语句返回值类型相同，需要加入一些 shiftUnit 语句：&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;object&lt;/font&gt;&lt;/b&gt; Echo &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;extends&lt;/font&gt;&lt;/b&gt; App &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; selector &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; Selector&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;open
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; server &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; ServerSocketChannel&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;open
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.socket.bind&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;InetSocketAddress&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;12345&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.configureBlocking&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;false&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      server&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;accept &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; c&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; SocketChannel &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
          reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Accept: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.configureBlocking&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;false&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isOpen &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;isConnected&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
              &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; bb &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;ByteBuffer.allocateDirect&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1024&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
              &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Read: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;flip
                  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;hasRemaining&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bb&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;match&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Write: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot; count: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; count&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        shiftUnit&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Unit]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        shift&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; cont &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                          &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.register&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;selector&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; SelectionKey&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;OP&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;WRITE&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; cont&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;WriteError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        bb&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;clear
                        c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
                        shiftUnit&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Unit]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;
                    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; count &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;==&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadBlock: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  shift&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; cont &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;c.register&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;selector&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; SelectionKey&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;OP&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;READ&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; cont&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
                  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;ReadError: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                  c&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;close
                  shiftUnit&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Unit]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;
              &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
            &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
          &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
          shiftUnit&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Unit]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;case&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
          &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;AcceptBlock&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
          shift&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; cont &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;server.register&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;selector&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; SelectionKey&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;OP&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;ACCEPT&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; cont&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
          &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
      shiftUnit&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Unit]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; keys &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; selector&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;selectedKeys
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    selector&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;select
    keys foreach &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; k &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
      &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;k.interestOps&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
      k&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;attachment&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;asInstanceOf&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Function1&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Unit]].apply&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;Unit&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    keys&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;clear
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;大功告成，怎么样，感觉不错吧，这样一个逻辑非常清晰的 Echo Server 就做完了，所有麻花一样的回调过程都隐藏在 reset/shift 的过程中了。源代码在 &lt;a href=&quot;https://gist.github.com/659295&quot;&gt;这里&lt;/a&gt; ，有兴趣可以研究一下。&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2012/01/30/abstract-control-4-delimited-continuation-application/</link>
                <guid>http://blog.kghost.info/2012/01/30/abstract-control-4-delimited-continuation-application</guid>
                <pubDate>2012-01-30T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>高阶流程控制语句（三）: delimited continuation</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;In programming languages, a delimited continuation, composable continuation or partial continuation, is a &quot;slice&quot; of a continuation frame that has been reified into a function.&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;
&amp;#8212; Wikipedia
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这次使用 Scala 作为示范语言介绍 Delimited continuation, 因为 Scala 是我知道的除了括号语言(Lisp, Scheme 及其方言)之外, 唯一一个支持 Delimited continuation 的语言.&lt;/p&gt;
&lt;p&gt;按照惯例, 还是从 Fibonacci 函数开始, 这里定义一个 Ruby yield 风格的 Fibonacci 函数:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fibonacci&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;f&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; BigDecimal &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; Unit&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;BigDecimal&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;),&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;BigDecimal&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; t &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; j&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; t
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

fibonacci &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; println &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这个函数是一个高阶函数 &lt;span class=&quot;footnote&quot; id=&quot;_footnote_hof&quot;&gt;&lt;br&gt;[Higher-order function: 参数或者返回值为函数的函数]&lt;br&gt;&lt;/span&gt;, 其参数 &lt;strong&gt;f&lt;/strong&gt; 是一个能处理 BigDecimal 的函数. 虽然这个函数工作得非常好, 但是有几个致命缺点:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
无法终止: 一旦开始遍历, 就没法停下来
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
难以控制: 比如打印[100,10000)区间的 fibonacci 数, 或者打印第10~15个 fibonacci 数, 这种需求很难实现
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果我们能够实现一个 fibonacci 数的 Iterator, 通过 Scala 的 Iterator 库, 很容易就可以实现这些需求:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// print all fibonacci number inside [100,10000)&lt;/font&gt;&lt;/i&gt;
fibonacciIteritor
  &lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;dropWhile&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;100&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;takeWhile&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;10000&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;foreach&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;println &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;

&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// print the 10th ~ 15th fibonacci number&lt;/font&gt;&lt;/i&gt;
fibonacciIteritor
  &lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;slice&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;10&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;15&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;foreach&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;println &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;现在就变个魔术, 把上面的 Ruby yield 风格的 fibonacci 函数, 变成一个 Iterator:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;object&lt;/font&gt;&lt;/b&gt; fibonacciSeq &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;import&lt;/font&gt;&lt;/b&gt; scala&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;continuations&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;_&lt;/font&gt;&lt;/b&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;private&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; continuation&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; Unit &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; BigDecimal &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;shift&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;identity&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;Unit &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; BigDecimal&lt;font color=&quot;#990000&quot;&gt;])&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;BigDecimal&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;),&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;BigDecimal&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      shift &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;k:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;Unit &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; BigDecimal&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; continuation &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; k&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// f(j)&lt;/font&gt;&lt;/i&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; t &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; j&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; t
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// unreachable code, trick the compiler&apos;s type system&lt;/font&gt;&lt;/i&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; next &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;continuation&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; fibonacciIteritor &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Iterator.continually&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fibonacciSeq&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;next&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这段代码最关键的东西, 就是 reset, shift 这两个函数. 在 Scala 的语法规则中, 这两个函数仅仅是普通的高阶函数&lt;span class=&quot;footnoteref&quot;&gt;&lt;br&gt;&lt;a href=&quot;#_footnote_hof&quot;&gt;[hof]&lt;/a&gt;&lt;br&gt;&lt;/span&gt;, 其参数就是后面的 { &amp;#8230; } 部分. reset 函数接受一段代码作为其参数, shift 函数接受一个函数作为其参数, 下面是这两个函数的声明:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;reset[A,C]&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;ctx&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;A &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;@&lt;/font&gt;&lt;/b&gt;cpsParam&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;A&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;]))&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; C
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;def&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;shift[A,B,C](fun:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;A &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; B&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; C&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; A &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;@&lt;/font&gt;&lt;/b&gt;cpsParam&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;B&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;reset 函数定义了一个闭锁空间(其参数), 在这个空间里面, 会发生一些违背物理常识的事情. shift 就是这个闭锁空间中的凉宫春日, 可以自由自在地操作这个空间, 具体方式就是操作时间流动(程序流程). 当程序运行到 shift 函数的时候, 会中断闭锁空间内部程序的执行, 生成一个当前闭锁空间的 snapshot, 包含当前的调用堆栈等信息, 然后调用 shift 函数的参数, 当这个函数执行完之后, 程序*不会*从 shift 函数后面继续执行, 而是跳出闭锁空间, 从当初进入闭锁空间的地方继续执行. 比如下面这段代码:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;scala&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   shift &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;k:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;Unit &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; Unit&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;     &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;get here&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;never reach here&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
get here&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;shift 函数的参数执行完之后, 跳出闭锁空间, 回到当初进入的地方, 所以 shift 参数的返回值, 就是 reset 的返回值:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;scala&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; result &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   shift &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;k:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;Unit &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;Int&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
result&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;Int&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;根据上面 shift 函数的定义, shift 函数的参数也是一个函数, 这个函数接受一个参数, 这个参数就是当前闭锁空间的 snapshot. 现在来关注一下这个 snapshot, 首先这个 snapshot 代表了一段程序(从当前 shift 函数返回开始到闭锁空间内剩下的程序流程), 所以这个 snapshot 一定是一个函数闭包, 既然是函数, 那么就必须有参数和返回值, snapshot 对象是在进入 shift 函数时生成的, 那么其入口也就是从当前 shift 返回开始, snapshot 函数的参数就是 shift 的返回值:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;scala&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; x &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; shift &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;snapshot:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;Int&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; Unit&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;     &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;snapshot&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;     &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;snapshot&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;5&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;     &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;snapshot&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;25&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;shifted: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; x&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
shifted&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;
shifted&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;5&lt;/font&gt;
shifted&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#993399&quot;&gt;25&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这里 snapshot 函数就捕捉了从 shift 返回开始, 到 reset 结束为止的程序流程, 即相当于:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; snapshot &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; argument&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;Int&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; x &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; argument
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;shifted: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; x&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;下面考察一下 snapshot 函数的返回值. reset 作为一个程序块, 必然有返回值, 既然 snapshot 捕捉了到 reset 为止的所有程序流程, 那么 snapshot 的返回值就应该是 reset 程序块的返回值:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;scala&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; reset &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;val&lt;/font&gt;&lt;/b&gt; x &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&lt;/font&gt;&lt;/b&gt; shift &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;snapshot:&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;Unit &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt; String&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;=&amp;gt;&lt;/font&gt;&lt;/b&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;     &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println(snapshot&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;())&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt;   &lt;font color=&quot;#FF0000&quot;&gt;&quot;I&apos;m the return value&quot;&lt;/font&gt;
     &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
I&lt;font color=&quot;#FF0000&quot;&gt;&apos;m the return value&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;现在, 讲解了魔术的原理, 再回头看看上面那个 fibonacciSeq 实现, 应该知道其中变化了. 下次会介绍一些实际的应用场景&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2012/01/18/abstract-control-3-delimited-continuation/</link>
                <guid>http://blog.kghost.info/2012/01/18/abstract-control-3-delimited-continuation</guid>
                <pubDate>2012-01-18T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>高阶流程控制语句（二）: stackful coroutine</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;上次介绍了 &lt;a href=&quot;http://blog.kghost.info/index.php/2011/11/abstract-control-1-stackless-coroutine/&quot;&gt;stackless coroutine(generator)&lt;/a&gt; , 这次介绍真正具有完整功能的coroutine&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先看一下下面这段遍历二叉树的代码:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;leaf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                yield tree&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;/*???*/&lt;/font&gt;&lt;/i&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;left&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
                &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;/*???*/&lt;/font&gt;&lt;/i&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;right&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;对于叶子节点, 直接yield就可以了, 但是对于递归的traval调用. &lt;strong&gt;???&lt;/strong&gt; 处应该填什么?&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_方法1_借助stackless_coroutine实现stackful_coroutine&quot;&gt;&lt;/a&gt;方法1: 借助stackless coroutine实现stackful coroutine&lt;/h2&gt;
&lt;p&gt;回想一下上次实现的Fibonacci generator:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fib&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    yield i&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; t &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; i&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    j &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; t&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Fibonacci内部只需要保存两个状态, F(n-2)与F(n-1), 分别用i,j保存. 但是遍历二叉树, 我们需要保存的状态是 &lt;strong&gt;从当前叶子节点到根节点的整条路经&lt;/strong&gt;, 遇到这种状态是动态的情况, stackless coroutine就无能为力了. 不过我们可以借助闭包, 把需要保存的状态记录在闭包里面, 这样使用stackless coroutine保存这单个闭包, 就可以了:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; join &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; index &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;in&lt;/font&gt;&lt;/b&gt; arguments&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; i &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;in&lt;/font&gt;&lt;/b&gt; arguments&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;index&lt;font color=&quot;#990000&quot;&gt;])&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        yield i&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;leaf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        yield tree&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)();&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;join&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;left&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)),&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;right&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)));&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;由于javascript调用函数是按值传递的, 上面这段代码运行到join函数之前, 会先计算join的参数, 递归调用travel函数, 导致很多次travel调用, 我们希望在开始遍历的时候再调用travel函数, 所以这里需要一次lazy优化:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; join &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; index &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;in&lt;/font&gt;&lt;/b&gt; arguments&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; i &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;in&lt;/font&gt;&lt;/b&gt; arguments&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;index&lt;font color=&quot;#990000&quot;&gt;]())&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        yield i&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;leaf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        yield tree&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)();&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;join&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;left&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;right&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;通过这个例子, 我们用stackless coroutine实现了stackful coroutine, 其中的关键, 就是这个join函数.
&lt;img src=&quot;data:image/png;base64,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fzWe3/nOd2zXEKFdu3bVotd9PYieHXvkcrycAOik3O/oivEXOJdixG9eHXgLxTW69hi09eq12LbI/9hjjzVz584t3M5vxa0+bxqV7MhdKyd3cTlK5V9NOXHrupo8YV/HtoK0xsLOPy/ppcLJpxnm2WefbcVjamTcga4fVtt6HU81GeJ+8IM6+WryJ3mdlhstr+LZXHHINGTIEPPaa6/ZsQe/IW5d+5UrrHhy8uGQTE13jd8matzxLr30Utu3H3e+5MeLhe0fguQdjlkESyWIfGmOi4NnzUUSMrKAigpFkLyDaUmxG5VApE4+D1DpynnhhRcSKQqLbn784x8nkncjZtqnT59mC+niZICNuZlhcearvPJPIFInH6RWorjhHDyRhMlKd+HoLijHJHStPLNHIFInnz0cklgEREAE8kVATj5f+lRpREAERKAZgUidfNDmp+LX3+xPwr6lt/r1VgvDJHStPLNHIFInnz0cklgEREAE8kUgUidfS+1E99RXK0zCPKWz+nRWK78kdK08s0cgUiefPRySWAREQATyRUBOPl/6VGlEQAREQAOvtTaPs3BfEvadBS55lDEJXSvP7BFQTT57OpPEIiACIuCbQGQblHFqj999231Lq4hVCay99tpmzJgxNl4cu1BKz1VVElmEuHUdWUHKJKwNysIhHpmTR7ziLXnDETn6VDhC0G3XG31u0eUQh5N30kvX0enRT8px6tqPPGHEkZMPg6IxkXbXtGwZafLhEMhpKnGzjzu/nKqtpmKJfU3YGuamSGvyWaWoGkRWNRdcbuk6OLO47pBuwiGtqnY4HJWKCIiACKSSgJx8KtUioURABEQgHAJy8uFwVCoiIAIikEoCcvKpVIuEEgEREIFwCMjJh8NRqYiACIhAKgnIyadSLRJKBERABMIhICcfDkelIgIiIAKpJCAnn0q1SCgREAERCIeAnHw4HJWKCIiACKSSgJx8KtUioURABEQgHAJy8uFwVCoiIAIikEoCcvKpVIuEEgEREIFwCMjJh8NRqYiACIhAKgnIyadSLRJKBERABMIhICcfDkelIgIiIAKpJCAnn0q1SCgREAERCIeAnHw4HJWKCIiACKSSgJx8KtUioURABEQgHAJy8uFwVCoiIAIikEoCcvKpVIuEEgEREIFwCMjJh8NRqYiACIhAKgnIyadSLRJKBERABMIhICcf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EHONOUqQpeN8VxABEUieAIuY6ILp2LGjFYbtgvfcc89VZuXg1HHuaT3QW04+AVtifi5LxKnN879bOZiAKMoyAgIc1k73nEJ+CbhVsTj2NHXNlCKuefIJ2KE7zo4FEix1ZtMid15sFuYYJ4BMWYpAYgR4Jt3zSY2dGXNt27a1q1jT7uCBppp8YqajjPNKgIOeGXtREIE0EFBNPg1akAwiIAIiEBEBOfmIwCpZERABEUgDATn5NGhBMoiACIhARATk5CMCq2RFQAREIA0E5OTToAXJIAIiIAIREZCTjwiskhUBERCBNBCQk0+DFiSDCIiACEREQE4+IrBKVgREQATSQEBOPg1akAwiIAIiEBEBOfmIwCpZERABEUgDATn5NGhBMoiACIhARATk5CMCq2RFQAREIA0E5OTToAXJIAIiIAIREZCTjwiskhUBERCBNBCQk0+DFiSDCIiACEREQE4+IrBKVgREQATSQEBOPg1akAwiIAIiEBEBOfmIwCpZERABEUgDATn5NGhBMoiACIhARATk5CMCq2RFQAREIA0E5OTToAXJkGsCS5YsyXX5VLh0E5CTT7d+JF3KCSxfvtwMGjTITJkyxTz//PPm888/txLj2Pk+evRo06pVq5SXQuLlmUCLlU0hzwVU2UQgagIjR440kydPLplNx44draNXEIGkCKgmnxR55ZsbAn379i1bW+/Zs2duyqmCZJOAnHw29SapU0Rgo402Mr169VpFIrppunfvniJJJUojEpCTb0Stq8yhEyhVm8fBqz8+dNRKMCABOfmAwBRdBEoRKFWbV1eNbCUNBOTk06AFyZALAt7aPAOufBREIGkCcvJJa0D554aAtzavWnxu1Jr5gsjJZ16FKkCtBF555RXz1ltv1Xp7yfuozbdu3Tr0AVfm3DMnX0EEghLQPPmgxBQ/kwRw5jNmzDDTp083OHcC3SksWvroo49SXyZeHAzi4uj527lzZ7PvvvuaLl262JeKggiUIyAnL9vINYGHHnrITJgwwZYRh3jAAQdkvq+cVbWzZs0yTz31lH1x7bDDDmbAgAGZL1euDTHBwsnJJwhfWUdHACfISlNq63369DHt27ePLrOEU6asY8aMsWXE2W+22WYJS6Ts00RATj5N2pAsdROglss2A3TD9O/fv6Fqt9OmTTPjxo0z/fr1M926daubpRLIBwE5+XzoUaVoIkB/9VVXXWW7ZBp1dgsvuWuvvdYw0+ecc86RXYiAkZOXEeSCAAOrOPgf/vCHto+60cM999xjZs6caYYNG6ZVtw1uDHLyDW4AeSg+s2POPfdcc8UVV6g/2qPQqVOnmoULF5oLLrggD2pWGWokoHnyNYLTbekhQA2e/ncNODbXCV1Wq6++urnrrrvSoyxJEjsBOfnYkSvDMAnccccd5hvf+Ib51re+FWayuUnrrLPOMo8//rh54YUXclMmFSQYATn5YLwUO0UEGGhlHvwJJ5xgOPtGn1UZrLHGGgZHz4yjTz75JEXakyhxEZCTj4u08gmdAPPgTz31VA0sViG7/fbbmzZt2phHH33UrFixInQ9KMF0E5CTT7d+JF0ZAmxN8PLLL5tDDz1UjHwQOOWUUwwzbj788EMfsRUlTwTk5POkzQYqC3vQ7L///uqi8dlNtfXWW5sNNtjAzJkzx3z66acNZCkqqpy8bCCTBFjdeeCBB2ZS9qSE3mOPPczcuXMzsSFbUozymK+cfB61mvMy0VWzzjrrmLZt2+a8pOEWj5fi008/bfvl1TcfLts0pyYnn2btSLaSBNiQa88991RXjc+uGjfriMHXli1bmmXLlqnLpoGeLTn5BlJ2Xor63nvvmQ033DAvxYm1HLR+5ORjRZ54ZnLyiatAAgQlwPz4ak5+/PjxdifGHXfc0X74/9Zbbw2aVe7is3HZBx98YL744gvz1Vdf5a58KtCqBOTkZRWZI7BgwQLr5Mstfho4cKAZOnSoOe644+zWu3zY9oDl/bNnz051N8/xxx9vrrnmmshkfPXVV837779vdf7ll19mTvcSODgBOfngzHRHwgTYK56tDEoFToHitCQc+5lnnml23313++HsVWbk8L83PPfcc4YPaXoDm565YwFdnFL5cV+568zjJ3Dd/c/3cvcQj64UnDD/Fx9LSBrl8uJ3gotTTkVvv/12YZdO1eQTNuSYstculDGBVjbhEWCWCNsZlAp0y2y77ba+umaI+84779jVoPxlQ6+rr77aJjt8+HDrbNmul+Di8aJwgRcKLQbud+G2224znTp1ss74/PPPt7Lw0qHLiJbERRddZNgd0t1Durfccovp2rWr2Wmnnez5s5xmRWAB0+DBg+3/bN0wf/78gqzc75WFe9k/fsSIETb+iy++WJJP9+7dDV1ZhPXXX9+svfba4SlGKaWSgGryqVSLhKqVAE6zQ4cOhdu9tV9X2+UitfxNN93UOkN3ohLO11vj5jvH6XH9mWeesY7enRdLbRwHj4PmOh8c+iWXXFLImzNYncN1O0EefvjhhTy5B+fPvjIu3j777GOdO3I5B4+s1PCRwcniyuDlNGnSJBunnIMvZrrmmmvWiln3ZYiAnHyGlCVRgxO44YYbbI2aDw7UOXpq13TdeLs/qB0/9thjhUz4TjcPoXXr1rYWzeEkhHvvvbfwu0tj1113tbVtF6iRFw/2UmP3BmTAgVcKyEpfPTI4WQ477DDbQvCGyy+/vBDHD6nVVlvNTzTFyTgBOfmMK1Dir0rADSxyBSdL7ff6669fJeLDDz9ceAHwEiBsueWWvpAyQ4XgXiD8pSZNzbxS4IVANxHdK3TB3Hnnnb7y69y5c9V47iVQNaIiNBQBOfmGUnd+CltuZk2XLl1sn3fxdW/JuUZg9g01d++nR48e9l4XvOl4f3P/F98/ceLEsveTFi8DHPa8efMMcemaIbh8yuX70ksvNStTcbxS95VilB8LUEn8EpCT90tK8TJB4LLLLrNysoe6d3bKP/7xj2bycw4sm5zVGo4++mg7SPrEE080S6J4Rkxx+vTr77vvvoWfX3/99VVEKP4NWV33kItMK4QXmoIIVCMgJ1+NkK6njgD71rDqtVTgCECmT3K26d57720OOugg+2FWC33y7dq1s7fdfPPN5t133zU777xzIQ7/ewdeKxWcGTScKzto0KBm959xxhkVeR1xxBFWFl5CyFUcaF1w2hXXrr32Wnv5pz/9qWFtgJOVv4RRo0YF1g2zaUhLoXEIaApl4+g6NyU977zzTJ8+fcwuu+xSsUxsq0s3xxZbbGGdO465OBDnkUceMYcccojZbbfdCpepkS9evLjZPbwASMfb980sG9ciYD8dbx6k7U3TJc7v7L9z5JFH2nNpSdd7H9+fffZZO6XTmxetBmbPFMtKuuXyKi4vUyzJ8+CDDy688HJjGCpISQJy8jKMzBFgDjunHeHsFIIR4NBzWji8kDbeeGOdqhUMXyZjq7smk2prbKHZf6Vcd01jk6leerixCIrA/jUK+ScgJ59/HeeuhOxbwzRJHdwd/PDypUuX2kVghNVXXz13tqECrUpATl5WkTkCzCrh8AuFYARee+01s95669ljAAnsLa+QfwLScv51nLsSMnC47rrrGpyWgn8CvBjpi3cOXk7eP7ssx5STz7L2Glh25prjtNRl47/Lhtk5DLoS1lhjDdXkG+T5kZNvEEXnrZi9evWyK1U///zzvBUtkvIwlXSttdYym2++uU1fm5NFgjmVicrJp1ItEqoaAWbY7LfffubBBx+sFlXXmwiwW+bpp59e6KrB4Ss0BgE5+cbQcy5LyTbA7FPDcYDqtinfbUO3Fi/FrbbaytpBq1at1FWTyyeidKHk5BtI2XkrKs6qX79+ZuzYsXkrWmjl+fjjj81vfvObwkZoTJtkho1C4xCQk28cXeeypJx0xJTAP/zhD7ksX72F4mATdrp0c+Ppi9c+8vVSzdb92tYgW/qStCUIMPg6ZMgQu9dL8RmujQxszJgxdnUrp1ERmFFDt42mTjaWVcjJN5a+c1taNhRjd0cGY51Ty21hqxSMl97Pf/5zW3s/9thjC/3wOHytcm08q5CTbzyd57bEn332mbnppptsTZUtf+mzb7TAfvVs4EY3lpsTDwNq8Jo22WjW8J/yysk3pt5zW+qvvvrKcGj273//ezsoS82+EQIDrPfcc49dIPb973+/MJOGslODZx95hcYkICffmHrPdamZTsmB27fddpthv3e6LPbaa69c1uypuT/55JN2vQAHjdBVRd+764NnJk0jtmhybeABCycnHxCYomeHALXb+fPn26PzOIRjjz32sOertm3b1s7I8Xtod5pK/OKLL1pxOCN25syZ9ohDumVYAeytrePYKaNm0qRJe8nIIiefDHflGhMBum9whDh8HP3s2bPNsmXL7FbFixYtikmK8LLhvFcCh6aw2Zhb4ORyYGCV06S0ojU85llPSU4+6xqU/L4IcEAGjv7TTz81OP48BQaaqbHj2KnNt2jRIk/FU1nqJCAnXydA3Z49AkwxxNm7k5FWrFiRCcePI//yyy/tNEjXDcOMGZy75r5nzw7jklhOPi7SykcEREAEEiCgbQ0SgK4sRUAERCAuAnLycZFWPiIgAiKQAAE5+QSgK0sREAERiIuAnHxcpJWPCIiACCRAQE4+AejKUgREQATiIiAnHxdp5SMCIiACCRCQk08AurIUAREQgbgIyMnHRVr5iIAIiEACBOTkE4CuLEVABEQgLgJy8nGRVj4iIAIikAABOfkEoCtLERABEYiLgJx8XKSVjwiIgAgkQEBOPgHoylIEREAE4iIgJx8XaeUjAiIgAgkQkJNPALqyFAEREIG4CMjJx0Va+YiACIhAAgTk5BOArixFQAREIC4CcvJxkVY+IiACIpAAATn5BKArSxEQARGIi4CcfFyklY8IiIAIJEBATj4B6MpSBERABOIiICcfF2nlIwIiIAIJEJCTTwC6shQBERCBuAjIycdFWvmIgAiIQAIE5OQTgK4sRUAERCAuAnLycZFWPiIgAiKQAIH/AyIgGB93ooOJAAAAAElFTkSuQmCC&quot; alt=&quot;&quot; title=&quot;coroutine&quot; width=&quot;377&quot; height=&quot;508&quot; class=&quot;alignnone size-full wp-image-360&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用类似概念实现的coroutine有很多, 比如Kilim &lt;span class=&quot;footnote&quot;&gt;&lt;br&gt;[Kilim: Isolation-Typed Actors for Java. ( &lt;a href=&quot;http://www.malhar.net/sriram/kilim/kilim_ecoop08.pdf&quot;&gt;pdf&lt;/a&gt; ) ]&lt;br&gt;&lt;/span&gt;. 通过把需要Join的函数调用标记出来, 可以由编译器自动生成代码, 实现类似这里Join函数的工作. &lt;a href=&quot;mailto:Kilim就是用@pausable这个annotation来标记需要Join的函数调用&quot;&gt;Kilim就是用@pausable这个annotation来标记需要Join的函数调用&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_方法2_使用cps变换实现stackful_coroutine&quot;&gt;&lt;/a&gt;方法2: 使用CPS变换实现stackful coroutine&lt;/h2&gt;
&lt;p&gt;除了使用这个Join函数实现stackful coroutine之外, 还可以使用CPS变换实现stackful coroutine. 在流程控制领域, CPS变换几乎是万能的, 以后会解释为什么CPS是万能的.&lt;/p&gt;
&lt;p&gt;首先, 从原始的traval函数开始:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;leaf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                yield tree&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;left&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;right&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;然后, 对这个函数做CPS变换:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; $travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;leaf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;yield&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;right&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;left&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;最后, 把上面这个函数包装成generator:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; generator &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; $yield &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; result&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                generator&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;next &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; k&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; result&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; $travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;leaf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;yield&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;right&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
                        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;left&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        generator&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;next &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;throw&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;stopIterator&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; generator&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;完整的代码如下, 各位可以试试, 看看里面是如何工作的:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; leaf &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;typeof&lt;/font&gt;&lt;/b&gt; tree &lt;font color=&quot;#990000&quot;&gt;!==&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;object&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; left &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; tree&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;l&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; right &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; tree&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;r&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; generator &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; $yield &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; result&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                generator&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;next &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; k&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; result&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; $travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;leaf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;yield&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;right&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
                        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;left&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        generator&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;next &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;throw&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;stopIterator&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; generator&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; g &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        l&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                l&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;
                r&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;
        r&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(;;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;g&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;next&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;());&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_杂谈&quot;&gt;&lt;/a&gt;杂谈&lt;/h2&gt;
&lt;p&gt;javascript的语法真是又臭又长, 使用CoffeeScript重写了一下上面的代码, 发现简洁好多 (44 &amp;#8594; 24 lines):&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;leaf &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;typeof&lt;/font&gt;&lt;/b&gt; tree &lt;font color=&quot;#990000&quot;&gt;!=&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;object&quot;&lt;/font&gt;
left &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;l
right &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;r

travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt;
        $yield &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; result&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt;
                generator&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;next &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; k
                result
        $travel &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;leaf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;yield&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt;
                        $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;((()&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;right&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;))),&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;left&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;tree&lt;font color=&quot;#990000&quot;&gt;))&lt;/font&gt;
        generator &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;
                next&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;travel&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;((()&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&amp;gt;&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;throw&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;stopIterator&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;),&lt;/font&gt; tree&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;

g &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; travel
        l&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;
                l&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;
                r&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;2&lt;/font&gt;
        r&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;3&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;
        console&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;g&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;next&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;())&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;虽然CoffeeScript仅仅是完全山寨javascript, 无任何创新, 但是最近却非常火热, 说明javascript实在是丑到家了&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/12/20/abstract-control-2-stackful-coroutine/</link>
                <guid>http://blog.kghost.info/2011/12/20/abstract-control-2-stackful-coroutine</guid>
                <pubDate>2011-12-20T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>云峰的餐盒饭问题</title>
                <description>&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
  MathJax.Hub.Config({
    tex2jax: {
      inlineMath: [ [&apos;$&apos;,&apos;$&apos;] ],
      processEscapes: true
    }
  });
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML&quot;&gt;
&lt;/script&gt;
&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;在云风的blog上看到一个 &lt;a href=&quot;http://blog.codingnow.com/2011/12/probability.html&quot;&gt;有趣的概率问题&lt;/a&gt; , 用概率学分析一下这个问题&amp;lt;/em&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;a name=&quot;_问题描述&quot;&gt;&lt;/a&gt;问题描述&lt;/h2&gt;
&lt;p&gt;有四份盒饭: 三份牛展, 一份是香菇, 我不知道我的盒饭是什么, 也不知道其他员工的盒饭是什么.
请问:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
我的盒饭是牛展的概率是多少
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
如果员工A的盒饭是牛展, 请问我的盒饭是牛展的概率是多少
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
如果员工A, B的盒饭都是牛展, 请问我的盒饭是牛展的概率是多少
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a name=&quot;_样本空间&quot;&gt;&lt;/a&gt;样本空间&lt;/h2&gt;
&lt;p&gt;分析离散概率问题最好的方法是把样本空间罗列出来:&lt;/p&gt;
&lt;div&gt;
&lt;table class=&quot;table&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;事件&lt;/th&gt;
&lt;th align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;我&lt;/th&gt;
&lt;th align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;员工A&lt;/th&gt;
&lt;th align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;员工B&lt;/th&gt;
&lt;th align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;员工C&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;$E_1$&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;香菇&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;$E_2$&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;香菇&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;$E_3$&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;香菇&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;$E_4$&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;牛展&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;20%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;香菇&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;这里假设 $ E_1, E_2, E_3, E_4 $ 发生的概率是一样的, 都是1/4&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_事件&quot;&gt;&lt;/a&gt;事件&lt;/h2&gt;
&lt;p&gt;通过简单的查表操作就可以得到:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ P(I) = E_2∪E_3∪E_4, \{\ I = 我的盒饭是牛展 \} $
$ P(A) = E_1∪E_3∪E_4, \{\ A = 员工A的盒饭是牛展 \} $
$ P(B) = E_1∪E_4, \{\ B = 员工A, B的盒饭都是牛展 \} $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;a name=&quot;_条件概率&quot;&gt;&lt;/a&gt;条件概率&lt;/h2&gt;
&lt;p&gt;条件概率就是事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为P(A|B)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$P(A|B) = \frac{P(A \cap B)}{P(B)}$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;a name=&quot;_计算结果&quot;&gt;&lt;/a&gt;计算结果&lt;/h2&gt;
&lt;p&gt;有了这些知识, 计算开始那三个问题就非常容易了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
我的盒饭是牛展的概率是多少
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;$P(I) = \frac{E_{2} \bigcup E_{3} \bigcup E_{4}}{U} = \frac{3}{4}$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
如果员工A的盒饭是牛展, 请问我的盒饭是牛展的概率是多少
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;$P(I|A) = \frac{( E_{2} \bigcup E_{3} \bigcup E_{4} ) \bigcap ( E_{1} \bigcup E_{3} \bigcup E_{4} )}{E_{1} \bigcup E_{3} \bigcup E_{4}} = \frac{( E_{3} \bigcup E_{4} )}{E_{1} \bigcup E_{3} \bigcup E_{4}} = \frac{2}{3}$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
如果员工A, B的盒饭都是牛展, 请问我的盒饭是牛展的概率是多少
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;$P(I|B) = \frac{( E_{2} \bigcup E_{3} \bigcup E_{4} ) \bigcap ( E_{1} \bigcup E_{4} )}{E_{1} \bigcup E_{4}} = \frac{E_{4}}{E_{1} \bigcup E_{4}} = \frac{1}{2}$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/12/12/probability-problem/</link>
                <guid>http://blog.kghost.info/2011/12/12/probability-problem</guid>
                <pubDate>2011-12-12T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>for loop is EVIL !!</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; LENGTH&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;无论是C++, JAVA还是javascript, 这种for循环都是非常常见的代码; 但是在所有的函数式语言中: Scala, Scheme, Erlang, Haskell为什么语法中都没有这样的for循环?&lt;/p&gt;
&lt;p&gt;考察下面这段代码:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; a &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&apos;a.html&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&apos;b.html&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&apos;c.html&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; a&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;length&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    console&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;a&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; a&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;].&lt;/font&gt;length&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;运行起来还算正常&lt;/p&gt;
&lt;p&gt;现在修改一下需求, 返回这几个页面的字符数:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; a &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&apos;a.html&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&apos;b.html&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&apos;c.html&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; a&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;length&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    $&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;ajax&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;a&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;],&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        success&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;text&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
            console&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;a&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; text&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;length&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;看起来这段代码与上面那段没什么太大区别, 应该不会出问题, 但是实际应用中, 立刻就看到问题了, 这段代码输出:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;undefined: 100
undefined: 200
undefined: 300&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;原因很简单, 虽然闭包success捕获了变量i, 但是i在后面发生了变化, 调用success闭包的时候, i变成了3, a[i]返回undefined.&lt;/p&gt;
&lt;p&gt;解决这个问题的方法也很简单: &lt;strong&gt;不要使用变量&lt;/strong&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; a &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&apos;a.html&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&apos;b.html&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&apos;c.html&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;
$&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;each&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;a&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    $&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;ajax&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;v&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        success&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;text&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
            console&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;v &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;: &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; text&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;length&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;由于传统的for循环必然引入变量, 一般的函数式语言的语法中都不包含传统的for循环.
== Scala ==
for循环是一个语法糖:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;-&lt;/font&gt; a&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#008080&quot;&gt;foo&lt;/font&gt; i &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;相当于:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#008080&quot;&gt;a&lt;/font&gt; each &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&amp;gt;&lt;/font&gt; &lt;font color=&quot;#008080&quot;&gt;foo&lt;/font&gt; i &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;每次都会生成一个新的变量i, 以及包含这个i的新闭包
为了强调i不是变量, Scala标准废弃了下面这种语法:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;-&lt;/font&gt; a&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#008080&quot;&gt;foo&lt;/font&gt; i &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_scheme&quot;&gt;&lt;/a&gt;Scheme&lt;/h2&gt;
&lt;p&gt;Scheme的do循环其实是一个宏:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;do&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;((&lt;/font&gt;i &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;+ i &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;)))&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;((&lt;/font&gt;= i &lt;font color=&quot;#993399&quot;&gt;5&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt; i&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;foo i&lt;font color=&quot;#FF0000&quot;&gt;))&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;展开后就是一个递归调用:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;letrec&lt;/font&gt;&lt;/b&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;((&lt;/font&gt;loop &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;= i &lt;font color=&quot;#993399&quot;&gt;5&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
      i
      &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;begin&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;foo i&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;loop &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;+ i &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;)))))))&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;loop &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;))&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;对列表操作的时候最好使用srfi-1的map函数:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;map&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;i&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;foo i&lt;font color=&quot;#FF0000&quot;&gt;))&lt;/font&gt; a&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_haskell&quot;&gt;&lt;/a&gt;Haskell&lt;/h2&gt;
&lt;p&gt;Haskell提供的循环:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt; foo i &lt;font color=&quot;#990000&quot;&gt;|&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;-&lt;/font&gt; a &lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;或者使用list monad:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;do&lt;/font&gt;&lt;/b&gt;
  i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;-&lt;/font&gt; a
  return &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;foo i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;可以看出, 所有的函数式语言提供的for循环都没有使用变量, 变量在函数式语言中天生水土不服. javascript本身就是个畸形, 标榜自己是函数式语言, 却处处学习C/java的语法, 在使用javascript的时候, 最好尽量避免使用传统的for循环&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/12/12/for-loop-is-evil/</link>
                <guid>http://blog.kghost.info/2011/12/12/for-loop-is-evil</guid>
                <pubDate>2011-12-12T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>高阶流程控制语句（一）： stackless coroutine</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;p&gt;coroutine是一种常见的流程控制语句, 可以在单线程内模拟多线程的执行, 经常被用于非抢占式用户态纤程(Fiber)
这里先要区分一下两种不同的coroutine&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
stackless coroutine (semi-coroutine)
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
stackful coroutine (coroutine)
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面先讨论一下stackless coroutine, 后面会继续讨论stackful coroutine. 对于两者的区别, 分别了解了两种coroutine后自然会非常清楚.&lt;/p&gt;
&lt;p&gt;stackless coroutine又经常被称为generator. 下面这些语言中的&amp;lt;span style=&quot;color: blue&quot;&amp;gt;yield&amp;lt;/span&amp;gt;都属于stackless coroutine&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
javascript 1.7
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
python
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
ruby
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文主要是讲解stackless coroutine的本质及其实现原理, 对于stackless coroutine比较陌生的同学可以先简单学习一下javascript 1.7的coroutine:  &lt;a href=&quot;https://developer.mozilla.org/en/New_in_JavaScript_1.7#Generators&quot;&gt;https://developer.mozilla.org/en/New_in_JavaScript_1.7#Generators&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;stackless coroutine本质上仅仅是一个 &lt;strong&gt;语法糖&lt;/strong&gt; , 例如下面这段javascript代码 &lt;span class=&quot;footnote&quot;&gt;&lt;br&gt;[摘自  &lt;a href=&quot;https://developer.mozilla.org/en/New_in_JavaScript_1.7#Generators&quot;&gt;New in JavaScript 1.7 #Generators&lt;/a&gt; ]&lt;br&gt;&lt;/span&gt;, 可以转换成不使用yield的代码:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fib&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    yield i&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; t &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; i&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    j &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; t&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;首先把while/for循环转换成递归, 并且新建一个generator对象:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fib&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; generator &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  generator&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;next &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      yield i&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; t &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; i&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
      i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
      j &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; t&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
      $&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
      &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;/* 1 */&lt;/font&gt;&lt;/i&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    $&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
    &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;/* 2 */&lt;/font&gt;&lt;/i&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; generator&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;然后对generator内部做cps变换. 经过cps变换后, yield成为一个普通函数:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fib&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; generator &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; $yield &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; value&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    generator&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;next &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; k&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; value&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  generator&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;next &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;k &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;/* $while never return, so k is never called. */&lt;/font&gt;&lt;/i&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;yield&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// all statements after yield become continuation of yield, which comes into this function&lt;/font&gt;&lt;/i&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; t &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; i&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        j &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; t&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;/* 1 */&lt;/font&gt;&lt;/i&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; i &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;/* arguments of yield */&lt;/font&gt;&lt;/i&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; $&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt; &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;/* 2 */&lt;/font&gt;&lt;/i&gt; &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; generator&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// test code, copy into any javascript engine and check result&lt;/font&gt;&lt;/i&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; g &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;fib&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;10&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i&lt;font color=&quot;#990000&quot;&gt;++)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  console&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;g&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;next&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;());&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;上面所使用到了两种转换:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
循环变递归
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
CPS变换
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这两种转换都是通用转换, 任何程序都可以做这样的转换, 通过这两种转换可以把任何使用yield的代码转换成普通代码. 实际上, stackless coroutine的实现就是编译器(或者解释器)在背后做了这些工作.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/11/15/abstract-control-1-stackless-coroutine/</link>
                <guid>http://blog.kghost.info/2011/11/15/abstract-control-1-stackless-coroutine</guid>
                <pubDate>2011-11-15T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>Call/CC与Node.js</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;本文介绍一个使用大概10行代码, 实现一个类似老赵JSCEX &lt;span class=&quot;footnote&quot; id=&quot;_footnote_jscex&quot;&gt;&lt;br&gt;[JavaScript版本的AsyncEnumerator  &lt;a href=&quot;http://blog.zhaojie.me/2010/11/asynciterator-the-asyncenumerator-in-javascript.html&quot;&gt;http://blog.zhaojie.me/2010/11/asynciterator-the-asyncenumerator-in-javascript.html&lt;/a&gt;]&lt;br&gt;&lt;/span&gt;的工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先来看一下下面这段Node.js代码:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; copy &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;src&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; dst&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; fd_src &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;open&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;src&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;r&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; fd_dst &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;open&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;dst&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;w&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; buffer_size &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;4096&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; buffer &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Buffer&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;buffer_size&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; bytes_read &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd_src&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer_size&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bytes_read &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; write_at &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;write_at &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; bytes_read&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        write_at &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd_dst&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; write_at&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; bytes_read &lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt; write_at&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;break&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这段看起来像是一个文件拷贝的函数, 但是这个函数在Node里面是无法运行的, 因为Node的所有函数调用都必须是异步的, 这里用到的fs.open, fs.read, fs.write都必须修改为异步调用, 修改后可运行的代码如下:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; copy &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;src&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; dst&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;open&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;src&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;r&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; undefined&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; fd_src&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;open&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;dst&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;w&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; undefined&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; fd_dst&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; copy_rec &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;position&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; buffer_size &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;4096&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; buffer &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Buffer&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;4096&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
        fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd_src&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer_size&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; position&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; bytes_read&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
          &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bytes_read &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; write_rec &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;write_at&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
              &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;write_at &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; bytes_read&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd_dst&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; bytes_read&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; position&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; written&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;written &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;write_rec&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;write_at &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; written&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
                  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
              &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;copy_rec&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;position &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; bytes_read&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
              &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
            &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
            &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;write_rec&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
          &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;copy_rec&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;看到这里, 我想第一次接触Node的同学就已经要崩溃了, 一个简单的文件拷贝函数竟然需要嵌套4~5层函数回调, 那么更复杂的比如web servlet岂不是要嵌套10多层函数回调了?&lt;/p&gt;
&lt;p&gt;难道没有方法让最上面的简洁明了的代码运行起来么? 下面就介绍一种方法, &lt;strong&gt;不修改最开始那个简洁明了的拷贝函数, 让它直接跑起来, 并且不会阻塞整个JS引擎&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先分析一下同步调用与异步调用的区别&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// sync&lt;/font&gt;&lt;/i&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; fd &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;read&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;name&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; mode&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// use fd&lt;/font&gt;&lt;/i&gt;


&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// async&lt;/font&gt;&lt;/i&gt;
fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;read&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;name&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; mode&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;// use fd&lt;/font&gt;&lt;/i&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;仔细观察这两个调用, 会发现其实这就是一个CPS变换 &lt;span class=&quot;footnote&quot;&gt;&lt;br&gt;[Continuation-passing style  &lt;a href=&quot;http://en.wikipedia.org/wiki/Continuation-passing_style&quot;&gt;http://en.wikipedia.org/wiki/Continuation-passing_style&lt;/a&gt; ]&lt;br&gt;&lt;/span&gt;, 所以, 我们只需要做一个CPS变换的包装就可以实现同步的文件操作, 具体实现如下:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; efs &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  open&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;name&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; mode&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;call_cc&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;continuation&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;open&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;name&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; mode&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; undefined&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; fd_src&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;continuation&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd_src&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;
  read&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; offset&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; length&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;call_cc&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;continuation&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; offset&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; length&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; bytes_read&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;continuation&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bytes_read&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;
  write&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; offset&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; length&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;call_cc&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;continuation&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; offset&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; length&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; written&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;continuation&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;written&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这个实现的核心就是call/cc函数 &lt;span class=&quot;footnote&quot;&gt;&lt;br&gt;[Call-with-current-continuation  &lt;a href=&quot;http://en.wikipedia.org/wiki/Call-with-current-continuation&quot;&gt;http://en.wikipedia.org/wiki/Call-with-current-continuation&lt;/a&gt; ]&lt;br&gt;&lt;/span&gt;, 如果了解lisp或者scheme的同学可能会非常熟悉这个函数, 这个函数作用是把当前正在运行的线程挂起, 然后执行call/cc本体, call/cc函数*不会返回*, 直到主动调用参数传进来的那个回调函数(本例中continuation变量绑定的函数), call/cc函数的返回值就是传给回调函数的参数. call/cc函数确实很难理解, 下面举例说明一下:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;before call/cc&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; result &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;call_cc&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;continuation&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;in call/cc before set timer&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;setTimeout&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;before callback&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;continuation&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;hello world!&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;after callback&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1000&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;in call/cc after set timer&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
util&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;log&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;after call/cc &quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; result&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这段代码的输出为:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;31 Oct 13:01:33 - before call/cc
// 运行call/cc函数主体
31 Oct 13:01:33 - in call/cc before set timer
31 Oct 13:01:33 - in call/cc after set timer
// 休息1秒, 进入setTimeout的回调
31 Oct 13:01:34 - before callback
// 进入continuation函数, 调用continuation函数就相当于call/cc函数返回了&quot;hello world!&quot;, 从call/cc返回开始继续执行
31 Oct 13:01:34 - after call/cc hello world!
// 执行setTimeout回调剩下部分
31 Oct 13:01:34 - after callback&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;现在我们已经使用CPS转换得到了&quot;同步&quot;的文件处理函数, 虽然说看起来是同步的, 但是内部使用的是call/cc实现, 实际上是不会阻塞JS引擎的, 其他回调仍然能正常执行. 有了这些函数的支持, 本文开头给出的那个文件拷贝函数就能够*不作任何修改正常执行*, 现在一切问题都已经解决了, 唯一剩下的问题就是call/cc函数的实现, 标准的node.js引擎是没有call/cc函数的, 这里我们使用node-fibers &lt;span class=&quot;footnote&quot; id=&quot;_footnote_fiber&quot;&gt;&lt;br&gt;[Fiber support for v8 and Node  &lt;a href=&quot;https://github.com/laverdet/node-fibers&quot;&gt;https://github.com/laverdet/node-fibers&lt;/a&gt;]&lt;br&gt;&lt;/span&gt;实现call/cc函数.&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; call_cc &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;cont&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; fiber &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; Fiber&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;current&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;cont&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;a&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    fiber&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;run&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;a&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; Fiber&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;yield&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]();&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;由于node-fiber的限制, 这个copy函数必须运行在fiber环境中, 完整代码如下:&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; fs &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;require&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;fs&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;require&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;fibers&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; call_cc &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;cont&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; fiber &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; Fiber&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;current&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;cont&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;a&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    fiber&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;run&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;a&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; Fiber&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;yield&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]();&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; efs &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  open&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;name&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; mode&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;call_cc&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;continuation&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;open&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;name&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; mode&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; undefined&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; fd_src&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;continuation&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd_src&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;
  read&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; offset&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; length&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;call_cc&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;continuation&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; offset&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; length&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; bytes_read&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;continuation&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bytes_read&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt;
  write&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; offset&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; length&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;call_cc&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;continuation&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      fs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; offset&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; length&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;null&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;err&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; written&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;continuation&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;written&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; copy &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;src&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; dst&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; fd_src &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; efs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;open&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;src&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;r&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; fd_dst &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; efs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;open&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;dst&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;w&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;true&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; buffer_size &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;4096&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; buffer &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;new&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Buffer&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;buffer_size&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; bytes_read &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; efs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;read&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd_src&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer_size&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;bytes_read &lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;var&lt;/font&gt;&lt;/b&gt; write_at &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;while&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;write_at &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; bytes_read&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        write_at &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; efs&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;fd_dst&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; buffer&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; write_at&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; bytes_read &lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt; write_at&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
      &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;break&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;Fiber&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;function&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;copy&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;src&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;dst&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;).&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;run&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;最后一点空间, 我想简单评论一下老赵的JSCEX &lt;span class=&quot;footnoteref&quot;&gt;&lt;br&gt;&lt;a href=&quot;#_footnote_jscex&quot;&gt;[jscex]&lt;/a&gt;&lt;br&gt;&lt;/span&gt;, 简单来说, 就是一点: &lt;strong&gt;简直就是在重复发明轮子&lt;/strong&gt;.
有关函数式编程, 在lisp界已经有40~50年的研究, 各个方面都已经有非常完善的体系, 当然这种异步同步函数之间互相转换早已经有体系化, 可证明的研究 &lt;span class=&quot;footnote&quot;&gt;&lt;br&gt;[Olivier Danvy and Andrzej Filinski. 1990. Abstracting control. In Proceedings of the 1990 ACM conference on LISP and functional programming (LFP &apos;90). ACM, New York, NY, USA, 151-160. DOI=10.1145/91556.91622  &lt;a href=&quot;http://doi.acm.org/10.1145/91556.91622&quot;&gt;http://doi.acm.org/10.1145/91556.91622&lt;/a&gt; ]&lt;br&gt;&lt;/span&gt;, 实现这样一个异步类库, 最好是从底层做起, 首先实现fiber &lt;span class=&quot;footnoteref&quot;&gt;&lt;br&gt;&lt;a href=&quot;#_footnote_fiber&quot;&gt;[fiber]&lt;/a&gt;&lt;br&gt;&lt;/span&gt; 或者shift/reset &lt;span class=&quot;footnote&quot;&gt;&lt;br&gt;[Tiark Rompf, Ingo Maier, and Martin Odersky. 2009. Implementing first-class polymorphic delimited continuations by a type-directed selective CPS-transform. In Proceedings of the 14th ACM SIGPLAN international conference on Functional programming (ICFP &apos;09). ACM, New York, NY, USA, 317-328. DOI=10.1145/1596550.1596596  &lt;a href=&quot;http://doi.acm.org/10.1145/1596550.1596596&quot;&gt;http://doi.acm.org/10.1145/1596550.1596596&lt;/a&gt; ]&lt;br&gt;&lt;/span&gt;这样的底层函数, 然后再其之上, 构建一个异步框架. 像老赵这样, 一上来就搞JS再编译, 那是绕了十万八千里的远路, 不仅本身会引入bug, 也会给用户的调试造成很大困扰, 性能问题也无法保证.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/10/31/callcc-and-node-js/</link>
                <guid>http://blog.kghost.info/2011/10/31/callcc-and-node-js</guid>
                <pubDate>2011-10-31T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>整理背包问题</title>
                <description>&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
  MathJax.Hub.Config({
    tex2jax: {
      inlineMath: [ [&apos;$&apos;,&apos;$&apos;] ],
      processEscapes: true
    }
  });
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML&quot;&gt;
&lt;/script&gt;
&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_问题&quot;&gt;&lt;/a&gt;问题&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;现有编号为1 ~ n的n件物品, 随机放在编号为1 \~ n的n个背包中, 现在需要通过交换背包中的物品, 最终使物品 i 放在对应的背包 i 中, 需要交换的次数就是这个排列的逆序数. 现在考虑这样一个问题, 每轮交换, 可以选取任意对背包, 交换里面的物品, 但是同一个背包不能被选择两次, 那么需要几轮交换才能整理好所有物品?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;比如有3个物品, 排列{2,3,1}, 要整理好, 至少需要两次交换{2,3,1} &amp;#8594; {3,2,1} &amp;#8594; {1,2,3}&lt;/p&gt;
&lt;p&gt;再比如有4个物品, 排列{2,3,4,1} 要整理好, 也至少需要两次交换
 {2,3,4,1} &amp;#8594; {3,2,1,4} &amp;#8594; {1,2,3,4}
第一次交换(2&amp;lt;&amp;#8658;3)(4&amp;lt;&amp;#8658;1), 第二轮交换(1&amp;lt;&amp;#8658;3)&lt;/p&gt;
&lt;p&gt;下面我们证明, 最多只需要两轮交换就能整理好所有背包.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_使用_a_href_http_en_wikipedia_org_wiki_cycle_notation_cyclic_notation_a_证明&quot;&gt;&lt;/a&gt;使用 &lt;a href=&quot;http://en.wikipedia.org/wiki/Cycle_notation&quot;&gt;Cyclic notation&lt;/a&gt; 证明&lt;/h2&gt;
&lt;p&gt;原命题可以表示为:&lt;/p&gt;
&lt;p&gt;若:&lt;/p&gt;
&lt;p&gt;$ P = \prod_{i} (a_{i1}, a_{i2}, \dots, a_{is_{i}}) \hspace{40pt} (\sum_{i} s_{i} = n, a_{ij} \in \{ 1 \dots n \}, a_{ij} \neq a_{kl}) $&lt;/p&gt;
&lt;p&gt;则, P可以表示为:&lt;/p&gt;
&lt;p&gt;$ P = \prod_{i} (x_{i1}, x_{i2}) \prod_{i} (y_{i1}, y_{i2}) \hspace{25pt} (x_{ij}, y_{ij} \in \{ 1 \dots n \}, x_{ij} \neq x_{kl}, y_{ij} \neq y_{kl}) $&lt;/p&gt;
&lt;p&gt;首先有:&lt;/p&gt;
&lt;p&gt;$ (1, 2, \dots, s_{i}) = (1, s_{i-1})(2, s_{i-2})\dots(\lfloor s_{i}/2 \rfloor, \lceil s_{i}/2 \rceil) \hspace{10pt} (1, s_{i})(2, s_{i}-1)\dots(\lfloor (s_{i}+1)/2 \rfloor, \lceil (s_{i}+1)/2 \rceil) \\ $&lt;/p&gt;
&lt;p&gt;所以可以记:&lt;/p&gt;
&lt;p&gt;$
a_{i} = (a_{i1}, a_{i2}, \dots, a_{is_{i}}) \hspace{40pt} (A_{i} = \{ a_{ip} | p \in {1 \dots s_{i}\} \}, A_{i} \cap A_{j} = \varnothing) \\
x_{i} =(a_{i1}, a_{is_{i-1}})(a_{i2}, a_{is_{i-2}})\dots(a_{i\lfloor s_{i}/2 \rfloor}, a_{i\lceil s_{i}/2 \rceil}) \\
y_{i} =(a_{i1}, a_{is_{i}})(a_{i2}, a_{is_{i-1}})\dots(a_{i\lfloor (s_{i}+1)/2 \rfloor}, a_{i\lceil (s_{i}+1)/2 \rceil}) \\
a_{i} = x_{i}y_{i}
$&lt;/p&gt;
&lt;p&gt;所以P可以表示为:&lt;/p&gt;
&lt;p&gt;$
P \\
= \prod_{i} a_{i} \\
= \prod_{i} x_{i}y_{i} \\
= \prod_{i} x_{i} \prod_{i} y_{i})
$&lt;/p&gt;
&lt;p&gt;最后一步是因为 $ A_{i} \cap A_{j} = \varnothing $ , 所以, 原命题得证.&lt;/p&gt;
&lt;p&gt;证明看起来很麻烦, 但是背后的原理非常简单, 所有的排列都可以表示为若干个环, 例如:&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;width: 100%&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/c/cb/Symmetric_group_3%3B_Cayley_table%3B_positions.svg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后证明每个环都能够通过两轮交换还原. 上面证明中的 $ x_{i}y_{i} $ 就是还原了环 $ a_{i} $ , 方法就是通过一轮交换, 变成倒序, 然后再通过一轮交换, 变成正序.&lt;/p&gt;
&lt;p&gt;$
\begin{pmatrix}
2 &amp;amp; 3 &amp;amp; 4 &amp;amp; \cdots &amp;amp; n-1 &amp;amp; n &amp;amp; 1 \\
&amp;amp;  &amp;amp;  &amp;amp; \downarrow &amp;amp;  &amp;amp;  &amp;amp; \\
n &amp;amp; n-1 &amp;amp; n-2 &amp;amp; \cdots &amp;amp; 3 &amp;amp; 2 &amp;amp; 1 \\
&amp;amp;  &amp;amp;  &amp;amp; \downarrow &amp;amp;  &amp;amp;  &amp;amp; \\
1 &amp;amp; 2 &amp;amp; 3 &amp;amp; \cdots &amp;amp; n-2 &amp;amp; n-1 &amp;amp; n
\end{pmatrix}
$&lt;/p&gt;
&lt;p&gt;又因为每个环都是独立的, 所以第一步交换可以同时进行, 一轮就可以完成所有环的第一步, 第二轮完成所有环的第二部, 问题解决.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_使用_a_href_http_en_wikipedia_org_wiki_permutation_matrix_排列矩阵_a_证明&quot;&gt;&lt;/a&gt;使用 &lt;a href=&quot;http://en.wikipedia.org/wiki/Permutation_matrix&quot;&gt;排列矩阵&lt;/a&gt; 证明&lt;/h2&gt;
&lt;p&gt;考虑题目的交换方式, 每轮能够交换任意对物品, 那么每轮交换的变换矩阵就是一个对称排列矩阵. 比如同时交换(1&amp;lt;&amp;#8658;2)(3&amp;lt;&amp;#8658;4)的变换矩阵就是&lt;/p&gt;
&lt;p&gt;$
\begin{bmatrix}
&amp;amp; 1 &amp;amp; &amp;amp; \\
1 &amp;amp; &amp;amp; &amp;amp; \\
&amp;amp; &amp;amp; &amp;amp; 1 \\
&amp;amp; &amp;amp; 1 &amp;amp; \\
\end{bmatrix}
$&lt;/p&gt;
&lt;p&gt;原命题就等价于:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;对于任意排列矩阵 $ P $, 存在对称排列矩阵 $ L $ , $ R $ , 使
       $ P=LR $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面我们开始构造 $ L $ 与 $ R $ .&lt;/p&gt;
&lt;p&gt;首先分析P的特征根:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ P-λE=0 $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;P的特征多项式为:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ \prod_{i} (\lambda^{s_{i}} \pm 1)=0 $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;$ s_{i} $ 与上个证明中相同, 为每个环的元素数, 这不是巧合.&lt;/p&gt;
&lt;p&gt;所以P有p组独立的特征根, 分别是 $ \{\lambda_{11}, \dots, \lambda_{1s_{1}}\}, \dots, \{\lambda_{p1}, \dots, \lambda_{ps_{p}}\} $ , 每组都分布在复平面的单位圆上. 考察P的 &lt;a href=&quot;http://en.wikipedia.org/wiki/Eigendecomposition_of_a_matrix&quot;&gt;特征分解&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$
P = Q \Lambda Q^{-1} = (Q \Lambda Q^{T}) ((Q^{T})^{-1} Q^{-1}) = (Q \Lambda Q^{T}) (Q Q^{T})^{-1} \\
Q = \begin{bmatrix}
| &amp;amp; &amp;amp; | &amp;amp; &amp;amp; | &amp;amp; &amp;amp; | \\
X_{11} &amp;amp; \cdots &amp;amp; X_{1s_{1}} &amp;amp; \cdots &amp;amp; X_{p} &amp;amp; \cdots &amp;amp; X_{ps_{p}} \\
| &amp;amp; &amp;amp; | &amp;amp; &amp;amp; | &amp;amp; &amp;amp; |
\end{bmatrix}
\Lambda = \begin{bmatrix}
\lambda_{11} &amp;amp; &amp;amp; 0 \\
&amp;amp; \ddots &amp;amp; \\
0 &amp;amp;  &amp;amp; \lambda_{ps_{p}}
\end{bmatrix}
$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;$ X_{ij} $ 为特征值 $ \lambda_{ij} $ 对应的特征向量标准化.&lt;/p&gt;
&lt;p&gt;下面我们证明:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ L = Q \Lambda Q^{T} \\ R = (Q Q^{T})^{-1} $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;都是对称排列矩阵.&lt;/p&gt;
&lt;p&gt;R的对称性:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ R^{T} = ((Q Q^{T})^{-1})^{T} = ((Q Q^{T})^{T})^{-1} = ((Q^{T})^{T} Q^{T})^{-1} = (Q Q^{T})^{-1} = R $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;R是排列矩阵:&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;L的对称性:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ L^{T} = (Q \Lambda Q^{T})^{T} = (Q^{T})^{T} \Lambda^{T} Q^{T} = Q \Lambda Q^{T} = L $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L是排列矩阵:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ L = PR^{-1} $&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;两个排列矩阵的积还是排列矩阵&lt;/p&gt;
&lt;p&gt;PS: 此问题来源于WOW整理背包的插件, 一次可以向服务器提交一系列移动物品的指令, 但是不能涉及到重复的物品栏, 那么至少需要提交几次移动指令才能把背包整理好, 答案是2次!! 结论: 现有的整理背包插件都是渣.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/07/08/%E6%95%B4%E7%90%86%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98/</link>
                <guid>http://blog.kghost.info/2011/07/08/整理背包问题</guid>
                <pubDate>2011-07-08T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>自己动手修改Android程序 - twicca改造</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;仅以此文悼念为了使用twicca上twitter与GFW搏斗浪费掉的20多个小时&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;a name=&quot;_apktool&quot;&gt;&lt;/a&gt;apktool&lt;/h2&gt;
&lt;p&gt;首先介绍一个软件 &lt;a href=&quot;http://code.google.com/p/android-apktool/&quot;&gt;apktool&lt;/a&gt; , 利用它可以反汇编Android的二进制软件包. 利用apktool反汇编Android程序的结果与程序源代码目录结构相同, 唯一区别是包含Java代码的src目录变成了包含Dalvik汇编码的smali目录.&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;twicca.org/
|-- AndroidManifest.xml
|-- apktool.yml
|-- res
|   |-- anim
|   |-- color
|   |-- drawable
|   |-- layout
|   |-- values
|   `-- xml
`-- smali
    `-- [dalvik assembler code]&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;修改代码后使用apktool可以重新编译修改过的反汇编结果, 生成新的Android程序.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_dalvik&quot;&gt;&lt;/a&gt;Dalvik&lt;/h2&gt;
&lt;p&gt;smali目录里面是Dalvik虚拟机的汇编码.  &lt;a href=&quot;http://en.wikipedia.org/wiki/Dalvik_(software)&quot;&gt;Dalvik&lt;/a&gt; 是android使用的Java虚拟机, 类似sun的JVM, 使用与Java bytecode类似的指令集. 与Java bytecode最大的区别是Dalvik是寄存器机, Java bytecode是堆栈机. Dalvik的效率更高, 因为现有大部分硬件体系都是寄存器机, Dalvik能够更加充分得利用寄存器资源; 而且Dalvik的汇编代码也更加容易理解, 寄存器变量比堆栈变量更加清晰明了.&lt;/p&gt;
&lt;p&gt;比如说这样一段代码&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;void&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;HelloWorld&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;String&lt;/font&gt; p1&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#008080&quot;&gt;String&lt;/font&gt; p2&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
    System&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;out&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;p1 &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; p2&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;编译成JVM和Dalvik分别是&lt;/p&gt;
&lt;p&gt;&lt;b&gt;JVM byte code&lt;/b&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;public void HelloWorld(java.lang.String, java.lang.String);
  Signature: (Ljava/lang/String;Ljava/lang/String;)V
  Code:
   0:   getstatic       #36; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   new     #37; //class java/lang/StringBuilder
   6:   dup
   7:   invokespecial   #38; //Method java/lang/StringBuilder.&quot;&amp;lt;init&amp;gt;&quot;:()V
   10:  aload_1
   11:  invokevirtual   #39; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   14:  aload_2
   15:  invokevirtual   #39; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   18:  invokevirtual   #40; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   21:  invokevirtual   #41; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   24:  return&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Dalvik&lt;/b&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;4&quot;&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;&lt;code&gt;.method public HelloWorld(Ljava/lang/String;Ljava/lang/String;)V
    sget-object v0, Ljava/lang/System;-&amp;gt;out:Ljava/io/PrintStream;
    new-instance v1, Ljava/lang/StringBuilder;
    invoke-direct {v1}, Ljava/lang/StringBuilder;-&amp;gt;&amp;lt;init&amp;gt;()V
    invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;-&amp;gt;append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    move-result-object v1
    invoke-virtual {v1, p2}, Ljava/lang/StringBuilder;-&amp;gt;append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    move-result-object v1
    invoke-virtual {v1}, Ljava/lang/StringBuilder;-&amp;gt;toString()Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v0, v1}, Ljava/io/PrintStream;-&amp;gt;println(Ljava/lang/String;)V
    return-void
.end method&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;很明显, 下面Dalvik的汇编代码容易理解, 即使没有接触过Dalvik也能轻松理解这段代码. 上面的JVM bytecode就不是那么容易理解了, 函数调用的参数与结果都隐含在堆栈中, 必须分析堆栈才能知道程序意义.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_调试&quot;&gt;&lt;/a&gt;调试&lt;/h2&gt;
&lt;p&gt;使用apktool的-d参数解开/打包的程序会拥有调试信息, 在Android上运行的时候可以通过JPDA调试, 在手机上使用Dev Tools打开调试, 然后在PC上用Android SDK里面的ddms连上去, 启动程序, 用任意一个JPDA客户端连上去就可以调试了. apktool的作者测试, Eclipse无法设置断点, 其他功能正常, 笔者使用jswat所有功能都正常. apktool作者的调试教程在 &lt;a href=&quot;http://code.google.com/p/android-apktool/wiki/SmaliDebugging&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有了apktool, 并且熟悉了Dalvik bytecode, 我们就可以对所有的Android程序动手术了.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_twicca的防篡改机制&quot;&gt;&lt;/a&gt;twicca的防篡改机制&lt;/h2&gt;
&lt;p&gt;twicca这个程序会在运行的时候把自己的signature发给服务器验证本身的没有被篡改, 改过程序的signature肯定会变化, 无法通过服务器验证, 不过得到自己signature的程序也是程序写的, 我们把这段改掉, 直接返回正确的signature就可以了. 得到一个程序signature的方法有很多种, 通过调试器在原程序得到signature的地方设置断点, 直接从程序内存中取出来; 或者写一个程序在手机中运行计算原程序的signature. 这里笔者使用的是另外一个黑客研究出来的方法, 可以 &lt;a href=&quot;http://androidcracking.blogspot.com/2010/12/getting-apk-signature-outside-of.html&quot;&gt;直接在PC上获得程序的signature&lt;/a&gt; . 获取到程序正确的signature后, 要想办法替换到程序中得到修改过的signature.&lt;/p&gt;
&lt;p&gt;下面这段代码是twicca获取自己signature的代码&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;string&lt;/font&gt; v1&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;jp.r246.twicca&quot;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;16&lt;/font&gt; v2&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0x40&lt;/font&gt;
    invoke&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;virtual &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v1&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v2&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;PackageManager&lt;font color=&quot;#990000&quot;&gt;;-&amp;gt;&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;getPackageInfo&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;Ljava&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;lang&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;String&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;I&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;PackageInfo&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    move&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;result&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;object v0
    iget&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;object&lt;/font&gt; v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;PackageInfo&lt;font color=&quot;#990000&quot;&gt;;-&amp;gt;&lt;/font&gt;signatures&lt;font color=&quot;#990000&quot;&gt;:[&lt;/font&gt;Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;Signature&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;4&lt;/font&gt; v2&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0x0&lt;/font&gt;
    aget&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;object&lt;/font&gt; v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v2
    invoke&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;virtual &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;v0&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;Signature&lt;font color=&quot;#990000&quot;&gt;;-&amp;gt;&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;toCharsString&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;Ljava&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;lang&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;String&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    move&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;result&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;object v0&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;翻译成Java就是&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;    &lt;font color=&quot;#008080&quot;&gt;PackageManager&lt;/font&gt; v0a &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;...;&lt;/font&gt;
    &lt;font color=&quot;#008080&quot;&gt;PackageInfo&lt;/font&gt; v0b &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; v0a&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;getPackageInfo&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;jp.r246.twicca&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0x40&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
    Signature&lt;font color=&quot;#990000&quot;&gt;[]&lt;/font&gt; v0c &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; v0b&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;signatures&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;font color=&quot;#008080&quot;&gt;Signature&lt;/font&gt; v0d &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; v0c&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;
    &lt;font color=&quot;#008080&quot;&gt;String&lt;/font&gt; v0e &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; v0d&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;toCharsString&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;我们只需要把最后的结果改成正确的signature, 而不是从PackageInfo中得到的signature, 所以只需要改最后一句, 直接给v0e赋值就可以了, 修改后就是这样(注意只有最后一句有变化).&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;string&lt;/font&gt; v1&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;jp.r246.twicca&quot;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;16&lt;/font&gt; v2&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0x40&lt;/font&gt;
    invoke&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;virtual &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v1&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v2&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;PackageManager&lt;font color=&quot;#990000&quot;&gt;;-&amp;gt;&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;getPackageInfo&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;Ljava&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;lang&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;String&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;I&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;PackageInfo&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    move&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;result&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;object v0
    iget&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;object&lt;/font&gt; v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;PackageInfo&lt;font color=&quot;#990000&quot;&gt;;-&amp;gt;&lt;/font&gt;signatures&lt;font color=&quot;#990000&quot;&gt;:[&lt;/font&gt;Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;Signature&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;4&lt;/font&gt; v2&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0x0&lt;/font&gt;
    aget&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;object&lt;/font&gt; v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; v2
    invoke&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;virtual &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;v0&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; Landroid&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;content&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;pm&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;Signature&lt;font color=&quot;#990000&quot;&gt;;-&amp;gt;&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;toCharsString&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;Ljava&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;lang&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;String&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
    &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;string&lt;/font&gt; v0&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;30820269308201d2......27a2ee&quot;&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;这样的话无论我们如何篡改程序, 它在自检验的时候都会得到我们硬编码到这段代码中的signature, 这样就能跳过它的自检验了.&lt;/p&gt;
&lt;p&gt;下面就可以充分发挥想象力随意修改程序了, 比如把所有指向twitter.com的请求改成指向某代理的请求&amp;#8230;&lt;/p&gt;
&lt;p&gt;这是笔者修改的用来翻墙的twicca 0.8.24c的patch&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.kghost.info/wp-content/uploads/2011/03/twicca.diff.gz&quot;&gt;twicca.diff&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/03/03/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E4%BF%AE%E6%94%B9android%E7%A8%8B%E5%BA%8F-twicca%E6%94%B9%E9%80%A0/</link>
                <guid>http://blog.kghost.info/2011/03/03/自己动手修改android程序-twicca改造</guid>
                <pubDate>2011-03-03T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>使用fakeroot模拟root权限执行程序</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;最近从 &lt;a href=&quot;http://tianchunbinghe.blog.163.com/&quot;&gt;田春&lt;/a&gt; 那里借来一本好书 &lt;a href=&quot;http://books.google.com/books?id=Jzv3L2j6oqsC&quot;&gt;ハッカー秘伝のテクニック100選&lt;/a&gt; 里面各种奇技淫巧，其中有一章讲解了fakeroot的实现，比我自己总结清晰很多，就拿来翻译一下试试。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;a name=&quot;_hack_57_使用fakeroot模拟root权限执行程序&quot;&gt;&lt;/a&gt;Hack #57: 使用fakeroot模拟root权限执行程序&lt;/h2&gt;
&lt;h3&gt;&lt;a name=&quot;_fakeroot是什么&quot;&gt;&lt;/a&gt;fakeroot是什么&lt;/h3&gt;
&lt;p&gt;例如Debian在生成package的时候，编译完之后，不能立刻在当前环境执行make install，需要执行make install DESTDIR=$(pwd)/debian/tmp把生成的文件安装到build目录的里面$(pwd)/debian/tmp。然后使用那个目录里面的全部内容生成Debian包（实际上包里面还会包含control和maintainer script等）。
这个包里面的文件所有者必须是root，所以需要以root来执行打包命令。但是应该避免在制作Debian包的时候使用root权限。
为了解决这个矛盾，fakeroot被开发出来了。在fakeroot环境中，操作文件就像使用root操作文件一样。但是，实际上系统中文件的权限还是原来的权限。&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;$ ls
foo
$ ls -l
total &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;
-rw-r--r-- &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; kghost staff &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; Feb &lt;font color=&quot;#993399&quot;&gt;11&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;14&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;17&lt;/font&gt; foo
$ fakeroot
&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;# id&lt;/font&gt;&lt;/i&gt;
&lt;font color=&quot;#009900&quot;&gt;uid&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;root&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;gid&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;root&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;groups&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;root&lt;font color=&quot;#990000&quot;&gt;),&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;50&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;staff&lt;font color=&quot;#990000&quot;&gt;),&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;100&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;users&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;# ls -l&lt;/font&gt;&lt;/i&gt;
total &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;
-rw-r--r-- &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; root root &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; Feb &lt;font color=&quot;#993399&quot;&gt;11&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;14&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;17&lt;/font&gt; foo
&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;# touch bar&lt;/font&gt;&lt;/i&gt;
&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;# ls -l&lt;/font&gt;&lt;/i&gt;
-rw-r--r-- &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; root root &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; Feb &lt;font color=&quot;#993399&quot;&gt;11&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;14&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;17&lt;/font&gt; bar
-rw-r--r-- &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; root root &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; Feb &lt;font color=&quot;#993399&quot;&gt;11&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;14&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;17&lt;/font&gt; foo
&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;# chown www-data:www-data foo&lt;/font&gt;&lt;/i&gt;
&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;# ls -l&lt;/font&gt;&lt;/i&gt;
total &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;
-rw-r--r-- &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; root     root     &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; Feb &lt;font color=&quot;#993399&quot;&gt;11&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;14&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;17&lt;/font&gt; bar
-rw-r--r-- &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; www-data www-data &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; Feb &lt;font color=&quot;#993399&quot;&gt;11&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;14&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;17&lt;/font&gt; foo
&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;# exit&lt;/font&gt;&lt;/i&gt;
$ ls -l
total &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;
-rw-r--r-- &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; kghost staff &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; Feb &lt;font color=&quot;#993399&quot;&gt;11&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;14&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;17&lt;/font&gt; bar
-rw-r--r-- &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; kghost staff &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt; Feb &lt;font color=&quot;#993399&quot;&gt;11&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;14&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;17&lt;/font&gt; foo&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;像这样执行fakeroot后会在fakeroot环境中启动一个shell。这个shell中就像拥有root权限一样。执行id(1)命令会提示为root，并且文件的所有者也会变成root。新生成的文件所有者也是root，还可以把现有文件的所有者改成其他人。
但是实际上变更的只反应在fakeroot环境内部。退出fakeroot环境后就能看到实际上的文件属性。
在制作Debian包的时候，需要使用root权限来执行某些命令。本来是应该使用sudo来运行这些命令的，但是通常情况下是使用fakeroot模拟root运行。&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;_fakeroot的实现&quot;&gt;&lt;/a&gt;fakeroot的实现&lt;/h3&gt;
&lt;p&gt;fakeroot仅仅是简单的shell script。简单来说fakeroot做下面的事情。
 * 启动faked，获取FAKEROOTKEY
 * 设置环境变量FAKEROOTKEY，LD_LIBRARY_PATH，LD_PRELOAD。执行命令（默认是shell）&lt;/p&gt;
&lt;p&gt;faked是管理虚拟的文件所有者，文件权限信息的守护进程。
在fakeroot中执行的命令会加载由LD_LIBRARY_PATH，LD_PRELOAD环境变量指定的一个动态链接库（/usr/lib/libfakeroot/libfakeroot-sysv.so）&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#009900&quot;&gt;LD_LIBRARY_PATH&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;/usr/lib/libfakeroot &lt;font color=&quot;#009900&quot;&gt;LD_PRELOAD&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt;libfakeroot-sysv&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;so&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;libfakeroot-sysv.so导出了以下函数&lt;/p&gt;
&lt;div&gt;
&lt;table class=&quot;table&quot;&gt;
&lt;caption&gt;&lt;b&gt;Table 1. &lt;/b&gt;test&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;getuid()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;geteuid()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;getguid()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;getegid()&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;mknod()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;chown()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;fchown()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;lchown()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;chmod()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;fchmod()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;mkdir()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;lstat()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;fstat()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;stat()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;unlink()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;remove()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;rmdir()&lt;/p&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot; width=&quot;25%&quot; valign=&quot;top&quot;&gt;&lt;p&gt;rename()&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;这些函数会使用FAKEROOTKEY与faked通讯，返回虚拟的所有者与权限信息。&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;_usr_lib_libfakeroot_sysv_so&quot;&gt;&lt;/a&gt;/usr/lib/libfakeroot-sysv.so&lt;/h3&gt;
&lt;p&gt;与faked通讯的库文件是/usr/lib/libfakeroot/libfakeroot-sysv.so，但是/usr/lib/libfakeroot-sysv.so也是存在的。这个文件是在fakeroot中运行suid程序所必须的。
fakeroot中会设定LD_LIBRARY_PATH环境变量。设定LD_LIBRARY_PATH后LD_PRELOAD就不需要是完整路径了。但是如果LD_PRELOAD不使用完整路径，suid的程序会忽略LD_LIBRARY_PATH而直接在/lib与/usr/lib中寻找LD_PRELOAD指定的库文件。如果LD_PRELOAD指定的文件没有找到这个suid的程序就会启动失败。所以会存在/usr/lib/libfakeroot-sysv.so这样一个suid的dummy库，在运行suid程序的时候通过LD_PRELOAD加载这个库，就跟没有加载任何东西一样，正常执行。
 * 普通的程序
        使用LD_LIBRARY_PATH=/usr/lib/libfakeroot LD_PRELOAD=libfakeroot-sysv.so，通过preload加载/usr/lib/libfakeroot/libfakeroot-sysv.so的与faked通讯
 * suid的程序
        无视LD_LIBRARY_PATH， 使用LD_PRELOAD=libfakeroot-sysv.so，通过preload加载/usr/lib/libfakeroot-sysv.so，因为这是一个dummy库，就与这个库不存在一样，程序正常执行。&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;_总结&quot;&gt;&lt;/a&gt;总结&lt;/h3&gt;
&lt;p&gt;例如Debian生成package这样，在必须使用root的时候，使用fakeroot模拟root权限。fakeroot使用libfakeroot-sysv.so库文件中的函数与faked通讯管理文件权限信息。&lt;/p&gt;
&lt;p&gt;&amp;#8212;&amp;#8201;Fumitoshi Ukai&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/02/11/%E4%BD%BF%E7%94%A8fakeroot%E6%A8%A1%E6%8B%9Froot%E6%9D%83%E9%99%90%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F/</link>
                <guid>http://blog.kghost.info/2011/02/11/使用fakeroot模拟root权限执行程序</guid>
                <pubDate>2011-02-11T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>用矩阵解概率问题</title>
                <description>&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
  MathJax.Hub.Config({
    tex2jax: {
      inlineMath: [ [&apos;$&apos;,&apos;$&apos;] ],
      processEscapes: true
    }
  });
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML&quot;&gt;
&lt;/script&gt;
&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;p&gt;在做topcoder的时候, 遇到了一个 &lt;a href=&quot;http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10744&quot;&gt;很有趣的问题&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;问题描述是这样的:
有n种不同的糖果,分成n堆,每种一堆,每堆C个. 从这n*C个糖果中随机选出两个交换, 交换S次后, 每堆糖果中各种糖果出现的概率是多少. 假设每种糖果的价值是 $ Value_{i} $ , 那么每堆糖果中任意一个糖果的价值期望是多少.&lt;/p&gt;
&lt;p&gt;我们使用矩阵P描述每种糖果在每堆中的概率, 那么P[i][j]表示第i种糖果在第j堆中的出现概率. 开始的时候第i堆只有第i种糖果, 表示成矩阵就是&lt;/p&gt;
&lt;p&gt;$ \begin{bmatrix} 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 \end{bmatrix} $&lt;/p&gt;
&lt;p&gt;每个交换操作都使用乘以相应的变换矩阵表示, 比如交换第i堆与第j堆中的一个糖果, 就是把第i堆的 $ 1 \over C $ 移动到第j堆, 反过来第j堆的 $ 1 \over C $ 移动到第i堆, 所以变换矩阵如下:&lt;/p&gt;
&lt;p&gt;$
\begin{bmatrix}
 1 &amp;amp; &amp;amp;i &amp;amp; &amp;amp;j &amp;amp; &amp;amp; \\
 &amp;amp;\ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\
i &amp;amp; &amp;amp;C - 1 \over C &amp;amp;\cdots &amp;amp;1 \over C &amp;amp; &amp;amp; \\
 &amp;amp; &amp;amp;\vdots &amp;amp;\ddots &amp;amp;\vdots &amp;amp; &amp;amp; \\
j &amp;amp; &amp;amp;1 \over C &amp;amp;\cdots &amp;amp;C - 1 \over C &amp;amp; &amp;amp; \\
 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp;\ddots &amp;amp; \\
 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp;1
\end{bmatrix}
$&lt;/p&gt;
&lt;p&gt;然后找到所有变换矩阵(一共 $ n*(n-1) \over 2 $ 个), 并且乘以他们被使用的概率( $C*C \over nC*(nC-1)/2$ ), 累加起来&lt;/p&gt;
&lt;p&gt;$\sum_{0 &amp;lt;= i &amp;lt; j &amp;lt; n}^{ }
\begin{bmatrix}
 1 &amp;amp; &amp;amp;i &amp;amp; &amp;amp;j &amp;amp; &amp;amp; \\
 &amp;amp;\ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\
i &amp;amp; &amp;amp;C - 1 \over C &amp;amp;\cdots &amp;amp;1 \over C &amp;amp; &amp;amp; \\
 &amp;amp; &amp;amp;\vdots &amp;amp;\ddots &amp;amp;\vdots &amp;amp; &amp;amp; \\
j &amp;amp; &amp;amp;1 \over C &amp;amp;\cdots &amp;amp;C - 1 \over C &amp;amp; &amp;amp; \\
 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp;\ddots &amp;amp; \\
 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp;1
\end{bmatrix} * {C*C \over nC*(nC-1)/2}
\Rightarrow A
$&lt;/p&gt;
&lt;p&gt;最后加上交换的两个糖果来自同一堆的变换矩阵乘以来自同一堆的概率($C-1 \over n*C - 1$)&lt;/p&gt;
&lt;p&gt;$\begin{bmatrix}
1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\
 &amp;amp;1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\
 &amp;amp; &amp;amp;1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\
 &amp;amp; &amp;amp; &amp;amp;\ddots &amp;amp; &amp;amp; &amp;amp; \\
 &amp;amp; &amp;amp; &amp;amp; &amp;amp;1 &amp;amp; &amp;amp; \\
 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp;1 &amp;amp; \\
 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp;1
\end{bmatrix} * {C-1 \over n*C - 1}
\Rightarrow B$&lt;/p&gt;
&lt;p&gt;这样就得到了一次交换的变换矩阵.
因为需要做S次交换, 所以要计算这个变换矩阵的S次方, 这样就得到了变换结果的概率矩阵.&lt;/p&gt;
&lt;p&gt;$ {(A + B)}^{S} \Rightarrow P$&lt;/p&gt;
&lt;p&gt;最后价值期望就是乘以价值矩阵&lt;/p&gt;
&lt;p&gt;$
\begin{bmatrix}
Value_{1} &amp;amp; \cdots  &amp;amp; Value_{n}
\end{bmatrix}
* P$&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#008080&quot;&gt;class&lt;/font&gt; CandyBox &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#008080&quot;&gt;public:&lt;/font&gt;&lt;/b&gt;
        vector &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;expectedScore&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; vector &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;&amp;gt;,&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;#define&lt;/font&gt;&lt;/b&gt; N &lt;font color=&quot;#993399&quot;&gt;50&lt;/font&gt;
&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; m1&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;
&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;
&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; m3&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;

&lt;font color=&quot;#009900&quot;&gt;void&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_times&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; result&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;],&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        result&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;*=&lt;/font&gt; c&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

&lt;font color=&quot;#009900&quot;&gt;void&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_plus&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; result&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;],&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; m&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;])&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        result&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; m&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

&lt;font color=&quot;#009900&quot;&gt;void&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_mul&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; result&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;],&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; m1&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;],&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt; m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;N&lt;font color=&quot;#990000&quot;&gt;])&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        result&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; k &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; k &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                                result&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+=&lt;/font&gt; m1&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;*&lt;/font&gt; m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;k&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

vector &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; CandyBox&lt;font color=&quot;#990000&quot;&gt;::&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;expectedScore&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; C&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; vector &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;&amp;gt;&lt;/font&gt; score&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; S&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
        n &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; score&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;size&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;();&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        m1&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        m3&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;?&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; x &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; x &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;x&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; y &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; y &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;y&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;x &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt; y &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                                                m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;x&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;y&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1.0&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;x &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt; y &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                                                m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;x&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;y&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;x &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt; y &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                                                m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;x&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;y&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;x &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;amp;&amp;amp;&lt;/font&gt; y &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                                                m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;x&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;y&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1.0&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;/&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;x &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; y&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                                                m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;x&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;y&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                                        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;else&lt;/font&gt;&lt;/b&gt;
                                                m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;x&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;y&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
                        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
                        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_plus&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;m1&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; m2&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
                &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_times&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;m1&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;2.0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;*&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;*&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;/((&lt;/font&gt;n&lt;font color=&quot;#990000&quot;&gt;*&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;)*(&lt;/font&gt;n&lt;font color=&quot;#990000&quot;&gt;*&lt;/font&gt;C &lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)));&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_times&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;m3&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;((&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)(&lt;/font&gt;C&lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;))/(&lt;/font&gt;n&lt;font color=&quot;#990000&quot;&gt;*&lt;/font&gt;C &lt;font color=&quot;#990000&quot;&gt;-&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)),&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_plus&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;m1&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; m3&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;

        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        m3&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;==&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;?&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; S&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_mul&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;m2&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; m3&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; m1&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;memcpy&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;m3&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; m2&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;sizeof&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;m2&lt;font color=&quot;#990000&quot;&gt;));&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;

        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; score&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;];&lt;/font&gt;
        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; i &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; j &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;++&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
                        m2&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#990000&quot;&gt;][&lt;/font&gt;j&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;

        &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_mul&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;m1&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; m2&lt;font color=&quot;#990000&quot;&gt;,&lt;/font&gt; m3&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;

        &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt;&lt;/b&gt; vector&lt;font color=&quot;#990000&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;double&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;&amp;gt;(&lt;/font&gt;m1&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;],&lt;/font&gt; m1&lt;font color=&quot;#990000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;+&lt;/font&gt; n&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;后记： 其实算法还有很多可以优化的地方&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;
&lt;p&gt;
一次变换的矩阵可以直接用公式算出来，是一个对角阵，主对角线上的元素相同，其他元素相同，所以只需要用一个pair&amp;lt;double, double&amp;gt;就可以存下来了
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
求一个对角阵的S次方，结果还是一个对角阵。
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
总时间复杂度可以优化到O(S*n)，空间复杂度O(1)
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/01/05/%E7%94%A8%E7%9F%A9%E9%98%B5%E8%A7%A3%E6%A6%82%E7%8E%87%E9%97%AE%E9%A2%98/</link>
                <guid>http://blog.kghost.info/2011/01/05/用矩阵解概率问题</guid>
                <pubDate>2011-01-05T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>用scheme实现lambda-calculus</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;a name=&quot;preamble&quot;&gt;&lt;/a&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Church_numeral&quot;&gt;church number&lt;/a&gt; 里面 &lt;a href=&quot;http://en.wikipedia.org/wiki/Church_numeral#Computation_with_Church_numerals&quot;&gt;pred&lt;/a&gt; 实在让人看得头痛， 用scheme实现一下，立刻变得容易理解了（真的容易理解么？！)&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;define&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;pred&lt;/font&gt;&lt;/b&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;n&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;f&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;x&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
        &lt;font color=&quot;#FF0000&quot;&gt;(((&lt;/font&gt;n &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;g&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
               &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;h&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
                 &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;h &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;g f&lt;font color=&quot;#FF0000&quot;&gt;)))))&lt;/font&gt;
          &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;u&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt; x&lt;font color=&quot;#FF0000&quot;&gt;))&lt;/font&gt;
         &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;u&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt; u&lt;font color=&quot;#FF0000&quot;&gt;))))))&lt;/font&gt;

&lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;define&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;church&lt;/font&gt;&lt;/b&gt; n&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;f&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
    &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;x&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
      &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;= n &lt;font color=&quot;#993399&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
        x
        &lt;font color=&quot;#FF0000&quot;&gt;(((&lt;/font&gt;church &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#993399&quot;&gt;1&lt;/font&gt;- n&lt;font color=&quot;#FF0000&quot;&gt;))&lt;/font&gt; f&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;f x&lt;font color=&quot;#FF0000&quot;&gt;))))))&lt;/font&gt;

&lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;write `&lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;f&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
             &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;x&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;
                   ,&lt;font color=&quot;#FF0000&quot;&gt;(((&lt;/font&gt;pred &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;church &lt;font color=&quot;#993399&quot;&gt;5&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;))&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;x&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;list &apos;f x&lt;font color=&quot;#FF0000&quot;&gt;)))&lt;/font&gt; &apos;x&lt;font color=&quot;#FF0000&quot;&gt;))))&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;在guile里面跑了一下，效果不错，结果是&lt;/p&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;f&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;lambda&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;x&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;f &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;f &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;f &lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;f x&lt;font color=&quot;#FF0000&quot;&gt;))))))&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;正好是church number 4&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/01/04/%E7%94%A8scheme%E5%AE%9E%E7%8E%B0lambda-calculus/</link>
                <guid>http://blog.kghost.info/2011/01/04/用scheme实现lambda-calculus</guid>
                <pubDate>2011-01-04T00:00:00+08:00</pubDate>
        </item>

        <item>
                <title>Hello World</title>
                <description>&lt;div id=&quot;content&quot; style=&quot;color: #484848; font-family: &apos;Trebuchet MS&apos;, Helvetica, sans-serif&quot;&gt;

&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;_scheme&quot;&gt;&lt;/a&gt;Scheme&lt;/h2&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;font color=&quot;#FF0000&quot;&gt;(&lt;/font&gt;write &lt;font color=&quot;#FF0000&quot;&gt;&quot;Hello World !&quot;&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;)&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_c&quot;&gt;&lt;/a&gt;C&lt;/h2&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;#include&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;

&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;main&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;void&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;printf&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Hello world&lt;/font&gt;&lt;font color=&quot;#CC33CC&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_c_2&quot;&gt;&lt;/a&gt;C++&lt;/h2&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#000080&quot;&gt;#include&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#FF0000&quot;&gt;&amp;lt;iostream&amp;gt;&lt;/font&gt;

&lt;font color=&quot;#009900&quot;&gt;int&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;main&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;()&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  std&lt;font color=&quot;#990000&quot;&gt;::&lt;/font&gt;cout &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;&quot;Hello World!&quot;&lt;/font&gt; &lt;font color=&quot;#990000&quot;&gt;&amp;lt;&amp;lt;&lt;/font&gt; std&lt;font color=&quot;#990000&quot;&gt;::&lt;/font&gt;endl&lt;font color=&quot;#990000&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_java&quot;&gt;&lt;/a&gt;Java&lt;/h2&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#008080&quot;&gt;HelloWorld&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;&lt;i&gt;&lt;font color=&quot;#9A1900&quot;&gt;//this file MUST have a name &quot;HelloWorld.java&quot;&lt;/font&gt;&lt;/i&gt;
   &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;static&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#009900&quot;&gt;void&lt;/font&gt; &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;main&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;String&lt;font color=&quot;#990000&quot;&gt;[]&lt;/font&gt; args&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
       System&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;out&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Hello world!&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;
   &lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_javascriopt&quot;&gt;&lt;/a&gt;Javascriopt&lt;/h2&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;document&lt;font color=&quot;#990000&quot;&gt;.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;write&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&apos;Hello world!&apos;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;);&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h2&gt;&lt;a name=&quot;_scala&quot;&gt;&lt;/a&gt;Scala&lt;/h2&gt;
&lt;table border=&quot;0&quot; bgcolor=&quot;#e8e8e8&quot; width=&quot;100%&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;object&lt;/font&gt;&lt;/b&gt; HelloWorld &lt;b&gt;&lt;font color=&quot;#0000FF&quot;&gt;extends&lt;/font&gt;&lt;/b&gt; Application &lt;font color=&quot;#FF0000&quot;&gt;{&lt;/font&gt;
  &lt;b&gt;&lt;font color=&quot;#000000&quot;&gt;println&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#990000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&quot;Hello world!&quot;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;)&lt;/font&gt;
&lt;font color=&quot;#FF0000&quot;&gt;}&lt;/font&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;&lt;hr&gt;&lt;/div&gt;
</description>
                <link>http://blog.kghost.info/2011/01/03/hello-world/</link>
                <guid>http://blog.kghost.info/2011/01/03/hello-world</guid>
                <pubDate>2011-01-03T00:00:00+08:00</pubDate>
        </item>


</channel>
</rss>
