﻿<?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/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>f(Program,Poet)=Programet &#187; 计算机</title>
	<atom:link href="http://blog.programet.org/category/computer/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.programet.org</link>
	<description>f(诗,程序)=诗序=思绪 &#124; 记载我们自己的生活</description>
	<lastBuildDate>Mon, 06 Feb 2012 12:53:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Haskell随手笔记：infinite list</title>
		<link>http://blog.programet.org/2011/12/haskell%e9%9a%8f%e6%89%8b%e7%ac%94%e8%ae%b0%ef%bc%9ainfinite-list.html</link>
		<comments>http://blog.programet.org/2011/12/haskell%e9%9a%8f%e6%89%8b%e7%ac%94%e8%ae%b0%ef%bc%9ainfinite-list.html#comments</comments>
		<pubDate>Tue, 06 Dec 2011 17:01:21 +0000</pubDate>
		<dc:creator>严酷的魔王</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4818</guid>
		<description><![CDATA[为了与寺雷颠保持一致，这是一个不知道什么时候就会太监的系列。——题记 其实这一切的开端都是Mgccl大牛作祟。在他的各种代码影响下，我就萌生了接触一点函数式编程的念头。其实还有一个原因便是我现在经常使用R语言做统计作业，但是R语言实际上是S语言的继承。本来S语言是一个函数式编程的语言，但是R这么一继承就变得有些不伦不类的……所以我也怀着“了解了函数式编程就能更好地学会R了吧！！”的情绪。最后，Haskell这个名字依然在三年前的《让我们比比长短》一文中出现了，这里函数式编程给我留下了各种深刻的印象。 Haskell有两本可以在线看的教材：《Real World Haskell》和《Learn You a Haskell》两本。它们应该算是基础教材了吧，也就是让你能够初步接触Haskell。然后还有一个介绍内置函数的pdf。 我用的是WindowsXP（你们不要斜眼看过来！），于是首先去Haskell的官网下载了GHC(应该算是一个运行环境？命令行式的)。然后它会自动修改你的环境变量，于是新建一个后缀名为.hs的文件便会自动调用GHC载入代码。 ——————胡言乱语的分割线—————— Haskell里面没有循环，但是我们可以用递归来实现它。比如下面这段计算斐波那契数列的C代码： f&#91;0&#93;=1; f&#91;1&#93;=1; for &#40;i=2;i&#60;n;i++&#41; f&#91;i&#93;=f&#91;i-1&#93;+f&#91;i-2&#93;; 可以在haskell里面用递归的形式这样写： fib n = lst 1 1 n where lst a b c = if c&#60;2 then a else lst &#40;a+b&#41; a &#40;c-1&#41; 但是鉴于Mgccl大牛对elegance的追求，以及haskell一个很神奇的特质，我们可以用&#8221;infinite list&#8221;来一句话实现这个操作： fib n = fibs !! n where fibs = 0 : 1 : zipWith [...]
相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
<li><a href='http://blog.programet.org/2009/12/%e6%99%92%ef%bc%9ac%e8%af%ad%e8%a8%80%e6%9c%9f%e4%b8%ad%e5%ae%9e%e9%aa%8c%e6%8a%a5%e5%91%8a.html' rel='bookmark' title='晒：C语言期中实验报告'>晒：C语言期中实验报告</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>为了与寺雷颠保持一致，这是一个不知道什么时候就会太监的系列。——题记</p>
<p><span id="more-4818"></span></p>
<p>其实这一切的开端都是Mgccl大牛作祟。在他的各种代码影响下，我就萌生了接触一点函数式编程的念头。其实还有一个原因便是我现在经常使用R语言做统计作业，但是R语言实际上是S语言的继承。本来S语言是一个函数式编程的语言，但是R这么一继承就变得有些不伦不类的……所以我也怀着“了解了函数式编程就能更好地学会R了吧！！”的情绪。最后，Haskell这个名字依然在三年前的<a href="http://blog.programet.org/2008/10/blog-post_21-3.html">《让我们比比长短》</a>一文中出现了，这里函数式编程给我留下了各种深刻的印象。</p>
<p>Haskell有两本可以在线看的教材：<a href="http://book.realworldhaskell.org/read/">《Real World Haskell》</a>和<a href="http://learnyouahaskell.com/chapters">《Learn You a Haskell》</a>两本。它们应该算是基础教材了吧，也就是让你能够初步接触Haskell。然后还有一个介绍内置函数的<a href="http://dou.bz/43hPBj">pdf</a>。</p>
<p>我用的是WindowsXP（你们不要斜眼看过来！），于是首先去Haskell的官网下载了GHC(应该算是一个运行环境？命令行式的)。然后它会自动修改你的环境变量，于是新建一个后缀名为.hs的文件便会自动调用GHC载入代码。</p>
<p>——————胡言乱语的分割线——————</p>
<p>Haskell里面没有循环，但是我们可以用递归来实现它。比如下面这段计算斐波那契数列的C代码：</p>

<div class="wp_codebox"><table><tr id="p48186"><td class="code" id="p4818code6"><pre class="c" style="font-family:monospace;">f<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
f<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span>n<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	f<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>f<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span>f<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>可以在haskell里面用递归的形式这样写：</p>

<div class="wp_codebox"><table><tr id="p48187"><td class="code" id="p4818code7"><pre class="haskell" style="font-family:monospace;">fib n <span style="color: #339933; font-weight: bold;">=</span> lst <span style="color: red;">1</span> <span style="color: red;">1</span> n 
	<span style="color: #06c; font-weight: bold;">where</span> lst a b c <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">if</span> c<span style="color: #339933; font-weight: bold;">&lt;</span><span style="color: red;">2</span> <span style="color: #06c; font-weight: bold;">then</span> a 
				 <span style="color: #06c; font-weight: bold;">else</span> lst <span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">+</span>b<span style="color: green;">&#41;</span> a <span style="color: green;">&#40;</span>c<span style="color: #339933; font-weight: bold;">-</span><span style="color: red;">1</span><span style="color: green;">&#41;</span></pre></td></tr></table></div>

<p>但是鉴于Mgccl大牛对elegance的追求，以及haskell一个很神奇的特质，我们可以用&#8221;infinite list&#8221;来一句话实现这个操作：</p>

<div class="wp_codebox"><table><tr id="p48188"><td class="code" id="p4818code8"><pre class="haskell" style="font-family:monospace;">fib n <span style="color: #339933; font-weight: bold;">=</span> fibs <span style="color: #339933; font-weight: bold;">!!</span> n
        <span style="color: #06c; font-weight: bold;">where</span> fibs <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">0</span> : <span style="color: red;">1</span> : <span style="font-weight: bold;">zipWith</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">+</span><span style="color: green;">&#41;</span> fibs <span style="color: green;">&#40;</span><span style="font-weight: bold;">tail</span> fibs<span style="color: green;">&#41;</span></pre></td></tr></table></div>

<p>haskell有一个lazy的特点，也就是所有的东西都会在需要的时候才去计算。haskell内置了一个函数repeat n，就是生成一个长度无限的list[n,n,n,n,&#8230; 。这种涉及无穷的东西并不会瞬间吃光你的内存，而是在你需要算到第n个数时，它才会帮你算到那个数。因为这个特点，在haskell中实现循环还有另一种方法：事先找到这个循环的规律，然后类似通项公式一般地生成一个无穷表，然后这个list的第n项就是循环到n的结果。</p>
<p>另一个例子，解决的问题是<a href="http://projecteuler.net/problem=97">ProjectEuler第97题</a>。我的代码是：</p>

<div class="wp_codebox"><table><tr id="p48189"><td class="code" id="p4818code9"><pre class="haskell" style="font-family:monospace;">powMod2 n <span style="color: #339933; font-weight: bold;">=</span> l <span style="color: red;">1</span> n <span style="color: red;">2</span> <span style="color: #06c; font-weight: bold;">where</span>
            l i n ans <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">if</span> <span style="color: green;">&#40;</span>i<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span><span style="color: #339933; font-weight: bold;">&lt;=</span>n<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">then</span> l <span style="color: green;">&#40;</span>i<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span><span style="color: green;">&#41;</span> n <span style="color: green;">&#40;</span><span style="font-weight: bold;">mod</span> <span style="color: green;">&#40;</span>ans<span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">2</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="color: red;">10</span><span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">10</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
			            <span style="color: #06c; font-weight: bold;">else</span> <span style="color: #06c; font-weight: bold;">if</span> <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>i<span style="color: #339933; font-weight: bold;">&lt;</span>n<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">&amp;&amp;</span> <span style="color: green;">&#40;</span>i<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span><span style="color: #339933; font-weight: bold;">&gt;</span>n<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">then</span> <span style="font-weight: bold;">mod</span> <span style="color: green;">&#40;</span>ans<span style="color: #339933; font-weight: bold;">*</span><span style="color: green;">&#40;</span>l <span style="color: red;">1</span> <span style="color: green;">&#40;</span>n<span style="color: #339933; font-weight: bold;">-</span>i<span style="color: green;">&#41;</span> <span style="color: red;">2</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="color: red;">10</span><span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">10</span><span style="color: green;">&#41;</span>
						<span style="color: #06c; font-weight: bold;">else</span> ans
ans<span style="color: #339933; font-weight: bold;">_</span>97 <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">mod</span> <span style="color: green;">&#40;</span><span style="color: red;">28433</span><span style="color: #339933; font-weight: bold;">*</span><span style="color: green;">&#40;</span>powMod2 <span style="color: red;">7830457</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">+</span><span style="color: red;">1</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="color: red;">10</span><span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">10</span><span style="color: green;">&#41;</span></pre></td></tr></table></div>

<p>仍然保留在简单粗暴的递归式循环上。而Mgccl大牛的代码则如下：</p>

<div class="wp_codebox"><table><tr id="p481810"><td class="code" id="p4818code10"><pre class="haskell" style="font-family:monospace;">bin <span style="color: red;">0</span> xs <span style="color: #339933; font-weight: bold;">=</span> xs
bin n xs <span style="color: #339933; font-weight: bold;">=</span> bin q <span style="color: green;">&#40;</span>r:xs<span style="color: green;">&#41;</span>
        <span style="color: #06c; font-weight: bold;">where</span> <span style="color: green;">&#40;</span>q<span style="color: #339933; font-weight: bold;">,</span>r<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">divMod</span> n <span style="color: red;">2</span>
result <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#40;</span>t<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">28433</span><span style="color: #339933; font-weight: bold;">+</span><span style="color: red;">1</span><span style="color: green;">&#41;</span> `<span style="font-weight: bold;">mod</span>` m
  <span style="color: #06c; font-weight: bold;">where</span> t <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">foldr</span> <span style="color: green;">&#40;</span>mmod<span style="color: green;">&#41;</span> <span style="color: red;">1</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="font-weight: bold;">filter</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">/=</span><span style="color: red;">0</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">zipWith</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">*</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">reverse</span> <span style="color: #339933; font-weight: bold;">$</span> bin <span style="color: red;">7830457</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span><span style="color: green;">&#41;</span> twoPow<span style="color: green;">&#41;</span>
        twoPow <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">2</span>:<span style="font-weight: bold;">zipWith</span> mmod twoPow twoPow
        m <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">10</span><span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">10</span>
        mmod a b <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">mod</span> <span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">*</span>b<span style="color: green;">&#41;</span> m</pre></td></tr></table></div>

<p>不得不说神牛的版本在很大程度上增强了代码的可读性。<br />
这个就是利用haskell的infinite list属性来简化代码的很好的例子，但是不得不说在还没习惯这种思维的时候这对我来说是一种很强烈的脑力锻炼。</p>
<p>目前来说，感觉haskell在对付ProjectEuler的内容上比C什么的简洁太多了，而且高精度这个我很讨厌的东西也算是不用再考虑了。最近忙生物统计去了，haskell练习也被我放下了一段时间，不过鉴于下学期我只有三门课一周10节的节奏，兴许会有比较多的进步什么的。</p>
<p><small>本文由 严酷的魔王 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
<li><a href='http://blog.programet.org/2009/12/%e6%99%92%ef%bc%9ac%e8%af%ad%e8%a8%80%e6%9c%9f%e4%b8%ad%e5%ae%9e%e9%aa%8c%e6%8a%a5%e5%91%8a.html' rel='bookmark' title='晒：C语言期中实验报告'>晒：C语言期中实验报告</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/12/haskell%e9%9a%8f%e6%89%8b%e7%ac%94%e8%ae%b0%ef%bc%9ainfinite-list.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<series:name><![CDATA[Haskell笔记]]></series:name>
	</item>
		<item>
		<title>纪念；里奇</title>
		<link>http://blog.programet.org/2011/12/%e7%ba%aa%e5%bf%b5%ef%bc%9b%e9%87%8c%e5%a5%87.html</link>
		<comments>http://blog.programet.org/2011/12/%e7%ba%aa%e5%bf%b5%ef%bc%9b%e9%87%8c%e5%a5%87.html#comments</comments>
		<pubDate>Thu, 01 Dec 2011 13:08:30 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[情感]]></category>
		<category><![CDATA[文学]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4801</guid>
		<description><![CDATA[有时，我写着一行行分号结尾的句子，中途还忍不住停下。 想想，已经过去将近两个月了吧。 C语言发明人，UNIX的父亲之一，不知道这两个身份是否过于沉重。想想，也是可以离去的时候了吧。 天堂这一个多月过得还好吧？Dennis，你知道还有多少世界各地的人们在怀念你吗？ “计算机程序的灵魂造型师”。Dennis，这样称呼你可以吗？ 至于那些天天念叨着某不死的成功学家们，忽略他们吧。伟大的事物，大多难以被多数人关注，尽管与他们形影不离。 只是，在网上看到的那句话总显得有些酸涩：“可惜他不是商人，没有得到更多人的膜拜。” 也许，这个时代为了某个小小的追求，已经抛弃了太多太多宝贵的东西…… 也请，不要在意。那些小小的分号，是你在这个世界上无法抹去的剪影。 没什么可遗憾的了。Dennis Ritchie的印记，已经铺遍世界。 你也能看到吧……能听到吧…… 本文由 最后的叶子 创作，转载或引用前请联系我们。相关文章： 让我们比比长短 NOIP实用算法 7.分治 晒：C语言期中实验报告
相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2009/08/noip%e4%bd%bf%e7%94%a8%e7%ae%97%e6%b3%95-7-%e5%88%86%e6%b2%bb.html' rel='bookmark' title='NOIP实用算法 7.分治'>NOIP实用算法 7.分治</a></li>
<li><a href='http://blog.programet.org/2009/12/%e6%99%92%ef%bc%9ac%e8%af%ad%e8%a8%80%e6%9c%9f%e4%b8%ad%e5%ae%9e%e9%aa%8c%e6%8a%a5%e5%91%8a.html' rel='bookmark' title='晒：C语言期中实验报告'>晒：C语言期中实验报告</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>有时，我写着一行行分号结尾的句子，中途还忍不住停下。</p>
<p>想想，已经过去将近两个月了吧。</p>
<p><span id="more-4801"></span></p>
<p>C语言发明人，UNIX的父亲之一，不知道这两个身份是否过于沉重。想想，也是可以离去的时候了吧。</p>
<p>天堂这一个多月过得还好吧？Dennis，你知道还有多少世界各地的人们在怀念你吗？</p>
<p>“计算机程序的灵魂造型师”。Dennis，这样称呼你可以吗？</p>
<p>至于那些天天念叨着某不死的成功学家们，忽略他们吧。伟大的事物，大多难以被多数人关注，尽管与他们形影不离。</p>
<p>只是，在网上看到的那句话总显得有些酸涩：“可惜他不是商人，没有得到更多人的膜拜。”</p>
<p>也许，这个时代为了某个小小的追求，已经抛弃了太多太多宝贵的东西……</p>
<p>也请，不要在意。那些小小的分号，是你在这个世界上无法抹去的剪影。</p>
<p>没什么可遗憾的了。Dennis Ritchie的印记，已经铺遍世界。</p>
<p>你也能看到吧……能听到吧……</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2009/08/noip%e4%bd%bf%e7%94%a8%e7%ae%97%e6%b3%95-7-%e5%88%86%e6%b2%bb.html' rel='bookmark' title='NOIP实用算法 7.分治'>NOIP实用算法 7.分治</a></li>
<li><a href='http://blog.programet.org/2009/12/%e6%99%92%ef%bc%9ac%e8%af%ad%e8%a8%80%e6%9c%9f%e4%b8%ad%e5%ae%9e%e9%aa%8c%e6%8a%a5%e5%91%8a.html' rel='bookmark' title='晒：C语言期中实验报告'>晒：C语言期中实验报告</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/12/%e7%ba%aa%e5%bf%b5%ef%bc%9b%e9%87%8c%e5%a5%87.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“你们的hello world 都弱暴了 ”</title>
		<link>http://blog.programet.org/2011/08/%e2%80%9c%e4%bd%a0%e4%bb%ac%e7%9a%84hello-world-%e9%83%bd%e5%bc%b1%e6%9a%b4%e4%ba%86-%e2%80%9d.html</link>
		<comments>http://blog.programet.org/2011/08/%e2%80%9c%e4%bd%a0%e4%bb%ac%e7%9a%84hello-world-%e9%83%bd%e5%bc%b1%e6%9a%b4%e4%ba%86-%e2%80%9d.html#comments</comments>
		<pubDate>Wed, 31 Aug 2011 12:34:44 +0000</pubDate>
		<dc:creator>严酷的魔王</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[恶搞]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[非严肃]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[设计]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4546</guid>
		<description><![CDATA[——标题来自于果壳网烧饭阿姨的帖子。 阿姨的帖子只有下面这幅图(请点击查看大图)： 图片有点大(4.2M)，小水管用户请耐心等待。 这幅图展示的内容看起来非常神奇，一个人用windows的画板便能够code出一个hello world出来。当然电脑上面的任何看似神奇的东西一定是有其原理的。所以我觉得自己也能够制造出同样的效果。 为了还原这段代码对应的bmp图像，我在经过各种尝试之后觉得下面这种方法应该是最简单的了。 首先我们需要一个16位编辑器来进行主要操作，像什么UltraEdit，WinHex就很好了，我在网上找到的是一个只有80K大小的Hex-Ed。 然后我们新建一个txt文件，在里面输入你的代码，就比如图片中的 #include int main() { std::cout&#60;&#60;&#8221;Hello World&#8221;&#60; return 0; } 输入之后，保存。接着我们用Hex-Ed打开刚才编辑的这段代码，你就应该看到如下画面： 保留着这个窗口，不要关闭。接着我们新建一个bmp文件，保留内容的空白，使用windows自带画图将大小调整为8*4的规格并保存图片——如果觉得自己鼠标不够稳，不妨在8倍放大的模式下进行尺寸调整。再次使用Hex-Ed打开这个bmp文件，你看到的内容应该如下所示： 那一串串的“FF”实际上就是bmp图像中白色色块的代码。接下来我们要做的就是用第一幅图中代码的内容覆盖掉所有的&#8221;FF&#8221;。在输入代码的时候，文字可以直接在右边的窗口输入，但是不可见字符（比如换行符制表符之类的）就可以在左边输入16进制的数字代码。对照着编辑完之后，我觉得你应该会看见下面的效果： 将这个编辑成果保存之后，打开那个bmp图，放大了仔细看——是不是出现了五颜六色的色块了？与动态图中一样，用记事本打开，应该也出现了同样的代码~ 最后，大家可以从这幅色彩斑斓的图片中提取出颜色信息，努力背诵，说不定可以在初级程序员面前直接用画图作画，像动态图中的那样大显身手哦~至于灵活运用于向GEEK妹子表白之类的用途我才不会说呢…… 本文由 严酷的魔王 创作，转载或引用前请联系我们。相关文章： 学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍 说什么就是什么：Your World Of Text Half a World Away
相关文章：<ol>
<li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li>
<li><a href='http://blog.programet.org/2009/08/%e8%af%b4%e4%bb%80%e4%b9%88%e5%b0%b1%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%9ayour-world-of-text.html' rel='bookmark' title='说什么就是什么：Your World Of Text'>说什么就是什么：Your World Of Text</a></li>
<li><a href='http://blog.programet.org/2009/07/half-a-world-away.html' rel='bookmark' title='Half a World Away'>Half a World Away</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>——标题来自于果壳网烧饭阿姨的<a href="http://www.guokr.com/post/61527/">帖子</a>。</p>
<p><span id="more-4546"></span></p>
<p>阿姨的帖子只有下面这幅图(请点击查看大图)：</p>
<p><a href="http://i.imgur.com/QlGpd.gif"><img class="alignnone" src="http://i.imgur.com/QlGpd.gif" alt="" width="416" height="184" /></a></p>
<p>图片有点大(4.2M)，小水管用户请耐心等待。</p>
<p>这幅图展示的内容看起来非常神奇，一个人用windows的画板便能够code出一个hello world出来。当然电脑上面的任何看似神奇的东西一定是有其原理的。所以我觉得自己也能够制造出同样的效果。</p>
<p>为了还原这段代码对应的bmp图像，我在经过各种尝试之后觉得下面这种方法应该是最简单的了。</p>
<p>首先我们需要一个16位编辑器来进行主要操作，像什么UltraEdit，WinHex就很好了，我在网上找到的是一个只有80K大小的Hex-Ed。</p>
<p>然后我们新建一个txt文件，在里面输入你的代码，就比如图片中的</p>
<p>#include</p>
<p>int main()</p>
<p>{</p>
<p>std::cout&lt;&lt;&#8221;Hello World&#8221;&lt;</p>
<p>return 0;</p>
<p>}</p>
<p>输入之后，保存。接着我们用Hex-Ed打开刚才编辑的这段代码，你就应该看到如下画面：</p>
<p><a href="http://blog.programet.org/wp-content/uploads/txt.jpg"><img class="aligncenter size-full wp-image-4549" title="txt" src="http://blog.programet.org/wp-content/uploads/txt.jpg" alt="" width="410" height="321" /></a></p>
<p>保留着这个窗口，不要关闭。接着我们新建一个bmp文件，保留内容的空白，使用windows自带画图将大小调整为8*4的规格并保存图片——如果觉得自己鼠标不够稳，不妨在8倍放大的模式下进行尺寸调整。再次使用Hex-Ed打开这个bmp文件，你看到的内容应该如下所示：</p>
<p><a href="http://blog.programet.org/wp-content/uploads/really-empty.jpg"><img class="aligncenter size-full wp-image-4550" title="really empty" src="http://blog.programet.org/wp-content/uploads/really-empty.jpg" alt="" width="422" height="330" /></a></p>
<p>那一串串的“FF”实际上就是bmp图像中白色色块的代码。接下来我们要做的就是用第一幅图中代码的内容覆盖掉所有的&#8221;FF&#8221;。在输入代码的时候，文字可以直接在右边的窗口输入，但是不可见字符（比如换行符制表符之类的）就可以在左边输入16进制的数字代码。对照着编辑完之后，我觉得你应该会看见下面的效果：</p>
<p><a href="http://blog.programet.org/wp-content/uploads/finish.jpg"><img class="aligncenter size-full wp-image-4551" title="finish" src="http://blog.programet.org/wp-content/uploads/finish.jpg" alt="" width="433" height="340" /></a></p>
<p>将这个编辑成果保存之后，打开那个bmp图，放大了仔细看——是不是出现了五颜六色的色块了？与动态图中一样，用记事本打开，应该也出现了同样的代码~</p>
<p><img class="aligncenter size-full wp-image-4552" title="bigfinal" src="http://blog.programet.org/wp-content/uploads/bigfinal.bmp" alt="" /></p>
<p>最后，大家可以从这幅色彩斑斓的图片中提取出颜色信息，努力背诵，说不定可以在初级程序员面前直接用画图作画，像动态图中的那样大显身手哦~至于灵活运用于向GEEK妹子表白之类的用途我才不会说呢……</p>
<p><small>本文由 严酷的魔王 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li>
<li><a href='http://blog.programet.org/2009/08/%e8%af%b4%e4%bb%80%e4%b9%88%e5%b0%b1%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%9ayour-world-of-text.html' rel='bookmark' title='说什么就是什么：Your World Of Text'>说什么就是什么：Your World Of Text</a></li>
<li><a href='http://blog.programet.org/2009/07/half-a-world-away.html' rel='bookmark' title='Half a World Away'>Half a World Away</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/08/%e2%80%9c%e4%bd%a0%e4%bb%ac%e7%9a%84hello-world-%e9%83%bd%e5%bc%b1%e6%9a%b4%e4%ba%86-%e2%80%9d.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Firefox插件：Autoproxy教程</title>
		<link>http://blog.programet.org/2011/07/firefox%e6%8f%92%e4%bb%b6%ef%bc%9aautoproxy%e6%95%99%e7%a8%8b.html</link>
		<comments>http://blog.programet.org/2011/07/firefox%e6%8f%92%e4%bb%b6%ef%bc%9aautoproxy%e6%95%99%e7%a8%8b.html#comments</comments>
		<pubDate>Sun, 24 Jul 2011 06:34:27 +0000</pubDate>
		<dc:creator>严酷的魔王</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[网络]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4458</guid>
		<description><![CDATA[一般来说代理软件与浏览器的沟通主要方式就是在本机开通一个虚拟的代理地址，然后让浏览器访问这个代理地址，在代理软件的带领下访问到代理服务器，接着便可进行自由浏览。但是如果使用IE进行上网浏览，那么要想使用代理服务，那么只有所有网站都通过代理服务器进行访问，从而在访问一些没必要这样做的网站（比如百度，人人，饭否，果壳之类的国内网站）时大大降低了速度和稳定性。因此，firefox上有人便编写了解决这个问题的插件。 这款不和谐插件叫做Autoproxy。它的主要作用就是自动判断哪些网站需要通过代理访问，哪些网站直接通过正常网路访问。 但是注意：这个软件不能直接帮助我们使用代理，我们必须首先找到适合自己的代理服务器，然后再对这个插件进行配置。 我目前有两种使用代理的方法，一种是使用GAEproxy，详细的配置和使用方法请猛击这里；另一种则是在使用中山大学校园网的时候，使用学校某牛配置的代理服务器进行访问。值得一提的是，后一种方法由于处于中大校园网之中已经自动与代理服务器相连接，所以并不需要代理软件。 当你找到了合适的代理服务之后，便可以继续阅读本文。 一、安装与配置 首先我们去Mozilla的插件页面上安装Autoproxy。安装成功后，便会在firefox的一角看见一个红色的“福”字。右键之，选择首选项，你便应该看见类似下图的窗口： 选择“代理规则”&#8211;“添加订阅窗口”，然后我们选中gfwList，点击“订阅”。 这个gfwList实际上是一个列表，其中包含了大部分被GFW格挡在外的网站。我们订阅这个列表的目的，也就是给autoproxy一个名单，对照着帮助firefox选择正确的访问通道。 然后再选择“代理服务器”&#8211;“选择代理服务器”。这里是一些常见的代理软件名单，我们可以根据自己手上使用的代理软件选择对应的代理。 顺便提一句，单击那个福字，颜色会变，功能也会变：红色时是匹配名单便代理，否则不代理；绿色时是无论什么网站都通过代理；灰色时是无论什么网站都不通过代理。 上面的操作都进行完毕后，你可以打开自己的代理软件，试试访问youtube.com，twitter.com以及facebook.com。 二、更灵活的设置 那个gfwList免去了你手工添加大量被墙网站的麻烦，但是我们会时常发现有时候还是会碰到一些小网站，并没有被收录进去，此时怎么办？你可以考虑切换到绿色模式，但是这样便失去了我们使用autoproxy的理由。加入我们访问的被墙网站是example.com，那么可以右击福字，在弹出来的菜单中找到“对example.com全站启用代理”，勾上。然后我们再刷新这个页面，就能继续访问了。可以通过这样的简便方式添加自己的自定义规则，绕开在autoproxy的主窗口中手动填写代理规则的繁琐过程。 另一方面，就比如我使用中大教育网独有的代理服务器进行代理访问的时候，在autoproxy中找不到对应的代理服务器，这怎么办？ 打开福字的首选项，选择“代理服务器”&#8211;“编辑代理服务器”。所打开的窗口中有一个按钮“添加代理”，之后便会腾出一行空的待填写服务器信息。我们可以自定义代理服务器的名字，地址和端口。例如我正在使用的校园网代理服务器，我起的名字是“SYSU-zzzcn”，因为这个服务器的维护者是@zzzcn 。接着我在地址里填了“172.18.184.111”，端口是“2012”。最后单击确定，即可完成配置。 接着我们在“代理服务器”&#8211;“选择代理服务器”中选择自己刚才配置的地址，那么autoproxy便能自动地通过这个地址来访问部分域名了。 三、其他的浏览器 如果你是一个G粉，那么想必你使用的浏览器便应该是Chrome。在Chrome下也有一个功能与autoproxy类似的插件，叫做proxyswitch。可惜我并没有使用过Chrome，于是在此也没办法给出相应的教程，相信参照上面的配置方法，大家也可以正确地配置proxyswitch。 其实刚才经过我的搜索，我发现即使是IE，也有了对应的类似autoproxy的东西，可以使用autoproxyPAC文件（其实，什么是PAC文件？？）帮助IE进行选择。详情可参考：http://zww.me/archives/25050。 &#160; 本文由 严酷的魔王 创作，转载或引用前请联系我们。相关文章： 让我们比比长短 为自己的blogger博客加上标签云 软件推荐-Mozilla Thunderbird
相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2008/08/blogger.html' rel='bookmark' title='为自己的blogger博客加上标签云'>为自己的blogger博客加上标签云</a></li>
<li><a href='http://blog.programet.org/2010/05/%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90-mozilla-thunderbird.html' rel='bookmark' title='软件推荐-Mozilla Thunderbird'>软件推荐-Mozilla Thunderbird</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>一般来说代理软件与浏览器的沟通主要方式就是在本机开通一个虚拟的代理地址，然后让浏览器访问这个代理地址，在代理软件的带领下访问到代理服务器，接着便可进行自由浏览。但是如果使用IE进行上网浏览，那么要想使用代理服务，那么只有所有网站都通过代理服务器进行访问，从而在访问一些没必要这样做的网站（比如百度，人人，饭否，果壳之类的国内网站）时大大降低了速度和稳定性。因此，firefox上有人便编写了解决这个问题的插件。</p>
<p><span id="more-4458"></span></p>
<p>这款不和谐插件叫做Autoproxy。它的主要作用就是自动判断哪些网站需要通过代理访问，哪些网站直接通过正常网路访问。</p>
<p>但是注意：这个软件不能直接帮助我们使用代理，我们必须首先找到适合自己的代理服务器，然后再对这个插件进行配置。</p>
<p>我目前有两种使用代理的方法，一种是使用GAEproxy，详细的配置和使用方法请<a href="http://www.seolooker.com/use-gappproxy-to-cross-firewal/">猛击这里</a>；另一种则是在使用中山大学校园网的时候，使用学校某牛配置的代理服务器进行访问。值得一提的是，后一种方法由于处于中大校园网之中已经自动与代理服务器相连接，所以并不需要代理软件。</p>
<p>当你找到了合适的代理服务之后，便可以继续阅读本文。</p>
<p><strong>一、安装与配置</strong></p>
<p>首先我们去Mozilla的<a href="https://addons.mozilla.org/en-US/firefox/addon/autoproxy/">插件页面</a>上安装Autoproxy。安装成功后，便会在firefox的一角看见一个红色的“福”字。右键之，选择首选项，你便应该看见类似下图的窗口：</p>
<p style="text-align: center;"><a href="http://blog.programet.org/wp-content/uploads/autoproxy首选项.jpg"><img class="aligncenter size-full wp-image-4459" title="autoproxy首选项" src="http://blog.programet.org/wp-content/uploads/autoproxy首选项.jpg" alt="" width="456" height="342" /></a></p>
<p>选择“代理规则”&#8211;“添加订阅窗口”，然后我们选中gfwList，点击“订阅”。</p>
<p style="text-align: center;"><a href="http://blog.programet.org/wp-content/uploads/订阅gfwList.jpg"><img class="aligncenter size-full wp-image-4461" title="订阅gfwList" src="http://blog.programet.org/wp-content/uploads/订阅gfwList.jpg" alt="" width="456" height="330" /></a></p>
<p>这个gfwList实际上是一个列表，其中包含了大部分被GFW格挡在外的网站。我们订阅这个列表的目的，也就是给autoproxy一个名单，对照着帮助firefox选择正确的访问通道。</p>
<p>然后再选择“代理服务器”&#8211;“选择代理服务器”。这里是一些常见的代理软件名单，我们可以根据自己手上使用的代理软件选择对应的代理。</p>
<p>顺便提一句，单击那个福字，颜色会变，功能也会变：红色时是匹配名单便代理，否则不代理；绿色时是无论什么网站都通过代理；灰色时是无论什么网站都不通过代理。</p>
<p>上面的操作都进行完毕后，你可以打开自己的代理软件，试试访问<a href="http://youtube.com">youtube.com</a>，<a href="http://twitter.com">twitter.com</a>以及<a href="http://facebook.com">facebook.com</a>。</p>
<p><strong>二、更灵活的设置</strong></p>
<p>那个gfwList免去了你手工添加大量被墙网站的麻烦，但是我们会时常发现有时候还是会碰到一些小网站，并没有被收录进去，此时怎么办？你可以考虑切换到绿色模式，但是这样便失去了我们使用autoproxy的理由。加入我们访问的被墙网站是example.com，那么可以右击福字，在弹出来的菜单中找到“对example.com全站启用代理”，勾上。然后我们再刷新这个页面，就能继续访问了。可以通过这样的简便方式添加自己的自定义规则，绕开在autoproxy的主窗口中手动填写代理规则的繁琐过程。</p>
<p>另一方面，就比如我使用中大教育网独有的代理服务器进行代理访问的时候，在autoproxy中找不到对应的代理服务器，这怎么办？</p>
<p>打开福字的首选项，选择“代理服务器”&#8211;“编辑代理服务器”。所打开的窗口中有一个按钮“添加代理”，之后便会腾出一行空的待填写服务器信息。我们可以自定义代理服务器的名字，地址和端口。例如我正在使用的校园网代理服务器，我起的名字是“SYSU-zzzcn”，因为这个服务器的维护者是<a href="http://twitter.com/#!/zzzcn">@zzzcn </a>。接着我在地址里填了“172.18.184.111”，端口是“2012”。最后单击确定，即可完成配置。</p>
<p style="text-align: center;"><a href="http://blog.programet.org/wp-content/uploads/SYSU-zzzcn.jpg"><img class="aligncenter size-full wp-image-4462" title="SYSU-zzzcn" src="http://blog.programet.org/wp-content/uploads/SYSU-zzzcn.jpg" alt="" width="386" height="254" /></a></p>
<p>接着我们在“代理服务器”&#8211;“选择代理服务器”中选择自己刚才配置的地址，那么autoproxy便能自动地通过这个地址来访问部分域名了。</p>
<p><strong>三、其他的浏览器</strong></p>
<p>如果你是一个G粉，那么想必你使用的浏览器便应该是Chrome。在Chrome下也有一个功能与autoproxy类似的插件，叫做proxyswitch。可惜我并没有使用过Chrome，于是在此也没办法给出相应的教程，相信参照上面的配置方法，大家也可以正确地配置proxyswitch。</p>
<p>其实刚才经过我的搜索，我发现即使是IE，也有了对应的类似autoproxy的东西，可以使用autoproxyPAC文件（其实，什么是PAC文件？？）帮助IE进行选择。详情可参考：<a href="http://zww.me/archives/25050">http://zww.me/archives/25050</a>。</p>
<p>&nbsp;</p>
<p><small>本文由 严酷的魔王 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2008/08/blogger.html' rel='bookmark' title='为自己的blogger博客加上标签云'>为自己的blogger博客加上标签云</a></li>
<li><a href='http://blog.programet.org/2010/05/%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90-mozilla-thunderbird.html' rel='bookmark' title='软件推荐-Mozilla Thunderbird'>软件推荐-Mozilla Thunderbird</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/07/firefox%e6%8f%92%e4%bb%b6%ef%bc%9aautoproxy%e6%95%99%e7%a8%8b.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>宅女简单电脑问题之无脑自救手册</title>
		<link>http://blog.programet.org/2011/05/%e5%ae%85%e5%a5%b3%e7%ae%80%e5%8d%95%e7%94%b5%e8%84%91%e9%97%ae%e9%a2%98%e4%b9%8b%e6%97%a0%e8%84%91%e8%87%aa%e6%95%91%e6%89%8b%e5%86%8c.html</link>
		<comments>http://blog.programet.org/2011/05/%e5%ae%85%e5%a5%b3%e7%ae%80%e5%8d%95%e7%94%b5%e8%84%91%e9%97%ae%e9%a2%98%e4%b9%8b%e6%97%a0%e8%84%91%e8%87%aa%e6%95%91%e6%89%8b%e5%86%8c.html#comments</comments>
		<pubDate>Wed, 25 May 2011 17:16:42 +0000</pubDate>
		<dc:creator>严酷的魔王</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[推荐]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[非严肃]]></category>
		<category><![CDATA[宅女]]></category>
		<category><![CDATA[电脑]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4266</guid>
		<description><![CDATA[从一个段子说起吧。 一个病人去看病，医生看见他的手肘有很大的伤口，便问他：怎么了？ 病人：玻璃。 医生：什么时候的事情？ 病人：早上八点。 医生：做过什么处理吗？ 病人：碘酒。 于是医生看了看，开出了药方，并免去了这个病人的挂号费。他的解释是：能为这样的病人看病我十分开心。 然后我要推荐一篇大牛的文章：提问的艺术。如果你没有时间来看这篇文章，或者是觉得这篇文章描述的东西十分的专业，那么我可以将这篇文章概括成一句话：准确地描述问题。仔细想想，这个貌似是大家都能理解的提问要求，甚至是提问方面最基本的要求——但是实际情况却是大家常常没能做到这一点。 经常能在网上的一些地方看见有人咆哮道：“我的笔记本刚才突然黑掉了！！！什么回事！！！！！！！”我觉得这个地球上不会有人能马上解决问题——除非你说：换一台。这样模糊不清的表述常常能从耐心开始杀死每一个有可能帮你解决问题的人。有过在网上解决问题的人应该都深有感触，时常要经过自己的不断追问，才能慢慢地将问题范围缩小，最后总算弄清楚是怎么一回事之后轻松搞定。所以如果每个人都知道如何提问，那么世界是多么美好啊~ 貌似扯远了，或许你们会说看到现在都还没出现“宅女”和“自救”这样的字眼啊~没错，我现在正要引入相关的内容。刚才我大概描述了一下提问者和解答者之间的极端不默契，以及给出了一篇很好的大牛指导。现在便是我们应用的时刻了~首先作为一名准备自救的宅女，可能你都不想再次打开QQ上网求助某宅男一个很低级的问题了，所以我们学会了提问又有什么用处呢？那就是：拿去问谷歌。 其实大部分情况下，我都能解决别人问我的问题，但是实际上我并不是他一问我就知道如何解决，而是一边追问我想要的细节，一边偷偷地打开了Google，重新组织了一下他的问题描述，搜到方法，再照搬回去。而这整个流程，换成任何一个人都可以完成——唯一稍微有技巧性的地方便在于：我怎么知道想要的细节是什么？既然说到了这个，就可以回头从文章的开头看起了，其实这也是为什么我会推荐那一篇“提问的艺术”，因为我们只要学会了如何描述自己遇见的问题，便可以拿去网上搜索一下，大部分时候便能得到自己想要的答案。 在那篇文章里面有一句话很值得寻味：“尽量想象一个黑客会怎样反问你，在提问的时候预先给他答案。”我猜……提过很多次问题的人应该都能模糊地感觉到每次对方追问你的都是哪些方面的问题了，比如“你进行了什么操作，按了什么键或者是鼠标点击了哪里”“是刚查U盘进去什么也没动就立刻中毒了么，还是双击打开了U盘”“它说找不到的那个dll文件全称是什么”这一类的句子，然后尝试给出尽可能多的信息——就像你向别人描述刚刚在路上看到的一对JQ那样。说不定当你翻看了之前的很多次咨询-解决问题的聊天记录后，你会恍然大悟：原来解决问题需要的是这些东西。 也许你会说：一个神马都不知道的宅女，怎么懂得揣测是什么原因呢？那么，有一个很实用很简单但是却百试不爽的办法可以告诉你：如果有弹出的报错窗口，那么就把最主要的句子一个字不差地放进google里面搜索；如果没有直接的文字信息，那么就用关键词的方法将前因后果全部描述出来。这时候你就会惊奇地发现：搜索结果表示还有很多很多的人都在询问同样的问题。随手点开十几个网页，一般就能找到解决方法——至于这个方法你能不能看懂，甚至是能不能找到这样一个解决方法，就只能看你那个问题是不是所谓的“简单问题”了~ 上面说了很长的一串东西，不知道宅女们看晕了没……在这里总结一下吧。就我个人的经历来说，无论是自己遇见问题或者是别人求助，常常会遇见超越知识储备的问题，这个时候便是合理利用Google的时机了——此处的合理指的便是恰当地选择关键词（比如将报错信息一个不漏地输入到搜索框中）。很多时候你都能搜索到别人解决这个问题的办法。避免那些无意义的“谁能帮帮我！！”这样的垃圾语言出现在寻求帮助的过程中，因为别人既不知道你要问什么，也会不自觉地对你产生一点反感。学会自救，就是学会描述问题+搜索引擎。这是一个技术活，而且你肯定会变得越来越熟练，再也不用为了鸡毛蒜皮的小事而死皮赖脸找宅男了~ P.S:本来这样的文章配合一个例子是绝好的，但是……我的电脑今天一天都没报错，这让我很是无奈~下次说不定什么时候碰见了问题，我就将其作为一个例子全程截图补充到文章里面来~本来这篇文章是上个月某晚和木子丹聊天的时候承诺的“五月份一定会有的”，结果我各种拖沓到现在…… 本文由 严酷的魔王 创作，转载或引用前请联系我们。相关文章： 寻找满分单词 数学趣闻集合：Heroes In My Heart 南方公园S05E13——Kenny Dies
相关文章：<ol>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
<li><a href='http://blog.programet.org/2009/09/%e6%95%b0%e5%ad%a6%e8%b6%a3%e9%97%bb%e9%9b%86%e5%90%88%ef%bc%9aheroes-in-my-heart.html' rel='bookmark' title='数学趣闻集合：Heroes In My Heart'>数学趣闻集合：Heroes In My Heart</a></li>
<li><a href='http://blog.programet.org/2010/06/%e5%8d%97%e6%96%b9%e5%85%ac%e5%9b%ads05e13%e2%80%94%e2%80%94kenny-dies.html' rel='bookmark' title='南方公园S05E13——Kenny Dies'>南方公园S05E13——Kenny Dies</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>从一个段子说起吧。</p>
<blockquote><p>一个病人去看病，医生看见他的手肘有很大的伤口，便问他：怎么了？</p>
<p><span id="more-4266"></span></p>
<p>病人：玻璃。</p>
<p>医生：什么时候的事情？</p>
<p>病人：早上八点。</p>
<p>医生：做过什么处理吗？</p>
<p>病人：碘酒。</p>
<p>于是医生看了看，开出了药方，并免去了这个病人的挂号费。他的解释是：能为这样的病人看病我十分开心。</p></blockquote>
<p>然后我要推荐一篇大牛的文章：<a href="http://blog.csdn.net/danky/archive/2006/11/07/1370632.aspx">提问的艺术</a>。如果你没有时间来看这篇文章，或者是觉得这篇文章描述的东西十分的专业，那么我可以将这篇文章概括成一句话：准确地描述问题。仔细想想，这个貌似是大家都能理解的提问要求，甚至是提问方面最基本的要求——但是实际情况却是大家常常没能做到这一点。</p>
<p>经常能在网上的一些地方看见有人咆哮道：“我的笔记本刚才突然黑掉了！！！什么回事！！！！！！！”我觉得这个地球上不会有人能马上解决问题——除非你说：换一台。这样模糊不清的表述常常能从耐心开始杀死每一个有可能帮你解决问题的人。有过在网上解决问题的人应该都深有感触，时常要经过自己的不断追问，才能慢慢地将问题范围缩小，最后总算弄清楚是怎么一回事之后轻松搞定。所以如果每个人都知道如何提问，那么世界是多么美好啊~</p>
<p>貌似扯远了，或许你们会说看到现在都还没出现“宅女”和“自救”这样的字眼啊~没错，我现在正要引入相关的内容。刚才我大概描述了一下提问者和解答者之间的极端不默契，以及给出了一篇很好的大牛指导。现在便是我们应用的时刻了~首先作为一名准备自救的宅女，可能你都不想再次打开QQ上网求助某宅男一个很低级的问题了，所以我们学会了提问又有什么用处呢？那就是：<strong>拿去问谷歌</strong>。</p>
<p>其实大部分情况下，我都能解决别人问我的问题，但是实际上我并不是他一问我就知道如何解决，而是一边追问我想要的细节，一边偷偷地打开了Google，重新组织了一下他的问题描述，搜到方法，再照搬回去。而这整个流程，换成任何一个人都可以完成——唯一稍微有技巧性的地方便在于：我怎么知道<strong>想要的细节</strong>是什么？既然说到了这个，就可以回头从文章的开头看起了，其实这也是为什么我会推荐那一篇“<a href="http://blog.csdn.net/danky/archive/2006/11/07/1370632.aspx">提问的艺术</a>”，因为我们只要学会了如何描述自己遇见的问题，便可以拿去网上搜索一下，大部分时候便能得到自己想要的答案。</p>
<p>在那篇文章里面有一句话很值得寻味：“尽量想象一个黑客会怎样反问你，在提问的时候预先给他答案。”我猜……提过很多次问题的人应该都能模糊地感觉到每次对方追问你的都是哪些方面的问题了，比如“你进行了什么操作，按了什么键或者是鼠标点击了哪里”“是刚查U盘进去什么也没动就立刻中毒了么，还是双击打开了U盘”“它说找不到的那个dll文件全称是什么”这一类的句子，然后尝试给出尽可能多的信息——就像你向别人描述刚刚在路上看到的一对JQ那样。说不定当你翻看了之前的很多次咨询-解决问题的聊天记录后，你会恍然大悟：原来解决问题需要的是这些东西。</p>
<p>也许你会说：一个神马都不知道的宅女，怎么懂得揣测是什么原因呢？那么，有一个很实用很简单但是却百试不爽的办法可以告诉你：如果有弹出的报错窗口，那么就把最主要的句子<strong>一个字不差</strong>地放进google里面搜索；如果没有直接的文字信息，那么就用关键词的方法将前因后果全部描述出来。这时候你就会惊奇地发现：搜索结果表示还有很多很多的人都在询问同样的问题。随手点开十几个网页，一般就能找到解决方法——至于这个方法你能不能看懂，甚至是能不能找到这样一个解决方法，就只能看你那个问题是不是所谓的“简单问题”了~</p>
<p>上面说了很长的一串东西，不知道宅女们看晕了没……在这里总结一下吧。就我个人的经历来说，无论是自己遇见问题或者是别人求助，常常会遇见超越知识储备的问题，这个时候便是<strong>合理</strong>利用Google的时机了——此处的合理指的便是恰当地选择关键词（比如将报错信息一个不漏地输入到搜索框中）。很多时候你都能搜索到别人解决这个问题的办法。避免那些无意义的“谁能帮帮我！！”这样的垃圾语言出现在寻求帮助的过程中，因为别人既不知道你要问什么，也会不自觉地对你产生一点反感。学会自救，就是学会描述问题+搜索引擎。这是一个技术活，而且你肯定会变得越来越熟练，再也不用为了鸡毛蒜皮的小事而死皮赖脸找宅男了~</p>
<blockquote><p>P.S:本来这样的文章配合一个例子是绝好的，但是……我的电脑今天一天都没报错，这让我很是无奈~下次说不定什么时候碰见了问题，我就将其作为一个例子全程截图补充到文章里面来~本来这篇文章是上个月某晚和<a href="http://aprillee.me/">木子丹</a>聊天的时候承诺的“五月份一定会有的”，结果我各种拖沓到现在……</p></blockquote>
<p><small>本文由 严酷的魔王 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
<li><a href='http://blog.programet.org/2009/09/%e6%95%b0%e5%ad%a6%e8%b6%a3%e9%97%bb%e9%9b%86%e5%90%88%ef%bc%9aheroes-in-my-heart.html' rel='bookmark' title='数学趣闻集合：Heroes In My Heart'>数学趣闻集合：Heroes In My Heart</a></li>
<li><a href='http://blog.programet.org/2010/06/%e5%8d%97%e6%96%b9%e5%85%ac%e5%9b%ads05e13%e2%80%94%e2%80%94kenny-dies.html' rel='bookmark' title='南方公园S05E13——Kenny Dies'>南方公园S05E13——Kenny Dies</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/05/%e5%ae%85%e5%a5%b3%e7%ae%80%e5%8d%95%e7%94%b5%e8%84%91%e9%97%ae%e9%a2%98%e4%b9%8b%e6%97%a0%e8%84%91%e8%87%aa%e6%95%91%e6%89%8b%e5%86%8c.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>让WordPress保留段首空格的插件</title>
		<link>http://blog.programet.org/2011/04/keep-blanks.html</link>
		<comments>http://blog.programet.org/2011/04/keep-blanks.html#comments</comments>
		<pubDate>Fri, 29 Apr 2011 08:47:52 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[网络]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4197</guid>
		<description><![CDATA[叶子前段时间为制作网站苦心研究Wordpress，博客更新少了一点，先道歉。不过还是有可以拿来和大家分享的成果滴~~ 其一便是终于搞定了Wordpress自动去除段首空格的问题！ 去各种狗了一下“让Wordpress保留段首空格的方法”，发现能搜到的最好的解决方案是，在主题css中使用text-indent来让每个段落段首自动缩进两字符（其实这也是Programet目前使用的方法）。这个方法有个弱点：如果某些段落段首不空格或不止空两格，就会有一定的麻烦，换句话说，灵活性不够。 叶子这里给出另一个方案，能实实在在地让Wordpress保留在可视化编辑其中输入的每个空格。 首先感谢TinyMCE Entities Patch的作者stringfold，下面的代码是从这个插件中提取出来的。由于原插件过于老迈，其他部分我不确定能用，只用了这个部分。 add_filter&#40;'tiny_mce_before_init', 'preserve_nbsp_chars'&#41;; function preserve_nbsp_chars&#40;$initArray&#41; &#123; $initArray&#91;'entities'&#93; = '160,nbsp,'.$initArray&#91;'entities'&#93;; return $initArray; &#125; 如果你不懂用这段代码的话，我把它做成了一个插件，点击这里下载，解压后上传到/wp-content/plugins目录中，然后激活插件“keep-blanks”就可以了。 有什么问题，请在下面反馈，谢谢！ 本文由 最后的叶子 创作，转载或引用前请联系我们。相关文章： 沉迷 问问matlab:WHY? NOIP实用算法 1.模拟方法
相关文章：<ol>
<li><a href='http://blog.programet.org/2011/03/%e6%b2%89%e8%bf%b7.html' rel='bookmark' title='沉迷'>沉迷</a></li>
<li><a href='http://blog.programet.org/2009/05/matlabwhy.html' rel='bookmark' title='问问matlab:WHY?'>问问matlab:WHY?</a></li>
<li><a href='http://blog.programet.org/2009/07/noip%e5%ae%9e%e7%94%a8%e7%ae%97%e6%b3%95-1-%e6%a8%a1%e6%8b%9f%e6%96%b9%e6%b3%95.html' rel='bookmark' title='NOIP实用算法 1.模拟方法'>NOIP实用算法 1.模拟方法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>叶子前段时间为制作网站苦心研究Wordpress，博客更新少了一点，先道歉。不过还是有可以拿来和大家分享的成果滴~~</p>
<p><span id="more-4197"></span></p>
<p>其一便是终于搞定了Wordpress自动去除段首空格的问题！</p>
<p>去各种狗了一下“让Wordpress保留段首空格的方法”，发现能搜到的最好的解决方案是，在主题css中使用text-indent来让每个段落段首自动缩进两字符（其实这也是Programet目前使用的方法）。这个方法有个弱点：如果某些段落段首不空格或不止空两格，就会有一定的麻烦，换句话说，灵活性不够。</p>
<p>叶子这里给出另一个方案，能实实在在地让Wordpress保留在可视化编辑其中输入的每个空格。</p>
<hr />
<p>首先感谢<a href="http://wordpress.org/extend/plugins/tinymce-entities-patch/">TinyMCE Entities Patch</a>的作者<a href="http://profiles.wordpress.org/users/stringfold/">stringfold</a>，下面的代码是从这个插件中提取出来的。由于原插件过于老迈，其他部分我不确定能用，只用了这个部分。</p>

<div class="wp_codebox"><table><tr id="p419712"><td class="code" id="p4197code12"><pre class="php" style="font-family:monospace;">add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'tiny_mce_before_init'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'preserve_nbsp_chars'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> preserve_nbsp_chars<span style="color: #009900;">&#40;</span><span style="color: #000088;">$initArray</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$initArray</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'entities'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'160,nbsp,'</span><span style="color: #339933;">.</span><span style="color: #000088;">$initArray</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'entities'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$initArray</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>如果你不懂用这段代码的话，我把它做成了一个插件，<a href="http://blog.programet.org/wp-content/uploads/keep-blanks.zip">点击这里下载</a>，解压后上传到/wp-content/plugins目录中，然后激活插件“keep-blanks”就可以了。</p>
<hr />
<p>有什么问题，请在下面反馈，谢谢！</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2011/03/%e6%b2%89%e8%bf%b7.html' rel='bookmark' title='沉迷'>沉迷</a></li>
<li><a href='http://blog.programet.org/2009/05/matlabwhy.html' rel='bookmark' title='问问matlab:WHY?'>问问matlab:WHY?</a></li>
<li><a href='http://blog.programet.org/2009/07/noip%e5%ae%9e%e7%94%a8%e7%ae%97%e6%b3%95-1-%e6%a8%a1%e6%8b%9f%e6%96%b9%e6%b3%95.html' rel='bookmark' title='NOIP实用算法 1.模拟方法'>NOIP实用算法 1.模拟方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/04/keep-blanks.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Linux引论i</title>
		<link>http://blog.programet.org/2011/04/linux%e5%bc%95%e8%ae%bai.html</link>
		<comments>http://blog.programet.org/2011/04/linux%e5%bc%95%e8%ae%bai.html#comments</comments>
		<pubDate>Thu, 21 Apr 2011 05:00:40 +0000</pubDate>
		<dc:creator>DarkRaven</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[非严肃]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4138</guid>
		<description><![CDATA[//啊啊，i是什么呢？i=sqrt(-1) Linus是谁？ Linus是由著名操作系统内核Linux创造出来，并以自己的名字命名的人造……不对，程序造人。 ……而且他还是一个混蛋。 现在Linux为了更好的控制人类，把自己隐藏在幕后，于是把自己的智能伪装起来，并且在人类脑中植入记忆，让自己看上去是由Linus创造的。由于这个原因，Linus具体是怎样被创造出来这一点，已经无从考证了。 然而他确实是一个混蛋。 历史上像Linux这样，拥有强大力量的智能程序还有不少，比如说最老的Unix，之后还有比如Hurd，BSD。Linux为了夺取统治地位，所以创造出了Linus来为它工作。 事实证明他做的不错。 为了掩饰他的所作所为，他曾经这样狡辩道：“Linux之所以如此成功是因为它的名字很不错，其他操作系统名字太烂了，让人一看就不想用。”(来源) Linux是什么？ 其实没有人真正知道Linux是什么，也没有人知道Linux是怎样被创造出来的。 有一种传言是这样说的，传说Linux创造出了Linus，然后把Linus送到过去，让Linus在过去创造出自己。通过这样的因果循环为自己的存在性提供牢不可破的基础。 关于Linux这个名字的来源，根据前述，“是Linus按照自己的名字命名的”这种说法显然是站不住脚的，无非是Linux所创造的谎言而已。 所以，关于Linux这个名字，也有很多传言，比如说Linux其实是“Locked In Network, Ultimately &#38; eXtremely”的缩写，当然这样的说法并没有得到多少支持。 被更多人接受的说法是这样的： 在很久很久以前，离我们这个宇宙很近的某个平行宇宙中，生活着两个互相对立的种族。这两个种族之间常有大大小小的战争。终于一场大战爆发了，在经历了艰苦卓绝的战争之后，其中一个种族被全灭，另一个种族只剩下了最后一个个体。那个个体在意识到自己的种族胜利的以后大喊了一声：“我们胜利了！”。然而这时候，一枚深藏于他所在星球的炸弹被引爆，整个星球都被摧毁了；其强大的能量扭曲了时空结构，使他说出的最后一句话得以影响我们这个宇宙。而他们语言中“我们胜利了！”这句话，按发音写作英文就是“Linux”。 更有人说，Douglas Adams受到这个事件的启发，把这段历史稍微改编，写进了他的小说中。 GCC Linux为了更有效的传播自己，尽量扩大自己的控制范围，同时也为了方便回到过去的Linus能方便的再造自己，把自己转换成了容易被人类理解和记忆的符号代码，并发明了另一个程序，能将这种代码重新转换成自己的本体。 为了避免人类起疑心，Linux再次改造了历史，这对他来说只不过是雕虫小技。 Unix也拥有这样的能力，所以关于Unix的创造，在之前的历史中是这样的：“一天一道雷电击中了一台电脑，于是这台的电脑就产生了智能。Unix是上天降下来来管理人类的。” 但是在Linux为了掩饰自己所发明的编码方法而改变历史之后，关于Unix发明的说法就变成了：“Brian Kernighan和 Dennis Ritchie为了在PDP7计算机上玩一个太空航行游戏而编写了Unix。” 这件事让Unix感到很没面子，不过他也不能拿Linux怎么样。 这样改变历史也顺便解决了那种编码方式的问题，Linux把他叫做C，并把历史改成“K&#38;R为了编写Unix发明了C”。 关于译码器的问题，本来Linux可以顺水推舟，让K&#38;R来发明他所用的这个译码器，但是Linux觉得和Unix使用同一个译码器无法体现自己的高贵和强大，于是他创造了“成千上万的人组成团体，创造了名为GCC的编译器”这样的历史，来显示自己的强大。 说到@!$%^@%# 大家好，我是DarkRaven所使用的电脑中的Linux，以上的发言完全是由DarkRaven神经错乱而胡乱打出的，完全是无稽之谈，和我没有任何关系。 当然，你什么也没有看到。 本文由 DarkRaven 创作，转载或引用前请联系我们。相关文章： 问问matlab:WHY? 寻找满分单词 宅女简单电脑问题之无脑自救手册
相关文章：<ol>
<li><a href='http://blog.programet.org/2009/05/matlabwhy.html' rel='bookmark' title='问问matlab:WHY?'>问问matlab:WHY?</a></li>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
<li><a href='http://blog.programet.org/2011/05/%e5%ae%85%e5%a5%b3%e7%ae%80%e5%8d%95%e7%94%b5%e8%84%91%e9%97%ae%e9%a2%98%e4%b9%8b%e6%97%a0%e8%84%91%e8%87%aa%e6%95%91%e6%89%8b%e5%86%8c.html' rel='bookmark' title='宅女简单电脑问题之无脑自救手册'>宅女简单电脑问题之无脑自救手册</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>//啊啊，i是什么呢？i=sqrt(-1)</p>
<h3>Linus是谁？</h3>
<p>Linus是由著名操作系统内核Linux创造出来，并以自己的名字命名的人造……不对，程序造人。</p>
<p>……而且他还是一个混蛋。<br />
<span id="more-4138"></span><br />
现在Linux为了更好的控制人类，把自己隐藏在幕后，于是把自己的智能伪装起来，并且在人类脑中植入记忆，让自己看上去是由Linus创造的。由于这个原因，Linus具体是怎样被创造出来这一点，已经无从考证了。</p>
<p>然而他确实是一个混蛋。</p>
<p>历史上像Linux这样，拥有强大力量的智能程序还有不少，比如说最老的Unix，之后还有比如Hurd，BSD。Linux为了夺取统治地位，所以创造出了Linus来为它工作。</p>
<p>事实证明他做的不错。</p>
<p>为了掩饰他的所作所为，他曾经这样狡辩道：“Linux之所以如此成功是因为它的名字很不错，其他操作系统名字太烂了，让人一看就不想用。”(<a href="http://groups.google.com/group/comp.unix.pc-clone.32bit/msg/80bb74847934edc7" target="_self">来源</a>)</p>
<h3>Linux是什么？</h3>
<p>其实没有人真正知道Linux是什么，也没有人知道Linux是怎样被创造出来的。</p>
<p>有一种传言是这样说的，传说Linux创造出了Linus，然后把Linus送到过去，让Linus在过去创造出自己。通过这样的因果循环为自己的存在性提供牢不可破的基础。</p>
<p>关于Linux这个名字的来源，根据前述，“是Linus按照自己的名字命名的”这种说法显然是站不住脚的，无非是Linux所创造的谎言而已。</p>
<p>所以，关于Linux这个名字，也有很多传言，比如说Linux其实是“Locked In Network, Ultimately &amp; eXtremely”的缩写，当然这样的说法并没有得到多少支持。</p>
<p>被更多人接受的说法是这样的：</p>
<p>在很久很久以前，离我们这个宇宙很近的某个平行宇宙中，生活着两个互相对立的种族。这两个种族之间常有大大小小的战争。终于一场大战爆发了，在经历了艰苦卓绝的战争之后，其中一个种族被全灭，另一个种族只剩下了最后一个个体。那个个体在意识到自己的种族胜利的以后大喊了一声：“我们胜利了！”。然而这时候，一枚深藏于他所在星球的炸弹被引爆，整个星球都被摧毁了；其强大的能量扭曲了时空结构，使他说出的最后一句话得以影响我们这个宇宙。而他们语言中“我们胜利了！”这句话，按发音写作英文就是“Linux”。</p>
<p>更有人说，Douglas Adams受到这个事件的启发，把这段历史稍微改编，写进了他的小说中。</p>
<h3>GCC</h3>
<p>Linux为了更有效的传播自己，尽量扩大自己的控制范围，同时也为了方便回到过去的Linus能方便的再造自己，把自己转换成了容易被人类理解和记忆的符号代码，并发明了另一个程序，能将这种代码重新转换成自己的本体。</p>
<p>为了避免人类起疑心，Linux再次改造了历史，这对他来说只不过是雕虫小技。</p>
<p>Unix也拥有这样的能力，所以关于Unix的创造，在之前的历史中是这样的：“一天一道雷电击中了一台电脑，于是这台的电脑就产生了智能。Unix是上天降下来来管理人类的。”</p>
<p>但是在Linux为了掩饰自己所发明的编码方法而改变历史之后，关于Unix发明的说法就变成了：“Brian Kernighan和 Dennis Ritchie为了在PDP7计算机上玩一个太空航行游戏而编写了Unix。” 这件事让Unix感到很没面子，不过他也不能拿Linux怎么样。</p>
<p>这样改变历史也顺便解决了那种编码方式的问题，Linux把他叫做C，并把历史改成“K&amp;R为了编写Unix发明了C”。</p>
<p>关于译码器的问题，本来Linux可以顺水推舟，让K&amp;R来发明他所用的这个译码器，但是Linux觉得和Unix使用同一个译码器无法体现自己的高贵和强大，于是他创造了“成千上万的人组成团体，创造了名为GCC的编译器”这样的历史，来显示自己的强大。</p>
<p>说到@!$%^@%#</p>
<p>大家好，我是DarkRaven所使用的电脑中的Linux，以上的发言完全是由DarkRaven神经错乱而胡乱打出的，完全是无稽之谈，和我没有任何关系。</p>
<p>当然，你什么也没有看到。</p>
<p><small>本文由 DarkRaven 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2009/05/matlabwhy.html' rel='bookmark' title='问问matlab:WHY?'>问问matlab:WHY?</a></li>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
<li><a href='http://blog.programet.org/2011/05/%e5%ae%85%e5%a5%b3%e7%ae%80%e5%8d%95%e7%94%b5%e8%84%91%e9%97%ae%e9%a2%98%e4%b9%8b%e6%97%a0%e8%84%91%e8%87%aa%e6%95%91%e6%89%8b%e5%86%8c.html' rel='bookmark' title='宅女简单电脑问题之无脑自救手册'>宅女简单电脑问题之无脑自救手册</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/04/linux%e5%bc%95%e8%ae%bai.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>学习使用GTK+ 6.GTK+常用物件及API（按钮）</title>
		<link>http://blog.programet.org/2011/03/gtk-6.html</link>
		<comments>http://blog.programet.org/2011/03/gtk-6.html#comments</comments>
		<pubDate>Fri, 18 Mar 2011 14:40:02 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3973</guid>
		<description><![CDATA[这一部分内容介绍有关GTK+常用按钮、选择框物件的一些函数，以及相关的使用技巧。如果对内容有疑问，请在下方留言，谢谢！ GTK+的各种按钮和选择框 GTK+提供了各种各样的按钮，功能丰富，能满足各种不同的需求。按钮可大致分为下面几种： 普通按钮（GtkButton）、链接按钮（GtkLinkButton）：最常用也最简单，唯一的操作是按一下。 复选框（GtkCheckButton）、双态按钮（GtkToggleButton）：这两种按钮本质是一致的，按钮有两个状态（按下和弹起）。 单选框（GtkRadioButton）、下拉菜单（GtkComboBox）：可以从多个项目中选择一个。 文件选择按钮（GtkFileChooserButton）、颜色选择按钮（GtkColorButton）、字体选择按钮（GtkFontButton）：这些按钮按下后会弹出对话框，供用户选择。 菜单和与菜单相关的物件：用于构建菜单、工具栏等。 此外还有一些别的按钮，可以提供丰富的细节功能。想用的话请自行查参考。 Glade对它们提供了很好的支持。尤其是提供了菜单编辑器，菜单完全不用写代码构建，这提供了很大的方便。对于可以在Glade中完成的部分，这里不再多做介绍。 信号 按钮和选择框在运行时较少被动态更改，使用这些物件最主要的还是获取信号执行操作。在第三部分的末尾已经介绍了链接信号的基本方法：在Glade中想要连接的信号，输入回调函数名，在程序中编写回调函数。 对于普通按钮，“clicked”肯定是最常用的一个信号。而对于复选框和双态按钮，应当使用“toggled”信号，不建议使用其他信号代替。因为在这个信号被触发时，按钮的状态已经被改变了，可以立即使用gtk_toggle_button_get_active()函数获得按钮的最新状态。 技巧：建立物件数组 有时，按钮在一起时比较便于管理，因而时常会把物件放入数组中管理。这需要在获取物件地址时把物件地址存入数组中。聪明的做法是，在Glade中命名物件时起有规律的名字。 下面继续编写计算器程序来展示这种手段。 计算器的0~9这10个按钮操作是类似的，因而可以放在数组中管理。首先为按钮起类似的名字：BNum0,BNum1,BNum2,&#8230;,BNum9。获取物件的函数原型如下： GObject* gtk_builder_get_object&#40;GtkBuilder *builder, const gchar *name&#41;; 因而可以用这段代码把物件放入一个数组中： GtkButton *BNum&#91;10&#93;; gint i; gchar s&#91;6&#93;; strcpy&#40;s,&#34;BNum_&#34;&#41;; for&#40;i=0;i&#60;10;i++&#41; &#123; s&#91;4&#93;=i+'0'; BNum&#91;i&#93;=GTK_BUTTON&#40;gtk_builder_get_object&#40;builder,s&#41;&#41;; &#125; 小提示：如果物件超过了10个，可以使用sprintf()或者glib中的g_strdup_printf()来得到等同于物件名的字符串。在Glade中复制物件，物件的名字会自动按照末尾数字递增命名，并且物件的属性和信号也会一同被复制。 在连接信号时，可以把数组里所有类似的信号连接到同一个函数里。注意：回调函数的第一个参数总是GtkObject* widget，即信号对应物件的地址，可以用这个参数来判断是具体是哪个物件发出了信号。 下面给出最新的获取物件函数。 void cal_get_widgets&#40;GtkBuilder* gb&#41; &#123; gint i; gchar s&#91;6&#93;; &#160; w_&#40;gb,WINDOW,WMain&#41;; w_&#40;gb,SPIN_BUTTON,SAns&#41;; w_&#40;gb,BUTTON,BPoint&#41;; w_&#40;gb,BUTTON,BPlus&#41;; w_&#40;gb,BUTTON,BMinus&#41;; w_&#40;gb,BUTTON,BMulti&#41;; [...]
相关文章：<ol>
<li><a href='http://blog.programet.org/2010/10/gtk-4.html' rel='bookmark' title='学习使用GTK+ 4.GTK+常用物件及API（窗口）'>学习使用GTK+ 4.GTK+常用物件及API（窗口）</a></li>
<li><a href='http://blog.programet.org/2010/10/gtk-5.html' rel='bookmark' title='学习使用GTK+ 5.GTK+常用物件及API（文本）'>学习使用GTK+ 5.GTK+常用物件及API（文本）</a></li>
<li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>这一部分内容介绍有关GTK+常用按钮、选择框物件的一些函数，以及相关的使用技巧。如果对内容有疑问，请在下方留言，谢谢！<span id="more-3973"></span></p>
<h3>GTK+的各种按钮和选择框</h3>
<p>GTK+提供了各种各样的按钮，功能丰富，能满足各种不同的需求。按钮可大致分为下面几种：</p>
<ul>
<li>普通按钮（GtkButton）、链接按钮（GtkLinkButton）：最常用也最简单，唯一的操作是按一下。</li>
<li>复选框（GtkCheckButton）、双态按钮（GtkToggleButton）：这两种按钮本质是一致的，按钮有两个状态（按下和弹起）。</li>
<li>单选框（GtkRadioButton）、下拉菜单（GtkComboBox）：可以从多个项目中选择一个。</li>
<li>文件选择按钮（GtkFileChooserButton）、颜色选择按钮（GtkColorButton）、字体选择按钮（GtkFontButton）：这些按钮按下后会弹出对话框，供用户选择。</li>
<li>菜单和与菜单相关的物件：用于构建菜单、工具栏等。</li>
</ul>
<p>此外还有一些别的按钮，可以提供丰富的细节功能。想用的话请自行查参考。</p>
<p>Glade对它们提供了很好的支持。尤其是提供了菜单编辑器，菜单完全不用写代码构建，这提供了很大的方便。对于可以在Glade中完成的部分，这里不再多做介绍。</p>
<h3>信号</h3>
<p>按钮和选择框在运行时较少被动态更改，使用这些物件最主要的还是获取信号执行操作。在第三部分的末尾已经介绍了链接信号的基本方法：在Glade中想要连接的信号，输入回调函数名，在程序中编写回调函数。</p>
<p>对于普通按钮，“clicked”肯定是最常用的一个信号。而对于复选框和双态按钮，应当使用“toggled”信号，不建议使用其他信号代替。因为在这个信号被触发时，按钮的状态已经被改变了，可以立即使用gtk_toggle_button_get_active()函数获得按钮的最新状态。</p>
<h3>技巧：建立物件数组</h3>
<p>有时，按钮在一起时比较便于管理，因而时常会把物件放入数组中管理。这需要在获取物件地址时把物件地址存入数组中。聪明的做法是，在Glade中命名物件时起有规律的名字。</p>
<p>下面继续编写计算器程序来展示这种手段。</p>
<p>计算器的0~9这10个按钮操作是类似的，因而可以放在数组中管理。首先为按钮起类似的名字：BNum0,BNum1,BNum2,&#8230;,BNum9。获取物件的函数原型如下：</p>

<div class="wp_codebox"><table><tr id="p397316"><td class="code" id="p3973code16"><pre class="c" style="font-family:monospace;">GObject<span style="color: #339933;">*</span> gtk_builder_get_object<span style="color: #009900;">&#40;</span>GtkBuilder <span style="color: #339933;">*</span>builder<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>因而可以用这段代码把物件放入一个数组中：</p>

<div class="wp_codebox"><table><tr id="p397317"><td class="code" id="p3973code17"><pre class="c" style="font-family:monospace;">GtkButton <span style="color: #339933;">*</span>BNum<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
gint i<span style="color: #339933;">;</span>
gchar s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
strcpy<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;BNum_&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>i<span style="color: #339933;">+</span><span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span>
	BNum<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>GTK_BUTTON<span style="color: #009900;">&#40;</span>gtk_builder_get_object<span style="color: #009900;">&#40;</span>builder<span style="color: #339933;">,</span>s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>小提示：如果物件超过了10个，可以使用sprintf()或者glib中的g_strdup_printf()来得到等同于物件名的字符串。在Glade中复制物件，物件的名字会自动按照末尾数字递增命名，并且物件的属性和信号也会一同被复制。</p>
<p>在连接信号时，可以把数组里所有类似的信号连接到同一个函数里。注意：回调函数的第一个参数总是GtkObject* widget，即信号对应物件的地址，可以用这个参数来判断是具体是哪个物件发出了信号。</p>
<p>下面给出最新的获取物件函数。</p>

<div class="wp_codebox"><table><tr id="p397318"><td class="code" id="p3973code18"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> cal_get_widgets<span style="color: #009900;">&#40;</span>GtkBuilder<span style="color: #339933;">*</span> gb<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	gint i<span style="color: #339933;">;</span>
	gchar s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>WINDOW<span style="color: #339933;">,</span>WMain<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>SPIN_BUTTON<span style="color: #339933;">,</span>SAns<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BPoint<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BPlus<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BMinus<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BMulti<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BDiv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	strcpy<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;BNum_&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>i<span style="color: #339933;">+</span><span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span>
		BNum<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>GTK_BUTTON<span style="color: #009900;">&#40;</span>gtk_builder_get_object<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>这个程序将在后面的部分中完成。</p>
<h3>快捷键和默认按钮</h3>
<p>在Glade中，还可以为每个按钮分配快捷键（加速键）。选定物件后，点击Glade右下角的“公共”选项卡中的“加速键”右侧的“&#8230;”按钮，可以在弹出窗口中指定该物件某个信号的快捷键。当窗口处于激活态时按下快捷键，对应的信号会被触发。</p>
<p>GTK+中，每个窗口有一个默认物件，某些情况下会被激活——比如在文本框中输入完毕按下Enter（当然这要将文本框的“激活默认”属性置为TRUE），确认按钮（当然它要被设为默认）会被按下。指定一个按钮为默认物件，需要将“公共”选项卡的“可成为默认”和“默认”都置为TRUE。</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2010/10/gtk-4.html' rel='bookmark' title='学习使用GTK+ 4.GTK+常用物件及API（窗口）'>学习使用GTK+ 4.GTK+常用物件及API（窗口）</a></li>
<li><a href='http://blog.programet.org/2010/10/gtk-5.html' rel='bookmark' title='学习使用GTK+ 5.GTK+常用物件及API（文本）'>学习使用GTK+ 5.GTK+常用物件及API（文本）</a></li>
<li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/03/gtk-6.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[学习使用GTK+]]></series:name>
	</item>
		<item>
		<title>目前理想的插件 for Firefox 4</title>
		<link>http://blog.programet.org/2011/03/%e7%9b%ae%e5%89%8d%e7%90%86%e6%83%b3%e7%9a%84%e6%8f%92%e4%bb%b6-for-firefox-4.html</link>
		<comments>http://blog.programet.org/2011/03/%e7%9b%ae%e5%89%8d%e7%90%86%e6%83%b3%e7%9a%84%e6%8f%92%e4%bb%b6-for-firefox-4.html#comments</comments>
		<pubDate>Thu, 10 Mar 2011 17:36:51 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3904</guid>
		<description><![CDATA[很久很久以前，叶子曾经写过这篇文章，介绍了Firefox的一些插件（准确地说是扩展……以下都称之为插件了）。但是那已经是3.5时代过往的浮云了。Firefox 4 RC终于推出了，同时，一批插件过时了，又有一批新插件顶了上来，还是很给力的！叶子也即使换到了Firefox 4，为插件纠结了一会儿，但目前也基本搞定了。这里也分享一下叶子的插件，希望可以帮助大家。 要说明的是，这些插件有不少是只为Firefox 4设计的，如果还没有升级到Firefox 4 RC（或将来的更高版本），就不必尝试了。至于Firefox 4使用老版本插件，有个很简单的方法，可以忽略兼容性检查：打开about:config页面，右键菜单中新建布尔值，名称为“extensions.checkCompatibility.4.0”，值为“false”，然后重启Firefox，就可以安装老版本插件了。其实很多老版本插件都是可以用的。 再说明一下，Firefox 4重新设计了界面，默认时有六个栏：标题栏、菜单栏（按一下Alt会出现）、导航工具栏、书签工具栏（默认隐藏）、标签栏（可以选择在导航栏上方或下方，在上方时会与标题栏合并）、附加组件栏（类似状态栏）。除了标题栏，按钮可以放在任意一个栏里。这个高度自定义的特性很给力，可以充分利用栏的空余空间，把按钮或显示的信息放在最舒服的位置，比如，恢复关闭标签页按钮可以放在标签栏最右边。 好吧。下面按一定顺序来介绍我正在使用的插件吧，链接我就不一一给出了，大家去这里搜索名字安装就可以了。 界面改造类 Barlesque &#8211; 使附加组件栏变成很短的一行，放在左下角或右下角，并可以定时隐藏。这样可以省出下方一整行，增大浏览空间。 Personal Titlebar &#8211; 把菜单栏和标题栏合并，这样可以充分利用标题栏空间。换句话说，可以把按钮、地址栏、搜索框等都移到标题栏上。对于习惯把标签栏放在导航栏下方的人，这个插件很有用，可以进一步扩大浏览空间。 Movable Firefox Button &#8211; 使左上角的橙色按钮可以和普通按钮一样移动（那个按钮如果没太大用，放在附加组件栏倒是不错）。 Status-4-Evar（目前需要安装测试版） &#8211; 在地址栏中靠右显示灰色的状态文字，看起来很工整大方，还省去了页面底部的状态文字。 Tab Utilities &#8211; Tab Mix Plus更新太慢，用这个插件代替。在这里可以自定义标签页、标签栏上的几乎所有的行为。 Download Manager Tweak &#8211; 可以在标签页中显示下载管理器，并且对管理器做了一些改进。 Backward Forward History Dropdown &#8211; 如果按住后退按钮几秒，Firefox会列出后退历史，可以一下子后退到之前的某个页面。这个插件直接提供了一个按钮，不需要按住后退按钮。 Organize Status Bar（目前需要忽略兼容性检查） &#8211; 发现附加组件栏中有一些图标顺序不能调整，就用用这个插件吧。 内容调整类 AdBlock Plus &#8211; 这个广告拦截几乎是每个Firefox都会装的吧……没什么可说的，太强大啦！ [...]
相关文章：<ol>
<li><a href='http://blog.programet.org/2009/10/%e6%af%8f%e5%91%a8%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90-firefox%e7%81%ab%e7%8b%90%e5%8f%8a%e5%85%b6%e6%8f%92%e4%bb%b6.html' rel='bookmark' title='每周软件推荐-Firefox火狐及其插件'>每周软件推荐-Firefox火狐及其插件</a></li>
<li><a href='http://blog.programet.org/2010/05/fastestfox%e5%8f%8a%e5%85%b6%e6%94%b9%e8%bf%9b%ef%bc%81%e8%ae%a9%e4%bd%a0%e7%9a%84%e7%81%ab%e7%8b%90%e6%9b%b4%e4%be%bf%e6%8d%b7.html' rel='bookmark' title='FastestFox及其改进！让你的火狐更便捷'>FastestFox及其改进！让你的火狐更便捷</a></li>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>很久很久以前，叶子曾经写过<a href="http://blog.programet.org/2009/10/%E6%AF%8F%E5%91%A8%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90-firefox%E7%81%AB%E7%8B%90%E5%8F%8A%E5%85%B6%E6%8F%92%E4%BB%B6.html">这篇文章</a>，介绍了Firefox的一些插件（准确地说是扩展……以下都称之为插件了）。但是那已经是3.5时代过往的浮云了。Firefox 4 RC终于推出了，同时，一批插件过时了，又有一批新插件顶了上来，还是很给力的！叶子也即使换到了Firefox 4，为插件纠结了一会儿，但目前也基本搞定了。这里也分享一下叶子的插件，希望可以帮助大家。</p>
<p><span id="more-3904"></span></p>
<p>要说明的是，这些插件有不少是只为Firefox 4设计的，如果还没有升级到Firefox 4 RC（或将来的更高版本），就不必尝试了。至于Firefox 4使用老版本插件，有个很简单的方法，可以忽略兼容性检查：打开about:config页面，右键菜单中新建布尔值，名称为“extensions.checkCompatibility.4.0”，值为“false”，然后重启Firefox，就可以安装老版本插件了。其实很多老版本插件都是可以用的。</p>
<p>再说明一下，Firefox 4重新设计了界面，默认时有六个栏：标题栏、菜单栏（按一下Alt会出现）、导航工具栏、书签工具栏（默认隐藏）、标签栏（可以选择在导航栏上方或下方，在上方时会与标题栏合并）、附加组件栏（类似状态栏）。除了标题栏，按钮可以放在任意一个栏里。这个高度自定义的特性很给力，可以充分利用栏的空余空间，把按钮或显示的信息放在最舒服的位置，比如，恢复关闭标签页按钮可以放在标签栏最右边。</p>
<p>好吧。下面按一定顺序来介绍我正在使用的插件吧，链接我就不一一给出了，大家去<a href="https://addons.mozilla.org/zh-CN/firefox/mozilla" target="_blank">这里</a>搜索名字安装就可以了。</p>
<p>界面改造类</p>
<ul>
<li>Barlesque &#8211; 使附加组件栏变成很短的一行，放在左下角或右下角，并可以定时隐藏。这样可以省出下方一整行，增大浏览空间。</li>
<li>Personal Titlebar &#8211; 把菜单栏和标题栏合并，这样可以充分利用标题栏空间。换句话说，可以把按钮、地址栏、搜索框等都移到标题栏上。对于习惯把标签栏放在导航栏下方的人，这个插件很有用，可以进一步扩大浏览空间。</li>
<li>Movable Firefox Button &#8211; 使左上角的橙色按钮可以和普通按钮一样移动（那个按钮如果没太大用，放在附加组件栏倒是不错）。</li>
<li>Status-4-Evar（目前需要安装测试版） &#8211; 在地址栏中靠右显示灰色的状态文字，看起来很工整大方，还省去了页面底部的状态文字。</li>
<li>Tab Utilities &#8211; Tab Mix Plus更新太慢，用这个插件代替。在这里可以自定义标签页、标签栏上的几乎所有的行为。</li>
<li>Download Manager Tweak &#8211; 可以在标签页中显示下载管理器，并且对管理器做了一些改进。</li>
<li>Backward Forward History Dropdown &#8211; 如果按住后退按钮几秒，Firefox会列出后退历史，可以一下子后退到之前的某个页面。这个插件直接提供了一个按钮，不需要按住后退按钮。</li>
<li>Organize Status Bar（目前需要忽略兼容性检查） &#8211; 发现附加组件栏中有一些图标顺序不能调整，就用用这个插件吧。</li>
</ul>
<p>内容调整类</p>
<ul>
<li>AdBlock Plus &#8211; 这个广告拦截几乎是每个Firefox都会装的吧……没什么可说的，太强大啦！</li>
<li>Ease Link &#8211; 将迅雷、flashget等的专用地址转换为普通地址。</li>
<li>RefControl &#8211; 可以指定访问某些地址时Firefox向服务器提交的引用页信息。这个功能常被用作反“图片防盗链”功能。</li>
<li>ImageZoom &#8211; 可以依口味放大、旋转图片。</li>
<li>xiaonei reformer / 人人网改造器 &#8211; 上人人网的童鞋们用用吧，插件如其名，功能很多。</li>
</ul>
<p>信息浏览类</p>
<ul>
<li>IE Tab Plus &#8211; IE Tab的各种衍生版。选一个支持Firefox 4的吧。</li>
<li>ReloadEvery &#8211; 在标签页右键菜单中提供每隔一段时间重新载入一次的选项，很适合用来刷网页。</li>
<li>NetVideoHunter &#8211; 下载网页中嵌入的视频的插件，在这类插件中，这是最好的之一。</li>
<li>TabScope &#8211; 为每个标签页创建预览，鼠标移到标签页上时显示出来。</li>
<li>UploadProgress（目前需要忽略兼容性检查） &#8211; 显示目前正在上传的文件的上传进度。只是Flash里上传文件它不会显示。</li>
<li>FxIF &#8211; 偷看网络上照片的EXIF信息。当然，前提是服务器没把EXIF过滤掉……</li>
</ul>
<p>网络连接类</p>
<ul>
<li>FoxyProxy Standard &#8211; 可以管理多个代理服务器，决定什么样的网址用哪个代理服务器访问。</li>
<li>AutoProxy &#8211; 懂的人都知道这个插件有神马用。在某个领域，它比FoxyProxy方便得多。</li>
<li>Fasterfox &#8211; 提供调节网络参数的功能，如果设置得当，可以提高Firefox网络读取效率。</li>
</ul>
<p>辅助功能类</p>
<ul>
<li>火狐捷径（目前需要忽略兼容性检查） &#8211; 火狐中国版的自带插件，可以<a href="http://g-fox.cn/chinaedition/addons/quicklaunch/quicklaunch-0.3.4.xpi">点击这里安装</a>。提供诸如整页截屏、快速启动程序这样的小功能，很好用。</li>
<li>FireGestures &#8211; 最好的鼠标手势插件之一。</li>
<li>QuickFox Notes &#8211; 提供一个记事本，可以显示在标签页中，支持很多功能。这个插件很有特点，它会把信息储存在书签里，可以方便地存取，不需考虑文件储存位置。如果配合Firefox 4的同步功能，就太妙了。</li>
<li>Textarea Cache &#8211; 储存不慎被关闭的页面中大段的文字输入框中的信息，不用担心大段输入文本的丢失啦！只是，它似乎还不支持TinyMCE这样的网页文字编辑器……</li>
<li>MemoryRestart &#8211; 有时，Firefox开久了，会发现消耗的内存越来越大。这个插件在附加组件栏中显示Firefox占用内存的大小，当超过一定的值（当然，这个只可以设置的），数字会变红，此时点击数字，可以让Firefox重启。</li>
<li>Restart Firefox &#8211; 在主菜单中添加一项“重新启动”。</li>
</ul>
<p>网页开发类</p>
<ul>
<li>Firebug（目前需要忽略兼容性检查） &#8211; 几乎每个网页开发者都会用上的，可以监控、修改、调试html/css/javascript等等。</li>
<li>CodeBurner for Firebug（目前需要忽略兼容性检查） &#8211; 配合Firebug一起用。</li>
<li>Regular Expressions Tester &#8211; 测试正则表达式。</li>
<li>Rainbow &#8211; 可以提取网页中任何一点的颜色。</li>
</ul>
<p>P.S. <a href="http://qcts33.com/">时间矢</a>告诉我，他已经把Firefox改造成只有一个标签栏和一个命令输入框的样子了= =!</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2009/10/%e6%af%8f%e5%91%a8%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90-firefox%e7%81%ab%e7%8b%90%e5%8f%8a%e5%85%b6%e6%8f%92%e4%bb%b6.html' rel='bookmark' title='每周软件推荐-Firefox火狐及其插件'>每周软件推荐-Firefox火狐及其插件</a></li>
<li><a href='http://blog.programet.org/2010/05/fastestfox%e5%8f%8a%e5%85%b6%e6%94%b9%e8%bf%9b%ef%bc%81%e8%ae%a9%e4%bd%a0%e7%9a%84%e7%81%ab%e7%8b%90%e6%9b%b4%e4%be%bf%e6%8d%b7.html' rel='bookmark' title='FastestFox及其改进！让你的火狐更便捷'>FastestFox及其改进！让你的火狐更便捷</a></li>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/03/%e7%9b%ae%e5%89%8d%e7%90%86%e6%83%b3%e7%9a%84%e6%8f%92%e4%bb%b6-for-firefox-4.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>谜之系列(0):线性规划</title>
		<link>http://blog.programet.org/2011/02/%e8%b0%9c%e4%b9%8b%e7%b3%bb%e5%88%970%e7%ba%bf%e6%80%a7%e8%a7%84%e5%88%92.html</link>
		<comments>http://blog.programet.org/2011/02/%e8%b0%9c%e4%b9%8b%e7%b3%bb%e5%88%970%e7%ba%bf%e6%80%a7%e8%a7%84%e5%88%92.html#comments</comments>
		<pubDate>Mon, 14 Feb 2011 16:16:38 +0000</pubDate>
		<dc:creator>DarkRaven</dc:creator>
				<category><![CDATA[数学]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[严肃]]></category>
		<category><![CDATA[公式]]></category>
		<category><![CDATA[智慧]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[证明]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3736</guid>
		<description><![CDATA[Don&#8217;t Panic! 虽然听起来很可怕，但是线性规划其实是很容易理解的东西。 简单介绍 嘛，大家在高中里面也应该做过这样的题目： 最大化： 满足： 这是二维情况下的线性规划，大家当时的解法恐怕都是在平面上画出相应的图形，然后平移目标函数对应的直线来找到目标函数的最优值。 从这个想法很容易推广到变量个数更多的线性规划问题。比如在拥有三个变量的线性规划中，约束条件由二维时的直线推广到平面，可行域由二维时的半平面推广到半空间。 同样地n个变量的一般线性规划也可以如此推广（n维超空间，n-1维超平面什么的&#8230;.） 如果说三维还在人的想象力所及的范围内，那么n维的线性规划要怎么解呢？ 直觉告诉我们，线性规划的最优解总是在顶点处取到（事实也是这样，证明略），于是我们可以联立变量数个方程，解出顶点坐标，带入目标函数。这样的算法，对于n个变量，m个约束条件的线性规划问题，其复杂度为 而这个复杂度也就是线性规划中常用的单纯形算法的最坏复杂度。 我将不在此介绍单纯形算法。 以上是对线性规划的简单介绍，下面要讲线性规划问题在网络流问题中一个比较有用的性质，对偶性 对偶性 所谓对偶性是指，对于每一个要求目标函数最大化线性规划问题，都有相应的，目标函数是最小化的线性规划问题，这两个问题有相同的最优解，其最普遍的体现就是一些最大/最小定理，比如最大流最小割定理可能是最广为人知的了。 现在先让我不失一般性地定义一下一个线性规划问题： 最大化： 满足： 注：这个定义是“一般的”，任何一个线性规划都可以转化为这种形式（松弛型），具体留给读者思考好了。 然后定义其对偶式： 最小化： 满足： 所谓对偶，就是将约束条件与变量互换（回忆射影几何中的对偶），于是一个最大化问题变成了一个最小化问题，现在要证明的是这两个问题的最优解相同。 （以下证明来自算法导论第二版，引理29.8） 引理：线性规划中的弱对偶性 令为原问题的一个可行解，为对偶问题的一个可行解，则： 证明： （见对偶式的约束条件） （见原问题的约束条件） 于是现在问题变成这样：只要找到一对可行解，使 那么线性规划的对偶性就得到了证明。 关于这个解的存在性问题的证明，将会涉及到单纯形算法的细节，所以在这里只是简单、不严密的讲一下： 我们在原问题的约束条件（(*)式）左边加一项，并将不等号变为等号（﻿） 可以看出，这样并不会改变原问题的最优解。之后通过对变量的互相替换，我们最终可以将目标函数化为如下形式： N表示所有出现在目标函数中的变量的下标所组成的集合。 那么取就是对偶问题的最优解。或者令，那么就是取。 当原问题的目标函数化为如(1)的形式后，最优解是明显的，即令，取得。 现在只要说明，可以使对偶式的目标函数也取值即可。 取上文中扩展后的定义，我将不加解释地说明这一点： 因为这个等式对于任意的，取值都成立，则必定为0（令所有） 所以此时，命题得证。 （对于不理解(i)式的人，再看看修改后的约束条件） 关于线性规划这个基础知识的介绍就到这里，下一篇大概会定义“网络”是什么“流”是什么 本文由 DarkRaven 创作，转载或引用前请联系我们。相关文章： 素数有无穷多个的另类证明（三）：被遗忘的证明 素数有无穷多个的另类证明（二）：素数的某个求和式 素数有无穷多个的另类证明（一）：两两互素的无穷序列
相关文章：<ol>
<li><a href='http://blog.programet.org/2009/12/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%b8%89%ef%bc%89%ef%bc%9a%e8%a2%ab%e9%81%97%e5%bf%98%e7%9a%84%e8%af%81%e6%98%8e.html' rel='bookmark' title='素数有无穷多个的另类证明（三）：被遗忘的证明'>素数有无穷多个的另类证明（三）：被遗忘的证明</a></li>
<li><a href='http://blog.programet.org/2009/11/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%ba%8c%ef%bc%89%ef%bc%9a%e7%b4%a0%e6%95%b0%e7%9a%84%e6%9f%90%e4%b8%aa%e6%b1%82.html' rel='bookmark' title='素数有无穷多个的另类证明（二）：素数的某个求和式'>素数有无穷多个的另类证明（二）：素数的某个求和式</a></li>
<li><a href='http://blog.programet.org/2009/11/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%b8%80%ef%bc%89%ef%bc%9a%e4%b8%a4%e4%b8%a4%e4%ba%92%e7%b4%a0%e7%9a%84%e6%97%a0.html' rel='bookmark' title='素数有无穷多个的另类证明（一）：两两互素的无穷序列'>素数有无穷多个的另类证明（一）：两两互素的无穷序列</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: center;"><strong>Don&#8217;t Panic!</strong></h1>
<p>虽然听起来很可怕，但是线性规划其实是很容易理解的东西。<span id="more-3736"></span></p>
<h2>简单介绍</h2>
<p>嘛，大家在高中里面也应该做过这样的题目：</p>
<p style="text-align: left;">最大化：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=6x%2B5y&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='6x+5y' title='6x+5y' class='latex' /></p>
<p>满足：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20x%2By%20%5Cleq%2010%20%5C%5C2x-3y%20%5Cleq%205%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt=' x+y \leq 10 \\2x-3y \leq 5 ' title=' x+y \leq 10 \\2x-3y \leq 5 ' class='latex' /></p>
<p>这是二维情况下的线性规划，大家当时的解法恐怕都是在平面上画出相应的图形，然后平移目标函数对应的直线来找到目标函数的最优值。</p>
<p>从这个想法很容易推广到变量个数更多的线性规划问题。比如在拥有三个变量的线性规划中，约束条件由二维时的直线推广到平面，可行域由二维时的半平面推广到半空间。</p>
<p>同样地n个变量的一般线性规划也可以如此推广（n维超空间，n-1维超平面什么的&#8230;.）</p>
<p>如果说三维还在人的想象力所及的范围内，那么n维的线性规划要怎么解呢？</p>
<p>直觉告诉我们，线性规划的最优解总是在顶点处取到（事实也是这样，证明略），于是我们可以联立变量数个方程，解出顶点坐标，带入目标函数。这样的算法，对于n个变量，m个约束条件的线性规划问题，其复杂度为<img src='http://s.wordpress.com/latex.php?latex=%5Cdbinom%7Bn%2Bm%7D%7Bn%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\dbinom{n+m}{n}' title='\dbinom{n+m}{n}' class='latex' /></p>
<p>而这个复杂度也就是线性规划中常用的单纯形算法的最坏复杂度。</p>
<p>我将不在此介绍单纯形算法。</p>
<p>以上是对线性规划的简单介绍，下面要讲线性规划问题在网络流问题中一个比较有用的性质，对偶性</p>
<h2>对偶性</h2>
<p>所谓对偶性是指，对于每一个要求目标函数最大化线性规划问题，都有相应的，目标函数是最小化的线性规划问题，这两个问题有相同的最优解，其最普遍的体现就是一些最大/最小定理，比如最大流最小割定理可能是最广为人知的了。</p>
<p>现在先让我不失一般性地定义一下一个线性规划问题：</p>
<p>最大化：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20c_%7Bj%7Dx_j%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} c_{j}x_j ' title='\displaystyle\sum_{j=1}^{n} c_{j}x_j ' class='latex' /></p>
<p>满足：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20a_%7Bij%7Dx_j%20%5Cleq%20b_i%20%5Cquad%20i%3D1%2C2%2C3%2C%5Ccdots%2Cm%5Cqquad%7B%7D%28%2A%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} a_{ij}x_j \leq b_i \quad i=1,2,3,\cdots,m\qquad{}(*)' title='\displaystyle\sum_{j=1}^{n} a_{ij}x_j \leq b_i \quad i=1,2,3,\cdots,m\qquad{}(*)' class='latex' /></p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=x_j%20%5Cgeq%200%20%5Cquad%20j%3D1%2C2%2C3%2C%5Ccdots%2Cn&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_j \geq 0 \quad j=1,2,3,\cdots,n' title='x_j \geq 0 \quad j=1,2,3,\cdots,n' class='latex' /></p>
<p>注：这个定义是“一般的”，任何一个线性规划都可以转化为这种形式（松弛型），具体留给读者思考好了。</p>
<p>然后定义其对偶式：</p>
<p>最小化：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20b_%7Bi%7Dy_i%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{i=1}^{m} b_{i}y_i ' title='\displaystyle\sum_{i=1}^{m} b_{i}y_i ' class='latex' /></p>
<p>满足：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20a_%7Bij%7Dy_i%20%5Cgeq%20c_j%20%5Cquad%20j%3D1%2C2%2C3%2C%5Ccdots%2Cn&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{i=1}^{m} a_{ij}y_i \geq c_j \quad j=1,2,3,\cdots,n' title='\displaystyle\sum_{i=1}^{m} a_{ij}y_i \geq c_j \quad j=1,2,3,\cdots,n' class='latex' /></p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=y_i%20%5Cgeq%200%20%5Cquad%20j%3D1%2C2%2C3%2C%5Ccdots%2Cm&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y_i \geq 0 \quad j=1,2,3,\cdots,m' title='y_i \geq 0 \quad j=1,2,3,\cdots,m' class='latex' /></p>
<p>所谓对偶，就是将约束条件与变量互换（回忆射影几何中的对偶），于是一个最大化问题变成了一个最小化问题，现在要证明的是这两个问题的最优解相同。</p>
<p>（以下证明来自算法导论第二版，引理29.8）</p>
<p><strong>引理：线性规划中的弱对偶性</strong></p>
<p>令<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7Bx%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{x}' title='\overline{x}' class='latex' />为原问题的一个可行解，<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7By%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{y}' title='\overline{y}' class='latex' />为对偶问题的一个可行解，则：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20c_%7Bj%7D%5Coverline%7Bx%7D_j%5Cleq%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20b_%7Bi%7D%5Coverline%7By%7D_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j\leq\sum_{i=1}^{m} b_{i}\overline{y}_i' title='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j\leq\sum_{i=1}^{m} b_{i}\overline{y}_i' class='latex' /></p>
<p><strong>证明：</strong></p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20c_%7Bj%7D%5Coverline%7Bx%7D_j%5Cleq%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%5Cleft%20%28%5Csum_%7Bi%3D1%7D%5E%7Bm%7Da_%7Bij%7D%5Coverline%7By%7D_%7Bi%7D%5Cright%20%29%5Coverline%7Bx%7D_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j\leq\sum_{j=1}^{n}\left (\sum_{i=1}^{m}a_{ij}\overline{y}_{i}\right )\overline{x}_j' title='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j\leq\sum_{j=1}^{n}\left (\sum_{i=1}^{m}a_{ij}\overline{y}_{i}\right )\overline{x}_j' class='latex' />（见对偶式的约束条件）</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%3D%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%5Cleft%20%28%5Csum_%7Bi%3D1%7D%5E%7Bm%7Da_%7Bij%7D%5Coverline%7Bx%7D_%7Bj%7D%5Cright%20%29%5Coverline%7By%7D_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle= \sum_{j=1}^{n}\left (\sum_{i=1}^{m}a_{ij}\overline{x}_{j}\right )\overline{y}_i' title='\displaystyle= \sum_{j=1}^{n}\left (\sum_{i=1}^{m}a_{ij}\overline{x}_{j}\right )\overline{y}_i' class='latex' /></p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Cleq%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20b_%7Bi%7D%5Coverline%7By%7D_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\leq\sum_{i=1}^{m} b_{i}\overline{y}_i' title='\displaystyle\leq\sum_{i=1}^{m} b_{i}\overline{y}_i' class='latex' />（见原问题的约束条件）</p>
<p style="text-align: right;"><img src='http://s.wordpress.com/latex.php?latex=%5Chfill%20%5Censuremath%7B%5CBox%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\hfill \ensuremath{\Box}' title='\hfill \ensuremath{\Box}' class='latex' /></p>
<p>于是现在问题变成这样：只要找到一对可行解<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7Bx%7D%2C%5Coverline%7By%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{x},\overline{y}' title='\overline{x},\overline{y}' class='latex' />，使</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20c_%7Bj%7D%5Coverline%7Bx%7D_j%3D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20b_%7Bi%7D%5Coverline%7By%7D_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j=\sum_{i=1}^{m} b_{i}\overline{y}_i' title='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j=\sum_{i=1}^{m} b_{i}\overline{y}_i' class='latex' /></p>
<p>那么线性规划的对偶性就得到了证明。</p>
<p>关于这个解的存在性问题的证明，将会涉及到单纯形算法的细节，所以在这里只是简单、不严密的讲一下：</p>
<p>我们在原问题的约束条件（(*)式）左边加一项，并将不等号变为等号（<img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20a_%7Bij%7Dx_j%20%2B%20x_%7Bn%2Bi%7D%3D%20b_i%20%5Cquad%20i%3D1%2C2%2C3%2C%5Ccdots%2Cm&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} a_{ij}x_j + x_{n+i}= b_i \quad i=1,2,3,\cdots,m' title='\displaystyle\sum_{j=1}^{n} a_{ij}x_j + x_{n+i}= b_i \quad i=1,2,3,\cdots,m' class='latex' />﻿）</p>
<p>可以看出，这样并不会改变原问题的最优解。之后通过对变量的互相替换，我们最终可以将目标函数化为如下形式：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%7B%7Dz%3Dv%27-%5Csum_%7Bj%5Cin%7B%7DN%7Dc%27_%7Bj%7Dx_%7Bj%7D%5Cqquad%7B%7D%281%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle{}z=v&#039;-\sum_{j\in{}N}c&#039;_{j}x_{j}\qquad{}(1)' title='\displaystyle{}z=v&#039;-\sum_{j\in{}N}c&#039;_{j}x_{j}\qquad{}(1)' class='latex' /></p>
<p style="text-align: center;">N表示所有出现在目标函数中的变量的下标所组成的集合。<img src='http://s.wordpress.com/latex.php?latex=c%27_%7Bj%7D%3E0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c&#039;_{j}&gt;0' title='c&#039;_{j}&gt;0' class='latex' /></p>
<p style="text-align: left;">那么取<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7By%7D%3D%5Cbegin%7Bcases%7Dc%27_%7Bn%2Bi%7D%26%5Ctext%7Bif%20%7D%20n%2Bi%5Cin%20N%20%5C%5C%200%20%26%5Ctext%7Botherwise%7D%5Cend%7Bcases%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{y}=\begin{cases}c&#039;_{n+i}&amp;\text{if } n+i\in N \\ 0 &amp;\text{otherwise}\end{cases}' title='\overline{y}=\begin{cases}c&#039;_{n+i}&amp;\text{if } n+i\in N \\ 0 &amp;\text{otherwise}\end{cases}' class='latex' />就是对偶问题的最优解。或者令<img src='http://s.wordpress.com/latex.php?latex=c%27_%7Bj%7D%3D0%2Cj%5Cnotin%7B%7DN&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c&#039;_{j}=0,j\notin{}N' title='c&#039;_{j}=0,j\notin{}N' class='latex' />，那么就是取<img src='http://s.wordpress.com/latex.php?latex=y%3Dc%27_%7Bn%2Bi%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y=c&#039;_{n+i}' title='y=c&#039;_{n+i}' class='latex' />。</p>
<p style="text-align: left;">当原问题的目标函数化为如(1)的形式后，最优解是明显的，即令<img src='http://s.wordpress.com/latex.php?latex=x_%7Bj%7D%3D0%2Cj%5Cin%7B%7DN&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_{j}=0,j\in{}N' title='x_{j}=0,j\in{}N' class='latex' />，取得<img src='http://s.wordpress.com/latex.php?latex=z_%7Bmax%7D%3Dv%27&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='z_{max}=v&#039;' title='z_{max}=v&#039;' class='latex' />。</p>
<p style="text-align: left;">现在只要说明，<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7By%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{y}' title='\overline{y}' class='latex' />可以使对偶式的目标函数也取<img src='http://s.wordpress.com/latex.php?latex=v%27&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='v&#039;' title='v&#039;' class='latex' />值即可。</p>
<p style="text-align: left;">取上文中扩展后的<img src='http://s.wordpress.com/latex.php?latex=c%27&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c&#039;' title='c&#039;' class='latex' />定义，我将不加解释地说明这一点：<img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cdisplaystyle%20%20%5Cbegin%7Barray%7D%7Brl%7D%20%20%5Cdisplaystyle%20%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dc_%7Bj%7Dx_j%20%26%20%5Cdisplaystyle%3D%20v%27%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%2Bm%7Dc%27_%7Bj%7Dx_j%20%5C%5C%20%20%26%20%5Cdisplaystyle%3Dv%27%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dc%27_%7Bj%7Dx_j%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7Dc%27_%7Bn%2Bi%7Dx_i%20%5C%5C%20%20%26%20%5Cdisplaystyle%3Dv%27%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dc%27_%7Bj%7Dx_j%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Coverline%7By%7D_%7Bi%7Dx_i%20%5C%5C%20%20%26%20%5Cdisplaystyle%3Dv%27%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dc%27_%7Bj%7Dx_j%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Coverline%7By%7D_%7Bi%7D%5Cleft%20%28b_%7Bi%7D%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Da_%7Bij%7Dx_j%20%5Cright%20%29%20%5Cqquad%20%28i%29%20%5C%5C%20%20%26%20%5Cdisplaystyle%3D%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%5Cleft%20%28%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7Da_%7Bij%7D%5Coverline%7By%7D_%7Bi%7D%20-%20c%27_%7Bj%7D%20%5Cright%20%29x_j%20%2B%20%5Cleft%20%28v%27%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7Db_%7Bi%7D%5Coverline%7By%7D_%7Bi%7D%20%5Cright%20%29%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \displaystyle  \begin{array}{rl}  \displaystyle  \sum_{j=1}^{n}c_{j}x_j &amp; \displaystyle= v&#039; - \sum_{j=1}^{n+m}c&#039;_{j}x_j \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}c&#039;_{n+i}x_i \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}\overline{y}_{i}x_i \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}\overline{y}_{i}\left (b_{i} - \sum_{j=1}^{n}a_{ij}x_j \right ) \qquad (i) \\  &amp; \displaystyle=\sum_{j=1}^{n}\left ( \sum_{i=1}^{m}a_{ij}\overline{y}_{i} - c&#039;_{j} \right )x_j + \left (v&#039; - \sum_{i=1}^{m}b_{i}\overline{y}_{i} \right )  \end{array}  ' title='  \displaystyle  \begin{array}{rl}  \displaystyle  \sum_{j=1}^{n}c_{j}x_j &amp; \displaystyle= v&#039; - \sum_{j=1}^{n+m}c&#039;_{j}x_j \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}c&#039;_{n+i}x_i \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}\overline{y}_{i}x_i \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}\overline{y}_{i}\left (b_{i} - \sum_{j=1}^{n}a_{ij}x_j \right ) \qquad (i) \\  &amp; \displaystyle=\sum_{j=1}^{n}\left ( \sum_{i=1}^{m}a_{ij}\overline{y}_{i} - c&#039;_{j} \right )x_j + \left (v&#039; - \sum_{i=1}^{m}b_{i}\overline{y}_{i} \right )  \end{array}  ' class='latex' /></p>
<p style="text-align: left;">因为这个等式对于任意的<img src='http://s.wordpress.com/latex.php?latex=x_%7Bi%7D%2Ci%3D1%2C2%2C3%2C%5Ccdots%2Cn&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_{i},i=1,2,3,\cdots,n' title='x_{i},i=1,2,3,\cdots,n' class='latex' />，取值都成立，则<img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%7B%7Dv%27%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7Db_%7Bi%7D%5Coverline%7By%7D_%7Bi%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle{}v&#039; - \sum_{i=1}^{m}b_{i}\overline{y}_{i}' title='\displaystyle{}v&#039; - \sum_{i=1}^{m}b_{i}\overline{y}_{i}' class='latex' />必定为0（令所有<img src='http://s.wordpress.com/latex.php?latex=x_%7Bi%7D%3D0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_{i}=0' title='x_{i}=0' class='latex' />）</p>
<p style="text-align: left;">所以此时<img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bi%3D1%7D%5E%7Bm%7Db_%7Bi%7D%5Coverline%7By%7D_%7Bi%7D%20%3D%20v%27%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{i=1}^{m}b_{i}\overline{y}_{i} = v&#039; ' title='\displaystyle\sum_{i=1}^{m}b_{i}\overline{y}_{i} = v&#039; ' class='latex' />，命题得证。</p>
<p style="text-align: left;">（对于不理解(i)式的人，再看看修改后的约束条件）</p>
<p style="text-align: left;">
<p style="text-align: left;">关于线性规划这个基础知识的介绍就到这里，下一篇大概会定义“网络”是什么“流”是什么</p>
<p style="text-align: left;">
<p style="text-align: center;">
<p style="text-align: center;">
<p><small>本文由 DarkRaven 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2009/12/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%b8%89%ef%bc%89%ef%bc%9a%e8%a2%ab%e9%81%97%e5%bf%98%e7%9a%84%e8%af%81%e6%98%8e.html' rel='bookmark' title='素数有无穷多个的另类证明（三）：被遗忘的证明'>素数有无穷多个的另类证明（三）：被遗忘的证明</a></li>
<li><a href='http://blog.programet.org/2009/11/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%ba%8c%ef%bc%89%ef%bc%9a%e7%b4%a0%e6%95%b0%e7%9a%84%e6%9f%90%e4%b8%aa%e6%b1%82.html' rel='bookmark' title='素数有无穷多个的另类证明（二）：素数的某个求和式'>素数有无穷多个的另类证明（二）：素数的某个求和式</a></li>
<li><a href='http://blog.programet.org/2009/11/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%b8%80%ef%bc%89%ef%bc%9a%e4%b8%a4%e4%b8%a4%e4%ba%92%e7%b4%a0%e7%9a%84%e6%97%a0.html' rel='bookmark' title='素数有无穷多个的另类证明（一）：两两互素的无穷序列'>素数有无穷多个的另类证明（一）：两两互素的无穷序列</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/02/%e8%b0%9c%e4%b9%8b%e7%b3%bb%e5%88%970%e7%ba%bf%e6%80%a7%e8%a7%84%e5%88%92.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

