<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>Thinking in Peak</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/" />
<modified>2006-02-16T02:59:59Z</modified>
<tagline>是技术？是信息？还是思想？！
是垃圾？是堆积？还是思想？！</tagline>
<id>tag:peak.name,2006:/thinking//2</id>
<generator url="http://www.movabletype.org/" version="3.11">Movable Type</generator>
<copyright>Copyright (c) 2006, Peak</copyright>
<entry>
<title>The table is full(MySQL)</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2006/02/the_table_is_fu.html" />
<modified>2006-02-16T02:59:59Z</modified>
<issued>2006-02-15T15:47:15Z</issued>
<id>tag:peak.name,2006:/thinking//2.872</id>
<created>2006-02-15T15:47:15Z</created>
<summary type="text/plain"> There are several ways a full-table error can occur: You are using a MySQL server older than 3.23 and an in-memory temporary table becomes larger than tmp_table_size bytes. To avoid this problem, you can use the --tmp_table_size=val option to...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>MySQL</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p>       <b>There are several ways a full-table error can occur:</b></p>
<ul type="disc">
<li>
<p>
            You are using a MySQL server older than 3.23 and an
            in-memory temporary table becomes larger than
            <code class="literal">tmp_table_size</code> bytes. To avoid this
            problem, you can use the
            <code class="literal">--tmp_table_size=<em class="replaceable"><code>val</code></em></code>
            option to make <span><strong class="command">mysqld</strong></span> increase the
            temporary table size or use the SQL option
            <code class="literal">SQL_BIG_TABLES</code> before you issue the
            problematic query. See <a href="http://dev.mysql.com/doc/refman/4.1/en/set-option.html" title="13.5.3. SET Syntax">Section 13.5.3, “<code class="literal">SET</code> Syntax”</a>.
          </p>
<p>
            You can also start <span><strong class="command">mysqld</strong></span> with the
            <code class="option">--big-tables</code> option. This is exactly the
            same as using <code class="literal">SQL_BIG_TABLES</code> for all
            queries.
          </p>
<p>
            As of MySQL 3.23, this problem should not occur. If an
            in-memory temporary table becomes larger than
            <code class="literal">tmp_table_size</code>, the server automatically
            converts it to a disk-based <code class="literal">MyISAM</code> table.
          </p>
</li>
<li><p>
            You are using <code class="literal">InnoDB</code> tables and run out
            of room in the <code class="literal">InnoDB</code> tablespace. In this
            case, the solution is to extend the
            <code class="literal">InnoDB</code> tablespace. See
            <a href="http://dev.mysql.com/doc/refman/4.1/en/adding-and-removing.html" title="14.2.8. Adding and Removing InnoDB Data and Log Files">Section 14.2.8, “Adding and Removing <code class="literal">InnoDB</code> Data and Log Files”</a>.
          </p></li>
<li><p>
            You are using <code class="literal">ISAM</code> or
            <code class="literal">MyISAM</code> tables on an operating system that
            supports files only up to 2GB in size and you have hit this
            limit for the data file or index file.
          </p></li>
<li>
<p>
            You are using a <code class="literal">MyISAM</code> table and the
            space required for the table exceeds what is allowed by the
            internal pointer size. If you don't specify the
            <code class="literal">MAX_ROWS</code> table option when you create a
            table, MySQL uses the
            <code class="literal">myisam_data_pointer_size</code> system variable.
            The default value is 4 bytes, which is enough to allow only
            4GB of data. See <a href="http://dev.mysql.com/doc/refman/4.1/en/server-system-variables.html" title="5.2.2. Server System Variables">Section 5.2.2, “Server System Variables”</a>.
          </p>
<p>
            You can check the maximum data/index sizes by using this
            statement:
          </p>
<pre class="programlisting">SHOW TABLE STATUS FROM database LIKE '<em class="replaceable"><code>tbl_name</code></em>';
</pre>
<p>
            You also can use <span><strong class="command">myisamchk -dv
            /path/to/table-index-file</strong></span>.
          </p>
<p>
            If the pointer size is too small, you can fix the problem by
            using <code class="literal">ALTER TABLE</code>:
          </p>
<pre class="programlisting">ALTER TABLE <em class="replaceable"><code>tbl_name</code></em> MAX_ROWS=1000000000 AVG_ROW_LENGTH=<em class="replaceable"><code>nnn</code></em>;
</pre>
<p>
            You have to specify <code class="literal">AVG_ROW_LENGTH</code> only
            for tables with <code class="literal">BLOB</code> or
            <code class="literal">TEXT</code> columns; in this case, MySQL can't
            optimize the space required based only on the number of
            rows.
          </p>
</li>
</ul>
<p>
原文：<a href="http://dev.mysql.com/doc/refman/4.1/en/full-table.html" target="_blank">A.2.11. The table is full in MySQL 3.23, 4.0, 4.1 Reference Manual</a></p>]]>

</content>
</entry>
<entry>
<title>Google™ Code Jam - 中国编程挑战赛</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/11/googlea_code_ja.html" />
<modified>2005-11-21T06:56:04Z</modified>
<issued>2005-11-21T06:36:20Z</issued>
<id>tag:peak.name,2005:/thinking//2.809</id>
<created>2005-11-21T06:36:20Z</created>
<summary type="text/plain"> 　　你有用技术改变世界的梦想吗？你有挑战难度的决心吗？你想和国内计算机精英一决高下吗？全球编程界知名的“Google编程挑战赛Code Jam”即将登陆中国。这项比赛每年都是全球计算机界的一次盛事。今年 Google 首次专门为中国举办这项比赛，旨在弘扬计算机科学的艺术，推进中国计算机编程教育，鼓励并嘉奖中国顶级编程人才。 　　竞赛的题目具有相当的挑战性，竞赛奖品也非常丰厚。 有志之士可借此机会一展才能，成为脱颖而出的中国最佳。 　　这里有极富挑战性的题目，高科技的奖品，以及令人赞叹的荣耀，你还在等什么？ 赛事运作细则 　　此次挑战赛以计时赛的形式举行，所有的参赛者都将在限定的时间内在线完成相同的竞赛题目。 　　参赛者在竞赛过程当中，可以选用以下4种编程语言的一种-Java，C++，C#和VB。 以下是竞赛相关过程说明： 下载竞赛平台 参赛者将从TopCoder?公司的竞赛平台(一个Java程序)开始踏入竞赛的第一步。下载平台程序，仔细阅读竞赛题目，然后将解决方案编写成代码形式，编译并测试方案，最后提交方案代码，得到相应的分数。参赛者可以在正式竞赛前下载竞赛平台，通过提供的样例来体验和熟悉平台的操作环境。 编码阶段 在指定的日期和时间，参赛者进入竞赛平台，以每10人一组被安排进入相应的虚拟房间。所有参赛者都将获得相同的3道竞赛题，3题的难度递增。此阶段竞赛中，竞赛者须在最短时间内完成题目，提供正确的方案代码，代码提交得越早，竞赛者得到的分数越高。在竞赛的整个过程中，排名榜会显示竞赛者的累计分数。 挑战阶段 在挑战阶段，参赛者不但可以看到其他参赛者提交的方案代码，还可以给出测试数据，使其他参赛者提交的程序得到错误的运算结果，从而推翻其他参赛者所提交的方案。这种方式，对于编程人员来说是最直接的竞赛形式。在这个阶段，参赛者的测试数据若能成功推翻他人提交的代码则可得分；反之，将被扣分。 系统测试 在系统测试阶段，系统会自动对每个提交方案代码进行测试，确定其正确程度和可行性，并以此给出参赛者相应的分数。整个评测过程耗时很短，参赛者当场可以知道自己的比赛结果。 参赛须知 报名注册时间：从北京时间2005年11月21日星期一上午9时开始，至北京时间2005年12月12日上午9时结束。报名注册没有人数限制，但是只有通过资格赛的前500名（12月12日举行）可以晋级此次正式比赛的第一轮。第一轮比赛将在12月19日举行。 首轮名次前250名将于12月22日晋级第二轮，第二轮的前50名则将参加在中国举行的冠军赛，争夺总数达25万元的高额奖品。 11月21日星期一 09:00　　注册开始 12月12日星期一 09:00　　注册结束 12月12日星期一 12:00　　资格赛开始 12月13日星期二 12:00　　资格赛结束 12月19日星期一 21:00　　第一轮-500名参赛者 12月22日星期四 21:00　　第二轮-250名参赛者 1月20日星期五 待定　　冠军赛-50名参赛者 * 上述时间皆为北京时间。冠军赛日期有可能发生变化，请注意届时通知。 奖品...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Internet</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p><a href="http://www.topcoder.com/pl/?module=Static&d1=gccj05&d2=ZH_overview" target="_blank"><center><img alt="Peak Jing:: Google™ Code Jam - 中国编程挑战赛" src="http://peak.name/thinking/archives/20051121_google_codejam.gif" width="479" height="110" border="0" /></center></a><br />
　　你有用技术改变世界的梦想吗？你有挑战难度的决心吗？你想和国内计算机精英一决高下吗？全球编程界知名的“Google编程挑战赛Code Jam”即将登陆中国。这项比赛每年都是全球计算机界的一次盛事。今年 Google 首次专门为中国举办这项比赛，旨在弘扬计算机科学的艺术，推进中国计算机编程教育，鼓励并嘉奖中国顶级编程人才。 </p>

<p>　　竞赛的题目具有相当的挑战性，竞赛奖品也非常丰厚。 有志之士可借此机会一展才能，成为脱颖而出的中国最佳。 </p>

<p>　　这里有极富挑战性的题目，高科技的奖品，以及令人赞叹的荣耀，你还在等什么？ </p>

<h4>赛事运作细则</h4> 

<p>　　此次挑战赛以计时赛的形式举行，所有的参赛者都将在限定的时间内在线完成相同的竞赛题目。 </p>

<p>　　参赛者在竞赛过程当中，可以选用以下4种编程语言的一种-Java，C++，C#和VB。 </p>

<p>以下是竞赛相关过程说明： </p>

<p><br />
<BLOCKQUOTE><B>下载竞赛平台</B><br />
参赛者将从TopCoder?公司的竞赛平台(一个Java程序)开始踏入竞赛的第一步。下载平台程序，仔细阅读竞赛题目，然后将解决方案编写成代码形式，编译并测试方案，最后提交方案代码，得到相应的分数。参赛者可以在正式竞赛前下载竞赛平台，通过提供的样例来体验和熟悉平台的操作环境。 </p>

<p><B>编码阶段</B><br />
在指定的日期和时间，参赛者进入竞赛平台，以每10人一组被安排进入相应的虚拟房间。所有参赛者都将获得相同的3道竞赛题，3题的难度递增。此阶段竞赛中，竞赛者须在最短时间内完成题目，提供正确的方案代码，代码提交得越早，竞赛者得到的分数越高。在竞赛的整个过程中，排名榜会显示竞赛者的累计分数。 </p>

<p><B>挑战阶段</B><br />
在挑战阶段，参赛者不但可以看到其他参赛者提交的方案代码，还可以给出测试数据，使其他参赛者提交的程序得到错误的运算结果，从而推翻其他参赛者所提交的方案。这种方式，对于编程人员来说是最直接的竞赛形式。在这个阶段，参赛者的测试数据若能成功推翻他人提交的代码则可得分；反之，将被扣分。 </p>

<p><B>系统测试</B><br />
在系统测试阶段，系统会自动对每个提交方案代码进行测试，确定其正确程度和可行性，并以此给出参赛者相应的分数。整个评测过程耗时很短，参赛者当场可以知道自己的比赛结果。 </BLOCKQUOTE></p>

<h4>参赛须知</h4>

<p>报名注册时间：从北京时间2005年11月21日星期一上午9时开始，至北京时间2005年12月12日上午9时结束。报名注册没有人数限制，但是只有通过资格赛的前500名（12月12日举行）可以晋级此次正式比赛的第一轮。第一轮比赛将在12月19日举行。 </p>

<p>首轮名次前250名将于12月22日晋级第二轮，第二轮的前50名则将参加在中国举行的冠军赛，争夺总数达25万元的高额奖品。 </p>

<p><br />
<BLOCKQUOTE>11月21日星期一 09:00　　注册开始 <br />
12月12日星期一 09:00　　注册结束 <br />
12月12日星期一 12:00　　资格赛开始 <br />
12月13日星期二 12:00　　资格赛结束 <br />
12月19日星期一 21:00　　第一轮-500名参赛者 <br />
12月22日星期四 21:00　　第二轮-250名参赛者 <br />
1月20日星期五  待定　　冠军赛-50名参赛者 </p>

<p>* 上述时间皆为北京时间。冠军赛日期有可能发生变化，请注意届时通知。 </BLOCKQUOTE></p>

<p><br />
<h4>奖品</h4></p>

<p>　　晋级第二轮的250名参赛者将获赠"Google? Code Jam - 中国编程挑战赛"T恤一件。晋级冠军赛的50名参赛者将获得如下的奖项: </p>

<p><BLOCKQUOTE>第1名(共价值40,000人民币)：一组高端个人编程工作站<br />
第2至第4名(共价值20,000人民币)：一台笔记本电脑，PDA手机，以及一款全新个人随身听<br />
第5至10名(共价值8,000人民币)：一台数字相机，PDA手机， 以及一款全新个人随身听<br />
第第11至20名(共价值4,000人民币)：PDA手机， 以及一款全新个人随身听<br />
第21至50名(共价值2,000人民币)：一款全新个人随身听 </BLOCKQUOTE></p>

<p>　　<a href="http://www.topcoder.com/pl/?module=Static&d1=gccj05&d2=ZH_overview" target="_blank"><B>点击这里了解更多。</B></a></p>]]>

</content>
</entry>
<entry>
<title>XSL基础教程（三）</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/08/xslccieaeie_2.html" />
<modified>2005-11-17T03:03:03Z</modified>
<issued>2005-08-03T15:36:50Z</issued>
<id>tag:peak.name,2005:/thinking//2.807</id>
<created>2005-08-03T15:36:50Z</created>
<summary type="text/plain"><![CDATA[ 　　转载自developerWorks 中国 　　XSL（eXtensible Style sheet Language），即可扩展样式表语言，是XML的亲密伙伴。要学习好XML，不能不掌握XSL。本文就向你全面讲述XSL的一切一切： XSL索引：将XML文档转换成HTML之前，如何用XML解析器来对XML文档进行索引。 XSL索引 　　XSL可以用来对一个XML文档进行索引。 将索引信息放在哪里 　　现在重新看看在以前许多章节中都曾看到过的 XML文档： &lt;?xml version="1.0"?&gt; &lt;CATALOG&gt; &lt;CD&gt; &lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt; &lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt; &lt;COUNTRY&gt;USA&lt;/COUNTRY&gt; &lt;COMPANY&gt;Columbia&lt;/COMPANY&gt; &lt;PRICE&gt;10.90&lt;/PRICE&gt; &lt;YEAR&gt;1985&lt;/YEAR&gt; &lt;/CD&gt; . . . 　　要想将这个XML文件作为一个普通的HTML文件输出，并且同时对它进行索引，只需要在XSL文件中增加一个order-by 属性，如下： 　　&lt;xsl:for-each select="CATALOG/CD" order-by="+ ARTIST"&gt; 　　order-by属性使用加号(+)或减号(-)来定义是使用升序还是降序，再用一个元素名称来定义排序的元素。 　　现在来看看经过轻微调整的XSL样式表（或在IE5中打开它）： &lt;?xml version='1.0'?&gt; &lt;xsl:stylesheet...]]></summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>XML</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p><br />
　　<a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index3.html" target="_blank">转载自developerWorks 中国</a> </p>

