<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky1.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/tupunco" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/tupunco" type="application/rss+xml"></fs:self_link><lastBuildDate>Mon, 25 Aug 2008 02:47:49 GMT</lastBuildDate><title>TUPUNCO 's BLOG</title><description>小强</description><image><url>http://www.feedsky.com/images/feedsky_logologo.gif</url><title>TUPUNCO 's BLOG</title><link>http://zhq.ahau.edu.cn/blog/</link></image><link>http://zhq.ahau.edu.cn/blog/</link><language>zh-cn</language><copyright>Copyright 2005 PBlog3 v2.8</copyright><item><title>[转载]关于三种主流WEB架构的思考</title><link>http://item.feedsky.com/~feedsky/tupunco/~1217914/107419858/1219638/1/item.html</link><description>&lt;p&gt;原文地址: &lt;a title=&quot;http://hi.baidu.com/dreamname502/blog/item/4692f5823a32a5b96c8119da.html&quot; href=&quot;http://hi.baidu.com/dreamname502/blog/item/4692f5823a32a5b96c8119da.html&quot;&gt;http://hi.baidu.com/dreamname502/blog/item/4692f5823a32a5b96c8119da.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;做WEB好几年了，各种语言和技术都稍有涉猎。今天心血来潮，突然想总结一下。其实不论什么技术，什么需求，通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库，很多东西都是相通的。这里说的WEB架构，是指WEB应用开发中每种技术独有的资源组织形式（包括文件，数据库，HTTP请求处理等。注意并非OO的开发方式才有架构一说），也许说开发方式更容易让人理解一些。&lt;/p&gt;  &lt;p&gt;以下想法主要以PHP实现为示例，但很多体会我想Java，.NET，Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的&lt;a href=&quot;http://blog.csdn.net/Haohappy2004/archive/2007/04/27/1586799.aspx&quot;&gt;Delphi fo PHP的评测&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;WEB程序的架构基本上可以分成以下三类：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;(一) &lt;strong&gt;基于“WEB页面/文件”，&lt;/strong&gt;例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里，与URL相对应。当HTTP请求提交至服务器时，URL直接指向某个文件，然后由该文件来处理请求，并返回响应结果。&lt;/p&gt;  &lt;p&gt;比如&lt;a href=&quot;http://www.website.conm/news/readnews.php?id=1234&quot;&gt;http://www.website.conm/news/readnews.php?id=1234&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;可以想像，我们在站点根目录的news目录下放置一个readnews.php文件。&lt;/p&gt;  &lt;p&gt;这种开发方式最自然，最易理解，也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好，不过你可以用服务器提供的URL重写方案来处理，例如Apache的mod_rewrite。&lt;/p&gt;  &lt;p&gt;(二) &lt;strong&gt;基于“动作”(Action)。&lt;/strong&gt;这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java)，Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action)，由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样，都是请求/响应驱动的方案，离不开HTTP。&lt;/p&gt;  &lt;p&gt;比如 &lt;a href=&quot;http://www.website.com/news/read/id/1234&quot;&gt;http://www.website.com/news/read/id/1234&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;可以想像在实际代码中，我们会有一个控制器newsController，其中有一个readAction。不同框架可能默认实现方式稍有不同，有的是一个Controller一个文件，其中有多个Action，有的是每个Action一个文件。当然这些你都可以自己控制，题外话。&lt;/p&gt;  &lt;p&gt;这种方式的URL通常都很漂亮，对搜索引擎友好，因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。&lt;/p&gt;  &lt;p&gt;另外，还有更直接的基于URL的设计方案，那就是REST。通过人为规定URL的构成形式（比如Action限制成只有几种）来促进网站之间的互相访问，降低开发的复杂性，提高系统的可伸缩性。REST对于Web Services来说是一个创新。&lt;/p&gt;  &lt;p&gt;虽然本文讨论的是单个项目所采用的架构，而REST是为了解决网站之间的通讯问题，但REST的出现，会对单个项目的架构造成影响（很显然你在开发时就要构造规范的URL）。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持，Zend Framework也提供了Zend_Rest来支持REST，包括Server和Client。&lt;/p&gt;  &lt;p&gt;(三) &lt;strong&gt;基于“组件”（Component ，GUI设计也常称控件）、事件驱动的架构&lt;/strong&gt;，最常见的是微软的.NET。基本思想是把程序分成很多组件，每个组件都可以触发事件，调用特定的事件处理器来处理（比如在一个HTML按钮上设置onClick事件链接到一个PHP函数）。这种设计远离HTTP，HTTP请求完全抽象，映射到一个事件。&lt;/p&gt;  &lt;p&gt;事实上这种设计原本最常应用于传统桌面GUI程序的开发，例如Delphi，Java Swing等。所有表现层的组件比如窗口，或者HTML表单都可以由IDE来提供，我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件，并且添加一个相应的事件处理器。&lt;/p&gt;  &lt;p&gt;这种开发方式有几个优点：&lt;/p&gt;  &lt;p&gt;· 复用性 -代码高度可重用。&lt;/p&gt;  &lt;p&gt;· 易于使用 -通常只需要配置控件的属性，编写相关的事件处理函数。&lt;/p&gt;  &lt;p&gt;我个人也挺喜欢这种方式，PEAR就提供了相当强大的HTML_QuickForm，用于在页面添加表单元素及其事件处理函数，还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能，在项目中的某些部份使用QuickForm，有时可以大大加快开发。&lt;/p&gt;  &lt;p&gt;而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜，PRADO就是一个这样的框架，曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢？&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;我觉得主要有以下两个问题：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;(1)效率问题&lt;/p&gt;  &lt;p&gt;这里指的不是开发效率，而是代码的执行效率。众所周知，正常情况下，PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存，可以说很多站点根本不能使用Prado这样的框架，比如门户网站，大型论坛等。&lt;/p&gt;  &lt;p&gt;但ASP .NET不太一样，因为它是编译型的框架，最后生成的代码是编译生成的，不需要再次进行中间过程的诸多处理，所以在第一次执行之后速度会很快，执行效率还是很高的。 这是语言层次的功能，Prado无法通过代码层次的努力完全弥补。&lt;/p&gt;  &lt;p&gt;(2)没有强大的IDE支持&lt;/p&gt;  &lt;p&gt;设置控件的属性，添加其对应的事件处理器，看似简单，但控件多了，这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来，设置属性很方便，事件处理器也会自动添加。Prado目前没有这样的IDE支持。&lt;/p&gt;  &lt;p&gt;总之，这种基于控件的框架比较适合于用户交互较多的，需要对页面中的很多组件设置不同处理操作，但对于性能要求不高的应用。另外，带有组件支持的框架通常对AJAX的支持都较好，比如.NET和Ruby on Rails。&lt;/p&gt;  &lt;p&gt;综上，三种架构基本上可以代表目前的所有主流WEB开发方式，包括PHP,JavaEE,.NET,Ruby/RoR。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;目前PHP开发的状况和未来的趋势：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;平时做PHP比较多，特别总结一下PHP开发的趋势。目前在PHP开发中，我们最常用的是基于“文件”的架构，其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线，让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗，所以如果程序太抽象，调整视觉效果就比较困难。所以对于小项目，这是一个最好的选择。&lt;/p&gt;  &lt;p&gt;但越来越多人认识到，面向对象和MVC框架更能促进代码的复用和分享，而且程序易于扩展，随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework，各自拥有活跃的社区和庞大的用户群，都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路，致力于快速开发，而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟，加上PHP原本开发社区的庞大人数，将来也许又会再产生出一些行业性的标准。&lt;/p&gt;  &lt;p&gt;这种选择适合于中大型项目，特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。&lt;/p&gt;  &lt;p&gt;而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力，例如Codegear的Delphi for PHP，就吸引了很多人的关注。如果有强大的商业支持，也许将来在开发市场也会占一席之地。&lt;/p&gt;  &lt;p&gt;我会在下一篇文章介绍D4P的新特性并作评测。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;WEB开发的未来展望：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;随着更贴近HTTP的REST的流行，我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。&lt;/p&gt;  &lt;p&gt;AJAX是一把双刃剑，尽管事件驱动的架构看起来非常适合于处理异步的请求（可以想像页面中存在几个组件，每个组件都可以触发异步请求，对应对服务器端的某个事件处理器，看起来是很理想的一个处理方式），但要为客户端自动生成良好的JavaScript代码是很不容易的，要满足各种浏览器的兼容性要求，还要能够自己进行扩展，以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果，而不是在服务器端生成。在服务器端生成JS的两个结果，一是对生成的代码不信任，二是人变傻，因为你并不知道真正发生了什么。&lt;/p&gt;  &lt;p&gt;(一点牢骚也贴上来)    &lt;br /&gt;&lt;strong&gt;关于WEB开发的个人疑惑：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;l 为了让开发更简单，我们不得不学习使用复杂的开发工具和框架，这到底是一个进步，还是退步？&lt;/p&gt;  &lt;p&gt;l IDE让程序员变聪明还是变傻？ 当我们在服务器代码里面就可以设计客户端界面，这是一个进步还是退步？&lt;/p&gt;  &lt;p&gt;举个例子说，微软的ASP.NET AJAX，让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript，不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果，靠IDE和框架无法自动完成，你要怎么办？ 到这个时候再来学JS，也许就迟了。更可怕的是，技术在更新和淘汰，可能十年之后，你会发现自己除了各种IDE之后，真正精通的技术很少，脱离了IDE你写一个小程序都要查半天API手册，因为你平时都是依赖“自动补齐”来写代码的！ 这样的情景，我想没有人愿意发生。&lt;/p&gt;  &lt;p&gt;也许对于短期开发的项目来说，是一个进步，但对于程序员个人的成长来说，这并不是好事。对工具的依赖，导致了我们对于底层和核心技术的不求甚解，限制了个人的成长。&lt;/p&gt;</description><category>网摘</category><pubDate>Mon, 25 Aug 2008 10:47:49 +0800</pubDate><author>tupunco@163.com(tupunco)</author><guid isPermaLink="false">http://zhq.ahau.edu.cn/blog/default.asp?id=453</guid><dc:creator>tupunco@163.com(tupunco)</dc:creator><fs:srclink>http://zhq.ahau.edu.cn/blog/article/453.htm</fs:srclink><fs:srcfeed>http://zhq.ahau.edu.cn/blog/feed.asp</fs:srcfeed><fs:itemid>feedsky/tupunco/~1217914/107419858/1219638</fs:itemid></item><item><title>提取 SWF 中的音频</title><link>http://item.feedsky.com/~feedsky/tupunco/~1217914/105616469/1219638/1/item.html</link><description>&lt;p&gt;好久没有更新博客了, 原因有好多, 天气热人烦躁是一个方面, 最大原因是自己懒得写. 本篇博文其实一个月之前就计划写了, 但每次开了头就感觉没有必要写下去了. 不废话了切入正题.&lt;/p&gt;  &lt;p&gt;从 SWF 中提取音频的起因是想下载国内某音乐推荐站的音乐, 但赖于此站点推荐的音乐基本都被转化成了 SWF 格式的文件形式, 所以突发奇想能不能把 SWF 的音频给提取出来. 经过资料的搜集和准备, 最后还是成功了一半, 虽然并不是所有 SWF 内的音频可以正确的提取出来, 但对 MP3 格式的音频提取已经做的很完美了.&lt;/p&gt;  &lt;p&gt;首先找到的一个处理 SWF 的类库 &lt;a title=&quot;SwfDotNet&quot; href=&quot;http://sourceforge.net/projects/swfdotnet/&quot; target=&quot;_blank&quot;&gt;SwfDotNet&lt;/a&gt;, 本类库支持读写 SWF 7.0 之前(包括)的文件, 官方网站: &lt;a title=&quot;http://sourceforge.net/projects/swfdotnet/&quot; href=&quot;http://sourceforge.net/projects/swfdotnet/&quot;&gt;http://sourceforge.net/projects/swfdotnet/&lt;/a&gt;. 基于 &lt;a href=&quot;http://www.gnu.org/copyleft/gpl.html&quot; target=&quot;_blank&quot;&gt;GPL&lt;/a&gt; 协议的开源 .Net 类库, 本类库RC1 已经好长时间了, 两年已经没有人维护了, 虽然不是很完美不过已经足够了.&lt;/p&gt;  &lt;p&gt;因为在提取的中途出了点小波折, 所以后来又找到了 SWF 的格式规范&amp;lt;SWF File Format Specification V9&amp;gt;. 从 &lt;a title=&quot;Adobe&quot; href=&quot;http://www.Adobe.com&quot; target=&quot;_blank&quot;&gt;Adobe&lt;/a&gt; 官方得到.&lt;/p&gt;  &lt;p&gt;SWF 文件格式中音频可以分为两大类:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Event sounds &lt;/li&gt;    &lt;li&gt;Streaming sounds &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;SWF 中的各个元素在其二进制文件中都是以TAG的形式存在的.&amp;#160; 对于音频来说涉及到的TAG大概有以下几种:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SoundStreamHead2 Tag &lt;/li&gt;    &lt;li&gt;SoundStreamHead Tag &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;SoundStreamBlock Tag&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;StartSound Tag &lt;/li&gt;    &lt;li&gt;StartSound2 Tag &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;DefineSound Tag&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;其中只有 SoundStreamBlock Tag 和 DefineSound Tag 会包含实际的音频流, 其他的都是用来标识用的. &lt;/p&gt;  &lt;p&gt;SoundStreamBlock TAG 存放 Streaming sounds 类型的音频. 在某个 SWF 文件时间轴内如果有 SoundStreamBlock 格式的TAG , 那么在第一个 SoundStreamBlock TAG 之前必须包括一个 SoundStreamHead2 TAG 或者 SoundStreamHead TAG, 只有这样才能标记其后的 SoundStreamBlock TAG 内的音频格式/记住回放格式/每个SoundStreamBlock TAG的平均取样数等信息.往往, 对于一个 SWF 文件有多个SoundStreamBlock&amp;#160; TAG 组成一个组来共同存放一个音频文件. SoundStreamHead TAG 内的StreamSoundCompression 字段标识其后的 SoundStreamBlock&amp;#160; TAG 包含的音频格式, 可以存放以下音频格式:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;1 = ADPCM      &lt;br /&gt;SWF 4 和以后版本:       &lt;br /&gt;2 = MP3&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;SoundStreamHead2 TAG中的StreamSoundCompression 字段标识的音频格式可以有:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;0 = uncompressed      &lt;br /&gt;1 = ADPCM       &lt;br /&gt;SWF 4 或以后版本:       &lt;br /&gt;2 = MP3       &lt;br /&gt;3 = uncompressed little-endian       &lt;br /&gt;SWF 6 或以后版本:       &lt;br /&gt;6 = Nellymoser&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;SoundStreamBlock&amp;#160; TAG 的 StreamSoundData 字段存放音频的实际数据流, 其音频数据流的存放方式依赖于其前的SoundStreamHead TAG/SoundStreamHead2 TAG 的StreamSoundCompression 字段标识, 对于不同的音频格式其存放的规则不一样. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;这里有一个小小的问题, 在实际测试的时候并没有发现用SoundStreamHead2 TAG 标识的SoundStreamBlock&amp;#160; TAG , 大概是自己对 &amp;lt;SWF 格式规范&amp;gt;没有读好, 读懂.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Event sounds 格式的音频以 DefineSound 的TAG 形式存在, 并且一个 SWF 文件可以包含多个 DefineSound TAG.&amp;#160; 每个 DefineSound TAG 存放一个单独的音频文件, 每个 DefineSound TAG 包含一个本 TAG 内存放音频的格式的属性(SoundFormat). DefineSound TAG 存放的音频格式有: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;0 = uncompressed      &lt;br /&gt;1 = ADPCM       &lt;br /&gt;SWF 4 或以后版本:       &lt;br /&gt;2 = MP3       &lt;br /&gt;3 = uncompressed little-endian       &lt;br /&gt;SWF 6 或以后版本:       &lt;br /&gt;6 = Nellymoser&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;似乎和SoundStreamHead2 TAG 标识的一样. 测试发现在一个拥有DefineSound TAG 的SWF文件之前往往有一个SoundStreamHead2 TAG , 其后紧跟第一个DefineSound TAG. &lt;a title=&quot;SwfDotNet&quot; href=&quot;http://sourceforge.net/projects/swfdotnet/&quot; target=&quot;_blank&quot;&gt;SwfDotNet&lt;/a&gt; 在处理 DefineSound TAG 的时候直接定义了一个 &lt;a href=&quot;http://zhq.ahau.edu.cn/blog/SwfDotNet.IO.Tags.DefineSoundTag.DecompileToFile.html&quot;&gt;DecompileToFile&lt;/a&gt; 方法, 可以把其中的音频直接导出到一个文件.&lt;/p&gt;  &lt;p&gt;StartSound Tag 和 StartSound2 Tag 跟在 DefineSound TAG 之后用来开始播放音频, 对实际的提取没有多大的帮助.&lt;/p&gt;  &lt;p&gt;根据以上个规制: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SoundStreamHeadTag 之后跟多个SoundStreamBlock&amp;#160; TAG 包含一个音频文件; &lt;/li&gt;    &lt;li&gt;SoundStreamBlock&amp;#160; TAG 的 SoundData 字段存放音频文件数据; &lt;/li&gt;    &lt;li&gt;DefineSound TAG&amp;#160; 直接导出音频文件. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;写的提取代码为以下:&lt;/p&gt;  &lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;color: green&quot;&gt;//导出 Sound
&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;if &lt;/span&gt;(_SwfFile.Tags != &lt;span style=&quot;color: blue&quot;&gt;null&lt;/span&gt;)
{
    &lt;span style=&quot;color: blue&quot;&gt;foreach &lt;/span&gt;(&lt;span style=&quot;color: #2b91af&quot;&gt;BaseTag &lt;/span&gt;tag &lt;span style=&quot;color: blue&quot;&gt;in &lt;/span&gt;_SwfFile.Tags)
    {
        &lt;span style=&quot;color: green&quot;&gt;//流方式的Sound
        &lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;if &lt;/span&gt;(tag &lt;span style=&quot;color: blue&quot;&gt;is &lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;SoundStreamHeadTag&lt;/span&gt;)
        {
            &lt;span style=&quot;color: #2b91af&quot;&gt;SwfProcessUtility&lt;/span&gt;.OutSoundStreamBlock((tag &lt;span style=&quot;color: blue&quot;&gt;as &lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;SoundStreamHeadTag&lt;/span&gt;).StreamSoundCompression, outPath, _SwfFile.Tags);
            &lt;span style=&quot;color: green&quot;&gt;//break;
        &lt;/span&gt;}
        &lt;span style=&quot;color: green&quot;&gt;//直接的声音 可以直接导出
        &lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;if &lt;/span&gt;(tag &lt;span style=&quot;color: blue&quot;&gt;is &lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;DefineSoundTag&lt;/span&gt;)
        {
            &lt;span style=&quot;color: #2b91af&quot;&gt;SwfProcessUtility&lt;/span&gt;.OutDefineSoundTag((tag &lt;span style=&quot;color: blue&quot;&gt;as &lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;DefineSoundTag&lt;/span&gt;), outPath);
        }
    }
}&lt;/pre&gt;
&lt;a href=&quot;http://11011.net/software/vspaste&quot;&gt;&lt;/a&gt;

&lt;p&gt;SwfProcessUtility 类中定义了多个静态方法来出来 TAG, 源代码为:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;using &lt;/span&gt;System;
&lt;span style=&quot;color: blue&quot;&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style=&quot;color: blue&quot;&gt;using &lt;/span&gt;System.Text;
&lt;span style=&quot;color: blue&quot;&gt;using &lt;/span&gt;System.IO;

&lt;span style=&quot;color: blue&quot;&gt;using &lt;/span&gt;SwfDotNet.IO;
&lt;span style=&quot;color: blue&quot;&gt;using &lt;/span&gt;SwfDotNet.IO.Tags;

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

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

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

&lt;ol&gt;
  &lt;li&gt;SoundStreamBlock TAG 的 SoundData 字段存放一个 MP3STREAMSOUNDDATA 结构的数据; &lt;/li&gt;

  &lt;li&gt;MP3STREAMSOUNDDATA 拥有一个 UI16 格式的 SampleCount 字段; &lt;/li&gt;

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

  &lt;li&gt;MP3SOUNDDATA 的结构有两个字段, 第一个为 SI16 格式的 SeekSamples, 第二个为 Mp3Frames. &lt;/li&gt;

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

  &lt;li&gt;UI16 和 SI16 格式都为 2 byte , 加起来 4 byte; &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;所以就有了代码内的:&lt;/p&gt;

&lt;p&gt;stream.Write(buffer, 4, buffer.Length - 4); &lt;/p&gt;

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

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

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

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

&lt;p&gt;下载: [&lt;a title=&quot;http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=4312000&quot; href=&quot;http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=4312000&quot;&gt;http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=4312000&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;为奥运健儿加油!&lt;/p&gt;

  &lt;p&gt;TUPUNCO&lt;/p&gt;

  &lt;p&gt;2008.08.19&lt;/p&gt;

  &lt;p&gt;好运每一天.&lt;/p&gt;&lt;/blockquote&gt;</description><category>原创</category><pubDate>Wed, 20 Aug 2008 08:27:25 +0800</pubDate><author>tupunco@163.com(tupunco)</author><guid isPermaLink="false">http://zhq.ahau.edu.cn/blog/default.asp?id=452</guid><dc:creator>tupunco@163.com(tupunco)</dc:creator><fs:srclink>http://zhq.ahau.edu.cn/blog/article/452.htm</fs:srclink><fs:srcfeed>http://zhq.ahau.edu.cn/blog/feed.asp</fs:srcfeed><fs:itemid>feedsky/tupunco/~1217914/105616469/1219638</fs:itemid></item><item><title>怎样跨 ASP.NET V1.1 与 ASP.NET V2.0 应用程序共享验证 Cookies</title><link>http://item.feedsky.com/~feedsky/tupunco/~1217914/105616470/1219638/1/item.html</link><description>&lt;p&gt;原文地址: &lt;a title=&quot;http://weblogs.asp.net/scottgu/archive/2005/12/10/432851.aspx&quot; href=&quot;http://weblogs.asp.net/scottgu/archive/2005/12/10/432851.aspx&quot;&gt;http://weblogs.asp.net/scottgu/archive/2005/12/10/432851.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;原文讲的不是很清楚, 文章下面一位 &lt;a href=&quot;http://www.lmi.org&quot;&gt;Sam Stange&lt;/a&gt; 网友的回复有很大提示作用. 不过这位网友的回复好像有错误, 因为ASP.NET V1.1 配置文件&amp;lt;machineKey /&amp;gt;节点中根本没有decryption属性. 不过这个网友提供了一个生成machineKey的地方: &lt;a href=&quot;http://aspnetresources.com/tools/keycreator.aspx&quot;&gt;http://aspnetresources.com/tools/keycreator.aspx&lt;/a&gt;, 选择 &lt;a title=&quot;3DES&quot; href=&quot;http://en.wikipedia.org/wiki/Triple_DES&quot; target=&quot;_blank&quot;&gt;3DES&lt;/a&gt; 方式.&lt;/p&gt;  &lt;p&gt;自己测试的结果为, ASP.NET 2.0 程序提供一个登录口, 1.1程序由这个登录口登录, 具体配置代码如下.&lt;/p&gt;  &lt;p&gt;V2.0 Web.Config:&lt;/p&gt;  &lt;pre class=&quot;code&quot;&gt;    &lt;span style=&quot;color: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;authentication &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;mode&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;Forms&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;forms &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;.ASPNETAUTH&lt;/span&gt;&amp;quot; &lt;span style=&quot;color: red&quot;&gt;loginUrl&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;UserLogin.aspx&lt;/span&gt;&amp;quot; &lt;span style=&quot;color: red&quot;&gt;timeout&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;20160&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;authentication&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;&amp;gt;
    &amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: green&quot;&gt;ASP.NET 1.1 &amp;amp; 2.0 共享登录使用&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;--&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515&quot;&gt;machineKey &lt;/span&gt;&lt;span style=&quot;color: red&quot;&gt;validationKey&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;579FBC553DA6A4ED5752F39EC612BCCFC91F62513D37C7D460D4D883AC6A396FC3C5D0B7E589F22AAD5F79458793BDF74544C7FC34AD65A468108511C7BBB2BA&lt;/span&gt;&amp;quot;
    &lt;span style=&quot;color: red&quot;&gt;decryptionKey&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;9143F872799C1EACA5EC634D31495C015AAC830D3951702D&lt;/span&gt;&amp;quot;
                &lt;strong&gt;&lt;span style=&quot;color: red&quot;&gt;validation&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;SHA1&lt;/span&gt;&amp;quot;  &lt;span style=&quot;color: red&quot;&gt;decryption&lt;/span&gt;&lt;span style=&quot;color: blue&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;color: blue&quot;&gt;3DES&lt;/span&gt;&amp;quot;&lt;/strong&gt; &lt;span style=&quot;color: blue&quot;&gt;/&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;a href=&quot;http://11011.net/software/vspaste&quot;&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;V1.1 Web.Config:&lt;/p&gt;

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

&lt;p&gt;&lt;/p&gt;

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

&lt;h4&gt;Caching &lt;/h4&gt;

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

&lt;h4&gt;Controls &lt;/h4&gt;

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

&lt;h4&gt;Database &lt;/h4&gt;

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

&lt;h4&gt;Dates &lt;/h4&gt;

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

&lt;h4&gt;Debugging &lt;/h4&gt;

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

&lt;h4&gt;Email &lt;/h4&gt;

&lt;pre&gt;  * &lt;a href=&quot;http://wiki.lessthandot.com/index.php/ASP.NET:_Send_an_email&quot;&gt;ASP.NET: Send an email&lt;/a&gt; ASP.NET 发邮件&lt;/pre&gt;
&lt;a name=&quot;Encryption&quot;&gt;&lt;/a&gt;

&lt;h4&gt;Encryption &lt;/h4&gt;

&lt;pre&gt;  * &lt;a href=&quot;http://wiki.lessthandot.com/index.php/ASP.NET:_Encrypt_a_string_using_MD5&quot;&gt;ASP.NET: Encrypt a string using MD5&lt;/a&gt; 使用 MD5 加密字符串&lt;/pre&gt;
&lt;a name=&quot;Files&quot;&gt;&lt;/a&gt;

&lt;h4&gt;Files &lt;/h4&gt;

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

&lt;h4&gt;Images &lt;/h4&gt;

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

&lt;h4&gt;Javascript &lt;/h4&gt;

&lt;pre&gt;  * &lt;a href=&quot;http://wiki.lessthandot.com/index.php/ASP.NET:_Register_a_javascript_function&quot;&gt;ASP.NET: Register a javascript function&lt;/a&gt; 往页面注册一个 javascript 函数&lt;/pre&gt;
&lt;a name=&quot;Objects_and_Classes&quot;&gt;&lt;/a&gt;

&lt;h4&gt;Objects and Classes &lt;/h4&gt;

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

&lt;h4&gt;Pages &lt;/h4&gt;

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

&lt;h4&gt;Sessions &lt;/h4&gt;

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

&lt;h4&gt;Strings &lt;/h4&gt;

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

&lt;h4&gt;Validation &lt;/h4&gt;

&lt;pre&gt;  * &lt;a href=&quot;http://wiki.lessthandot.com/index.php/ASP.NET:_Using_Page.IsValid&quot;&gt;ASP.NET: Using Page.IsValid&lt;/a&gt; 使用 Page.IsValid&lt;/pre&gt;
&lt;a name=&quot;Visual_Studio&quot;&gt;&lt;/a&gt;

&lt;h4&gt;Visual Studio &lt;/h4&gt;

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

&lt;h4&gt;Web &lt;/h4&gt;

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

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

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

&lt;p&gt;核心代码为:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

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

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

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

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

&lt;p&gt;&amp;#160;&lt;/p&gt;

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

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;TUPUNCO&lt;/p&gt;

  &lt;p&gt;2008-06-25&lt;/p&gt;

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