<?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>tommy</title>
	<atom:link href="http://www.tomlog.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tomlog.com</link>
	<description>everyday is a new life!</description>
	<lastBuildDate>Tue, 13 Apr 2010 08:54:43 +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>低调推出goo.gl短网址服务</title>
		<link>http://www.tomlog.com/2010/04/googl/</link>
		<comments>http://www.tomlog.com/2010/04/googl/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 03:51:44 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[computer]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://www.tomlog.com/?p=764</guid>
		<description><![CDATA[

Address: 










]]></description>
			<content:encoded><![CDATA[<table cellspacing="5">
<tr>
<td>Address: </td>
<td width="236">
<input type="text" id="address" name="address" size="35"/></td>
<td>
<input type="button" id="submit" name="submit" value="Submit" /></td>
</tr>
<tr id="result">
</tr>
</table>
<p><script type="text/javascript" src="/wp-content/uploads/jquery.js"></script><br />
<script type="text/javascript" src="/wp-content/uploads/googl.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tomlog.com/2010/04/googl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>最简PHP框架</title>
		<link>http://www.tomlog.com/2010/03/simple-mvc/</link>
		<comments>http://www.tomlog.com/2010/03/simple-mvc/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 06:58:24 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[computer]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.tomlog.com/?p=754</guid>
		<description><![CDATA[好久没更新了，一是自已越来越懒，二是，这段时间总是心烦意乱，很难静下心来。
不说了，看下面这个简单的php框架。虽然只有短短的137个字符（完全可以做为一条tweet），但却可以大致模似出CodeIgniter的用法。

1
2
3
4
5
6
&#60;?php
$g=$GET;$c=@$g&#91;'c'&#93;?:'home';
if&#40;!@require &#34;c/$c.php&#34;&#41; die&#40;'error'&#41;;
$m=method_exists&#40;$c,@$g&#91;'m'&#93;&#41;?$g&#91;'m'&#93;:'index';
$o=new $c; $o-&#62;$m&#40;$g&#41;;
?&#62;

将以上代码保存为index.php，然后在index.php所在目录下新建C文件夹，把以下代码保存在C目录中，文件名为home.php。

1
2
3
4
5
6
7
8
9
10
11
12
13
&#60;?php
class home &#123;
    function index&#40;&#41;
    &#123;
        echo &#34;hello, world! fucking gfw!&#34;
    &#125;
&#160;
    function user&#40;$para&#41;
    &#123;
        echo 'hello, '.htmlspecialchars&#40;$para&#91;'name'&#93;&#41;;
    &#125;
&#125;
?&#62;

这样，当访问index.php时，将会执行默认控制器home的默认方法index。
访问index.php?m=user&#038;name=sallon时将会执行home->user($para)方法。
新建控制器时，只需在index.php后指定c=&#8217;控制器名&#8217;就可以了。
]]></description>
			<content:encoded><![CDATA[<p>好久没更新了，一是自已越来越懒，二是，这段时间总是心烦意乱，很难静下心来。<br />
不说了，看下面这个简单的php框架。虽然只有短短的137个字符（完全可以做为一条tweet），但却可以大致模似出CodeIgniter的用法。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$g</span><span style="color: #339933;">=</span><span style="color: #000088;">$GET</span><span style="color: #339933;">;</span><span style="color: #000088;">$c</span><span style="color: #339933;">=@</span><span style="color: #000088;">$g</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'c'</span><span style="color: #009900;">&#93;</span>?<span style="color: #339933;">:</span><span style="color: #0000ff;">'home'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!@</span><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">&quot;c/<span style="color: #006699; font-weight: bold;">$c</span>.php&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$m</span><span style="color: #339933;">=</span><span style="color: #990000;">method_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #339933;">,@</span><span style="color: #000088;">$g</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'m'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>?<span style="color: #000088;">$g</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'m'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span><span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$o</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$c</span><span style="color: #339933;">;</span> <span style="color: #000088;">$o</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$m</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$g</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>将以上代码保存为index.php，然后在index.php所在目录下新建C文件夹，把以下代码保存在C目录中，文件名为home.php。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> home <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;hello, world! fucking gfw!&quot;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> user<span style="color: #009900;">&#40;</span><span style="color: #000088;">$para</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'hello, '</span><span style="color: #339933;">.</span><span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$para</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</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;">?&gt;</span></pre></td></tr></table></div>

<p>这样，当访问index.php时，将会执行默认控制器home的默认方法index。<br />
访问index.php?m=user&#038;name=sallon时将会执行home->user($para)方法。<br />
新建控制器时，只需在index.php后指定c=&#8217;控制器名&#8217;就可以了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tomlog.com/2010/03/simple-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正则啊正则</title>
		<link>http://www.tomlog.com/2009/12/confusing-regex/</link>
		<comments>http://www.tomlog.com/2009/12/confusing-regex/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 03:06:56 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[computer]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://www.tomlog.com/?p=722</guid>
		<description><![CDATA[快被这几个正则给搞死了! 是用来匹配C语言中的/*&#8230;*/这样的注释，为了便于表示，将*替换为x,有以下三种方法：
/x([^x]&#124;x+[^/])*x/
/x([^x]&#124;x+[^/x])*x+/
/x[^x]*x+([^/x][^x]*x+)*/
第一个肯定是不对的，能够匹配过多的内容，比如 /xx A xx/ foo() /xx B xx/ .原因是，如果遇到&#8230;x/&#8230;, /迫使[^/]匹配了x,而下一轮迭代中的[^x]则正好可以匹配/,从而导致越过边界。 所以上边第二个正则中，使用[^/x]来迫使x+返还/前的所有x,这样可以达到匹配/x&#8230;x/的要求。
最后一个正则使用opening normal * (special normal *)* closing的形式，这样具有更高的匹配效率，首先匹配非x字符，然后是x,之后判断x之后是否为/,如果是，则结束匹配，否则进入下一轮special normal* 的循环。直到找到x后的/结束，完成匹配。
其实在第三个正则表达式中，最迷惑我的是special部分为什么用[^/x]而不是[^/],后来想了好久，发现[^/]和[^/x]的区别只发生在正则无法匹配字符串时，如果无法匹配，必然会迫使normal部分，即[^x]*x+,返还x,而返还的x正好可以被spcial部分的[^/]匹配，从而在无法匹配时造成无休止的循环。 使用[^/x]则避免了这个问题，可以立即报告匹配结束。
在实际应用中，需将x替换为*,以第三个为例，最终的正则表达式应该是
/\*[^*]*\*+(?:[^/*][^*]*\*+)*\*/
需要说明的是，如果你的正则引擎支持忽略优先量词，这样写是很傻逼的，直接用
/\*.*?\*/
就搞定了。
]]></description>
			<content:encoded><![CDATA[<p>快被这几个正则给搞死了! 是用来匹配C语言中的/*&#8230;*/这样的注释，为了便于表示，将*替换为x,有以下三种方法：</p>
<blockquote><p>/x([^x]|x+[^/])*x/</p></blockquote>
<blockquote><p>/x([^x]|x+[^/x])*x+/</p></blockquote>
<blockquote><p>/x[^x]*x+([^/x][^x]*x+)*/</p></blockquote>
<p>第一个肯定是不对的，能够匹配过多的内容，比如 /xx A xx/ foo() /xx B xx/ .原因是，如果遇到&#8230;x/&#8230;, /迫使[^/]匹配了x,而下一轮迭代中的[^x]则正好可以匹配/,从而导致越过边界。 所以上边第二个正则中，使用[^/x]来迫使x+返还/前的所有x,这样可以达到匹配/x&#8230;x/的要求。</p>
<p>最后一个正则使用opening normal * (special normal *)* closing的形式，这样具有更高的匹配效率，首先匹配非x字符，然后是x,之后判断x之后是否为/,如果是，则结束匹配，否则进入下一轮special normal* 的循环。直到找到x后的/结束，完成匹配。</p>
<p>其实在第三个正则表达式中，最迷惑我的是special部分为什么用[^/x]而不是[^/],后来想了好久，发现[^/]和[^/x]的区别只发生在正则无法匹配字符串时，如果无法匹配，必然会迫使normal部分，即[^x]*x+,返还x,而返还的x正好可以被spcial部分的[^/]匹配，从而在无法匹配时造成无休止的循环。 使用[^/x]则避免了这个问题，可以立即报告匹配结束。</p>
<p>在实际应用中，需将x替换为*,以第三个为例，最终的正则表达式应该是</p>
<blockquote><p>/\*[^*]*\*+(?:[^/*][^*]*\*+)*\*/</p></blockquote>
<p>需要说明的是，如果你的正则引擎支持忽略优先量词，这样写是很傻逼的，直接用</p>
<blockquote><p>/\*.*?\*/</p></blockquote>
<p>就搞定了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tomlog.com/2009/12/confusing-regex/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>正则表达式实现视频解析</title>
		<link>http://www.tomlog.com/2009/11/parse-video-using-regex/</link>
		<comments>http://www.tomlog.com/2009/11/parse-video-using-regex/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 03:59:57 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[computer]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://www.tomlog.com/?p=692</guid>
		<description><![CDATA[前天帮同学下载一部电视剧，但找到的bt种子速度太慢，只好放弃，于是决定下载56网的视频，只所以选择56网，是因为它的视频没有被分割，而且我可以牛刀小试一下正则表达式，利用它来批量解析下载地址。之后使用迅雷下载，甚爽。
下面这个是使用perl写的（文件名parse），适用于批量解析。可将所有需要下载视频的flash地址（例：http://www.56.com/n_v48_/c23_/8_/19_/hellowjjb_/zhajm_120817547185x_/2725000_/0_/32802621.swf）写入一个文件(1.txt)，然后运行perl -w parse 1.txt > 2.txt 即可瞬间得到下载地址。
while ($line=&#60;&#62;)
{
	if($line=~m/^http:\/\/www.56.com[^c]*?c(\d\d?)_\/(\d\d?)_\/(\d\d?)_\/([^\/]+?)_\/([^\/]*?)_\/.*swf\b/)
		{
  			print &#8220;http://c$1.56.com/flvdownload/$2/$3/$4\@56.com_56flv_$5.flv\n&#8221;;
  		}
}
这个是php版的代码：

&#60;html&#62;
&#60;head&#62;
&#60;title&#62;56网视频解析&#60;/title&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;h3 style=&#8221;text-align:center&#8221;&#62;视频解析&#60;/h3&#62;
&#60;br /&#62;
&#60;form method=&#8221;post&#8221; action=&#8221;#&#8221;&#62;
	&#60;center&#62;&#60;input type=&#8221;text&#8221; size=&#8221;60&#8243; name=&#8221;url&#8221; /&#62;
	&#60;input type=&#8221;submit&#8221; name=&#8221;submit&#8221; value=&#8221;Submit&#8221; /&#62;&#60;/center&#62;&#60;br /&#62;
&#60;/form&#62;
&#60;?php
if(isset($_POST['url'])&#038;&#038;isset($_POST['submit']))
{
	$url=$_POST['url'];
	$pattern=&#8217;/^http:\/\/www.56.com[^c]*?c(\d\d?)_\/(\d\d?)_\/(\d\d?)_\/([^\/]+?)_\/([^\/]*?)_\/.*swf\b/&#8217;;
	if(preg_match($pattern,$url,$matches))
		{
			$download=&#8221;http://c$matches[1].56.com/flvdownload/$matches[2]/$matches[3]/$matches[4]@56.com_56flv_$matches[5].flv&#8221;;
		}
	else
		{
			$download=&#8221;sorry,can not parse download address!&#8221;;
		}
	echo &#8220;下载地址是：&#60;br /&#62;$download&#8221;;
}
?&#62;
&#60;/body&#62;
&#60;/html&#62;

效果请看 这里.
]]></description>
			<content:encoded><![CDATA[<p>前天帮同学下载一部电视剧，但找到的bt种子速度太慢，只好放弃，于是决定下载56网的视频，只所以选择56网，是因为它的视频没有被分割，而且我可以牛刀小试一下正则表达式，利用它来批量解析下载地址。之后使用迅雷下载，甚爽。</p>
<p>下面这个是使用perl写的（文件名parse），适用于批量解析。可将所有需要下载视频的flash地址（例：http://www.56.com/n_v48_/c23_/8_/19_/hellowjjb_/<br />zhajm_120817547185x_/2725000_/0_/32802621.swf）写入一个文件(1.txt)，然后运行perl -w parse 1.txt > 2.txt 即可瞬间得到下载地址。</p>
<blockquote><p>while ($line=&lt;&gt;)<br />
{<br />
	if($line=~m/^http:\/\/www.56.com[^c]*?c(\d\d?)_\/(\d\d?)_\/(\d\d?)_\/([^\/]+?)_\/([^\/]*?)_\/.*swf\b/)<br />
		{<br />
  			print &#8220;http://c$1.56.com/flvdownload/$2/$3/$4\@56.com_56flv_$5.flv\n&#8221;;<br />
  		}<br />
}</p></blockquote>
<p>这个是php版的代码：</p>
<blockquote><p>
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;56网视频解析&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h3 style=&#8221;text-align:center&#8221;&gt;视频解析&lt;/h3&gt;<br />
&lt;br /&gt;<br />
&lt;form method=&#8221;post&#8221; action=&#8221;#&#8221;&gt;<br />
	&lt;center&gt;&lt;input type=&#8221;text&#8221; size=&#8221;60&#8243; name=&#8221;url&#8221; /&gt;<br />
	&lt;input type=&#8221;submit&#8221; name=&#8221;submit&#8221; value=&#8221;Submit&#8221; /&gt;&lt;/center&gt;&lt;br /&gt;<br />
&lt;/form&gt;</p>
<p>&lt;?php<br />
if(isset($_POST['url'])&#038;&#038;isset($_POST['submit']))<br />
{<br />
	$url=$_POST['url'];<br />
	$pattern=&#8217;/^http:\/\/www.56.com[^c]*?c(\d\d?)_\/(\d\d?)_\/(\d\d?)_\/([^\/]+?)_\/([^\/]*?)_\/.*swf\b/&#8217;;<br />
	if(preg_match($pattern,$url,$matches))<br />
		{<br />
			$download=&#8221;http://c$matches[1].56.com/flvdownload/$matches[2]/$matches[3]/$matches[4]@56.com_56flv_$matches[5].flv&#8221;;<br />
		}<br />
	else<br />
		{<br />
			$download=&#8221;sorry,can not parse download address!&#8221;;<br />
		}<br />
	echo &#8220;下载地址是：&lt;br /&gt;$download&#8221;;<br />
}<br />
?&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;
</p></blockquote>
<p>效果请看 <a href="http://www.tomlog.com/parse.php" target="_blanck">这里</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tomlog.com/2009/11/parse-video-using-regex/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>转载：不是书评 ：《我是一只IT小小鸟》</title>
		<link>http://www.tomlog.com/2009/11/i-am-a-bird-of-it/</link>
		<comments>http://www.tomlog.com/2009/11/i-am-a-bird-of-it/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 06:42:31 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.tomlog.com/?p=684</guid>
		<description><![CDATA[在刘未鹏大牛的博客上看到这篇文章，深以为然，忍不住转载过来， 鼓厉一下浮躁的自己。以下是原文：
设计你自己的进度条
进度条的设计是一个很多人都知道的故事：同样的耗时，如果不给任何进度提示，只是在完成之后才弹出一个完成消息，中间没有任何动态变化，那么整个过程就会让人等得非常焦急，导致一些人干脆把程序关了了事。如果有进度不断更新，那么对整个过程耗时的心理感受就会远低于实际值，用户也不会郁闷到把程序关了。（你有多少次在银行处理手续的时候，看着工作人员把一堆材料不停地倒腾来去，心里多希望他们可以在柜台小窗口上投影一个进度条？）
这里的原因在于，没有进度提示的话，我们无法判断这个等待什么时候才是个尽头。如果有不断增长的进度条，那么我们对于什么时候会达到100%就会有一个粗略的估计，这个估计是一剂定心丸，让我们知道这事情总会并且会在不久的将来完成。
做事情也是同样的道理，善于规划的人，会将目标分割成一个个的里程碑，再将里程碑分割成TODO列表。前阵子流行的GTD方法学，核心的理念就在于，如果你把任务分割了，你就有了进度条，你就知道，事情在不断的进展，你总会完成任务或到达你的目标，你会有一个时间估计。反之如果没有这个分割，整个的任务或目标对你来说就只有两种状态——“完成”和“未完成”，如果不幸是一个比较漫长的目标，那么你会发现你的进度条总是“未完成”，一次又一次的等待未果会耗尽你的耐心，让你下意识的产生“这事什么时候才能完呢？”的疑惑，没有分而治之，你就不知道未来还需要付出多少努力才能达到目的，这就会让你心生怯意，不敢进一步投入时间，免得血本无归。在这样的心理下，不少人就会选择保守策略——退出，以免到头来花了时间还一事无成。
而所谓的规划其实就是针对这种心理弱点的做事方法。如果你对整个目标的几个重大步骤有清晰的界定，能够对每个步骤的耗时作出靠谱的上界估计，你就不会被不确定的未来，不确定的时间投入感到恐惧，就不会被这种不确定感压迫到过早退出。

不要过早退出循环
我们在尝试新的事物的时候，总是会遇到各种各样的困难，不同的人会在碰壁不同的次数之后退出。用程序员喜欢的话来说就是，我们都在for循环，区别在于你是什么情况下break;的。有的人退出阈值高，这是能坚持的一类人，有的人退出阈值低，这类人很可能遇到一些障碍就退出了。
过早退出的原因往往在于对于未来的不确定性，对于投资时间最终无法收到回报的恐惧，感受到的困难越大，这种恐惧越大，因为越大的困难往往暗示着这个任务需要投资的时间越大。所以其实我们都是直觉经济学家，当我们说“畏难”的时候，其实我们畏惧的不是困难本身，而是困难所暗示的时间经济学意义。
然而，我们的情绪大脑毕竟比较原始，仅根据碰壁的次数或硬度来判断事情的难易并不一定靠谱，如果你遇到困难，不妨用一用互联网，用一用群体的智慧，看看别人当时是怎么想怎么办的，绝大多数情况下你并不孤单，你遇到的问题早就有人遇到过，你踩过的坑里面尽是前人的脚印，不要仅仅因为一时摸不着头绪，找不着出路就退出，这不是informed decision，问一问自己作出退出的决策是否基于足够的信息，我是否进行了足够的调查，至少，是否去简单用了用搜索引擎。
模仿高德纳先生的名言：过早退出是一切失败的根源。
兴趣遍地都是，专注和持之以恒才是真正稀缺的
很多人看了书中的故事之后得出这样的结论：兴趣最重要。然而，我觉得区别他们和其他人的，并不是他们拥有超过常人的兴趣，而是他们拥有超过常人的毅力。
其实人天生就对新事物怀有好奇心，难以找出谁没有对任何事物或领域产生过兴趣，然而不同的是，有些人的兴趣只能持续几天，当遇到第一个困难，第一道坎的时候，他们就熄灭了，然而另一些人的兴趣火花会变成火苗，火苗会变成火种，一直稳定的燃烧很多年。区别他们的并不是兴趣的有无，而是他们的性格里面有没有维持兴趣的火种一直燃烧下去的燃料。
一个人有专注和持之以恒的性格，即便在一个没有多大兴趣的领域也能成为专家（更何况，兴趣的很大一类来源就是“我擅长做这件事情”）；反之就算有兴趣也很快会被一些冷水泼灭。
生活中的选择远比我们想象得要多，细微的选择差异造就了不同的人生
唐雅薇同学的故事中，有这么一个细节吸引了我的注意：当时她正在找工作阶段，对女生在IT行业的发展很迷茫，恰逢微软的郭蓓菁女士到他们学校演讲，演讲完了之后她立即就奔上讲台拦住郭女士询问女生与IT的问题。
这是一个细节，但我相信不是所有人都有勇气上去拦住名人问普通问题的，我们会给自己找很多很多的理由和接口，我想最常见的应该是两个原因：1. 如果被批评了自尊心会受到打击。2.认为问了也问不出特别的信息。然而事实却是相反：1. 自尊心受到打击算不上实质性的损失。2. 你想不出能问出什么特别的信息并不代表就真的问不到重要的信息。别把不知道当成没有。
一个小小的思维差异，可能导致很多人在遇到困惑的时候原地打转，冲突不出，而另一些人则取经得到宝贵的经验，站在别人的肩膀上越过了障碍。唐雅薇从郭女士那儿得到了最宝贵的信息：女生在IT行业也能有很好的发展。信心，是这样一种奇怪的东西，就算你没有确切的证明未来会更好，你也会坚持下去，你不会过早退出循环；而来源于过来人的信息则是信心最靠谱的保障。
你是不是意识到，在平常的生活中，你所作出的选择比你想象的要多得多呢？有没有想过有一些看似细小的选择可能会产生巨大的影响？
想想看，试一下，是不是真的没什么损失，还有可能得到巨大的回报呢？
靠专业技能的成功是最具可复制性的
它需要的只是你在一个领域坚持不懈地专注下去，只需要选择一个不算太不靠谱的方向，然后专心致志的专下去，最后必然能成为高手或者绝顶高手。世上有很多成功带有偶然因素和运气成分或出身环境，但至少这一样，被无数人复制了无数遍，否则就不会存在学校和教育了。
反思是让人得以改进自己的最重要的思维品质
很多人在成年之后甚至未及成年，性格就难以再发生大的变化。性格是这样一种自我实现和强化的陷阱：如果你是不容易专注的人，你会发现生活中处处都是分散你注意力的东西，你的思维难以在一个事情上停留半小时，于是你的时间变得琐碎，你很难在一个领域有长久的积累和深入的思考，这样的现实可能会让你感到沮丧，后者让你更加无法专心，这样的现实可能会让你感到焦虑，为了避开焦虑你又会去寻求其他的刺激，结果是恶性循环。
反思是改变自己的第一步，我们常常容易发现别人的问题，别人的错误，却难以发现自己思维中的问题，因为我们很少会把自己的思维当成目标去思考。
作为程序员，相信没有人不知道能修改自身的程序，而能修改自身的程序的前提就是，首先这个程序必须有法子能够指向自身。
饿死在干草堆之间的驴子
有很多在迷茫期的同学，迷茫都是相似的：面前有两条路，到底选哪一条？“转行还是不转行？”“学C++还是学Java。？“做管理还是做程序员？”有些问题其实不是问题：比如“学C++还是学Java。”答案是都学而且还不仅学两个。有些问题不是一个泛泛的答案能够适合的，比如转行还是不转行，需要考虑很多自身因素。
但更重要的是，有人会因为无法作出决定就推迟决定，然而实际上推迟决定是最差的决定，在推迟决定期间，时间悄悄流逝，你却没有任何一条路上的积累，白白浪费了时间。
如果你有一些钱不知道花在A还是B上，你先不作决定，没问题，因为钱还是你的，但如果你有一些时间，不知道花在A上还是B上，不行，因为过了这段时间，这段时间就不是你的了。
所以，不管有多纠结，也不要从纠结中逃离，试图推延决定，既然终究是个痛苦的决定，就痛一回，好好思考和调查之后作出一个决定并坚持下去，只要不是太不靠谱的行业（相信也没谁会在纠结了之后却选了一个不靠谱的行业的），经过你的积累总会成为高手。
一生的知识积累，自学的起码占90%
你会在这本书当中看到的一个重复出现的现象就是自学，大规模的自学，逃课自学，上网找书自学，程序员行业是最适合自学的行业，网络是程序员的天堂，需要的资源、工具，比课堂上的多出何止百倍，如果说还有一个学科，并不需要传统的教育就可以成才，估计非程序员莫属了。作为程序员如果没有查过wikipedia，没有看过几本原版电子书，没有在国内外主要邮件列表里面提过问题吵过架，没有用技术博客记录学习的独特体会，没有订阅技术牛人们的博客，怎么好意思说身在这个行业呢？
最后，看完了书还是说“说起来容易做起来难”的，怪自己，不怪书。
]]></description>
			<content:encoded><![CDATA[<p>在<a href="http://mindhacks.cn/2009/10/05/im-a-tiny-bird-book-review/" target=_blank>刘未鹏</a>大牛的博客上看到这篇文章，深以为然，忍不住转载过来， 鼓厉一下浮躁的自己。以下是原文：</p>
<h5>设计你自己的进度条</h5>
<p>进度条的设计是一个很多人都知道的故事：同样的耗时，如果不给任何进度提示，只是在完成之后才弹出一个完成消息，中间没有任何动态变化，那么整个过程就会让人等得非常焦急，导致一些人干脆把程序关了了事。如果有进度不断更新，那么对整个过程耗时的心理感受就会远低于实际值，用户也不会郁闷到把程序关了。（你有多少次在银行处理手续的时候，看着工作人员把一堆材料不停地倒腾来去，心里多希望他们可以在柜台小窗口上投影一个进度条？）</p>
<p>这里的原因在于，没有进度提示的话，我们无法判断这个等待什么时候才是个尽头。如果有不断增长的进度条，那么我们对于什么时候会达到100%就会有一个粗略的估计，这个估计是一剂定心丸，让我们知道这事情总会并且会在不久的将来完成。</p>
<p>做事情也是同样的道理，善于规划的人，会将目标分割成一个个的里程碑，再将里程碑分割成TODO列表。前阵子流行的GTD方法学，核心的理念就在于，如果你把任务分割了，你就有了进度条，你就知道，事情在不断的进展，你总会完成任务或到达你的目标，你会有一个时间估计。反之如果没有这个分割，整个的任务或目标对你来说就只有两种状态——“完成”和“未完成”，如果不幸是一个比较漫长的目标，那么你会发现你的进度条总是“未完成”，一次又一次的等待未果会耗尽你的耐心，让你下意识的产生“这事什么时候才能完呢？”的疑惑，没有分而治之，你就不知道未来还需要付出多少努力才能达到目的，这就会让你心生怯意，不敢进一步投入时间，免得血本无归。在这样的心理下，不少人就会选择保守策略——退出，以免到头来花了时间还一事无成。</p>
<p>而所谓的规划其实就是针对这种心理弱点的做事方法。如果你对整个目标的几个重大步骤有清晰的界定，能够对每个步骤的耗时作出靠谱的上界估计，你就不会被不确定的未来，不确定的时间投入感到恐惧，就不会被这种不确定感压迫到过早退出。<br />
<span id="more-684"></span></p>
<h5>不要过早退出循环</h5>
<p>我们在尝试新的事物的时候，总是会遇到各种各样的困难，不同的人会在碰壁不同的次数之后退出。用程序员喜欢的话来说就是，我们都在for循环，区别在于你是什么情况下break;的。有的人退出阈值高，这是能坚持的一类人，有的人退出阈值低，这类人很可能遇到一些障碍就退出了。</p>
<p>过早退出的原因往往在于对于未来的不确定性，对于投资时间最终无法收到回报的恐惧，感受到的困难越大，这种恐惧越大，因为越大的困难往往暗示着这个任务需要投资的时间越大。所以其实我们都是直觉经济学家，当我们说“畏难”的时候，其实我们畏惧的不是困难本身，而是困难所暗示的时间经济学意义。</p>
<p>然而，我们的情绪大脑毕竟比较原始，仅根据碰壁的次数或硬度来判断事情的难易并不一定靠谱，如果你遇到困难，不妨用一用互联网，用一用群体的智慧，看看别人当时是怎么想怎么办的，绝大多数情况下你并不孤单，你遇到的问题早就有人遇到过，你踩过的坑里面尽是前人的脚印，不要仅仅因为一时摸不着头绪，找不着出路就退出，这不是informed decision，问一问自己作出退出的决策是否基于足够的信息，我是否进行了足够的调查，至少，是否去简单用了用搜索引擎。</p>
<p>模仿高德纳先生的名言：<strong>过早退出是一切失败的根源</strong>。</p>
<h5>兴趣遍地都是，专注和持之以恒才是真正稀缺的</h5>
<p>很多人看了书中的故事之后得出这样的结论：兴趣最重要。然而，我觉得区别他们和其他人的，并不是他们拥有超过常人的兴趣，而是他们拥有超过常人的毅力。</p>
<p>其实人天生就对新事物怀有好奇心，难以找出谁没有对任何事物或领域产生过兴趣，然而不同的是，有些人的兴趣只能持续几天，当遇到第一个困难，第一道坎的时候，他们就熄灭了，然而另一些人的兴趣火花会变成火苗，火苗会变成火种，一直稳定的燃烧很多年。<strong>区别他们的并不是兴趣的有无，而是他们的性格里面有没有维持兴趣的火种一直燃烧下去的燃料</strong>。</p>
<p>一个人有专注和持之以恒的性格，即便在一个没有多大兴趣的领域也能成为专家（更何况，兴趣的很大一类来源就是“我擅长做这件事情”）；反之就算有兴趣也很快会被一些冷水泼灭。</p>
<h5>生活中的选择远比我们想象得要多，细微的选择差异造就了不同的人生</h5>
<p>唐雅薇同学的故事中，有这么一个细节吸引了我的注意：当时她正在找工作阶段，对女生在IT行业的发展很迷茫，恰逢微软的郭蓓菁女士到他们学校演讲，演讲完了之后她立即就奔上讲台拦住郭女士询问女生与IT的问题。</p>
<p>这是一个细节，但我相信不是所有人都有勇气上去拦住名人问普通问题的，我们会给自己找很多很多的理由和接口，我想最常见的应该是两个原因：1. 如果被批评了自尊心会受到打击。2.认为问了也问不出特别的信息。然而事实却是相反：1. 自尊心受到打击算不上实质性的损失。2. 你想不出能问出什么特别的信息并不代表就真的问不到重要的信息。<strong>别把不知道当成没有</strong>。</p>
<p>一个小小的思维差异，可能导致很多人在遇到困惑的时候原地打转，冲突不出，而另一些人则取经得到宝贵的经验，站在别人的肩膀上越过了障碍。唐雅薇从郭女士那儿得到了最宝贵的信息：女生在IT行业也能有很好的发展。信心，是这样一种奇怪的东西，就算你没有确切的证明未来会更好，你也会坚持下去，你不会过早退出循环；而来源于过来人的信息则是信心最靠谱的保障。</p>
<p>你是不是意识到，在平常的生活中，你所作出的选择比你想象的要多得多呢？有没有想过有一些看似细小的选择可能会产生巨大的影响？</p>
<p>想想看，试一下，是不是真的没什么损失，还有可能得到巨大的回报呢？</p>
<h5>靠专业技能的成功是最具可复制性的</h5>
<p>它需要的只是你在一个领域坚持不懈地专注下去，只需要选择一个不算太不靠谱的方向，然后专心致志的专下去，最后必然能成为高手或者绝顶高手。世上有很多成功带有偶然因素和运气成分或出身环境，但至少这一样，被无数人复制了无数遍，否则就不会存在学校和教育了。</p>
<h5>反思是让人得以改进自己的最重要的思维品质</h5>
<p>很多人在成年之后甚至未及成年，性格就难以再发生大的变化。性格是这样一种自我实现和强化的陷阱：如果你是不容易专注的人，你会发现生活中处处都是分散你注意力的东西，你的思维难以在一个事情上停留半小时，于是你的时间变得琐碎，你很难在一个领域有长久的积累和深入的思考，这样的现实可能会让你感到沮丧，后者让你更加无法专心，这样的现实可能会让你感到焦虑，为了避开焦虑你又会去寻求其他的刺激，结果是恶性循环。</p>
<p>反思是改变自己的第一步，我们常常容易发现别人的问题，别人的错误，却难以发现自己思维中的问题，因为我们很少会把自己的思维当成目标去思考。</p>
<p>作为程序员，相信没有人不知道能修改自身的程序，而能修改自身的程序的前提就是，首先这个程序必须有法子能够指向自身。</p>
<h5>饿死在干草堆之间的驴子</h5>
<p>有很多在迷茫期的同学，迷茫都是相似的：面前有两条路，到底选哪一条？“转行还是不转行？”“学C++还是学Java。？“做管理还是做程序员？”有些问题其实不是问题：比如“学C++还是学Java。”答案是都学而且还不仅学两个。有些问题不是一个泛泛的答案能够适合的，比如转行还是不转行，需要考虑很多自身因素。</p>
<p>但更重要的是，有人会因为无法作出决定就推迟决定，然而实际上推迟决定是最差的决定，在推迟决定期间，时间悄悄流逝，你却没有任何一条路上的积累，白白浪费了时间。</p>
<p>如果你有一些钱不知道花在A还是B上，你先不作决定，没问题，因为钱还是你的，但如果你有一些时间，不知道花在A上还是B上，不行，因为过了这段时间，这段时间就不是你的了。</p>
<p>所以，不管有多纠结，也不要从纠结中逃离，试图推延决定，既然终究是个痛苦的决定，就痛一回，好好思考和调查之后作出一个决定并坚持下去，只要不是太不靠谱的行业（相信也没谁会在纠结了之后却选了一个不靠谱的行业的），经过你的积累总会成为高手。</p>
<h5>一生的知识积累，自学的起码占90%</h5>
<p>你会在这本书当中看到的一个重复出现的现象就是自学，大规模的自学，逃课自学，上网找书自学，程序员行业是最适合自学的行业，网络是程序员的天堂，需要的资源、工具，比课堂上的多出何止百倍，如果说还有一个学科，并不需要传统的教育就可以成才，估计非程序员莫属了。作为程序员如果没有查过wikipedia，没有看过几本原版电子书，没有在国内外主要邮件列表里面提过问题吵过架，没有用技术博客记录学习的独特体会，没有订阅技术牛人们的博客，怎么好意思说身在这个行业呢？</p>
<p>最后，看完了书还是说“说起来容易做起来难”的，<strong>怪自己，不怪书</strong>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tomlog.com/2009/11/i-am-a-bird-of-it/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>javascript贪吃蛇</title>
		<link>http://www.tomlog.com/2009/10/study-javascript/</link>
		<comments>http://www.tomlog.com/2009/10/study-javascript/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 11:42:45 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[computer]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.tomlog.com/?p=593</guid>
		<description><![CDATA[
您的得分: 
0
  


请选定级别
1
2
3
4




学习javascript时，也仿照高洛峰老师的教程，做了这么个东东。按方向键开始游戏，可以在右边选定级别。非ie浏览器接收键盘消息的方法和ie有点小不一样，因此，这个小游戏只支持IE浏览器。
在wordpress的编辑器中写javascript代码是一件很痛苦的事(总是被莫名其妙的转义)，后来我选择在编辑器中用css+div控制布局，并创建地图，将javascript代码单独导出到一个文件中，然后通过src=&#8221;&#8230;&#8221;这种方式调用，终于成功的移植了过来。完整的贪吃蛇代码可以单击 这里 下载。
]]></description>
			<content:encoded><![CDATA[<div id="mainMap" style="border-width:2px;border-color:#ccccff;border-style:solid;width:354px;height:214px;float:left;position:relative;"></div>
<div style="float:left; margin-left:10px;">您的得分: </div>
<div id="scores" style="float:left;">0</div>
<p>  <br \><br \></p>
<div style="float:left;margin-left:10px;">
<select name="level" id="level" onchange="level()">
<option value="1" checked>请选定级别</option><br />
<option value="1">1</option><br />
<option value="2">2</option><br />
<option value="3">3</option><br />
<option value="4">4</option><br />
</select>
</div>
<p><script type="text/javascript" src="http://www.tomlog.com/wp-content/uploads/snake.js"></script></p>
<div style="clear:both;height:10px;"></div>
<p>学习javascript时，也仿照高洛峰老师的教程，做了这么个东东。按方向键开始游戏，可以在右边选定级别。非ie浏览器接收键盘消息的方法和ie有点小不一样，因此，这个小游戏只支持IE浏览器。</p>
<p>在wordpress的编辑器中写javascript代码是一件很痛苦的事(总是被莫名其妙的转义)，后来我选择在编辑器中用css+div控制布局，并创建地图，将javascript代码单独导出到一个文件中，然后通过src=&#8221;&#8230;&#8221;这种方式调用，终于成功的移植了过来。完整的贪吃蛇代码可以单击 <a href="http://www.tomlog.com/wp-content/uploads/snake.rar" target="_blank">这里</a> 下载。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tomlog.com/2009/10/study-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>正则表达式学习</title>
		<link>http://www.tomlog.com/2009/10/study-regular-expression/</link>
		<comments>http://www.tomlog.com/2009/10/study-regular-expression/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 10:20:33 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[computer]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://www.tomlog.com/?p=585</guid>
		<description><![CDATA[for /r %i in (*.*) do @perl -pi.bak -e "s/^.*$/hello, world!/g" "%i"
(注：如果你不明白以上命令，请不要尝试运行。)
]]></description>
			<content:encoded><![CDATA[<pre>for /r %i in (*.*) do @perl -pi.bak -e "s/^.*$/hello, world!/g" "%i"</pre>
<p>(注：如果你不明白以上命令，请不要尝试运行。)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tomlog.com/2009/10/study-regular-expression/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学习div+css</title>
		<link>http://www.tomlog.com/2009/10/study-divcss/</link>
		<comments>http://www.tomlog.com/2009/10/study-divcss/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 17:06:55 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[computer]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[div]]></category>

		<guid isPermaLink="false">http://www.tomlog.com/?p=553</guid>
		<description><![CDATA[div+css好强大，比如 这个东西 是我直接用手写代码实现的一个网站首页布局，里面没用一个表格。
写这个东西的时候，我最头疼的是兼容性问题，在ie下显示正常，换到opera就乱套，好不容易调好了opera下的显示，回到ie又变样了&#8230; 几近崩溃。为了让分割条在opera和ie下表示的一致，我甚至不得不采用
&#60;div class="nav"&#62;.&#60;/div&#62;
这种恶心的用法。
我用的是高洛峰的div/css教程，貌似只有五集，非常不错，入门来说足够了，强烈推荐，需要的童鞋可以去 lamp兄弟连 下载。
]]></description>
			<content:encoded><![CDATA[<p>div+css好强大，比如 <a href="/divcss.html" target="_blanck">这个东西</a> 是我直接用手写代码实现的一个网站首页布局，里面没用一个表格。</p>
<p>写这个东西的时候，我最头疼的是兼容性问题，在ie下显示正常，换到opera就乱套，好不容易调好了opera下的显示，回到ie又变样了&#8230; 几近崩溃。为了让分割条在opera和ie下表示的一致，我甚至不得不采用</p>
<pre>&lt;div class="nav"&gt;.&lt;/div&gt;</pre>
<p>这种恶心的用法。</p>
<p>我用的是高洛峰的div/css教程，貌似只有五集，非常不错，入门来说足够了，强烈推荐，需要的童鞋可以去 <a href="http://bbs.lampbrother.net/thread-10768-1-1.html" target="_blanck">lamp兄弟连</a> 下载。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tomlog.com/2009/10/study-divcss/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>php学习</title>
		<link>http://www.tomlog.com/2009/10/study-php/</link>
		<comments>http://www.tomlog.com/2009/10/study-php/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 03:24:08 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[computer]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.tomlog.com/?p=542</guid>
		<description><![CDATA[php快看完了，这个语言给我的最大感觉就是简单，灵活，用起来随心所欲，很有keep it simple, stupid的特色，语法什么的跟c比较接近。所以很容易上手。刚刚写完了一个简单的小型cms系统，基本功能都有了，就是界面奇丑无比，布局很混乱。唉，没半点艺术细胞.. 看来得好好研究一下css了。
有时脑袋发晕了，什么错误都会犯，比如下面这个admin页面。一运行，就会出错Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource&#8230;看了半天不知道哪儿有问题。上网搜索也没有答案。后来我把查询语句移到函数外面则正常执行。折腾了大半天，才突然意识到虽然在开头把&#8217;conn.php&#8217;包含进来了，函数内部却没有声明。 global $a_users;下面加一名global $conn;就没问题了。


&#60;?php
require_once 'conn.php';
require_once 'header.php';

$a_users=array(1=&#62;"Users","Moderators","Admins");
function echoUserList($lvl)
{
	global $a_users;

	$sql="SELECT user_id,name,email FROM cms_users ".
		"WHERE access_lvl=$lvl ORDER BY name";
	$result=mysql_query($sql,$conn) or die(mysql_error());

	if(mysql_num_rows($result)==0)
	{
		echo "&#60;em&#62;NO ".$a_user[$lvl]." created.&#60;/em&#62;";
	}
	else
	{
		while($row=mysql_fetch_array($result))
		{
			if($row['user_id']==$_SESSION['user_id'])
				echo htmlspecialchars($row['name'])."&#60;br&#62;\n";
			else
			{
				echo '&#60;a href="useraccount.php?userid='.$row['user_id'].
					'" title="'.htmlspecialchars($row['email']).'"&#62;'.
					htmlspecialchars($row['name'])."&#60;/a&#62;&#60;br&#62;\n";
			}
		}
	}
}
?&#62;
&#60;h2&#62;User Administration&#60;/h2&#62;
&#60;?php
for($i=1;$i&#60;=3;$i++)
{
	echo "&#60;h3&#62;".$a_users[$i]."&#60;/h3&#62;\n".
		"&#60;div class='scroller'&#62;\n";
	echoUserList($i);
	echo "\n&#60;/div&#62;\n";
}
?&#62;
&#60;br&#62;
&#60;?php require_once 'footer.php';?&#62;
]]></description>
			<content:encoded><![CDATA[<p>php快看完了，这个语言给我的最大感觉就是简单，灵活，用起来随心所欲，很有keep it simple, stupid的特色，语法什么的跟c比较接近。所以很容易上手。刚刚写完了一个简单的小型cms系统，基本功能都有了，就是界面奇丑无比，布局很混乱。唉，没半点艺术细胞.. 看来得好好研究一下css了。</p>
<p>有时脑袋发晕了，什么错误都会犯，比如下面这个admin页面。一运行，就会出错Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource&#8230;看了半天不知道哪儿有问题。上网搜索也没有答案。后来我把查询语句移到函数外面则正常执行。折腾了大半天，才突然意识到虽然在开头把&#8217;conn.php&#8217;包含进来了，函数内部却没有声明。 global $a_users;下面加一名global $conn;就没问题了。
<p>
<span id="more-542"></span></p>
<pre>&lt;?php
require_once 'conn.php';
require_once 'header.php';

$a_users=array(1=&gt;"Users","Moderators","Admins");
function echoUserList($lvl)
{
	global $a_users;

	$sql="SELECT user_id,name,email FROM cms_users ".
		"WHERE access_lvl=$lvl ORDER BY name";
	$result=mysql_query($sql,$conn) or die(mysql_error());

	if(mysql_num_rows($result)==0)
	{
		echo "&lt;em&gt;NO ".$a_user[$lvl]." created.&lt;/em&gt;";
	}
	else
	{
		while($row=mysql_fetch_array($result))
		{
			if($row['user_id']==$_SESSION['user_id'])
				echo htmlspecialchars($row['name'])."&lt;br&gt;\n";
			else
			{
				echo '&lt;a href="useraccount.php?userid='.$row['user_id'].
					'" title="'.htmlspecialchars($row['email']).'"&gt;'.
					htmlspecialchars($row['name'])."&lt;/a&gt;&lt;br&gt;\n";
			}
		}
	}
}
?&gt;
&lt;h2&gt;User Administration&lt;/h2&gt;
&lt;?php
for($i=1;$i&lt;=3;$i++)
{
	echo "&lt;h3&gt;".$a_users[$i]."&lt;/h3&gt;\n".
		"&lt;div class='scroller'&gt;\n";
	echoUserList($i);
	echo "\n&lt;/div&gt;\n";
}
?&gt;
&lt;br&gt;
&lt;?php require_once 'footer.php';?&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.tomlog.com/2009/10/study-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