<p>　　XSL（eXtensible Style sheet Language），即可扩展样式表语言，是XML的亲密伙伴。要学习好XML，不能不掌握XSL。本文就向你全面讲述XSL的一切一切：</p>

<p><br />
<h4>XSL索引：将XML文档转换成HTML之前，如何用XML解析器来对XML文档进行索引。</h4></p>

<p><strong>XSL索引 </strong><br />
　　XSL可以用来对一个XML文档进行索引。 </p>

<p><strong>将索引信息放在哪里 </strong><br />
　　现在重新看看在以前许多章节中都曾看到过的 XML文档： <br />
<div class="quote">&lt;?xml version="1.0"?&gt;<br />
&lt;CATALOG&gt;<br />
&lt;CD&gt;<br />
&lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />
&lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />
&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />
&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />
&lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />
&lt;YEAR&gt;1985&lt;/YEAR&gt;<br />
&lt;/CD&gt;<br />
.<br />
.<br />
.</div><br />
　　要想将这个XML文件作为一个普通的HTML文件输出，并且同时对它进行索引，只需要在XSL文件中增加一个order-by 属性，如下： <br />
　　&lt;xsl:for-each select="CATALOG/CD" order-by="+ ARTIST"&gt; <br />
　　order-by属性使用加号(+)或减号(-)来定义是使用升序还是降序，再用一个元素名称来定义排序的元素。</p>

<p>　　现在来看看经过轻微调整的XSL样式表（或在IE5中打开它）：<br />
<div class="quote">&lt;?xml version='1.0'?&gt;<br />
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />
&lt;xsl:template match="/"&gt;<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;table border="2" bgcolor="yellow"&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;Title&lt;/th&gt;<br />
&lt;th&gt;Artist&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;xsl:for-each select="CATALOG/CD"<br />
order-by="+ ARTIST"&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/xsl:for-each&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;</div></p>

<p><strong>在浏览器中转换 </strong><br />
　　以下是在浏览器中将XML文件转换成HTML所需要的简单代码： <br />
<div class="quote">&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;script language="javascript"&gt;<br />
// Load XML<br />
var xml = new ActiveXObject("Microsoft.XMLDOM")<br />
xml.async = false<br />
xml.load("cd_catalog.xml")<br />
// Load the XSL<br />
var xsl = new ActiveXObject("Microsoft.XMLDOM")<br />
xsl.async = false<br />
xsl.load("cd_catalog_sort.xsl")<br />
// Transform<br />
document.write(xml.transformNode(xsl))<br />
&lt;/script&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</div><br />
　　如果使用的是Internet Explorer 5.0 或更高版本，请点击这里 <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/sort.htm" target="_blank">查看结果</a>。 </p>

<p><br />
<h4>XSL过滤器：将XML文档转换成HTML之前，如何用XML解析器过滤XML文档。</h4></p>

<p><strong>XSL过滤器查询 </strong><br />
　　XSL可以用来过滤一个 XML 文件。 </p>

<p><strong>在哪里放置过滤器信息 </strong><br />
　　现在重新看看你以前已经看过多次的XML文档： <br />
<div class="quote">&lt;?xml version="1.0"?&gt;<br />
&lt;CATALOG&gt;<br />
&lt;CD&gt;<br />
&lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />
&lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />
&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />
&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />
&lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />
&lt;YEAR&gt;1985&lt;/YEAR&gt;<br />
&lt;/CD&gt;<br />
.<br />
.<br />
.</div><br />
　　要过滤XML文件，只需要为XSL文件中的for-each元素的选择属性增加一个过滤器，如下： <br />
　　&lt;xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']"&gt; </p>

<p>　　合法的过滤器操作符是：<br />
<div class="quote">= 等于<br />
!= 不等于<br />
< 小于<br />
> 大于</div></p>

<p>　　现在看看经过轻微调整的XSL样式表：<br />
<div class="quote">&lt;?xml version='1.0'?&gt;<br />
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />
&lt;xsl:template match="/"&gt;<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;table border="2" bgcolor="yellow"&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;Title&lt;/th&gt;<br />
&lt;th&gt;Artist&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']"&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/xsl:for-each&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</div></p>]]>

</content>
</entry>
<entry>
<title>XSL基础教程（二）</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/08/xslccieaeie_1.html" />
<modified>2005-11-17T02:32:25Z</modified>
<issued>2005-08-02T15:05:30Z</issued>
<id>tag:peak.name,2005:/thinking//2.806</id>
<created>2005-08-02T15:05:30Z</created>
<summary type="text/plain"><![CDATA[　　转自developerWorks 中国 　　XSL（eXtensible Style sheet Language），即可扩展样式表语言，是XML的亲密伙伴。要学习好XML，不能不掌握XSL。本文就向你全面讲述XSL的一切一切： 客户端XSL：如何用XML解析器在客户机上将XML文档转换成HTML文档。 一个JavaScript的解决方法 　　在前文中，我们解释了如何用XSL将一个文档从XML转换成HTML。窍门就是向XML文件中增加一个XSL样式表，然后让浏览器来进行转换。即使这种方法能奏效，在XML文件中包含一个样式表引用也并非令人满意的方法，并且在不支持XSL的浏览器上这种方法还不能奏效。 一个更通用的方法应该是用一个JavaScript来进行从XML到HTML的转换。使用一个JavaScript，就更有以下可能性： 允许JavaScript进行浏览器细节测试； 根据浏览器和用户需求使用不同的样式表。 这就是XSL的美妙之处。XSL设计目的之一就是使数据从一个格式转换成另一个格式成为可能，从而支持不同的浏览器和不同的用户需求。 客户端XSL转换将成为未来浏览器工作任务的一个主要部分，我们还将看到专业化浏览器市场的成长，比如Braille、发声网络、网络打印机、手持PC、移动电话等。 XML文件和XSL文件 　　现在重新来看看前面章节中的XML文档： &lt;?xml version="1.0"?&gt; &lt;CATALOG&gt; &lt;CD&gt; &lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt; &lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt; &lt;COUNTRY&gt;USA&lt;/COUNTRY&gt; &lt;COMPANY&gt;Columbia&lt;/COMPANY&gt; &lt;PRICE&gt;10.90&lt;/PRICE&gt; &lt;YEAR&gt;1985&lt;/YEAR&gt; &lt;/CD&gt; . . . 还有附带的XSL样式表： &lt;?xml version='1.0'?&gt; &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt; &lt;xsl:template match="/"&gt; &lt;html&gt;...]]></summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>XML</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p>　　<a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index2.html" target="_blank">转自developerWorks 中国</a></p>

<p>　　XSL（eXtensible Style sheet Language），即可扩展样式表语言，是XML的亲密伙伴。要学习好XML，不能不掌握XSL。本文就向你全面讲述XSL的一切一切：</p>

<h4>客户端XSL：如何用XML解析器在客户机上将XML文档转换成HTML文档。</h4>
<strong>一个JavaScript的解决方法 </strong><br>
　　在前文中，我们解释了如何用XSL将一个文档从XML转换成HTML。窍门就是向XML文件中增加一个XSL样式表，然后让浏览器来进行转换。即使这种方法能奏效，在XML文件中包含一个样式表引用也并非令人满意的方法，并且在不支持XSL的浏览器上这种方法还不能奏效。 
一个更通用的方法应该是用一个JavaScript来进行从XML到HTML的转换。使用一个JavaScript，就更有以下可能性： 

<ul><li>允许JavaScript进行浏览器细节测试； </li><li>根据浏览器和用户需求使用不同的样式表。 </li><li>这就是XSL的美妙之处。XSL设计目的之一就是使数据从一个格式转换成另一个格式成为可能，从而支持不同的浏览器和不同的用户需求。 </li><li>客户端XSL转换将成为未来浏览器工作任务的一个主要部分，我们还将看到专业化浏览器市场的成长，比如Braille、发声网络、网络打印机、手持PC、移动电话等。 </li></ul>

<p><strong>XML文件和XSL文件 </strong><br><br />
　　现在重新来看看前面章节中的XML文档： <br />
<div class="quote">    &lt;?xml version="1.0"?&gt;<br />
    &lt;CATALOG&gt;<br />
      &lt;CD&gt;<br />
        &lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />
        &lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />
        &lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />
        &lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />
        &lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />
        &lt;YEAR&gt;1985&lt;/YEAR&gt;<br />
      &lt;/CD&gt;<br />
    .<br />
    .<br />
    .<br />
    还有附带的XSL样式表：<br />
    &lt;?xml version='1.0'?&gt;<br />
    &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />
    &lt;xsl:template match="/"&gt;<br />
      &lt;html&gt;<br />
      &lt;body&gt;<br />
        &lt;table border="2" bgcolor="yellow"&gt;<br />
          &lt;tr&gt;<br />
            &lt;th&gt;Title&lt;/th&gt;<br />
            &lt;th&gt;Artist&lt;/th&gt;<br />
          &lt;/tr&gt;<br />
          &lt;xsl:for-each select="CATALOG/CD"&gt;<br />
          &lt;tr&gt;<br />
            &lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt;<br />
          &lt;/tr&gt;<br />
          &lt;/xsl:for-each&gt;<br />
        &lt;/table&gt;<br />
      &lt;/body&gt;<br />
      &lt;/html&gt;<br />
    &lt;/xsl:template&gt;<br />
    &lt;/xsl:stylesheet&gt;</div><br />
　　要确保XML文件没有对XSL文件的引用，XSL文件也没有对XML文件的引用。注意：上面的句子说明一个XML文件可以用许多不同的XSL文件进行转换。 </p>

<p><strong>在浏览器中将XML转换到HTML </strong><br />
　　以下是在客户机上将XML文件转换成HTML所需要的源代码，很简单： <br />
<div class="quote">    &lt;html&gt;<br />
    &lt;body&gt;<br />
    &lt;script language="javascript"&gt;<br />
    // Load XML<br />
    var xml = new ActiveXObject("Microsoft.XMLDOM")<br />
    xml.async = false<br />
    xml.load("cd_catalog.xml")<br />
    // Load the XSL<br />
    var xsl = new ActiveXObject("Microsoft.XMLDOM")<br />
    xsl.async = false<br />
    xsl.load("cd_catalog.xsl")<br />
    // Transform<br />
    document.write(xml.transformNode(xsl))<br />
    &lt;/script&gt;<br />
    &lt;/body&gt;<br />
    &lt;/html&gt;</div><br />
　　如果使用的是Internet Explorer 5.0 或更高版本，请点击这里 <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/tryit.htm" target="_blank">查看结果</a>。 </p>

<p>　　代码的第一块创建了Microsoft XML 解析器(XMLDOM)的一个例示，并将XML文档加载到内存中。代码的第二块创建解析器的另一个例示，并将XSL文档加载到内存中。代码的最后一行用XSL文档转换XML文档，将结果写入HTML 文档中。 </p>

<h4>服务器端XSL：如何用XML解析器在服务器上将XML文档转换成HTML文档。</h4>
<strong>服务器端XSL </strong><br>
　　由于不是所有的浏览器都支持XML和XSL，因此就有了一个在服务器上将XML转换成HTML的方法。 

<p><strong>一个跨浏览器的解决方法 </strong><br><br />
　　在前面的章节中，我们解释了如何用XSL在浏览器中将XML文档转换成HTML，窍门就是让JavaScript使用一个XML解析器来进行转换。但是当浏览器不支持XML解析器时，这种方法是不奏效的。要使XML数据对所有浏览器都可用，我们就必须在服务器上转换XML文档，并将它作为纯HTML发送到浏览器。 </p>

<p>　　这是XSL的另一个美妙之处。XSL的设计目的之一是使得在服务器上将数据从一种格式转换成另一种格式成为可能，并将可读数据返回到所有未来的浏览器中。</p>

<p>　　在服务器上进行XSL转换正在成为未来Internet信息服务器工作任务的一个主要部分，同时我们将看到专用浏览器市场的发展，如：Braille、有声网络、网络打印机、手持PC、移动电话等。</p>

<p><strong>XML文件和XSL文件 </strong><br />
　　现在来重新看看前面章节中的XML文档： <br />
<div class="quote">&lt;?xml version="1.0"?&gt;<br />
    &lt;CATALOG&gt;<br />
      &lt;CD&gt;<br />
        &lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />
        &lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />
        &lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />
        &lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />
        &lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />
        &lt;YEAR&gt;1985&lt;/YEAR&gt;<br />
      &lt;/CD&gt;<br />
    .<br />
    .<br />
    .</div><br />
　　如果使用的是Internet Explorer 5.0或更高版本，可以点击这里查看 <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/cd_catalog.xml" target="_blank">XML文件</a>。 <br />
　　再看看伴随的XSL样式表： <br />
<div class="quote">    &lt;?xml version='1.0'?&gt;<br />
    &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />
    &lt;xsl:template match="/"&gt;<br />
      &lt;html&gt;<br />
      &lt;body&gt;<br />
        &lt;table border="2" bgcolor="yellow"&gt;<br />
          &lt;tr&gt;<br />
            &lt;th&gt;Title&lt;/th&gt;<br />
            &lt;th&gt;Artist&lt;/th&gt;<br />
          &lt;/tr&gt;<br />
          &lt;xsl:for-each select="CATALOG/CD"&gt;<br />
          &lt;tr&gt;<br />
            &lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt;<br />
          &lt;/tr&gt;<br />
          &lt;/xsl:for-each&gt;<br />
        &lt;/table&gt;<br />
      &lt;/body&gt;<br />
      &lt;/html&gt;<br />
    &lt;/xsl:template&gt;<br />
    &lt;/xsl:stylesheet&gt;</div><br />
　　如果使用的是Internet Explorer 5.0或更高版本，可以点击这里查看 <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/cd_catalog.xsl" target="_blank">XSL文件</a>。 <br />
　　以上XSL文档的语法在前面章节中已经解释过了，因此这里不再做解释。但是要确保XML文件没有对XSL文件的引用，XSL文件也没有对XML文件的引用。同时请注意：上面的句子表明一个服务器上的XML文件可以用许多不同的XSL文件进行转换。</p>

<p><strong>在服务器端将XML转换成HTML </strong><br />
　　以下是在服务器上转换XML文件所需要的简单源代码： <br />
<div class="quote">    &lt;%<br />
    'Load the XML<br />
    set xml = Server.CreateObject("Microsoft.XMLDOM")<br />
    xml.async = false<br />
    xml.load(Server.MapPath("cd_catalog.xml"))<br />
    'Load the XSL<br />
    set xsl = Server.CreateObject("Microsoft.XMLDOM")<br />
    xsl.async = false<br />
    xsl.load(Server.MapPath("cd_catalog.xsl"))<br />
    'Transform the file<br />
    Response.Write(xml.transformNode(xsl))<br />
    %&gt;</div><br />
