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

<channel>
	<title>Anything But Ordinary技术</title>
	<atom:link href="http://abowow.com/category/%e6%8a%80%e6%9c%af/feed/" rel="self" type="application/rss+xml" />
	<link>http://abowow.com</link>
	<description>感性的光芒，理性的光辉</description>
	<lastBuildDate>Wed, 28 Jul 2010 15:15:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>中国大陆Twitter用户的“新”选择——TweetDeck</title>
		<link>http://abowow.com/2010/05/twitter-users-in-mainland-china-got-a-new-choice-tweetdeck/</link>
		<comments>http://abowow.com/2010/05/twitter-users-in-mainland-china-got-a-new-choice-tweetdeck/#comments</comments>
		<pubDate>Fri, 21 May 2010 09:03:26 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[GFW]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://abowow.com/?p=456</guid>
		<description><![CDATA[
TweetDeck是一款广受用户（尤其是英文用户）喜欢的Twitter客户端，这点可以从twitstat对其用户使用的客户端的统计可以看出来，TweetDeck是除了Twitter官方网站之外第一名的来源。这份统计虽然不是官方的，但是也可以看出用户对TweetDeck这款优秀的客户端的喜爱。
当然，由于GFW的存在，在中国大陆的用户长期以来无法直接使用不能自定义API的客户端，TweetDeck也是其中之一，所以受到大陆用户的冷遇。（当然，要想在墙内使用这类客户端也是有办法的，比如通过SocksCap或者VPN，但这不是本文的重点，这里不再赘述。）
好消息是，从桌面版0.34.1开始，TweetDeck开始允许用户使用自定义的API。于是中国大陆的用户也可以无需任何的附加工具即可使用TweetDeck。设置过程非常简单，只需要进入Settings &#62; Accounts，点击Add New Account，类型选择Twitter，输入用户名密码，然后点击Advanced Options，输入API的地址（请自行准备），即可正常使用。

也许你已经在添加Twitter账户的过程中看到了，TweetDeck 0.34.1还支持Foursquare和Buzz这两款在twitter用户中很流行的服务，你也可以将账户添加进来，通过TweetDeck一个客户端使用三种服务。
剩下的我就不多说了，由您自己体验。
相关文章

有这样一个女孩
[转载]美国青年:中国就是一个山寨
国内网站都维护，国外网站都撞墙
Google桌面很恐怖...
[译文]Google将和美国国家安全局联合保护互联网

]]></description>
			<content:encoded><![CDATA[<p><a href="http://abowow.com/wp-content/uploads/2010/05/tweetdeck.png"><img class="aligncenter size-full wp-image-457" title="tweetdeck" src="http://abowow.com/wp-content/uploads/2010/05/tweetdeck.png" alt="" width="258" height="60" /></a></p>
<p><a href="http://www.tweetdeck.com/" target="_blank">TweetDeck</a>是一款广受用户（尤其是英文用户）喜欢的Twitter客户端，这点可以从<a href="http://www.twitstat.com/twitterclientusers.html" target="_blank">twitstat对其用户使用的客户端的统计</a>可以看出来，TweetDeck是除了Twitter官方网站之外第一名的来源。这份统计虽然不是官方的，但是也可以看出用户对TweetDeck这款优秀的客户端的喜爱。</p>
<p>当然，由于<a href="http://zh.wikipedia.org/zh/%E9%98%B2%E7%81%AB%E9%95%BF%E5%9F%8E" target="_blank">GFW</a>的存在，在中国大陆的用户长期以来无法直接使用不能自定义API的客户端，TweetDeck也是其中之一，所以受到大陆用户的冷遇。（当然，要想在墙内使用这类客户端也是有办法的，比如通过<a href="http://www.williamlong.info/archives/2024.html" target="_blank">SocksCap</a>或者<a href="http://zh.wikipedia.org/zh/%E8%99%9B%E6%93%AC%E7%A7%81%E4%BA%BA%E7%B6%B2%E8%B7%AF" target="_blank">VPN</a>，但这不是本文的重点，这里不再赘述。）</p>
<p>好消息是，从<a href="http://www.tweetdeck.com/desktop/" target="_blank">桌面版0.34.1</a>开始，TweetDeck开始允许用户使用自定义的API。于是中国大陆的用户也可以无需任何的附加工具即可使用TweetDeck。设置过程非常简单，只需要进入Settings &gt; Accounts，点击Add New Account，类型选择Twitter，输入用户名密码，然后点击Advanced Options，输入API的地址（请自行准备），即可正常使用。</p>
<p style="text-align: center;"><a href="http://abowow.com/wp-content/uploads/2010/05/tweetdeck_account.png"><img class="aligncenter size-full wp-image-458" title="tweetdeck_account" src="http://abowow.com/wp-content/uploads/2010/05/tweetdeck_account.png" alt="" width="488" height="345" /></a></p>
<p>也许你已经在添加Twitter账户的过程中看到了，TweetDeck 0.34.1还支持<a href="http://foursquare.com/" target="_blank">Foursquare</a>和<a href="http://www.google.com/buzz" target="_blank">Buzz</a>这两款在twitter用户中很流行的服务，你也可以将账户添加进来，通过TweetDeck一个客户端使用三种服务。</p>
<p><a href="http://abowow.com/wp-content/uploads/2010/05/tweetdeck_4sq_buzz.png"><img class="aligncenter size-full wp-image-459" title="tweetdeck_4sq_buzz" src="http://abowow.com/wp-content/uploads/2010/05/tweetdeck_4sq_buzz.png" alt="" /></a>剩下的我就不多说了，由您自己体验。</p>
<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2009/06/website-anomaly/" title="国内网站都维护，国外网站都撞墙">国内网站都维护，国外网站都撞墙</a></li>
<li><a href="http://abowow.com/2009/09/updated-philna-theme/" title="升级了Philna主题">升级了Philna主题</a></li>
<li><a href="http://abowow.com/2009/10/a-awesome-video-toy-soldiers/" title="超NB的一段视频——Toy Soldiers/法国玩具大阅兵">超NB的一段视频——Toy Soldiers/法国玩具大阅兵</a></li>
<li><a href="http://abowow.com/2009/04/youtube-gfwed/" title="YouTube又被墙了">YouTube又被墙了</a></li>
<li><a href="http://abowow.com/2008/12/damn-google-desktop/" title="Google桌面很恐怖...">Google桌面很恐怖...</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2010/05/twitter-users-in-mainland-china-got-a-new-choice-tweetdeck/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>从stanford网络课程cs107学到的C语言通用类型容器设计</title>
		<link>http://abowow.com/2010/05/stanford-cs107-generic-c-containers-design/</link>
		<comments>http://abowow.com/2010/05/stanford-cs107-generic-c-containers-design/#comments</comments>
		<pubDate>Thu, 06 May 2010 08:31:01 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[computer science]]></category>
		<category><![CDATA[stanford]]></category>

		<guid isPermaLink="false">http://abowow.com/?p=453</guid>
		<description><![CDATA[
 0 前言
最近深感自己的coding能力太差，于是很自觉地找来了stanford的网络课程来充实自己。最近在学的是由Jerry Cain主讲的Programming Paradigm课程。该课程的内容像一锅大杂烩，涵盖了C/C++，assembly,  python等程序设计语言，以及sequential / concurrent programming，procedure-oriented / object-oriented programming等多种程序设计模式。此外，该课程还捎带了计算机体系结构，操作系统，编译原理等相关课程的知识，真是琳琅满目啊！最可贵的是，该课程的assignment各个都是经过精心设计的，不但有趣而且实用，有一定的代码量和难度，做下来一定受益匪浅！
目前我学完了前10个lecture，觉得收获最大的是学会了C语言通用类型容器的设计，本篇日志将围绕这个话题展开讨论。Hope you&#8217;ll like it  
 1 为什么要写C版本的通用容器
也许我们已经习惯了C++标准库中的多种容器，比如最常用的vector，还有map，set等等。这些容器让我们彻底舍弃了恼人的数组。而C并未为我们提供这些，如果贪恋vector的便利，那么何不自己动手写一份呢？而且，使用C版本的容器在工业界是非常有现实意义的。当我们面对有限的主存时（比如手机，PDA等），通过C++通用容器生成的汇编代码会占用大量的空间。比如，当我们声明vector&#60;int&#62;类型的变量时，编译器会生成一份只接纳int类型的代码，当声明vector&#60;double&#62;时，编译器又生成了另一份代码，以此类推&#8230; 而C语言的容器会为所有的类型使用同一份代码。虽然你需要为此牺牲类型的安全性以及使用上的便利性，但是汇编代码的巨大缩减会让你觉得这是值得的。事实上，微软，苹果，Sun的系统工程师也在使用自己编写的容器来替代C++的vector以提高系统效率。
另外，正如Jerry老师在assignment 3（C语言vector和hashset的实现）的handout中所讲，“这件事儿会让你发现C原来这么牛逼，一但你成功编写，debug，用C vector做练习，你对于指针，主存，动态分配的理解会达到顶尖水平。这是我对你们的承诺。”
 2 C与C++相比差了什么
抛开C与C++在标准库上的差距，我们单纯从语言特性上来看看C和C++差了什么。
首先进入我脑海的是C没有reference。没关系，Jerry老师会告诉你，reference其实只是会自动dereference的pointer。两者在功能上是无差别的。其实，pointer版的swap和reference版的swap生成的汇编代码是完全一样的。
此外，C没有Class，无法隐藏结构/类的成员。Jerry老师又告诉你了，没办法，这是C的短板，在使用C容器的时候，我们就假装结构的成员变量是不可见的，只调用配套的函数，不直接对成员变量进行操作。另外，我们无法在C的struct中定义函数，于是我们无法用’.’或’-&#62;’操作符调用成员方法，只能在struct之外定义函数，并将容器指针作为参数传入。
接下来是最要紧的，C没有Template，于是乎，我们不能告诉容器它所存储的类型，配套的函数也无法得知类型信息。怎么办呢？如果没有这方便的编程经验，恐怕会对这个问题一筹莫展。下面就是我在这门课上学到的精髓：通过传递void *类型参数，辅以容器所存储的类型的size，我们就可以对所存储的类型进行各种操作。这句话可能让你摸不着头脑，没关系，我们看看下面的例子。比如，我们想在vector中存储fraction类型，fraction的定义如下：

typedef struct &#123;
  int num;
  int denum;
&#125; fraction;

如果是C++，我们直接通过vector&#60;fraction&#62;的方式在初始化的时候告诉vector它所存储的类型，通过fraction类型参数传递/操作容器外的元素。对于C语言，我们在初始化vector时传入整形参数sizeof(fraction)以利于存储空间的动态分配，容器内元素的移动等操作；而在需要对容器外元素进行操作的时候，传入void*类型参数，并对其进行强制类型转换(fraction*)，然后就可以访问fraction元素了。如下例,

VectorSomeFunc&#40;/*some parameters*/ void *elemAddr&#41; &#123;
  fraction *f = &#40;fraction *&#41;elemAddr;
  // do something to f-&#62;num or f-&#62;denum
&#125;
fraction f;
f.num = 22;
f.denum = [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="standford_engineering" src="http://soe.stanford.edu/images/logo.gif" alt="" width="145" height="64" /><br />
<strong> 0 前言</strong><br />
最近深感自己的coding能力太差，于是很自觉地找来了stanford的网络课程来充实自己。最近在学的是由Jerry Cain主讲的<a title="http://see.stanford.edu/see/courseinfo.aspx?coll=2d712634-2bf1-4b55-9a3a-ca9d470755ee" href="http://see.stanford.edu/see/courseinfo.aspx?coll=2d712634-2bf1-4b55-9a3a-ca9d470755ee" target="_blank">Programming Paradigm课程</a>。该课程的内容像一锅大杂烩，涵盖了C/C++，assembly,  python等程序设计语言，以及sequential / concurrent programming，procedure-oriented / object-oriented programming等多种程序设计模式。此外，该课程还捎带了计算机体系结构，操作系统，编译原理等相关课程的知识，真是琳琅满目啊！最可贵的是，该课程的assignment各个都是经过精心设计的，不但有趣而且实用，有一定的代码量和难度，做下来一定受益匪浅！</p>
<p>目前我学完了前10个lecture，觉得收获最大的是学会了C语言通用类型容器的设计，本篇日志将围绕这个话题展开讨论。Hope you&#8217;ll like it <img src='http://abowow.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong> 1 为什么要写C版本的通用容器</strong><br />
也许我们已经习惯了C++标准库中的多种容器，比如最常用的vector，还有map，set等等。这些容器让我们彻底舍弃了恼人的数组。而C并未为我们提供这些，如果贪恋vector的便利，那么何不自己动手写一份呢？而且，使用C版本的容器在工业界是非常有现实意义的。当我们面对有限的主存时（比如手机，PDA等），通过C++通用容器生成的汇编代码会占用大量的空间。比如，当我们声明vector&lt;int&gt;类型的变量时，编译器会生成一份只接纳int类型的代码，当声明vector&lt;double&gt;时，编译器又生成了另一份代码，以此类推&#8230; 而C语言的容器会为所有的类型使用同一份代码。虽然你需要为此牺牲类型的安全性以及使用上的便利性，但是汇编代码的巨大缩减会让你觉得这是值得的。事实上，微软，苹果，Sun的系统工程师也在使用自己编写的容器来替代C++的vector以提高系统效率。</p>
<p>另外，正如Jerry老师在assignment 3（C语言vector和hashset的实现）的handout中所讲，“<strong>这件事儿会让你发现C原来这么牛逼，一但你成功编写，debug，用C vector做练习，你对于指针，主存，动态分配的理解会达到顶尖水平。这是我对你们的承诺。</strong>”</p>
<p><strong> 2 C与C++相比差了什么</strong><br />
抛开C与C++在标准库上的差距，我们单纯从语言特性上来看看C和C++差了什么。</p>
<p>首先进入我脑海的是C没有reference。没关系，Jerry老师会告诉你，reference其实只是会自动dereference的pointer。两者在功能上是无差别的。其实，pointer版的swap和reference版的swap生成的汇编代码是完全一样的。</p>
<p>此外，C没有Class，无法隐藏结构/类的成员。Jerry老师又告诉你了，没办法，这是C的短板，在使用C容器的时候，我们就假装结构的成员变量是不可见的，只调用配套的函数，不直接对成员变量进行操作。另外，我们无法在C的struct中定义函数，于是我们无法用’.’或’-&gt;’操作符调用成员方法，只能在struct之外定义函数，并将容器指针作为参数传入。</p>
<p>接下来是最要紧的，C没有Template，于是乎，我们不能告诉容器它所存储的类型，配套的函数也无法得知类型信息。怎么办呢？如果没有这方便的编程经验，恐怕会对这个问题一筹莫展。下面就是我在这门课上学到的精髓：<strong>通过传递void *类型参数，辅以容器所存储的类型的size，我们就可以对所存储的类型进行各种操作</strong>。这句话可能让你摸不着头脑，没关系，我们看看下面的例子。比如，我们想在vector中存储fraction类型，fraction的定义如下：</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> num<span style="color: #339933;">;</span>
  <span style="color: #993333;">int</span> denum<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> fraction<span style="color: #339933;">;</span></pre></div></div>

<p>如果是C++，我们直接通过vector&lt;fraction&gt;的方式在初始化的时候告诉vector它所存储的类型，通过fraction类型参数传递/操作容器外的元素。对于C语言，我们在初始化vector时传入整形参数sizeof(fraction)以利于存储空间的动态分配，容器内元素的移动等操作；而在需要对容器外元素进行操作的时候，传入void*类型参数，并对其进行强制类型转换(fraction*)，然后就可以访问fraction元素了。如下例,</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">VectorSomeFunc<span style="color: #009900;">&#40;</span><span style="color: #808080; font-style: italic;">/*some parameters*/</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>elemAddr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  fraction <span style="color: #339933;">*</span>f <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>fraction <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>elemAddr<span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">// do something to f-&gt;num or f-&gt;denum</span>
<span style="color: #009900;">&#125;</span>
fraction f<span style="color: #339933;">;</span>
f.<span style="color: #202020;">num</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">22</span><span style="color: #339933;">;</span>
f.<span style="color: #202020;">denum</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">7</span><span style="color: #339933;">;</span>
VectorSomeFunc<span style="color: #009900;">&#40;</span><span style="color: #808080; font-style: italic;">/*some parameters*/</span> <span style="color: #339933;">&amp;</span>f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>这里使用void *类型作为函数参数是非常精妙的，因为它可以接受任何类型的指针，当我们需要用vector存储int时，我们传入int *类型的参数，需要用vector存储char *时，我们传入char **类型的参数，再分别在函数内部做(int *)，(char **)的强制转换之后就可以访问元素了。正是如此，我们才实现了“通用(generic)”这两个字。这里需要提醒一下，void *类型的参数是不能够直接deference的，也就是说，不能用对void *类型的参数进行&#8217;*'和&#8217;->&#8217;操作，强制转换以后才可以。</p>
<p><strong>3 管中窥豹——stack的实现</strong><br />
stack的实现是在cs107的课上讲到的，明白了上面的设计想法之后，比较容易实现。这里贴出源代码，并简单讨论一下。<br />
<span id="more-453"></span><br />
<em>stack.h</em></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef __STACK_H__</span>
<span style="color: #339933;">#define __STACK_H__</span>
&nbsp;
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>elems<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> elemSize<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> logLength<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> allocLength<span style="color: #339933;">;</span>
    <span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>freeFn<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> stack<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> stackNew<span style="color: #009900;">&#40;</span>stack <span style="color: #339933;">*</span>s<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> elemSize<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>freeFn<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> stackDispose<span style="color: #009900;">&#40;</span>stack <span style="color: #339933;">*</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> stackPush<span style="color: #009900;">&#40;</span>stack <span style="color: #339933;">*</span>s<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>elemAddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> stackPop<span style="color: #009900;">&#40;</span>stack <span style="color: #339933;">*</span>s<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>elemAddr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#endif // __STACK_H__</span></pre></div></div>

<p>stack结构中的elems是stack存储空间的头指针，因为要实现“通用”，所以声明为void *类型。<br />
elemSize是上文提到的元素的size。<br />
logLength是stack存储元素的个数。allocLength是已分配空间所能容纳的元素的个数。注意，这两个概念是不同的。我将在下文合适的位置对此做详细的解释。<br />
freeFn是用来释放元素的，对于int之类不需要释放的类型，可以传入NULL，而对于自定义结构，数组，指针，则需要客户来写释放函数，并在初始化的时候传给vector。<br />
剩下的函数的功能通过函数名已经可以很好地自说明了，这里不再赘述。</p>
<p><em>stack.c</em></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;stack.h&quot;</span>
<span style="color: #339933;">#include &lt;assert.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> stackNew<span style="color: #009900;">&#40;</span>stack <span style="color: #339933;">*</span>s<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> elemSize<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>freeFn<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    assert<span style="color: #009900;">&#40;</span>elemSize <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    s<span style="color: #339933;">-&gt;</span>elemSize <span style="color: #339933;">=</span> elemSize<span style="color: #339933;">;</span>
    s<span style="color: #339933;">-&gt;</span>logLength <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    s<span style="color: #339933;">-&gt;</span>allocLength <span style="color: #339933;">=</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span>
    s<span style="color: #339933;">-&gt;</span>elems <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>allocLength <span style="color: #339933;">*</span> elemSize<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    assert<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>elems <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    s<span style="color: #339933;">-&gt;</span>freeFn <span style="color: #339933;">=</span> freeFn<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> stackDispose<span style="color: #009900;">&#40;</span>stack <span style="color: #339933;">*</span>s<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>freeFn <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</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> s<span style="color: #339933;">-&gt;</span>logLength<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: #339933;">-&gt;</span>freeFn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>s<span style="color: #339933;">-&gt;</span>elems <span style="color: #339933;">+</span> i <span style="color: #339933;">*</span> s<span style="color: #339933;">-&gt;</span>elemSize<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    free<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>elems<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> stackGrow<span style="color: #009900;">&#40;</span>stack <span style="color: #339933;">*</span>s<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    s<span style="color: #339933;">-&gt;</span>allocLength <span style="color: #339933;">*=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
    s<span style="color: #339933;">-&gt;</span>elems <span style="color: #339933;">=</span> realloc<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>elems<span style="color: #339933;">,</span> s<span style="color: #339933;">-&gt;</span>allocLength <span style="color: #339933;">*</span> s<span style="color: #339933;">-&gt;</span>elemSize<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    assert<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>elems <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> stackPush<span style="color: #009900;">&#40;</span>stack <span style="color: #339933;">*</span>s<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>elemAddr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>logLength <span style="color: #339933;">==</span> s<span style="color: #339933;">-&gt;</span>allocLength<span style="color: #009900;">&#41;</span>
        stackGrow<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>target <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>s<span style="color: #339933;">-&gt;</span>elems <span style="color: #339933;">+</span> s<span style="color: #339933;">-&gt;</span>logLength <span style="color: #339933;">*</span> s<span style="color: #339933;">-&gt;</span>elemSize<span style="color: #339933;">;</span>
    memcpy<span style="color: #009900;">&#40;</span>target<span style="color: #339933;">,</span> elemAddr<span style="color: #339933;">,</span> s<span style="color: #339933;">-&gt;</span>elemSize<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    s<span style="color: #339933;">-&gt;</span>logLength<span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> stackPop<span style="color: #009900;">&#40;</span>stack <span style="color: #339933;">*</span>s<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>elemAddr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>source <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>s<span style="color: #339933;">-&gt;</span>elems <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>logLength <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> s<span style="color: #339933;">-&gt;</span>elemSize<span style="color: #339933;">;</span>
    memcpy<span style="color: #009900;">&#40;</span>elemAddr<span style="color: #339933;">,</span> source<span style="color: #339933;">,</span> s<span style="color: #339933;">-&gt;</span>elemSize<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    s<span style="color: #339933;">-&gt;</span>logLength<span style="color: #339933;">--;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>对于stackNew，有以下两点要解释：<br />
1. assert是一个宏，而非函数，定义在assert.h中，用于确保括号内的条件(elemSize &gt; 0)成立，如果elemSize &lt;= 0（无意义的情况），则会打印包含源文件名和行号的错误信息，并终止程序的运行。<br />
2. logLength初始为0，这个好理解，因为还没有元素。而allocLength初始为4，这个就费点功夫了。我们知道stack是动态增长的。理论上，我们可以在每次push的时候才分配新空间。但是，重分配需要调用realloc函数，可能会移动所有的元素到新的地址，很费时间，所以，我们要尽量减少重分配的次数以提高效率，于是，我们采用在初始化的时候分配4个元素的空间，当4个不够用的时候，就重新分配，扩充到8个，8个不够的时候扩充到16个，以此类推，每次需要重新分配的时候都将allocLength倍增。这样，下面的</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">s<span style="color: #339933;">-&gt;</span>elems <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>allocLength <span style="color: #339933;">*</span> elemSize<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>和stackGrow中的</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">s<span style="color: #339933;">-&gt;</span>allocLength <span style="color: #339933;">*=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
s<span style="color: #339933;">-&gt;</span>elems <span style="color: #339933;">=</span> realloc<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-&gt;</span>elems<span style="color: #339933;">,</span> s<span style="color: #339933;">-&gt;</span>allocLength <span style="color: #339933;">*</span> s<span style="color: #339933;">-&gt;</span>elemSize<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>就好理解了。<br />
对于stackGrow，经过刚才的讲解，应该很清晰了。值得注意的是，该函数被标示为static，意思是该函数只能被本源文件中的其他函数调用，而不能被本源文件之外的函数调用。其实相当于C++中Class的private方法。<br />
对于剩下的stackDispose，stackPush，stackPop，实现的时候要注意指针的运算。这里有一个技巧，在进行指针运算之前，要将s-&gt;elems强制转换成char *类型，因为char类型占用一个字节（也可以用unsigned short，但是显然char打起来更快:P），elemSize也是以字节为单位的，这样计算的时候就不会出错。</p>
<p>最后，贴一个简单的测试程序（连接的时候不要忘了stack.o :p）。</p>
<p><em>main.c</em></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;stack.h&quot;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> stringFree<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    stack s<span style="color: #339933;">;</span>
    stackNew<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>s<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> stringFree<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>days<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #ff0000;">&quot;Monday&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Tuesday&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Wednesday&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Thurday&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Friday&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Saturday&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Sunday&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i<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;">7</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>copy <span style="color: #339933;">=</span> strdup<span style="color: #009900;">&#40;</span>days<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        stackPush<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>s<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>copy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</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;">7</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>day<span style="color: #339933;">;</span>
        stackPop<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>s<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>day<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> day<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        free<span style="color: #009900;">&#40;</span>day<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    stackDispose<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> stringFree<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>elem<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    free<span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">**</span><span style="color: #009900;">&#41;</span>elem<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>请自行琢磨一下倒数第二行的*(char **)elem吧:)。</p>
<p><strong>4 实战——vector和hashset的实现</strong><br />
掌握了以上的知识，你就可以大胆去实现cs107 assignment3中的vector了。TA已经帮你写好了框架，并帮你准备好了变态的测试程序，你所要做的是考虑vector结构需要哪些成员变量以及如何实现每个函数。用到的东西大多都包含在上面的例子了。哦对了，你可能需要man一下memmove/qsort/bsearch。由于篇幅所限，这里就不贴上代码了，感兴趣的同学请<a href="http://abowow.com/upload/vector.tar.gz" target="_blank">点击这里</a>下载我实现的vector。</p>
<p>实现了vector之后就可以动手实现hashset了。TA同样为你写好了框架和测试程序，但是，hashset这个容器实在是让人觉得生疏，handout上也只有只言片语。没办法，google之，你会发现，<a href="http://www.sgi.com/tech/stl/hash_set.html" target="_blank">hash_set</a>是STL库中的容器（STL是Standard Template Library的缩写）。看下来以后依然一头雾水，网上关于hashset内部数据结构的介绍又非常匮乏，没办法，再回头去挖掘handout，一边写代码，一边琢磨，最终终于琢磨透了hashset的结构，在这里与大家分享一下。</p>
<p>hashset中最核心的部分莫过于hash函数。hash函数由客户根据所要存储的类型自行定义。所谓hash函数，是指将同一类型的各种元素映射到不同的bucket中。bucket的总数是固定的，设为numBuckets。那么hash函数也就是：num = hash(elem)，其中num属于[0, numBuckets)。参考下图numBuckets = 5的情况：</p>
<p style="text-align: center;"><a href="http://abowow.com/wp-content/uploads/2010/05/hashfunc.png"><img class="aligncenter size-full wp-image-454" title="hashfunc" src="http://abowow.com/wp-content/uploads/2010/05/hashfunc.png" alt="" width="550" height="550" /></a>图1 hash函数</p>
<p style="text-align: left;">每个bucket实际上是一个vector，hash函数完成“分组”之后，将元素添加到相应的vector中去。在添加的时候，要根据客户提供的比较函数cmpfn去判断该元素是否已经存在，搜索vector中的元素，一一进行比对，如果不存在，则插入vector对尾，否则，要替换原有的元素。既然两个元素一样为什么要替换呢？因为这里所说的“一样”不一定是完全相等，这要看cmpfn是怎么定义的，很有可能两个元素中的某个关键成员变量相同，就认为这两个元素“一样”了。</p>
<p style="text-align: left;">那么，hashset这样的存储方式有什么优点呢？答案是hashset可以提供非常快速的查找。当需要查找某元素时，首先对其执行hash函数找到它的“组织”，然后只需在“组织”内查找，因为该元素是不可能出现在别的组织当中的。如果numBuckets = 5，则平均查找时间缩短了接近4/5。如果numBuckets = 1009（通常取大质数），则平均搜索时间几乎只是连续存储型容器的千分之一。</p>
<p style="text-align: left;">所以，hashset非常适合存储用于查询的大量数据，比如一个20多MB纯文本的同义词词典（这也是assignment 3的终极测试数据源:p）。</p>
<p style="text-align: left;"><a href="http://abowow.com/upload/hashset.tar.gz" target="_blank">这里</a>是我实现的hashset。</p>
<p><strong>5 结语</strong><br />
<span style="font-weight: normal;">我这里也仅仅总结了一下自己学到的东西，可能有疏漏，可能有谬误，欢迎各位读者指正。我想通过此文让更多的编程入门者体验到这其中的乐趣。我在这里强烈建议已经耐心地看到这里的各位去听一听stanford的公开课程，花上一些时间，费上一些脑筋，去完成课程的编程作业，一定会像我一样收获颇丰的！</span></p>
<p style="text-align: left;">
<p><strong>References</strong><br />
[1] Introduction to computer science | programming paradigms http://see.stanford.edu/see/courseinfo.aspx?coll=2d712634-2bf1-4b55-9a3a-ca9d470755ee<br />
[2] STL hash_set http://www.sgi.com/tech/stl/hash_set.html</p>
<blockquote><p><strong>原创辛苦，转载请注明出处，谢谢！</strong></p></blockquote>
<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2010/04/enrollments-of-computer-science-programs/" title="【用数据说话】我所申请的一些美国学校计算机专业硕士录取人数及随想">【用数据说话】我所申请的一些美国学校计算机专业硕士录取人数及随想</a></li>
<li><a href="http://abowow.com/2010/04/usnew-2010-computer-science-ranking-pdf/" title="U.S.News最新2010年Computer Science排名PDF打印版">U.S.News最新2010年Computer Science排名PDF打印版</a></li>
<li><a href="http://abowow.com/2010/04/2010-fall-computer-science-look-back/" title="2010 FALL Computer Science申请总结">2010 FALL Computer Science申请总结</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2010/05/stanford-cs107-generic-c-containers-design/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>[原创]wordpress真正无缝无后遗症完全搬家指南</title>
		<link>http://abowow.com/2009/11/how-to-move-wordpress-to-a-new-host/</link>
		<comments>http://abowow.com/2009/11/how-to-move-wordpress-to-a-new-host/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 08:20:44 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[cpanel]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://abowow.com/?p=438</guid>
		<description><![CDATA[Wordpress搬家实在是一件令人头疼的事，其难度比全新安装要高出好几个级别，即便是使用wordpress一年以上的老鸟也不一定能做好搬家这件看似简单的事情。我经历了6次搬家之后，才真正做到了无缝与无后遗症的搬家，在这里整理下步骤。
1. 使用cpanel或是其他面板中的phpMyAdmin导出wordpress的数据库，导出时选上“另存为文件”，其他一切选择默认选项就可以，导出文件通常为localhost.sql
2. 通过面板中的文件管理器，将wordpress所在目录压缩成zip文件，将此文件下载到本地。
3. 打开新主机的面板，创建数据库用户与数据库，记下数据库的名称，比如&#8221;abowow_wp&#8221;，并为此用户添加访问此数据库的权限。
4. 在本地找个趁手的文本编辑器打开localhost.sql，删掉非注释语句第二行
CREATE DATABASE `AAAAAA` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
修改第三行
USE `AAAAAA`;
将其中的AAAAAA改为第三步中的数据库名称，比如&#8221;abowow_wp&#8221;，如果旧主机的数据库名称与新主机的相同，则无需修改。
5. 确认新旧主机存放wordpress程序的根目录路径是否相同，比如老主机为&#8221;/home/sharkwii/public_html&#8221;，新主机是&#8221;/home/abowow/public_html/wordpress&#8221;，如果相同则跳过此步，不同的话，在打开localhost.sql的文档编辑器中搜索&#8221;public_html&#8221;，会找到一条类似于
(59, 0, &#8216;upload_path&#8217;, &#8216;/home/sharkwii/public_html/wp-content/uploads&#8217;, &#8216;yes&#8217;)
这样的语句，请将其中的路径替换。比如，按照上面，应替换为&#8217;/home/abowow/public_html/wordpress/wp-content/uploads&#8217;。（注意，这个第五条是人们经常忘记的一点，如果不修改的话，在新主机上通过wordpress后台上传图片等文件时就会报错。）如果你装了Google XML Sitemaps插件，继续搜&#8221;public_html&#8221;，将另外两条记录也进行替换。
6. 进入新主机面板中的phpMyAdmin，导入localhost.sql文件，注意将字符集选择为UTF-8。
7. 修改第二步下载下来的zip文件中的wp-config.php，将其中的数据库名称与用户替换为新的，如果没变化的话则无需修改。（注意，确保zip中的文件是修改后的。）
8. 将zip文件上传（通过FTP或是面板中的文件管理器都可以），然后在文件管理器中将其解压，调整好根目录所在的位置。
9. 文件管理器中通常是看不到.htaccess文件的，这时可以通过FTP登录旧主机，将.htaccess下载下来，查看有没有与文件路径相关的记录，修改为新的路径，具体操作与第五步类似，然后上传到新主机的wordpress安装目录。（这一点也是经常被忽略的。）
10. 做好以上的步骤，就可以去域名服务商修改DNS服务器或是A记录，指向新的主机。等待新的DNS记录生效。至此，整个搬家过程顺利完成。
给搬家频繁的博友的建议：
1. 尽量不要安装Statpress等需要占用很大数据库存储空间的插件，否则搬家的时候数据库备份导入等操作将变得佷耗时。
2. 如果图片等文件很多的话，不要将其放在主机上，而是放在flickr等第三方相册中，这样减少了搬家时下载上传的时间，也可以节省主机的日常访问流量开销。
P.S. 这里所说的无缝，其实是有点小缝的，从备份数据库到DNS记录生效的时间内（如果采用A记录，通常不到1个小时）的新数据会丢失，不过对于访问量不大的博客来说，不是问题，最多就是差一两条评论的事   。
相关文章

升级了Philna主题
更换国际域名啦
解决Fatal error: Allowed memory size of 33554432 bytes exhausted
WP Thread Comment和WP Mail SMTP不兼容问题的解决 
重新装了一遍wordpress

]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-439" title="wordpress_ex2" src="http://abowow.com/wp-content/uploads/2009/11/wordpress_ex2.png" alt="wordpress_ex2" width="450" height="300" />Wordpress搬家实在是一件令人头疼的事，其难度比全新安装要高出好几个级别，即便是使用wordpress一年以上的老鸟也不一定能做好搬家这件看似简单的事情。我经历了6次搬家之后，才真正做到了<strong>无缝</strong>与<strong>无后遗症</strong>的搬家，在这里整理下步骤。</p>
<p>1. 使用cpanel或是其他面板中的phpMyAdmin导出wordpress的数据库，导出时选上“另存为文件”，其他一切选择默认选项就可以，导出文件通常为localhost.sql</p>
<p>2. 通过面板中的文件管理器，将wordpress所在目录压缩成zip文件，将此文件下载到本地。</p>
<p>3. 打开新主机的面板，创建数据库用户与数据库，记下数据库的名称，比如&#8221;abowow_wp&#8221;，并为此用户添加访问此数据库的权限。<span id="more-438"></span></p>
<p>4. 在本地找个趁手的文本编辑器打开localhost.sql，删掉非注释语句第二行</p>
<blockquote><p>CREATE DATABASE `AAAAAA` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;</p></blockquote>
<p>修改第三行</p>
<blockquote><p>USE `AAAAAA`;</p></blockquote>
<p>将其中的AAAAAA改为第三步中的数据库名称，比如&#8221;abowow_wp&#8221;，如果旧主机的数据库名称与新主机的相同，则无需修改。</p>
<p>5. 确认新旧主机存放wordpress程序的根目录路径是否相同，比如老主机为&#8221;/home/sharkwii/public_html&#8221;，新主机是&#8221;/home/abowow/public_html/wordpress&#8221;，如果相同则跳过此步，不同的话，在打开localhost.sql的文档编辑器中搜索&#8221;public_html&#8221;，会找到一条类似于</p>
<blockquote><p>(59, 0, &#8216;upload_path&#8217;, &#8216;/home/sharkwii/public_html/wp-content/uploads&#8217;, &#8216;yes&#8217;)</p></blockquote>
<p>这样的语句，请将其中的路径替换。比如，按照上面，应替换为&#8217;/home/abowow/public_html/wordpress/wp-content/uploads&#8217;。（注意，这个第五条是人们经常忘记的一点，如果不修改的话，在新主机上通过wordpress后台上传图片等文件时就会报错。）如果你装了Google XML Sitemaps插件，继续搜&#8221;public_html&#8221;，将另外两条记录也进行替换。</p>
<p>6. 进入新主机面板中的phpMyAdmin，导入localhost.sql文件，注意将字符集选择为UTF-8。</p>
<p>7. 修改第二步下载下来的zip文件中的wp-config.php，将其中的数据库名称与用户替换为新的，如果没变化的话则无需修改。（注意，确保zip中的文件是修改后的。）</p>
<p>8. 将zip文件上传（通过FTP或是面板中的文件管理器都可以），然后在文件管理器中将其解压，调整好根目录所在的位置。</p>
<p>9. 文件管理器中通常是看不到.htaccess文件的，这时可以通过FTP登录旧主机，将.htaccess下载下来，查看有没有与文件路径相关的记录，修改为新的路径，具体操作与第五步类似，然后上传到新主机的wordpress安装目录。（这一点也是经常被忽略的。）</p>
<p>10. 做好以上的步骤，就可以去域名服务商修改DNS服务器或是A记录，指向新的主机。等待新的DNS记录生效。至此，整个搬家过程顺利完成。</p>
<p><strong>给搬家频繁的博友的建议：</strong></p>
<p>1. 尽量不要安装Statpress等需要占用很大数据库存储空间的插件，否则搬家的时候数据库备份导入等操作将变得佷耗时。</p>
<p>2. 如果图片等文件很多的话，不要将其放在主机上，而是放在flickr等第三方相册中，这样减少了搬家时下载上传的时间，也可以节省主机的日常访问流量开销。</p>
<p><em>P.S. 这里所说的无缝，其实是有点小缝的，从备份数据库到DNS记录生效的时间内（如果采用A记录，通常不到1个小时）的新数据会丢失，不过对于访问量不大的博客来说，不是问题，最多就是差一两条评论的事 <img src='http://abowow.com/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' />  。</em></p>
<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2009/06/new-domain/" title="更换国际域名啦">更换国际域名啦</a></li>
<li><a href="http://abowow.com/2009/05/wp-thread-comment-and-wp-mail-smtp-incompatible/" title="WP Thread Comment和WP Mail SMTP不兼容问题的解决 ">WP Thread Comment和WP Mail SMTP不兼容问题的解决 </a></li>
<li><a href="http://abowow.com/2009/06/solution-to-fatal-error-allowed-memory-size-of-33554432-bytes-exhausted/" title="解决Fatal error: Allowed memory size of 33554432 bytes exhausted">解决Fatal error: Allowed memory size of 33554432 bytes exhausted</a></li>
<li><a href="http://abowow.com/2009/06/reinstall-wordpress/" title="重新装了一遍wordpress">重新装了一遍wordpress</a></li>
<li><a href="http://abowow.com/2009/09/updated-philna-theme/" title="升级了Philna主题">升级了Philna主题</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2009/11/how-to-move-wordpress-to-a-new-host/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>windows平台下修改twitterfox/Echofon默认API的方法</title>
		<link>http://abowow.com/2009/09/modification-api-of-twitterfox-or-echofon-on-windows/</link>
		<comments>http://abowow.com/2009/09/modification-api-of-twitterfox-or-echofon-on-windows/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 13:41:26 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[GFW]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://abowow.com/?p=406</guid>
		<description><![CDATA[

（图片中为Mac版本）
twitterfox(Echofon)可以说是Firefox必备插件之一了，也深受很多推友喜爱，但是其本身并没有提供自定义API的选项，只能通过改*Host/翻*wall的方式才能使用，造成很多不便。为了使更多推友能使用这款插件，这里提供一个手动修改API的方法。
找到 C:\Documents and Settings\用户名\Application Data\Mozilla\Firefox\Profiles\随机字符串.default\extensions\twitternotifier@naan.net\components\nsTwitterFox.js，使用任意编辑器打开。（红色字根据实际情况替换）
将第38行的如下代码中引号内的URL修改成其他API，比如常见的http://nest.onedd.net/api/
var TWITTER_API_URL = &#8220;https://twitter.com/&#8220;;
改为
var TWITTER_API_URL = &#8220;http://nest.onedd.net/api/&#8220;;
当然，如果你不喜欢这个API，也可以自己搭建一个API。
相关文章

超NB的一段视频——Toy Soldiers/法国玩具大阅兵
有这样一个女孩
国内网站都维护，国外网站都撞墙
升级了Philna主题
中国大陆Twitter用户的“新”选择——TweetDeck

]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<p style="text-align: center;"><a href="http://abowow.com/wp-content/uploads/2009/09/echofon_mac_screen.png"><img class="aligncenter size-full wp-image-452" title="echofon_mac_screen" src="http://abowow.com/wp-content/uploads/2009/09/echofon_mac_screen.png" alt="" width="374" height="188" /></a></p>
<p>（图片中为Mac版本）</p>
<p><a href="https://addons.mozilla.org/zh-CN/firefox/addon/5081" target="_blank">twitterfox(Echofon)</a>可以说是Firefox必备插件之一了，也深受很多推友喜爱，但是其本身并没有提供自定义API的选项，只能通过改*Host/翻*wall的方式才能使用，造成很多不便。为了使更多推友能使用这款插件，这里提供一个手动修改API的方法。</p>
<p>找到 <strong>C:\Documents and Settings\<span style="color: #ff0000;">用户名</span>\Application Data\Mozilla\Firefox\Profiles\<span style="color: #ff0000;">随机字符串</span>.default\extensions\twitternotifier@naan.net\components\nsTwitterFox.js</strong>，使用任意编辑器打开。（红色字根据实际情况替换）</p>
<p>将第38行的如下代码中引号内的URL修改成其他API，比如常见的http://nest.onedd.net/api/</p>
<p><strong><span style="color: #808080;">var TWITTER_API_URL = &#8220;</span>https://twitter.com/<span style="color: #808080;">&#8220;;</span></strong></p>
<p>改为</p>
<p><strong><span style="color: #808080;">var TWITTER_API_URL = &#8220;</span>http://nest.onedd.net/api/<span style="color: #808080;">&#8220;;</span></strong></p>
<p>当然，如果你不喜欢这个API，也可以<strong><a href="http://bbs.ifanr.com/viewthread.php?tid=2046" target="_blank">自己搭建一个API</a></strong>。</p>
<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2009/04/youtube-gfwed/" title="YouTube又被墙了">YouTube又被墙了</a></li>
<li><a href="http://abowow.com/2009/10/a-awesome-video-toy-soldiers/" title="超NB的一段视频——Toy Soldiers/法国玩具大阅兵">超NB的一段视频——Toy Soldiers/法国玩具大阅兵</a></li>
<li><a href="http://abowow.com/2009/06/website-anomaly/" title="国内网站都维护，国外网站都撞墙">国内网站都维护，国外网站都撞墙</a></li>
<li><a href="http://abowow.com/2010/07/my-girl/" title="有这样一个女孩">有这样一个女孩</a></li>
<li><a href="http://abowow.com/2010/05/twitter-users-in-mainland-china-got-a-new-choice-tweetdeck/" title="中国大陆Twitter用户的“新”选择——TweetDeck">中国大陆Twitter用户的“新”选择——TweetDeck</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2009/09/modification-api-of-twitterfox-or-echofon-on-windows/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>解决Fatal error: Allowed memory size of 33554432 bytes exhausted</title>
		<link>http://abowow.com/2009/06/solution-to-fatal-error-allowed-memory-size-of-33554432-bytes-exhausted/</link>
		<comments>http://abowow.com/2009/06/solution-to-fatal-error-allowed-memory-size-of-33554432-bytes-exhausted/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 14:18:22 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://sharkwii.cn/?p=332</guid>
		<description><![CDATA[最近升级wordpress2.8之后总是在控制板看到标题中的致命错误信息，本想联系空间商解决，但是google之后立刻得到答案，于是就没必要麻烦空间商了。wordpress官网上的troubleshooting页面
如果E文不好或者懒得在上面的页面中找答案的话，请看下面的方法
将wp-settings.php第13行的32M改为64M
是不是很简单？这个问题的原因就是wp占用了超过32MB的内存（通常是因为开了太多插件，另外2.8内存占用貌似比2.7要多，因为2.7一直没遇到过这个问题），但是wp自身的设定中只允许占用32MB的内存，改成64MB就可以了。另外，此方法可能无效，比如你的空间商不允许占用超过32M的空间，这时候，你就需要联系空间商解决问题了。
相关文章

WP Thread Comment和WP Mail SMTP不兼容问题的解决 
升级了Philna主题
[原创]wordpress真正无缝无后遗症完全搬家指南
更换国际域名啦
重新装了一遍wordpress

]]></description>
			<content:encoded><![CDATA[<p>最近升级wordpress2.8之后总是在控制板看到标题中的致命错误信息，本想联系空间商解决，但是google之后立刻得到答案，于是就没必要麻烦空间商了。wordpress官网上的<a href="http://wordpress.org/support/topic/194370">troubleshooting页面</a></p>
<p>如果E文不好或者懒得在上面的页面中找答案的话，请看下面的方法</p>
<blockquote><p>将wp-settings.php第13行的32M改为64M</p></blockquote>
<p>是不是很简单？这个问题的原因就是wp占用了超过32MB的内存（通常是因为开了太多插件，另外2.8内存占用貌似比2.7要多，因为2.7一直没遇到过这个问题），但是wp自身的设定中只允许占用32MB的内存，改成64MB就可以了。另外，此方法可能无效，比如你的空间商不允许占用超过32M的空间，这时候，你就需要联系空间商解决问题了。</p>
<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2009/06/new-domain/" title="更换国际域名啦">更换国际域名啦</a></li>
<li><a href="http://abowow.com/2009/09/updated-philna-theme/" title="升级了Philna主题">升级了Philna主题</a></li>
<li><a href="http://abowow.com/2009/06/reinstall-wordpress/" title="重新装了一遍wordpress">重新装了一遍wordpress</a></li>
<li><a href="http://abowow.com/2009/05/wp-thread-comment-and-wp-mail-smtp-incompatible/" title="WP Thread Comment和WP Mail SMTP不兼容问题的解决 ">WP Thread Comment和WP Mail SMTP不兼容问题的解决 </a></li>
<li><a href="http://abowow.com/2009/11/how-to-move-wordpress-to-a-new-host/" title="[原创]wordpress真正无缝无后遗症完全搬家指南">[原创]wordpress真正无缝无后遗症完全搬家指南</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2009/06/solution-to-fatal-error-allowed-memory-size-of-33554432-bytes-exhausted/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WP Thread Comment和WP Mail SMTP不兼容问题的解决</title>
		<link>http://abowow.com/2009/05/wp-thread-comment-and-wp-mail-smtp-incompatible/</link>
		<comments>http://abowow.com/2009/05/wp-thread-comment-and-wp-mail-smtp-incompatible/#comments</comments>
		<pubDate>Sat, 16 May 2009 14:16:26 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.sharkwii.cn/?p=290</guid>
		<description><![CDATA[新的空间的主机商屏蔽了通过mail函数发送邮件的功能，于是只好安装WP Mail SMTP解决邮件通知的问题。但是，WP Thread Comment和WP Mail SMTP却出现了不兼容的问题。网上能搜到通过修改WP Mail SMTP代码的解决此问题的方法（已失效方法的传动门），但是新版本（0.8.2）的WP Mail SMTP的代码已经发生了变化，对于新版本，请按照我的方法修改即可解决问题。
将../wp-content/plugins/wp-mail-smtp/wp_mail_smtp.php中第391-393行的以下代码注释掉或者删掉就可以了

if &#40; $orig != $default_from &#41; &#123;
return $orig;
&#125;

相关文章

解决Fatal error: Allowed memory size of 33554432 bytes exhausted
更换国际域名啦
[原创]wordpress真正无缝无后遗症完全搬家指南
升级了Philna主题
重新装了一遍wordpress

]]></description>
			<content:encoded><![CDATA[<p>新的空间的主机商屏蔽了通过mail函数发送邮件的功能，于是只好安装WP Mail SMTP解决邮件通知的问题。但是，WP Thread Comment和WP Mail SMTP却出现了不兼容的问题。网上能搜到通过修改WP Mail SMTP代码的解决此问题的方法（<a href="http://wordpress.org.cn/thread-33289-1-1.html"><span style="color: #ff0000;">已失效</span>方法的传动门</a>），但是新版本（0.8.2）的WP Mail SMTP的代码已经发生了变化，对于新版本，请按照我的方法修改即可解决问题。</p>
<p><strong>将<span style="color: #ff0000;">../wp-content/plugins/wp-mail-smtp/wp_mail_smtp.php</span>中<span style="color: #ff0000;">第391-393行</span>的以下代码<span style="color: #ff0000;">注释掉或者删掉</span>就可以了</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$orig</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$default_from</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$orig</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2009/11/how-to-move-wordpress-to-a-new-host/" title="[原创]wordpress真正无缝无后遗症完全搬家指南">[原创]wordpress真正无缝无后遗症完全搬家指南</a></li>
<li><a href="http://abowow.com/2009/09/updated-philna-theme/" title="升级了Philna主题">升级了Philna主题</a></li>
<li><a href="http://abowow.com/2009/06/reinstall-wordpress/" title="重新装了一遍wordpress">重新装了一遍wordpress</a></li>
<li><a href="http://abowow.com/2009/06/solution-to-fatal-error-allowed-memory-size-of-33554432-bytes-exhausted/" title="解决Fatal error: Allowed memory size of 33554432 bytes exhausted">解决Fatal error: Allowed memory size of 33554432 bytes exhausted</a></li>
<li><a href="http://abowow.com/2009/06/new-domain/" title="更换国际域名啦">更换国际域名啦</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2009/05/wp-thread-comment-and-wp-mail-smtp-incompatible/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ubuntu9.04 wubi点击无响应(无法启动)的解决办法</title>
		<link>http://abowow.com/2009/04/ubuntu904-wubi-fail-solution/</link>
		<comments>http://abowow.com/2009/04/ubuntu904-wubi-fail-solution/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 04:41:29 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.sharkwii.cn/?p=265</guid>
		<description><![CDATA[虽然ubuntu提供了众多的安装方式，但是，不管对“菜鸟”，还是“老鸟”，wubi无疑是最方便的安装方式，用户可以像安装windows应用程序那样安装linux，完全无须考虑分区，grub设置等众多问题。 可是，有很多用户反应，最新的ubuntu9.04中的wubi无法正常启动，运行wubi以后并没有窗口出现，用进程管理器可以看到wubi.exe出现了几秒后就自动消失了。 我的台式机和笔记本都遇到了这样的问题，于是我在网上搜寻了一下解决方法，其实方法非常简单：
1. 如果您的硬盘分区卷标为中文（比如最常见的“本地磁盘”），请将其修改为英文，然后重新启动
 2. 如果您的当前用户为中文名，请更换为英文名的用户重新登录（如果没有英文名的用户，可以新建一个）
确保了以上两点之后，应该就可以正常安装了！ Enjoy new ubuntu!  (如果您仍然不能正常安装，请您留言)
相关文章

Ubuntu9.04(非RC)下载地址
[实验室项目]linux下red5 0.7.0与flowplayer 3.0.2流媒体平台的搭建

]]></description>
			<content:encoded><![CDATA[<p>虽然ubuntu提供了众多的安装方式，但是，不管对“菜鸟”，还是“老鸟”，wubi无疑是最方便的安装方式，用户可以像安装windows应用程序那样安装linux，完全无须考虑分区，grub设置等众多问题。 可是，有很多用户反应，最新的ubuntu9.04中的wubi无法正常启动，运行wubi以后并没有窗口出现，用进程管理器可以看到wubi.exe出现了几秒后就自动消失了。 我的台式机和笔记本都遇到了这样的问题，于是我在网上搜寻了一下解决方法，其实方法非常简单：</p>
<p><strong>1. 如果您的硬盘分区卷标为中文（比如最常见的“本地磁盘”），请将其修改为英文，然后重新启动</strong></p>
<p><strong> 2. 如果您的当前用户为中文名，请更换为英文名的用户重新登录（如果没有英文名的用户，可以新建一个）</strong></p>
<p>确保了以上两点之后，应该就可以正常安装了！ Enjoy new ubuntu!  (如果您仍然不能正常安装，请您留言)</p>
<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2009/04/ubuntu904-download/" title="Ubuntu9.04(非RC)下载地址">Ubuntu9.04(非RC)下载地址</a></li>
<li><a href="http://abowow.com/2008/12/build-evironment-of-red5-and-flowplayer-on-linux/" title="[实验室项目]linux下red5 0.7.0与flowplayer 3.0.2流媒体平台的搭建">[实验室项目]linux下red5 0.7.0与flowplayer 3.0.2流媒体平台的搭建</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2009/04/ubuntu904-wubi-fail-solution/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ubuntu9.04(非RC)下载地址</title>
		<link>http://abowow.com/2009/04/ubuntu904-download/</link>
		<comments>http://abowow.com/2009/04/ubuntu904-download/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 09:34:17 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.sharkwii.cn/?p=247</guid>
		<description><![CDATA[以下内容转自www.cnbeta.com


感谢sgau的投递
按照 Ubuntu 9.04 (Jaunty Jackalope) 官方发布的系统开发日程， Ubuntu 9.04 正式版将在今天对外发布。
目前已经发现分发完毕的下载链接(releases文件夹)，取舍自由。（请不要在官方的daily文件夹中下载，以免影响分发进程）
下载:Ubuntu 9.04
我的下载速度&#8230;

添加一个官方的下载点：http://releases.ubuntu.com/9.04/
相关文章

Ubuntu9.04 wubi点击无响应(无法启动)的解决办法

]]></description>
			<content:encoded><![CDATA[<p>以下内容转自www.cnbeta.com</p>
<blockquote><p><script type="text/javascript"><!--
var ReTitle = '回复:Ubuntu 9.04 下载镜像';
// --></script></p>
<div id="news_content"><a href="http://www.cnbeta.com/topics/317.htm"><img id="sign" src="http://img.cnbeta.com/topics/ubuntu.gif" alt="Ubuntu" align="right" /></a></div>
<p><strong>感谢<a href="http://forum.ubuntu.org.cn/" target="_blank">sgau</a>的投递</strong><br />
按照 Ubuntu 9.04 (Jaunty Jackalope) 官方发布的系统开发日程， Ubuntu 9.04 正式版将在今天对外发布。<br />
<strong>目前已经发现分发完毕的下载链接(releases文件夹)，取舍自由。</strong>（请不要在官方的daily文件夹中下载，以免影响分发进程）</p>
<p><img src="http://www.cnbeta.com/articles/pic/down.gif" alt="" /><strong>下载:</strong><a href="http://darkstar.ist.utl.pt/ubuntu/releases/9.04/" target="_blank">Ubuntu 9.04</a></p></blockquote>
<p>我的下载速度&#8230;</p>
<p><img class="alignnone size-full wp-image-248" title="ubuntu" src="http://www.sharkwii.cn/wp-content/uploads/2009/04/ubuntu.png" alt="ubuntu" width="840" height="41" /></p>
<p>添加一个官方的下载点：http://releases.ubuntu.com/9.04/</p>
<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2009/04/ubuntu904-wubi-fail-solution/" title="Ubuntu9.04 wubi点击无响应(无法启动)的解决办法">Ubuntu9.04 wubi点击无响应(无法启动)的解决办法</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2009/04/ubuntu904-download/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>一个可以替代Hibernate的轻量化解决方案</title>
		<link>http://abowow.com/2009/04/an-light-substitution-for-hibernate/</link>
		<comments>http://abowow.com/2009/04/an-light-substitution-for-hibernate/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 13:36:27 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[hibernarte]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.sharkwii.cn/?p=215</guid>
		<description><![CDATA[从同学那里搞了这个简单轻量的BaseDAO，其他对象的DAO继承自这个类，再写几个能用到的方法即可，相当方便。终于可以抛弃Hibernate了！
代码较长，请点击下面的链接查看全文！


import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Properties;
&#160;
public abstract class BaseDAO &#123;
&#160;
	protected Connection conn;
	protected static String driverClass;
	protected static String user;
	protected static String url;
	protected static String password;
&#160;
	static &#123;
		//从数据库配置文件导入配置参数
		Properties p = new Properties&#40;&#41;;
		try &#123;
			p.load&#40;BaseDAO.class.getResourceAsStream&#40;&#34;/dbconfig.properties&#34;&#41;&#41;;
		&#125; catch &#40;IOException e1&#41; &#123;
			e1.printStackTrace&#40;&#41;;
		&#125;
		driverClass = p.getProperty&#40;&#34;driverClass&#34;&#41;;
		user = p.getProperty&#40;&#34;user&#34;&#41;;
		url = p.getProperty&#40;&#34;url&#34;&#41;;
		password = p.getProperty&#40;&#34;password&#34;&#41;;
		//加载驱动类
		try &#123;
			Class.forName&#40;&#34;com.mysql.jdbc.Driver&#34;&#41;;
		&#125; catch &#40;ClassNotFoundException e&#41; &#123;
			// TODO Auto-generated catch block
			e.printStackTrace&#40;&#41;;
		&#125;
	&#125;
	public BaseDAO&#40;&#41;&#123;
		openConnection&#40;&#41;;
	&#125;
&#160;
	/**
	 [...]]]></description>
			<content:encoded><![CDATA[<p>从同学那里搞了这个简单轻量的BaseDAO，其他对象的DAO继承自这个类，再写几个能用到的方法即可，相当方便。终于可以抛弃Hibernate了！</p>
<p>代码较长，请点击下面的链接查看全文！<br />
<span id="more-215"></span></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.Connection</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.DriverManager</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.ResultSet</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.SQLException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.Statement</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Properties</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> BaseDAO <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #003399;">Connection</span> conn<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> driverClass<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> user<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> url<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> password<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">//从数据库配置文件导入配置参数</span>
		<span style="color: #003399;">Properties</span> p <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Properties</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			p.<span style="color: #006633;">load</span><span style="color: #009900;">&#40;</span>BaseDAO.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getResourceAsStream</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/dbconfig.properties&quot;</span><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: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e1<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e1.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		driverClass <span style="color: #339933;">=</span> p.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;driverClass&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		user <span style="color: #339933;">=</span> p.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;user&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		url <span style="color: #339933;">=</span> p.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;url&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		password <span style="color: #339933;">=</span> p.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;password&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//加载驱动类</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">Class</span>.<span style="color: #006633;">forName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;com.mysql.jdbc.Driver&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">ClassNotFoundException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// TODO Auto-generated catch block</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> BaseDAO<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		openConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 开启连接
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> openConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			conn <span style="color: #339933;">=</span> <span style="color: #003399;">DriverManager</span>.<span style="color: #006633;">getConnection</span><span style="color: #009900;">&#40;</span>url,user,password<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">SQLException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// TODO Auto-generated catch block</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 关闭连接
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> closeConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>conn<span style="color: #339933;">!=</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
				conn.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">SQLException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// TODO Auto-generated catch block</span>
				e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> executeUpdate<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> sql<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">Statement</span> stm <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			stm <span style="color: #339933;">=</span> conn.<span style="color: #006633;">createStatement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">SQLException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			stm.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span>sql<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">SQLException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #003399;">ResultSet</span> executeQuery<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> sql<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">Statement</span> stm <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			stm <span style="color: #339933;">=</span> conn.<span style="color: #006633;">createStatement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">SQLException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #003399;">ResultSet</span> rs <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			rs <span style="color: #339933;">=</span> stm.<span style="color: #006633;">executeQuery</span><span style="color: #009900;">&#40;</span>sql<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">SQLException</span> e1<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e1.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> rs<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #003399;">List</span> resultSetToList<span style="color: #009900;">&#40;</span><span style="color: #003399;">ResultSet</span> rs<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2008/12/build-evironment-of-red5-and-flowplayer-on-linux/" title="[实验室项目]linux下red5 0.7.0与flowplayer 3.0.2流媒体平台的搭建">[实验室项目]linux下red5 0.7.0与flowplayer 3.0.2流媒体平台的搭建</a></li>
<li><a href="http://abowow.com/2008/12/a-few-basic-operations-of-hibernate/" title="[sdms项目文档]Hibernate框架下数据库更新操作">[sdms项目文档]Hibernate框架下数据库更新操作</a></li>
<li><a href="http://abowow.com/2008/12/magical-mandelbrot-set/" title="神奇的数学图形Mandelbrot set">神奇的数学图形Mandelbrot set</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2009/04/an-light-substitution-for-hibernate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>神奇的数学图形Mandelbrot set</title>
		<link>http://abowow.com/2008/12/magical-mandelbrot-set/</link>
		<comments>http://abowow.com/2008/12/magical-mandelbrot-set/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 13:12:10 +0000</pubDate>
		<dc:creator>Shark Chaos</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.sharkwii.cn/?p=113</guid>
		<description><![CDATA[今天打算做信号与系统的大作业，想用Java做图像处理，翻Core Java 2相关章节的时候看到这么个例子&#8230;实在是太有趣了，怎么这么有趣，有趣的简直令人发指&#8230;

上图是我照着书上的例子写的程序的运行结果.
那么到底什么是Mandelbrot set？
Wiki time! click me
Notice: Make sure you want to see this before you click it. Some images derived from Mandelbrot set seem disgusting&#8230;
相关文章

[sdms项目文档]Hibernate框架下数据库更新操作
[实验室项目]linux下red5 0.7.0与flowplayer 3.0.2流媒体平台的搭建
一个可以替代Hibernate的轻量化解决方案

]]></description>
			<content:encoded><![CDATA[
<a href="http://abowow.com/wp-content/gallery/post_use/mandelbrot_set.jpg" title="" rel="lightbox[singlepic16]" >
	<img class="ngg-singlepic" src="http://abowow.com/wp-content/gallery/cache/16_watermark_320x240_mandelbrot_set.jpg" alt="mandelbrot_set.jpg" title="mandelbrot_set.jpg" />
</a>

<p>今天打算做信号与系统的大作业，想用Java做图像处理，翻Core Java 2相关章节的时候看到这么个例子&#8230;实在是太有趣了，怎么这么有趣，有趣的简直令人发指&#8230;</p>
<p><span id="more-113"></span>
<a href="http://abowow.com/wp-content/gallery/post_use/mandelbrottest.jpg" title="" rel="lightbox[singlepic17]" >
	<img class="ngg-singlepic" src="http://abowow.com/wp-content/gallery/cache/17_watermark_320x240_mandelbrottest.jpg" alt="mandelbrottest.jpg" title="mandelbrottest.jpg" />
</a>
</p>
<p>上图是我照着书上的例子写的程序的运行结果.</p>
<p>那么到底什么是Mandelbrot set？</p>
<p>Wiki time! <a href="http://en.wikipedia.org/wiki/Mandelbrot_set" target="_blank">click me</a></p>
<p><strong>Notice</strong>: Make sure you want to see this before you click it. Some images derived from Mandelbrot set seem disgusting&#8230;</p>
<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://abowow.com/2008/12/a-few-basic-operations-of-hibernate/" title="[sdms项目文档]Hibernate框架下数据库更新操作">[sdms项目文档]Hibernate框架下数据库更新操作</a></li>
<li><a href="http://abowow.com/2009/04/an-light-substitution-for-hibernate/" title="一个可以替代Hibernate的轻量化解决方案">一个可以替代Hibernate的轻量化解决方案</a></li>
<li><a href="http://abowow.com/2008/12/build-evironment-of-red5-and-flowplayer-on-linux/" title="[实验室项目]linux下red5 0.7.0与flowplayer 3.0.2流媒体平台的搭建">[实验室项目]linux下red5 0.7.0与flowplayer 3.0.2流媒体平台的搭建</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://abowow.com/2008/12/magical-mandelbrot-set/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
