<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
	<title>求道</title>
	
	<link>http://taoseeker.net</link>
	<description>生而为龙</description>
	<lastBuildDate>Wed, 20 Jul 2011 11:07:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/crystalharp" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="crystalharp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><item>
		<title>使用复读机来进行听写跟读</title>
		<link>http://taoseeker.net/2011/07/20/learning-english/</link>
		<comments>http://taoseeker.net/2011/07/20/learning-english/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 11:07:09 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=452</guid>
		<description><![CDATA[前一段趁着限免的时候下载了个名叫复读机的ios软件，发现用来学英语真的很方便。在这里把方法分享一下。 复读机的软件介绍在此：http://www.iapps.im/archives/18626 下载地址为http://itunes.apple.com/cn... ]]></description>
			<content:encoded><![CDATA[<p>前一段趁着限免的时候下载了个名叫复读机的ios软件，发现用来学英语真的很方便。在这里把方法分享一下。<br />
复读机的软件介绍在此：<a href="http://www.iapps.im/archives/18626">http://www.iapps.im/archives/18626<br />
</a>下载地址为<a href="http://itunes.apple.com/cn/app/id417332218?mt=8">http://itunes.apple.com/cn/app/id417332218?mt=8</a></p>
<p>使用复读机之前首先需要明确的不是软件使用方法，而是英语学习套路。</p>
<p>这个套路中跟读部分取自李笑来，听写部分取自张晓楠，最后我自己进行综合整理而成。</p>
<p>我使用的资料是老托福听力Part C，下载地址如下：</p>
<p>http://www.lixiaolai.com/index.php/downloads</p>
<p>因为其时间控制内容不是lrc的，自己写了个python脚本把里面的txt转换成了lrc文件，这样在复读机里面就可以使用了。</p>
<p>对待每一篇的动作是这样的：</p>
<p>首先是听写，具体要求如下。首先总听两三遍，把握全篇大意;然后每次听一句话，根据听到的信息可以用自己的话来重写这个句子，也可以直接用听到的词来写，遇到听不懂的就用声音标记来记录这个词，每句话大概听6,7遍就到极限了。遇到不认识的单词就记下来，一篇文章听写3,4遍基本上就全熟了。<br />
个人说法比较简略，没看懂的见听力方法原文如下：</p>
<p>http://blog.sina.com.cn/s/blog_4fe4f4760100adg9.html</p>
<p>使用复读机进行听写，在设置中关掉连续播放，然后按一下上面的放大镜图标隐藏掉里面的英语原文就可以开始听写了。软件升级之后进行单句播放非常的方便，只要从第一句开始听，如果还需要再听就点下面的“重复上一句”按钮，如果这一句听的足够了就点“播放”按钮来播放下一句，这样就完全可以很方便的使用上述方法进行听写了。<br />
<a href="http://taoseeker.net/wp-content/uploads/2011/07/reciter.png"><img class="alignnone size-full wp-image-453" src="http://taoseeker.net/wp-content/uploads/2011/07/reciter.png" alt="reciter" width="512" height="768" /></a></p>
<p>听写进行完之后是跟读模仿。<br />
和听写类似的方法，开始是跟读，即听一句，跟着读一句。读熟练之后可以听一句跟着背一句，彻底熟练之后就可以整篇背诵了。<br />
跟读的细节见跟读方法原文：</p>
<p>http://www.lixiaolai.com/index.php/archives/4054.html</p>
<p>http://www.lixiaolai.com/index.php/archives/4055.html</p>
<p>这个过程中复读机软件的使用方法和听写的时候一样，以句子为单位的重复阅读。</p>
<p>整个过程可以练习听力（因为有精听，而且是整句理解能力），口语（跟读和背诵会让你习惯说英语），部分写作能力（听写的时候会去熟悉句子，如果你用自己的话来重复的话还有复述能力），阅读（也可以这么说把，因为这个过程中你会接触到很多的新单词，新句子，只不过不会去阅读太过复杂的句子）。整体来说是个全部能力综合提升的过程。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=ZhoSPr6qI10:JUF03nybDBk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=ZhoSPr6qI10:JUF03nybDBk:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2011/07/20/learning-english/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>动态数组</title>
		<link>http://taoseeker.net/2011/04/10/dynamic_array/</link>
		<comments>http://taoseeker.net/2011/04/10/dynamic_array/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 09:51:56 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[malloc]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[系统程序员成长计划]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=431</guid>
		<description><![CDATA[自己感触，有错的还请大家指出 动态数组： 动态数组只写了三遍，发现一些问题总结如下。 设计的动态数组和之前的双向链表一样，也是浅拷贝的数据结构。 第一遍用malloc,free,memmove等函数来... ]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000"><strong>自己感触，有错的还请大家指出</strong></span></p>
<p><strong>动态数组：</strong><br />
动态数组只写了三遍，发现一些问题总结如下。</p>
<p>设计的动态数组和之前的双向链表一样，也是浅拷贝的数据结构。</p>
<ul>
<li>第一遍用malloc,free,memmove等函数来完成的(注：memcpy和memmove的区别是memcpy没有考虑内存重叠的情况)。</li>
<li>第二遍发现memmove的操作并不怎么直观，所移动的size每次都要写的比较长(sizeof(void *) * n)，于是实现了一个elem_move的函数，使用index进行移动。同时替换malloc和free所进行的内存扩展为realloc，在使用realloc的过程中没有仔细阅读realloc的函数原型，第一次使用时居然认为肯定原地扩展了，虽然运行起来没发现错误，还好被valgrind查出来了。在此严重推荐一下valgrind，检查内存泄漏的一个很不错的工具，帮我查出很多次错误了；</li>
<li>写第三遍是因为发现了浅拷贝的一个问题。如果get了其中一个elem然后set到不同的index下，那么原来在此index下的elem会发生内存泄漏，而被set过来的elem则会在销毁的时候被free两遍。为了改善这个这个问题，在数组内引入了reference count的概念。我在数组初始化的时候引入了ref_ch和ref_eq函数，调用者自己完成这些函数，并且在自己的数据结构里面加上reference count，根据自己的elem结构对reference count进行操作，并且在insert和set_by_index的时候进行reference count加一，elem_destroy的时候先减一，判断为0了再free。</li>
</ul>
<p>最终结构是这样的：<br />
数据部分：</p>
<pre>struct _DArray{
	void **data;//用来存放动态数组的首指针
	size_t length;//数组当前长度
	size_t size;//数组目前的可用大小

	void *ctx;//进行free的上下文
	DArrayFreeFunc free;//自己的free函数
	DArrayVisitFunc ref_ch;//修改reference count的函数
	DArrayCmpFunc ref_eq;//判断reference count是否等于一个数的函数
};</pre>
<p>内部方法：</p>
<pre>//销毁一个元素，data为所要销毁的elem的指针。具体操作为调用
//ref_ch((void *)-1, data)减少其ref count，然后检查是否为0，
//是则free掉，否则只是减一
static void darray_elem_destroy(DArray *thiz, void *data)
static size_t darray_get_size(DArray *thiz)
static Ret darray_set_size(DArray *thiz, size_t size)
static Ret darray_set_length(DArray *thiz, size_t length)
//扩展当前数组，函数判断若inc+length&gt;size了就扩展
static Ret darray_expand(DArray *thiz, int inc)
//收缩，若数组长度已减少到一半又少了rand()，则缩减数组尺寸为一半
static Ret darray_shrink(DArray *thiz)
//元素移动，用于中间的插入和删除。n为需要移动的元素个数。
static Ret darray_elem_move(DArray *thiz, size_t des_index, size_t src_index, size_t n)</pre>
<p>外部方法：</p>
<pre>//创建动态数组实例，返回此实例的指针，参数为该数组用的元素free函数，
DArray *darray_create(DArrayFreeFunc free,
		DArrayVisitFunc ref_ch,
		DArrayCmpFunc ref_eq,
		void *ctx);
//把data插入对应index，具体操作为调用expand(thiz, 1),elem_move, 设置值,
//ref_count++, set_length
Ret darray_insert(DArray *thiz, size_t index, void *data);
Ret darray_append(DArray *thiz, void *data);
Ret darray_prepend(DArray *thiz, void *data);
//删除某个元素，具体操作为elem_destroy, elem_move, set_length, shrink
Ret darray_delete(DArray *thiz, size_t index);
//把某个元素的内容设置为data
Ret darray_set_by_index(DArray *thiz, size_t index, void *data);
//获取某个index对应的元素，将其指针赋到data上
Ret darray_get_by_index(DArray *thiz, size_t index, void **data);

size_t darray_length(DArray *thiz);
Ret darray_foreach(DArray *thiz, DArrayVisitFunc visit, void *ctx);

//顺序调用elem_destroy， free掉所有元素，并把指针全部置为NULL
void darray_destroy(DArray *thiz);</pre>
<p>在这个过程中同时折腾了好多的东西，感觉也很有意思。</p>
<ul>
<li>关于malloc来的内存没有初始化，原因是这样的：我原来认为malloc和free是c用来提供内存和释放内存的函数，其实更准确的说它们是管理内存的函数，它所做的事就是管理内存。malloc是找到一块没有其他人使用的内存，free是把这块内存标记为没有使用，至于内存中的内容？抱歉，这两个函数是不管里面的内容的，free掉的内存中甚至还可能有内存控制块的信息。这样的话所谓的“未初始化”的内存含义就是可能有人用过，可能没有人用过，至于里面的内容，谁知道是什么，可能刚刚有人拿它来存整数，也可能存指针了，也可能真就是空的。（此处提一嘴，强烈推荐K&amp;R的C程序设计语言，这本书中居然还有malloc和free的实现！）</li>
<li>关于struct，猜测内存对齐的原因及结构体访问的方式。新建一个struct实例的操作很简单，malloc一块空间，地址赋给struct类型的指针。就这么简单，这是怎么回事呢？从刚才的说法可以了解malloc来的内存其实是未初始化的，里面什么东西都有可能，那么我们调用其成员的时候系统是如何知道什么是它的成员呢？猜测：其实系统不知道，系统做的只是访问某块内存，对其读取或者写入，系统所了解到的“成员”只不过是这个“成员”相对于结构体指针地址的偏移量，为了方便管理和计算偏移，在编译的时候把它们的偏移量都统一确定了。（暂时不好查阅资料，内存对齐的话题看来要留到以后学习了）。</li>
</ul>
<p><strong>排序算法</strong><br />
这章中重新写了三个排序算法，冒泡，快速，归并。事实证明，我对这三个算法的熟悉程度并没有到“技能”的程度，平均一个算法写了一个半小时。这里将三个排序算法的关键点记录一下。</p>
<ul>
<li><strong>冒泡排序：</strong>我采取了改进的冒泡法，即每次冒泡都进行到上次交换过的最后一个。此方法主要有三个变量，一个遍历用的变量，一个记录单轮冒泡过程中做交换的元素的位置，一个用来记录已经有序有序的元素的位置（它等于上一轮最后那做交换的元素的位置）。</li>
<li><strong>快速排序：</strong>主要思想是每轮都把一个元素放到最终位置上，并且保证比它大的和比它小的元素分开两边。这个算法有两个特殊情况需要处理，选取的标准元素是这一堆中的最小值，或者是其中的最大值，写条件的时候主意这两种情况外加不要越过左右边界，快速排序就不会有什么问题了。</li>
<li><strong>归并排序：</strong>它主要是两个动作，首先是递归，然后是合并有序数据。递归出口是函数参数包含的数据段合并完成，初始递归出口是数据段内只有一个元素。每个数据段都是闭区间，所以不要把某个元素包含到两个数据段中去。用来遍历的变量i超过边界是没有问题的，只要超过之后不会再次被使用。</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=PpeXLWdnJfw:ccQOBoTdQp0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=PpeXLWdnJfw:ccQOBoTdQp0:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2011/04/10/dynamic_array/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>走近专业程序员</title>
		<link>http://taoseeker.net/2011/03/19/%e8%b5%b0%e8%bf%91%e4%b8%93%e4%b8%9a%e7%a8%8b%e5%ba%8f%e5%91%98/</link>
		<comments>http://taoseeker.net/2011/03/19/%e8%b5%b0%e8%bf%91%e4%b8%93%e4%b8%9a%e7%a8%8b%e5%ba%8f%e5%91%98/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 12:30:11 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[系统程序员成长计划]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=420</guid>
		<description><![CDATA[最近开始看李先静的《系统程序员成长计划》，算是对长久以来缺乏编码的一种补偿把。使用这本书顺便还为了养成编码的习惯，免得见了代码就头疼。养成一个习惯有三个阶段，第一个阶段... ]]></description>
			<content:encoded><![CDATA[<p>最近开始看李先静的《系统程序员成长计划》，算是对长久以来缺乏编码的一种补偿把。使用这本书顺便还为了养成编码的习惯，免得见了代码就头疼。养成一个习惯有三个阶段，第一个阶段是需要一直提醒自己，而且觉得很别扭，第二个阶段是需要一直提醒自己，但是已经比较习惯了，第三个阶段是不再需要提醒自己，而且习惯了。纵观以往的努力，中断于第二阶段的情况太多了，因为已经比较习惯了，所以总会去放松，不小心就中断了。这个时候中断太可惜了，既浪费了前面的努力，也浪费了来之不易的良好状态。这次引以为戒，坚决不能再次中断。<br />
目前进度，两周，第一章结束，通用双向链表写了五遍，虽说还不能将双向链表烂熟于心，也算有了一定的经验了。</p>
<p>专业程序员最需要的是什么？是专业态度。</p>
<p>专业态度一：风格态度。良好的代码风格是严谨的一种表现，“傻瓜都能写出机器能读懂的代码，但只有专业程序员才能写出人能读懂的代码。”</p>
<p>稳定的代码风格：<br />
<span style="color: #ff0000;">文件名：</span>单词小写，多个单词用下划线分隔。如：dlist.c<br />
<span style="color: #ff0000;">函数名：</span>单词小写，多个单词用下划线分隔。如：node_find。一个函数只完成单一功能。一个函数最好在80*24的范围内完成，函数内的临时变量不要超过10个（此句来自linux kernel coding style）。<br />
<span style="color: #ff0000;">结构/枚举/联合名：</span>下划线开头，首字母大写，多个单词连写。如：struct _DListNode;<br />
<span style="color: #ff0000;">宏名：</span>单词大写，多个单词下划线分隔。如：#define MAX_PATH 260<br />
<span style="color: #ff0000;">变量名：</span>单词小写，多个单词下划线分隔。如：DList *node = NULL(此处习惯*与node相连沿用于K&amp;R C，表明*node是DList，这种写法有利于同时定义多个变量。)</p>
<p>面向对象的命名方式：<br />
1.以对象为中心，采用主谓形式（对象+动作）来命名，取代传统的动宾形式，如：dlist_append<br />
2.第一个参数为对象，并用thiz命名，如：dlist_append(DList *thiz, void *value)<br />
3.对象有自己的声明周期，所以有对应的创建和销毁函数。</p>
<p>排版：<br />
<span style="color: #ff0000;">使用空行：</span>1.函数体之间。2.结构/联合/枚举声明。3.不同功能的代码块之间。4.功能类似的代码放在一起，和其他部分用可能空行分隔。5.用一行就够了。<br />
<span style="color: #ff0000;">使用空格：</span>1.等号两边。2.运算符两边。3.参数之间（for,函数等）<br />
<span style="color: #ff0000;">使用括号：</span><br />
1.分隔子表达式，让人更容易看明白。如：((a &amp;&amp; b) || (c &amp;&amp; d))。<br />
2.条件判断和循环，即使是一句也要加括号。如：</p>

<div class="wp_codebox"><table><tr id="p4204"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p420code4"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&gt;</span> b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> c<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">==</span> b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
...
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><span style="color: #ff0000;">缩进：</span>使用tab。缩进超过三层的话说明设计有问题</p>
<p><span style="color: #ff0000;">保护隐私：封装。</span>可以隔离变化，降低复杂度。<br />
<span style="color: #ff0000;">隐藏数据结构：</span>若为内部数据结构，则直接放在C文件中，不要放在头文件里。若为外部也要使用，则对外暴露名字而封装实现细节。做法为：<br />
在头文件中声明该数据结构。<br />
在C文件中定义该数据结构。<br />
提供操作改数据结构的函数，避免直接访问其成员。<br />
提供创建和销毁函数。<br />
不过是否封装还是要看具体情况。<br />
隐藏内部函数：在头文件中只放最少的接口函数声明，在C文件中所有内部函数都加上static关键字（将函数private化）。<br />
<span style="color: #ff0000;">禁用全局变量。</span></p>
<p>通用化<br />
通用链表的实现方式有两种：<br />
<span style="color: #ff0000;">深拷贝，存值</span>，以void *来保存数据首地址，size_t length来保存数据长度。进行深拷贝的时候使用memcpy。C语言没有构造函数，实现深拷贝比较复杂，且复制数据带来性能开销，不符合C语言的风格，较少见。<br />
<span style="color: #ff0000;">浅拷贝，存指针</span>，只用void *保存对象的指针。存放整数时，可以把void *强制转换成整数使用。<br />
<span style="color: #0000ff;">（注：是否要进行深拷贝要根据实际情况来决定，在需要的时候，比如防火墙处理数据包，还是需要做深拷贝的。另外，据说公司前辈说自己实现的拷贝函数性能比memcpy好。）</span><br />
<span style="color: #ff0000;">让C++可以调用</span>：在头文件中防止编译器对函数名重新编码，加入如下内容：</p>

<div class="wp_codebox"><table><tr id="p4205"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p420code5"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifdef __cplusplus</span>
<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #ff0000;">&quot;C&quot;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #339933;">#endif</span>
<span style="color: #808080; font-style: italic;">/* add your code here */</span>
<span style="color: #339933;">#ifdef __cplusplus</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">#endif</span></pre></td></tr></table></div>

<p>通用链表面向特定数据的操作<br />
面向特定数据的操作会很多，但是若将其一一实现的话会产生大量重复的代码。将遍历和对数据的操作分离开，使用函数指针将对数据的操作传入就是一个良好的实现框架，称为回调函数法。使用回调函数来进行数据操作的时候会产生一些中间数据，对此引入一个上下文context(缩写为ctx)的概念，用它来做参数负责传入传出数据和保存中间变量。框架如下：</p>

<div class="wp_codebox"><table><tr id="p4206"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p420code6"><pre class="c" style="font-family:monospace;"> <span style="color: #666666; font-style: italic;">//定义函数指针别名</span>
<span style="color: #993333;">typedef</span> STAT <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>DListVisitFunc<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ctx<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//实现遍历</span>
STAT dlist_foreach<span style="color: #009900;">&#40;</span>DList <span style="color: #339933;">*</span>thiz<span style="color: #339933;">,</span> DListVisitFunc visit<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ctx<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #808080; font-style: italic;">/* some code */</span>
stat <span style="color: #339933;">=</span> visit<span style="color: #009900;">&#40;</span>ctx<span style="color: #339933;">,</span> some_data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/* some code */</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//实际回调函数</span>
<span style="color: #993333;">static</span> STAT sum_cb<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ctx<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>data<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #808080; font-style: italic;">/* some code */</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//调用方法</span>
<span style="color: #993333;">long</span> <span style="color: #993333;">long</span> sum <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
stat <span style="color: #339933;">=</span> dlist_foreach<span style="color: #009900;">&#40;</span>pdlist<span style="color: #339933;">,</span> sum_cb<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>sum<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>面向特定数据的操作不应该杂糅到通用链表中，否则会造成不必要的耦合度和复杂度。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=LsM4M9VrAPs:ozM_Ug-22hg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=LsM4M9VrAPs:ozM_Ug-22hg:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2011/03/19/%e8%b5%b0%e8%bf%91%e4%b8%93%e4%b8%9a%e7%a8%8b%e5%ba%8f%e5%91%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>九寨游记</title>
		<link>http://taoseeker.net/2010/07/01/trip-to-jiuzhaigou/</link>
		<comments>http://taoseeker.net/2010/07/01/trip-to-jiuzhaigou/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 14:17:41 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[旅游]]></category>
		<category><![CDATA[生活小趣]]></category>
		<category><![CDATA[九寨沟]]></category>
		<category><![CDATA[四川]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=398</guid>
		<description><![CDATA[想来一趟成都，最终还是来了。 只有一周，飞机来回，被人说实在太奢侈了。 自己拿主意，反正只有一周，景点还是一个玩够了吧。九寨沟，青城，峨眉，还是九寨沟吧~虽然挺费时间的，毕... ]]></description>
			<content:encoded><![CDATA[<p>想来一趟成都，最终还是来了。<br />
只有一周，飞机来回，被人说实在太奢侈了。</p>
<p>自己拿主意，反正只有一周，景点还是一个玩够了吧。九寨沟，青城，峨眉，还是九寨沟吧~虽然挺费时间的，毕业旅行，还是找个比较好玩的地方。</p>
<p>自助？跟团？熟人帮我联系了一个团，然后某人极力推荐我自助。反正没有自助过，好歹疯狂一下，联系一下自助吧~跟着攻略一路查找，结束之后发现也不难么。开始喜欢这种自助游了，玩的实在太high了~</p>
<p>首先预处理工作，同学推荐了天堂青年旅社（<a href="http://www.ttjzg.com/">http://www.ttjzg.com/</a>），这个青年旅社是九寨沟脚下满有名的一个。打电话询问过床位情况之后去成都的新南门客运站买票，买完车票后再给旅社打电话确认床位预定。</p>
<p>第一天，大早晨的跑去新南门客运站坐车，路太绕了，建议不停车的时候不要吃东西，太容易勾引出来想吐的感觉了。晚上7点左右到九寨沟，找到旅社入住，然后在旅社办理入住手续，沟内住宿手续，车票代购手续。下车的地方在九通宾馆，从绵阳过去的车好像并不路过天堂青年旅社，下车之后往上走吧，大约两公里，具体走法在他们网站上都有。懒得走的话打车也行，估计8块左右。值得一提的是下车的时候外面围了一圈各种各样的青年旅社来拉人入住的，挺住啊~</p>
<p>第二天，进沟。旅社跟我说8点多正好是旅行团大批进入的时候，既然我要在里面玩两天，就9点前进去就行。结果我8点半出发，打车5元到了景区门口，正好是旅行团高峰期。在服务中心拿了个宣传资料，然后拿学生证去买了学生票。进门的时候跟着大队旅行团进去的，结果连学生证都没查验（检票系统语音提示要检查学生证了）。由于根本没来过，路也不熟，反正有两天时间呢，先跟着旅行团溜达一下吧。于是进门之后跟着旅行团大队坐车到了树正。（从门口往上走的车有两种，一种是到树正，一种是到山顶，车前面写着到树正的是前一种，没写的是后一种。）在车上路过芦苇海，玉带河，双龙海，卧龙海。坐在车上看玉带河还是很有意思的，矮矮的芦苇之中一条宝蓝色的河道从中穿过，很是漂亮。到了树正之后下车，树正寨就在旁边，晚上就住这里了，进来之前还怕找不到地方。往左走是树正群海，下了石阶就是水磨坊。到了这里我才知道九寨沟原来是藏族的村寨。水磨坊全是人，往上走树正瀑布也全是人，继续走。老虎海和犀牛海还是不错的，毕竟人只能分布在一条线上，哈哈。在沿岸拍点风景，继续走到犀牛海坐车。这次坐车直接送到了顶部的长海，路上的上季节海和下季节海现在都处于干旱期，基本没有水。从长海往下走看过五彩池后坐车到中间的诺日朗服务中心，开始进食。值得一提的是这个服务中心有餐厅，里面的餐食价格基本都在50以上，门口还有卖方便面的，￥15一桶送一根香肠而且给泡好。我在吃东西的时候闻到各种各样的方便面味道，真是太诱惑人了。吃过东西之后继续坐车，这次直接到了另外一条沟的最高处原始森林。原始森林还是看过比较多的，这边的也没有太大特点，从原始森林的栈道上走一圈，然后下来走到芳草海和天鹅海。再往下走需要走的距离比较远，于是坐车到箭竹海，一路步行下来到五花海。走在栈道上突然下雨了，于是打着伞在栈道上继续向前，栈道有点湿滑，走的小心翼翼的。走到五花海的时候很幸运，由于下雨那里都没什么人，连租服装照相的都收摊了，于是看到了很漂亮的雨后初晴的五花海，哈哈~~看完之后觉得下雨走的很不爽，于是从五花海出去坐车，然后直达珍珠滩。下车后遇到两个导游，听说我一路走下来的，觉得我很厉害，哈哈哈哈。珍珠滩是西游记的外景地之一，是个斜坡式的瀑布，白色的水花确实很像珍珠。从珍珠滩一路走到镜海停车场，顺便看到了雨后的镜海。（后来我倒是觉得雨后的镜海是一点都不比早晨的镜海差。）继续坐车到诺日朗瀑布拍照后上车回树正休息。</p>
<p>一年前刚去过贵州，风景秀美，水也是清澈怡人。不过和九寨沟相比的话那里的水一般只是蓝和绿，而九寨沟的水看起来则是色彩斑斓，辅以水中生长的植物，非常的赏心悦目。车上的导游说九寨风景是晴看水，雾看山，半晴半雨看云烟，而来到九寨沟第一反应一般都是这里的水如何如何，这样就很容易忽略了山和云。绿树和青山未必独立成景，然而辅以云烟或者配上海子确是秀美绝伦。</p>
<p>第三天，继续。大早晨起来跑出去看静海。从树正出来沿着第一天的路过去，磨房，树正瀑布，老虎海犀牛海全部都没有人，而且早晨景色超好，太爽了，哈哈。不过路实在好远啊，大早晨的没吃饭实在懒得走，找到巡逻的补了个车票，然后坐车到了镜海。镜海确实应该是没有风的时候看才会比较好，一旦有风起了水波，倒影就完全混乱了。早晨镜海的倒影不错，但是因为没有阳光不如昨天看到的雨后镜海那么透亮。不过有一点晨雾还是挺有感觉的。坐车回树正吃早餐，吃完之后有了力气，打算用和昨天不一样的方式来玩九寨沟。于是。。。我选择了走，哈哈，反正路也熟悉了。于是坐车到珍珠滩，开始一路往上走了。从珍珠滩一路步行到箭竹海，开始的时候人还很少，偶尔碰到几个人也还是外国人比较多，走到后面是越走人越多，估计旅行团是上来了。这段基本以看为主，反正照片昨天都拍过了~有一点心得就是，往上走比往下走累好多啊。本来想坐车到天鹅海然后继续步行上去，但是发现车到那里并不停，于是只好在车上多看两眼了。坐车到了原始森林，毕竟昨天都看过了，这一段也不怎么出彩，于是到休息站进餐，所以我就在九寨沟最高点吃了一顿饭，哈哈。吃完东西之后想到这条沟我两遍都是走的，坐车的观景点都没看，反正下去也要坐车，顺便再看一遍吧。继续坐车把这条沟的下车点的观景点看了一遍。值得一提的是可以俯瞰五花海全貌的老虎嘴观景点由于修缮工作不能停车，于是错失了拍照的大好地点，只好在下车点的公路上拍了两张五花海的半景。到了珍珠滩之后觉得镜海到诺日朗那段栈道没有走过，于是从珍珠滩走到了诺日朗的停车点，中间栈道上又看到不少老外。坐车坐到犀牛海，这次改往下走，路上的芦苇海很漂亮，但是好像没有看到玉带河。走到一大半的时候觉得好累啊，但是怎么都走不到头。上车点明明就在公路另一边，就是没有可以横穿的栈道。走到盆景滩的时候终于可以过去坐车了，这时我是实在不想再走了。于是在盆景滩坐车到景区门口，结束了两天的沟内旅游。回到旅店，吃点东西跑去上网，遇到一个沈阳过来开会的美女，一边上网一边聊天，最后回去住的时候发现居然住同一个房间。。。当然同寝室还有4个新加坡人（一个男生三个女生）。</p>
<p>第四天，一大早起来打车到九通宾馆，坐车走人~路上的山很漂亮，山顶的云看着很壮观！不过比较煞风景的就是水坝了，路边的河好多干枯的地方，一到有水多的地方基本上就是有水坝在拦水了。</p>
<p>游记写的和流水账似的，将就看吧~</p>
<p>总结：现在的九寨沟其实地方不是很大，就算想用走的也能一天玩的不错。一个人旅游就是拍照麻烦。可以借鉴的关键事项：去之前头一天打电话订好旅店，去新南门客运站买好车票，找好怎么到旅社的路。到了旅社之后就要计划好主要事项了，玩几天，怎么住，怎么返程之类的。九通车站是头一天放票，旅社的人可以给代买票，收￥10手续费。我在里面玩两天，肯定不能出来买票，让他们代买还是很方便的。关于在里面玩，其实一天足够了，不过对我来说多一天是多一份安心，第一天怎么都不怕玩漏了，第二天路都熟了，就是放心的四处乱跑了。一天的行程可以大早7，8点钟买票进去，坐到山顶的车，然后镜海下车，看早晨的镜海，如果你有体力的话建议你从镜海步行上去，到箭竹海后坐车上行到顶端的原始森林，然后走下来到天鹅海，接着坐车看这条沟的停车观景点。这条沟是重点，不玩就白来了。然后如果有时间可以坐车去长海和五彩池，然后坐车下来到犀牛海往下走到盆景滩结束旅程。不过这样这条沟的停车观景点又会忽略掉，如果知道怎么停车的话就先用与停车反向的方式走栈道，然后坐车停观景点就完美了。虽然坐车的时候看到了，不过我还是觉得忽略了火花海，卧龙海这块地方的停车观景点，唯一的缺憾吧。</p>
<p>对于摄影最大的收获就是我会用光圈优先了，哈哈~~上次去集安学会的用曝光补偿，继续慢慢学习摄影知识中。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=3U-6Wyp3M-k:8-Xn_sQEq7o:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=3U-6Wyp3M-k:8-Xn_sQEq7o:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2010/07/01/trip-to-jiuzhaigou/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>python+pygtk+glade3编程中的白痴问题</title>
		<link>http://taoseeker.net/2010/05/15/idiotic-question-in-python-pygtk-glade3%e7%bc%96%e7%a8%8b%e7%9a%84%e7%99%bd%e7%97%b4%e9%97%ae%e9%a2%98/</link>
		<comments>http://taoseeker.net/2010/05/15/idiotic-question-in-python-pygtk-glade3%e7%bc%96%e7%a8%8b%e7%9a%84%e7%99%bd%e7%97%b4%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Sat, 15 May 2010 12:35:02 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[glade3]]></category>
		<category><![CDATA[pygtk]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=396</guid>
		<description><![CDATA[近期使用这三个工具构建一个gui程序，遇到了若干问题。之所以称之白痴问题，是因为你知道这个问题的答案时一定会觉得这个问题问的好白痴 1.用glade3生成xml文件，然后在python中载入。运行... ]]></description>
			<content:encoded><![CDATA[<p>近期使用这三个工具构建一个gui程序，遇到了若干问题。之所以称之白痴问题，是因为你知道这个问题的答案时一定会觉得这个问题问的好白痴</p>
<p>1.用glade3生成xml文件，然后在python中载入。运行之后没有窗口出现，按ctrl-c结束，停在gtk.main()那里。这是个什么问题呢？百思不得其解。。。直到我看到了这篇文章：http://tristram.squarespace.com/home/2008/5/26/glade-3-pygtk-and-beginning-python.html<br />
原来是mainwindow的公共（common）选项卡下的可见（Visible）属性默认居然是否！！！这个问题真是太白痴了。。。</p>
<p>2.由于有个算法要一直运行，需要多线程，使用后发现一个问题。我点运行了，它不动，我点退出了，算法开始运行了。我晕死。期间使用了无数的测试方法，均没有发现问题所在。吴锡同学到最后说了一句，大概这个也是个初级问题。然后我google一下，发现了这篇文章：http://hi.baidu.com/jzinfo/blog/item/3f7dcc1b149088fbae51337e.html<br />
原来需要在gtk.main()之前调用gtk.gdk.threads_init()这个函数否则gtk独占python解释器！！！果然还是个白痴问题。。。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=xaekBNwEc0Y:1eu0EfY1KC8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=xaekBNwEc0Y:1eu0EfY1KC8:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2010/05/15/idiotic-question-in-python-pygtk-glade3%e7%bc%96%e7%a8%8b%e7%9a%84%e7%99%bd%e7%97%b4%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>python之处理文件编码</title>
		<link>http://taoseeker.net/2010/04/27/codec-in-python/</link>
		<comments>http://taoseeker.net/2010/04/27/codec-in-python/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 08:12:17 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[总结]]></category>
		<category><![CDATA[codec]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=387</guid>
		<description><![CDATA[做了手机天气预报和rss generator，有必要把处理字符串信息过程中遇到的问题总结一下了。 在做这两个东西的时候对python有了一些初步的理解，python用起来真的很舒服。数据结构，函数方法等都... ]]></description>
			<content:encoded><![CDATA[<p>做了手机天气预报和rss generator，有必要把处理字符串信息过程中遇到的问题总结一下了。</p>
<p>在做这两个东西的时候对python有了一些初步的理解，python用起来真的很舒服。数据结构，函数方法等都能够让你写出简短易读的代码。做天气预报的时候出现的问题比较简单，因为信息处理都是自己做的，只有发送的时候使用飞信库，所有抓取的信息甚至都不用解码，在程序里处理后直接发送出去就行，需要注意的就只有程序里写的字符要使用unicode，发送前进行编码就行了。做RSS生成的时候使用了PyRSS2Gen库，最后写入文件是使用此类库的函数进行的，在认知上出了点偏差，发生了不少的错误，饱受折磨好几天。</p>
<p>简而言之，把握住以下几点，在python中进行信息处理的时候应该不会再遇到这么多的信息编码问题。<br />
1.<span style="color: #ff0000">在取得信息的时候（从文件，网络中）尽快进行解码，在程序中使用被解码的信息进行处理，在信息被写出去的时候（写到文件，网络等）再进行编码。</span><br />
2.关于编码和解码，概念一度被我理解的比较混乱。首先是这个：</p>
<blockquote><p>&gt;&gt;&gt; “a”.decode(&#8216;ascii&#8217;)<br />
u&#8217;a&#8217;<br />
&gt;&gt;&gt; u&#8217;a&#8217;.encode(&#8216;ascii&#8217;)<br />
&#8216;a&#8217;</p></blockquote>
<p>这个到底怎么理解呢？我一直认为unicode和ascii是一个类别的，类似raw data的那一种，现在发现不对。因为unicode只是规定了字符集，但是没有规定存储方式，所以只有unicode是类似于raw数据的，它离开存储方式无法生存，而ascii则字符集和存储方式都有，所以说unicode可以作为一种内部数据处理方式，但是不能用来存储。所以，u&#8217;a'是unicode字符串，它被ascii进行编码之后出现ascii编码下的a，而&#8217;a'也可以被解码为unicode的字符串u&#8217;a'。于是在处理数据的时候，其实ascii是应该和utf-8，gb2312这种编码处于一个类别里。由于历史原因，ascii不管在什么地方都会获得良好的支持，所以ascii的信息不经过任何编码解码处理都不会有什么问题，而网络上编码千变万化，比如在中文互联网中gb2312和utf-8就经常相互打架。总结一下，编码和解码的过程应该这样处理，如果是ascii编码，完全不用理会编码解码的问题，而如果是utf-8或者gb2312这种，在取到的时候应当对其进行解码，这样数据就变成了unicode字符串，它适合在程序内部进行处理，在需要对其进行输出的时候，把它进行编码，需要utf-8的就编码为utf-8，需要gb2312的就编码为gb2312。</p>
<p>在rss生成的时候遇到的UnicodeDecodeError的问题，最后确认是因为对某些数据提前进行了encode操作，而写操作的时候依然需要进行encode操作。在python中，<span style="color: #ff0000">已编码的字符串也有encode方法，其操作是按照默认的ascii编码进行解码操作，然后再进行encode</span>[2]。已编码为utf-8的字符是无法被ascii编码进行解码操作的，于是这个过程中就是把编码过的数据当作未编码的数据，试图对其进行解码导致了错误。参考如下，取自第二篇：</p>
<blockquote><p>Why do Python byte strings have an encode() method?</p>
<p>The sharp-eyed amongst you will have noticed that byte strings have an encode() method as well as a decode() method. What does this do? Quite simply, it does a decode-then-encode. The byte string is decoded to Unicode using the default (ascii) encoding, and is then encoded to the target encoding specified in the call to encode() using the appropriate encoding. As you&#8217;d expect, fun and games ensue if the original byte string isn&#8217;t actually encoded in ASCII at all.</p></blockquote>
<p>最终总结：<span style="color: #ff0000">对于python2.5而言,字符类型就两种，str和unicode</span>[3]，下图中左边是str，右边是unicode。<br />
ascii&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;decode(&#8216;ascii&#8217;)&#8212;&#8212;-┐<br />
utf-8&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;decode(&#8216;utf-8&#8242;)&#8212;&#8212;&#8211;┼&#8212;unicode<br />
gb2312&#8212;&#8212;&#8212;&#8212;decode(&#8216;gb2312&#8242;)&#8212;┘</p>
<p>反之为encode操作。</p>
<p>参考：<br />
1.python核心编程第二版<br />
2.Python, Unicode and UnicodeDecodeError，地址在<a href="http://www.stereoplex.com/2009/nov/8/python-unicode-and-unicodedecodeerror/" target="_blank">这里</a>（英文，讲的很好）<br />
3.Re: u&#8217;吴&#8217;和&#8217;吴&#8217;有什么区别？ ，地址在<a href="http://www.newsmth.net/bbscon.php?bid=284&amp;id=54357" target="_blank">这里</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=rR3nk_kKd-c:PIG8xI6GfeQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=rR3nk_kKd-c:PIG8xI6GfeQ:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2010/04/27/codec-in-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>不要在爱的名义下做出伤害别人的事–读和空姐同居的日子，续</title>
		<link>http://taoseeker.net/2010/04/02/do-not-hurt-others-under-love/</link>
		<comments>http://taoseeker.net/2010/04/02/do-not-hurt-others-under-love/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 08:33:10 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[思考]]></category>
		<category><![CDATA[爱情]]></category>
		<category><![CDATA[相处]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=375</guid>
		<description><![CDATA[三年前，和空姐同居的日子给了我很多的感动，我从中认识了不少的理论，并且将其奉为完美恋爱的教科书。三年后，无意间看到了和空姐同居的日子，续， 作为我心中经典的延续，我读完了... ]]></description>
			<content:encoded><![CDATA[<p>三年前，和空姐同居的日子给了我很多的感动，我从中认识了不少的理论，并且将其奉为完美恋爱的教科书。三年后，无意间看到了和空姐同居的日子，续， 作为我心中经典的延续，我读完了它，感动还是有，但是其中发现的问题更多，起码在续集的故事里，他们之间有很多可以避免的事情。（需要先提醒的是，该小说是文学作品，并不一定是真实的，本文只是讨论其抽象出来的问题。）</p>
<p>第二十七章，因为相爱而分手。有没有搞错！女人的逻辑有时候就是这么的怪异而且看上去没有任何的问题。<span style="color: #ff0000;">“恩， 我们俩一起经历了快乐的时光，享受了两个人相爱的幸福，到这里应该停止了，任何事情都一定逃脱不了现实的规律，我们的爱情达到了极限，如果我们继续相处接 下来就会有很多很多我们预想不到也逃避不了的不好的事情出现，然后慢慢地破坏我们之间的感情，我不想等到那一天的到来，也不想因为和你分开是因为我们不再 相爱。”</span>因为相爱而分开？理解不了，即使它看上去多么的符合逻辑。<span style="color: #ff0000;">“我 试过了，其实在选择来加拿大读书的时候，我就已经做好要和你分开的准备，原本我想借着遥远的距离，在我们的爱情最美丽的时候分开，可是我还是舍不得你，所 以我尝试着去继续我们的爱情，甚至试想着和你一起走入婚姻的殿堂，贪婪地去享受更多更多的幸福，可是越幸福我就越害怕，我害怕爱情没有的那一天，巨大的落 差我无法承受。”</span>这个，难道是没有安全感？<span style="color: #ff0000;">毫不犹豫地回答出“是”的时候，我就知道我又上了丫头的当，可是这次不是一个玩笑。我爱冉静，爱到可以为她做任何事情，所以我应该尊重她的决定，即使这个决定是如此的荒唐和难以承受。</span>这 一次，他们两个都错了，冉静的因为相爱而离开其实是没有勇气面对未来的退缩行为。越幸福就越害怕？同样都是消逝的幸福，有比现在更不能接受的情况么？陆飞 也错了，其实两个人都深爱对方，而且深知对方一样深爱自己，陆飞在这种情况下选择了同意分手是因为爱而同意对方的决定，但是这个逻辑本身就是错误的。既然 知道互相之间的深爱，就应该明白这一个“是”不仅是难以接受，更重要的是这一个“是”直接辜负了两个人的心。你爱冉静么？如果爱的话是不是应该让她更幸福 而不是无论对错都同意她的决定？还是那句话，人能不能坚持一件事取决于背后支持他的逻辑，既然如此的深爱，为何找不到这个逻辑来支持你呢？小说看多了，就 会觉得这种分离是用到烂俗的桥段，经过这种经历的男女主角最终还是会和好并且修成正果，但是现实中完全不是这回事，破镜重圆？但是破镜永远不会重圆，因为 这种行为极大地损伤互相之间的感情和信任，它在心灵上留下的是一个巨大的伤疤。冉静错了，因为她的任性，陆飞也错了，他并没有努力的守护住他们的幸福。因 为这是小说，最后他们两个还能重归于好，如果在现实中，这绝对是将茂盛的爱情之树拦腰砍断的行为，两年后能重归于好的可能性微乎其微。你愿意为微乎其微的 可能性而做百分之百的努力么？</p>
<p>第三十七章～第四十五章，冉静归来到他们两个重归于好。看这段真是看的磨蹭死，中国传统的委婉就这样被发挥的淋漓尽致。两个人的各种暗示阿。。。说起来我 真的看不懂暗示，因为暗示可以让你想到这个，也可以想到那个，因为没有明确的表示，所以暗示的人有退路，但是被暗示的人很可能想不明白真正的意思到底是什 么。承认自己喜欢一个人会不会把自己的地位降低不在于承认这个动作，而在于这个动作所引发的心理反应。一般来说承认之后男生相当于身份暴露，心里想的全被 对方知道，被人握住把柄，而女生则可以“仗着”对方喜欢自己而有了底牌，从而处于优势地位。其实这个道理男女通用，所以有先承认的一方比较容易失败之类的 评论。但是如果跳出这个心理反应呢？我是喜欢你，但是我喜欢的是通情达理的你，如果你“仗着”我喜欢你，那么你就不是我所喜欢的那个人，我一样可以放弃 你，那么这种心态下的表白是不是可以无所畏惧呢？不过在故事中，男女主角并没有这种想法，他们互相“爱情角力”了好久，最后男主角受不了了，开门把话说明 白了，同时话里又暴露出了新的问题。<span style="color: #ff0000;">“我 怎么知道你这两年都干什么了，一回来就看见你抱着个女孩，我气了好几天呢，我已经不怪你了，几天后还是回来了，可是你呢，问你有没有女朋友，你又说有，那 我怎么办啊，我已经很卑微地赖在这里了，你还欺负我。”“我欺负你，最后还不是我主动开口请求你留下来住的，你什么时候很卑微地赖在这里了，我有女朋友， 就凭你对我的了解，你听不出来是假的，你对我也太没信心了，反倒是你，两年期间交个男朋友，失恋了才想到回来。”</span>这两个对话下的暴露问题 是，卑微，误会。人确实不可以爱别人超过爱自己太多，因为那样确实会导致自己爱的卑微，这样损伤了自己。也许有人会说我不在乎损伤自己，只在乎对方，那么 这样的爱同样会损伤对方。爱还是要平衡，这在第一部里男主角的理论为何完全没有起作用。。。卑微的爱有两种结果，一方卑微而另一方伤人，或者两人都卑微 （因为都不说出来而达到微妙的平衡）。先对自己好，才能对其他人好。如果一定认为太爱对方了，那么不妨借用Mindhacks上一篇博文，<a href="http://mindhacks.cn/2009/02/07/better-explained-conflicts-in-intimate-relationship/" target="_blank">亲密关系中的冲突解决</a>的结论，把两个人捆绑为利益共同体，这样就不会因为相爱而造成互相伤害。误会，毫无悬念，信任的大敌，爱情的杀手。关于应对措施，我只 想到了在真相不明时的信任+亲口确认，没有亲口确认就不要给事件定性，或者你认为自己能够承受如果那是误会所带来的所有恶果。</p>
<p>男人来自火星，女人来自金星。不得不说这个比喻很好，小说中穿插了一些以冉静的角度写的文字，虽然那些只是女人的千奇百怪的想法中的一种，但是明确的表达出了一些男人无法理解的思维。不要尝试着搞明白所有的想法，不那么重要的部分去包容就好。</p>
<p>篇 尾来自陆飞母亲的反对是非常合乎情理的。卑微和误解只是相处过程中的障碍，属于恋爱中问题，但是因为相爱而分手绝对是原则性错误。虽然我也很喜欢冉静这个 形象，但是人所做出的错误行为绝对是要自己承担后果的，任何人无法替代。错误越严重，要弥补的时候所需要付出的努力就越大。冉静在这个过程中的心态还是很 好的，不急不躁，对所有冷眼泰然处之。在这个过程中如果她表现出一丝的委屈，那么她获得陆飞母亲同意的可能性都会极大的降低。还有最后这段话，这才是我心中真正的爱，共同承担，而不是自己顶下所有的悲伤然后消失。</p>
<blockquote><p><span style="color: #ff0000;">“你先听我说，我明白，我明白陆飞很爱你，正因为他爱你，所以他等了你两年的时间，在这两年的时间里，他表面上似乎一切都很好，但是我知道不是，他只是习惯将最难受的部分留给自己，不想去影响那些关心他的人。他没日没夜地工作，是为事业而努力，也是希望能将时间填补得更满，他依旧可以说说笑笑，是想让自己快乐，更是希望身边关心他的人快乐。他是我的儿子，作为母亲我可以感受到他的感受，你就当阿姨自私好了，我不希望我的儿子爱一个人远远超过爱他自己，我不认为那样他会幸福，尤其他爱的人不知道什么时候不知道什么理由就会离开他。”</span></p>
<p><span style="color: #ff0000;">“阿姨，我知道我之前的行为很不好，可是我现在明白了，我非常珍惜可以再一次和陆飞在一起的机会，我也希望你相信，我同样爱陆飞。”</span></p>
<p><span style="color: #ff0000;">“我没有资格说你不爱他，但是我不认为你可以像他爱你一样爱他。你们出车祸，他断了腿，伤了头，你却基本完好无损，他宁愿自己冒着生命危险，也要保住你安全，这让我更坚定了不允许你们俩在一起的诀心。起初我还担心我的反对会带来许多的麻烦，但是现在他失忆了，他不记得你了，所以我请求你体谅一个母亲的心情，离开他好吗？”陆飞妈妈说得没错，陆飞用所有的行动证明了他对我的爱，他无条件地支持我完成自己的理想。无条件地接受我分手的要求，无条件等候两年等待我的归来，甚至在车祸的一瞬间，他也将受撞击的那一面留给了他自己，而我没有能够以任何的行动证明我爱陆飞和陆飞爱我一样多。</span></p>
<p><span style="color: #ff0000;">“阿姨，我不能答应你这个要求。”可是我还是拒绝了陆飞妈妈的提议，因为我爱陆飞，所以我不会离开。</span></p>
<p><span style="color: #ff0000;">“你……”</span></p>
<p><span style="color: #ff0000;">“阿姨，我不是故意要惹你生气的，就像你说的一样，我已经离开过陆飞一次，绝不会有第二次，无论他变成什么样，即使他不记得我，我都会在他的身边，所以我不能答应你的要求。”</span></p></blockquote>
<p>曾经我心中的爱情神话就这样出现了一个瑕疵，而且这个瑕疵是这么的显眼，罢了，也许神话只应该存在于目标中和心里。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=UiWkn4BQz5w:CkYKTwJXZBE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=UiWkn4BQz5w:CkYKTwJXZBE:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2010/04/02/do-not-hurt-others-under-love/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>孩子的教育之国内教育靠不住（初稿）</title>
		<link>http://taoseeker.net/2010/03/22/chinese-education-is-not-trustable/</link>
		<comments>http://taoseeker.net/2010/03/22/chinese-education-is-not-trustable/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 11:17:28 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[思考]]></category>
		<category><![CDATA[中国教育]]></category>
		<category><![CDATA[孩子]]></category>
		<category><![CDATA[教育]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=372</guid>
		<description><![CDATA[题注：本文是一个计算机硕士所写，他没有学习教育学知识，写的不够专业或者写错了的地方麻烦指出 首先，有很多人跟我说，你连女朋友都没有呢，想孩子的教育是不是太早了点阿。我觉得... ]]></description>
			<content:encoded><![CDATA[<p>题注：本文是一个计算机硕士所写，他没有学习教育学知识，写的不够专业或者写错了的地方麻烦指出</p>
<p>首先，有很多人跟我说，你连女朋友都没有呢，想孩子的教育是不是太早了点阿。我觉得一点都不早，思考孩子的教育同时就是在总结自己的为人处事和反思自己的成长经历。</p>
<p>我是极其不放心把孩子扔给中国中小学教育的，这一点我几个好友基本达成共识了。总结一下的话，从传统上来说，教育是教书育人的过程，然而现在大部分的中国教 育只管教书，不管育人，学校里为了容易管理，老是想出来各种稀奇古怪而且磨灭孩子天性的方法。通俗一点说，就是学校和老师根本不管孩子的心灵成长。</p>
<p>如果不考虑行为的对错，人是不是能够坚定地执行某个行为取决于他自己是否认为自己的行为合理，而这一点很大程度上取决于他自己能不能找到一种自己认为合理的逻辑来支撑自己的行为。我家有一个我相当欣赏的小学生，他有 自己的思 维方式，能够自己独立思考，然后以相当高的分数考上了市里有名的重点初中。但是今年回去的时候，他也说，在他们中学里面，教育方式还是那一套。他们老师有 了孩子，才两岁，然后老师就拿管理自己孩子的方法来管理他们，对他们说课间时间不能越过楼梯，否则监视器里面我会看到，跟我小时候 相比除了多了个监视器以外没什么进步。在班里安插卧底这件事他的老师也在干。其实这件事要不是某一部电影我也不会反应这么强烈。上个学期看了闻香识女人，最后在礼堂上那段慷慨激昂的演讲让我一身冷 汗。我小时候虽然不是个标准的好学生，但是除了去打电动游戏以外没有什么出格的事，于是小时候我是个坚强的告密者，并且活在告密的“白色恐怖”中。当时的 思维很红很专，只要你做好自己的事，而且问心无愧，谁还去怕别人告密啊。但是看完这部电影，我才明白我错得有多么离谱，我们根本就是混淆了是非，然后用错误的逻辑来支撑错误的行为。坚守原则，不出卖同伴，这是非常难得的优良品质，看完后我为我小时候的行为感觉到深深的羞愧。</p>
<p>从这一点来反思中国的教育，我们 从小就是鼓励告密的。我没有告密告到现在，纯粹是因为上了初中之后我“学坏”了。也就是说，我小时候是用告密的逻辑来支撑自己的行为并且心安理得，但是我 直到研究生快毕业了才发现自己的逻辑是错的多么的离谱。另外这些纠正都是建立在我愿意思考人生的基础上的，不会思考的人很多，他们或许就会成为一辈子的告密者。小时候的是非其实记忆很深刻，如果我没有看到这部电影，并且我不愿意思考，不愿意去怀疑小时候的教育，那么我还是会告密下去。所以说如果一个人真的顺 从中国教育走到了最后，那么得到的很有可能是一个智商很高，但是情商很低的人，他不能独立思考，没有自己的人格。确实，这样的人很容易被政府管理，但是他 没有了人的灵魂，所有情况的处理都 是父母学校教的，离开了这些就不会思考，同时没有自己形成的原则。</p>
<p>这个例子只是管中窥豹，在中国的教育中这种为了方便管理而想出来的磨灭孩子未来可能性的方法还多的是。所以，关于这些原则家长必须早教育，因为你不教育，就会有别人或者别的事去教育。我的家长也不是这种观念，我的老师们也没有持这种观念 的，我为什么能形成这些呢？就是因为我看的东西。所以从家长的角度来说，他们掌控不了我的发展，同时由于没有足够的心灵上的沟通，他们也掌握不了我的心里 到底在想什么。同时，我看的东西也许是我决定的，也许是随机的，不过你能放心让孩子随机的发展么？显然没有一个家长会愿意，但是绝大多数的家长意识不到这样会 导致孩子的发展是随机的，例如用我妈的话说，这些东西你“慢慢就会知道了”。是的，还好我慢慢的随机的学到了这些，没有随机的跟着小时候的一些不好的习惯越走越远。</p>
<p>记得曾经有个电视节目里面出现过一个台湾的老师，她教育出来的孩 子在和别人对话的时候说了这么一句。别人说，咱们下午去玩吧，她的孩子说，不要，我和我爸爸有个约会，然后别人说，你真可怜，居然和你爸爸有个约会，她的孩子说，你才可怜呢，你和你爸爸没有约会。这段对话我非常的喜欢，它反映出不仅这个家庭沟通良好，而且孩子有自己的思考，他可以用一个极其温馨的逻辑来支 撑自己的行为。</p>
<p>国内不是没有好老师，但是完全靠运气，我有个同学就遇到了一个好老师，我十分的羡慕他。我认为一个老师能被评价为好老师，首先它要从心里去爱护 自己的学生，注重孩子心灵的成长，而不是纠缠于丢个钢笔的事儿去冤枉别人。从小就不公正，而是人云亦云，被小孩子看在眼里，所造成的后果最少会一直影响直 到有独立思维能力。然而什么时候会有独立思维能力呢？其实我看到很多成年人一样没有。。。<br />
协助论证文章一篇：&lt;中国孩子&gt;http://www.dapenti.com/blog/more.asp?name=xilei&amp;id=27864<br />
这是个逆境成才的例子，如果让我选择的话我不愿意选择让孩子这样成才。其实是不是成才也没有关系，重要的是孩子要生活得幸福快乐。</p>
<p>尾注：对于无理取闹的，赠送一句话。你有孩子吗？如果你有孩子，或今后将要有孩子，我想你能够理解一个未来总会成为家长的人对因学校的错误教育而对孩子产生终生影响的担忧和关切。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=MBAAHZFsDWo:2pz_D5RkCzY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=MBAAHZFsDWo:2pz_D5RkCzY:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2010/03/22/chinese-education-is-not-trustable/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>Python的变量名</title>
		<link>http://taoseeker.net/2009/09/25/variable_name_in_python/</link>
		<comments>http://taoseeker.net/2009/09/25/variable_name_in_python/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 03:38:15 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[总结]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=364</guid>
		<description><![CDATA[最近用python重写了天气预报，对python的变量名有了一些认识。 python的变量名和以前接触过的c/c++等完全不一样。c/c++的变量名的思想应该是这样，分配之后变量名就永远的关联到了编译器分配到... ]]></description>
			<content:encoded><![CDATA[<p>最近用python重写了天气预报，对python的变量名有了一些认识。</p>
<p>python的变量名和以前接触过的c/c++等完全不一样。c/c++的变量名的思想应该是这样，分配之后变量名就永远的关联到了编译器分配到的内存，任何对此变量名进行的操作都最终落实在对这段内存的操作上。</p>
<p>python中的变量名更像lisp的感觉，内存和变量名的关系并不是永远“绑定”的，这个变量名更像是一个指针，它指向了那个“变量”。</p>
<p>拿最简单的a=1来做例子。在c/c++中，=的意义是赋值，它对应的操作是把1赋值到a所指向的内存中。1这个表示在c/c++中是一个int型整数，存到a对应内存的是int型的整数1。为什么不同类型的赋值会出错？因为那个变量所指向的是一段可存储被赋值类型的内存空间，无法保证这个不同的类型在那段内存不出现问题。（由此引出的类型转换暂不考虑）如果再用b=a，则是将a的内容复制到b中去。在python中，=的意义虽然也是赋值，但是它做的完全不是这样的操作。根据python的声明，一切都是对象（变量名是不是还没有体会到），那么这个1也是对象，a=1就是将a指向1这个对象，而再用b=a则是将b指向a所指向的内容。那既然a和b都指向同一个地方，为什么修改了a之后b不变呢？举例，执行a=2，再看b的话你会发现还是1。其实这个还是惯性思维的原因。a=2实际上执行的操作是将a指向2这个对象，而不是将a所指向的内存改为2，所以a指向了2，而b还是指向1。可以体现这一点的比较容易的方法是用字符串。如果你用下标改了字符串的内容，两个“变量”都会变。</p>
<p>所以在python中，变量名不如叫名字（name）更为贴切，而在这种机制下，名字空间就显得尤为重要。</p>
<p>注：此文没有经过c/c++编译器及python解释器的证明，如有错误请指出，多谢</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=FgA3vap_rTE:_HQkAkS-f6o:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=FgA3vap_rTE:_HQkAkS-f6o:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/09/25/variable_name_in_python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>[编程珠玑第二章]啊哈，算法</title>
		<link>http://taoseeker.net/2009/09/16/pearls_aha_algorithm/</link>
		<comments>http://taoseeker.net/2009/09/16/pearls_aha_algorithm/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 15:06:04 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[二分]]></category>
		<category><![CDATA[内存交换]]></category>
		<category><![CDATA[类别标识]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=331</guid>
		<description><![CDATA[看完编程珠玑第二章，发现确实很好玩。第二章用三道题目引出三个基本操作，然后再将这三个操作推广到更一般的情形。 二分搜索：将线性搜索的O(n)时间降到O(log2n) ，要求单调 看这句话似... ]]></description>
			<content:encoded><![CDATA[<p>看完编程珠玑第二章，发现确实很好玩。第二章用三道题目引出三个基本操作，然后再将这三个操作推广到更一般的情形。</p>
<ol>
<li>二分搜索：将<span style="color: #ff0000">线性搜索</span>的O(n)时间降到O(log<span style="font-size: 4pt">2</span>n) ，要求单调
<ol>
<li>看这句话似乎很平凡无奇，但是这句话确实是二分搜索适用范围的精确表达，关键在于线性搜索四个字。你明确知道什么样的是线性搜索么？我不敢说我很明确，但是在这里我把它总结为在线性解空间里寻找解。曾经有人给我讲过二分枚举法，一个奇形怪状的容器，问水面多高的时候水是总容积的一半。这就是个线性有序的解空间，可以进行二分搜索。如果你可以求得高与体积的关系式，那么直接根据一半体积求高的做法就更像是hash查找。</li>
<li>二分搜索的核心问题：1.有序2.有个比较“大小”的方法来将解空间每次减半（定义一个范围，在该范围内表示元素的方式，确定哪一半范围存在缺失整数的方法）</li>
<li>A问题，有一个连续的文件里面有40亿个32位整数，找出至少一个不在这个文件里的32位整数。朴素的二分思想，每次找出存在缺失整数的那一堆。</li>
</ol>
</li>
<li>向量旋转：问题B：用几十个字节的额外空间将一个n元向量x在正比于n的时间内左旋i个位置。对应于实际问题中交换相邻的不同大小的内存块。<br />
可用方法：</p>
<ol>
<li>“杂技”算法。以“元素”为单位（元素不仅可以为数组元素，还可以为一切旋转单位），循环移动该向量中的元素，若元素个数为n，移动距离为d，那么需要移动n与d的最大公约数趟。</li>
<li>等大小内存块移动法。目的：ab-&gt;ba，假设b比a长，那么取b后面的与a等长的一段b<span style="font-size: 6pt">r</span>，与a交换。于是效果就是ab<span style="font-size: 6pt">l</span>b<span style="font-size: 6pt">r</span>-&gt;b<span style="font-size: 6pt">r</span>b<span style="font-size: 6pt">l</span>a，a已经到了最终位置，剩下的目标就是交换bl和br。递归操作。</li>
<li>求逆法。(a&#8217;b')&#8217;＝ba<br />
reverse(0, i-1);     //abcdefgh-&gt;cbadefgh<br />
reverse(i-1, n);     //cbadefgh-&gt;cbahgfed<br />
reverse(0, n);       //cbahgfed-&gt;defghabc</li>
</ol>
<p>直观上比较，杂技算法对每个元素仅存取一次，而求逆要两次，那么杂技算法算法的速度要两倍于求逆。实际上当n比较大而旋转距离变长的时候，由于杂技算法的高速缓存性能比较差，而求逆大部分操作为顺序读取，由于缓存局部性的影响，杂技算法的实际表现并不如求逆算法。</li>
<li>标识：当使用<span style="color: #ff0000">等价关系</span>来定义类别时，定义一种标识，使得类中每一项都具有相同的标识，而该类以外的其他项没有，这样就可以将一个感觉无从下手的问题变成一个用已知数据结构和算法解决的问题。（ps：后续还可以根据标识进行排序，二分等等操作）
<ul>问题C，挑选出一个词典中所有的变位词，就是如deposit和topside这样关系的词。如果要考虑单词字母的所有排列，那是注定要失败的方法。因为算法复杂度实在太大了。注意描述，deposit和topside是一类，他们是变位词，也就是说他们存在着某种等价关系。只要给所有变位词定义上同样的标识，然后将其按照标识排序，这个问题就变成了一个很容易下手的问题。</ul>
</li>
</ol>
<p>后记：本章主题是<span style="color: #ff0000">寻找合适的算法</span>，绝对不要有了想法就急不可耐的去实现，就是要找到自己的<span style="color: #ff0000">灵机一动</span>，用巧妙的方法来实现，要“<span style="color: #ff0000">建设性的懒惰</span>”。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=vj3o1ExP9Pk:ZnBA7qgPs-8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=vj3o1ExP9Pk:ZnBA7qgPs-8:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/09/16/pearls_aha_algorithm/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>c语言宏处理器哈希表 &amp; Python字典类</title>
		<link>http://taoseeker.net/2009/09/10/macro_hash_and_python_dict/</link>
		<comments>http://taoseeker.net/2009/09/10/macro_hash_and_python_dict/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 16:08:54 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[宏处理器]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=347</guid>
		<description><![CDATA[哈希算法，用一个算式result=hash(key)就可以大致确定所需数据的位置，大大简化了数据查找的复杂度。此算法的关键在于建立一种两类数据间的映射，就是那个hash函数的选定。另外有个很重要的... ]]></description>
			<content:encoded><![CDATA[<p>哈希算法，用一个算式result=hash(key)就可以大致确定所需数据的位置，大大简化了数据查找的复杂度。此算法的关键在于建立一种两类数据间的映射，就是那个hash函数的选定。另外有个很重要的问题就是hash冲突，就是不同的key得到了同样的result。常用冲突解决法有拉链法（我认为叫做链表法更容易理解）和平面地址法两种，后面有描述。</p>
<h3>c语言宏处理器（出自C程序设计语言）</h3>
<p>“这段代码很典型，可以在宏处理器或编译器的符号表管理例程中找到。”</p>
<div>
<div>例如考虑define语句。</div>
<div>#define IN 1</div>
<div>需要把名字IN和替换文本1存入到某个表中，此后当名字IN出现在某些语句中时，就必须用1来替换IN。</div>
<div>以下两个函数用来处理名字和替换文本。install(s, t)函数将名字s和替换文本t记录到某个表中，其中s和他仅仅是字符串。lookup(s)函数在表中查找s，若找到，则返回指向该处的指针；若没找到，返回NULL。</div>
<div>该算法采用的是散列查找方法，将输入的名字转换为一个小的非负整数，该整数随后将作为一个指针数组的下标。数组的每个元素指向某个链表的表头，链表中的各个块用于描述具有该散列值的名字。如果没有名字散列到该值，则数组元素值为NULL。</div>
<div style="text-align: center"><img src="http://docs.google.com/drawings/image?id=sXIRmebJr1O48DzebAhROsg&amp;w=267&amp;h=267&amp;rev=179&amp;ac=1" alt="" /></div>
<div style="text-align: left">链表块结构：</div>
<div style="text-align: left">struct nlist {                /*链表项*/</div>
<div style="text-align: left">struct nlist *next;    /*链表中下一表项*/</div>
<div style="text-align: left">char *name;            /*定义的名字*/</div>
<div style="text-align: left">char *defn;            /*替换文本*/</div>
<div style="text-align: left">}</div>
<div>指针数组：</div>
<div>#define HASHSIZE 101</div>
<div>static struct nlist *hashtab[HASHSIZE];    /*指针表*/</div>
<div>散列函数hash，通过for循环将上次计算的结果值变换（乘以31）得到的值加上当前字符值（*s + 31 * hashval），然后对数组长度取模。这并不是最好的散列函数，但比较简短有效。</div>
<div>unsigned hash(char *s)</div>
<div>{</div>
<div style="padding-left: 30px">unsigned hashval;</div>
<div style="padding-left: 30px">for (hashval = 0; *s  != ”; s++)</div>
<div style="padding-left: 60px">hashval = *s + 31 * hashval;</div>
<div style="padding-left: 30px">return hashval % HASHSIZE;</div>
<div>}</div>
<div>strdup函数将通过参数传入的字符串复制到某个安全的位置</div>
<div>char *strdup(char *s)</div>
<div>{</div>
<div style="padding-left: 30px">char *p;</div>
<div style="padding-left: 30px">p = (char *) malloc(strlen(s) + 1);</div>
<div style="padding-left: 30px">if (p != NULL)</div>
<div style="padding-left: 60px">strcpy(p, s);</div>
<div style="padding-left: 30px">return p;</div>
<div>}</div>
<div>lookup函数发现表项存在，则返回指向该表项的指针，否则返回NULL。散列过程生成了在数组hashtab中执行查找的起始下标，若该字符串可以找到，则它一定位于该起始下标指向的链表的某个块中。</div>
<p>struct nlist *lookup(char *s)</p>
<div>{</div>
<div style="padding-left: 30px">struct nlist *np;</div>
<div style="padding-left: 30px">for (np = hashtab[hash(s)]; np != NULL; np = np-&gt; next)</div>
<div style="padding-left: 60px">if (strcmp(s, np-&gt;name == 0))</div>
<div style="padding-left: 90px">return np;    /*found*/</div>
<div style="padding-left: 30px">return NULL;        /*not found*/</div>
<div>}</div>
<p>install函数借助lookup判断待加入的名字是否已经存在。若存在则用新的定义取而代之；否则创建新表项。若无足够空间创建新表项，则install函数返回NULL</p>
<div>struct nlist *lookup(char *);</div>
<div>char *strdup(char *);</div>
<div>struct nlist *install(char *name, char *defn)</div>
<div>{</div>
<div style="padding-left: 30px">struct nlist *np;</div>
<div style="padding-left: 30px">unsigned hashval;</div>
<div style="padding-left: 30px">if ((np = lookup(name)) == NULL){    /*not found*/</div>
<div style="padding-left: 60px">np = (struct nlist *) malloc(sizeof(*np));</div>
<div style="padding-left: 60px">if (np == NULL || (np-&gt;name = strdup(name)) == NULL)</div>
<div style="padding-left: 90px">return NULL;</div>
<div style="padding-left: 60px">hashval = hash（name）;</div>
<div style="padding-left: 60px">np-&gt;next = hashtab[hashval];</div>
<div style="padding-left: 60px">hashtab[hashval] = np;</div>
<div style="padding-left: 30px">} else                                 /*already exist*/</div>
<div style="padding-left: 30px">free((void *) np-&gt;defn);    /*free previous defn*/</div>
<div style="padding-left: 30px">if ((np-&gt;defn = strdup(defn)) == NULL)</div>
<div style="padding-left: 60px">return NULL;</div>
<div style="padding-left: 30px">return np;</div>
<div>}</div>
<div>三点疑问：</div>
<div>1.hash函数如何选的？</div>
<div>2.hashsize如何选定？</div>
<div>3.作为宏处理器，又用了宏定义？</div>
</div>
<h3>Python字典类（代码之美 第18章）</h3>
<div>“字典是python语言的基本数据类型，它的作用就像awk里的关联数组或者perl里的哈希表”</div>
<div>python的字典类实现中一般有以下内容：</div>
<div>int ma_fill        13</div>
<div>int ma_used    13</div>
<div>int ma_mask    31</div>
<div>PyDictEntry ma_table[]:</div>
<div>[0]: aa, 1        hash(aa) == -1549758592, -1549758592 &amp; 31 = 0</div>
<div>.</div>
<div>.</div>
<div>.</div>
<div>域成员的名字前缀ma_的意思是映射，在Python里它专指那些提供关键字/数据元素匹配功能的数据结构。域成员：</div>
<div>ma_used    有关键字的存储单元数量。加入关键字增1，删除减一。</div>
<div>ma_fill        有关键字存储单元和哑存储单元的总数。删除关键字的时候不变化</div>
<div>ma_mask    对应哈希表大小的比特掩码。哈希表有ma_mask+1个存储单元。规定存储单元数永远是2的幂，那么ma_mask就是2**n &#8211; 1</div>
<div>ma_table    指向PyDictEntry结构的数组。这个结构包含几个指针，分别指向关键字对象，数据元素对象，保存关键字哈希值的缓存。缓存哈希值是为了提高速度，如字典大小变化的时候。</div>
<h5>为小哈希表而做的特别优化</h5>
<div><span style="color: #ff0000"> </span>PyDictObject还包括一个拥有8个存储单元 的哈希表。不多于5个元素的小字典可以直接放在这张表内，从而免去了调用malloc（）的额外开销。同时这样做还提高了缓存的局部性，拿x86 GCC编译的PyDictObject来说，它的大小是124字节，刚好可以放进两个大小为64字节的缓存行。因为一般参数关键字用到的字典大部分都只包 含1到3个关键字，所以小哈希表的这种优化措施也提高了函数调用的性能。</div>
<div><strong>为字符串关键字优化</strong></div>
<div>一个字典里可以包括多种数据类型的关键字。不过在大多数Python程序的类实例和模块中，它们内部字典只用字符串做关键字。</div>
<div>首先，字符串比较时不会抛出异常，所以可以掠过一些不必要的错误检查。其次，比较两个字符串是比较简单的事，不像一般Python对象可能会有&lt;, &gt;, &lt;=, &gt;=, ==和!=这样的比较操作。</div>
<div><em>Java版优化：</em></div>
<div>Python的Java版本，Jython有一个专用字符串的字典类型：org.python.org.PyStringMap。而用 户编程时所用的字典类实际上是另外一个叫做org.python.core.PyDictionary的类型，内部使用 java.util.Hashtable类来保存内容，并加了一个简介层来提供子类化能力。Python不允许用户用其它数据类型替换内建的 __dict__字典类，从而免去了子类化的麻烦<span style="color: #ff0000">（有什么麻烦？不明白）</span>。对Jython来说，有一个专门的字符串类型字典还是有意义的。</div>
<div><em>C版优化：动态选择存储方法</em></div>
<div>一开始，字典调用之处理字符串的方法，当用户需要检索非字符串数据类型时，就调用能够处理通用数据类型的方法。 PyDictObject只有一个域成员ma_lookup，他是一个函数指针</div>
<div>struct PyDictObject{</div>
<div>&#8230;</div>
<div>PyDictEntry *(*ma_lookup)(PyDictObject *mp, PyObject *key, long hash);</div>
<div>}</div>
<div>字典类通过（dict-&gt;ma_lookup）(dict, key, hash)来查找关键字，里面的参数key是一个指针，它指向代表关键字的PyObject，参数hash是根据关键字算出来的哈希值。刚开始 时，ma_lookup指向函数lookdict_string，这个函数假定字典里所包含的关键字和待检索的关键字都是字符串类型的，用结构 PyStringObject表示。如果字典里有非字符串类型的关键字，或是用户想查找这样的关键字时，ma_lookup就会改成指向更加通用的查表函 数。当lookdict_string函数发现其参数的实际类型不是字符串时，它就会修改ma_lookup，并调用新的函数来进行查找。（这就是说，如 果你对一个纯字符串版本的字典进行非字符串检索时，比如d.get(1)，整体检索速度会比通用的情况要慢，哪怕这是一次失败查询。接下来字典的检索函数 就会切换到通用版本。这时候就算查的还是字符串类型的关键字，查询速度已经不能跟纯字符串版本同日而语了。）PyStringObject类型的子类应该 被认为时非字符串类型，因为子类里可能会定义相等比较操作。</div>
<div><strong>冲突处理</strong></div>
<div>拉链法：由于建立链表需要为每个链表元素申请内存空间，而内存分配比较慢。同时，遍历链表有可能会降低缓存局部性。此法被Python弃用。</div>
<div>开放地址法：如果第一次在存储单元i中没有找到待查关键字，那就按照某种固定的模式尝试其他存储单元。</div>
<div>/* 起始存储单元 */</div>
<div>slot = hash;</div>
<div>/* 初始干扰值 */</div>
<div>perturb = hash;</div>
<div>while (&lt;存储单元非空&gt; &amp;&amp; &lt;单元内的值不等于关键字值&gt;){</div>
<div>slot = (5*slot) + 1 + perturb;</div>
<div>perturb &gt;&gt;= 5;</div>
<div>}</div>
<div>在c语言的代码里，5*slot可以用位运算和加法来替代：(slot&lt;&lt;2) + slot 。一开始，干扰因子perturb直接取成哈希值；接下来，他的二进制值在每次循环的时候右移5位。移位操作可以让哈希值的每个比特都能够迅速地参与到探 索尝试的计算中。经过若干次移位操作，干扰因子最终会变为0，此时探索模式就退化为slot=(5*slot)+1，它生成的数值可以使0和 ma_mask之间的任何一个数。因此，这种尝试模式可以确保：要么是找到关键字（如果是在检索字典），要么是找到一个空的存储单元（如果是准备向字典里 插入数据）。</div>
<div>每次偏移量5比特是根据试验得出来的。 跟4和6相比，5可以把冲突率再降低一点（Objects/dictobject.c里有大段的注释详细讨论了这种优化的前世今生。）</div>
<div><strong>调整大小</strong></div>
<div>关于关键字数量，现在的做法是保证哈希表最多有三分之二是满的。这个比例是折中的结果：太满就会导致更多的冲突，太稀疏就会浪费太多内存，同时也不利于缓存处理。</div>
<div><em>确定新尺寸</em></div>
<div>不超过5万个关键字的中小规模哈希表，新的尺寸应该是ma_used*4。大多数使用大字典的Python程序都会在初始阶段构建字 典，接下来做的就只是检索关键字或者是遍历字典。这时4倍会让字典显得有点稀疏（1/4的存储单元有数据），好处是在初始阶段构建字典时减少了字典调整的 次数。对于超过5w个关键字的大型字典，规定新尺寸是ma_used*2，可以避免浪费过多的内存空间。</div>
<div><strong>一个合算的内存折中方案：空闲列表</strong></div>
<div>Python在用参数关键字作函数调用时，会创建字典实例，然后在函数返回时销毁它们。这种操作发生的很频繁，字典实例的生命周期也很短。这种情况的一个有效优化措施是回收那些不再使用的数据结构。</div>
<div>Python用一个叫做free_dicts的数组来保存不再使用的字典。在Python 2.5中，这个数组长度是80.当需要创建PyDictObject时，Python会设法从free_dicts里找到一个指针，重用它指向的数据结 构。当字典被删除时， 它们就会被加到free_dicts数组中。如果此时数组已经满了，那就直接释放这个字典对象。</div>
<div><strong>迭代和动态变化</strong></div>
<div>在遍历迭代的过程中，Python不允许增加或者删除字典的存储单元。 当iter*（）系列方法第一次被调用时，迭代器会记住字典中所有元素的个数。如果在遍历迭代过程中，字典大小发生变化，迭代器就会抛出 RuntimeError异常，告诉用户：“迭代过程中字典的大小发生了变化”。</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=znx2WAIr_-U:s1fA_7YQPWQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=znx2WAIr_-U:s1fA_7YQPWQ:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/09/10/macro_hash_and_python_dict/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>第四章. 模块性：清晰，简洁</title>
		<link>http://taoseeker.net/2009/09/08/taoup_modularization/</link>
		<comments>http://taoseeker.net/2009/09/08/taoup_modularization/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 13:21:12 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[unix编程艺术]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=337</guid>
		<description><![CDATA[半年前看的《unix编程艺术》，笔记电子化。红色为重点部分，蓝色为个人废话。 模块化原则：模块间通过应用程序编程接口（API）──一组严密，定义良好的程序调用和数据结构来通信。 API... ]]></description>
			<content:encoded><![CDATA[<p><strong> </strong>半年前看的《unix编程艺术》，笔记电子化。红色为重点部分，蓝色为个人废话。</p>
<p>模块化原则：模块间通过应用程序编程接口（API）──一组严密，定义良好的程序调用和数据结构来通信。</p>
<p>API标准：若试着用纯人类语言来描述设计（不摘录源代码），能否将事情说清楚？在编码前为API编写一段非正式书面描述是个好习惯。一些最有能力的开发者，<span style="color: #ff0000">一开始总是在定义接口，然后编写简要注释，对其进行描述，最后才编写代码</span>──因为编写注释的过程就阐明了代码必须达到的目的，这种描述能够帮助组织思路，本身就是十分有用的模块说明。P85<span style="color: #0000ff">（编写简要注释这个习惯半年了还没有养成）</span></p>
<p>Hatton的经验数据表明，最佳模块长度为200~400逻辑行，大概400~800物理行。P87</p>
<p>紧凑性：若有经验的用户不需要操作手册，那么着个设计满足紧凑性。评测API的经验：若编程者要记忆的条目大于<span style="color: #ff0000">七</span>，则不大可能算是严格紧凑的。合理对待紧凑性，设计中尽量考虑，绝不随意抛弃。<span style="color: #0000ff">（七，人类短期记忆的极限）</span></p>
<p>正交性：每一个动作（无论是API调用，宏调用，还是语言运算）只改变一件事，不会影响其它。无论控制什么系统，改变一个属性的方法有且只有一个。</p>
<p>重构：改变代码的结构和组织，而不改变其外在行为，目的在于提高正交性。</p>
<p><span style="color: #ff0000">SPOT</span>：真理的单点性（Single Point of Truth）。不要重复自身。任何一个知识点在系统内部都应有一个唯一，明确，权威的表述。数据结构中也存在类似原则，“无垃圾，无混淆”。无垃圾是指<span style="color: #ff0000">数据结构</span>（模型）应该<span style="color: #ff0000">最小化</span>，无混淆是指在真实世界中绝对明确清晰的<span style="color: #ff0000">状态</span>在模型中也应该<span style="color: #ff0000">同样明确清晰</span>。<span style="color: #0000ff">（不要重复自身这条基本在每本编程方法的书里都有）</span></p>
<p>自顶向下和自底向上：考量差异的方法。问一下设计是围绕主事件循环（常常具备与其非常接近的高级应用逻辑）组织，还是围绕主循环可能调用的所有操作的服务库组织代码。P95</p>
<p>模块化编码需要考虑的问题：</p>
<ul>
<li>有多少全局变量？全局变量是模块化的毒药，很容易使各模块轻率、混乱地互相泄露信息。</li>
<li>模块大小是否在最佳范围？多了会产生长期的维护问题。若不知自己的最佳范围，则最好保守，坚持下限。</li>
<li>模块内的单个函数是否太大？内部不要太复杂。</li>
<li>代码是否有内部API？即可作为单元向其它人描述的函数调用集和数据结构集。且每个单元都封装了某一个层次的函数，不受其它代码影响。</li>
<li>API的入口点是否超过七个？哪个类有七个以上的方法？数据结构成员是否超过七个？</li>
<li>每个模块的入口点数量如何分布？是否不均？有很多入口点的模块真的需要那么多入口点么？模块的复杂性往往和入口点数量的平房成正比。</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=7FqZ5l2Vf5Q:ERGrGwq4JQA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=7FqZ5l2Vf5Q:ERGrGwq4JQA:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/09/08/taoup_modularization/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>Unix哲学基础</title>
		<link>http://taoseeker.net/2009/09/08/taoup_principles/</link>
		<comments>http://taoseeker.net/2009/09/08/taoup_principles/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 11:59:33 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[unix编程艺术]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=334</guid>
		<description><![CDATA[半年前看的《unix编程艺术》，笔记电子化。 By Doug Mcllorg： 让每个程序就做好一件事，有新任务就重新开始，不要往原程序中加入新功能而搞的复杂。 假定每个程序的输出都会成为另一个程序... ]]></description>
			<content:encoded><![CDATA[<p>半年前看的《unix编程艺术》，笔记电子化。</p>
<h3>By Doug Mcllorg：</h3>
<ol>
<li>让每个程序就做好一件事，有新任务就重新开始，不要往原程序中加入新功能而搞的复杂。</li>
<li>假定每个程序的输出都会成为另一个程序的输入，哪怕那个程序还是未知的，输出中不要有无关信息干扰。避免使用严格的分栏格式和二进制格式输入。不要坚持使用交互式输入。</li>
<li>尽可能早的将设计和编译的软件投入试用，哪怕是操作系统。理想状况应该是几个星期内。对拙劣的代码别犹豫，扔掉重写。</li>
<li>优先使用工具而不是拙劣的帮助来减轻编程任务的负担。</li>
</ol>
<p>重点：一个程序只做一件事，并做好，程序要能协作，程序要能处理文本流。</p>
<h3>By Rob Pike：</h3>
<ol>
<li>程序耗费运行时间的地方无法判定，瓶颈经常出现在想不到的地方。证实瓶颈之前切勿急于找地方改代码。</li>
<li>估量：没有估量代码，尤其未找到最耗时的部分前不要去优化速度。</li>
<li>花哨算法在n很小的时候通常很慢，而n通常很小。花哨算法的常数复杂度很大，除非n一直很大，否则不要用。（拿不准就穷举）</li>
<li>花哨算法比简单算法更容易出现bug，难以实现。尽量简单算法配合简单数据结构。</li>
<li>数据压倒一切。编程的核心是数据结构，而不是算法。</li>
</ol>
<h3>Unix系统的十七个原则</h3>
<ol>
<li>模块原则：使用简单的结构拼合简单的部件。</li>
<li>清晰原则：清晰胜于机巧。优雅清晰的代码不仅不容易崩溃，而且更易于让后来的修改者立刻理解。</li>
<li>组合原则：设计时考虑拼接组合，互相通信。</li>
<li>分离原则：策略同机制分离，接口同引擎分离。如：前端策略，后端机制，设计分层。</li>
<li>简洁原则：设计要简洁，复杂度能低则低。</li>
<li>吝啬原则：除非确无他法，不要编写庞大的程序。（体积大复杂度高）</li>
<li>透明性原则：设计要可见，以便审查和调试。</li>
<li>健壮原则：健壮源于透明与简洁。（避免在代码中出现特例）</li>
<li>表示原则：把知识叠入数据以求逻辑质朴而健壮。（在设计中应主动将代码的复杂度转移到数据中去）</li>
<li>通俗原则：接口设计避免标新立异。</li>
<li>缄默原则：如果一个程序没什么好说的，就保持沉默。</li>
<li>补救原则：出现<span style="color: #ff0000">异常</span>时马上退出并给出足量错误信息。宁为玉碎，不为瓦全。</li>
<li>经济原则：宁花程序一分，不花程序员一秒。（人少花时间，交给机器）</li>
<li>生成原则：避免手工hack，尽量编写程序去生成程序。如makefile生成器。</li>
<li>优化原则：雕琢前先得有原型，跑之前先学会走。（先制作<span style="color: #ff0000">原型</span>系统，再精雕细琢，优化前先确保能用。 | 先求运行，再求正确，最后求快。）</li>
<li>多样原则：绝不相信所谓“不二法门”的断言。</li>
<li>扩展原则：设计着眼未来，未来总比预想快。</li>
</ol>
<h3>应用实例：</h3>
<ul>
<li>只要可行，一切都应该作成与来源和目的无关的过滤器。</li>
<li>数据应尽可能文本化。</li>
<li>数据库部署和应用协议应尽可能文本化。</li>
<li>复杂的前端（用户界面）和后端应该泾渭分明。</li>
<li>如果有可能，用c语言编写前先用解释性语言搭建原型。</li>
<li>当且仅当只用一门语言编程会提高程序复杂度时，混合语言编程比单一语言编程来的好。</li>
<li>宽收严发。</li>
<li>过滤时，不需要丢弃的信息决不丢。</li>
<li>小就是美，在确保完成任务的基础上，程序的功能尽可能少。</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=XB2aHa4FS4I:IqQ_I_VQ9v8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=XB2aHa4FS4I:IqQ_I_VQ9v8:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/09/08/taoup_principles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>可控的心理状态与效果</title>
		<link>http://taoseeker.net/2009/08/26/control-your-life-by-mind/</link>
		<comments>http://taoseeker.net/2009/08/26/control-your-life-by-mind/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 03:04:37 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[思考]]></category>
		<category><![CDATA[lifehack]]></category>
		<category><![CDATA[心理学]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=326</guid>
		<description><![CDATA[首先，我认为我所阐述的东西都是大概率的东西，而不是绝对的。 在好友那里看到了一段视频(点击这里)，说的是如何用意念来改变自己的生活。说的很神道，像宗教似的，但是其中的道理却... ]]></description>
			<content:encoded><![CDATA[<p>首先，我认为我所阐述的东西都是大概率的东西，而不是绝对的。</p>
<p>在好友那里看到了一段视频(<a title="这是一个秘密" href="http://v.youku.com/v_playlist/f3474112o1p0.html" target="_blank">点击这里</a>)，说的是如何用意念来改变自己的生活。说的很神道，像宗教似的，但是其中的道理却是存在的。</p>
<p>这段视频里将这个秘密叫做吸引力定律，说只要你不停的想，你想的东西就会被吸引到现实中来。这个定律作用范围很广，而且不会区分否定词，如果你一直想不要什么，那么你不想要的这个东西也会被吸引到现实中来。同学将其称为主观唯心主义。</p>
<p>其实这些都可以得到科学的解释。这个“不停的想”所发生作用的途径并不是在视频里所出现的什么宇宙，特殊频率，而是你自己。</p>
<p>首先是自信和催眠，就是这个“不停的想”。自信是一个很强大的心理武器，用好它的话可以由内而外的狠狠地改变你的气质和精神面貌，但是自信有足和不足的量化水准。自我催眠是一个可控的增强自信的方法。所谓“不停的想”就是以自我催眠的方式来增加自信。虽然说自我催眠的效果也会受个体状态而受到影响，但是铺天盖地的自我催眠能起到作用的概率还是很大的。在自我催眠的过程中，自信会影响自己的做事态度，方式及完成程度，而这些又会反过来增强自信，顺利的话它们会形成正向循环反馈，从而形成强大的自信。当然这些也不是凭空就能出来。自信需要一个强大的支撑点，你需要很明白你为了什么而自信，有了坚实的地基才会有稳定的上层建筑。其次，这个过程远没有说的这么简单容易，它需要有足够的精力和毅力来支撑整个过程，成功之后还要有巩固过程来使它不容易退回去。自信有那种“自愈”的特点，短期的改变会被“自愈”到原来的水平。所以如果半途而废的话，效果就会差很多，就像盖了一半的楼崩掉一大截一样。</p>
<p>精力和个人有关，增强恐怕要积累，但是毅力的作用和可控程度似乎比精力容易。所谓毅力和坚信有关，视频中告诉你，如果失败了也不要放弃，不要灰心，还是要继续相信这个方法。这个方法有着比较浓的宗教色彩。其实坚信也是一个很强的心理武器，关键在于你能不能拿的动。如果每对夫妻都互相坚信对方是爱自己的，那么除了故意出轨的和性格不合以外，其余绝大部分都可以幸福的生活下去。坚信的关键在于没有猜疑，没有杂念，满心只有相信你所相信的东西，其余的一点都容不进来。它的作用是可以使在于成功和失败之间的事的成功率大大增加。说的通俗一点也不难懂，在同等能力情况下，坚信自己能成功的比抱着试试看心情的成功率肯定高。</p>
<p>心情影响生活。那个半杯水的例子很明显，但是不深入。乐观主义说我还有半杯水，他的注意力放在半杯水上，他会围绕半杯水而努力。悲观主义说我没了半杯水，他的注意力放在空杯子上，他更可能去叹息失去的东西和伤心难过。这个就是视频中所谓的“不区分否定词”起作用的原因。情绪短期来看不会影响自信，但是会影响坚信。情绪低落会很影响你做事的态度，从而极大的影响完成程度。如果长期存在情绪低落的话会通过事情的完成程度反过来影响自信。</p>
<p>感恩的心。不是说肯定能成功，而是大概率成功，小概率事件一样会出现。要怀有感恩的心，感谢该感谢的人，事。就算是在成功的事件中也不会完全是自己的努力，怀有感激会让你下次再成功的概率增加。就算是失败了，也要感谢下为你作出努力的人。人生活在世界上本来不需要很多，能得到就很不错了，降低心里预期，对得到的心存感恩，过段时间你可能会发现无论主观上还是客观上你得到的都会比以前多。</p>
<p>行动！！！以上所有东西都是辅助性的，他们都要通过行动才能最终对生活进行影响。如果你开始迷信上面那些东西而把行动忽略了，我只能说你捡了芝麻丢了西瓜。就和那个健康和财富的关系一样，行动是1，其他是0，有了1，0越多越好，没有1，0什么都不是。<br />
注：以上道理大多知易行难，也许这就是那段视频选择宗教的方式来做这个节目的原因。宗教可以鼓动人们以极大的热情投入它所宣扬的东西中，但是对知情的人却没什么作用。</p>
<p>注2：本人非心理学专业，所知心理学内容也多为普及性知识，如有错误请指出，万分感谢。若要转载请注明出处。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=uZqlPwt0J-I:Q7RrVuPxec8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=uZqlPwt0J-I:Q7RrVuPxec8:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/08/26/control-your-life-by-mind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>妙探寻凶之通过笔记有效利用信息</title>
		<link>http://taoseeker.net/2009/07/30/how-to-make-notes-in-clue/</link>
		<comments>http://taoseeker.net/2009/07/30/how-to-make-notes-in-clue/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 03:31:30 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[思考]]></category>
		<category><![CDATA[信息收集]]></category>
		<category><![CDATA[桌面游戏]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=319</guid>
		<description><![CDATA[注：此篇无关游戏策略，仅仅是对场上信息的收集利用。 0.妙探寻凶是一个好玩的桌面游戏，由于目前玩的次数较少，还处在初级的推理及运气阶段。说是推理其实就是排除法。如何有效利用... ]]></description>
			<content:encoded><![CDATA[<p><span style="color: #3366ff">注：此篇无关游戏策略，仅仅是对场上信息的收集利用。</span></p>
<p>0.<a href="http://zh.wikipedia.org/wiki/%E5%A6%99%E6%8E%A2%E5%B0%8B%E5%85%87" target="_blank"><span style="color: #ff0000">妙探寻凶</span></a>是一个好玩的桌面游戏，由于目前玩的次数较少，还处在初级的推理及运气阶段。说是推理其实就是排除法。如何有效利用场上信息来进行排除就成了一个很重要的问题。</p>
<p>1.首先，是如何利用场上言论进行排除。分以下情况：<br />
1.1.自己提出假设，下家给自己看一张牌，那么此张牌被否定，这个过程中有什么信息呢？首先，此张牌不可能是凶案牌，然后给下家被确定一张牌，未知牌减一，最后其他人未知牌减一。<br />
1.2.有人提出假设，过了一个人，什么都没有，这个过程中的信息就是这个人没有这三张牌。<br />
1.3.有人提出假设，另外一个人给他看了。这表明出牌的人有三张之一，如果你确定了其他的牌，那么你就可以确定出牌的人有什么牌了。<br />
基本情况就这三种，剩下的就是如何记录和如何提问了。</p>
<p>2.笔记。<br />
首先打格子，竖排是凶器，嫌疑人和地点，横排是玩家。拿到牌之后，首先在自己的列钩上自己有的牌，然后在其他牌的格子里画叉，自己手牌的行画叉和划去均可(update:这样做笔记的话其实自己那一列没必要，还能节省格子，减少冗余信息)<br />
<img src="http://taoseeker.net/b/wp-content/uploads/2009/07/1.jpg" alt="表格，划去自己的牌" width="149" height="305" /><br />
然后游戏开始，在表格下面再进行发言及看牌记录，可按行记录，一行是一个人的发言，未能走到的情况下空下。记录内容为发言三要素及给他看牌的人，可简记。<br />
如：<br />
A：绿温钳C  蓝饭烛B<br />
B：红图刀A<br />
C：白台枪B  绿书铅A<br />
这样发言顺序和发言内容及看牌记录全部都有，目前没发现这样记会有遗漏信息的情况。如果一条信息里左右可以用的信息都已经反应到了表里，那么这条信息可以划掉，以方便后续处理那些不确定的信息。如：<span style="text-decoration: line-through">绿温钳C</span></p>
<p>3.接着是这些信息的处理。<br />
3.1遇到情况1，在相应的格子里画钩，此行其余格子全部划掉。然后此条记录也可以划掉，因为没有更多可用信息了。<br />
3.2遇到情况2，在对应的格子里划叉，表示这个人没有这三样东西。<br />
3.3遇到情况3是最复杂的<br />
3.3.1如果已经确定了这三张牌都不确定，那么这条记录只能先放着；<br />
3.3.2如果确定了这三张牌中的一张不在出牌者手里，我习惯把这条记录划掉，然后在表中剩余两张牌的位置做上记号，如写两个1，再出现这种情况写两个2，它们之间不能混淆。一定注意的是如果两个这种情况有了相交部分的话只要在未推断出的牌数允许的范围内什么可能都会出现的，不要贸然猜测；<br />
3.3.3如果确定这三张牌中的两张不在出牌者手里，那么很好，剩下那张就是这个人的手牌，可以给这张牌画钩，然后这张牌横向划掉，这条记录也可以划掉。注意在游戏进行中可以随时回去处理那些先放着的记录，这才是记录发言的最大价值所在。<br />
ps：如果一个人的牌已经全部推断出来，那表中他其他位置未知的牌全部可以画叉了。</p>
<p>最后，我们要找的是那些全是叉的牌，不要看到一行有n-1个叉（人数为n）就在剩下那个地方画勾。</p>
<p>注：完全原创方法，可能有漏洞，欢迎讨论~</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=3lPdVsCRsD0:4XJrUTwRVgw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=3lPdVsCRsD0:4XJrUTwRVgw:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/07/30/how-to-make-notes-in-clue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>sed总结笔记</title>
		<link>http://taoseeker.net/2009/06/23/sed%e6%80%bb%e7%bb%93%e7%ac%94%e8%ae%b0/</link>
		<comments>http://taoseeker.net/2009/06/23/sed%e6%80%bb%e7%bb%93%e7%ac%94%e8%ae%b0/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 01:43:55 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[总结]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://conan.gfrog.net/?p=272</guid>
		<description><![CDATA[前言：其实是寒假在家看的，一直总结到现在才发上来。这些就是我看到的sed的精华部分了。 替换： 命令格式：地址范围s/匹配模式/替换字符/选项 /为分界符，可以用别的字符。s后的第一个... ]]></description>
			<content:encoded><![CDATA[<p><span style="color: #000000;">前言：其实是寒假在家看的，一直总结到现在才发上来。这些就是我看到的sed的精华部分了。</span></p>
<p><span style="color: #0000ff;">替换：<br />
</span>命令格式：<span style="color: #ff0000;">地址范围</span>s/<span style="color: #ff0000;">匹配模式</span>/<span style="color: #ff0000;">替换字符</span>/<span style="color: #ff0000;">选项</span><br />
/为分界符，可以用别的字符。s后的第一个字符会被识别为分隔符，要求不能是空格或制表符，且能将三段内容分开。<br />
地址范围：数字或模式，如 1      1,4      /A/       /A/,/E/<br />
匹配模式：可用基本元字符，另外可以用( )<br />
替换字符：可写正常文字，也可有特殊字符：<br />
&amp;：代表匹配模式中正则表达式配的字符串。例：s/ab/&amp;cd/<br />
\n：与模式中第n（数字）个\( \)制定的字符串匹配。有点类似子式<br />
\：转义替换特殊字符，如&amp;，\，替换命令的分界符<br />
选项：n：指定第n次出现时替换。（1~512）<br />
g：所有目标均替换。<br />
p：输出模式空间的内容。<br />
w：写模式空间的内容。</p>
<p><span style="color: #0000ff;">删除：</span> <span style="color: #ff0000;">地址范围d</span> 整行删除<br />
<span style="color: #0000ff;">附加：</span> <span style="color: #ff0000;">定位地址a\<br />
文本</span> 在定位到的行下面加一行，内容为命令中的文本<br />
<span style="color: #0000ff;">插入：</span> <span style="color: #ff0000;">定位地址i\<br />
文本</span> 在定位到的行上面加一行，内容为命令中的文本<br />
<span style="color: #0000ff;">变换：</span> <span style="color: #ff0000;">定位地址c\<br />
文本</span> 把定位到的行整行替换掉<br />
<span style="color: #0000ff;">*</span>插入和附加不可与地址范围同用，交换可以</p>
<p><span style="color: #0000ff;"><strong>sed控制步骤：</strong></span><br />
1.预处理步骤。将下一行读入模式空间。<br />
2.处理步骤。在模式空间中直接处理所有命令。<br />
3.后处理步骤。输出模式空间并返回第一步骤。<br />
*.删除命令出现后立刻停止处理步骤，并且跳过后处理步骤。<br />
**.插入，附加，变换均为后处理步骤操作。变换先删除模式空间，然后返回后处理模式。</p>
<p><span style="color: #0000ff;">列表：</span> <span style="color: #ff0000;"> l</span> 前面也可加地址范围，一般用法是用-n参数禁止缺省输出再用                                              它来处理想要输出的部分。另外它会将不可打印字符输出。<br />
<span style="color: #0000ff;">输出：</span> <span style="color: #ff0000;">p </span> 同列表命令相似，区别大概是不输出不可打印字符。<br />
<span style="color: #ff0000;"> =</span> 输出行号，不过在对应行的上一行（？）<br />
<span style="color: #0000ff;">转换：</span> <span style="color: #ff0000;">行地址y/abc/ABC/</span> 将每一个a变为A，b变为B&#8230;对应位替换。<br />
<span style="color: #0000ff;">下一命令：</span> <span style="color: #ff0000;">行地址n</span> 向模式空间读入下一行，直接转入后处理步骤。<br />
<span style="color: #0000ff;">读入文件：</span> <span style="color: #ff0000;">行地址r   文件<br />
</span><span style="color: #0000ff;">写文件：</span> <span style="color: #ff0000;">行地址w  文件</span></p>
<p><span style="color: #0000ff;">多行下一行：</span> <span style="color: #ff0000;">N</span> 将输入文件的下一行附加到模式空间的当前行之后，两端内容<br />
间用换行符\n分开，可配合s将换行替换为空格。<br />
<span style="color: #0000ff;">多行删除：</span> <span style="color: #ff0000;">D</span> 删除内容只第一个换行符（然后直接转到后处理步骤）<br />
<span style="color: #0000ff;">多行打印：</span> <span style="color: #ff0000;">P</span> 输出模式空间至第一个换行符</p>
<p>驻留空间：除模式空间外的另一块临时空间。<br />
<span style="color: #0000ff;">驻留：</span> <span style="color: #ff0000;">行地址h</span> 将匹配的行覆盖驻留空间内的内容<br />
<span style="color: #ff0000;"> H</span> 附加到驻留空间，并加入换行符<br />
<span style="color: #0000ff;">获取：</span> <span style="color: #ff0000;">行地址g</span> 用驻留空间内容覆盖模式空间的内容<br />
<span style="color: #ff0000;">G</span> 将驻留空间的内容附加到模式空间后面，并用换行符分隔<br />
<span style="color: #0000ff;">交换：</span> <span style="color: #ff0000;">行地址x</span> 交换驻留空间与模式空间的内容</p>
<p>附：ibm的sed教程（比我的详细很多）<br />
<a href="http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-2/index.html">http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-2/index.html</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=1NtyNR-ji58:1bHw3P82Fnk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=1NtyNR-ji58:1bHw3P82Fnk:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/06/23/sed%e6%80%bb%e7%bb%93%e7%ac%94%e8%ae%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>一学期总结</title>
		<link>http://taoseeker.net/2009/06/22/summary0906/</link>
		<comments>http://taoseeker.net/2009/06/22/summary0906/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 15:39:07 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[总结]]></category>

		<guid isPermaLink="false">http://conan.gfrog.net/?p=306</guid>
		<description><![CDATA[又是思维巨变的半年，应该总结一下。出于机缘巧合（看到了4G space和mindhacks）得窥天机（夸张了），开始了思维的进化。由于看到了那样的一种境界，自己是极其羡慕，便不由自主地想去触碰... ]]></description>
			<content:encoded><![CDATA[<p>又是思维巨变的半年，应该总结一下。出于机缘巧合（看到了4G space和mindhacks）得窥天机（夸张了），开始了思维的进化。由于看到了那样的一种境界，自己是极其羡慕，便不由自主地想去触碰，去达到那种境界。那种对于计算机结构的融会贯通和对人类行为的科学分析就就这样吸引了我。</p>
<p>对知识的渴求造就了我第二段的学习热情高涨。现在我几乎每天都会去学习，但是平心而论，却会比第一段学习热情高涨（出生～小学毕业）的效率低不少。潜力还有很多，但是不知道怎么去挖掘，这让我对自己非常的不满。虽然我知道这样会影响自信，但是却没有办法停下来。也许因为《编程之道》，也许因为《Unix编程艺术》，现在看专业有了一个完全不同的眼界。这学期开始的时候还在看c++ primer，但是一段时间之后放弃了。高级语言各得其道，不可能一种语言通吃天下。看到这个之后，就此跳出了语言的束缚，开始往更深的地方望去。关于语言现在选择了两个极端，c和Python，然后以此开始了在计算机世界的求道之旅。自己总结了一下，现在有三条出路可以走，这条录是最想走的，而且是最困难的。现在的感叹就是时间太少了，效率又不够高，自己买的书都来不及看。什么时候才能有梦寐以求的如宝剑一般犀利的思维呢。。。</p>
<p>这半年，我意识到了自信的力量，意识到了人皆可以有自己的自信，然后以此迸发出奇妙的魅力。那么我的“隐”法处世也要做一些修正了。这半年，感情依然没有进展，依然不会与女生相处，依然会把相处的还不错的女生丢了。若是以前，这条根本不会写进来。但是已经理智到这种程度的我，第一次有了找女友的冲动。最好的朋友之二订婚了，似乎前不久还在和他们一块打闹玩耍。他们订婚的刺激程度比听说100个同龄人订婚都强烈。不过话说回来，这个不是计划可以控制的。。。先消化一下这种冲动吧。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=328Qdh5kXNE:cVq92CRXMbw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=328Qdh5kXNE:cVq92CRXMbw:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/06/22/summary0906/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>天气预报改进之一</title>
		<link>http://taoseeker.net/2009/06/08/weather1/</link>
		<comments>http://taoseeker.net/2009/06/08/weather1/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 13:24:14 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[思考]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[unix编程艺术]]></category>
		<category><![CDATA[数据驱动程序]]></category>

		<guid isPermaLink="false">http://taoseeker.net/?p=343</guid>
		<description><![CDATA[由于google天气预报总是月末让我手机访问某个网址，让没有开手机上网的我很不爽，于是找到linuxtoy上的飞信天气预报来尝试了一下 由于群发不怎么方便，现参考如下两个地址 http://blog.solrex.cn/... ]]></description>
			<content:encoded><![CDATA[<div>由于google天气预报总是月末让我手机访问某个网址，让没有开手机上网的我很不爽，于是找到linuxtoy上的飞信天气预报来尝试了一下</div>
<div>由于群发不怎么方便，现参考如下两个地址<br />
<a href="http://blog.solrex.cn/articles/diy-free-weather-forecast-sms.html" target="_blank">http://blog.solrex.cn/articles/diy-free-weather-forecast-sms.html</a></div>
<div><a href="http://linuxtoy.org/archives/fetionweather.html" target="_blank">http://linuxtoy.org/archives/fetionweather.html</a></div>
<div>做了一些改进</div>
<div>方案：</div>
<div>使用<span>Solrex的命令行飞信工具作为最终发送工具</span></div>
<div><span>使用linuxtoy上 fangvv的方法抓取天气</span></div>
<div><span>参考数据与代码分离的思想，设计一个文本用来存放数据，使得增加群发对象和城市的时候不用修改代码</span></div>
<div><span>第一版文本格式：</span></div>
<p><span>[user]<br />
13*********<br />
[pass]<br />
passwd<br />
[city]<br />
54161               长春<br />
[to]<br />
FetionId_1        自己<br />
FetionId_2        nick<br />
&#8230;..</span></p>
<p>[city]<br />
59493           深圳<br />
[to]<br />
FetionId_1        nick</p>
<p>这个数据结构看起来很清晰，但是写起代码来判断比较多，最终awk脚本大概50多行代码。扫了一下unix编程艺术之后，参考.netrc做了如下改进：</p>
<p>第二版文本格式：</p>
<p>user    13*********<br />
pass    passwd<br />
city    54161           长春<br />
to      FetionId_1        nick<br />
to      FetionId_2        nick<br />
&#8230;..<br />
send    Yes</p>
<p>city    59493           深圳<br />
to      FetionId_1        nick<br />
&#8230;..<br />
send    Yes</p>
<p>使用这个格式进行编码，awk脚本用了30行多点，代码如下</p>
<blockquote><p>#!/usr/bin/awk -f<br />
BEGIN{<br />
SmsPath = “/home/conan/bin/weather/”<br />
}<br />
#支持注释<br />
{<br />
if (substr($1,1,1) == “#”)<br />
next<br />
}<br />
#跳过空行<br />
NF &lt; 2{ next }<br />
#设置用户名密码等信息<br />
$1 != “to”{<br />
Data[$1] = $2<br />
}<br />
#格式化群发列表<br />
$1 == “to”{<br />
if (Data["to"] == 0 )<br />
Data["to"] = $2<br />
else<br />
Data["to"] = Data["to"] “,” $2<br />
}<br />
#获取天气并发送<br />
Data["send"] == “Yes”{<br />
Data["send"] = “No”<br />
system(“wget -qnv -O ” Data["city"] ” <a href="http://wap.weather.com.cn/wap/" target="_blank">http://wap.weather.com.cn/wap/</a>” Data["city"] “/h24/”)<br />
system(“sed -i -n &#8217;15,31p&#8217; ” Data["city"])<br />
system(“sed -i &#8216;s/&lt;[^&lt;]*&gt;//g&#8217; ” Data["city"])<br />
system(“sed -i /^$/d ” Data["city"])<br />
#下面一行可以加上你要的内容<br />
system(“sed -i &#8217;1 i\**气象台为你预报&#8217; ” Data["city"])<br />
system(“sed -i &#8216;:a;N;s/\\n/ /g;ta&#8217; ” Data["city"])<br />
print (SmsPath “sendsms -vl -f ” Data["user"] ” -p ” Data["pass"] ” -t ” Data["to"] ” \”`cat ” Data["city"] “`\”")<br />
system (“sleep 1&#8243;)<br />
system (SmsPath “sendsms -vl -f ” Data["user"] ” -p ” Data["pass"] ” -t ” Data["to"] ” \”`cat ” Data["city"] “`\”")<br />
print “&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;”<br />
delete Data["to"]<br />
delete Data["city"]<br />
}</p></blockquote>
<div>这版个人评价：不如上一版清晰明了，但是在人可以接收的情况下比较有利于编码。</div>
<div style="overflow: hidden;width: 1px;height: 1px">
<div>由于google天气预报总是月末让我手机访问某个网址，让没有开手机上网的我很不爽，于是找到linuxtoy上的飞信天气预报来尝试了一下</div>
<div>由于群发不怎么方便，现参考如下两个地址<br />
<a href="http://blog.solrex.cn/articles/diy-free-weather-forecast-sms.html" target="_blank">http://blog.solrex.cn/articles/diy-free-weather-forecast-sms.html</a></div>
<div><a href="http://linuxtoy.org/archives/fetionweather.html" target="_blank">http://linuxtoy.org/archives/fetionweather.html</a></div>
<div>做了一些改进</div>
<div>方案：</div>
<div>使用<span>Solrex的命令行飞信工具作为最终发送工具</span></div>
<div><span>使用linuxtoy上 fangvv的方法抓取天气</span></div>
<div><span>参考数据与代码分离的思想，设计一个文本用来存放数据，使得增加群发对象和城市的时候不用修改代码</span></div>
<div><span> </span></div>
<div><span>第一版文本格式：</span></div>
<p><span>[user]<br />
13*********<br />
[pass]<br />
passwd<br />
[city]<br />
54161               长春<br />
[to]<br />
FetionId_1        自己<br />
FetionId_2        nick<br />
&#8230;..</span></p>
<p>[city]<br />
59493           深圳<br />
[to]<br />
FetionId_1        nick</p>
<p>这个数据结构看起来很清晰，但是写起代码来判断比较多，最终awk脚本大概50多行代码。扫了一下unix编程艺术之后，参考.netrc做了如下改进：</p>
<p>第二版文本格式：</p>
<p>user    13*********<br />
pass    passwd<br />
city    54161           长春<br />
to      FetionId_1        nick<br />
to      FetionId_2        nick<br />
&#8230;..<br />
send    Yes</p>
<p>city    59493           深圳<br />
to      FetionId_1        nick<br />
&#8230;..<br />
send    Yes</p>
<p>使用这个格式进行编码，awk脚本用了30行多点，代码如下</p>
<blockquote class="gmail_quote"><p>#!/usr/bin/awk -f<br />
BEGIN{<br />
SmsPath = “/home/conan/bin/weather/”<br />
}<br />
#支持注释<br />
{<br />
if (substr($1,1,1) == “#”)<br />
next<br />
}<br />
#跳过空行<br />
NF &lt; 2{ next }<br />
#设置用户名密码等信息<br />
$1 != “to”{<br />
Data[$1] = $2<br />
}<br />
#格式化群发列表<br />
$1 == “to”{<br />
if (Data["to"] == 0 )<br />
Data["to"] = $2<br />
else<br />
Data["to"] = Data["to"] “,” $2<br />
}<br />
#获取天气并发送<br />
Data["send"] == “Yes”{<br />
Data["send"] = “No”<br />
system(“wget -qnv -O ” Data["city"] ” <a href="http://wap.weather.com.cn/wap/" target="_blank">http://wap.weather.com.cn/wap/</a>” Data["city"] “/h24/”)<br />
system(“sed -i -n &#8217;15,31p&#8217; ” Data["city"])<br />
system(“sed -i &#8216;s/&lt;[^&lt;]*&gt;//g&#8217; ” Data["city"])<br />
system(“sed -i /^$/d ” Data["city"])<br />
#下面一行可以加上你要的内容<br />
system(“sed -i &#8217;1 i\**气象台为你预报&#8217; ” Data["city"])<br />
system(“sed -i &#8216;:a;N;s/\\n/ /g;ta&#8217; ” Data["city"])<br />
print (SmsPath “sendsms -vl -f ” Data["user"] ” -p ” Data["pass"] ” -t ” Data["to"] ” \”`cat ” Data["city"] “`\”")<br />
system (“sleep 1&#8243;)<br />
system (SmsPath “sendsms -vl -f ” Data["user"] ” -p ” Data["pass"] ” -t ” Data["to"] ” \”`cat ” Data["city"] “`\”")<br />
print “&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;”<br />
delete Data["to"]<br />
delete Data["city"]<br />
}</p></blockquote>
<div>这版个人评价：不如上一版清晰明了，但是在人可以接收的情况下比较有利于编码。</div>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=GKyK2sSx5pE:RLcyz0R1Oms:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=GKyK2sSx5pE:RLcyz0R1Oms:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/06/08/weather1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>抗压能力测验</title>
		<link>http://taoseeker.net/2009/06/03/%e6%8a%97%e5%8e%8b%e8%83%bd%e5%8a%9b%e6%b5%8b%e9%aa%8c/</link>
		<comments>http://taoseeker.net/2009/06/03/%e6%8a%97%e5%8e%8b%e8%83%bd%e5%8a%9b%e6%b5%8b%e9%aa%8c/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 16:14:42 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[学习方法]]></category>
		<category><![CDATA[试验]]></category>

		<guid isPermaLink="false">http://conan.gfrog.net/?p=303</guid>
		<description><![CDATA[看书效率感觉还是不够，时间利用也不是很好。做一下抗压实验吧。 实验方式： 1.进行连续的看书行为 2.可以写代码 3.拒绝娱乐活动，可以进行体育运动 先试一周看看效果如何 update:很郁闷的... ]]></description>
			<content:encoded><![CDATA[<p>看书效率感觉还是不够，时间利用也不是很好。做一下抗压实验吧。</p>
<p>实验方式：<br />
1.进行连续的看书行为<br />
2.可以写代码<br />
3.拒绝娱乐活动，可以进行体育运动</p>
<p>先试一周看看效果如何</p>
<p>update:很郁闷的没有做到</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=B4IBy8vmz3g:LwDezTBPIxk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=B4IBy8vmz3g:LwDezTBPIxk:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/06/03/%e6%8a%97%e5%8e%8b%e8%83%bd%e5%8a%9b%e6%b5%8b%e9%aa%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>分析gentoo的安装</title>
		<link>http://taoseeker.net/2009/05/27/install_gentoo/</link>
		<comments>http://taoseeker.net/2009/05/27/install_gentoo/#comments</comments>
		<pubDate>Wed, 27 May 2009 03:10:59 +0000</pubDate>
		<dc:creator>conan</dc:creator>
				<category><![CDATA[思考]]></category>
		<category><![CDATA[总结]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[分析]]></category>

		<guid isPermaLink="false">http://conan.gfrog.net/?p=268</guid>
		<description><![CDATA[虽说不是第一次安装gentoo，不过上次是livecd安装，这次直接在ubuntu里安装的，比上次的通用性和理解都好很多。理解之后就不会再执着于到底是光盘安装，或是硬盘安装，或是用什么镜像安装... ]]></description>
			<content:encoded><![CDATA[<p>虽说不是第一次安装gentoo，不过上次是livecd安装，这次直接在ubuntu里安装的，比上次的通用性和理解都好很多。理解之后就不会再执着于到底是光盘安装，或是硬盘安装，或是用什么镜像安装的形式。</p>
<p>具体参考gentoo手册x86版<br />
<a href="http://www.gentoo-cn.org/doc/zh_cn/handbook/handbook-x86.xml?style=printable&amp;full=1">http://www.gentoo-cn.org/doc/zh_cn/handbook/handbook-x86.xml?style=printable&amp;full=1</a></p>
<p>下为抽象出来的思路：</p>
<ol>
<li><strong>关于如何安装Gentoo Linux</strong><br />
本章介绍了本手册所讲解的安装方式。<br />
<span style="color: #ff0000;">（一些常识）</span></li>
<li><strong>选择合适的安装方式</strong><br />
你可以用许多方法安装Gentoo。本章讲解怎样用最小安装光盘安装Gentoo，尽管使用安装程序LiveCD也是可以的。<br />
<span style="color: #ff0000;">（还是一些常识（有些不大懂 &#8211; -）。获取安装镜像，验证镜像有效性，用最小安装光盘来组成最小系统，然后从这个系统上进行安装）</span></li>
<li><strong>配置网络</strong><br />
要下载最新的源代码，你要先设置好网络。<br />
<span style="color: #ff0000;">（使最小系统能够连接网络，好下载安装包。）</span></li>
<li><strong>准备磁盘</strong><br />
为了能够安装Gentoo，你必须创建所需的分区。本章讲解如何给磁盘分区以备后用。<br />
<span style="color: #ff0000;">（准备好要安装gentoo的磁盘分区）</span></li>
<li><strong>安装Gentoo安装文件</strong><br />
我们使用一个stage3文件来安装Gentoo。在这一章里我们将教你如何解压缩stage3文件和配置Portage。<br />
<span style="color: #ff0000;">（</span><span style="color: #ff0000;">安装包有两个，stage3和portage，stage3可以理解为最小的gentoo系统，里面是一个普通linux系统的根目录下的所有东西；portage为gentoo的软件包管理工具，记录了所有的软件包依赖关系，并含有emerge工具用来安装各种软件，地位相当于debian系中的apt-get</span><span style="color: #ff0000;">）</span></li>
<li><strong>安装Gentoo基本系统</strong><br />
安装并配置完stage3以后，你就会有一个可用的Gentoo基本系统了。这一章将教你如何达到这一状态。<br />
<span style="color: #ff0000;">（组织分区，用chroot命令将当前shell的根目录更改为gentoo的分区，当前session下所有操作均调用gentoo分区的命令，相当于已经进入这个“半成品”的系统）</span></li>
<li><strong>配置内核</strong><br />
Linux内核是每个发行版的核心。本章节将解释如何配置您自己的内核。<br />
<span style="color: #ff0000;">（手工配置未遂，启动不能，于是genkernel搞定，没办法，经验太少，人也笨。。。 &#8211; -）</span></li>
<li><strong>配置系统</strong><br />
你需要编辑一些重要的配置文件。在这一章中将对这些重要的配置文件作概述，并且介绍如何配置它们。<br />
<span style="color: #ff0000;">（给系统做基础配置，包括硬盘挂载方式（重要），系统的网络设定，root密码）</span></li>
<li><strong>安装必要的系统工具 </strong><br />
在这一章中我们将帮助你选择并安装一些重要的工具。<br />
<span style="color: #ff0000;">（一些系统服务）</span></li>
<li><strong>配置引导程序</strong><br />
x86架构存在几种引导程序。它们中的每一种都有自己的配置方法。我们会一步步来告诉你怎样根据你的需求配置一个引导程序。<br />
<span style="color: #ff0000;">（简单且片面的说，就是grub的安装和写菜单咯~全面的自己去理解吧：P）</span></li>
<li><strong>结束Gentoo的安装</strong><br />
您几乎已经完成了。接下来我们只需要为您的系统创建一个（或更多）用户就可以了。</li>
<li><strong>下一步该做什么？</strong><br />
现在你已经拥有了你自己的Gentoo操作系统了，但是下一步该做什么呢？<br />
<span style="color: #ff0000;">（没啥了，自己看吧~） </span></li>
</ol>
<p><span style="color: #ff0000;">总结：</span></p>
<p style="padding-left: 30px;"><span style="color: #ff0000;">第一步，建立起一个基本系统，配置好它，准备安装。<br />
第二步，准备好要安装的分区。<br />
第三步，下载stage和portage包，一个是基本系统，一个是软件包安装工具。<br />
第四步，配置分区和portage包，并且切换根目录过去，进入“新系统”。<br />
第五步，配置并编译内核。<br />
第六步，配置新系统，善后。</span></p>
<p><span style="color: #ff0000;">ps：简单的说，这个安装过程虽说比其他系统那么方便的安装要麻烦很多，但是很有助于理解系统。经过这个过程你可以大概了解到一个正常的linux系统安装都会做些什么。</span></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/crystalharp?a=L5Jak3bnQt4:_0iPo2ypp6A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/crystalharp?i=L5Jak3bnQt4:_0iPo2ypp6A:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://taoseeker.net/2009/05/27/install_gentoo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
	</channel>
</rss>