　　代码的第一块创建Microsoft XML解析器(XMLDOM)的一个例示，并将XML文件装载到内存中。代码的第二块创建解析器的另一个例示，并将XSL文档装载到内存。代码的最后一行用XSL文档转换XML文档，并将结果返回浏览器。 </p>]]>

</content>
</entry>
<entry>
<title>XSL基础教程（一）</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/08/xslccieaeie.html" />
<modified>2005-11-17T02:02:58Z</modified>
<issued>2005-08-01T15:50:34Z</issued>
<id>tag:peak.name,2005:/thinking//2.805</id>
<created>2005-08-01T15:50:34Z</created>
<summary type="text/plain"><![CDATA[ 　　转载自developerWorks 中国 　　XSL（eXtensible Style sheet Language），即可扩展样式表语言，是XML的亲密伙伴。要学习好XML，不能不掌握XSL。本文就向你全面讲述XSL的一切一切： XSL介绍：介绍XSL是XML的样式表语言，XSL是什么以及它能做什么。 XSL介绍： 　　XML的样式表语言XSL比CCS要复杂得多。 CSS：HTML的样式表语言： 　　由于HTML使用预先确定的标记，因此这些标记的含义都很好理解：&lt;p&gt;元素定义一段，&lt;h1&gt;元素定义一个标题。浏览器知道如何显示这些元素。 　　使用CSS向HTML元素增加显示格式是一个简单的过程：很容易告诉浏览器用某种特殊字体或颜色来显示各个元素，浏览器也很容易理解。 XSL：XML的样式表： 　　由于XML不使用预先确定的标记（我们可以根据需要使用任意标记），因此标记的含义并不能被直接理解：&lt;table&gt;可以表示一个HTML表格，也可以表示一件家具。由于XML的特性，浏览器不知道如何显示一个XML文档。 　　为了显示XML文档，必须要有一个机制来描述如何显示文档。这些机制之一是CSS，但是XSL（可扩展的样式表语言）是XML的首选样式表语言，它要比HTML使用的CSS复杂得多。 XSL：不仅仅是一个样式表 　　XSL包含3部分： 　　一个转换XML文档的方法； 　　一个定义XML部分和模式的方法； 　　一个格式化XML文档的方法。 　　如果对此还不能理解，那么可以先将XSL理解成：一种将XML转换成HTML的语言，一种可以过滤和分类XML数据的语言，一种可以对一个XML文档的部分进行寻址的语言，一种可以基于数据值格式化XML数据的语言（如用红色显示负数），一种向不同设备输出XML数据的语言（如屏幕、纸或声音）。 XSL是一种WWW标准 　　XSL是WWW协会推荐的一种标准。这种语言的前两部分在1999年11月已经成为W3C推荐标准。2000年，包括XSL格式化部分的完整XSL推荐标准成为W3C的候选标准。 XSL语言：定义XSL语言的子语言：XSLT、XPath和XSL格式对象。 XSL语言 　　XSL实际上包含三种语言，其中最重要的是XSLT。 XSL是三种语言的结合体 　　上面提到，XSL实际上包含三种语言，具体是： 　　XSLT是一种转换XML的语言； 　　XPath是一种定义XML部分或模式的语言； 　　XSL格式化对象是一种定义XML显示方式的语言。 　　XSLT是一种用来将XML文档转换成其他类型文档或其它XML文档的语言。XPath是一种对XML文档的部分进行寻址的语言。设计XPath是要让XSLT使用的。格式化是将一个XSL转换的结果变成适于读者或听众使用的输出格式的过程。 　　1999年11月16日，XSLT和XPath被作为两个单独的W3C推荐标准发布。目前对于XSL格式化对象还没有单独的W3C文档，但是在XSL1.0推荐标准内有一个描述。 XSLT：XSL转换 　　XSLT是XSL标准中最重要的部分，它用于将一个XML文档转换成另一个XML文档或另一种类型的文档，也就是将一个XML文档转换成浏览器所能识别的一种格式。这其中之一就是HTML。通常，XSLT将每个XML元素都转换成一个HTML元素。 　　XSLT还可以向输出文件中增加全新的元素，或去掉一些元素。它可以重新安排这些元素并对元素进行分类，测试并确定显示哪些元素等等。 　　描述这种转换过程的一个常用说法是：XSL用XSLT将一个XML来源树转换成另一个XML结果树（或将一个XML源文档转换成另一个XML结果文档）。 XSL如何工作 　　在转换的过程中，XSLT用XPath来定义源文档中与一个或多个预先确定的模板相匹配的部分。当找到了一个匹配时，XSLT就将源文档中的匹配部分转换成结果文档；而源文档中不与任何一个模板匹配的部分最终在结果中保持不变。...]]></summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>XML</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p><br />
　　<a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/index1.html" target="_blank">转载自developerWorks 中国</a><br />
 </p>

<p>　　XSL（eXtensible Style sheet Language），即可扩展样式表语言，是XML的亲密伙伴。要学习好XML，不能不掌握XSL。本文就向你全面讲述XSL的一切一切：</p>

<p><br />
<strong>XSL介绍：介绍XSL是XML的样式表语言，XSL是什么以及它能做什么。</strong></p>

<p>XSL介绍： <br />
　　XML的样式表语言XSL比CCS要复杂得多。 <br />
CSS：HTML的样式表语言： <br />
　　由于HTML使用预先确定的标记，因此这些标记的含义都很好理解：&lt;p&gt;元素定义一段，&lt;h1&gt;元素定义一个标题。浏览器知道如何显示这些元素。 <br />
　　使用CSS向HTML元素增加显示格式是一个简单的过程：很容易告诉浏览器用某种特殊字体或颜色来显示各个元素，浏览器也很容易理解。 </p>

<p>XSL：XML的样式表： <br />
　　由于XML不使用预先确定的标记（我们可以根据需要使用任意标记），因此标记的含义并不能被直接理解：&lt;table&gt;可以表示一个HTML表格，也可以表示一件家具。由于XML的特性，浏览器不知道如何显示一个XML文档。 <br />
　　为了显示XML文档，必须要有一个机制来描述如何显示文档。这些机制之一是CSS，但是XSL（可扩展的样式表语言）是XML的首选样式表语言，它要比HTML使用的CSS复杂得多。 </p>

<p>XSL：不仅仅是一个样式表 <br />
　　XSL包含3部分： <br />
　　一个转换XML文档的方法； <br />
　　一个定义XML部分和模式的方法； <br />
　　一个格式化XML文档的方法。 <br />
　　如果对此还不能理解，那么可以先将XSL理解成：一种将XML转换成HTML的语言，一种可以过滤和分类XML数据的语言，一种可以对一个XML文档的部分进行寻址的语言，一种可以基于数据值格式化XML数据的语言（如用红色显示负数），一种向不同设备输出XML数据的语言（如屏幕、纸或声音）。 </p>

<p>XSL是一种WWW标准 <br />
　　XSL是WWW协会推荐的一种标准。这种语言的前两部分在1999年11月已经成为W3C推荐标准。2000年，包括XSL格式化部分的完整XSL推荐标准成为W3C的候选标准。 </p>

<p><br />
<strong>XSL语言：定义XSL语言的子语言：XSLT、XPath和XSL格式对象。</strong></p>

<p>XSL语言 <br />
　　XSL实际上包含三种语言，其中最重要的是XSLT。 <br />
XSL是三种语言的结合体 <br />
　　上面提到，XSL实际上包含三种语言，具体是： <br />
　　XSLT是一种转换XML的语言； <br />
　　XPath是一种定义XML部分或模式的语言； <br />
　　XSL格式化对象是一种定义XML显示方式的语言。 <br />
　　XSLT是一种用来将XML文档转换成其他类型文档或其它XML文档的语言。XPath是一种对XML文档的部分进行寻址的语言。设计XPath是要让XSLT使用的。格式化是将一个XSL转换的结果变成适于读者或听众使用的输出格式的过程。 <br />
　　1999年11月16日，XSLT和XPath被作为两个单独的W3C推荐标准发布。目前对于XSL格式化对象还没有单独的W3C文档，但是在XSL1.0推荐标准内有一个描述。 </p>

<p>XSLT：XSL转换 <br />
　　XSLT是XSL标准中最重要的部分，它用于将一个XML文档转换成另一个XML文档或另一种类型的文档，也就是将一个XML文档转换成浏览器所能识别的一种格式。这其中之一就是HTML。通常，XSLT将每个XML元素都转换成一个HTML元素。 <br />
　　XSLT还可以向输出文件中增加全新的元素，或去掉一些元素。它可以重新安排这些元素并对元素进行分类，测试并确定显示哪些元素等等。 <br />
　　描述这种转换过程的一个常用说法是：XSL用XSLT将一个XML来源树转换成另一个XML结果树（或将一个XML源文档转换成另一个XML结果文档）。 </p>

<p>XSL如何工作 <br />
　　在转换的过程中，XSLT用XPath来定义源文档中与一个或多个预先确定的模板相匹配的部分。当找到了一个匹配时，XSLT就将源文档中的匹配部分转换成结果文档；而源文档中不与任何一个模板匹配的部分最终在结果中保持不变。 </p>

<p>本文集中介绍XSLT和XPath <br />
　　本文的大部分章节都集中在XSLT和XPath上。我们将用XSLT来定义XML转换，用XPath来为转换定义匹配模式。即使XSL包含了3个不同名称的不同部分，我们仍将使用XSL的通用术语。 </p>

<p><br />
<strong>XSL浏览器：介绍XSL的浏览器支持以及为什么用Internet Explorer 5.0来示范XSL。</strong></p>

<p>XSL 浏览器 <br />
　　目前支持XSL的浏览器很少，我们将用Internet Explorer 5.0来演示XSL。 <br />
Internet Explorer的XML解析器 <br />
　　为了用XSL来处理一个XML文档，你需要一个带有XSL引擎的XML解析器。目前，Internet Explorer 5.0是符合这一条件的唯一浏览器。所以，本文举例中的代码只在Internet Explorer 5.0或更高版本中工作。 </p>

<p>Internet Explorer的XSL引擎 <br />
　　Internet Explorer 5.0中的XSL并不是100%的与最新发布的W3C XSL标准相吻合。在XSL标准完全固定下来之前，Internet Explorer 5就已经发布了，并且当时的XSL标准还是一个工作草稿。但是Microsoft已经承诺在下一个版本中解决这个问题。 <br />
　　本文中的例子与正式的W3C XSL推荐中的例子只有很小的不同，这些例子很适用于XSL的学习。 <br />
　　例子中唯一可见的区别就是XSL样式表声明： <br />
　　这是W3C XSL推荐中的标准方式：&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; <br />
　　这是Internet Explorer的方式（来自XSL工作草稿）：&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt; </p>

<p>Internet Explorer MSXML <br />
　　MSXML 2.0是IE 5.0所携带的XML解析器的名字，MSXML 2.5是Windows 2000所携带的解析器的名字，MSXML 3.0是XML解析器的最新版本。MSXML3.0可以从Microsoft下载，未来版本的Internet Explorer和Windows都将携带它。 <br />
　　按照Microsoft的说法，MSXML 3.0与正式的W3C XSL 标准100%兼容：“MSXML 3.0比MSXML 2.5有明显的进步：安全的服务器HTTP访问，XSLT和XPath的完整执行，到SAX的改变（用于XML的简单API），与W3C标准更加一致，以及许多臭虫的修复。” </p>

<p><br />
<strong>XSL转换：如何用XSL将XML文档转化成HTML文档，方法是向XML文档中插入一个XSL样式表引用。</strong></p>

<p>XSL–转换 <br />
　　本节将举例学习如何用XSL将XML转换成HTML。这个举例的细节将在下一节中解释。 <br />
从XML文档开始 <br />
　　首先从打算转换成HTML的XML文档开始： <br />
<div class="quote">　　&lt;?xml version="1.0"?&gt;<br />
　　&lt;CATALOG&gt;<br />
　　 &lt;CD&gt;<br />
　　　　&lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />
　　　　&lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />
　　　　&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />
　　　　&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />
　　　　&lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />
　　　　&lt;YEAR&gt;1985&lt;/YEAR&gt;<br />
　　 &lt;/CD&gt;</div><br />
　　如果使用的是Internet Explorer 5.0或更高版本，就可以查看这个XML文件的 <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/cd_catalog.xsl" target="_blank">显示结果</a>。 <br />
创建一个XSL样式表文档 <br />
　　现在用转换模板来创建一个XSL样式表： <br />
<div class="quote">　　&lt;?xml version='1.0'?&gt;<br />
　　&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />
　　&lt;xsl:template match="/"&gt;<br />
　　 &lt;html&gt;<br />
　　 &lt;body&gt;<br />
　　　　&lt;table border="2" bgcolor="yellow"&gt;<br />
　　　　 &lt;tr&gt;<br />
　　　　　　&lt;th&gt;Title&lt;/th&gt;<br />
　　　　　　&lt;th&gt;Artist&lt;/th&gt;<br />
　　　　 &lt;/tr&gt;<br />
　　　　 &lt;xsl:for-each select="CATALOG/CD"&gt;<br />
　　　　 &lt;tr&gt;<br />
　　　　　　&lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt;<br />
　　　　　　&lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt;<br />
　　　　 &lt;/tr&gt;<br />
　　　　 &lt;/xsl:for-each&gt;<br />
　　　　&lt;/table&gt;<br />
　　 &lt;/body&gt;<br />
　　 &lt;/html&gt;<br />
　　&lt;/xsl:template&gt;<br />
　　&lt;/xsl:stylesheet&gt;</div><br />
　　如果使用的是Internet Explorer 5.0或更高版本，就可以查看这个XSL文件的 <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/cd_catalog.xml" target="_blank">显示结果</a>。 <br />
将样式表连接到XML文档 <br />
　　现在向XML文档中增加一个XSL样式表引用： <br />
<div class="quote">　　&lt;?xml version="1.0"?&gt;<br />
　　&lt;?xml-stylesheet type="text/xsl" href="cd_catalog.xsl"?&gt;<br />
　　&lt;CATALOG&gt;<br />
　　 &lt;CD&gt;<br />
　　　　&lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt;<br />
　　　　&lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt;<br />
　　　　&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt;<br />
　　　　&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt;<br />
　　　　&lt;PRICE&gt;10.90&lt;/PRICE&gt;<br />
　　　　&lt;YEAR&gt;1985&lt;/YEAR&gt;<br />
　　 &lt;/CD&gt;</div><br />
  如果有一个与XSL兼容的浏览器，例如Internet Explorer 5.0或更高版本，那么就能很好地将XML转换成HTML。点击这里 <a href="http://www-128.ibm.com/developerworks/cn/xml/ccidnet/xslfund/xml-0316/cd_catalog_with_xsl.xml" target="_blank">查看结果</a>。 </p>

<p><strong>XSL模板：XSL如何使用模板来定义从XML到另一种输出格式的转换。</strong></p>

