<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[TUPUNCO 's BLOG]]></title>
  <subtitle type="html"><![CDATA[小强]]></subtitle>
  <id>http://zhq.ahau.edu.cn/blog/</id>
  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/" /> 
  <link rel="self" type="application/atom+xml" href="http://zhq.ahau.edu.cn/blog/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2008-08-20T08:27:25+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[提取 SWF 中的音频]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=1" label="原创" /> 
	  <updated>2008-08-20T08:27:25+08:00</updated>
	  <published>2008-08-20T08:27:25+08:00</published>
		  <summary type="html"><![CDATA[<p>好久没有更新博客了, 原因有好多, 天气热人烦躁是一个方面, 最大原因是自己懒得写. 本篇博文其实一个月之前就计划写了, 但每次开了头就感觉没有必要写下去了. 不废话了切入正题.</p>  <p>从 SWF 中提取音频的起因是想下载国内某音乐推荐站的音乐, 但赖于此站点推荐的音乐基本都被转化成了 SWF 格式的文件形式, 所以突发奇想能不能把 SWF 的音频给提取出来. 经过资料的搜集和准备, 最后还是成功了一半, 虽然并不是所有 SWF 内的音频可以正确的提取出来, 但对 MP3 格式的音频提取已经做的很完美了.</p>  <p>首先找到的一个处理 SWF 的类库 <a title="SwfDotNet" href="http://sourceforge.net/projects/swfdotnet/" target="_blank">SwfDotNet</a>, 本类库支持读写 SWF 7.0 之前(包括)的文件, 官方网站: <a title="http://sourceforge.net/projects/swfdotnet/" href="http://sourceforge.net/projects/swfdotnet/">http://sourceforge.net/projects/swfdotnet/</a>. 基于 <a href="http://www.gnu.org/copyleft/gpl.html" target="_blank">GPL</a> 协议的开源 .Net 类库, 本类库RC1 已经好长时间了, 两年已经没有人维护了, 虽然不是很完美不过已经足够了.</p>  <p>因为在提取的中途出了点小波折, 所以后来又找到了 SWF 的格式规范&lt;SWF File Format Specification V9&gt;. 从 <a title="Adobe" href="http://www.Adobe.com" target="_blank">Adobe</a> 官方得到.</p>  <p>SWF 文件格式中音频可以分为两大类:</p>  <ul>   <li>Event sounds </li>    <li>Streaming sounds </li> </ul>  <p>SWF 中的各个元素在其二进制文件中都是以TAG的形式存在的.&#160; 对于音频来说涉及到的TAG大概有以下几种:</p>  <ul>   <li>SoundStreamHead2 Tag </li>    <li>SoundStreamHead Tag </li>    <li><strong>SoundStreamBlock Tag</strong> </li>    <li>StartSound Tag </li>    <li>StartSound2 Tag </li>    <li><strong>DefineSound Tag</strong> </li> </ul>  <p>其中只有 SoundStreamBlock Tag 和 DefineSound Tag 会包含实际的音频流, 其他的都是用来标识用的. </p>  <p>SoundStreamBlock TAG 存放 Streaming sounds 类型的音频. 在某个 SWF 文件时间轴内如果有 SoundStreamBlock 格式的TAG , 那么在第一个 SoundStreamBlock TAG 之前必须包括一个 SoundStreamHead2 TAG 或者 SoundStreamHead TAG, 只有这样才能标记其后的 SoundStreamBlock TAG 内的音频格式/记住回放格式/每个SoundStreamBlock TAG的平均取样数等信息.往往, 对于一个 SWF 文件有多个SoundStreamBlock&#160; TAG 组成一个组来共同存放一个音频文件. SoundStreamHead TAG 内的StreamSoundCompression 字段标识其后的 SoundStreamBlock&#160; TAG 包含的音频格式, 可以存放以下音频格式:</p>  <blockquote>   <p>1 = ADPCM      <br />SWF 4 和以后版本:       <br />2 = MP3</p> </blockquote>  <p>SoundStreamHead2 TAG中的StreamSoundCompression 字段标识的音频格式可以有:</p>  <blockquote>   <p>0 = uncompressed      <br />1 = ADPCM       <br />SWF 4 或以后版本:       <br />2 = MP3       <br />3 = uncompressed little-endian       <br />SWF 6 或以后版本:       <br />6 = Nellymoser</p> </blockquote>  <p>SoundStreamBlock&#160; TAG 的 StreamSoundData 字段存放音频的实际数据流, 其音频数据流的存放方式依赖于其前的SoundStreamHead TAG/SoundStreamHead2 TAG 的StreamSoundCompression 字段标识, 对于不同的音频格式其存放的规则不一样. </p>  <p><em>这里有一个小小的问题, 在实际测试的时候并没有发现用SoundStreamHead2 TAG 标识的SoundStreamBlock&#160; TAG , 大概是自己对 &lt;SWF 格式规范&gt;没有读好, 读懂.</em></p>  <p>Event sounds 格式的音频以 DefineSound 的TAG 形式存在, 并且一个 SWF 文件可以包含多个 DefineSound TAG.&#160; 每个 DefineSound TAG 存放一个单独的音频文件, 每个 DefineSound TAG 包含一个本 TAG 内存放音频的格式的属性(SoundFormat). DefineSound TAG 存放的音频格式有: </p>  <blockquote>   <p>0 = uncompressed      <br />1 = ADPCM       <br />SWF 4 或以后版本:       <br />2 = MP3       <br />3 = uncompressed little-endian       <br />SWF 6 或以后版本:       <br />6 = Nellymoser</p> </blockquote>  <p>似乎和SoundStreamHead2 TAG 标识的一样. 测试发现在一个拥有DefineSound TAG 的SWF文件之前往往有一个SoundStreamHead2 TAG , 其后紧跟第一个DefineSound TAG. <a title="SwfDotNet" href="http://sourceforge.net/projects/swfdotnet/" target="_blank">SwfDotNet</a> 在处理 DefineSound TAG 的时候直接定义了一个 <a href="http://zhq.ahau.edu.cn/blog/SwfDotNet.IO.Tags.DefineSoundTag.DecompileToFile.html">DecompileToFile</a> 方法, 可以把其中的音频直接导出到一个文件.</p>  <p>StartSound Tag 和 StartSound2 Tag 跟在 DefineSound TAG 之后用来开始播放音频, 对实际的提取没有多大的帮助.</p>  <p>根据以上个规制: </p>  <ul>   <li>SoundStreamHeadTag 之后跟多个SoundStreamBlock&#160; TAG 包含一个音频文件; </li>    <li>SoundStreamBlock&#160; TAG 的 SoundData 字段存放音频文件数据; </li>    <li>DefineSound TAG&#160; 直接导出音频文件. </li> </ul>  <p></p>  <p></p>  <p>写的提取代码为以下:</p>  <pre class="code"><span style="color: green">//导出 Sound
</span><span style="color: blue">if </span>(_SwfFile.Tags != <span style="color: blue">null</span>)
{
    <span style="color: blue">foreach </span>(<span style="color: #2b91af">BaseTag </span>tag <span style="color: blue">in </span>_SwfFile.Tags)
    {
        <span style="color: green">//流方式的Sound
        </span><span style="color: blue">if </span>(tag <span style="color: blue">is </span><span style="color: #2b91af">SoundStreamHeadTag</span>)
        {
            <span style="color: #2b91af">SwfProcessUtility</span>.OutSoundStreamBlock((tag <span style="color: blue">as </span><span style="color: #2b91af">SoundStreamHeadTag</span>).StreamSoundCompression, outPath, _SwfFile.Tags);
            <span style="color: green">//break;
        </span>}
        <span style="color: green">//直接的声音 可以直接导出
        </span><span style="color: blue">if </span>(tag <span style="color: blue">is </span><span style="color: #2b91af">DefineSoundTag</span>)
        {
            <span style="color: #2b91af">SwfProcessUtility</span>.OutDefineSoundTag((tag <span style="color: blue">as </span><span style="color: #2b91af">DefineSoundTag</span>), outPath);
        }
    }
}</pre>
<a href="http://11011.net/software/vspaste"></a>

<p>SwfProcessUtility 类中定义了多个静态方法来出来 TAG, 源代码为:</p>

<pre class="code"><span style="color: blue">using </span>System;
<span style="color: blue">using </span>System.Collections.Generic;
<span style="color: blue">using </span>System.Text;
<span style="color: blue">using </span>System.IO;

<span style="color: blue">using </span>SwfDotNet.IO;
<span style="color: blue">using </span>SwfDotNet.IO.Tags;

<span style="color: blue">namespace </span>TUP.SwfProcessing.Sound
{
    <span style="color: gray">/// &lt;summary&gt;
    /// </span><span style="color: green">Swf 处理类
    </span><span style="color: gray">/// &lt;/summary&gt;
    </span><span style="color: blue">internal static class </span><span style="color: #2b91af">SwfProcessUtility
    </span>{
        <span style="color: gray">/// &lt;summary&gt;
        /// </span><span style="color: green">读取指定的 SWF 文件
        </span><span style="color: gray">/// &lt;/summary&gt;
        /// &lt;param name=&quot;swfFilePath&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="color: blue">public static </span><span style="color: #2b91af">Swf </span>ReadSwfFile(<span style="color: blue">string </span>swfFilePath)
        {
            <span style="color: #2b91af">SwfReader </span>swfReader = <span style="color: blue">new </span><span style="color: #2b91af">SwfReader</span>(swfFilePath);
            <span style="color: blue">return </span>swfReader.ReadSwf();
        }
        <span style="color: gray">/// &lt;summary&gt;
        /// </span><span style="color: green">将 tags 内 SoundStreamBlock 合并到一个文件内导出
        </span><span style="color: gray">/// &lt;/summary&gt;
        /// &lt;param name=&quot;_StreamSoundCompression&quot;&gt;&lt;/param&gt;
        /// &lt;param name=&quot;outPath&quot;&gt;&lt;/param&gt;
        /// &lt;param name=&quot;tags&quot;&gt;&lt;/param&gt;
        </span><span style="color: blue">public static void </span>OutSoundStreamBlock(<span style="color: blue">uint </span>_StreamSoundCompression, <span style="color: blue">string </span>outPath, <span style="color: #2b91af">BaseTagCollection </span>tags)
        {
            <span style="color: blue">string </span>outFileFileName = <span style="color: #a31515">&quot;{0}.{1}&quot;</span>;
            <span style="color: green">//1 = ADPCM 2 = MP3
            //MP3 Sound
            </span><span style="color: blue">if </span>(_StreamSoundCompression == 2)
            {
                outFileFileName = <span style="color: blue">string</span>.Format(outFileFileName, <span style="color: #2b91af">Guid</span>.NewGuid(), <span style="color: #a31515">&quot;mp3&quot;</span>);
                <span style="color: blue">using </span>(<span style="color: #2b91af">FileStream </span>stream = <span style="color: blue">new </span><span style="color: #2b91af">FileStream</span>(<span style="color: #2b91af">Path</span>.Combine(outPath, outFileFileName), <span style="color: #2b91af">FileMode</span>.OpenOrCreate, <span style="color: #2b91af">FileAccess</span>.Write))
                {
                    <span style="color: blue">foreach </span>(<span style="color: #2b91af">BaseTag </span>tag <span style="color: blue">in </span>tags)
                    {
                        <span style="color: blue">if </span>(tag <span style="color: blue">is </span><span style="color: #2b91af">SoundStreamBlockTag</span>)
                        {
                            <span style="color: blue">byte</span>[] buffer = <span style="color: blue">null</span>;
                            buffer = (tag <span style="color: blue">as </span><span style="color: #2b91af">SoundStreamBlockTag</span>).SoundData;
                            <span style="color: green">//偏移 4 位
                            //SampleCount UI16 2 byte
                            //SeekSamples SI16 2 byte
                            </span>stream.Write(buffer, 4, buffer.Length - 4);
                            stream.Flush();
                        }
                    }
                }
            }
            <span style="color: green">//ADPCM Sound
            //此方法处理 的 Sound 不能使用
            </span><span style="color: blue">if </span>(_StreamSoundCompression == 1)
            {
                outFileFileName = <span style="color: blue">string</span>.Format(outFileFileName, <span style="color: #2b91af">Guid</span>.NewGuid(), <span style="color: #a31515">&quot;ADPCM&quot;</span>);
                <span style="color: blue">using </span>(<span style="color: #2b91af">FileStream </span>stream = <span style="color: blue">new </span><span style="color: #2b91af">FileStream</span>(<span style="color: #2b91af">Path</span>.Combine(outPath, outFileFileName), <span style="color: #2b91af">FileMode</span>.OpenOrCreate, <span style="color: #2b91af">FileAccess</span>.Write))
                {
                    <span style="color: blue">foreach </span>(<span style="color: #2b91af">BaseTag </span>tag <span style="color: blue">in </span>tags)
                    {
                        <span style="color: blue">if </span>(tag <span style="color: blue">is </span><span style="color: #2b91af">SoundStreamBlockTag</span>)
                        {
                            <span style="color: blue">byte</span>[] buffer = <span style="color: blue">null</span>;
                            buffer = (tag <span style="color: blue">as </span><span style="color: #2b91af">SoundStreamBlockTag</span>).SoundData;
                            stream.Write(buffer, 0, buffer.Length - 0);
                            stream.Flush();
                        }
                    }
                }
            }
        }
        <span style="color: gray">/// &lt;summary&gt;
        /// </span><span style="color: green">将 DefineSoundTag 中的音频导出
        </span><span style="color: gray">/// </span><span style="color: green">实际上只对MP3格式Sound有作用
        </span><span style="color: gray">/// &lt;/summary&gt;
        /// &lt;param name=&quot;_DefineSoundTag&quot;&gt;&lt;/param&gt;
        /// &lt;param name=&quot;outPath&quot;&gt;&lt;/param&gt;
        </span><span style="color: blue">public static void </span>OutDefineSoundTag(<span style="color: #2b91af">DefineSoundTag </span>_DefineSoundTag, <span style="color: blue">string </span>outPath)
        {
            <span style="color: blue">string </span>outFileFileName = <span style="color: #a31515">&quot;{0}.{1}&quot;</span>;
            outFileFileName = <span style="color: blue">string</span>.Format(outFileFileName, <span style="color: #2b91af">Guid</span>.NewGuid(), _DefineSoundTag.SoundFormat);
            _DefineSoundTag.DecompileToFile(<span style="color: #2b91af">Path</span>.Combine(outPath, outFileFileName));
        }
    }
}</pre>
<a href="http://11011.net/software/vspaste"></a>

<p>上面的代码也不多解释了, 注释很清楚. 其实关键的是 SwfProcessUtility 方法中的两个静态方法. 对于 DefineSound TAG 中的音频只是将其直接导出到文件并以其类型作为扩展名. 而 OutSoundStreamBlock 方法在处理 SoundStreamBlock TAG 的时候对于MP3 格式的音频做了特殊处理, 原因需要说明一下, 这个也就是之前提到的波折.</p>

<p>SoundStreamHead TAG 标识了之后的音频格式, 其后的 SoundStreamBlock TAG 的 SoundData&#160; 字段会因为不同的音频格式做不同的存放处理. 对于 MP3 格式的音频大致的存放规律为:</p>

<ol>
  <li>SoundStreamBlock TAG 的 SoundData 字段存放一个 MP3STREAMSOUNDDATA 结构的数据; </li>

  <li>MP3STREAMSOUNDDATA 拥有一个 UI16 格式的 SampleCount 字段; </li>

  <li>MP3STREAMSOUNDDATA 第二个字段 Mp3SoundData 存放具体的音频, 其数据结构为 MP3SOUNDDATA; </li>

  <li>MP3SOUNDDATA 的结构有两个字段, 第一个为 SI16 格式的 SeekSamples, 第二个为 Mp3Frames. </li>

  <li>Mp3Frames 为实际音频格式的 MP3 的帧, 可以有 0 个或多个, 也就是一个数组; </li>

  <li>UI16 和 SI16 格式都为 2 byte , 加起来 4 byte; </li>
</ol>

<p>所以就有了代码内的:</p>

<p>stream.Write(buffer, 4, buffer.Length - 4); </p>

<p>对每一个 SoundStreamBlock TAG 的 SoundData&#160; 字段都偏移 4 个字节, 把之后的字节依次的写到一个输出文件中, 就可以导出一个MP3文件.</p>

<p>上面大致也就是思路和结果, 可以完美的导出 MP3 文件. 不管是 Event 类型的还是 Stream 类型的音频. 对于文章开始的音乐推荐站来说, 其 SWF 格式为 V5 版, 其内的音频大多是 Stream 类型的MP3 格式.</p>

<p>这个地方还有一个没有搞清楚的地方, 因为 MP3 文件内并不是只存放 MP3 的帧, 还有头信息, 不知道SWF是咋的处理的, 可能需要仔细分析&lt;SWF 格式规范&gt;. 为啥每个 SoundData 偏移之后, 导出的文件就可以使用.</p>

<p>大致就这么多, 希望能给看到的朋友以帮助. 这里提供源代码下载. 开发环境 VS2008, .NET 2.0 .</p>

<p>下载: [<a title="http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=4312000" href="http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=4312000">http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=4312000</a>]</p>

<p>&#160;</p>

<blockquote>
  <p>为奥运健儿加油!</p>

  <p>TUPUNCO</p>

  <p>2008.08.19</p>

  <p>好运每一天.</p></blockquote>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/452.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=452</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[怎样跨 ASP.NET V1.1 与 ASP.NET V2.0 应用程序共享验证 Cookies]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=4" label="点滴" /> 
	  <updated>2008-08-19T10:44:36+08:00</updated>
	  <published>2008-08-19T10:44:36+08:00</published>
		  <summary type="html"><![CDATA[<p>原文地址: <a title="http://weblogs.asp.net/scottgu/archive/2005/12/10/432851.aspx" href="http://weblogs.asp.net/scottgu/archive/2005/12/10/432851.aspx">http://weblogs.asp.net/scottgu/archive/2005/12/10/432851.aspx</a></p>  <p>原文讲的不是很清楚, 文章下面一位 <a href="http://www.lmi.org">Sam Stange</a> 网友的回复有很大提示作用. 不过这位网友的回复好像有错误, 因为ASP.NET V1.1 配置文件&lt;machineKey /&gt;节点中根本没有decryption属性. 不过这个网友提供了一个生成machineKey的地方: <a href="http://aspnetresources.com/tools/keycreator.aspx">http://aspnetresources.com/tools/keycreator.aspx</a>, 选择 <a title="3DES" href="http://en.wikipedia.org/wiki/Triple_DES" target="_blank">3DES</a> 方式.</p>  <p>自己测试的结果为, ASP.NET 2.0 程序提供一个登录口, 1.1程序由这个登录口登录, 具体配置代码如下.</p>  <p>V2.0 Web.Config:</p>  <pre class="code">    <span style="color: blue">&lt;</span><span style="color: #a31515">authentication </span><span style="color: red">mode</span><span style="color: blue">=</span>&quot;<span style="color: blue">Forms</span>&quot;<span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">forms </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">.ASPNETAUTH</span>&quot; <span style="color: red">loginUrl</span><span style="color: blue">=</span>&quot;<span style="color: blue">UserLogin.aspx</span>&quot; <span style="color: red">timeout</span><span style="color: blue">=</span>&quot;<span style="color: blue">20160</span>&quot;<span style="color: blue">/&gt;
    &lt;/</span><span style="color: #a31515">authentication</span><span style="color: blue">&gt;
    &lt;!--</span><span style="color: green">ASP.NET 1.1 &amp; 2.0 共享登录使用</span><span style="color: blue">--&gt;
    &lt;</span><span style="color: #a31515">machineKey </span><span style="color: red">validationKey</span><span style="color: blue">=</span>&quot;<span style="color: blue">579FBC553DA6A4ED5752F39EC612BCCFC91F62513D37C7D460D4D883AC6A396FC3C5D0B7E589F22AAD5F79458793BDF74544C7FC34AD65A468108511C7BBB2BA</span>&quot;
    <span style="color: red">decryptionKey</span><span style="color: blue">=</span>&quot;<span style="color: blue">9143F872799C1EACA5EC634D31495C015AAC830D3951702D</span>&quot;
                <strong><span style="color: red">validation</span><span style="color: blue">=</span>&quot;<span style="color: blue">SHA1</span>&quot;  <span style="color: red">decryption</span><span style="color: blue">=</span>&quot;<span style="color: blue">3DES</span>&quot;</strong> <span style="color: blue">/&gt;
</span></pre>
<a href="http://11011.net/software/vspaste"></a>

<p></p>

<p></p>

<p></p>

<p></p>

<p></p>

<p>V1.1 Web.Config:</p>

<pre class="code">    <span style="color: blue">&lt;</span><span style="color: #a31515">authentication </span><span style="color: red">mode</span><span style="color: blue">=</span>&quot;<span style="color: blue">Forms</span>&quot;<span style="color: blue">&gt;
      &lt;!--</span><span style="color: green">../ASP20/UserLogin.aspx 登录地址需要重新配置</span><span style="color: blue">--&gt;
      &lt;</span><span style="color: #a31515">forms </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">.ASPNETAUTH</span>&quot;  <span style="color: red">loginUrl</span><span style="color: blue">=</span>&quot;<span style="color: blue">../zcdj/UserLogin.aspx</span>&quot; <span style="color: red">timeout</span><span style="color: blue">=</span>&quot;<span style="color: blue">20160</span>&quot;<span style="color: blue">/&gt;
    &lt;/</span><span style="color: #a31515">authentication</span><span style="color: blue">&gt;
    &lt;!--</span><span style="color: green">限制登录才能使用</span><span style="color: blue">--&gt;
    &lt;</span><span style="color: #a31515">authorization</span><span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">deny </span><span style="color: red">users</span><span style="color: blue">=</span>&quot;<span style="color: blue">?</span>&quot;<span style="color: blue">/&gt;
    &lt;/</span><span style="color: #a31515">authorization</span><span style="color: blue">&gt;
    &lt;!--</span><span style="color: green">ASP.NET 1.1 &amp; 2.0 共享登录使用</span><span style="color: blue">--&gt;
    &lt;</span><span style="color: #a31515">machineKey </span><span style="color: red">validationKey</span><span style="color: blue">=</span>&quot;<span style="color: blue">579FBC553DA6A4ED5752F39EC612BCCFC91F62513D37C7D460D4D883AC6A396FC3C5D0B7E589F22AAD5F79458793BDF74544C7FC34AD65A468108511C7BBB2BA</span>&quot;
     <span style="color: red">decryptionKey</span><span style="color: blue">=</span>&quot;<span style="color: blue">9143F872799C1EACA5EC634D31495C015AAC830D3951702D</span>&quot;
               <strong>  <span style="color: red">validation</span><span style="color: blue">=</span>&quot;<span style="color: blue">3DES</span>&quot;</strong><span style="color: blue">/&gt;
</span></pre>
<a href="http://11011.net/software/vspaste"></a>

<p></p>

<p>注意其中的 <strong><span style="color: red">validation</span><span style="color: blue">=</span>&quot;<span style="color: blue">SHA1</span>&quot; <span style="color: red">decryption</span><span style="color: blue">=</span>&quot;<span style="color: blue">3DES</span>&quot; </strong>部分.</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/451.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=451</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[[动画电影]机器人瓦力 WALL-E]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=5" label="随笔" /> 
	  <updated>2008-07-16T13:03:00+08:00</updated>
	  <published>2008-07-16T13:03:00+08:00</published>
		  <summary type="html"><![CDATA[<p><b><a target="_blank" href="http://ent.sina.com.cn/d/2008-06-04/17312048517.shtml"><img title="机器人瓦力 WALL-E 海报" style="border-right: 0px; border-top: 0px; margin: 5px; border-left: 0px; border-bottom: 0px" height="381" alt="机器人瓦力 WALL-E 海报" width="263" align="right" border="0" src="http://zhq.ahau.edu.cn/blog/attachments/month_0807/5200871613256.jpg" /></a>片名：</b>WALL-E&nbsp; <br />
<b>译名：</b>星际总动员/机器人瓦力/机器人总动员 <br />
<b>导演：</b>安德鲁&middot;斯坦顿 Andrew Stanton <br />
<b>类型：</b>动画/喜剧/家庭/爱情/科幻 <br />
<b>片长：</b>103分钟 <br />
<b>出品：</b>迪士尼、皮克斯 <br />
<b>发行：</b>华夏电影发行有限责任公司 <br />
<b>上映日期：</b>2008年6月27日(北美) <br />
<b>IMDB评分：</b>9.1/10 (13,705 votes)</p>
<p>&nbsp;</p>
<p><strong>故事概况</strong>:</p>
<p>并不久远的未来，具体地说是大约700年之后，肆无忌惮的人类已然将地球家园的环境搞得一团糟，往日的花园、绿地、街道、城镇&hellip;&hellip;全然被堆积成山的垃圾所侵占。还好，人类的科技已经完全可以让自己搬出地球，借宿他处。而&ldquo;留守&rdquo;的就是那些只能听程序指令不断地清扫垃圾的机器人在地球上日以继夜地工作。多年过去了，如山的垃圾依旧如山，而清扫垃圾的机器人中也只剩下一个，锈迹斑斑的小机器人仍不辞辛苦地每天在垃圾堆里忙碌着。乐观的它也渐渐学会了像人一样的忙里偷闲、自娱自乐：人类曾经使用的球拍、女人的内衣、老旧的灭火器都成为它的玩具，甚至好多年前的老歌舞片《你好，多莉！》也成为它休闲时光的&ldquo;伴侣&rdquo;&hellip;&hellip;</p>
<p>突然有一天，伴随着巨大的响声一艘飞船从天而降，一个光鲜漂亮的女机器人Eve从飞船上下来执行搜索任务。它的出现，一下子就俘获了&ldquo;垃圾清运工&rdquo;的视线，孤独、渴望情感的情愫，瞬间在机器人体内的线路中萌生，&ldquo;一见钟情&rdquo;并非人类的专利。机器人之恋就在眼前&hellip;&hellip;</p>
<p>&nbsp;</p>
<p>来源: <a title="SINA 新浪门户" target="_blank" href="http://www.sina.com.cn">SINA</a>&nbsp;<a title="http://ent.sina.com.cn/m/f/walle/index.html" href="http://ent.sina.com.cn/m/f/walle/index.html">http://ent.sina.com.cn/m/f/walle/index.html</a></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/450.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=450</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[[点滴]ASP.NET MVC Tip]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=2" label="网摘" /> 
	  <updated>2008-07-14T11:37:59+08:00</updated>
	  <published>2008-07-14T11:37:59+08:00</published>
		  <summary type="html"><![CDATA[<p></p>  <p><a href="http://weblogs.asp.net/stephenwalther/archive/tags/ASP.NET+MVC/default.aspx" target="_blank"><img title="Stephen Walther on ASP.NET MVC" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="171" alt="Stephen Walther on ASP.NET MVC" src="http://zhq.ahau.edu.cn/blog/attachments/month_0807/v2008714113758.jpg" width="503" border="0" /></a> </p>  <p><a title="MS ASP.NET MVC" href="http://www.asp.net/mvc/" target="_blank">MS ASP.NET MVC</a> Pre 3 已经放出有一段时间, 一直关心一个系列文章 &lt;<a href="http://weblogs.asp.net/stephenwalther/archive/tags/ASP.NET+MVC/default.aspx" target="_blank">ASP.NET MVC Tip</a>&gt; 发现国内有翻译版了, 但翻译速度不是很快.</p>  <p>原文地址: <a title="http://weblogs.asp.net/stephenwalther/archive/tags/ASP.NET+MVC/default.aspx" href="http://weblogs.asp.net/stephenwalther/archive/tags/ASP.NET+MVC/default.aspx">http://weblogs.asp.net/stephenwalther/archive/tags/ASP.NET+MVC/default.aspx</a></p>  <p>中文翻译地址: <a title="http://www.cnblogs.com/AndersLiu/category/143330.html" href="http://www.cnblogs.com/AndersLiu/category/143330.html">http://www.cnblogs.com/AndersLiu/category/143330.html</a></p>  <p>&#160;</p>  <p>作者博客: <a title="Stephen Walther on ASP.NET MVC" href="http://weblogs.asp.net/stephenwalther/" target="_blank">Stephen Walther on ASP.NET MVC</a></p>  <p>地址: <a href="http://weblogs.asp.net/stephenwalther">http://weblogs.asp.net/stephenwalther</a></p>  <p>博客描述: Learn about Microsoft ASP.NET MVC. Articles on Unit Testing, TDD, Mock .Frameworks, DI Frameworks, Software Design Principles and Patterns, and Agile Development.</p>  <p>博客关键字: ASP.NET MVC, TDD, Agile Development, AJAX, Unit Tests, Mock Frameworks</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/447.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=447</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[[转摘翻译]ASP.NET 技巧合集]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=2" label="网摘" /> 
	  <updated>2008-07-09T11:17:32+08:00</updated>
	  <published>2008-07-09T11:17:32+08:00</published>
		  <summary type="html"><![CDATA[<p>ASP.NET 开发方面的一些有必要知道的很有用技巧的合集.&#160; 试着翻译一下, 有些东西没有办法表达就没有翻译. 下面的内容有些可能是多余的, 反正自己感觉是鸡肋.</p>  <p>原文标题: ASP.NET Hacks</p>  <p>原文地址: <a href="http://wiki.lessthandot.com/index.php/ASP.NET_Hacks">http://wiki.lessthandot.com/index.php/ASP.NET_Hacks</a></p>  <p>This is a collection of ASP.NET hacks (i.e. tips and tricks) and includes some useful to know things about ASP.NET development. </p>  <p>We will split them up into the following categories: </p>  <h4>Contents 内容</h4>  <ul>   <li><a href="http://zhq.ahau.edu.cn/blog/#Applications">1 Applications</a> ASP.NET 应用程序 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Caching">2 Caching</a> 缓存 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Controls">3 Controls</a> 控件 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Database">4 Database</a> 数据库 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Dates">5 Dates</a> 日期时间 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Debugging">6 Debugging</a> 调试 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Email">7 Email</a> </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Encryption">8 Encryption</a> 加密 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Files">9 Files</a> 文件 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Images">10 Images</a> 图像 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Javascript">11 Javascript</a> </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Objects_and_Classes">12 Objects and Classes</a> 对象和类 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Pages">13 Pages</a> 页面 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Sessions">14 Sessions</a> 会话 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Strings">15 Strings</a> 字符串 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Validation">16 Validation</a> 验证 </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Visual_Studio">17 Visual Studio</a> </li>    <li><a href="http://zhq.ahau.edu.cn/blog/#Web">18 Web</a> </li> </ul>  <p><a name="Applications"></a></p>  <h4>Applications </h4>  <pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Environment_Details">ASP.NET: Environment Details</a> 应用程序详细的环境信息(IIS 服务器上)
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Encrypt_your_applications_settings">ASP.NET: Encrypt your applications settings</a> 加密 Web.Config 内的设置
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Launch_an_external_application">ASP.NET: Launch an external application</a> 运行外部程序(感觉 ASP.NET 上用不到, 如果执行也会执行服务器行为. 另外还得考虑当前ASP.NET用户权限方面)
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Display_Version_Information">ASP.NET: Display Version Information</a> 显示版本信息</pre>
<a name="Caching"></a>

<h4>Caching </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Clear_all_Cached_objects">ASP.NET: Clear all Cached objects</a> 清除所有缓存对象
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Data_Caching">ASP.NET: Data Caching</a> 数据缓存</pre>
<a name="Controls"></a>

<h4>Controls </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Access_Master_Page_controls_from_the_Content_Page">ASP.NET: Access Master Page controls from the Content Page</a> 内容页访问母版页空间
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Maintain_an_entered_password_in_a_TextBox">ASP.NET: Maintain an entered password in a TextBox</a> 保持 TextBox 文本框控件已输入的密码
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Apply_a_Please_Wait_message_to_a_Button">ASP.NET: Apply a Please Wait message to a Button</a> 给 Button 按钮控件应用一个等待提示
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Clear_all_TextBox_values">ASP.NET: Clear all TextBox values</a> 清空所有 TextBox 文本框控件的值
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Creating_an_accessible_label">ASP.NET: Creating an accessible label</a> 创建可关联的 Label 控件
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Add_dynamic_controls_with_events">ASP.NET: Add dynamic controls with events</a> 动态控件添加事件
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Get_a_list_of_all_selected_items_in_a_CheckBoxList">ASP.NET: Get a list of all selected items in a CheckBoxList</a> 得到所有CheckBoxList 复选框列表控件的选择项
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Find_which_control_caused_a_postback">ASP.NET: Find which control caused a postback</a> 看看哪一个控件发起的页面回调
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Limit_selections_for_the_Calendar">ASP.NET: Limit selections for the Calendar</a> 限制 Calendar 日历控件的选择范围
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Add_a_confirmation_popup_to_a_Button">ASP.NET: Add a confirmation popup to a Button</a> 给 Button 按钮控件追加确定提示
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Insert_a_ListItem_into_a_DropDownList">ASP.NET: Insert a ListItem into a DropDownList</a> 向 DropDownList 下拉列表控件插入 ListItem 项
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Add_paging_to_a_repeater">ASP.NET: Add paging to a repeater</a> 给 Repeater 重复控件分页
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Append_client_side_functions_with_Attributes.Add">ASP.NET: Append client side functions with Attributes.Add</a> 使用 Attributes.Add 向某控件追加客户端函数
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Add_a_total_row_to_a_GridView">ASP.NET: Add a total row to a GridView</a> 给 GridView 网格控件添加一个汇总行
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_How_to_export_a_GridView_to_Excel">ASP.NET: How to export a GridView to Excel</a> 怎样导出 GridView 网格控件数据到 Excel
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Render_a_control_to_a_string">ASP.NET: Render a control to a string</a> 将控件渲染到字符串</pre>
<a name="Database"></a>

<h4>Database </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Convert_a_DataSet_to_a_DataView">ASP.NET: Convert a DataSet to a DataView</a> 把 DataSet 转换成 DataView 
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Extract_data_from_a_SQLDataSource_to_a_DataTable">ASP.NET: Extract data from a SQLDataSource to a DataTable</a> 从 SQLDaraSource 中获取数据到一个 DataTable 中
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Insert_data_into_SQL_Server">ASP.NET: Insert data into SQL Server</a> 往 SQL Server 数据库中插入数据
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Loop_through_data_in_a_DataTable">ASP.NET: Loop through data in a DataTable</a> 使用 DataTable 来遍历数据
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Loop_through_data_using_a_DataReader">ASP.NET: Loop through data using a DataReader</a> 使用 DataReader 来遍历数据 
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Storing_connection_strings_in_the_web.config_file">ASP.NET: Storing connection strings in the web.config file</a> 在 Web.Config 文件中存储数据库连接字符串</pre>
<a name="Dates"></a>

<h4>Dates </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Calculate_a_person%27s_age_from_their_date_of_birth">ASP.NET: Calculate a person's age from their date of birth</a> 根据某人生日计算其年龄
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Calculate_the_difference_between_two_dates">ASP.NET: Calculate the difference between two dates</a> 计算两个日期之间的差值
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Simple_date_and_time_methods">ASP.NET: Simple date and time methods</a> 简单的时间和日期的处理方法</pre>
<a name="Debugging"></a>

<h4>Debugging </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Enabling_page_tracing">ASP.NET: Enabling page tracing</a> 打开页面跟踪
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Simple_debugging_tips">ASP.NET: Simple debugging tips</a> 简单的调试技巧</pre>
<a name="Email"></a>

<h4>Email </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Send_an_email">ASP.NET: Send an email</a> ASP.NET 发邮件</pre>
<a name="Encryption"></a>

<h4>Encryption </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Encrypt_a_string_using_MD5">ASP.NET: Encrypt a string using MD5</a> 使用 MD5 加密字符串</pre>
<a name="Files"></a>

<h4>Files </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Files_and_Path_information">ASP.NET: Files and Path information</a> 获取某个文件或路径信息
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Rename_a_directory">ASP.NET: Rename a directory</a> 重命名某个目录
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Reference_files_with_relative_paths">ASP.NET: Reference files with relative paths</a> 使用相对路径来引用文件
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Read_and_display_a_text_file">ASP.NET: Read and display a text file</a> 读取和显示文件文件</pre>
<a name="Images"></a>

<h4>Images </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_How_to_crop_an_Image">ASP.NET: How to crop an Image</a> 创建图像缩略图
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_How_to_save_a_remote_image">ASP.NET: How to save a remote image</a> 怎样保存远程的图像
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Drawing_images_and_bar_charts_with_System.Drawing">ASP.NET: Drawing images and bar charts with System.Drawing</a> 使用 System.Drawing 绘制图像或者图表</pre>
<a name="Javascript"></a>

<h4>Javascript </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Register_a_javascript_function">ASP.NET: Register a javascript function</a> 往页面注册一个 javascript 函数</pre>
<a name="Objects_and_Classes"></a>

<h4>Objects and Classes </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Accessing_the_Response_object_in_a_Class">ASP.NET: Accessing the Response object in a Class</a> 在某个类中访问 Response 对象
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Defining_Imports">ASP.NET: Defining Imports</a> 定义默认命名空间导入
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_An_introduction_to_classes_and_properties">ASP.NET: An introduction to classes and properties</a> 类和属性的一些说明
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Looping_using_an_Enumerator">ASP.NET: Looping using an Enumerator</a> 使用迭代器来循环
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Use_Response.Filter_to_intercept_your_HTML">ASP.NET: Use Response.Filter to intercept your HTML</a> 使用 Respose.Filter 来拦截 HTML
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Use_C_Sharp_and_VB.NET_in_the_same_project">ASP.NET: Use C Sharp and VB.NET in the same project</a> 在同一个项目中同时使用 C# 和 VB.NET
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Using_Generics_to_create_a_property_list">ASP.NET: Using Generics to create a property list</a> 使用泛型来传来属性列表</pre>
<a name="Pages"></a>

<h4>Pages </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Change_the_current_Master_Page">ASP.NET: Change the current Master Page</a> 切换当前母版页
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Nested_Master_Pages">ASP.NET: Nested Master Pages</a> 嵌套母版页</pre>
<a name="Sessions"></a>

<h4>Sessions </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Redirect_the_page_when_the_session_ends">ASP.NET: Redirect the page when the session ends</a> 回话结束跳转到指定页面</pre>
<a name="Strings"></a>

<h4>Strings </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Filter_words">ASP.NET: Filter words</a> 单词过滤
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Remove_the_last_character_from_a_string">ASP.NET: Remove the last character from a string</a> 删除字符串默认字符
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Reverse_a_string">ASP.NET: Reverse a string</a> 颠倒字符串
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_String_Concatenation">ASP.NET: String Concatenation</a> 字符串连接
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Strip_HTML_tags_from_a_string">ASP.NET: Strip HTML tags from a string</a> 剔除字符串中的 HTML 标签
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Truncate_a_string_to_a_set_number_of_whole_words">ASP.NET: Truncate a string to a set number of whole words</a> 截断字符串指定数目的整词</pre>
<a name="Validation"></a>

<h4>Validation </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Using_Page.IsValid">ASP.NET: Using Page.IsValid</a> 使用 Page.IsValid</pre>
<a name="Visual_Studio"></a>

<h4>Visual Studio </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Changing_the_default_browser">ASP.NET: Changing the default browser</a> 更改 VS 默认浏览器
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Keyboard_Shortcuts">ASP.NET: Keyboard Shortcuts</a> VS 键盘热键
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Using_a_task_list">ASP.NET: Using a task list</a> 使用 VS 任务列表</pre>
<a name="Web"></a>

<h4>Web </h4>

<pre>  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Access_the_web_via_a_proxy_server">ASP.NET: Access the web via a proxy server</a> 通过代理服务器访问 Web
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Convert_HTML_tables_to_a_DataSet">ASP.NET: Convert HTML tables to a DataSet</a> 把 HTML 表格转化成 DataSet
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Retrieve_data_from_a_web_page">ASP.NET: Retrieve data from a web page</a> 从一个 Web 页面取回数据
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Create_an_RSS_Feed">ASP.NET: Create an RSS Feed</a> 创建 RSS 聚合
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Custom_Error_Pages">ASP.NET: Custom Error Pages</a> 自定义页面错误
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Find_out_where_a_visitor_came_from">ASP.NET: Find out where a visitor came from</a> 找出访客的来源
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_Using_an_AppOffline.htm_file_for_updates">ASP.NET: Using an AppOffline.htm file for updates</a> 使用 AppOffline.htm 文件表示站点更新中
  * <a href="http://wiki.lessthandot.com/index.php/ASP.NET:_XHTML_Strict_Validation">ASP.NET: XHTML Strict Validation</a> XHTML 规范严格验证</pre>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/446.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=446</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[[转摘]Web 前端优化最佳实践]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=2" label="网摘" /> 
	  <updated>2008-07-01T09:27:37+08:00</updated>
	  <published>2008-07-01T09:27:37+08:00</published>
		  <summary type="html"><![CDATA[<p></p>  <p>英文名称: <a title="Best Practices for Speeding Up Your Web Site" href="http://developer.yahoo.com/performance/rules.html" target="_blank">Best Practices for Speeding Up Your Web Site</a></p>  <p>英文版地址: <a title="http://developer.yahoo.com/performance/rules.html" href="http://developer.yahoo.com/performance/rules.html">http://developer.yahoo.com/performance/rules.html</a></p>  <p>中文地址: <a title="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html" href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html">http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html</a></p>  <p>中文地址2: <a title="http://www.dudo.org/article.asp?id=216" href="http://www.dudo.org/article.asp?id=216">http://www.dudo.org/article.asp?id=216</a></p>  <p>The Exceptional Performance team has identified a number of best practices for making web pages fast. The list includes 34 best practices divided into 7 categories. (Yahoo!网站性能最佳体验的34条黄金守则)</p>  <h3><strong>内容:</strong></h3>  <ol>   <li><a href="http://www.dudo.org/article.asp?id=214#http_queries#http_queries">尽量减少HTTP请求</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=214#dns#dns">减少DNS查找</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=214#redirect#redirect">避免跳转</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=214#cache_ajax#cache_ajax">缓存Ajxa</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=214#post_load#post_load">推迟加载</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=214#pre_load#pre_load">提前加载</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=214#dom_num#dom_num">减少DOM元素数量</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=214#domains#domains">用域名划分页面内容</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=214#minify_ifr#minify_ifr">使frame数量最少</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=214#no404#no404">避免404错误</a> </li> </ol>  <h3><strong>Server:</strong></h3>  <ol>   <li><a href="http://www.dudo.org/article.asp?id=215#cdn#cdn">使用内容分发网络</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=215#exipires#exipires">为文件头指定Expires或Cache-Control</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=215#zip#zip">Gzip压缩文件内容</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=215#tag#tag">配置ETag</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=215#flush#flush">尽早刷新输出缓冲</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=215#get_ajax#get_ajax">使用GET来完成AJAX请求</a> </li> </ol>  <h3><strong>Coockie:</strong></h3>  <ol>   <li><a href="http://www.dudo.org/article.asp?id=218#coockie_size#coockie_size">减小Cookie体积</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=218#coockie_free_domain#coockie_free_domain">对于页面内容使用无coockie域名</a> </li> </ol>  <h3><strong>CSS：</strong></h3>  <ol>   <li><a href="http://www.dudo.org/article.asp?id=216#csstop#csstop">把样式表置于顶部</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#expression#expression">避免使用CSS表达式（Expression）</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#external#external">使用外部JavaScript和CSS</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#minify#minify">削减JavaScript和CSS</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#link#link">用&lt;link&gt;代替@import</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#nofilter#nofilter">避免使用滤镜</a> </li> </ol>  <h3><strong>JavaScript:</strong></h3>  <ol>   <li><a href="http://www.dudo.org/article.asp?id=216#bt_js#bt_js">把脚本置于页面底部</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#external#external">使用外部JavaScript和CSS</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#minify#minify">削减JavaScript和CSS</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#js_dupes#js_dupes">剔除重复脚本</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#dom_access#dom_access">减少DOM访问</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=216#event#event">开发智能事件处理程序</a> </li> </ol>  <h3><strong>图片：</strong></h3>  <ol>   <li><a href="http://www.dudo.org/article.asp?id=218#optimize_images#optimize_images">优化图像</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=218#css_spirites#css_spirites">优化CSS Spirite</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=218#scale_images#scale_images">不要在HTML中缩放图像</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=218#favicon_ico#favicon_ico">favicon.ico要小而且可缓存</a> </li> </ol>  <h3><strong>移动应用：</strong></h3>  <ol>   <li><a href="http://www.dudo.org/article.asp?id=218#under25k#under25k">保持单个内容小于25K</a> </li>    <li><a href="http://www.dudo.org/article.asp?id=218#multipart#multipart">打包组件成复合文本</a> </li> </ol>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/445.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=445</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[编程中使用的数学]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=1" label="原创" /> 
	  <updated>2008-06-26T08:38:16+08:00</updated>
	  <published>2008-06-26T08:38:16+08:00</published>
		  <summary type="html"><![CDATA[<p></p>  <p></p>  <p>不知道逻辑算不算数学, 权当不算, 只有加减乘除才算吧, 罗列一下看看到到能碰到那些东西.</p>  <h2><strong>网页斑马纹问题</strong></h2>  <p>记得自己最找碰到的数学问题就是网页新闻列表上实现斑马纹的问题. 大概的效果如下图:</p>  <p><img title="斑马纹" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 5px; border-right-width: 0px" height="225" alt="斑马纹" src="http://zhq.ahau.edu.cn/blog/attachments/month_0806/x200862683749.png" width="480" border="0" /> </p>  <p>这个问题的解决办法实际很简单, 就是在迭代“新闻标题”列表呈现成 HTML 输出的时候判断当前行 (row) 的行号 (i) . 如果行号为偶数, 则设置当前行所在HTML 表格的背景颜色 (bgcolor) 为深色, 否则不设置. 大概的程序表达 (类 C 语言表达) 为:</p>  <p>if ((i/2.0)==(i/2))    <br />&#160;&#160;&#160; //设置背景色     <br />else     <br />&#160;&#160;&#160; //不设置背景色</p>  <p>问题就这样解决了, 说实话, 此问题是小强自认为编程过程中所解决的第一个数学问题. 虽然只是简单的判断当前当前行号是否为偶数, 或者说是判断当前行是否为偶数行, 但已经是非常的兴奋.</p>  <p>&#160;</p>  <h2><strong>网页图片转起来</strong></h2>  <p>本博客内有一篇博文, 标题为&lt;<a title="一段脚本" href="http://XXX" target="_blank">一段脚本</a>&gt;, 是从<a title="博客园" href="http://www.cnblogs.com" target="_blank">博客园</a>内转过来的, 代码整理如下:</p> <a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a>  <p></p>  <p></p>  <p></p>  <p></p>  <pre class="code">R=0; 
x1=.1; 
y1=.05; 
x2=.25; 
y2=.24; 
x3=1.6; 
y3=.24; 
x4=300; 
y4=200; 
x5=300; 
y5=200; 
DI=document.images; 
DIL=DI.length;

<span style="color: blue">function </span>A(){
    <span style="color: blue">for</span>(i=0; i-DIL; i++){
        DIS=DI[i].style;
        DIS.position=<span style="color: #a31515">'absolute'</span>; 
        DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; 
        DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5;
    }
    R++;
}

setInterval(<span style="color: #a31515">'A()'</span>,5);
<span style="color: blue">void</span>(0);</pre>
<a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a>

<p>核心代码为:</p>

<p></p>

<p></p>

<p></p>

<p></p>

<pre class="code"><span style="color: blue">function </span>A(){
    <span style="color: blue">for</span>(i=0; i-DIL; i++){
        DIS=DI[i].style;
        DIS.position=<span style="color: #a31515">'absolute'</span>; 
        DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; 
        DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5;
    }
    R++;
}</pre>

<pre class="code">这段代码可以将当前页面中所有图像以某个点为中心开始前后顺序旋转, 呈现出很漂亮的效果.</pre>
<a href="http://11011.net/software/vspaste"></a>

<p>正如高中数学所讲到的 y=Math.sin(x) 可以使得 y 在一个固定的范围内震荡, 上面的函数(function A())可以设置当前页面元素 DI[i] 的 Left 和 Top 样式(style), 使得其 Left 值和 Top 值都震荡起来, 而 Top 样式为 Math.cos() 值可以使得两个震荡值产生一个偏差, 从而不会出现一个很规则的运动轨迹. x5 与 y5 为震荡零点与屏幕左上角的偏移. x4 与 y4 为震荡的横和纵半径. </p>

<p>计算机编程上遇到的好多漂亮的曲线实际上都是数学上的最简单的函数叠加和迭代出来的结果, 如果不能一开始就领悟这些, 会使人匪夷所思.</p>

<p>&#160;</p>

<p>未完 (前面的前几天就写好了, 下面的没有时间补上, 先发上来)…</p>

<p>&#160;</p>

<blockquote>
  <p>TUPUNCO</p>

  <p>2008-06-25</p>

  <p>Good Luck Everybody, Everyday...</p></blockquote>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/444.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=444</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[[转载]开发者版本：你属于哪个版本的程序员？]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=2" label="网摘" /> 
	  <updated>2008-06-26T08:36:58+08:00</updated>
	  <published>2008-06-26T08:36:58+08:00</published>
		  <summary type="html"><![CDATA[<p></p>  <p><strong>原文地址</strong>: <a href="http://news.csdn.net/n/20080625/116964.html">http://news.csdn.net/n/20080625/116964.html</a></p>  <p><img title="clip_image001" style="border-right: 0px; border-top: 0px; margin: 5px; border-left: 0px; border-bottom: 0px" height="106" alt="clip_image001" src="http://zhq.ahau.edu.cn/blog/attachments/month_0806/i200862683657.jpg" width="376" align="right" border="0" />国外开发者博客中有一篇有趣的文章，将程序员按水平像软件版本号那样划分为不同的版本。相对于在招聘时分为初级，中级，高级程序员，直接表明需要某种语言N版本的程序员或许更方便直接。根据作者的观点，可将WEB开发者大致分为以下几个版本：</p>  <p><strong>Alpha</strong>：阅读过一些专业书籍，大多数能用Dreamweaver或者FrontPage帮朋友制作一些Web页面。但在他们熟练掌握HTML代码以前，你大概不会雇佣他们成为职业的WEB制作人员。</p>  <p><strong>Beta</strong>：已经比较擅长整合站点页面了，在HTML技巧方面也有一定造诣，但还是用Tables来制作页面，不了解CSS，在面对动态页面或数据库连接时还是底气不足。</p>  <p><strong>Pre Version 1 (0.1)</strong>：比Beta版的开发者水平要高。熟悉HTML，开始了解CSS是如何运作的，懂一点JavaScript，但还是基于业余水准，逐步开始关心动态站点搭建和数据库连接的知识。这个版本的WEB开发人员还远不能成为雇主眼中的香饽饽。</p>  <p><strong>1.0:</strong> 能够基本把控整个站点开发，针对每个问题尽可能的找到最直接的解决办法。但对可测性，可扩展性以及在不同(层)框架下如何选择最合适的WEB设计工具尚无概念。这个版本的WEB开发者有良好的技术基础，需要有进一步的帮助和指导。    <br />    <br /><strong>2.0</strong><strong>：</strong>懂面向对象的编程语言，理解分层开发的必要性，关注代码分离，对问题寻找更完美的解决方法，偶然也会考虑设计模式的问题，但对此仍然概念不清。属于优秀的初级开发者，能完成较松散的代码开发(相对大型严谨的站点开发而言)，在面对较复杂问题寻找解决办法时需要周边人的帮助。</p>  <p><strong>3.0</strong><strong>：</strong>开始较为深入的理解面向对象编程和设计模式，了解他们的用途，当看到好的设计模式时能看透其本质，逐步关注分层的架构解决办法和可测试性。理解不同的开发语言并能说出他们的异同(例如各自的优势)。属于优秀的中级别开发者，雇主也确信他们最终能找到问题的解决办法，这个版本的人可以给1.0和2.0的开发者以指导。但他们对架构的理解仍然不够清晰，值得一提的是，只要给予一些指导，他们能很快理解并熟记做出的决定，以及选定方案的优势所在。    <br /><b>     <br /><strong>4.0</strong></b><strong>：</strong>理解模式，重视用户的反馈。着手研究方法论，架构设计和软件开发的最佳入口。头脑中已经形成了超越开发语言，技术架构的整体方案，可根据需求解构程序。能从理论的角度，不同模式如何融合成最佳形态，将多种X-驱动的模式应用到不同的方案中。是精通多语言的高手，理解不同系统和方法论的细微差别，属于高级程序员。这个级别的人能够轻易的辅导2.0和3.0的程序员，将他们推向更高的级别。</p>  <p><strong>5.0</strong><strong>：</strong>从系统的角度考虑问题。对各种系统结构有深入研究，能对整个代码架构中的问题进行改进。在团队粘合性以及代码安全性方面有杰出贡献。对1.0到4.0版本的开发人员出现的问题能及时察觉，让整个团队保持积极性且保持兴奋的状态创建软件解决办法。举例来说，他们总是对新的技术和信息保持饥渴状态，试图用最简便的方案解决开发任务。在整个IT团队中获得信任，属于高级程序员和架构师。    <br />那么，您属于哪个版本的程序员呢？</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/443.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=443</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[[转摘]做快乐的程序员 - 在淘宝网的一次讲座]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=2" label="网摘" /> 
	  <updated>2008-06-23T12:50:43+08:00</updated>
	  <published>2008-06-23T12:50:43+08:00</published>
		  <summary type="html"><![CDATA[<p>同学们：</p>  <p>我要讲的，是怎样做快乐的程序员。什么是快乐的程序员呢？就是把编程当作兴趣和爱好的人，享受着编程的快乐的一群人。</p>  <p>优秀的程序员都是从快乐的程序员开始的。因为，成为优秀的程序员是需要很长时间的磨练的，如果在编程中连快乐都没有，很难熬到优秀程序员的。事实上，做任何事情只要找到了快乐，成功是迟早的事情。</p>  <p>我们每一个程序员都希望在快乐的编程中成长为一名优秀的程序员。</p>  <p><strong>一.什么是优秀的程序员</strong></p>  <p>先讲一个编程大师的传说：</p>  <p>传说在很久很久以前，软件界出过一位大师。他能直接用二进制编写复杂高效且无错的程序；他写过的机器码比我们吃过的米还要多；他用眼睛看看闪烁的硬盘灯就知道程序当前的运行状态；他用耳朵听听机器的噪音就可以准确地判断出错误在哪个模块的哪一行代码上。</p>  <p>他写的程序极为精简，10行代码就可以顶别人写的100行代码，且效率更高。他不轻易给人写程序，即使千金也难换来他的一行代码。但他一旦开始写编码，那可是潇潇洒洒一挥而就，代码都是一行千金。</p>  <p>他从不困惑于软件的宏观体系和微观结构之中,因为他通晓软件的本原，预知软件的未来。他早已看透软件世界与现实世界的本质，面向对象只是他博大精深的武功中的一套长拳。他能使用所有的软件开发工具，从CASE工具到DEBUG。传说曾有人亲眼看见过他用一把小刀在硬盘表面刻写操作系统的一段内核。</p>  <p>自他死后，软件界再也没有出现过真正的大师。世间只残存一些有关他的传奇，一代一代地流传下去……</p>  <p>可能这个故事编得太玄了。但在我们的心里却真希望软件领域能有这样的神人，或许梦想自己有朝一日也能练出这样的道行。</p>  <p>大家都知道：软件是计算机的灵魂！</p>  <p>程序员是软件的创造者，是计算机灵魂的工程师。而优秀的程序员就是用灵魂书写代码的人，他们将自己的生命与软件机融为一体，从而让计算机世界充满生机和活力。</p>  <p>优秀的程序员往往将编程当作艺术，对待自己的每一个程序，就像对待自己的艺术品一样。优秀的程序员总喜欢对自己的代码精雕细琢，他希望自己的代码都是精品，绝不愿意敷衍了事地将垃圾代码提供给他人。</p>  <p>优秀的程序员大都有很好的人品修养。他们知道自己的长处，也更加知道自己的短处。在外人眼里他是神，但他自己明白他也是会犯错误的人。因此，优秀的程序员往往会在展现实力的同时，保持着谦虚的美德。偶尔狂妄，那也只是性情中人。</p>  <p>优秀的程序员对计算机的本质了解很深，喜欢从哲学上去理解软硬件的关系和数据代码的运转规律。有时候，他们看起来更像个思想家，因为他们想像力非常丰富，小到蚂蚁，大到星云，都能联系到代码上。据说，他们走在大街上也能敏锐地感觉到两旁大楼里各种计算机的脉冲跳动。</p>  <p>优秀的程序员对新技术有独特的洞察能力。他们的思想非常超前，总能提前做好准备，迎接新技术的到来，而不是被新技术推着走。即使遇到尚未涉足过的新技术领域，他们总能很快地把握新技术的本质，迅速适应该领域的工作，并成为这些技术的带头人。</p>  <p>的确，一名优秀的程序员是让人敬佩和羡慕的。要想成为一名优秀的程序员，必须首先要坚信自己一定能行。再经过努力地修炼，总有一点你也能成为一名优秀的程序员的。</p>  <p><strong>二.程序员的修炼历程</strong></p>  <p>如果大家都希望成为一名优秀的程序员，秘诀只有两个字：修炼！</p>  <p>程序员为什么要进行修炼呢?先给大家讲一个禅宗小故事，这个故事也是于丹讲过的：</p>  <p>有一座寺庙的香火很旺，多少年来人们总踩着那些石阶来到佛像面前进香。</p>  <p>终于有一天，石阶们不服气了。</p>  <p>石阶对佛像说：你和我们都生自同一块山石，为什么人们总踩在我们的身上，而却要对你顶礼膜拜？</p>  <p>佛像淡淡地说：因为你们只经过六刀就到了今天这个位置，而我却是经过千刀万剐，才最终成佛...</p>  <p>同样，在IT行业中要想成为一名优秀的程序员，必须需要经过千锤百炼，才能最终修炼成佛。事实上，程序员必须在IT大潮的实践中接受改造，不断取得进步，提高自己能力和修养。由一个幼稚的菜鸟，要变成一个成熟老道的大牛，往往需要经过一个很长的修炼的过程。</p>  <p>首先，要想成为一名优秀的程序员，必须要热爱编程工作，完全将编程当作自己的兴趣和爱好，甚至毕生追求的圣神目标。如果你没有这样的想法，只是把编程当作工作，最好别做程序员，趁早改行。</p>  <p>许多人说，编程是非常枯燥乏味的事情，程序员必须要耐得住寂寞，能忍受孤独。但真正的程序员却感受着编程的快乐，一点都不觉得孤独和寂寞。他们深信硬件的坚强，享受着软件的温柔，在计算机世界里，他们个个都是情种。</p>  <p>许多人说，程序员职业是一碗青春饭，都是20-30岁的年轻人干的。超过30岁之后呢，就干不动了。是这样吗？的确，早些年一些目光短浅的软件企业确实为了降低成本，雇佣年轻的低价程序员来完成工作。不是老程序员干不动了，而是挨踢了，所以程序员就叫挨踢一族。</p>  <p>但是，随着软件企业的不断成熟，老板们发现程序的开发和维护都是长期的事情。而有经验的老程序员编写的代码更加可靠和简洁，系统开发反而会减少很多麻烦事情，因此总体软件开发成本反而比雇佣大量年轻程序员要低。不但如此，老程序员而且还能帮企业带出一批新人，使得企业积累的技术经验能得到传承和发展。</p>  <p>其实，在发达国家的程序员，那可是越老越吃香。现在，国内越来越多的企业都愿意招聘有经验的老程序员，甚至某些软件企业还专招30岁以上的老程序员。越来越多的软件企业认识到，由老中青三代人构成的开发团队，才是真正永远有战斗力的团队。因此，程序员职业将不再是一碗青春饭，同样也是可以干一辈子的。</p>  <p>要成为优秀的程序员需要有很强的自学能力，必须不断地学习新技术和新知识。除了要学习前人的理论和经验之外，还必须亲自参加到具体的项目中去，在实践中运用所学的知识，解决和处理具体问题。</p>  <p>只有这样，他才能够逐渐地体验和认识编程的规律性，才能真正深刻地认知编程的本质，才能发现自己的弱点和原来不正确的思想、习惯、成见，并加以改正，从而提高自己编程质量，改善编程的方法等。</p>  <p>所以，程序员要改造和提高自己，必须参加具体项目，绝不能离开工作实践。更为关键的是，程序员必须要有自我学习和修炼的主动性，否则再多的项目实践也无法使自己进步。</p>  <p>经常会看到这样的情况，几个程序员一起参加一个软件项目。项目结束之后，有些程序员提高很快，有的进步很慢，有的却原地踏步。这是什么原因呢？</p>  <p>提高较快的程序员大都勤奋好学，喜欢探究编程的规律，并能逐渐总结出自己的方法。而进步较慢的程序员虽然也勤奋努力，但往往只着眼于具体的代码，不善于抽象和总结规律。而原地踏步的程序员呢，大都是混饭吃的，根本没有主动学习和提高自己的意识。</p>  <p>程序员不但要修炼自己的技术，还要善于修炼自己的人品。不是说编程中的大多数问题都是人品问题吗？当然，这里说的是程序员性格和人格的修养。</p>  <p><strong>三.程序员的学习能力</strong></p>  <p>没有哪个人是天生就会编程序的。大多数刚毕业的学生走上工作岗位时，常常抱怨学校教的知识都派不上用场，一切都得重头学起。在IT行业，这种现象更加严重，知识更新的频度和密度是其他行业没法比拟的。</p>  <p>学校的时光也许真的没有教给我们多少实用的知识，但却教会我们一个重要的法宝：自学能力！既然吃了程序员这碗饭，我们就必须牢记一句话：活到老，学到老。</p>  <p>学习有很多方式，读书是最好的学习方法，喜欢读书的程序员大都是爱学习的人。不过，现在的技术书真是太多太杂，我们不可能有太多时间来读书，更不可能读遍所有的书，需要挑选好书来读。</p>  <p>要挑一本好书也确实不容易，因为现在的技术书是鱼龙混杂。有优秀的精品，有滥竽充数的；有大家名作，也有误认子弟的。一般来说，我们可以购买两种图书，一种是可以反复阅读的精华，另一种是现用现查的资料类图书。网上购书是个不错的方式，可以参考销量排行榜和其他读者的评价。</p>  <p>网上学习也是非常不错的方式。只要善于搜索，总能在网上找到需要的文章和资料。最近，人们发明了一个新词叫“搜商”，它衡量人的网络使用能力。搜商高的人把网络当作蕴藏宝藏的海洋，他们更能熟练地从垃圾网页中淘出自己需要的宝贝。这也可以称作“淘宝能力”，网上学习也是需要很强的淘宝能力的。</p>  <p>此外，喜欢做实验也是非常好的学习方式。如果，书上有例子，不妨亲手试试。如果，学习中有什么新想法，也不妨马上试试。因为，通过实验不但可以加深对所学知识的领悟，还能增加对技术的感性认识，甚至带来某些意想不到的灵感。</p>  <p>喜欢学习，是一个程序员最大的优点。不过，这学习也是大有学问的。再给大家讲一个故事：</p>  <p>孔子曾跟师襄学琴，师襄就随手扔给他一首曲子，让他自已练习。孔子呢，把这首曲子都练了十几天，还是不厌其烦地继续练习。</p>  <p>师襄忍不住了，对孔子说：“你可以再换个曲子练习了。”</p>  <p>孔子回答说：“我虽然已熟悉了曲调，但还没有把握曲中的韵律。”</p>  <p>过了好些天，师襄又说：“你已把握到曲中的韵律了，可以换曲子练了。”</p>  <p>谁知，孔子又说：“我还没有感受到曲中的人物形象呢。”</p>  <p>又过了一段时间，师襄又说：“你已经感受到曲中的人物形象了，可以换曲了！”</p>  <p>孔子还是说：“我虽已感受到曲中的人物形象，但还没有达到他的心智境界。”</p>  <p>终于有一天，师襄看到孔子神情庄重，器宇非凡，志向高远，仿佛完全变了一个人。</p>  <p>还未等师襄开口，孔子便说：“我感悟到了，曲中人物黝黑高大，目光深邃，心怀天下苍生，真乃王者气象，此人必定是周文王！”</p>  <p>师襄听罢，大吃一惊，因为此曲就叫《文王操》，而他从未对孔子说过！</p>  <p>这是一种怎样的学习精神呢？</p>  <p>这就是一种把知识学透的精神！不但要学习人家的概念和技巧，还要学习方式和方法，更要学习人家的思想境界。没有那种刨根问底的精神，是很难将知识学透的。</p>  <p>学习就要刨根问底！任何事情喜欢刨根问底的人，一定能成为优秀的程序员！</p>  <p>问大家一个问题：Java为什么要取名为Java？</p>  <p>如果你能回答这个问题，你一定喜欢刨根问底，我也相信你一定比其他人更加理解Java！</p>  <p>如果你回答不上来，就听我给你讲讲。</p>  <p>Java一词来源于印度尼西亚南端的一个岛名，即爪哇岛，那里以盛产咖啡闻名。当SUN公司的开发人员在给这种语言取名的时候，正好喝着爪哇咖啡，于是Java由此得名。</p>  <p>我怎么知道这个故事呢？不瞒您说，我从来就没有编过一句Java的代码，我那是刻意查过资料的。如果我要学Java，我一定要先搞懂Java是怎么来的，搞懂为什么要发明Java语言等一系列问题，这其实就是刨根问底。</p>  <p>然后，我会先用记事本写一个Helloworld程序，看看怎么编译它，看看它怎么运行，需要哪些文件等等。至于语法语义等，编译器会告诉我该怎么写。然后边学边做，看书，查资料。实在搞不明白，我就像大家请教。相信一段时间下来，我也能编出地道的Java程序。</p>  <p>在学习过程中，我会以自学为主，尽量自己解决问题。如果拿一些基础性的问题向各位高手请教的话，你们一定会回答：自己看书！我要请教各位的问题一定是那种雪天裸体360度空翻跪地拜求，书上没讲，网上查不到的疑难问题。</p>  <p>事实上，这也是向高手和前辈们请教的学问，也是学习方式之一。作为编程高手，他们最喜欢帮助那些经过自身实践的探索和琢磨，快要入门但不得要领的人。这时，只需轻轻点化，新手就能体会到顿悟的快感，而高手也有渡人成佛的成就感。</p>  <p><strong>四.程序员的思想境界</strong></p>  <p>年轻的程序员最喜欢追求新技术和新潮流，这是无可厚非的。我们应该大力鼓励年轻的程序员学习新知识，爱学习的都是好同志。</p>  <p>不过，我们不但要学习技术的应用，更重要的是学习技术背后所蕴含的思想真谛甚至情感境界。一种新技术的诞生，一种新潮流的兴起，往往背后都有理论思想的指导。只有深刻地理解了这些技术背后的理论思想，才能更好地把握技术本身。</p>  <p>比如，面向对象编程是大家都在用的技术吧。有的程序员已经能用C++或Java或C#写一个类，定义属性，编写方法，然后创建一个对象，就可以调用它的方法，操纵它的属性了。这样，他也可以编写出面向对象的程序。不过，他所看到的只是程序对象。</p>  <p>深入学习和理解面向对象的思想之后，我们就会明白：所有的对象都是对现实世界的抽象，面向对象编程就是用人类最自然的思维模式来编写程序。这时，我们看到的分类就是现实世界的门纲属科，那些对象也就成了现实世界的活物，属性和方法也就成了他们的性格和活动。</p>  <p>这时候，我们再写面向对象的程序，就像写作文一样。各种命名都很自然地用到现实世界的各种名词，代码本身就无需多少注释，因为它们大都是自注释的。编写代码逻辑，就像编写现实世界的游戏规则。整个程序的思路非常清晰明了，代码也显得非常简洁优雅，运行效率也自然会高些。</p>  <p>因此，学会技术的思想之后会对使用技术的能力产生一个质飞跃，可以更深层次地使用这些技术，而不会被表现的形式所迷惑。事实上，只要掌握了面向对象思想的本质，即使不用面向对象的语言，也能编写有面向对象思想的程序。就好像武林高手用树枝也能玩剑法，虽然树枝不是剑，但处处体现剑法的精髓。</p>  <p>学会编程思想就足够了吗？如果还想更上一层楼，就得追求编程的境界。境界这个东西很虚，看不见摸不着，但可以从内心感觉得到。这种感觉有点像心灵相通的默契，若有若无。编程的境界追求的是人与程序间的心灵相通和情感交融，将自己的身心与程序世界融为一体，与现实世界融为一体。</p>  <p>编程境界这个东西的确有点玄，境界这个东西是因人而异的，每个人的感悟都不同。就像佛教里的禅的思想，什么是禅呢？禅是需要自己体验的东西，别人说的都不算，是不能用语言来描述的。所谓，不立文字，直指人心。我也是只知皮毛啊。</p>  <p>如果要我说什么是禅？一句话：通过感悟生活，得到生命的快乐。</p>  <p>编程之禅也就是：通过感悟编程的真谛，得到编程的快乐。</p>  <p>编程的境界只有高低之分，而且永远没有尽头。当你的编程境界到了一定高度，你的思想将会跳出编程的范畴。你将会发现，软件的根本实际上是哲学问题，很多方面都是和其他科学相通的。就像现代的量子理论发展到最后，发现量子论事实上是与哲学相关的一样。这个撤得就远了，但是喜欢哲学思考的程序员一定会成为一名优秀的程序员。</p>  <p>不过，再高的思想境界也得落到实处。光玩思想境界也不行啊，毕竟大家都在软件企业工作，都得道成仙了，谁来编码呢？</p>  <p>优秀的程序员也一定是务实的程序员。务实就是理论与实践相结合，追求的是完美与现实的平衡。毕竟理想和现实是有差距的，我们只有胸怀远大理想，面对残酷现实。</p>  <p>前段时间我还给人讲过一句话：</p>  <p>为了玩刀而上战场的人大都死于刀下，临死时怪自己的刀没有选好。</p>  <p>为了杀人而上战场的人大都成了将军，临死时放下屠刀立地成佛了。</p>  <p>所以，程序员要想成佛，不但要追求编程境界，还要学会在残酷的现实中拼杀，解决具体的问题才行。</p>  <p><strong>五.程序员的协作能力</strong></p>  <p>现代软件软件开发，都是多人协作的大规模软件开发。对于大中型应用系统，特别是大中型网站系统，基本上不会产生单打独斗的软件英雄了。在现代软件开发中，将诞生越来越多的英雄的团队，而我们这些程序员也只能是这个团队的一员。</p>  <p>因此，程序员是否具有协作能力，成了衡量程序员水平的另一个重要指标。成员的协作能力对于一个团队来说，往往比个人能力更加重要。一个优秀的团队，并不一定要由优秀的个体组成。反过来，优秀的个体如果缺乏协作能力，也无法成就一个优秀的团队。</p>  <p>沟通交流能力是最基本的协作能力。什么是沟通交流能力呢？很简单，一是能听得懂读得懂别人的话，二是能准确表达自己的思想和看法。不过，这看似简单的东西，却不是人人都会的。</p>  <p>有的人并不善于倾听别人，常常误解人家的意思。有的人呢，说话都说不清楚，脑袋里装的东西说不出来也写不出来，或者说了半天人家无法理解。</p>  <p>为什么会出现这样的问题呢？据我多年的观察和研究，主要有两个原因，一是没有耐心，二是没把话说清楚。什么意思呢？没有耐心听人说话，又懒得把话说清楚。</p>  <p>都说倾听别人是一种美德，可有的人就只顾自己说，喜欢打断人家说话，甚者人家还没把话说完就否定别人。所以，我说沟通应该从倾听做起。</p>  <p>我在平常的生活中很喜欢与同事和朋友们交流，他们也都喜欢和我讨论问题。一些同事和朋友找我解决一些问题，我总是耐心得倾听，尽力去理解，不断地点点头。常常听他们说了一半，突然说：啊，我知道问题在哪里了！这种情况我都遇到好多次了。</p>  <p>其实，有的时候只要做到了耐心的倾听，就能解决问题。</p>  <p>其次是说话不清。这个说话不清并不是指说话的声音不清晰，而是指话中的用词不清，说话的逻辑不清，经常使用大量的指代词。</p>  <p>比如我对你说：“点一下这个，就让它改变颜色。”，谁能听懂我在说啥？估计没人能听懂。如果我再说：“用鼠标右键点击一下网页上的字体颜色按钮，就可以让选中的文本变成相应的字体颜色。”，这下听懂了。</p>  <p>为什么前一句话他家听不懂呢？因为我省略了大量的在自己脑海中的景象，没告诉大家，潜意识中是以自我为中心的。“这个”、“它”这些代词只有自己明白指代的是啥，而听者并不清楚，自然听不懂我在说什么？</p>  <p>第二句话能听懂，是因为我尽量把每个脑海中的事物都说全把细节说全。这样，听者就能很快进入角色，大家迅速建立起沟通交流的上下文环境。一旦这个交流的上下文环境建立起来，再使用一些指代词也就不会影响沟通过程了。</p>  <p>其实，这些简单的道理不但适用于语言交流，还适用于客户调研，需求分析，书面协作，等等方面。今后有机会再给大家继续探讨。</p>  <p>协作能力还有一个重要的方面，那就是按规矩办事。按规矩办事就是所谓的规范化，规范化是一个优秀的团队的头等大事。作为一名有协作精神的程序员，就必须遵守团队的规范。</p>  <p>如果你有个人英雄主义，那么，对不起，在你那深刻独到的见解没有成为团队认可的规范之前，你必须保留个人意见。编程的命名规范，接口形式，注释要求，开发管理流程，必须要遵守。</p>  <p>接下来考验一个人的协作能力就是：是否有责任心。也就是对待自己那部分工作的态度。说得高尚一点儿，就是程序员的职业美德。责任心就是对自己所属的工作负责，认真对待自己那部分代码，甚至象呵护自己的孩子一样。其实，责任心也不是什么沉重的东西，有智慧的程序员总是喜欢将工作当作乐趣，大家不妨试试。</p>  <p>以前有句老话说，文人相轻，就是文人之间互相瞧不起。事实上，程序员相轻，也是很普遍的事情。不是经常都会听到程序员说，那人代码写得真烂，重构人家的代码还不如自己重写呢。其实，很多情况下，你留下的代码也常常被人骂。</p>  <p>在一个团队中，程序员相轻的现象是会引发团队内耗的。而具有协作精神的程序员对待其他程序员的代码，总是有一颗包容的心。他们更愿意通过改变自己去影响他人，从而让整个团队共同进步。</p>  <p>接下来我再给大家讲一个故事：</p>  <p>再伸手不见五指的崎岖山路上，有一群结伴赶夜路的行人。大家都背着自己的行囊，跌跌撞撞地向前走。由于既难分辨前进的方向，有看不清前后的行人，不是你踩着我的鞋，就是我捧着你的腰。就这样，一群人艰难地缓慢前行。</p>  <p>就在这时，有人从行囊里取出一个灯笼，点亮之后高高举起。这小小的灯笼无疑给黑暗中行进的人们带来了光明。大家借助这微弱的光亮看到了前进的方向，看清前后的行人。人群不再跌跌撞撞，从而有序地行进，大家也加快了前进的步伐。</p>  <p>当抵达目的地之后，人们这才发现那个点灯笼的人竟然是个瞎子。人们都很奇怪，白天和黑夜对这瞎子来说不都一样吗，他干嘛要在黑夜点灯笼呢？正在大家疑惑的时候，有人说：他是为了方便大家才点起灯笼的，我们应该感谢他才是！</p>  <p>于是，大家都来到瞎子跟前，感谢他为大家点灯照亮的善心。可瞎子却不好意思地说：我这样做其实也是为了我自己，因为人们总是撞我，我点起灯笼只是希望大家能看见我，就不会再撞到我了。</p>  <p>这个就是禅宗里面有名的“瞎子点灯”的故事，照亮自己也就是照亮了别人！</p>  <p><strong>六.做快乐的程序员</strong></p>  <p>一开始我就说过，优秀的程序员是从快乐的程序员开始的。</p>  <p>什么是快乐呢？</p>  <p>快乐，谁不知道啊，大家都感受过快乐。但快乐怎么定义呢？</p>  <p>佛说：快乐 = 现实 / 欲望</p>  <p>什么意思呢？就是快乐的大小，与现实条件的多少成正比，与欲望的大小成反比。快乐就是现实对欲望的满足感，就等于现实除以欲望。你拥有的现实条件越多，钱越多，房越大，车越好，快乐就多；你的欲望越大，解决了温饱就想娇妻，刚成为白领就想当经理，个个都想成为马云和比尔盖茨，现实满足不了，你就不快乐。</p>  <p>当然，每个人追求的目标不一样，就会有不同的快乐和痛苦。程序员也一样，想实现更多功能，想让程序跑得更快，现实世界的软硬件条件又满足不了，客户的需求又变来变去，开发确实是一件痛苦的事情。</p>  <p>程序员怎样使自己快乐呢？最简单的办法就是“知足常乐”。知足常乐就是把欲望控制在现实条件可以满足的基础之上。在编程中呢，就是把功能控制在可以实现的范围只能。在软件工程中呢，就是把用户需求控制在开发成本和期限之内。</p>  <p>当然，要做到知足常乐是很不容易的事情。人们难免会不被各种欲望引诱，程序员也难免不被新技术吸引，也总想给客户提供更加强大的软件功能。要知道，人的欲望总是无穷无尽的，而现实条件总是有限的。佛说，有欲望就有痛苦。</p>  <p>削除欲望会怎样呢？就是欲望为零。学过算术的人都知道，任何数除以零，等于无穷大。当欲望为零的时候，任何一点点现实的满足，就能带来无穷的快乐。这可能就是佛所说的极乐吧，似乎有些道理。</p>  <p>再给大家讲一个禅宗的故事：</p>  <p>古时候，有个老婆婆在家里供养一位修行的僧人，那时候一般家里人都以供养出家人为荣。在被供养三年之后，这位僧人也俨然有些道行。老婆婆想试探一下这位僧人的修为成就，于是特意找来村里最美的女子来服侍这位僧人。</p>  <p>当花枝招展的美女出现在僧人面前时，他一下就把持不住了，一幅惊慌失措六神无主的样子，所有的修为全都费了。老婆婆见状非常生气，抄起笤帚就将僧人猛打一顿。然后让他重新修行。</p>  <p>又过了三年，这位僧人已经修炼得体态安然，任何世俗都不能扰其心。老婆婆又想试探一下他的修为，又找来那位美女来服侍僧人。</p>  <p>当美女再次出现在僧人面前时，这位僧人纹丝不动，对美女视若未见。不管美女如何挑逗他，都不毫不理睬。老婆婆见状，又抄起笤帚将他痛打一顿，并大骂：没想到这三年竟养了一个行尸走肉。</p>  <p>于是，又过了三年，僧人终于参透禅机，看起来却和普通人一样了。老婆婆又找来美女试探他，他却一点都不害羞，大大方方地行赏起美女来，和美女相谈甚欢。这是后的老婆婆才满意地点点头说：你已经得道了！</p>  <p>这个故事很有意思吧？</p>  <p>禅是让人快乐的东西。消除欲望固然可以让人快乐，但只是自己快乐，修的是小乘佛法。但欲望就像杂草，今天除了，明天有会长，就算用巨石压住，仍然会从石头缝里长出来。俗话说“斩草除根”，只有除去这欲望之根，才能消除欲望。那么这欲望之根是啥呢？就是“自我”。</p>  <p>大乘佛法就是放下自我，没有自我，将自我融入整个宇宙，去体验生命真正的快乐。禅不但可以让自己快乐，还会给别人带来快乐。因为放下了自我，就不再有你我之分，对待他人就和对待自己一样。将自己的快乐带给他人，就是普度众生。</p>  <p>同样在编程之禅的修炼中，也大致会经历三个阶段。第一个阶段，总是逃不出编程世界的各种诱惑，程序员都被花花世界给搞迷糊了。这个阶段就是“看山是山，看水是水”。</p>  <p>第二个阶段呢，程序员已经修得很高的当行，对各种编程思想和概念都了然于心，并不再为之所动。这个阶段就是“看山不是山，看水不是水”。</p>  <p>而第三个阶段呢，就是彻底放下了自我，将自己与编程融为一体，和团队融为一体，和世界融为一体。这时再看编程世界，就是另一个生机勃勃的世界。这个阶段又是“看山还是山，看水还是水”，但山是真正的青山，水也是真正的绿水。</p>  <p>这就是返璞归真的境界。</p>  <p>大家都知道金庸笔下的老顽童周伯通吧。一生的历练，什么样的武功没学过？什么样的风浪没见过？都不知多大年纪了？却始终象一个孩子般天真烂漫，对什么事情都好奇，任何时候都是快快乐乐的，最后还长出了黑头发。返璞归真啊。</p>  <p>其实呢，我讲周伯通是想告诉大家：快乐的程序员还要有一颗童心。</p>  <p>童心会使我们对任何事物都充满好奇心，这会让我们在学习和探索新知识的过程中，充满无限的乐趣。童心会让我们把编程当作游戏，编程就像玩过家家，用心呵护自己的程序。童心让我们跳出狭隘的自私心，与同事快乐地相处。充满童心真是可以为我们带来许许多多的快乐，这是快乐程序员的有一个秘诀。</p>  <p>想起多年前写的一首小诗《童心》，念给大家听一下：</p>  <p>化一朵白云</p>  <p>将蓝天擦净</p>  <p>再洒一阵春雨</p>  <p>便绿了大地</p>  <p>阳光露脸的时候</p>  <p>我已不见</p>  <p>我就躲在</p>  <p>彩虹的后面</p>  <p>夜里不数星星了</p>  <p>我就变成月亮</p>  <p>挂在山崖的一角</p>  <p>偷偷地笑...</p>  <p>其实，童心就是爱心，就是快乐的心。很多程序员都已经忘记了童心，就变得越来越不快乐。好了，我给大家放一个小电影，看看原来的你是怎样的。以此结束今天的讲座，希望大家喜欢。</p>  <p><img alt="Flash Video 文件" src="http://www.hjenglish.com/images/icon/swf.gif" /> Flash Video 文件</p>  <p><img alt="点击播放" src="http://www.hjenglish.com/images/icon/click2play.jpg" border="0" />    <br /><a href="http://www.cnblogs.com/###">点击开始播放</a></p>  <p><a href="http://www.cnblogs.com/###">点击关闭</a> <a href="http://www.hjenglish.com/images/hjplayer/voa.aspx?voa=http://www.leadzen.cn/video/tx.flv">在线听写本文</a></p>  <p>原创：李战(leadzen).深圳 2008-6-23   <br />原文：<a href="http://www.cnblogs.com/leadzen/archive/2008/06/23/1227944.html">http://www.cnblogs.com/leadzen/archive/2008/06/23/1227944.html</a></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/442.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=442</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[[Div+CSS系列] Web 2.0 分页]]></title>
	  <author>
		 <name>tupunco</name>
		 <uri>http://zhq.ahau.edu.cn/blog/</uri>
		 <email>tupunco@163.com</email>
	  </author>
	  <category term="" scheme="http://zhq.ahau.edu.cn/blog/default.asp?cateID=1" label="原创" /> 
	  <updated>2008-06-23T10:32:41+08:00</updated>
	  <published>2008-06-23T10:32:41+08:00</published>
		  <summary type="html"><![CDATA[<p></p>  <h2><strong>本系列前言</strong></h2>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 尝试着写点系列博文, 本来计划发点牢骚的, 但仔细想想还是不要了, 减少埋怨才是好样子的. 这个系列文章可能有好几篇, 大概每篇的标题和内容已经确定, 希望不要像去年十月份的题目, 计划写他个五六篇的, 最后由于小强的懒给流产了, 反正接下来的一年不忙一定补上.</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 本系列文章基本的内容都是以前小强WEB开发经验总结, 可能没有详细的实现说明, 大概全部贴的是源代码, 但小强还是努力的把实现缘由和过程说明白, 不要小强以后返回来看的时候都搞不明白. 文章虽然是经验总结, 但可能全部都是从别的地方“抄袭”过来的, 因为小强的创造性很弱, 有抄的能力已经很不错了. 文章中努力的把“抄袭”的出处给说明清楚, 并把可能涉及到的内容从某些地方给拷贝过来, 并且加上自己的理解再说明一下.</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 本系列的文章中涉及到的代码和结果会在IE6+FF3.0上测试并努力的使其运行统一, 因为小强所使用的机子上就这两种内核的浏览器, 如果在其他内核的浏览器上效果不一样也没有办法. 本系列文章给能看懂并感觉内容有用处的网友看, 如果看到的网友已经属于骨灰级WEB开发人员, 就不要看了, 全部是很初级的东西, 小强玩不出新的花样, 有些很初级的东西用文字表述出来感觉都吃力.</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 小强不善表述, 看到的网友敬请原谅. 如果愿意跟小强交流可以直接联系本人, 联系方式可以从小强博客About栏目内找到. 另外小强短句和标点使用基本乱七八糟, 颠三倒四, 也请谅解.</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 如果哪位感觉本系列文章不错想转载请说明出处, 谢谢.</p>  <h2><strong>前言</strong></h2>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 本篇博文是本系列的第一篇, 可能也是小强感觉最简单的一篇, 大概涉及的内容就是样式表边框(border)/字体颜色(color)/填充(padding)方面的内容, 另外就是HTML内Div标签与A标签的用法. </p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 效果的起因是自己经常看到的 Web 2.0 站点漂亮和风格统一的分页样式, 可以看看 <a title="SINA 新浪门户" href="http://www.sina.com.cn" target="_blank">SINA</a> 播客分页的效果, 也可以看看 <a title="JavaEye 开源" href="http://www.javaeye.com" target="_blank">JavaEye</a> 论坛的分页. 虽然两个站点关心的内容不一样但分页效果基本雷同, 基本都是每个页码有外边框, 并且鼠标移动到相应页码改变页码样式的效果.</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 本篇博文内的代码一部分是从 <a title="站酷 设计素材" href="http://www.zcool.com.cn" target="_blank">ZCOOL</a> 内所提供的实例代码内“抄袭”过来的.</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 看本篇博文之前如果 CSS知识不是太牢固建议查看“小雨 CSS 2.0 中文手册 ”内”选择符“/”伪类”/“属性-&gt;边框, 属性-&gt;内补丁 ”章节内容.</p>  <h2><strong>最后效果</strong></h2>  <p>先把效果贴出来, 小强感觉还算漂亮.</p>  <p><img title="DIV+CSS 系列 分页 效果图" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 5px; border-right-width: 0px" height="162" alt="DIV+CSS 系列 分页 效果图" src="http://zhq.ahau.edu.cn/blog/attachments/month_0806/p2008623103240.png" width="660" border="0" /> </p>  <h2><strong>过程说明</strong></h2>  <p>实现的过程应该很简单,大概是注意下面的地方.</p>  <ol>   <li>页码链接的样式 </li>    <li>鼠标经过页码链接的样式 </li>    <li>当前页码的样式 </li> </ol>  <p>每个页码设计好页码链接边框样式(border), 再设计好鼠标经过时链接边框样式, 就可以出现途中的边框. 另外就是设置默认的填充样式(padding), 这样就可以使每个页码更加美观. </p>  <pre class="code"><span style="color: green">/*每个页码的样式*/
</span><span style="color: #a31515">.PageList a </span>{
    <span style="color: red">color</span>: <span style="color: blue">#CC0066</span>;
    <span style="color: red">border</span>: <span style="color: blue">1px #68ABD2 solid</span>;
    <span style="color: red">background-color</span>: <span style="color: blue">#F0F3FD</span>;
    <span style="color: red">padding</span>: <span style="color: blue">4px 8px 4px 8px</span>;
}
<span style="color: green">/*页码鼠标经过时的样式*/
</span><span style="color: #a31515">.PageList a:hover </span>{
    <span style="color: red">color</span>: <span style="color: blue">#FFFFFF</span>;
    <span style="color: red">border</span>: <span style="color: blue">1px #006699 solid</span>;
    <span style="color: red">background-color</span>: <span style="color: blue">#5FAFD6</span>;
}</pre>
<a href="http://11011.net/software/vspaste"></a>

<p><span style="color: #a31515">.PageList a</span>&#160; 的意思为: Class为PageList的Div标签下所有A标签. 设置了所有页码的链接样式.</p>

<p><span style="color: #a31515">.PageList a:hover </span>的意思为: Class为PageList的Div标签下所有A标签鼠标经过时(over). 设置了鼠标经过某个页码时的样式.</p>

<h2><strong>代码</strong></h2>

<pre class="code"><span style="color: blue">&lt;!</span><span style="color: #a31515">DOCTYPE </span><span style="color: red">html PUBspanC </span><span style="color: blue">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;</span><span style="color: #a31515">html </span><span style="color: red">xmlns</span><span style="color: blue">=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;</span><span style="color: #a31515">head</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">meta </span><span style="color: red">http-equiv</span><span style="color: blue">=&quot;Content-Type&quot; </span><span style="color: red">content</span><span style="color: blue">=&quot;text/html; charset=gb2312&quot; /&gt;
    &lt;</span><span style="color: #a31515">title</span><span style="color: blue">&gt;</span>Div+CSS 分页<span style="color: blue">&lt;/</span><span style="color: #a31515">title</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">style </span><span style="color: red">type</span><span style="color: blue">=&quot;text/css&quot;&gt;
        </span><span style="color: #a31515">body </span>{
            <span style="color: red">font-size</span>: <span style="color: blue">12px</span>;
        }
        <span style="color: #a31515">.PageList </span>{
            <span style="color: red">background-color</span>: <span style="color: blue">#EFEFEF</span>;
            <span style="color: red">padding</span>: <span style="color: blue">10px</span>;
            <span style="color: red">text-align</span>: <span style="color: blue">right</span>;
        }
        <span style="color: green">/*每个页码的样式*/
        </span><span style="color: #a31515">.PageList a </span>{
            <span style="color: red">color</span>: <span style="color: blue">#CC0066</span>;
            <span style="color: red">border</span>: <span style="color: blue">1px #68ABD2 solid</span>;
            <span style="color: red">background-color</span>: <span style="color: blue">#F0F3FD</span>;
            <span style="color: red">padding</span>: <span style="color: blue">4px 8px 4px 8px</span>;
        }
        <span style="color: green">/*页码鼠标经过时的样式*/
        </span><span style="color: #a31515">.PageList a:hover </span>{
            <span style="color: red">color</span>: <span style="color: blue">#FFFFFF</span>;
            <span style="color: red">border</span>: <span style="color: blue">1px #006699 solid</span>;
            <span style="color: red">background-color</span>: <span style="color: blue">#5FAFD6</span>;
        }
        <span style="color: green">/*当前页码的样式*/
        </span><span style="color: #a31515">.PageList .CurrentPage </span>{
            <span style="color: red">color</span>: <span style="color: blue">#CC0066</span>;
            <span style="color: red">border</span>: <span style="color: blue">1px #006699 solid</span>;
            <span style="color: red">background-color</span>: <span style="color: blue">#CDDCE7</span>;
            <span style="color: red">padding</span>: <span style="color: blue">4px 8px 4px 8px</span>;
        }
        <span style="color: #a31515">.PageList .PageEllipsis </span>{
        }
        <span style="color: #a31515">.PageList .PagePrevious </span>{
        }
        <span style="color: #a31515">.PageList .PageNext </span>{
        }
        <span style="color: #a31515">.PageList .PageDisabled </span>{
        }
    <span style="color: blue">&lt;/</span><span style="color: #a31515">style</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">head</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">body</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">div </span><span style="color: red">class</span><span style="color: blue">=&quot;PageList&quot;&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot; </span><span style="color: red">class</span><span style="color: blue">=&quot;PagePrevious&quot;&gt;</span>上一页<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>1<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">span </span><span style="color: red">class</span><span style="color: blue">=&quot;PageEllipsis&quot;&gt;</span>...<span style="color: blue">&lt;/</span><span style="color: #a31515">span</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>6<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>7<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>8<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>9<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">span </span><span style="color: red">class</span><span style="color: blue">=&quot;CurrentPage&quot;&gt;</span>10<span style="color: blue">&lt;/</span><span style="color: #a31515">span</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>11<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>12<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>13<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>14<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">span </span><span style="color: red">class</span><span style="color: blue">=&quot;PageEllipsis&quot;&gt;</span>...<span style="color: blue">&lt;/</span><span style="color: #a31515">span</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot;&gt;</span>100<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#1&quot; </span><span style="color: red">class</span><span style="color: blue">=&quot;PageNext&quot;&gt;</span>下一页<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
    &lt;/</span><span style="color: #a31515">div</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">body</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">html</span><span style="color: blue">&gt;
</span></pre>
<a href="http://11011.net/software/vspaste"></a>

<p></p>

<p></p>

<p></p>

<p></p>

<p></p>

<p><font size="5"></font></p>

<p></p>

<p></p>

<p></p>

<p></p>

<p></p>

<h2><strong>后记</strong></h2>

<p>简简单单总算结束了一篇, 可能也算是应付自己, 没有太多的说明, 直接贴的代码, 罗嗦倒是一堆.</p>

<p>在本文中把 Padding 翻译成填充, 不知道是否合适, “小雨 CSS 2.0 手册”内翻译为“内补丁”.</p>

<p>文中的代码直接复制到一个文本文件, 另存文件为HTML格式浏览器内预览就可以了, 太弱智的内容就不多写了. 这里不提供代码下载, 学校空间有限.</p>

<p>希望对学习WEB设计开发有帮助.</p>

<h2><strong>参考</strong></h2>

<ol>
  <li>小雨 CSS 2.0 中文手册 </li>

  <li><a href="http://www.zcool.com.cn">http://www.zcool.com.cn</a> </li>
</ol>

<p>&#160;</p>

<blockquote>
  <p>&#160;</p>

  <p>TUPUNCO</p>

  <p>2008.06.22</p>

  <p>Good Luck Everybody, Everyday...</p></blockquote>]]></summary>
	  <link rel="alternate" type="text/html" href="http://zhq.ahau.edu.cn/blog/article/441.htm" /> 
	  <id>http://zhq.ahau.edu.cn/blog/default.asp?id=441</id>
  </entry>	
		
</feed>
