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

<channel>
	<title>Fleurer.Lee</title>
	<atom:link href="http://www.fleurer-lee.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fleurer-lee.com</link>
	<description>.........................................................................</description>
	<lastBuildDate>Wed, 21 Jul 2010 05:46:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>抽象代数与计算-Monoid</title>
		<link>http://www.fleurer-lee.com/2010/07/20/%e6%8a%bd%e8%b1%a1%e4%bb%a3%e6%95%b0%e4%b8%8e%e8%ae%a1%e7%ae%97-monoid/</link>
		<comments>http://www.fleurer-lee.com/2010/07/20/%e6%8a%bd%e8%b1%a1%e4%bb%a3%e6%95%b0%e4%b8%8e%e8%ae%a1%e7%ae%97-monoid/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 04:14:15 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[翻译]]></category>
		<category><![CDATA[Algbera]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[Monoid]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645910</guid>
		<description><![CDATA[作者：Mark C. Chu-Carroll
翻译：Fleurer
原文：http://scienceblogs.com/goodmath/2008/02/abstract_algebra_and_computati.php
在前两篇post，我们以范畴的角度观察了群论。范畴论给了我们一个全新的视角来理解对偶。与传统代数不同，范畴论的对偶是从groupoid中出现的，而群则被视为是带对偶的更简单的结构。
看其它的代数结构也是同样。比如环（rings），换个视角，也可以见到一个大不相同的环。
在看范畴论下的环之前，我们不妨先看个简单点的结构。在范畴中，环是通过monoid表示的。不过Monoid绝不仅仅只是环前面的开胃菜，它本身就是好东西。
它们的魅力在什么地方？首先，它们是范畴和代数之间的一座桥梁。我们知道，范畴中的groupoid（广群）使得群论无缝地归入了范畴论。Monoid也可以同样：它们也有范畴中的等价物。而且，Monoid还有地地道道的实际应用——你可以用Monoid表示计算。而且也许不广为人知，计算机科学中很多得力的基础工具其实都是Monoid。
我们先用代数的视角看下，呆会再换到范畴视角。在抽象代数中，Monoid正好跟复合函数的思想一致。开窍了吧，范畴论的基本思路就是复合函数的抽象化！
Monoid跟群类似，是一组支持二元运算的值的集合。Monoid更简单——它只要组合，不要逆元。我们令Monoid里面值的集合为M，二元运算为º，就有三条性质：
1.	封闭性（Closure）: ∀a,m∈M: aºb ∈ M
2.	单位元（Identity）: ∃ i∈M : ∀f∈M : iºf = fºi = f.
3.	结合律（Associativity）: ∀ a,b,c∈M: (aºb)ºc = aº(bºc).
这就是了。有这几条性质，想想函数和复合函数，套进去就满靠谱了。这对大多数函数都适用，于是所有的函数都成了对象，比如定义域和值域都是自然数的函数。封闭性要求两个简单完全函数复合的结果依然是简单完全函数；单位元可以是一个函数f(x)=x；交换律是交换表达式中元素的顺序，不影响最终结果。这都是复合函数天生的性质。
如果拿monoid像群一样，给它加一个操作又会怎样？答案对我们学计科的同学再熟悉不过了：有限自动机！
取一个monoid，(M,º)。我们可以在集合S上定义这monoid的一个操作，也就是：*:M×S→S，取M的一个值和S的一个值，得S的一个值。这个monoid操作显示了两条性质——都是来自monoid。
1.	Identity: ∀s∈S, i*s=s.
2.	Associativity: ∀a,b∈M, ∀s∈S: a*(b*s) = (aºb)*s.
这意味着什么？意味着我们给这个monoid加上了函数应用。这个monoid操作就是M中函数的应用。
这样，有了一个组可组合的函数，一个可以应用到函数的特定集合。可以得到什么？
一台自动机——也就是一种数学上的计算模型。
这个自动机是怎么出来的？
在这个monoid操作里，monoid的每个成员都是函数，也就是值到值的映射；组合符将这些函数链到一起。对自动机来说，monoid中的每个成员都是计算中的一个步骤，组合符将这些步骤连续起来。这还不是完整的计算——但已经靠一个简单的形式，前进了一大步。
多想想。还记得lambda演算？它就是一个表示计算的逻辑工具，里面除了函数什么都没有。想到了吧，我们刚刚只是重新发明了lambda演算的一部分，以抽象代数的思路。
在以后的post里面我会多讲些——不过我得先给你过上一遍，在范畴论里面这些东西都是什么样子——下一步往哪走，在范畴的大陆上清晰无比。
]]></description>
			<content:encoded><![CDATA[<p>作者：Mark C. Chu-Carroll<br />
翻译：Fleurer<br />
原文：<a href="http://scienceblogs.com/goodmath/2008/02/abstract_algebra_and_computati.php">http://scienceblogs.com/goodmath/2008/02/abstract_algebra_and_computati.php</a></p>
<p>在前两篇post，我们以范畴的角度观察了群论。范畴论给了我们一个全新的视角来理解对偶。与传统代数不同，范畴论的对偶是从groupoid中出现的，而群则被视为是带对偶的更简单的结构。</p>
<p>看其它的代数结构也是同样。比如环（rings），换个视角，也可以见到一个大不相同的环。</p>
<p>在看范畴论下的环之前，我们不妨先看个简单点的结构。在范畴中，环是通过monoid表示的。不过Monoid绝不仅仅只是环前面的开胃菜，它本身就是好东西。</p>
<p>它们的魅力在什么地方？首先，它们是范畴和代数之间的一座桥梁。我们知道，范畴中的groupoid（广群）使得群论无缝地归入了范畴论。Monoid也可以同样：它们也有范畴中的等价物。而且，Monoid还有地地道道的实际应用——你可以用Monoid表示计算。而且也许不广为人知，计算机科学中很多得力的基础工具其实都是Monoid。</p>
<p>我们先用代数的视角看下，呆会再换到范畴视角。在抽象代数中，Monoid正好跟复合函数的思想一致。开窍了吧，范畴论的基本思路就是复合函数的抽象化！</p>
<p>Monoid跟群类似，是一组支持二元运算的值的集合。Monoid更简单——它只要组合，不要逆元。我们令Monoid里面值的集合为M，二元运算为º，就有三条性质：</p>
<p>1.	封闭性（Closure）: ∀a,m∈M: aºb ∈ M<br />
2.	单位元（Identity）: ∃ i∈M : ∀f∈M : iºf = fºi = f.<br />
3.	结合律（Associativity）: ∀ a,b,c∈M: (aºb)ºc = aº(bºc).</p>
<p>这就是了。有这几条性质，想想函数和复合函数，套进去就满靠谱了。这对大多数函数都适用，于是所有的函数都成了对象，比如定义域和值域都是自然数的函数。封闭性要求两个简单完全函数复合的结果依然是简单完全函数；单位元可以是一个函数f(x)=x；交换律是交换表达式中元素的顺序，不影响最终结果。这都是复合函数天生的性质。</p>
<p>如果拿monoid像群一样，给它加一个操作又会怎样？答案对我们学计科的同学再熟悉不过了：有限自动机！</p>
<p>取一个monoid，(M,º)。我们可以在集合S上定义这monoid的一个操作，也就是：*:M×S→S，取M的一个值和S的一个值，得S的一个值。这个monoid操作显示了两条性质——都是来自monoid。</p>
<p>1.	Identity: ∀s∈S, i*s=s.<br />
2.	Associativity: ∀a,b∈M, ∀s∈S: a*(b*s) = (aºb)*s.</p>
<p>这意味着什么？意味着我们给这个monoid加上了函数应用。这个monoid操作就是M中函数的应用。</p>
<p>这样，有了一个组可组合的函数，一个可以应用到函数的特定集合。可以得到什么？</p>
<p>一台自动机——也就是一种数学上的计算模型。</p>
<p>这个自动机是怎么出来的？</p>
<p>在这个monoid操作里，monoid的每个成员都是函数，也就是值到值的映射；组合符将这些函数链到一起。对自动机来说，monoid中的每个成员都是计算中的一个步骤，组合符将这些步骤连续起来。这还不是完整的计算——但已经靠一个简单的形式，前进了一大步。</p>
<p>多想想。还记得lambda演算？它就是一个表示计算的逻辑工具，里面除了函数什么都没有。想到了吧，我们刚刚只是重新发明了lambda演算的一部分，以抽象代数的思路。</p>
<p>在以后的post里面我会多讲些——不过我得先给你过上一遍，在范畴论里面这些东西都是什么样子——下一步往哪走，在范畴的大陆上清晰无比。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/07/20/%e6%8a%bd%e8%b1%a1%e4%bb%a3%e6%95%b0%e4%b8%8e%e8%ae%a1%e7%ae%97-monoid/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>数据结构课设，表达式计算</title>
		<link>http://www.fleurer-lee.com/2010/06/30/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e8%af%be%e8%ae%be%ef%bc%8c%e8%a1%a8%e8%be%be%e5%bc%8f%e8%ae%a1%e7%ae%97/</link>
		<comments>http://www.fleurer-lee.com/2010/06/30/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e8%af%be%e8%ae%be%ef%bc%8c%e8%a1%a8%e8%be%be%e5%bc%8f%e8%ae%a1%e7%ae%97/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 11:28:34 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[备忘]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645901</guid>
		<description><![CDATA[随便写了下，没仔细调试。
大约这么定义
double parse_expr(char *input, char **output);
input就是表达式的字符串，output是解析剩下的部分。如果output==input，就是解析失败。如果正确，返回运算结果。
用起来大约这样

    char *out, *exp=&#34;2+(1+3)*4&#34;;
    double r = parse_expr&#40;exp, &#38;out&#41;;
    if &#40;out==exp&#41;&#123;
        printf&#40;&#34;parse fail\n&#34;&#41;;
        return 0;
    &#125;
    printf&#40;&#34;%s =&#62; %f \n&#34;, exp, r&#41;;

回头想下，思路跟以前写的parser几乎是葫芦画瓢，也该算是递归下降吧。
代码如下
exp.h

double [...]]]></description>
			<content:encoded><![CDATA[<p>随便写了下，没仔细调试。</p>
<p>大约这么定义<br />
double parse_expr(char *input, char **output);</p>
<p>input就是表达式的字符串，output是解析剩下的部分。如果output==input，就是解析失败。如果正确，返回运算结果。</p>
<p>用起来大约这样</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>out<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>exp<span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;2+(1+3)*4&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">double</span> r <span style="color: #339933;">=</span> parse_expr<span style="color: #009900;">&#40;</span>exp<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>out<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>out<span style="color: #339933;">==</span>exp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;parse fail<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s =&gt; %f <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> exp<span style="color: #339933;">,</span> r<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>回头想下，思路跟<a href="http://github.com/Fleurer/FParser">以前写的parser</a>几乎是葫芦画瓢，也该算是递归下降吧。</p>
<p>代码如下</p>
<p>exp.h</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">double</span> parse_expr<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>input<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">double</span> parse_term<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>input<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">double</span> parse_fact<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>input<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">double</span> parse_numb<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>input<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>exp.c</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;exp.h&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// expr ::= term {[+-] term}</span>
<span style="color: #993333;">double</span> parse_expr<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>input<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>output<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">double</span> r<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>tmp<span style="color: #339933;">,</span> op<span style="color: #339933;">;</span>
    tmp <span style="color: #339933;">=</span> input<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// factor</span>
    r <span style="color: #339933;">=</span> parse_term<span style="color: #009900;">&#40;</span>tmp<span style="color: #339933;">,</span> output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>output<span style="color: #339933;">==</span>tmp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// {[+-] term}</span>
    tmp <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>output<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>op<span style="color: #339933;">=*</span>tmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span><span style="color: #ff0000;">'+'</span> <span style="color: #339933;">||</span> op<span style="color: #339933;">==</span><span style="color: #ff0000;">'-'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">double</span> r2 <span style="color: #339933;">=</span> parse_term<span style="color: #009900;">&#40;</span><span style="color: #339933;">++</span>tmp<span style="color: #339933;">,</span> output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>tmp<span style="color: #339933;">==*</span>output<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #339933;">*</span>output <span style="color: #339933;">=</span> input<span style="color: #339933;">;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        r <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>op<span style="color: #339933;">==</span><span style="color: #ff0000;">'+'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span> r<span style="color: #339933;">+</span>r2<span style="color: #339933;">:</span> r<span style="color: #339933;">-</span>r2<span style="color: #339933;">;</span>
        tmp <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>output<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> r<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// term ::= factor {[*/] factor}</span>
<span style="color: #993333;">double</span> parse_term<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>input<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>output<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">double</span> r<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>tmp<span style="color: #339933;">,</span> op<span style="color: #339933;">;</span>
    tmp <span style="color: #339933;">=</span> input<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// factor</span>
    r <span style="color: #339933;">=</span> parse_fact<span style="color: #009900;">&#40;</span>tmp<span style="color: #339933;">,</span> output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>output<span style="color: #339933;">==</span>tmp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// {[*/] factor}</span>
    tmp <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>output<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>op<span style="color: #339933;">=*</span>tmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span><span style="color: #ff0000;">'*'</span> <span style="color: #339933;">||</span> op<span style="color: #339933;">==</span><span style="color: #ff0000;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">double</span> r2 <span style="color: #339933;">=</span> parse_fact<span style="color: #009900;">&#40;</span><span style="color: #339933;">++</span>tmp<span style="color: #339933;">,</span> output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>tmp<span style="color: #339933;">==*</span>output<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #339933;">*</span>output <span style="color: #339933;">=</span> input<span style="color: #339933;">;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        r <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>op<span style="color: #339933;">==</span><span style="color: #ff0000;">'*'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span> r<span style="color: #339933;">*</span>r2<span style="color: #339933;">:</span> r<span style="color: #339933;">/</span>r2<span style="color: #339933;">;</span>
        tmp <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>output<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> r<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// fact ::= (expr) | numb</span>
<span style="color: #993333;">double</span> parse_fact<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>input<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>output<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">double</span> r<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>tmp<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// (expr)</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>input<span style="color: #339933;">==</span><span style="color: #ff0000;">'('</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        tmp <span style="color: #339933;">=</span> input<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        r <span style="color: #339933;">=</span> parse_expr<span style="color: #009900;">&#40;</span>tmp<span style="color: #339933;">,</span> output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">**</span>output<span style="color: #339933;">==</span><span style="color: #ff0000;">')'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>output<span style="color: #009900;">&#41;</span><span style="color: #339933;">++;</span>
            <span style="color: #b1b100;">return</span> r<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #666666; font-style: italic;">// if fail, output == input</span>
        <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #339933;">*</span>output <span style="color: #339933;">=</span> input<span style="color: #339933;">;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// numb</span>
    r <span style="color: #339933;">=</span> parse_numb<span style="color: #009900;">&#40;</span>input<span style="color: #339933;">,</span> output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> r<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">double</span> parse_numb<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>input<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>output<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">double</span>  r <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>tmp<span style="color: #339933;">=</span>input<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>tmp<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;=</span><span style="color: #ff0000;">'0'</span> <span style="color: #339933;">&amp;&amp;</span> ch<span style="color: #339933;">&lt;=</span><span style="color: #ff0000;">'9'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        r <span style="color: #339933;">=</span> r<span style="color: #339933;">*</span><span style="color: #0000dd;">10</span><span style="color: #339933;">+</span>ch<span style="color: #339933;">-</span><span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">*</span>output <span style="color: #339933;">=</span> tmp<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> r<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>main.c</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">double</span> r<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>out<span style="color: #339933;">,</span> exp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1024</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%256s&quot;</span><span style="color: #339933;">,</span> exp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    r <span style="color: #339933;">=</span> parse_expr<span style="color: #009900;">&#40;</span>exp<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>out<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>out<span style="color: #339933;">==</span>exp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;parse fail<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s =&gt; %f <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> exp<span style="color: #339933;">,</span> r<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/06/30/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e8%af%be%e8%ae%be%ef%bc%8c%e8%a1%a8%e8%be%be%e5%bc%8f%e8%ae%a1%e7%ae%97/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>无题</title>
		<link>http://www.fleurer-lee.com/2010/06/28/%e6%97%a0%e9%a2%98/</link>
		<comments>http://www.fleurer-lee.com/2010/06/28/%e6%97%a0%e9%a2%98/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 18:33:12 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[杂碎]]></category>
		<category><![CDATA[随感]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645890</guid>
		<description><![CDATA[经常踩大街。一人出去走到哪儿是哪儿，半阴不晴的鬼天气，没有店牌的店面们没精打采的耸拉着横幅，各种喇叭不甚自信地喊着各种优惠，摆摊的人们逛街的人们钻下水道的人们上学放学的人们熙熙攘攘的人们。地方就这么大，变的都是人。
学校里各种活动&#8230;社团每年的份额。辩论赛，书画比赛，考研，考试，奖学金等等，人们总有的忙。推特上的民主人士无限精力地bs着这个当权派，新华网上依旧按部就班的各种无耻新闻。豆瓣的人们为中医是不是科学争个面红耳赤。0bug老师升级为0(7)老师然后关博。脑残不休圣战不止的圣战悄无声息地不见了声势。人们总有的忙。我呢。
目的这东西，在我意识到它不见的时候，却发现已如背叛你的一切，早已无处可寻。若是空虚得紧，就是什么函数式什么内核也无济于事。“不过走下去自然有路。”我这么安慰自己，甚至不知道自己信还是不信。“走下去自然有路。”如此，走遍了这座小城。走过了曾经不减肥的五月和这个徒伤悲的六月。
&#8212;-
昨晚在大路兄宿舍阳台上，看楼下的辅导员和警车。第二天封楼。
“咱们学校倒也还不错的。”
“建设的很好，不过上面是一群官僚。”
对付学生，上面经验的很。扣下学生一张证件，若哪个宿舍有酒瓶暖瓶之类的杂物掉下，楼下的辅导员定位出来就扣下整个宿舍的证件。也得警车来来回回威慑，要诀就是防患于未然，要是学生都闹起来扣毕业证就不好使了。
保卫科的小面包上面放一个小灯，跟警车一起来来回回的转。辅导员不停地拍着蚊子。身在这个官僚体系最底层的人们如此兢兢业业&#8230;真是个神奇的世界。
过两个月，迎接新生又会是什么图景！
我就想，我们认认真真生活的这个世界，又有多少是别人认认真真装出来的？
这可是四年的地方，谁舍得。
&#8212;-
没找着某佳的宿舍，给某鹏和飞哥打电话也没通。突然就难过的很，这些人说不见就不见了不成！
过会儿飞哥打电话回来，刚才在收拾东西。还好还好，还能打个电话。
有段时间飞哥忙着写书，经常能见面，见面就去北门吃饭。“在餐厅吃也方便，不过得多走走。”飞哥，zneil等等几人一伙，必点西红柿炒鸡蛋。
有次回来飞哥问喜不喜欢看水浒。“我最佩服林冲，太能忍了。当年统领八十万禁军啊&#8230;光忍不行，也得能怒，你看风雪山神庙&#8230;这就是大侠！”
这人混过学生会，干过程序，写过书，考过研，搞过机器人。说不累是假的。
去年一个莫名其妙的饭局上，发现飞哥不见了。出来找，见他一人在外面。“我爸刚才给我电话，没敢接怕他听出来喝酒。。。走，出去透口气。”
问我“你有什么打算？”
不知道&#8230;不考研反正&#8230;不敢想以后&#8230;
然后坐在马路牙子上，吐酸水。“你知道我为什么理平头？掉头发。前几天去拿药，医生说我胃分泌的有点乱。。”
“千千万万在大四前解决感情问题。。做这机器人耽误了暑假的两个月，考研的黄金时期。。”
一会儿回去，仍是同样的谈笑风生，跟社会上的那帮人闹的不亦乐乎，整个桌子依然围着他转。你保准看不出一丝破绽。
。。。
如今能说的只剩下保重，后会有期。
&#8212;&#8211;
把zneil叫出来吃饭，这人神奇的课表剩下整整一年完全没课，再没考研的打算，整个人都宅了。
这帮混蛋整的都是什么事情！不甘心&#8230;可我们有什么办法？No body cares，所以认真你就输了。
无能为力，这就叫一败涂地。
还是老老实实的，搞好自己吧。
&#8212;&#8211;
《了不起的盖茨比》里面印象最深的是这么一段：
“他们都是一帮混蛋，”我隔着草坪喊道：“把他们加在一起都比不上你！”
我后来一直很高兴我说了那句话。那是我对他说过的唯一一句恭维话。因为我自始至终都不认同他。
&#8212;&#8211;
“干死英格兰！”
对面楼上喊，不过灯已经黑了一半。辅导员应该结束了几天的辛苦，可以睡个安稳觉了。
他们会在什么地方看球！
]]></description>
			<content:encoded><![CDATA[<p>经常踩大街。一人出去走到哪儿是哪儿，半阴不晴的鬼天气，没有店牌的店面们没精打采的耸拉着横幅，各种喇叭不甚自信地喊着各种优惠，摆摊的人们逛街的人们钻下水道的人们上学放学的人们熙熙攘攘的人们。地方就这么大，变的都是人。</p>
<p>学校里各种活动&#8230;社团每年的份额。辩论赛，书画比赛，考研，考试，奖学金等等，人们总有的忙。推特上的民主人士无限精力地bs着这个当权派，新华网上依旧按部就班的各种无耻新闻。豆瓣的人们为中医是不是科学争个面红耳赤。0bug老师升级为0(7)老师然后关博。脑残不休圣战不止的圣战悄无声息地不见了声势。人们总有的忙。我呢。</p>
<p>目的这东西，在我意识到它不见的时候，却发现已如背叛你的一切，早已无处可寻。若是空虚得紧，就是什么函数式什么内核也无济于事。“不过走下去自然有路。”我这么安慰自己，甚至不知道自己信还是不信。“走下去自然有路。”如此，走遍了这座小城。走过了曾经不减肥的五月和这个徒伤悲的六月。</p>
<p>&#8212;-</p>
<p>昨晚在大路兄宿舍阳台上，看楼下的辅导员和警车。第二天封楼。</p>
<p>“咱们学校倒也还不错的。”<br />
“建设的很好，不过上面是一群官僚。”</p>
<p>对付学生，上面经验的很。扣下学生一张证件，若哪个宿舍有酒瓶暖瓶之类的杂物掉下，楼下的辅导员定位出来就扣下整个宿舍的证件。也得警车来来回回威慑，要诀就是防患于未然，要是学生都闹起来扣毕业证就不好使了。</p>
<p>保卫科的小面包上面放一个小灯，跟警车一起来来回回的转。辅导员不停地拍着蚊子。身在这个官僚体系最底层的人们如此兢兢业业&#8230;真是个神奇的世界。</p>
<p>过两个月，迎接新生又会是什么图景！</p>
<p>我就想，我们认认真真生活的这个世界，又有多少是别人认认真真装出来的？</p>
<p>这可是四年的地方，谁舍得。</p>
<p>&#8212;-</p>
<p>没找着某佳的宿舍，给某鹏和飞哥打电话也没通。突然就难过的很，这些人说不见就不见了不成！</p>
<p>过会儿飞哥打电话回来，刚才在收拾东西。还好还好，还能打个电话。</p>
<p>有段时间飞哥忙着写书，经常能见面，见面就去北门吃饭。“在餐厅吃也方便，不过得多走走。”飞哥，zneil等等几人一伙，必点西红柿炒鸡蛋。</p>
<p>有次回来飞哥问喜不喜欢看水浒。“我最佩服林冲，太能忍了。当年统领八十万禁军啊&#8230;光忍不行，也得能怒，你看风雪山神庙&#8230;这就是大侠！”</p>
<p>这人混过学生会，干过程序，写过书，考过研，搞过机器人。说不累是假的。</p>
<p>去年一个莫名其妙的饭局上，发现飞哥不见了。出来找，见他一人在外面。“我爸刚才给我电话，没敢接怕他听出来喝酒。。。走，出去透口气。”</p>
<p>问我“你有什么打算？”</p>
<p>不知道&#8230;不考研反正&#8230;不敢想以后&#8230;</p>
<p>然后坐在马路牙子上，吐酸水。“你知道我为什么理平头？掉头发。前几天去拿药，医生说我胃分泌的有点乱。。”</p>
<p>“千千万万在大四前解决感情问题。。做这机器人耽误了暑假的两个月，考研的黄金时期。。”</p>
<p>一会儿回去，仍是同样的谈笑风生，跟社会上的那帮人闹的不亦乐乎，整个桌子依然围着他转。你保准看不出一丝破绽。</p>
<p>。。。</p>
<p>如今能说的只剩下保重，后会有期。</p>
<p>&#8212;&#8211;</p>
<p>把zneil叫出来吃饭，这人神奇的课表剩下整整一年完全没课，再没考研的打算，整个人都宅了。</p>
<p>这帮混蛋整的都是什么事情！不甘心&#8230;可我们有什么办法？No body cares，所以认真你就输了。</p>
<p>无能为力，这就叫一败涂地。</p>
<p>还是老老实实的，搞好自己吧。</p>
<p>&#8212;&#8211;</p>
<p>《了不起的盖茨比》里面印象最深的是这么一段：</p>
<p>“他们都是一帮混蛋，”我隔着草坪喊道：“把他们加在一起都比不上你！”</p>
<p>我后来一直很高兴我说了那句话。那是我对他说过的唯一一句恭维话。因为我自始至终都不认同他。</p>
<p>&#8212;&#8211;</p>
<p>“干死英格兰！”</p>
<p>对面楼上喊，不过灯已经黑了一半。辅导员应该结束了几天的辛苦，可以睡个安稳觉了。</p>
<p>他们会在什么地方看球！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/06/28/%e6%97%a0%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>GCC内联汇编的笔记</title>
		<link>http://www.fleurer-lee.com/2010/06/10/gcc%e5%86%85%e8%81%94%e6%b1%87%e7%bc%96%e7%9a%84%e7%ac%94%e8%ae%b0/</link>
		<comments>http://www.fleurer-lee.com/2010/06/10/gcc%e5%86%85%e8%81%94%e6%b1%87%e7%bc%96%e7%9a%84%e7%ac%94%e8%ae%b0/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 13:38:25 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[笔记]]></category>
		<category><![CDATA[ASM]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645885</guid>
		<description><![CDATA[起比VC风格的内联汇编，GCC的确实要别扭些，一开始要不看手册肯定一头雾水。

int foo = 10, bar = 15;
asm volatile&#40;&#34;addl  %%ebx,%%eax&#34;
            :&#34;=a&#34;&#40;foo&#41;                //output constraint
            :&#34;a&#34;&#40;foo&#41;, &#34;b&#34;&#40;bar&#41;    [...]]]></description>
			<content:encoded><![CDATA[<p>起比VC风格的内联汇编，GCC的确实要别扭些，一开始要不看手册肯定一头雾水。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> foo <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">,</span> bar <span style="color: #339933;">=</span> <span style="color: #0000dd;">15</span><span style="color: #339933;">;</span>
asm <span style="color: #993333;">volatile</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;addl  %%ebx,%%eax&quot;</span>
            <span style="color: #339933;">:</span><span style="color: #ff0000;">&quot;=a&quot;</span><span style="color: #009900;">&#40;</span>foo<span style="color: #009900;">&#41;</span>                <span style="color: #666666; font-style: italic;">//output constraint</span>
            <span style="color: #339933;">:</span><span style="color: #ff0000;">&quot;a&quot;</span><span style="color: #009900;">&#40;</span>foo<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;b&quot;</span><span style="color: #009900;">&#40;</span>bar<span style="color: #009900;">&#41;</span>      <span style="color: #666666; font-style: italic;">//input constraint</span>
            <span style="color: #339933;">:</span>                            <span style="color: #666666; font-style: italic;">//clobbered registers(ignored)</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>指令大家都明白，不过:&#8221;=a&#8221;(foo)这样的语法就古怪了。:后面的东西好像叫做约束，指明了输出和输入中用到的变量和寄存器。第一个的&#8221;=a&#8221;(foo)是输出的约束，就表示汇编执行完毕后foo=a。后面的&#8221;a&#8221;(foo)是输入的约束，表示汇编执行前的a=foo。这一来C和汇编就可以在约束下边交换数据了。</p>
<p>刚才这个a就是表示分配eax寄存器。</p>
<p>各种约束还挺多的&#8230;</p>
<table>
<tbody>
<tr>
<th>a,b,c,d</th>
<th>对应eax,ebx,ecx,edx</th>
</tr>
<tr>
<th>S,D</th>
<th>对应esi,edi</th>
</tr>
<tr>
<th>I</th>
<th>常数</th>
</tr>
<tr>
<th>q</th>
<th>eax,ebx,ecx,edx中静态分配一个</th>
</tr>
<tr>
<th>r</th>
<th>eax,ebx,ecx,edx,esi,edi中静态分配一个</th>
</tr>
<tr>
<th>m</th>
<th>内存定位</th>
</tr>
<tr>
<th>A</th>
<th>同时分配eax和ebx，形成一64位的寄存器</th>
</tr>
<tr>
<th>i</th>
<th>一个编译时确定的立即数。好像ljmp指令的第一个参数就必须得是立即数，比如ljmp $0&#215;80, $label。如果ljmp ax, $label就绘出现一个“Error: suffix or operands invalid for &#8216;ljmp&#8217;的错误”</th>
</tr>
</tbody>
</table>
<p>为什么要这么难看的语法呢&#8230;我猜这东西最早应该是给编译器而不是给人类设计的吧，比起VC风格的内联汇编，它可以得到更多关于变量和寄存器的信息，编译器分配起寄存器来可以心里有数，不用怕自作聪明的人类把事情都搞乱掉。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/06/10/gcc%e5%86%85%e8%81%94%e6%b1%87%e7%bc%96%e7%9a%84%e7%ac%94%e8%ae%b0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>写一个bootsector</title>
		<link>http://www.fleurer-lee.com/2010/05/26/%e5%86%99%e4%b8%80%e4%b8%aabootsector/</link>
		<comments>http://www.fleurer-lee.com/2010/05/26/%e5%86%99%e4%b8%80%e4%b8%aabootsector/#comments</comments>
		<pubDate>Wed, 26 May 2010 13:40:12 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[备忘]]></category>
		<category><![CDATA[ASM]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[OS]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645873</guid>
		<description><![CDATA[看的这个教程 http://share.solrex.org/WriteOS/
仿照《自己动手写操作系统》的格式，除却gas确实很囧的因素，大体上还是不错的。万事开头难，在开头的bootloader这里卡了好久的说&#8230;不过动手写一下也不过半小时的功夫 TvT
机器在启动的时候可能是遍历每个磁盘分区，若有发现第512字节位置是个0xAA55的魔数，就认为这是个引导的分区了。然后就把它的前512字节装入内存，从0&#215;7c00位置开始执行。这就是最简单的引导方式了好像。
我们把汇编代码编译成一个512bytes的二进制文件，再把它放到一个软盘的映像里就好。
boot.S

&#91;bits 16&#93;                       ;real mode
&#91;org 0x7c00&#93;                  ;put code start at 0x7c00
&#91;section .text&#93;
&#160;
_start:
    [...]]]></description>
			<content:encoded><![CDATA[<p>看的这个教程 http://share.solrex.org/WriteOS/</p>
<p>仿照《自己动手写操作系统》的格式，除却gas确实很囧的因素，大体上还是不错的。万事开头难，在开头的bootloader这里卡了好久的说&#8230;不过动手写一下也不过半小时的功夫 TvT</p>
<p>机器在启动的时候可能是遍历每个磁盘分区，若有发现第512字节位置是个0xAA55的魔数，就认为这是个引导的分区了。然后就把它的前512字节装入内存，从0&#215;7c00位置开始执行。这就是最简单的引导方式了好像。</p>
<p>我们把汇编代码编译成一个512bytes的二进制文件，再把它放到一个软盘的映像里就好。</p>
<p>boot.S</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #009900; font-weight: bold;">&#91;</span>bits <span style="color: #0000ff;">16</span><span style="color: #009900; font-weight: bold;">&#93;</span>                       <span style="color: #666666; font-style: italic;">;real mode</span>
<span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">org</span> <span style="color: #0000ff;">0x7c00</span><span style="color: #009900; font-weight: bold;">&#93;</span>                  <span style="color: #666666; font-style: italic;">;put code start at 0x7c00</span>
<span style="color: #009900; font-weight: bold;">&#91;</span>section <span style="color: #339933;">.</span>text<span style="color: #009900; font-weight: bold;">&#93;</span>
&nbsp;
_start<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">mov</span>     <span style="color: #00007f;">ax</span><span style="color: #339933;">,</span> <span style="color: #00007f;">cs</span>            <span style="color: #666666; font-style: italic;">; init seg registers</span>
    <span style="color: #00007f; font-weight: bold;">mov</span>     <span style="color: #00007f;">ds</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ax</span>
    <span style="color: #00007f; font-weight: bold;">mov</span>     <span style="color: #00007f;">es</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ax</span>
    <span style="color: #00007f; font-weight: bold;">call</span>    _print_str      
&nbsp;
_print_str<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">mov</span>     <span style="color: #00007f;">ax</span><span style="color: #339933;">,</span> <span style="color: #00007f; font-weight: bold;">str</span>            
    <span style="color: #00007f; font-weight: bold;">mov</span>     <span style="color: #00007f;">cx</span><span style="color: #339933;">,</span> len    
    <span style="color: #00007f; font-weight: bold;">mov</span>     <span style="color: #00007f;">bp</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ax</span>
    <span style="color: #00007f; font-weight: bold;">mov</span>     <span style="color: #00007f;">bx</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0x000c</span>
    <span style="color: #00007f; font-weight: bold;">mov</span>     <span style="color: #00007f;">dl</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0</span>
    <span style="color: #00007f; font-weight: bold;">mov</span>     <span style="color: #00007f;">ax</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0x1301</span>
    <span style="color: #00007f; font-weight: bold;">int</span>     <span style="color: #0000ff;">0x10</span>                              <span style="color: #666666; font-style: italic;">;int 0x10, just as manual says</span>
&nbsp;
_loop<span style="color: #339933;">:</span> 
    <span style="color: #00007f; font-weight: bold;">jmp</span>     _loop                             <span style="color: #666666; font-style: italic;">; forever loop</span>
&nbsp;
<span style="color: #00007f; font-weight: bold;">str</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">db</span>      <span style="color: #7f007f;">&quot;screw you guys all fucked up~&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">10</span><span style="color: #339933;">,</span><span style="color: #0000ff;">13</span>
len<span style="color: #339933;">:</span><span style="color: #000000; font-weight: bold;"> equ</span>     $<span style="color: #339933;">-</span><span style="color: #00007f; font-weight: bold;">str</span>
&nbsp;
times <span style="color: #0000ff;">510</span><span style="color: #339933;">-</span><span style="color: #009900; font-weight: bold;">&#40;</span>$<span style="color: #339933;">-</span>$$<span style="color: #009900; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">db</span> <span style="color: #0000ff;">0</span>                   <span style="color: #666666; font-style: italic;">; fill the rest with 0</span>
<span style="color: #000000; font-weight: bold;">dw</span> <span style="color: #0000ff;">0xAA55</span>                                  <span style="color: #666666; font-style: italic;">; magic number</span></pre></div></div>

<p>编译之</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">nasm -f bin boot.S</pre></div></div>

<p>生成一个boot.bin，下一步搞个软盘镜像</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">dd if=boot.bin of=boot.img bs=512 count=1
dd if=/dev/zero of=boot.img skip=1 seek=1 bs=512 count=2879</pre></div></div>

<p>ls -l 下，大约会是这样</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">-rwxr-xr-x 1 ssword ssword     512 2010-05-26 21:28 boot.bin
-rw-r--r-- 1 ssword ssword 1474560 2010-05-26 21:28 boot.img
-rw-r--r-- 1 ssword ssword     399 2010-05-26 21:28 boot.S</pre></div></div>

<p>然后打开virtualbox，设置软驱映像为boot.img。启动虚拟机就可以看到一个可爱的&#8221;screw you all&#8221;什么的了 >v<</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/05/26/%e5%86%99%e4%b8%80%e4%b8%aabootsector/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>使用rake编译C程序</title>
		<link>http://www.fleurer-lee.com/2010/05/20/%e4%bd%bf%e7%94%a8rake%e7%bc%96%e8%af%91c%e7%a8%8b%e5%ba%8f/</link>
		<comments>http://www.fleurer-lee.com/2010/05/20/%e4%bd%bf%e7%94%a8rake%e7%bc%96%e8%af%91c%e7%a8%8b%e5%ba%8f/#comments</comments>
		<pubDate>Thu, 20 May 2010 15:11:40 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[备忘]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645864</guid>
		<description><![CDATA[每次修改代码一般只会涉及一部分文件，大部分代码都是不必重复编译的。而且编译明显是分步骤也有依赖关系，比如要测试程序就得先链接出一个可执行文件，要链接就得先编译成.o。。。所以就有了make，自动分析任务的依赖关系，只对有变更的文件执行编译，省心省时间。
不过make的语法晦涩啊&#8230;就有了rake
rake提供了file函数可以指明文件的依赖关系，比如：

file 'fdict.o' =&#62; &#91;'src/fdict.c', 'src/fdict.h'&#93; do
  sh 'gcc -Wall -c src/fdict.c'
end
file 'test.o' =&#62; &#91;'src/test.c'&#93; do 
  sh 'gcc -Wall -c src/test.c'
end

file就是个ruby的函数调用，把重复的东西去掉很简单

CFlags = '-Wall'
&#160;
&#91;
  &#91;'src/fdict.c', 'src/fdict.h'&#93;,
  &#91;'src/test.c'&#93;
&#93;.each do &#124;fn_c, *_&#124;
  fn_o = File.basename&#40;fn_c&#41;.ext&#40;'o'&#41;
  file fn_o =&#62; &#91;fn_c, *_&#93; do
    sh &#34;gcc #{CFlags} -c #{fn_c}&#34;
  end
end

再就是链接和执行

OFiles = [...]]]></description>
			<content:encoded><![CDATA[<p>每次修改代码一般只会涉及一部分文件，大部分代码都是不必重复编译的。而且编译明显是分步骤也有依赖关系，比如要测试程序就得先链接出一个可执行文件，要链接就得先编译成.o。。。所以就有了make，自动分析任务的依赖关系，只对有变更的文件执行编译，省心省时间。</p>
<p>不过make的语法晦涩啊&#8230;就有了rake</p>
<p>rake提供了file函数可以指明文件的依赖关系，比如：</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">file <span style="color:#996600;">'fdict.o'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'src/fdict.c'</span>, <span style="color:#996600;">'src/fdict.h'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  sh <span style="color:#996600;">'gcc -Wall -c src/fdict.c'</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
file <span style="color:#996600;">'test.o'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'src/test.c'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span> 
  sh <span style="color:#996600;">'gcc -Wall -c src/test.c'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>file就是个ruby的函数调用，把重复的东西去掉很简单</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">CFlags = <span style="color:#996600;">'-Wall'</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&#91;</span>
  <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'src/fdict.c'</span>, <span style="color:#996600;">'src/fdict.h'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
  <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'src/test.c'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>fn_c, <span style="color:#006600; font-weight:bold;">*</span>_<span style="color:#006600; font-weight:bold;">|</span>
  fn_o = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">basename</span><span style="color:#006600; font-weight:bold;">&#40;</span>fn_c<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">ext</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'o'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  file fn_o <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span>fn_c, <span style="color:#006600; font-weight:bold;">*</span>_<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    sh <span style="color:#996600;">&quot;gcc #{CFlags} -c #{fn_c}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>再就是链接和执行</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">OFiles = <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#123;</span>fdict.<span style="color:#9900CC;">o</span> test.<span style="color:#9900CC;">o</span><span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
task <span style="color:#ff3333; font-weight:bold;">:run</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:link</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span> 
  sh <span style="color:#996600;">&quot;./test&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
task <span style="color:#ff3333; font-weight:bold;">:link</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> OFiles <span style="color:#9966CC; font-weight:bold;">do</span>
  sh <span style="color:#996600;">&quot;gcc #{CFlags} #{OFiles.join(' ')} -o test&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>每修改两行C程序到控制台下边一个rake run就可以立即执行，这一来写c就有点像写脚本了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/05/20/%e4%bd%bf%e7%94%a8rake%e7%bc%96%e8%af%91c%e7%a8%8b%e5%ba%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>随记</title>
		<link>http://www.fleurer-lee.com/2010/05/18/%e9%9a%8f%e8%ae%b0/</link>
		<comments>http://www.fleurer-lee.com/2010/05/18/%e9%9a%8f%e8%ae%b0/#comments</comments>
		<pubDate>Tue, 18 May 2010 14:49:03 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645854</guid>
		<description><![CDATA[无论何时，只要单个资源需要在多个用户间共享，就必须处理一致性的问题。
回头想下“函数式语言无副作用适合写并发程序”之类的说法，只是在计算上的并发，对存储上的并发照样得上锁上钥匙。
win32的窗体使用handle而不是指针
一个窗体可能会被多个进程处理，也可以隐藏窗体对象的内部实现。
真空管和三极管的共性
都可以将信号放大，这一来就可以用电信号来控制开关了。就有了逻辑电路&#8230;
lua从堆栈机转到寄存器机
因为lua实现里表示值的那个结构体Tvalue是个tagged union，个头太大了(两个指针这么长)。在堆栈上push/pop一来一回吃资源，搞成寄存器机可以省些搬运。
为什么要有链接器
可以把程序分成模块。
C中结构体不可比较
因为结构体里数据对齐的空隙里面的东西可能随机的。
C++为什么不用printf
类型不安全。像cout好像是对每个内置类型都重载了一个]]></description>
			<content:encoded><![CDATA[<p><strong>无论何时，只要单个资源需要在多个用户间共享，就必须处理一致性的问题。</strong><br />
回头想下“函数式语言无副作用适合写并发程序”之类的说法，只是在计算上的并发，对存储上的并发照样得上锁上钥匙。</p>
<p><strong>win32的窗体使用handle而不是指针</strong><br />
一个窗体可能会被多个进程处理，也可以隐藏窗体对象的内部实现。</p>
<p><strong>真空管和三极管的共性</strong><br />
都可以将信号放大，这一来就可以用电信号来控制开关了。就有了逻辑电路&#8230;</p>
<p><strong>lua从堆栈机转到寄存器机</strong><br />
因为lua实现里表示值的那个结构体Tvalue是个tagged union，个头太大了(两个指针这么长)。在堆栈上push/pop一来一回吃资源，搞成寄存器机可以省些搬运。</p>
<p><strong>为什么要有链接器</strong><br />
可以把程序分成模块。</p>
<p><strong>C中结构体不可比较</strong><br />
因为结构体里数据对齐的空隙里面的东西可能随机的。</p>
<p><strong>C++为什么不用printf</strong><br />
类型不安全。像cout好像是对每个内置类型都重载了一个<<操作符</p>
<p><strong>x86实模式的逻辑地址</strong><br />
x86实模式的逻辑地址是段寄存器（如cs）里存一个基地址(16位)，左移四位再加上一个16位的偏移。<br />
为什么要这么蛋疼，因为当时的主线有20位（可寻址1mb），但是intel的寄存器只有16位。</p>
<p><strong>自动机</strong><br />
就是根据输入自动切换状态的计算模型。不过状态有限，识别的语言(语言就是字符串的集合)是最少的。自动机可以识别的语言就叫正则语言。<br />
给自动机加一个堆栈就是下推自动机，这样状态就可以无限了，可以识别的语言就叫上下文无关语言。<br />
给自动机加一个随机存储，就是图灵机了。可以识别的语言就叫可判定语言。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/05/18/%e9%9a%8f%e8%ae%b0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>rails使用paperclip插件上传时遇到500 Internal Server Error</title>
		<link>http://www.fleurer-lee.com/2010/05/11/rails%e4%bd%bf%e7%94%a8paperclip%e6%8f%92%e4%bb%b6%e4%b8%8a%e4%bc%a0%e6%97%b6%e9%81%87%e5%88%b0505-server-error/</link>
		<comments>http://www.fleurer-lee.com/2010/05/11/rails%e4%bd%bf%e7%94%a8paperclip%e6%8f%92%e4%bb%b6%e4%b8%8a%e4%bc%a0%e6%97%b6%e9%81%87%e5%88%b0505-server-error/#comments</comments>
		<pubDate>Tue, 11 May 2010 07:57:27 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[备忘]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645842</guid>
		<description><![CDATA[有可能是imageMagick没装利索。找不到imagemagick，显示错误信息的时候试图把上传的文件对象序列化，就505了。

sudo apt-get install imagemagick --fix-missing

使用三方库就得做好不可预料事件的准备哇
关于paperclip的使用，这两篇简介好像不错：
http://jimneath.org/2008/04/17/paperclip-attaching-files-in-rails/
http://thewebfellas.com/blog/2008/11/2/goodbye-attachment_fu-hello-paperclip
ps: 又遇到了个没预料的问题，上传validates_attachment_content_type指定的类型之外的文件时候同样会遇到个500 internal server error，未解中。
]]></description>
			<content:encoded><![CDATA[<p>有可能是imageMagick没装利索。找不到imagemagick，显示错误信息的时候试图把上传的文件对象序列化，就505了。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">sudo apt-get install imagemagick --fix-missing</pre></div></div>

<p>使用三方库就得做好不可预料事件的准备哇</p>
<p>关于paperclip的使用，这两篇简介好像不错：<br />
<a href="http://jimneath.org/2008/04/17/paperclip-attaching-files-in-rails/">http://jimneath.org/2008/04/17/paperclip-attaching-files-in-rails/</a><br />
<a href="http://thewebfellas.com/blog/2008/11/2/goodbye-attachment_fu-hello-paperclip">http://thewebfellas.com/blog/2008/11/2/goodbye-attachment_fu-hello-paperclip</a></p>
<p>ps: 又遇到了个没预料的问题，上传validates_attachment_content_type指定的类型之外的文件时候同样会遇到个500 internal server error，未解中。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/05/11/rails%e4%bd%bf%e7%94%a8paperclip%e6%8f%92%e4%bb%b6%e4%b8%8a%e4%bc%a0%e6%97%b6%e9%81%87%e5%88%b0505-server-error/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>踩踩数据结构什么的 =“=</title>
		<link>http://www.fleurer-lee.com/2010/05/08/%e8%b8%a9%e8%b8%a9%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%bb%80%e4%b9%88%e7%9a%84-%e2%80%9c/</link>
		<comments>http://www.fleurer-lee.com/2010/05/08/%e8%b8%a9%e8%b8%a9%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%bb%80%e4%b9%88%e7%9a%84-%e2%80%9c/#comments</comments>
		<pubDate>Sat, 08 May 2010 00:51:14 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[备忘]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645833</guid>
		<description><![CDATA[发觉算法太弱了 =&#8221;=
当年在ACM那里呆了两天就隐身了，可惜那个老师非常非常非常好的（实验室里还有空调 >_]]></description>
			<content:encoded><![CDATA[<p>发觉算法太弱了 =&#8221;=</p>
<p>当年在ACM那里呆了两天就隐身了，可惜那个老师非常非常非常好的（实验室里还有空调 >_<）。总觉得这玩意水太深，掉进去就出不来了....“不成熟的优化乃万恶之源”这话又正好应了惰性心理，心安理得地“出了性能问题再说之前先弄出来再说管算法干嘛”...可现实往往是，不会算法你压根就弄不出来...</p>
<p>先从一棵二叉查找树开始好了。挖坑慢慢填，时间有的是(?)</p>

<div class="wp_syntax"><div class="code"><pre class="haskell" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">module</span> BTree <span style="color: #06c; font-weight: bold;">where</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">data</span> BTree a b <span style="color: #339933; font-weight: bold;">=</span> Empty 
               <span style="color: #339933; font-weight: bold;">|</span> BNode <span style="color: green;">&#123;</span>
                    kv <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">,</span> b<span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span> 
                    left <span style="color: #339933; font-weight: bold;">::</span> BTree a b<span style="color: #339933; font-weight: bold;">,</span>
                    right <span style="color: #339933; font-weight: bold;">::</span> BTree a b
               <span style="color: green;">&#125;</span> 
               <span style="color: #06c; font-weight: bold;">deriving</span><span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Show</span><span style="color: #339933; font-weight: bold;">,</span> <span style="color: #cccc00; font-weight: bold;">Eq</span><span style="color: green;">&#41;</span>
&nbsp;
insert <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Ord</span> a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=&gt;</span> <span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">,</span> b<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> BTree a b <span style="color: #339933; font-weight: bold;">-&gt;</span> BTree a b
insert <span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span>v<span style="color: green;">&#41;</span> Empty <span style="color: #339933; font-weight: bold;">=</span> BNode <span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span> v<span style="color: green;">&#41;</span> Empty Empty
insert <span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span>v<span style="color: green;">&#41;</span> pnode<span style="color: #339933; font-weight: bold;">@</span><span style="color: green;">&#40;</span>BNode <span style="color: green;">&#40;</span>pk<span style="color: #339933; font-weight: bold;">,</span> <span style="color: #339933; font-weight: bold;">_</span><span style="color: green;">&#41;</span> lnode rnode<span style="color: green;">&#41;</span> 
    <span style="color: #339933; font-weight: bold;">|</span> k <span style="color: #339933; font-weight: bold;">==</span> pk   <span style="color: #339933; font-weight: bold;">=</span> pnode <span style="color: green;">&#123;</span> kv <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span>v<span style="color: green;">&#41;</span> <span style="color: green;">&#125;</span>
    <span style="color: #339933; font-weight: bold;">|</span> k <span style="color: #339933; font-weight: bold;">&lt;</span>  pk   <span style="color: #339933; font-weight: bold;">=</span> pnode <span style="color: green;">&#123;</span> left  <span style="color: #339933; font-weight: bold;">=</span> insert <span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span>v<span style="color: green;">&#41;</span> lnode <span style="color: green;">&#125;</span>
    <span style="color: #339933; font-weight: bold;">|</span> k <span style="color: #339933; font-weight: bold;">&gt;</span>  pk   <span style="color: #339933; font-weight: bold;">=</span> pnode <span style="color: green;">&#123;</span> right <span style="color: #339933; font-weight: bold;">=</span> insert <span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span>v<span style="color: green;">&#41;</span> rnode <span style="color: green;">&#125;</span>
&nbsp;
find <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Ord</span> a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=&gt;</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> BTree a b <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: #cccc00; font-weight: bold;">Maybe</span> b
find k Empty <span style="color: #339933; font-weight: bold;">=</span> Nothing
find k <span style="color: green;">&#40;</span>BNode <span style="color: green;">&#40;</span>pk<span style="color: #339933; font-weight: bold;">,</span>pv<span style="color: green;">&#41;</span> lnode rnode<span style="color: green;">&#41;</span>
    <span style="color: #339933; font-weight: bold;">|</span> k <span style="color: #339933; font-weight: bold;">==</span> pk <span style="color: #339933; font-weight: bold;">=</span> Just pv
    <span style="color: #339933; font-weight: bold;">|</span> k <span style="color: #339933; font-weight: bold;">&lt;=</span> pk <span style="color: #339933; font-weight: bold;">=</span> find k lnode
    <span style="color: #339933; font-weight: bold;">|</span> k <span style="color: #339933; font-weight: bold;">&gt;</span>  pk <span style="color: #339933; font-weight: bold;">=</span> find k rnode
find <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">=</span> Nothing
&nbsp;
remove <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Ord</span> a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=&gt;</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> BTree a b <span style="color: #339933; font-weight: bold;">-&gt;</span> BTree a b
remove k Empty <span style="color: #339933; font-weight: bold;">=</span> Empty
remove k pnode<span style="color: #339933; font-weight: bold;">@</span><span style="color: green;">&#40;</span>BNode <span style="color: green;">&#40;</span>pk<span style="color: #339933; font-weight: bold;">,</span>pv<span style="color: green;">&#41;</span> lnode rnode<span style="color: green;">&#41;</span> 
    <span style="color: #339933; font-weight: bold;">|</span> k <span style="color: #339933; font-weight: bold;">==</span> pk <span style="color: #339933; font-weight: bold;">=</span> merge lnode rnode
    <span style="color: #339933; font-weight: bold;">|</span> k <span style="color: #339933; font-weight: bold;">&lt;=</span> pk <span style="color: #339933; font-weight: bold;">=</span> pnode <span style="color: green;">&#123;</span> left <span style="color: #339933; font-weight: bold;">=</span> remove k lnode <span style="color: green;">&#125;</span>
    <span style="color: #339933; font-weight: bold;">|</span> k <span style="color: #339933; font-weight: bold;">&gt;</span>  pk <span style="color: #339933; font-weight: bold;">=</span> pnode <span style="color: green;">&#123;</span> right <span style="color: #339933; font-weight: bold;">=</span> remove k rnode <span style="color: green;">&#125;</span>
&nbsp;
merge <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Ord</span> a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=&gt;</span> BTree a b <span style="color: #339933; font-weight: bold;">-&gt;</span> BTree a b <span style="color: #339933; font-weight: bold;">-&gt;</span> BTree a b
merge lnode rnode <span style="color: #339933; font-weight: bold;">=</span> fromList <span style="color: #339933; font-weight: bold;">$</span> <span style="color: green;">&#40;</span>toList lnode<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="color: green;">&#40;</span>toList rnode<span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">--helper</span>
isEmpty Empty <span style="color: #339933; font-weight: bold;">=</span> True 
isEmpty <span style="color: #339933; font-weight: bold;">_</span>     <span style="color: #339933; font-weight: bold;">=</span> False
&nbsp;
fromList <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Ord</span> a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=&gt;</span> <span style="color: green;">&#91;</span><span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">,</span>b<span style="color: green;">&#41;</span><span style="color: green;">&#93;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> BTree a b
fromList <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">foldl</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">flip</span> insert<span style="color: green;">&#41;</span> Empty 
&nbsp;
toList <span style="color: #339933; font-weight: bold;">::</span> BTree a b <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: green;">&#91;</span><span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">,</span>b<span style="color: green;">&#41;</span><span style="color: green;">&#93;</span>
toList Empty <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span> 
toList <span style="color: green;">&#40;</span>BNode <span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span>v<span style="color: green;">&#41;</span> lnode rnode<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> 
    <span style="color: green;">&#40;</span>toList lnode<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="color: green;">&#91;</span><span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span>v<span style="color: green;">&#41;</span><span style="color: green;">&#93;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="color: green;">&#40;</span>toList rnode<span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- for test</span>
root <span style="color: #339933; font-weight: bold;">=</span> fromList <span style="color: #339933; font-weight: bold;">$</span> <span style="color: green;">&#91;</span>
    <span style="color: green;">&#40;</span><span style="color: red;">4</span><span style="color: #339933; font-weight: bold;">,</span> <span style="background-color: #3cb371;">&quot;fleurer&quot;</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span> 
    <span style="color: green;">&#40;</span><span style="color: red;">10</span><span style="color: #339933; font-weight: bold;">,</span> <span style="background-color: #3cb371;">&quot;ssword&quot;</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span> 
    <span style="color: green;">&#40;</span><span style="color: red;">100</span><span style="color: #339933; font-weight: bold;">,</span> <span style="background-color: #3cb371;">&quot;ssword&quot;</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span> 
    <span style="color: green;">&#40;</span><span style="color: red;">2</span><span style="color: #339933; font-weight: bold;">,</span> <span style="background-color: #3cb371;">&quot;xx&quot;</span><span style="color: green;">&#41;</span><span style="color: green;">&#93;</span></pre></div></div>

<p>haskell做数据结构好像别扭的很&#8230;不用ST Monad或者IO的话什么都是值还不能引用，像二叉树的旋转什么的就没想出常数时间的办法。像上面那个remove就直接简单粗暴了orz</p>
<p>(邪恶音：用ST Monad不就好了嘛)<br />
(ST Monad都用了还用haskell干嘛 TvT)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/05/08/%e8%b8%a9%e8%b8%a9%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%bb%80%e4%b9%88%e7%9a%84-%e2%80%9c/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>blah~</title>
		<link>http://www.fleurer-lee.com/2010/05/07/blah-2/</link>
		<comments>http://www.fleurer-lee.com/2010/05/07/blah-2/#comments</comments>
		<pubDate>Fri, 07 May 2010 11:36:21 +0000</pubDate>
		<dc:creator>Fleurer</dc:creator>
				<category><![CDATA[杂碎]]></category>
		<category><![CDATA[杯具]]></category>

		<guid isPermaLink="false">http://www.fleurer-lee.com/?p=645812</guid>
		<description><![CDATA[“好久没更新了”~orz又这么开头了。
昨天下午给新人讲东西时候差点着起急来，耐心什么的实在是差了些。同理，这个blog也快不会写了。笔记什么的都有记在在本子上，怨念什么的也都在twi上发泄了个精光。想翻译点东西可是怎么都觉得驴唇不对马嘴，就全部作罢。
完整的橇课，上午看书下午敲代码。再同各种善意的小朋友交流下，要说充实倒确实非比寻常。不过总觉得倦的厉害，简单一个“中午不睡下午崩溃”似乎还说不过去。代码就够傲骄了，人自然更难伺候。写这句话的时候当年推销饮水机的两位童鞋又敲门进来推销凉席，都不容易。
还是说代码吧。敏捷编程什么都领悟不了还扯淡什么人生。一天几十行，我起草一份《蜗牛宣言》好了~ 
想用rails换掉学校网站正在用的这个aspx系统。都说rails不好维护，可是当前的这aspx系统我已经完全维护无力了，瞅着bug在那里只能对着那两万行的一个类发呆。用rails重写最起码我能维护，能用不能用写出来再说。（敏捷什么的就当笑话听吧）
闲着把寒假时候烂掉的那个堆栈机完善了下，随后发懒两个星期没碰代码，回头想下应该差不多能用了（当然是想当然）。代码改的相当蛋疼，用上了ruby那VALUE式的tagged pointer，没打算oo的也在c里把类型搞成了对象，再就是大量少于十行的小函数。以前只是听说lua的upvalue实现很简洁，看了下发现用在这里不合适，lua的临时变量和求值栈都在同一个栈帧里连续着，只要不是闭包的变量在函数执行完立即回收。而这个堆栈机里的堆栈只是求值栈，临时变量都在一个动态分配的结构体里。这里让栈帧在函数执行完后统统保留，等着GC回收就是。
从淘宝上打印了本《莱昂氏unix源码剖析》，作者好个惜字如金，读起来也很吃力。 前半部分是unix v6的全部源码，仅9000行出头。随便翻下就被雷了，内存管理的malloc和mfree不到百行，而枚举一个进程的子进程什么的就都这样:

for&#40;p = &#38;proc&#91;0&#93;; p &#60; &#38;proc&#91;NPROC&#93;; p++&#41;
if &#40;a-&#62;p_pid == p-&#62;p_ppid&#41; &#123;
        p-&#62;p_ppid = 1;
        if &#40;p-&#62;p_stat == SSTOP&#41;
                setrun&#40;p&#41;;
&#125;
swtch&#40;&#41;;

简单粗暴，多好。
]]></description>
			<content:encoded><![CDATA[<p>“好久没更新了”~orz又这么开头了。</p>
<p>昨天下午给新人讲东西时候差点着起急来，耐心什么的实在是差了些。同理，这个blog也快不会写了。笔记什么的都有记在在本子上，怨念什么的也都在twi上发泄了个精光。想翻译点东西可是怎么都觉得驴唇不对马嘴，就全部作罢。</p>
<p>完整的橇课，上午看书下午敲代码。再同各种善意的小朋友交流下，要说充实倒确实非比寻常。不过总觉得倦的厉害，简单一个“中午不睡下午崩溃”似乎还说不过去。代码就够傲骄了，人自然更难伺候。写这句话的时候当年推销饮水机的两位童鞋又敲门进来推销凉席，都不容易。</p>
<p>还是说代码吧。敏捷编程什么都领悟不了还扯淡什么人生。一天几十行，我起草一份《蜗牛宣言》好了~ </p>
<p>想用rails换掉学校网站正在用的这个aspx系统。都说rails不好维护，可是当前的这aspx系统我已经完全维护无力了，瞅着bug在那里只能对着那两万行的一个类发呆。用rails重写最起码我能维护，能用不能用写出来再说。（敏捷什么的就当笑话听吧）</p>
<p>闲着把寒假时候烂掉的那个堆栈机完善了下，随后发懒两个星期没碰代码，回头想下应该差不多能用了（当然是想当然）。代码改的相当蛋疼，用上了ruby那VALUE式的tagged pointer，没打算oo的也在c里把类型搞成了对象，再就是大量少于十行的小函数。以前只是听说lua的upvalue实现很简洁，看了下发现用在这里不合适，lua的临时变量和求值栈都在同一个栈帧里连续着，只要不是闭包的变量在函数执行完立即回收。而这个堆栈机里的堆栈只是求值栈，临时变量都在一个动态分配的结构体里。这里让栈帧在函数执行完后统统保留，等着GC回收就是。</p>
<p>从淘宝上打印了本《莱昂氏unix源码剖析》，作者好个惜字如金，读起来也很吃力。 前半部分是unix v6的全部源码，仅9000行出头。随便翻下就被雷了，内存管理的malloc和mfree不到百行，而枚举一个进程的子进程什么的就都这样:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>proc<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> p <span style="color: #339933;">&lt;</span> <span style="color: #339933;">&amp;</span>proc<span style="color: #009900;">&#91;</span>NPROC<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> p<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a<span style="color: #339933;">-&gt;</span>p_pid <span style="color: #339933;">==</span> p<span style="color: #339933;">-&gt;</span>p_ppid<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        p<span style="color: #339933;">-&gt;</span>p_ppid <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>p_stat <span style="color: #339933;">==</span> SSTOP<span style="color: #009900;">&#41;</span>
                setrun<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
swtch<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>简单粗暴，多好。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fleurer-lee.com/2010/05/07/blah-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