<p>XSL模板 <br />
　　XSL用模板来描述如何输出 XML。 </p>

<p>CSS的使用规则 <br />
　　如果已经学习过CSS的知识，我们就会知道CSS是用一个或多个规则来定义HTML元素的输出，用一个选择器将规则与一个HTML元素联系起来。比如以下这个CSS规则中的p选择器说明应该用一种叫做arial的字体来显示一个&lt;p&gt;元素： <br />
　　p { font-family: arial } </p>

<p>XSL使用模板 <br />
　　XSL使用一个或多个模板来定义如何输出XML元素，用一个匹配属性来将模板与一个XML元素联系起来，还可以用匹配属性来为XML文档的一个完整分支来定义模板。 <br />
　　请看以下的XSL样式表，它包含一个模板以输出前一节中的XML CD目录： <br />
<div class="quote">&lt;?xml version='1.0'?&gt;<br />
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt;<br />
&lt;xsl:template match="/"&gt;<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;table border="1"&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;Title&lt;/th&gt;<br />
&lt;th&gt;Artist&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;.&lt;/td&gt;<br />
&lt;td&gt;.&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;</div></p>]]>

</content>
</entry>
<entry>
<title>Ext2 文件系统的硬盘布局</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/07/ext2_aeccccc.html" />
<modified>2005-07-27T05:47:25Z</modified>
<issued>2005-07-27T05:33:47Z</issued>
<id>tag:peak.name,2005:/thinking//2.742</id>
<created>2005-07-27T05:33:47Z</created>
<summary type="text/plain">　　文章来源：IBM DeveloperWorks 　　本文主要讲述 Linux 上比较流行的 ext2 文件系统在硬盘分区上的详细布局情况。Ext2 文件系统加上日志支持的下一个版本是 ext3 文件系统，它和 ext2 文件系统在硬盘布局上是一样的，其差别仅仅是 ext3 文件系统在硬盘上多出了一个特殊的 inode（可以理解为一个特殊文件），用来记录文件系统的日志，也即所谓的 journal。由于本文并不讨论日志文件，所以本文的内容对于 ext2 和 ext3 都是适用的。 一、前言 　　本文的资料来源是 Linux 内核中 ext3 文件系统的源代码。为了便于读者查阅源代码，本文中一些关键的技术词汇都使用了内核源代码中所使用的英语单词，而没有使用相应的中文翻译。(这种方法是否恰当，还请读者朋友们指教。) 二、粗略的描述 　　对于 ext2 文件系统来说，硬盘分区首先被划分为一个个的 block，一个 ext2 文件系统上的每个 block 都是一样大小的，但是对于不同的 ext2 文件系统，block 的大小可以有区别。典型的 block 大小是...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Linux</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p>　　文章来源：<a href="http://www-128.ibm.com/developerworks/cn/linux/filesystem/ext2/index.html" target="_blank">IBM DeveloperWorks</a> </p>

<p>　　本文主要讲述 Linux 上比较流行的 ext2 文件系统在硬盘分区上的详细布局情况。Ext2 文件系统加上日志支持的下一个版本是 ext3 文件系统，它和 ext2 文件系统在硬盘布局上是一样的，其差别仅仅是 ext3 文件系统在硬盘上多出了一个特殊的 inode（可以理解为一个特殊文件），用来记录文件系统的日志，也即所谓的 journal。由于本文并不讨论日志文件，所以本文的内容对于 ext2 和 ext3 都是适用的。</p>

<p><b>一、前言</b></p>

<p>　　本文的资料来源是 Linux 内核中 ext3 文件系统的源代码。为了便于读者查阅源代码，本文中一些关键的技术词汇都使用了内核源代码中所使用的英语单词，而没有使用相应的中文翻译。(这种方法是否恰当，还请读者朋友们指教。)</p>

<p><b>二、粗略的描述</b></p>

<p>　　对于 ext2 文件系统来说，硬盘分区首先被划分为一个个的 block，一个 ext2 文件系统上的每个 block 都是一样大小的，但是对于不同的 ext2 文件系统，block 的大小可以有区别。典型的 block 大小是 1024 bytes 或者 4096 bytes。这个大小在创建 ext2 文件系统的时候被决定，它可以由系统管理员指定，也可以由文件系统的创建程序根据硬盘分区的大小，自动选择一个较合理的值。这些 blocks 被聚在一起分成几个大的 block group。每个 block group 中有多少个 block 是固定的。<br />
　　每个 block group 都相对应一个 group descriptor，这些 group descriptor 被聚在一起放在硬盘分区的开头部分，跟在 super block 的后面。所谓 super block，我们下面还要讲到。在这个 descriptor 当中有几个重要的 block 指针。我们这里所说的 block 指针，就是指硬盘分区上的 block 号数，比如，指针的值为 0，我们就说它是指向硬盘分区上的 block 0；指针的值为 1023，我们就说它是指向硬盘分区上的 block 1023。我们注意到，一个硬盘分区上的 block 计数是从 0 开始的，并且这个计数对于这个硬盘分区来说是全局性质的。<br />
　　在 block group 的 group descriptor 中，其中有一个 block 指针指向这个 block group 的 block bitmap，block bitmap 中的每个 bit 表示一个 block，如果该 bit 为 0，表示该 block 中有数据，如果 bit 为 1，则表示该 block 是空闲的。注意，这个 block bitmap 本身也正好只有一个 block 那么大小。假设 block 大小为 S bytes，那么 block bitmap 当中只能记载 8*S 个 block 的情况（因为一个 byte 等于 8 个 bits，而一个 bit 对应一个 block）。这也就是说，一个 block group 最多只能有 8*S*S bytes 这么大。<br />
　　在 block group 的 group descriptor 中另有一个 block 指针指向 inode bitmap，这个 bitmap 同样也是正好有一个 block 那么大，里面的每一个 bit 相对应一个 inode。硬盘上的一个 inode 大体上相对应于文件系统上的一个文件或者目录。关于 inode，我们下面还要进一步讲到。<br />
　　在 block group 的 descriptor 中另一个重要的 block 指针，是指向所谓的 inode table。这个 inode table 就不止一个 block 那么大了。这个 inode table 就是这个 block group 中所聚集到的全部 inode 放在一起形成的。</p>

<p>　　一个 inode 当中记载的最关键的信息，是这个 inode 中的用户数据存放在什么地方。我们在前面提到，一个 inode 大体上相对应于文件系统中的一个文件，那么用户文件的内容存放在什么地方，这就是一个 inode 要回答的问题。一个 inode 通过提供一系列的 block 指针，来回答这个问题。这些 block 指针指向的 block，里面就存放了用户文件的内容。</p>

<p><b>回顾</b><br />
　　现在我们回顾一下。硬盘分区首先被分为好多个 block。这些 block 聚在一起，被分成几组，也就是 block group。每个 block group 都有一个 group descriptor。所有这些 descriptor 被聚在一起，放在硬盘分区的开头部分，跟在 super block 的后面。从 group descriptor 我们可以通过 block 指针，找到这个 block group 的 inode table 和 block bitmap 等等。从 inode table 里面，我们就可以看到一个个的 inode 了。从一个 inode，我们通过它里面的 block 指针，就可以进而找到存放用户数据的那些 block。我们还要提一下，block 指针不是可以到处乱指的。一个 block group 的 block bitmap 和 inode bitmap 以及 inode table，都依次存放在这个 block group 的开头部分，而那些存放用户数据的 block 就紧跟在它们的后面。一个 block group 结束后，另一个 block group 又跟着开始。</p>

<p><b>三、详细的布局情况</b></p>

<p><b>Super Block</b><br />
　　所谓 ext2 文件系统的 super block，就是硬盘分区开头（开头的第一个 byte 是 byte 0）从 byte 1024 开始往后的一部分数据。由于 block size 最小是 1024 bytes，所以 super block 可能是在 block 1 中（此时 block 的大小正好是 1024 bytes），也可能是在 block 0 中。</p>

<p>　　硬盘分区上 ext3 文件系统的 super block 的详细情况如下。其中 __u32 是表示 unsigned 不带符号的 32 bits 的数据类型，其余类推。这是 Linux 内核中所用到的数据类型，如果是开发用户空间（user-space）的程序，可以根据具体计算机平台的情况，用 unsigned long 等等来代替。下面列表中关于 fragments 的部分可以忽略，Linux 上的 ext3 文件系统并没有实现 fragments 这个特性。另外要注意，ext3 文件系统在硬盘分区上的数据是按照 Intel 的 Little-endian 格式存放的，如果是在 PC 以外的平台上开发 ext3 相关的程序，要特别注意这一点。如果只是在 PC 上做开发，倒不用特别注意。</p>

<div class="quote"><pre><code>struct ext3_super_block {
/*00*/ __u32 s_inodes_count;      /* inodes 计数 */
       __u32 s_blocks_count;      /* blocks 计数 */
       __u32 s_r_blocks_count;    /* 保留的 blocks 计数 */
       __u32 s_free_blocks_count; /* 空闲的 blocks 计数 */
/*10*/ __u32 s_free_inodes_count; /* 空闲的 inodes 计数 */
       __u32 s_first_data_block;  /* 第一个数据 block */
       __u32 s_log_block_size;    /* block 的大小 */
       __s32 s_log_frag_size;     /* 可以忽略 */
/*20*/ __u32 s_blocks_per_group;  /* 每 block group 的 block 数量 */
       __u32 s_frags_per_group;   /* 可以忽略 */
       __u32 s_inodes_per_group;  /* 每 block group 的 inode 数量 */
       __u32 s_mtime;             /* Mount time */
/*30*/ __u32 s_wtime;             /* Write time */
       __u16 s_mnt_count;         /* Mount count */
       __s16 s_max_mnt_count;     /* Maximal mount count */
       __u16 s_magic;             /* Magic 签名 */
       __u16 s_state;             /* File system state */
       __u16 s_errors;            /* Behaviour when detecting errors */
       __u16 s_minor_rev_level;   /* minor revision level */
/*40*/ __u32 s_lastcheck;         /* time of last check */
       __u32 s_checkinterval;     /* max. time between checks */
       __u32 s_creator_os;        /* 可以忽略 */
       __u32 s_rev_level;         /* Revision level */
/*50*/ __u16 s_def_resuid;        /* Default uid for reserved blocks */
       __u16 s_def_resgid;        /* Default gid for reserved blocks */
       __u32 s_first_ino;         /* First non-reserved inode */
       __u16 s_inode_size;        /* size of inode structure */
       __u16 s_block_group_nr;    /* block group # of this superblock */
       __u32 s_feature_compat;    /* compatible feature set */
/*60*/ __u32 s_feature_incompat;  /* incompatible feature set */
       __u32 s_feature_ro_compat; /* readonly-compatible feature set */
/*68*/ __u8  s_uuid[16];          /* 128-bit uuid for volume */
/*78*/ char  s_volume_name[16];   /* volume name */
/*88*/ char  s_last_mounted[64];  /* directory where last mounted */
/*C8*/ __u32 s_algorithm_usage_bitmap; /* 可以忽略 */
       __u8  s_prealloc_blocks;        /* 可以忽略 */
       __u8  s_prealloc_dir_blocks;    /* 可以忽略 */
       __u16 s_padding1;               /* 可以忽略 */
/*D0*/ __u8  s_journal_uuid[16]; /* uuid of journal superblock */
/*E0*/ __u32 s_journal_inum;     /* 日志文件的 inode 号数 */
       __u32 s_journal_dev;      /* 日志文件的设备号 */
       __u32 s_last_orphan;      /* start of list of inodes to delete */
/*EC*/ __u32 s_reserved[197];    /* 可以忽略 */
};</pre></code></div>
 
　　我们可以看到，super block 一共有 1024 bytes 那么大。在 super block 中，我们第一个要关心的字段是 magic 签名，对于 ext2 和 ext3 文件系统来说，这个字段的值应该正好等于 0xEF53。如果不等的话，那么这个硬盘分区上肯定不是一个正常的 ext2 或 ext3 文件系统。从这里，我们也可以估计到，ext2 和 ext3 的兼容性一定是很强的，不然的话，Linux 内核的开发者应该会为 ext3 文件系统另选一个 magic 签名才对。

<p>　　在 super block 中另一个重要的字段是 s_log_block_size。从这个字段，我们可以得出真正的 block 的大小。我们把真正 block 的大小记作 B，B = 1 << (s_log_block_size + 10)，单位是 bytes。举例来说，如果这个字段是 0，那么 block 的大小就是 1024 bytes，这正好就是最小的 block 大小；如果这个字段是 2，那么 block 大小就是 4096 bytes。从这里我们就得到了 block 的大小这一非常重要的数据。</p>

<p><b>Group Descriptors</b><br />
　　我们继续往下，看跟在 super block 后面的一堆 group descriptors。首先注意到 super block 是从 byte 1024 开始，一共有 1024 bytes 那么大。而 group descriptors 是从 super block 后面的第一个 block 开始。也就是说，如果 super block 是在 block 0，那么 group descriptors 就是从 block 1 开始；如果 super block 是在 block 1，那么 group descriptors 就是从 block 2 开始。因为 super block 一共只有 1024 bytes 那么大，所以不会超出一个 block 的边界。如果一个 block 正好是 1024 bytes 那么大的话，我们看到 group descriptors 就是紧跟在 super block 后面的了，没有留一点空隙。而如果一个 block 是 4096 bytes 那么大的话，那么在 group descriptors（从 byte 4096 开始）和 super block 的结尾之间，就有一定的空隙（4096 - 2048 bytes）。</p>

<p>　　那么硬盘分区上一共有多少个 block group，或者说一共有多少个 group descriptors，这我们要在 super block 中找答案。super block 中的 s_blocks_count 记录了硬盘分区上的 block 的总数，而 s_blocks_per_group 记录了每个 group 中有多少个 block。显然，文件系统上的 block groups 数量，我们把它记作 G，G = (s_blocks_count - s_first_data_block - 1) / s_blocks_per_group + 1。为什么要减去 s_first_data_block，因为 s_blocks_count 是硬盘分区上全部的 block 的数量，而在 s_first_data_block 之前的 block 是不归 block group 管的，所以当然要减去。最后为什么又要加一，这是因为尾巴上可能多出来一些 block，这些 block 我们要把它划在一个相对较小的 group 里面。</p>

<p>　　注意，硬盘分区上的所有这些 group descriptors 要能塞在一个 block 里面。也就是说 groups_count * descriptor_size 必须小于等于 block_size。</p>

<p>　　知道了硬盘分区上一共有多少个 block group，我们就可以把这么多个 group descriptors 读出来了。先来看看 group descriptor 是什么样子的。</p>

<div class="quote"><pre><code>struct ext3_group_desc
{
 __u32 bg_block_bitmap;      /* block 指针指向 block bitmap */
 __u32 bg_inode_bitmap;      /* block 指针指向 inode bitmap */
 __u32 bg_inode_table;       /* block 指针指向 inodes table */
 __u16 bg_free_blocks_count; /* 空闲的 blocks 计数 */
 __u16 bg_free_inodes_count; /* 空闲的 inodes 计数 */
 __u16 bg_used_dirs_count;   /* 目录计数 */
 __u16 bg_pad;               /* 可以忽略 */
 __u32 bg_reserved[3];       /* 可以忽略 */
};</pre></code></div>

<p>　　每个 group descriptor 是 32 bytes 那么大。从上面，我们看到了三个关键的 block 指针，这三个关键的 block 指针，我们已经在前面都提到过了。</p>

<p><b>Inode</b><br />
　　前面都准备好了以后，我们现在终于可以开始读取文件了。首先要读的，当然是文件系统的根目录。注意，这里所谓的根目录，是相对于这一个文件系统或者说硬盘分区而言的，它并不一定是整个 Linux 操作系统上的根目录。这里的这个 root 目录存放在一个固定的 inode 中，这就是文件系统上的 inode 2。需要提到 inode 计数同 block 计数一样，也是全局性质的。这里需要特别注意的是，inode 计数是从 1 开始的，而前面我们提到过 block 计数是从 0 开始，这个不同在开发程序的时候要特别留心。（这一奇怪的 inode 计数方法，曾经让本文作者大伤脑筋。）</p>

<p>　　那么，我们先来看一下得到一个 inode 号数以后，怎样读取这个 inode 中的用户数据。在 super block 中有一个字段 s_inodes_per_group 记载了每个 block group 中有多少个 inode。用我们得到的 inode 号数除以 s_inodes_per_group，我们就知道了我们要的这个 inode 是在哪一个 block group 里面，这个除法的余数也告诉我们，我们要的这个 inode 是这个 block group 里面的第几个 inode；然后，我们可以先找到这个 block group 的 group descriptor，从这个 descriptor，我们找到这个 group 的 inode table，再从 inode table 找到我们要的第几个 inode，再以后，我们就可以开始读取 inode 中的用户数据了。</p>

<p>　　这个公式是这样的：block_group = (ino - 1) / s_inodes_per_group。这里 ino 就是我们的 inode 号数。而 offset = (ino - 1) % s_inodes_per_group，这个 offset 就指出了我们要的 inode 是这个 block group 里面的第几个 inode。</p>

<p>　　找到这个 inode 之后，我们来具体的看看 inode 是什么样的。</p>

<div class="quote"><pre><code>struct ext3_inode {
 __u16 i_mode;    /* File mode */
 __u16 i_uid;     /* Low 16 bits of Owner Uid */
 __u32 i_size;    /* 文件大小，单位是 byte */
 __u32 i_atime;   /* Access time */
 __u32 i_ctime;   /* Creation time */
 __u32 i_mtime;   /* Modification time */
 __u32 i_dtime;   /* Deletion Time */
 __u16 i_gid;     /* Low 16 bits of Group Id */
 __u16 i_links_count;          /* Links count */
 __u32 i_blocks;               /* blocks 计数 */
 __u32 i_flags;                /* File flags */
 __u32 l_i_reserved1;          /* 可以忽略 */
 __u32 i_block[EXT3_N_BLOCKS]; /* 一组 block 指针 */
 __u32 i_generation;           /* 可以忽略 */
 __u32 i_file_acl;             /* 可以忽略 */
 __u32 i_dir_acl;              /* 可以忽略 */
 __u32 i_faddr;                /* 可以忽略 */
 __u8  l_i_frag;               /* 可以忽略 */
 __u8  l_i_fsize;              /* 可以忽略 */
 __u16 i_pad1;                 /* 可以忽略 */
 __u16 l_i_uid_high;           /* 可以忽略 */
 __u16 l_i_gid_high;           /* 可以忽略 */
 __u32 l_i_reserved2;          /* 可以忽略 */
};</pre></code></div>

<p>　　我们看到在 inode 里面可以存放 EXT3_N_BLOCKS（= 15）这么多个 block 指针。用户数据就从这些 block 里面获得。15 个 blocks 不一定放得下全部的用户数据，在这里 ext3 文件系统采取了一种分层的结构。这组 15 个 block 指针的前 12 个是所谓的 direct blocks，里面直接存放的就是用户数据。第 13 个 block，也就是所谓的 indirect block，里面存放的全部是 block 指针，这些 block 指针指向的 block 才被用来存放用户数据。第 14 个 block 是所谓的 double indirect block，里面存放的全是 block 指针，这些 block 指针指向的 block 也被全部用来存放 block 指针，而这些 block 指针指向的 block，才被用来存放用户数据。第 15 个 block 是所谓的 triple indirect block，比上面说的 double indirect block 有多了一层 block 指针。作为练习，读者可以计算一下，这样的分层结构可以使一个 inode 中最多存放多少字节的用户数据。（计算所需的信息是否已经足够？还缺少哪一个关键数据？）</p>

<p>　　一个 inode 里面实际有多少个 block，这是由 inode 字段 i_size 再通过计算得到的。i_size 记录的是文件或者目录的实际大小，用它的值除以 block 的大小，就可以得出这个 inode 一共占有几个 block。注意上面的 i_blocks 字段，粗心的读者可能会以为是这一字段记录了一个 inode 中实际用到多少个 block，其实不是的。那么这一字段是干什么用的呢，读者朋友们可以借这个机会，体验一下阅读 Linux 内核源代码的乐趣。;-)</p>

<p><b>文件系统的目录结构</b><br />
　　现在我们已经可以读取 inode 的内容了，再往后，我们将要读取文件系统上文件和目录的内容。读取文件的内容，只要把相应的 inode 的内容全部读出来就行了；而目录只是一种固定格式的文件，这个文件按照固定的格式记录了目录中有哪些文件，以及它们的文件名，和 inode 号数等等。</p>

<div class="quote"><pre><code>struct ext3_dir_entry_2 {
 __u32 inode;    /* Inode 号数 */
 __u16 rec_len;  /* Directory entry length */
 __u8  name_len; /* Name length */
 __u8  file_type;
 char  name[EXT3_NAME_LEN]; /* File name */
};</pre></code></div>

<p>　　上面用到的 EXT3_NAME_LEN 是 255。注意，在硬盘分区上的 dir entry 不是固定长度的，每个 dir entry 的长度由上面的 rec_len 字段记录。</p>

<p><b>四、小结</b></p>

<p>　　有了以上的这些信息，我们就可以读取一个 ext3 文件系统的全部内容了。如果读者有 Windows 驱动程序开发的经验，从本文的信息，开发一个 Windows 下只读的 ext3 文件系统是可能的。但是要想又读又写，那还需要了解 Ext3 的日志文件的结构，而本文限于篇幅，并没有包括这方面的内容。</p>

<p><b>五、参考资料 </b></p>

<p>　　1. Remy Card, Theodore Ts'o, Stephen Tweedie, Design and Implementation of the Second Extended Filesystem, <a href="http://web.mit.edu/tytso/www/linux/ext2intro.html" target="_blank">http://web.mit.edu/tytso/www/linux/ext2intro.html</a> <br />
　　2. Linux Kernel 2.4.18 Source Code, <a href="http://lxr.linux.no/source/fs/ext3/" target="_blank">http://lxr.linux.no/source/fs/ext3/</a> </p>

<p><br />
<b>六、关于作者</b><br />
　　赵蔚，是中国大陆第二个注册的 Debian GNU/Linux 义务开发人员。作者对于 LISP 和 Lambda Calculus 也有浓厚的兴趣。  <br />
</p>]]>

</content>
</entry>
<entry>
<title>爱心援助Blogger王俊（Befresh）</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/06/cbloggercaeiebe.html" />
<modified>2005-06-28T12:03:03Z</modified>
<issued>2005-06-28T11:15:27Z</issued>
<id>tag:peak.name,2005:/thinking//2.723</id>
<created>2005-06-28T11:15:27Z</created>
<summary type="text/plain">　　您的爱心，可以救活一名认真的Blogger 　　befresh（王俊），一名27岁的blogger，需要进行骨髓移植，为了拯救他的生命，希望能得到您的帮助，您的爱心可以帮他度过难关。 　　befresh（王俊），一名27岁的blogger，本来有一份感兴趣的工作、不错的前途、贴心的家人和知心的朋友，生活一直充实而平静，可是，他现在已经无力更新blog了，他检查出了可以致命的“骨髓增生异常综合症”，因为发现得及时，他有很大的机会通过移植骨髓的方法治好；而他的妹妹，又正好可以提供合格骨髓来源。可是，他是家里的唯一的经济支柱，而30万的治疗费用，对他的家庭来说，根本无力承担。 　　为了拯救他的生命，希望能得到您的帮助，您的爱心可以帮他度过难关，详情请见http://befresh.bjug.org，王俊的blog：http://befresh.blogbus.com。 　　我们有200万blogger，大家携手，献一些绵薄之力，参与的人多一些，请捐出一点心意，哪怕是10元，20元，可以救回一条年轻认真的生命啊，谢谢！ 　　Blogbus的爱心援助公告：http://blogbus.blogbus.com/logs/2005/06/1289853.html中让人感动的blogger评论： 我不认识他，但心里为这样一位朋友心痛。其实象他这样的人距离我们并不远：他是勤奋的程序员，他是一家的支柱。。。所以，我要献点爱心！大家都来献点爱心：100元，200元，轻轻地点一下鼠标的功夫，你的生活不会有任何的改变，却给王俊带来生的希望。 Sicilia(neverdoright.blogbus.com) 发表于2005-06-27 17:09 　　主要援助方式： 　　爱心捐款： 　　　　工商银行 　　　　户名 王俊 　　　　帐号 0200 2008 0102 3428 807 　　　　开户行 工商银行北京市西内所 　　　　招商银行 　　　　户名 王俊 　　　　帐号 9555 5001 0200 2820 　　　　开户行 招商银行 北京分行 　　　　中国银行 　　　　户名 王俊 　　　　帐号 4021400-0188-001204-0 　　　　开户行...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Other</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p>　　<FONT color=#ff0000><STRONG>您的爱心，可以救活一名认真的Blogger</STRONG></FONT></p>

<p>　　befresh（王俊），一名27岁的blogger，需要进行骨髓移植，为了拯救他的生命，希望能得到您的帮助，您的爱心可以帮他度过难关。</p>

<p>　　befresh（王俊），一名27岁的blogger，本来有一份感兴趣的工作、不错的前途、贴心的家人和知心的朋友，生活一直充实而平静，可是，他现在已经无力更新blog了，他检查出了可以致命的“骨髓增生异常综合症”，因为发现得及时，他有很大的机会通过移植骨髓的方法治好；而他的妹妹，又正好可以提供合格骨髓来源。可是，他是家里的唯一的经济支柱，而30万的治疗费用，对他的家庭来说，根本无力承担。</p>

<p>　　为了拯救他的生命，希望能得到您的帮助，您的爱心可以帮他度过难关，详情请见<A href="http://befresh.bjug.org/" target="_blank">http://befresh.bjug.org</A>，王俊的blog：<A href="http://befresh.blogbus.com/" target="_blank">http://befresh.blogbus.com</A>。</p>

<p>　　我们有200万blogger，大家携手，献一些绵薄之力，参与的人多一些，请捐出一点心意，哪怕是10元，20元，可以救回一条年轻认真的生命啊，谢谢！</p>

<p>　　Blogbus的爱心援助公告：<A href="http://blogbus.blogbus.com/logs/2005/06/1289853.html" target="_blank">http://blogbus.blogbus.com/logs/2005/06/1289853.html</A>中让人感动的blogger评论：<br />
<DIV class="quote">我不认识他，但心里为这样一位朋友心痛。其实象他这样的人距离我们并不远：他是勤奋的程序员，他是一家的支柱。。。所以，我要献点爱心！大家都来献点爱心：100元，200元，轻轻地点一下鼠标的功夫，你的生活不会有任何的改变，却给王俊带来生的希望。  <STRONG><FONT color=#666666>Sicilia</FONT></STRONG>(<A href="http://neverdoright.blogbus.com/" target="_blank"><FONT color=#666666>neverdoright.blogbus.com</FONT></A>)  发表于<STRONG><FONT size=2>2005-06-27 17:09</FONT></STRONG></DIV></p>

<p>　　主要援助方式：</p>

<p>　　<B>爱心捐款：</B></p>

<p>　　　　<I>工商银行</I><br />
　　　　户名 王俊<br />
　　　　帐号 0200 2008 0102 3428 807<br />
　　　　开户行 工商银行北京市西内所 </p>

<p>　　　　<I>招商银行</I><br />
　　　　户名 王俊<br />
　　　　帐号 9555 5001 0200 2820<br />
　　　　开户行 招商银行 北京分行</p>

<p>　　　　<I>中国银行</I><br />
　　　　户名 王俊<br />
　　　　帐号 4021400-0188-001204-0<br />
　　　　开户行 北京西直门支行</p>

<p>　　<B>帮助宣传：</B></p>

<p>　　 - 请到<A href="http://befresh.bjug.org/" target="_blank"><STRONG><FONT color=#ff6600>http://befresh.bjug.org</FONT></STRONG></A> 留下你对他的祝福；<br />
　　 - 请在MSN上修改您的名字，我们都写上 [祝福后山]；<br />
　　 - 请修改您MSN的头像为我们提供的图标：<br />
<center><IMG src="http://befresh.bjug.org/images/stories/help2.gif" border=0></center><br />
　　 - 增加官方网站的地址 <A href="http://befresh.bjug.org/" target="_blank"><FONT color=#ff6600>http://befresh.bjug.org</FONT></A>到MSN名字后面的个人信息；<br />
　　 - 请看到此文的Blogger，在您的Blog上link此文，并Trackback到王俊的Blog: <br />
<A href="http://befresh.blogbus.com/" target="_blank"><STRONG><FONT color=#ff6600>http://befresh.blogbus.com</FONT></STRONG></A> <br />
　　 - 请看到此信息的人，帮助一起宣传<A href="http://befresh.bjug.org/" target="_blank"><STRONG><FONT color=#ff6600>http://befresh.bjug.org</FONT></STRONG></A> ，我们需要您的帮助<br />
　　 - 在您的Blog或网站，加上用我们提供的LOGO，并连接到<A href="http://befresh.bjug.org/" target="_blank"><STRONG><FONT color=#ff6600>http://befresh.bjug.org</FONT></STRONG></A><br />
<center><A href="http://befresh.bjug.org/" target="_blank"><IMG src="http://befresh.bjug.org/images/stories/help.gif" border=0></A> <A href="http://befresh.bjug.org/" target="_blank"><IMG src="http://www.dedream.com/image/befresh/helpblogger.gif" border=0></A></center></p>]]>

</content>
</entry>
<entry>
<title>[读书]你在为谁工作 - 序</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/05/eaeaeaeeae.html" />
<modified>2005-05-30T07:22:26Z</modified>
<issued>2005-05-30T07:15:20Z</issued>
<id>tag:peak.name,2005:/thinking//2.695</id>
<created>2005-05-30T07:15:20Z</created>
<summary type="text/plain">《你在为谁工作》　陈凯元著　机械工业出版社出版 　　&quot;我只拿这点钱，凭什么去做那么多工作。&quot; 　　&quot;我为公司干活，公司付我一份报酬，等价交换而已。&quot; 　　&quot;我只要对得起这份薪水就行了，多一点我都不干。&quot; 　　&quot;工作嘛，又不是为自己干，说得过去就行了。&quot; 　　这种&quot;我不过是在为老板打工&quot;的想法很普遍：在许多人眼里，工作只是一种简单的雇佣关系，做多做少、做好做坏，对自己意义不大，达到要求就行了。 　　我们到底是在为谁工作呢？工作着的人们都应该问问自己。如果不在年轻的时候弄清这个问题，不调整好自己的心态，我们很可能与成功无缘。 　　杰克在一家贸易公司工作了1年，由于不满意自己的工作，他忿忿地对朋友说：&quot;我在公司里的工资是最低的，老板也不把我放在眼里，如果再这样下去，总有一天我要跟他拍桌子，然后辞职不干。&quot; 　　&quot;你把那家贸易公司的业务都弄清楚了吗？做国际贸易的窍门完全弄懂了吗？&quot;他的朋友问道。 　　&quot;还没有！&quot; 　　&quot;君子报仇十年不晚！我建议你先静下心来，认认真真地工作，把他们的一切贸易技巧、商业文书和公司组织完全搞通，甚至包括如何书写合同等具体细节都弄懂了之后，再一走了之，这样做岂不是既出了气，又有许多收获吗？&quot; 　　杰克听从了朋友的建议，一改往日的散漫习惯，开始认认真真地工作起来，甚至下班之后，还常常留在办公室里研究商业文书的写法。 　　一年之后，那位朋友偶然遇到他。 　　&quot;现在你大概都会学了，可以准备拍桌子不干了吧？&quot; 　　&quot;可是，我发现近半年来，老板对我刮目相看，最近更是委以重任，又升职、又加薪。说实话，不仅仅是老板，公司里的其他人都开始敬重我了！&quot; 　　我很羡慕杰克，他只用了一年的时间就深刻体会到了一个人生哲理：只有抱着&quot;为自己工作&quot;的心态，承认并接受&quot;为他人工作的同时，也是在为自己工作&quot;这个朴素的人生理念，才能心平气和地将手中的事情做好，也才能最终获得丰厚的物质报酬，赢得社会的尊重，实现自身的价值。 　　然而遗憾的是，许多人直到职业生涯的尽头，也没能很好地回答&quot;你在为谁工作&quot;这个问题，没有意识到为他人工作的同时，也是在为自己工作。人生离不开工作。工作不仅能赚到养家糊口的薪水，同时，困难的事务能锻炼我们的意志，新的任务能拓展我们的才能，与同事的合作能培养我们的人格，与客户的交流能训练我们的品性。从某种意义上来，工作是为了自己。 　　对于&quot;你在为谁工作&quot;这个问题的正确回答，有助于我们解除困惑，调整心态，重燃工作激情，使人生从平庸走向杰出。在工作中，不管做任何事，都应将心态回归于零：把自己放空，抱着学习的态度，将每一次任务都视为一个新的开始，一段新的体验，一扇通往成功的机会之门。千万不要视工作如鸡肋，食之无味，弃之可惜，结果做得心不甘情不愿，于公于私都没有裨益。 　　当你开始推诿责任，当你丧失工作激情，当你对工作产生怨恨的时候，请暂时停下手中的工作，静静反思一下这个简单而又包含着深刻人生意义的问题。 　　&quot;你在为谁工作？&quot; 注：这里是Peak的读书笔记，仅节选感触较深的片断，如果需要阅读全部内容请购买正版图书； 　　涉及图书的任何权利均归属于其作者/出版机构/其他相关机构和人； 　　无特殊注明来源，图书内容为Peak手工输入，可能会出现一些错误，请参照正版图书内容，Peak不承担因此而产生的任何责任。...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Jobs</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p><strong>《你在为谁工作》　陈凯元著　机械工业出版社出版</strong></p>

<p>　　"我只拿这点钱，凭什么去做那么多工作。"<br />
　　"我为公司干活，公司付我一份报酬，等价交换而已。"<br />
　　"我只要对得起这份薪水就行了，多一点我都不干。"<br />
　　"工作嘛，又不是为自己干，说得过去就行了。"<br />
　　这种"我不过是在为老板打工"的想法很普遍：在许多人眼里，工作只是一种简单的雇佣关系，做多做少、做好做坏，对自己意义不大，达到要求就行了。<br />
　　我们到底是在为谁工作呢？工作着的人们都应该问问自己。如果不在年轻的时候弄清这个问题，不调整好自己的心态，我们很可能与成功无缘。<br />
　　杰克在一家贸易公司工作了1年，由于不满意自己的工作，他忿忿地对朋友说："我在公司里的工资是最低的，老板也不把我放在眼里，如果再这样下去，总有一天我要跟他拍桌子，然后辞职不干。"<br />
　　"你把那家贸易公司的业务都弄清楚了吗？做国际贸易的窍门完全弄懂了吗？"他的朋友问道。<br />
　　"还没有！"<br />
　　"君子报仇十年不晚！我建议你先静下心来，认认真真地工作，把他们的一切贸易技巧、商业文书和公司组织完全搞通，甚至包括如何书写合同等具体细节都弄懂了之后，再一走了之，这样做岂不是既出了气，又有许多收获吗？"<br />
　　杰克听从了朋友的建议，一改往日的散漫习惯，开始认认真真地工作起来，甚至下班之后，还常常留在办公室里研究商业文书的写法。<br />
　　一年之后，那位朋友偶然遇到他。<br />
　　"现在你大概都会学了，可以准备拍桌子不干了吧？"<br />
　　"可是，我发现近半年来，老板对我刮目相看，最近更是委以重任，又升职、又加薪。说实话，不仅仅是老板，公司里的其他人都开始敬重我了！"<br />
　　我很羡慕杰克，他只用了一年的时间就深刻体会到了一个人生哲理：只有抱着"为自己工作"的心态，承认并接受"为他人工作的同时，也是在为自己工作"这个朴素的人生理念，才能心平气和地将手中的事情做好，也才能最终获得丰厚的物质报酬，赢得社会的尊重，实现自身的价值。<br />
　　然而遗憾的是，许多人直到职业生涯的尽头，也没能很好地回答"你在为谁工作"这个问题，没有意识到为他人工作的同时，也是在为自己工作。人生离不开工作。工作不仅能赚到养家糊口的薪水，同时，困难的事务能锻炼我们的意志，新的任务能拓展我们的才能，与同事的合作能培养我们的人格，与客户的交流能训练我们的品性。从某种意义上来，工作是为了自己。<br />
　　对于"你在为谁工作"这个问题的正确回答，有助于我们解除困惑，调整心态，重燃工作激情，使人生从平庸走向杰出。在工作中，不管做任何事，都应将心态回归于零：把自己放空，抱着学习的态度，将每一次任务都视为一个新的开始，一段新的体验，一扇通往成功的机会之门。千万不要视工作如鸡肋，食之无味，弃之可惜，结果做得心不甘情不愿，于公于私都没有裨益。<br />
　　当你开始推诿责任，当你丧失工作激情，当你对工作产生怨恨的时候，请暂时停下手中的工作，静静反思一下这个简单而又包含着深刻人生意义的问题。<br />
　　"你在为谁工作？"</p>

<p><br />
注：这里是Peak的读书笔记，仅节选感触较深的片断，如果需要阅读全部内容请购买正版图书；<br />
　　涉及图书的任何权利均归属于其作者/出版机构/其他相关机构和人；<br />
　　无特殊注明来源，图书内容为Peak手工输入，可能会出现一些错误，请参照正版图书内容，Peak不承担因此而产生的任何责任。</p>]]>

</content>
</entry>
<entry>
<title>Blog在市场营销中的一个用途——直接发掘潜在客户</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/03/blogeeaecaeaece.html" />
<modified>2005-04-01T07:28:40Z</modified>
<issued>2005-03-31T07:17:55Z</issued>
<id>tag:peak.name,2005:/thinking//2.645</id>
<created>2005-03-31T07:17:55Z</created>
<summary type="text/plain">　　在去年9月份时写过一篇日记，是说自己想要买一台笔记本电脑，日记发出来不到三天，有一个人就在MSN中请求加为好友。和这个陌人先随便聊几句，什么看到你的网站不错所以才加你之类的，然后就聊天要买笔记本电脑这个话题，他说他们就是卖笔记本的，可以以低一些的价格卖给我一台。 　　上面的例子说明这位销售笔记本的人从我的Blog中找到了他需要的潜在客户，一般情况下这样的客户已经具有了购买的种种条件，也就是不需要重新培养购买需求等等，找到之后就会成为潜在用户。这样是不是更容易销售呢？试想一下，有很多Blogger在网上写是在关注什么什么产品、想要什么什么服务，那么这些客户资源将会是最直接的，成功销售的比例也是最大的。 　　Blogger分布到整个互联网，信息异常的分散，如何快速去收集这些信息呢？其实不用担心的，目前各种在线聚合内容网站或是搜索网站可以帮助你完成这项工作。在国内的有Grassland、博索、看天下等，国外有Bloglines、Technorati等等。获取到最有价值的信息并将其有效利用应该可以为商业公司带来利益，建议试一下在Blog中寻找商业机会。...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Social Software</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p>　　在<a href="http://peak.name/blog/archives/2004/09/ceieeaebuycaee.html">去年9月份时写过一篇日记</a>，是说自己想要买一台笔记本电脑，日记发出来不到三天，有一个人就在MSN中请求加为好友。和这个陌人先随便聊几句，什么看到你的网站不错所以才加你之类的，然后就聊天要买笔记本电脑这个话题，他说他们就是卖笔记本的，可以以低一些的价格卖给我一台。<br />
　　上面的例子说明这位销售笔记本的人从我的Blog中找到了他需要的潜在客户，一般情况下这样的客户已经具有了购买的种种条件，也就是不需要重新培养购买需求等等，找到之后就会成为潜在用户。这样是不是更容易销售呢？试想一下，有很多Blogger在网上写是在关注什么什么产品、想要什么什么服务，那么这些客户资源将会是最直接的，成功销售的比例也是最大的。<br />
　　Blogger分布到整个互联网，信息异常的分散，如何快速去收集这些信息呢？其实不用担心的，目前各种在线聚合内容网站或是搜索网站可以帮助你完成这项工作。在国内的有<a href="http://grassland.cnblog.org" target="_blank">Grassland</a>、<a href="http://www.booso.com" target="_blank">博索</a>、<a href="http://www.kantianxia.com" target="_blank">看天下</a>等，国外有<a href="http://www.bloglines.com" target="_blank">Bloglines</a>、<a href="http://www.technorati.com" target="_blank">Technorati</a>等等。获取到最有价值的信息并将其有效利用应该可以为商业公司带来利益，建议试一下在Blog中寻找商业机会。</p>]]>

</content>
</entry>
<entry>
<title>在笔记本上通过手机拔号上网</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/03/ceaeeeaec.html" />
<modified>2005-03-18T09:04:02Z</modified>
<issued>2005-03-05T02:19:47Z</issued>
<id>tag:peak.name,2005:/thinking//2.624</id>
<created>2005-03-05T02:19:47Z</created>
<summary type="text/plain">　　网络改变了很多东西，确切的说应该是增加了一个优秀的工具。网络的优势在于可以把人与人之间的距离缩短，而移动网络带给人们全新的感受，不但把人与人之间的距离缩短，还把有线变成“无限”。在任何移动网络（GSM/CDMA，或者是未来更多的网络）覆盖的位置就可以获取、分享信息。 　　手机的普及和各种无线数据业务的开通让普通用户可以使用移动网络，笔记本+GPRS或CDMA1X是目前在国内移动上网的两种主要途径。GPRS是中国移动提供的基于GSM网络的一种数据服务，CDMA1X是由中国联通基于CDMA网络的一种称之为“掌上宽带”的数据服务。目前主流的方式是通过PCMCIA无线网卡和一个SIM卡或UIM卡上网的，一块PCMCIA无线网卡大约在1000元到2000元之间，上网接入价格不等，不同区域的服务商制定的资费不同，可以向您所在当地的服务商咨询。上海移动的GPRS包年价格为2400元/年，不限流量。就当前的人均收入来计算，暂时还不达到普及的程度。如果不使用包月或包年服务资费就更不能想象，国内交互设计先驱Windy J曾做过此类计算，可供参考。 　　先抛快高昂的费用不说，就连成功配置此项功能也是非常复杂，介绍一下本人配置的全过程。 　　使用的设备有：IBM T42笔记本（支持红外线连接），Nokia 6610（支持GPRS和红外线连接），手机号是北京动感地带，网络连接是20元GPRS包月（免费赠送1M流量，超出按1分钱/1K计算）。 　　从网上找了很多资料基本了解了大概的过程，但经过多次试验均失败，给北京移动1860服务中心打了很久电话，无人接听，又给上海1860打电话，服务人员让找北京移动，并提醒给当地1860打电话是免费，给北京移动1860打电话要收长途费，汗~~~~在没有了解到任何信息前就已经花掉10几元，果然是“高消费”呀。终于在千辛万苦之后将移动上网配置成功，在这里要感谢北京移动1860数据业务服务专员的耐心帮助。 　　配置前请先确认几个信息：1、您的计算机和手机是否同时支持通过红外线或蓝牙或数据线连接；2、您的手机是否使用的中国移动通讯服务并开通GPRS服务；3、您当前所在的位置是否被中国移动GSM网络覆盖并可以使用GPRS服务。 　　确认以上信息满足后进行以下操作，所有的操作均基于计算机操作系统为Windows XP下，手机使用Nokia 6610，并且所有需要的驱动程序均以安装完成并可以正常使用。 　　第一步：配置手机GPRS连接。 　　　　选择进入“服务”菜单，选择“设置”； 　　　　选择“修改服务设置”： 　　　　　　进入修改服务设置屏幕，分别输入相关信息： 　　　　　　“设置组名称”设为“移动梦网GPRS”； 　　　　　　“主页”设置为http：//wap.monternet.com； 　　　　　　“连接类型”设为“持续连接”； 　　　　　　“安全保护”设为“关”； 　　　　　　“传输方式”设为“GPRS”； 　　　　　　“GPRS接入点”设为“CMNET”，注意：如果使用CMWAP则无法配置成功； 　　　　　　“IP地址”设为“10.0.0.172” 　　　　　　“鉴权类型”设为“普通”； 　　　　　　“登录类型”设为“自动”； 　　　　　　“用户名”和“密码”不用设置； 　　　　输入完毕按返回退到待机状态 ； 　　　　在待机状态下，按“功能表”选择“服务”并进入“主页”后即可登录移动梦网主页。 　　第二步：建立计算机与手机间的连接。 　　　　进入手机的“数据连通”菜单； 　　　　选择“红外接口”，出现“红外接收已启动”表示成功； 　　　　将手机的红外接口对准计算机的红外接口并将手机放稳； 　　　　计算机会提示“附近有另一台计算机”（如下图所示），此时手机与计算机已经成功连接。 　　　　 　　　　注意：如果您的计算机未安装所需要的手机中Modem驱动，则会出现“发现新硬件安装向导”，您可以根据提示进行安装，若无法找到手机中Modem驱动，请与手机供应商联系。如果需要Nokia 6610相关驱动程序可以与我联系。若不能发现红外线连接请确认您和计算机或手机配置是否正确，或是检查硬件是否可以正常工作。 　　第三步：在计算机上建立网络连接。 　　　　打开计算机的“新建连接向导”（如下图）（打开方法：在桌面“网上邻居”图标上点右键选择“属性”，在打开窗口左上角点击“创建一个新的连接”），点击“下一步”； 　　　　...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Wireless</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p>　　网络改变了很多东西，确切的说应该是增加了一个优秀的工具。网络的优势在于可以把人与人之间的距离缩短，而移动网络带给人们全新的感受，不但把人与人之间的距离缩短，还把有线变成“无限”。在任何移动网络（GSM/CDMA，或者是未来更多的网络）覆盖的位置就可以获取、分享信息。<br />
　　手机的普及和各种无线数据业务的开通让普通用户可以使用移动网络，笔记本+GPRS或CDMA1X是目前在国内移动上网的两种主要途径。GPRS是中国移动提供的基于GSM网络的一种数据服务，CDMA1X是由中国联通基于CDMA网络的一种称之为“掌上宽带”的数据服务。目前主流的方式是通过PCMCIA无线网卡和一个SIM卡或UIM卡上网的，一块PCMCIA无线网卡大约在1000元到2000元之间，上网接入价格不等，不同区域的服务商制定的资费不同，可以向您所在当地的服务商咨询。上海移动的GPRS包年价格为2400元/年，不限流量。就当前的人均收入来计算，暂时还不达到普及的程度。如果不使用包月或包年服务资费就更不能想象，国内交互设计先驱<a href="http://dedream.blogbus.com/logs/2004/12/555281.html" target="_blank">Windy J曾做过此类计算</a>，可供参考。</p>

<p>　　先抛快高昂的费用不说，就连成功配置此项功能也是非常复杂，介绍一下本人配置的全过程。<br />
　　使用的设备有：IBM T42笔记本（支持红外线连接），Nokia 6610（支持GPRS和红外线连接），手机号是北京动感地带，网络连接是20元GPRS包月（免费赠送1M流量，超出按1分钱/1K计算）。<br />
　　从网上找了很多资料基本了解了大概的过程，但经过多次试验均失败，给北京移动1860服务中心打了很久电话，无人接听，又给上海1860打电话，服务人员让找北京移动，并提醒给当地1860打电话是免费，给北京移动1860打电话要收长途费，汗~~~~在没有了解到任何信息前就已经花掉10几元，果然是“高消费”呀。终于在千辛万苦之后将移动上网配置成功，在这里要感谢北京移动1860数据业务服务专员的耐心帮助。<br />
　　配置前请先确认几个信息：1、您的计算机和手机是否同时支持通过红外线或蓝牙或数据线连接；2、您的手机是否使用的中国移动通讯服务并开通GPRS服务；3、您当前所在的位置是否被中国移动GSM网络覆盖并可以使用GPRS服务。<br />
　　确认以上信息满足后进行以下操作，所有的操作均基于计算机操作系统为Windows XP下，手机使用Nokia 6610，并且所有需要的驱动程序均以安装完成并可以正常使用。</p>

<p>　　<strong>第一步：配置手机GPRS连接。</strong></p>

<p>　　　　选择进入“服务”菜单，选择“设置”；<br />
　　　　选择“修改服务设置”：<br />
　　　　　　进入修改服务设置屏幕，分别输入相关信息：<br />
　　　　　　“设置组名称”设为“移动梦网GPRS”；<br />
　　　　　　“主页”设置为http：//wap.monternet.com；<br />
　　　　　　“连接类型”设为“持续连接”；<br />
　　　　　　“安全保护”设为“关”；<br />
　　　　　　“传输方式”设为“GPRS”；<br />
　　　　　　“GPRS接入点”设为“CMNET”，注意：如果使用CMWAP则无法配置成功；<br />
　　　　　　“IP地址”设为“10.0.0.172” <br />
　　　　　　“鉴权类型”设为“普通”；<br />
　　　　　　“登录类型”设为“自动”；<br />
　　　　　　“用户名”和“密码”不用设置；<br />
　　　　输入完毕按返回退到待机状态 ；<br />
　　　　在待机状态下，按“功能表”选择“服务”并进入“主页”后即可登录移动梦网主页。</p>

<p>　　<strong>第二步：建立计算机与手机间的连接。</strong></p>

<p>　　　　进入手机的“数据连通”菜单；<br />
　　　　选择“红外接口”，出现“红外接收已启动”表示成功；<br />
　　　　将手机的红外接口对准计算机的红外接口并将手机放稳；<br />
　　　　计算机会提示“附近有另一台计算机”（如下图所示），此时手机与计算机已经成功连接。<br />
　　　　<img alt="Peak Jing:: 手机与计算机成功连接" src="http://peak.name/thinking/archives/20050305_wireless_net_00.gif" width="334" height="105" /><br />
　　　　注意：如果您的计算机未安装所需要的手机中Modem驱动，则会出现“发现新硬件安装向导”，您可以根据提示进行安装，若无法找到手机中Modem驱动，请与手机供应商联系。如果需要Nokia 6610相关驱动程序可以与我联系。若不能发现红外线连接请确认您和计算机或手机配置是否正确，或是检查硬件是否可以正常工作。</p>

<p>　　<strong>第三步：在计算机上建立网络连接。</strong></p>

<p>　　　　打开计算机的“新建连接向导”（如下图）（打开方法：在桌面“网上邻居”图标上点右键选择“属性”，在打开窗口左上角点击“创建一个新的连接”），点击“下一步”；<br />
　　　　<img alt="Peak Jing:: 新建连接向导" src="http://peak.name/thinking/archives/20050305_wireless_net_01.gif" width="503" height="387" /><br />
　　　　在“网络连接类型”窗口选中“连接到Internet”（如下图），点击“下一步”；<br />
　　　　<img alt="Peak Jing:: 网络连接类型" src="http://peak.name/thinking/archives/20050305_wireless_net_02.gif" width="503" height="387" /><br />
　　　　在“您想怎样连接Internet？”窗口选中“手工设置我的连接”（如下图），点击“下一步”；<br />
　　　　<img alt="Peak Jing:: 您想怎样连接Internet？" src="http://peak.name/thinking/archives/20050305_wireless_net_03.gif" width="503" height="387" /><br />
　　　　选中“用拔号调置解调器连接”点击“下一步”（如下图）；<br />
　　　　<img alt="Peak Jing:: 用拔号调置解调器连接" src="http://peak.name/thinking/archives/20050305_wireless_net_04.gif" width="503" height="387" /><br />
　　　　输入您的“ISP名称”（例如CMNET）点击“下一步”（如下图）；<br />
　　　　<img alt="Peak Jing:: 输入您的“ISP名称”" src="http://peak.name/thinking/archives/20050305_wireless_net_05.gif" width="503" height="387" /><br />
　　　　在“要拔的电话号码”窗口中输入电话号码<strong>“*99#”</strong>点“下一步”（如下图）；<br />
　　　　<img alt="Peak Jing:: 要拔的电话号码" src="http://peak.name/thinking/archives/20050305_wireless_net_06.gif" width="503" height="387" /><br />
　　　　在“Internet帐号信息”窗口中不需要输入任何信息，直接点击“下一步”（如下图）；<br />
　　　　<img alt="Peak Jing:: Internet帐号信息" src="http://peak.name/thinking/archives/20050305_wireless_net_07.gif" width="503" height="387" /><br />
　　　　点击“完成”按钮完成连接的建立（如下图）；<br />
　　　　<img alt="Peak Jing:: 完成连接的建立" src="http://peak.name/thinking/archives/20050305_wireless_net_08.gif" width="503" height="387" /></p>

<p>　　<strong>第四步：必要的附加设置。</strong></p>

<p>　　　　打开计算机的网络连接（如下图）（打开方法：在桌面“网上邻居”图标上点右键选择“属性”），在第三步建立完成的名为CMNET连接图标上单击右键选择“属性”；<br />
　　　　<img alt="Peak Jing:: 网络连接" src="http://peak.name/thinking/archives/20050305_wireless_net_09.gif" width="508" height="510" /><br />
　　　　在“CMNET属性”窗口中确认“连接使用”下拉框中只选中了“Nokia 6610(IrDA)”（如下图），如果未选中请选中，并去除其它已选中的调置解调器；<br />
　　　　<img alt="20050305_wireless_net_10.gif" src="http://peak.name/thinking/archives/20050305_wireless_net_10.gif" width="380" height="446" /><br />
　　　　在“CMNET属性”窗口上面点击“网络”标签（如下图），选中“此连接使用下列项目”列表框中的“Internet协议(TCP/IP)”，点击“属性”；<br />
　　　　<img alt="Peak Jing:: CMNET属性" src="http://peak.name/thinking/archives/20050305_wireless_net_11.gif" width="380" height="446" /><br />
　　　　在“Internet协议(TCP/IP)属性”窗口选中“使用下面的DNS服务器地址”，并在“首选DNS服务器”中填入“<strong>211.136.17.107</strong>”（如下图），点击“确定”，再点击“CMNET属性”窗口中的“确定”完成设置。<br />
　　　　<img alt="Peak Jing:: Internet协议(TCP/IP)属性" src="http://peak.name/thinking/archives/20050305_wireless_net_12.gif" width="404" height="450" /><br />
　　　　打开计算机的“控制面板”（打开方法：“开始”菜单中选择“设置”，点击“控制面板”）（如下图），在“控制面板”窗口双击“电话和调置解调器选项”；<br />
　　　　<img alt="Peak Jing:: 控制面板" src="http://peak.name/thinking/archives/20050305_wireless_net_13.gif" width="541" height="479" /><br />
　　　　在“电话和调置解调器选项”的“调置解调器”窗口中选中“Nokia 6610 (IrDA)”点击“属性”（如下图）；<br />
　　　　<img alt="Peak Jing:: 电话和调置解调器选项" src="http://peak.name/thinking/archives/20050305_wireless_net_14.gif" width="404" height="396" /><br />
　　　　在“Nokia 6610 (IrDA)　属性”窗口的高级标签中输入“<strong>at+cgdcont=1,"ip","cmnet"</strong>”额外的初始化命令，点击“确定”，再点击“电话和调置解调器选项”窗口中的“确定”完成设置。<br />
　　　　<img alt="Peak Jing:: Nokia 6610 (IrDA)　属性" src="http://peak.name/thinking/archives/20050305_wireless_net_15.gif" width="404" height="437" /></p>

<p>　　<strong>第五步：拔号上网和断线。</strong></p>

<p>　　　　祝贺您，终于完成了四步复杂的设置了，现在我们就要开始感受无线上网的喜悦了，这一步也是今后无线上网唯一要做的事。<br />
　　　　在“网络连接”窗口（打开方法：在桌面“网上邻居”图标上点右键选择“属性”）中双击“CMNET”图标，打开“CMNET连接”窗口（如下图），点击“拔号”开始拔号；<br />
　　　　<img alt="Peak Jing:: CMNET连接" src="http://peak.name/thinking/archives/20050305_wireless_net_16.gif" width="348" height="430" /><br />
　　　　屏幕右下角出现连接“CMNET 已连接”提示表示已经成功连接（如下图），Oh!Yeah!<br />
　　　　<img alt="Peak Jing:: 连接成功" src="http://peak.name/thinking/archives/20050305_wireless_net_17.gif" width="174" height="70" /></p>

<p>　　　　在网上处理完您高成本的业务后一定要记得断线，否则有可能会支付高额的费用，方法很简单，在屏幕右下角的连接图标上点右键选择“断开”即可，或直接将手机拿开（如果是蓝牙连接拿开方法不可行）。</p>

<p>　　<strong>最后祝您移动上网愉快！</strong></p>]]>

</content>
</entry>
<entry>
<title>setTimeout Method( From MSDN Library)</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2005/01/settimeout_meth.html" />
<modified>2005-01-11T03:52:03Z</modified>
<issued>2005-01-11T03:50:38Z</issued>
<id>tag:peak.name,2005:/thinking//2.592</id>
<created>2005-01-11T03:50:38Z</created>
<summary type="text/plain">setTimeout Method Evaluates an expression after a specified number of milliseconds has elapsed. Syntax iTimerID = window .setTimeout( vCode , iMilliSeconds [ , sLanguage ] ) Parameters vCode Required. Variant that specifies the function pointer or string that indicates the...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Resource</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<h1>setTimeout Method </h1>
<p>Evaluates an expression after a specified number of milliseconds has elapsed. </p>
<p><strong>Syntax</strong> </p>
<blockquote>
  <p><em>iTimerID </em> = <em>window </em><strong>.setTimeout( </strong><em>vCode </em><strong>, </strong><em>iMilliSeconds </em><strong> [ </strong><strong>, </strong><em>sLanguage </em><strong>] </strong><strong>) </strong>
  </p>
</blockquote>
<p><strong>Parameters</strong> </p>
<table>
  <tr bgcolor="#E8E8E8">
    <td><em>vCode </em></td>
    <td>Required. <strong>Variant </strong> that specifies the function pointer or string that indicates the code to be executed when the specified interval has elapsed. </td>
  </tr>
  <tr bgcolor="#E8E8E8">
    <td><em>iMilliSeconds </em></td>
    <td>Required. <strong>Integer </strong> that specifies the number of milliseconds. </td>
  </tr>
  <tr bgcolor="#E8E8E8">
    <td><em>sLanguage </em></td>
    <td bgcolor="#E8E8E8">Optional. <strong>String </strong> that specifies one of the following values:
        <table>
          <tr>
            <td>JScript </td>
            <td>Language is JScript. </td>
          </tr>
          <tr>
            <td>VBScript </td>
            <td>Language is VBScript. </td>
          </tr>
          <tr>
            <td>JavaScript </td>
            <td>Language is JavaScript. </td>
          </tr>
      </table></td>
  </tr>
</table>
<p><strong>Return Value </strong></p>
<blockquote>
  <p>Integer. Returns an identifier that cancels the evaluation with the clearTimeout method. </p>
</blockquote>
<p><strong>Remarks</strong> </p>
<blockquote>
  <p>In versions earlier than Microsoft® Internet Explorer 5, the first argument of <strong>setTimeout </strong> must be a string. Evaluation of the string is deferred until the specified interval elapses. </p>
  <p>As of Internet Explorer 5, the first argument of <strong>setTimeout </strong> can be a string or a function pointer. </p>
  <p>The specified expression or function is evaluated once. For repeated evaluation, use the setInterval method. </p>
  <p>When you use the <strong>setTimeout </strong> method with Introduction to DHTML Behaviors , the value of <em>vCode </em>should be a function pointer to call a function within the HTML Component (HTC) file or a string to call a function in the primary document. </p>
</blockquote>
<p><strong>Examples</strong> </p>
<blockquote>
  <p>The following example uses the <strong>setTimeout </strong> method to evaluate a simple expression after one second has elapsed. </p>
  <p>window. setTimeout ("alert('Hello, world')", 1000); </p>
  <p>The following example uses the <strong>setTimeout </strong> method to evaluate a slightly more complex expression after one second has elapsed. </p>
  <p>var sMsg = "Hello, world"; window. setTimeout ("alert(" + sMsg + ")", 1000); </p>
  <p>This example uses the <strong>setTimeout </strong> method to hide a input type=button object after three seconds. If the user clicks the Count Down button and then counts to three, the Now You See Me button disappears. </p>
  <p>&lt;SCRIPT&gt; function fnHide(oToHide){ window. setTimeout ("fnHide2(" + oToHide.id + ")", 3000); } function fnHide2(sID){ var o = eval(sID); o.style.display="none"; } &lt;/SCRIPT&gt; &lt;INPUT TYPE=button VALUE="Count Down" ID="oHideButton" onclick="fnHide(this)"&gt;
  </p>
  <p>This example uses a function pointer to pass the data. In this case, the data is stored in a global variable because it cannot be passed directly. In the preceding example, the ID of the button is passed as a parameter to the function invoked by the <strong>setTimeout </strong> method. This is possible only when a string is passed as the first argument. </p>
  <p>&nbsp;</p>
</blockquote>
<p><strong>Standards Information </strong></p>
<blockquote>
  <p>There is no public standard that applies to this method. </p>
</blockquote>
<p><strong>Applies To </strong></p>
<table>
  <tr bgcolor="#E8E8E8">
    <td width="47%" valign="top"><table width="355" cellspacing="1">
      <tr>window </tr>
      <tr>Platform Version </tr>
      <tr>
        <td>Win16: </td>
        <td>3.02 </td>
      </tr>
      <tr>
        <td>Win32: </td>
        <td>3.02 </td>
      </tr>
      <tr>
        <td>Windows CE: </td>
        <td>4.0 </td>
      </tr>
      <tr>
        <td>Unix: </td>
        <td>4.0 </td>
      </tr>
      <tr>
        <td>Mac: </td>
        <td>3.02 </td>
      </tr>
      <tr>
        <td colspan="2">Version data is listed when the mouse hovers over a link, or the link has focus. </td>
      </tr>
    </table></td>
    <td width="53%" class="controls">window </td>
  </tr>
  <tr bgcolor="#E8E8E8">
    <td colspan="2" class="controls">Move the mouse pointer over an element in the Applies To list to display availability information for the listed platforms. Internet Explorer does not expose this member on platforms that are not listed. </td>
  </tr>
</table>]]>

</content>
</entry>
<entry>
<title>Hotmail邮箱终于升级到2G</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2004/11/hotmaileccaec2g.html" />
<modified>2004-11-18T05:06:38Z</modified>
<issued>2004-11-18T04:51:05Z</issued>
<id>tag:peak.name,2004:/thinking//2.560</id>
<created>2004-11-18T04:51:05Z</created>
<summary type="text/plain">　　微软在半年前就承诺Hotmail邮箱会升级空间到250M，结果一直延期，到现在也没有兑现其承诺。前段时间网上流传原来后缀msn.com的Verizon MSN用户由可升级至2G，但未得到证实。 　　Hotmail邮箱本人一共有几个，MSN Messenger和Mail是完全分开的，所以帐号类型也较多。今天发现个人邮箱的空间已经升级到2G，检查自己的几个邮箱，发现本次升级还是Verizon MSN用户，原有普通的Homtail用户（2M空间）并未得到升级。 点击图片可在新窗口中浏览完整图片 　　看看上面的图片（点击此处或是图片可浏览完整图片）上写的文字，写的是“您现在已经用了 2000 MB 可用存储空间的 11.2 MB。”，估计是写反了，不管怎么样Hotmail邮箱终于升级到2G。 　　在升级后还多出来一个“Messenger”操作菜单，估计是这Hotmail Plus中提供的功能。...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Internet</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p><img alt="Peak Jing:: Verizon MSN logo" src="http://peak.name/thinking/archives/20041118_VerizonMSN_logo.gif" width="140" height="60" align="right" />　　微软在半年前就承诺<a href="http://www.hotmail.com/" target="_blank">Hotmail</a>邮箱会升级空间到250M，结果一直延期，到现在也没有兑现其承诺。前段时间网上流传原来后缀msn.com的<a href="http://www.verizon.com/" target="_blank">Verizon</a> MSN用户由可升级至2G，但未得到证实。<br />
　　Hotmail邮箱本人一共有几个，MSN Messenger和Mail是完全分开的，所以帐号类型也较多。今天发现个人邮箱的空间已经升级到2G，检查自己的几个邮箱，发现本次升级还是Verizon MSN用户，原有普通的Homtail用户（2M空间）并未得到升级。</p>

<p><a href="http://peak.name/thinking/archives/20041118_hotmail_2g.gif" target="_blank"><img alt="Peak Jing:: Hotmail邮箱终于升级到2G" src="http://peak.name/thinking/archives/20041118_hotmail_2g_small.gif" width="228" height="115" /></a> 点击图片可在新窗口中浏览完整图片</p>

<p>　　看看上面的图片（<a href="http://peak.name/thinking/archives/20041118_hotmail_2g.gif" target="_blank">点击此处或是图片可浏览完整图片</a>）上写的文字，写的是“您现在已经用了 2000 MB 可用存储空间的 11.2 MB。”，估计是写反了，不管怎么样Hotmail邮箱终于升级到2G。<br />
　　在升级后还多出来一个“Messenger”操作菜单，估计是这Hotmail Plus中提供的功能。</p>]]>

</content>
</entry>
<entry>
<title>Yahoo用户5元即可体验网上购物</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2004/11/yahooc5aeecaeec.html" />
<modified>2004-11-14T10:44:59Z</modified>
<issued>2004-11-14T10:13:31Z</issued>
<id>tag:peak.name,2004:/thinking//2.555</id>
<created>2004-11-14T10:13:31Z</created>
<summary type="text/plain">　　Yahoo电邮正在举行“雅虎！mail嘉年华 百万好礼乐翻天”活动，只要是Yahoo电邮用户就有资格参加。方法很简单，首先登录Yahoo电邮（或新注册），然后点击“电邮用户兑奖”按钮即可完成当前奖品的领取。本周（11月13日-11月21日）的奖品是10元卓越网礼品券，现在卓越网全站购物免运费，那么就是说这10元礼品券就等同于现金了。10元礼品券有的效期为2004年11月13日-2004年11月30日，购物满15元即可使用。 　　10元礼品券使用举例，刚刚在卓越网订购塔罗奥义(随书附赠全套塔罗牌)，普通用户价为16元，VIP用户价为15元，使用10元礼品券支付，货到付款只需6元（VIP仅需5元）。 　　尚未体验过网上购物的Yahoo用户现在有机会用这种方式体验一次，购买一件15元商品仅需支付5元，快快行动，机会难得。 　　注意：在Yahoo电邮兑奖后不会立即收到奖品信息的邮件，需要至少30分钟后才能收到。...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Internet</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p><img alt="Peak Jing:: Yahoo用户5元即可体验网上购物" src="http://peak.name/thinking/archives/20041114_yahoomail.gif" width="226" height="75" align="right" />　　Yahoo电邮正在举行“<a href="http://cn.mail.yahoo.com/event/promotion_2004/promotion.html" target="_blank">雅虎！mail嘉年华 百万好礼乐翻天</a>”活动，只要是Yahoo电邮用户就有资格参加。方法很简单，首先登录Yahoo电邮（或新注册），然后点击“电邮用户兑奖”按钮即可完成当前奖品的领取。本周（11月13日-11月21日）的奖品是10元卓越网礼品券，现在<a href="http://www.joyo.com/?source=24holnet" target="_blank">卓越网</a>全站购物免运费，那么就是说这10元礼品券就等同于现金了。10元礼品券有的效期为2004年11月13日-2004年11月30日，购物满15元即可使用。<br />
　　10元礼品券使用举例，刚刚在卓越网订购<a href="http://www.joyo.com/shopbook/bkbk307048.asp?source=24holnet&prodid=bkbk307048">塔罗奥义(随书附赠全套塔罗牌)</a>，普通用户价为16元，VIP用户价为15元，使用10元礼品券支付，货到付款只需6元（VIP仅需5元）。<br />
　　尚未体验过网上购物的Yahoo用户现在有机会用这种方式体验一次，购买一件15元商品仅需支付5元，快快行动，机会难得。</p>

<p>　　<strong>注意：在Yahoo电邮兑奖后不会立即收到奖品信息的邮件，需要至少30分钟后才能收到。</strong></p>]]>

</content>
</entry>
<entry>
<title>当当vs卓越促销方法</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2004/10/vseaee.html" />
<modified>2004-10-31T03:38:09Z</modified>
<issued>2004-10-30T12:48:17Z</issued>
<id>tag:peak.name,2004:/thinking//2.541</id>
<created>2004-10-30T12:48:17Z</created>
<summary type="text/plain">　　不记得卓越网是从什么时候开始限时抢购活动，每隔一个时间周期换一些促销商品，时间周期一般是48小时、72小时、几天或一周。这样的促销手段确实起到一定的作用，利用人们喜欢购买一些较为实惠的产品而带动更多其它商品的销售，并可以进一步拉拢用户。今日收到当当网的促销邮件，便进入当当网站浏览，竟然看到一些与卓越很相似的“页面”（卓越网促销页面、当当网促销页面），经过确认确实是当当网。 　　其实营销手段的模仿是很平常的事儿，在商界的案例也有很多，更有青取之于蓝而胜于蓝的商家。这次当当网和卓越网促销方法的相似也应该是正常的商业行为，但其宣传词上有几个相驳之处，搜狐商城也有类似的宣传词（不过只出现在其广告图片上）： 　　卓越网：震撼出击　谁敢比我低 　　当当网：劲价风暴　我比谁都低 　　搜狐商城：　　　　谁都没我低 　　卓越网：精品1元起（全场购物满66元加1元赠卡通梳子镜子两件套） 　　当当网：绝对1元起（《寻找周杰伦》1元） 　　卓越网：货比三家　网上底价 72小时底价抢购 　　当当网：货比百家　网上无底价　抢购不限时 　　搜狐商城：货比千家 网上最低价 　　看来两家网站主要的竞争是价格，那么究竟谁的价格占优势呢？在同一个促销商品页面上有几种是相同的，我们来对比一下： 　　丁丁历险记(11DVD)：卓越网36.00元，当当网32.40元 　　《达芬奇密码》：卓越网19.00元，当当网17.64元 　　仙剑奇侠传三外传—问情篇（标准版）：卓越网58元，当当网52.20元 　　看来当当网是有备而来，果然重复的商品真的做到了“我比谁都低”，这种“承诺”兑现的还不错。同行之间一定会存在竞争的，但如此针锋相对是不是有些不恰当呢？两个网站是国内B2C业务的领头羊，这样做促销好象有恶意竞争之嫌。这次不但广告词是相对的，就连页面都做成相近的。商业竞争可以为最终消费者带来暂时的利益，但长久这样会为整个行业带来负面影响，希望这样的情况只是一次巧合。 当当网促销页面截图 卓越网促销页面截图...</summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>IT</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p>　　不记得<a href="http://www.joyo.com/?source=24holnet" target="_blank">卓越网</a>是从什么时候开始限时抢购活动，每隔一个时间周期换一些促销商品，时间周期一般是48小时、72小时、几天或一周。这样的促销手段确实起到一定的作用，利用人们喜欢购买一些较为实惠的产品而带动更多其它商品的销售，并可以进一步拉拢用户。今日收到<a href="http://www.dangdang.com/" target="_blank">当当网</a>的促销邮件，便进入当当网站浏览，竟然看到一些与卓越很相似的“页面”（<a href="http://www.joyo.com/static2/guoqing_041029_bj.asp?source=24holnet" target="_blank">卓越网促销页面</a>、<a href="http://www.dangdang.com/zhuanti/mfx_qyl041020.asp" target="_blank">当当网促销页面</a>），经过确认确实是当当网。<br />
　　其实营销手段的模仿是很平常的事儿，在商界的案例也有很多，更有青取之于蓝而胜于蓝的商家。这次当当网和卓越网促销方法的相似也应该是正常的商业行为，但其宣传词上有几个相驳之处，<a href="http://store.sohu.com/" target="_blank">搜狐商城</a>也有类似的宣传词（不过只出现在其广告图片上）：<br />
<div class="quote">　　卓越网：震撼出击　谁敢比我低<br />
　　当当网：劲价风暴　我比谁都低<br />
　　搜狐商城：　　　　谁都没我低 </p>

<p>　　卓越网：精品1元起（全场购物满66元加1元赠卡通梳子镜子两件套）<br />
　　当当网：绝对1元起（《寻找周杰伦》1元）</p>

<p>　　卓越网：货比三家　网上底价 72小时底价抢购<br />
　　当当网：货比百家　网上无底价　抢购不限时<br />
　　搜狐商城：货比千家 网上最低价</div><br />
　　看来两家网站主要的竞争是价格，那么究竟谁的价格占优势呢？在同一个促销商品页面上有几种是相同的，我们来对比一下：<br />
<div class="quote">　　丁丁历险记(11DVD)：卓越网36.00元，当当网32.40元<br />
　　《达芬奇密码》：卓越网19.00元，当当网17.64元<br />
　　仙剑奇侠传三外传—问情篇（标准版）：卓越网58元，当当网52.20元</div><br />
　　看来当当网是有备而来，果然重复的商品真的做到了“我比谁都低”，这种“承诺”兑现的还不错。同行之间一定会存在竞争的，但如此针锋相对是不是有些不恰当呢？两个网站是国内B2C业务的领头羊，这样做促销好象有恶意竞争之嫌。这次不但广告词是相对的，就连页面都做成相近的。商业竞争可以为最终消费者带来暂时的利益，但长久这样会为整个行业带来负面影响，希望这样的情况只是一次巧合。<br />
<img alt="Peak Jing:: 当当网促销页面截图" src="http://peak.name/thinking/archives/20041030_joyodangdang_1.jpg" width="500" height="620" /><br />
当当网促销页面截图<br />
<img alt="Peak Jing:: 卓越网促销页面截图" src="http://peak.name/thinking/archives/20041030_joyodangdang_2.jpg" width="500" height="645" /><br />
卓越网促销页面截图<br />
</p>]]>

</content>
</entry>
<entry>
<title>FREE iSeminar Invite - Service-Oriented Architecture</title>
<link rel="alternate" type="text/html" href="http://peak.name/thinking/archives/2004/10/free_iseminar_i.html" />
<modified>2004-10-21T14:44:07Z</modified>
<issued>2004-10-21T14:42:08Z</issued>
<id>tag:peak.name,2004:/thinking//2.532</id>
<created>2004-10-21T14:42:08Z</created>
<summary type="text/plain"></summary>
<author>
<name>Peak</name>

<email>jingfs@hotmail.com</email>
</author>
<dc:subject>Resource</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://peak.name/thinking/">
<![CDATA[<p><img alt="Peak Jing:: FREE iSeminar Invite - Service-Oriented Architecture" src="http://peak.name/thinking/archives/20041021_Oracle-iSeminars.gif" width="598" height="824" /></p>]]>

</content>
</entry>

</feed>
