﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-舜亚科技-专注于.net 技术</title><link>http://www.cnblogs.com/suryani/</link><description>Providing Custom Software Solution Since 1997</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 08:42:07 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 08:42:07 GMT</pubDate><ttl>60</ttl><item><title>技术茶话会主题：Microsoft Reporting Service步步为营 V1</title><link>http://www.cnblogs.com/suryani/archive/2009/05/24/1488299.html</link><dc:creator>Suryani</dc:creator><author>Suryani</author><pubDate>Sun, 24 May 2009 08:25:00 GMT</pubDate><guid>http://www.cnblogs.com/suryani/archive/2009/05/24/1488299.html</guid><description><![CDATA[<p>阅读: 678 评论: 0 作者: <a href="http://www.cnblogs.com/suryani/" target="_blank">Suryani</a> 发表于 2009-05-24 16:25 <a href="http://www.cnblogs.com/suryani/archive/2009/05/24/1488299.html" target="_blank">原文链接</a></p><p id="descAll" style="display: block">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft&nbsp;SQL&nbsp;Server&nbsp;2005&nbsp;Reporting&nbsp;Services（SSRS）是基于服务器的报表平台，可以用来创建和管理包含关系数据源和多维数据源中的数据的表格、矩阵、图形和自由格式的报表。可以通过基于Internet的链接来查看、管理所创建的报表。本文通过图文的方式，形象的介绍了Reporting&nbsp;Services，并通过一些简单的范例，帮助读者快速掌握Reporting&nbsp;Services的使用和开发技巧。 </p>
<p style="display: block">&nbsp;</p>
<p style="display: block">&nbsp;</p><img src="http://www.cnblogs.com/suryani/aggbug/1488299.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/suryani/archive/2009/05/24/1488299.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/suryani/archive/2009/05/24/1488299.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>技术茶话会主题：ASP.NET应用程序性能调优</title><link>http://www.cnblogs.com/suryani/archive/2009/04/27/1444501.html</link><dc:creator>Suryani</dc:creator><author>Suryani</author><pubDate>Mon, 27 Apr 2009 04:11:00 GMT</pubDate><guid>http://www.cnblogs.com/suryani/archive/2009/04/27/1444501.html</guid><description><![CDATA[<p>阅读: 328 评论: 5 作者: <a href="http://www.cnblogs.com/suryani/" target="_blank">Suryani</a> 发表于 2009-04-27 12:11 <a href="http://www.cnblogs.com/suryani/archive/2009/04/27/1444501.html" target="_blank">原文链接</a></p>&nbsp;&nbsp;&nbsp; 随着.NET技术的日益成熟，基于ASP.NET构建的Web应用程序越来越多。对于中小企业来说，这些项目进展到中后期，性能问题往往变成一个比较突出的、急需解决的问题。因此，性能考虑必须贯穿在日常的编码中，性能监控要列入QA日常工作，每个程序员都要懂得如何做性能调优。Website性能往往与程序性能、数据量、浏览器性能负载、服务器负载、网络带宽等都有关系。本次茶话会主要从程序性能角度探讨如何性能调优，以及在编码过程中如何遵循代码规范。本文从工具、调优、性能瓶颈等方面深入探讨如何进行ASP.NET应用程序性能调优 <embed src="http://www.docin.com/DocinViewer-15671517-144.swf" width="650" height="490" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"></embed> <img src="http://www.cnblogs.com/suryani/aggbug/1444501.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/suryani/archive/2009/04/27/1444501.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/suryani/archive/2009/04/27/1444501.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>[项目总结-原创]InternetRadio项目Ajax技术方案选型</title><link>http://www.cnblogs.com/suryani/archive/2008/09/03/1282676.html</link><dc:creator>Suryani</dc:creator><author>Suryani</author><pubDate>Wed, 03 Sep 2008 02:32:00 GMT</pubDate><guid>http://www.cnblogs.com/suryani/archive/2008/09/03/1282676.html</guid><description><![CDATA[<p>阅读: 1500 评论: 3 作者: <a href="http://www.cnblogs.com/suryani/" target="_blank">Suryani</a> 发表于 2008-09-03 10:32 <a href="http://www.cnblogs.com/suryani/archive/2008/09/03/1282676.html" target="_blank">原文链接</a></p><font face="Verdana">
<p><br />
<strong>1&nbsp;综述</strong></p>
<strong></strong>
<p><br />
InternetRadio项目是一个基于Web2.0理念的面向大众的音乐共享站点，其大量使用了Ajax功能来提高用户的体验效果，并提高数据传输的效率，典型的比如Autosuggest、添加音乐评论等。为了便于相关代码的集中控制，InternetRadio项目从底层封装、Ajax框架选型、代码管理等方面加以控制。<br />
&nbsp;&nbsp;Ajax框架选型：Prototype提供Ajax封装，Script.aculo.us提供UI封装。<br />
&nbsp;&nbsp;代码集中管理：在App_Code/BusinessHandler.cs中统一控制Ajax内容的输出。<br />
&nbsp;&nbsp;Server端底层实现：利用C#的反射机制，实现Ajax客户端对Server端API的调用。</p>
<p><br />
<strong>1.1&nbsp;Ajax和UI框架选型</strong></p>
<p><br />
InternetRadio选用Prototype（http://www.prototypejs.org/）作为底层Ajax底层框架，包括Ajax API封装和 Javascript扩展；另外选择Script.aculo.us（http://script.aculo.us/）作为UI框架，利用其包括Autosuggest等在内的UI特性。<br />
另外，作为辅助，增加Javascript/AjaxPublic.js进一步封装Prototype API，提供一系列方法简化Ajax客户端调用，比如PreparePostData()、AjaxGetFromUrl()、AjaxGetFromUrlSynchronous()等。</p>
<p><br />
<strong>1.2&nbsp;基于反射的Ajax远程调用实现</strong></p>
<p><br />
与Ajax.NET Professional（http://www.ajaxpro.info/）类似，InternetRadio项目也支持Ajax客户端对Server端API的直接调用，比如：<br />
&nbsp;&nbsp;&nbsp; function Init() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Ajax.Autocompleter(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&lt;%=KeywordTextBox.ClientID %&gt;',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'AutoSuggestion',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '../BusinessHandler/AutosuggestForKeywordSearch.ajax',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tokens:",",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramName:"ajax_keyword",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callback: AutoSuggestionCallback<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
}<br />
在上述代码中，Ajax直接调用Server端BusinessHandler类的AutosuggestForKeywordSearch方法。Suryani.Ajax Project提供了上述调用的支持和实现。<br />
&nbsp;&nbsp;提供Suryani.Ajax.Service.ServiceManager.Register(string package, Type serviceType)方法，用于注册要开放给客户端Ajax调用的类。ServiceManager将所注册的类保存在全局变量modules中。<br />
&nbsp;&nbsp;开放Suryani.Ajax.Utility.AjaxConfiguration.Register(Dictionary&lt;string, Type&gt; source)供Global.asax调用，用于在Website启动时向Server注册全部要开放给客户端调用的类。AjaxConfiguration.Register()方法调用ServiceManager.Register()方法完成所有类的注册。<br />
&nbsp;&nbsp;增加Suryani.Ajax.Service.AjaxMethodAttribute自定义标签类，用于标识要开放给客户端调用的类方法。Suryani.Ajax.Service.ServiceManager.Register()方法将遍历所注册类的全部方法，将附加AjaxMethod自定义标签的所有方法保存在modules全局变量中，以备客户端Ajax调用。<br />
&nbsp;&nbsp;提供Suryani.Ajax.Service.AjaxHttpHandler自定义HttpHandler类，拦截来自客户端的所有Ajax 请求（该请求的URL以".ajax"结尾），解析URL，利用反射的原理从全局变量modules中获取已注册的类和方法，并将执行结果输出到客户端。</font></p>
<p><font face="Verdana"><img height="134" alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/Ajax/Initialize.jpg" width="614" border="0" />&nbsp;</font></p>
<p><font face="Verdana"></font></p>
<p><font face="Verdana">初始化并注册类</font></p>
<p align="left"><font face="Verdana"></font><img height="256" alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/Ajax/InvokeProcess.jpg" width="801" border="0" />&nbsp;</p>
<p><font face="Verdana"></font></p>
<p><font face="Verdana">Ajax远程调用Server端API的过程</font></p>
<p>&nbsp;</p>
<p><font face="Verdana"><strong>1.3&nbsp;Ajax代码集中管理</strong></font></p>
<font face="Verdana">
<p><br />
由于InternetRadio项目中大量用到Ajax功能，客户端Ajax可以直接调用Server端的API，而且每一个Ajax请求都需要Server端根据请求组织要交付Browser端的内容。为了对这些代码集中管理，我们在App_Code中增加了BusinessHandler类，作为Browser端与Server端的中介，负责请求的响应和内容的组织。而且整个项目中，只开放BusinessHandler供客户端直接调用调用。比如：<br />
/// &lt;summary&gt;<br />
/// 根据标签关键词搜索对应的标签<br />
/// &lt;/summary&gt;<br />
/// &lt;param name="keyword"&gt;&lt;/param&gt;<br />
&nbsp;[AjaxMethod]<br />
public string FindTagsByKeyword(string keyword)<br />
{<br />
&nbsp;&nbsp;&nbsp; StringBuilder builder = new StringBuilder();<br />
&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IList&lt;Tag&gt; tags = TagManager.FindTagsByKeyword(keyword);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tags != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.Append("&lt;ul&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (Tag tag in tags)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.Append(string.Format(CultureInfo.CurrentCulture, "&lt;li&gt;{0}&lt;/li&gt;", tag.TagName));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.Append("&lt;/ul&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; catch { }<br />
&nbsp;&nbsp;&nbsp;&nbsp; return builder.ToString();<br />
}</p>
<p><br />
<strong>1.4&nbsp;典型应用</strong></p>
<p><br />
<strong>1.4.1&nbsp;简单的Ajax应用：添加歌曲标签</strong></p>
<p><br />
URL：http://nyxm.vicp.net:5052/Music/Music.aspx?MusicId=26553 <br />
功能描述：为当前歌曲添加相应的自定义标签<br />
程序主文件：UserControl/MusicInfoControl.ascx<br />
代码流程：<br />
&nbsp;&nbsp;单击"保存"按钮：SaveTagButtonOnClick()<br />
function SaveTagButtonOnClick()<br />
{<br />
&nbsp;&nbsp;&nbsp; var tagName = $('&lt;%= TagNameTextBox.ClientID %&gt;').value;<br />
&nbsp;&nbsp;&nbsp; var musicId=$('&lt;%= MusicIdHiddenField.ClientID %&gt;').value;<br />
&nbsp;&nbsp;&nbsp; var url = "/BusinessHandler/AddTag.ajax?ajax_tagName=" + encodeURIComponent(tagName) + "&amp;ajax_musicId="+musicId;<br />
&nbsp;&nbsp;&nbsp; AjaxGetFromUrl(url,SaveTagCallBack);<br />
&nbsp;&nbsp;&nbsp; $('&lt;%= TagNameTextBox.ClientID %&gt;').value="";<br />
}<br />
调用AjaxGetFromUrl()方法，通过Prototype向Server端发起Ajax请求。<br />
&nbsp;&nbsp;AjaxHttpHandler拦截到Ajax请求，执行BusinessHandler.AddTag()方法，向Browser输出以&lt;span&gt;形式组织的标签列表：<br />
/// &lt;summary&gt;<br />
/// 添加歌曲的标签<br />
/// &lt;/summary&gt;<br />
/// &lt;param name="tagName"&gt;&lt;/param&gt;<br />
/// &lt;param name="musicId"&gt;&lt;/param&gt;<br />
[AjaxMethod]<br />
public string AddTag(string tagName, int musicId)<br />
{<br />
&nbsp;&nbsp;&nbsp; int userId = ContextAccessor.Current.UserId;<br />
&nbsp;&nbsp;&nbsp; string createBy = ContextAccessor.Current.UserName;<br />
&nbsp;&nbsp;&nbsp; TagManager.Add(tagName, createBy, musicId, userId);<br />
&nbsp;&nbsp;&nbsp; IList&lt;Tag&gt; tags = TagManager.FindTagsByMusicId(musicId);<br />
&nbsp;&nbsp;&nbsp; StringBuilder returnString = new StringBuilder();<br />
&nbsp;&nbsp;&nbsp; foreach (Tag tag in tags)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;returnString.Append("&lt;span&gt;");<br />
&nbsp;returnString.Append(PageContentBuilder.BuildTagSearchLink(tag.TagName, tag.TagName));<br />
&nbsp;returnString.Append("&lt;/span&gt;&amp;nbsp;&amp;nbsp;\n");<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return returnString.ToString();<br />
}<br />
&nbsp;&nbsp;回调函数SaveTagCallBack()检测到 Server端返回的标签列表，将其呈现在页面上：<br />
function SaveTagCallBack(request)<br />
{&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; $('TagListDiv').innerHTML = request.responseText;<br />
}<br />
&nbsp;<br />
<strong><img height="124" alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/Ajax/AjaxTag.jpg" width="487" border="0" /></strong></p>
<p><strong></strong>&nbsp;</p>
<p><strong>1.4.2&nbsp;结合Script.aculo.us的应用：Autosuggest</strong></p>
<p><br />
URL：http://nyxm.vicp.net:5052/Index.aspx <br />
功能描述：根据关键词框的输入，自动提示补录。<br />
程序主文件：UserControl/ QuickSearchControl.ascx<br />
代码流程：<br />
&nbsp;&nbsp;页面初始化：<br />
当页面载入的时候，利用Script.aculo.us的Autocompleter控件实现对关键词输入框的监控。<br />
function Init() {<br />
&nbsp;&nbsp;&nbsp; new Ajax.Autocompleter(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&lt;%=KeywordTextBox.ClientID %&gt;',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'AutoSuggestion',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '../BusinessHandler/AutosuggestForKeywordSearch.ajax',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tokens:",",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramName:"ajax_keyword",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callback: AutoSuggestionCallback<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; );<br />
}<br />
Event.observe(window,'load',Init);<br />
&nbsp;&nbsp;当用户在关键词输入框输入关键词时，Autocompleter控件向Server端发起Ajax请求，检索提示内容。AjaxHttpHandler拦截该请求，执行BusinessHandler.AutosuggestForKeywordSearch()方法：<br />
/// &lt;summary&gt;<br />
/// 根据关键词检索对应的音频<br />
/// &lt;/summary&gt;<br />
/// &lt;param name="searchType"&gt;&lt;/param&gt;<br />
/// &lt;param name="keyword"&gt;&lt;/param&gt;<br />
/// &lt;returns&gt;&lt;/returns&gt;<br />
[AjaxMethod]<br />
public string AutosuggestForKeywordSearch(string searchType, string keyword)<br />
{<br />
&nbsp;&nbsp;&nbsp; if (searchType.Equals(WebConstants.Search_Player, StringComparison.OrdinalIgnoreCase))<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FindPlayersByKeyword(keyword);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; else if (searchType.Equals(WebConstants.Search_Music, StringComparison.OrdinalIgnoreCase))<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FindMusicByKeyword(keyword);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; else if (searchType.Equals(WebConstants.Search_Tag))<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FindTagsByKeyword(keyword);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return string.Empty;<br />
}<br />
Server端以无序列表&lt;ul&gt;的形式组织返回给Browser端的Autosuggest内容列表。<br />
&nbsp;&nbsp;回调函数AutoSuggestionCallback()将Autosuggest内容呈现在页面上：<br />
function AutoSuggestionCallback(obj) {<br />
&nbsp;&nbsp;&nbsp; var searchType = "Player";<br />
&nbsp;&nbsp;&nbsp; if($("&lt;%=PlayerRadioButton.ClientID %&gt;").checked == true) searchType = "Player";<br />
&nbsp;&nbsp;&nbsp; else if($("&lt;%=MusicRadioButton.ClientID %&gt;").checked == true) searchType = "Music";<br />
&nbsp;&nbsp;&nbsp; else if($("&lt;%=TagRadioButton.ClientID %&gt;").checked == true) searchType = "Tag";<br />
&nbsp;&nbsp;&nbsp; return "ajax_searchType="+searchType+"&amp;ajax_keyword="+ encodeURIComponent(obj.value);<br />
}<br />
&nbsp;<br />
</p>
</font>
<p><img height="329" alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/Ajax/Autosuggest.jpg" width="598" border="0" />&nbsp;</p>
<img src="http://www.cnblogs.com/suryani/aggbug/1282676.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/suryani/archive/2008/09/03/1282676.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/suryani/archive/2008/09/03/1282676.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>技术茶话会主题：CodeSmith&amp;NetTiers Step by Step</title><link>http://www.cnblogs.com/suryani/archive/2007/11/27/973893.html</link><dc:creator>Suryani</dc:creator><author>Suryani</author><pubDate>Tue, 27 Nov 2007 04:58:00 GMT</pubDate><guid>http://www.cnblogs.com/suryani/archive/2007/11/27/973893.html</guid><description><![CDATA[<p>阅读: 2432 评论: 6 作者: <a href="http://www.cnblogs.com/suryani/" target="_blank">Suryani</a> 发表于 2007-11-27 12:58 <a href="http://www.cnblogs.com/suryani/archive/2007/11/27/973893.html" target="_blank">原文链接</a></p><p align="center"><strong><span style="font-family: 宋体">本期茶话会主题：</span>CodeSmith&amp;NetTiers Step by Step</strong> </p>
<p><span style="font-family: 宋体">主讲</span>&amp;<span style="font-family: 宋体">文档撰写：</span>Jacob.Huang</p>
<p><span style="font-family: 宋体">文档最后统筹：</span>Jimmy.Ke</p>
<p><span style="font-family: 宋体">时间：</span>2007-11-07</p>
<p><span style="font-family: 宋体">参与人员：</span>Diapers Team &amp; Enterprise Product Team</p>
<p><strong><span style="font-family: 宋体">一</span> <span style="font-family: 宋体">技术背景</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在</span>Suryani.China<span style="font-family: 宋体">的项目中，</span>GenClaims<span style="font-family: 宋体">、</span>Warehouse<span style="font-family: 宋体">等项目以</span>Microsoft Enterprise Library<span style="font-family: 宋体">作为基础的技术架构，包括其中的</span>DataAccess Block<span style="font-family: 宋体">、</span>Logger<span style="font-family: 宋体">、</span>Exception<span style="font-family: 宋体">、</span>Encryption<span style="font-family: 宋体">、</span>Cache<span style="font-family: 宋体">等等，搭配使用</span>Open Source<span style="font-family: 宋体">的</span>MyGeneration<span style="font-family: 宋体">作为代码生成器。整体技术架构遵循三层模型，包括</span>Entity<span style="font-family: 宋体">包（实体包，与</span>Database<span style="font-family: 宋体">一一映射）、</span>Data<span style="font-family: 宋体">包（</span>Access to Database<span style="font-family: 宋体">，与数据库交互）、</span>Core<span style="font-family: 宋体">包（业务逻辑包，对</span>Data<span style="font-family: 宋体">包的简单代理以及扩展、事务实现）、</span>Web<span style="font-family: 宋体">表现层，其中</span>Entity<span style="font-family: 宋体">、</span>Data<span style="font-family: 宋体">包、</span>Core<span style="font-family: 宋体">包的大部分代码由</span>MyGeneration<span style="font-family: 宋体">自动生成，并通过</span>partial class<span style="font-family: 宋体">的方式支持自定义扩展。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">与这种存储过程和数据驱动的架构类似的解决方案是：</span>CodeSmith + NetTiers<span style="font-family: 宋体">组合。</span>CodeSmith<span style="font-family: 宋体">作为一个著名的代码生成工具，同样提供了基于模板生成</span>C#<span style="font-family: 宋体">、</span>VB.NET<span style="font-family: 宋体">、</span>TSQL<span style="font-family: 宋体">等语言代码的功能，并且支持</span>ASP.NET<span style="font-family: 宋体">语法的自定义模板；</span>NetTiers<span style="font-family: 宋体">则提供了一套成熟的基于</span>CodeSmith<span style="font-family: 宋体">的模板，在</span>Microsoft Enterprise Library<span style="font-family: 宋体">的基础上对其进行了封装和再组织，帮助开发者快速开发遵循三层架构的代码，以期在一定基础上统一并简化对</span>EL<span style="font-family: 宋体">的操作，避免重复的工作，减轻开发者的负担。本文是对本次茶话会的总结和扩展，对</span>CodeSmith<span style="font-family: 宋体">和</span>NetTiers<span style="font-family: 宋体">做一个简单的介绍。</span>Jacol.Huang<span style="font-family: 宋体">也在茶话会上分享了他的开发经验。</span></p>
<p><strong><span style="font-family: 宋体">二</span> <span style="font-family: 宋体">环境安装和配置</span></strong></p>
<p><span style="font-family: 宋体">首先从</span><a href="http://www.codesmithtools.com/">www.codesmithtools.com</a> <span style="font-family: 宋体">下载最新版本的</span>Code Smith<span style="font-family: 宋体">安装文件（</span>Professional<span style="font-family: 宋体">版本，有</span>30<span style="font-family: 宋体">天的试用期）。</span>Code Smith<span style="font-family: 宋体">有两个版本，</span>Standard <span style="font-family: 宋体">和</span> Profession<span style="font-family: 宋体">版，我们使用</span>Profession <span style="font-family: 宋体">版本，可以编辑模板。</span></p>
<p><span style="font-family: 宋体">其次从</span><a href="http://www.nettiers.com/">www.nettiers.com</a> <span style="font-family: 宋体">下载最新的</span>Net Tiers<span style="font-family: 宋体">包，</span>NetTiers<span style="font-family: 宋体">是免费的。</span></p>
<p><strong><span style="font-family: 宋体">三</span> Code Smith Step by Step</strong></p>
<p><span style="font-family: 宋体">下载</span>netTiers2.2<span style="font-family: 宋体">后，解压到目录，右击选择</span>Excute<span style="font-family: 宋体">，打开</span>CodeSmith<span style="font-family: 宋体">配置窗口。<br />
</span><span style="font-family: 宋体"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/1CodeSmithFolder.jpg" border="0" /><br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/2Excute.jpg" border="0" /><br />
在</span>CodeSmith<span style="font-family: 宋体">配置窗口中编辑配置属性，比如数据源、代码输出目录、数据源表和视图等等。<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/3Setting.jpg" border="0" /></span></p>
<p><span style="font-family: 宋体">配置完毕后点击</span>Generate<span style="font-family: 宋体">生成工程包和代码，如下图所示，包括一份生成报告</span>report.html<span style="font-family: 宋体">。<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/4Generated.jpg" border="0" /></span></p>
<p>CodeSmith<span style="font-family: 宋体">的自定义模板支持</span>ASP.NET<span style="font-family: 宋体">语法，包括命名空间的引入和属性的读取。可以在模板中定义需要引入的命名空间和</span>CodeSmith<span style="font-family: 宋体">配置界面将呈现的属性，如下图所示。<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/5ImportSpace.jpg" border="0" /><br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/6Template.jpg" border="0" /><br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/7Script.jpg" border="0" /></span></p>
<p><strong><span style="font-family: 宋体">四</span> NetTiers Step by Step</strong></p>
<p><span style="font-family: 宋体">下图是一个利用</span>NetTiers<span style="font-family: 宋体">和</span>CodeSmith<span style="font-family: 宋体">生成的解决方案的截图，其中包括</span>Web<span style="font-family: 宋体">视图（自动生成的针对单表的维护界面）、</span>Entities<span style="font-family: 宋体">实体包、</span>Services<span style="font-family: 宋体">业务逻辑包等等。<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/8Framework.jpg" border="0" /></span></p>
<p><span style="font-family: 宋体">利用</span>NetTiers<span style="font-family: 宋体">，还可以生成自定义的存储过程、视图，可以在</span>CodeSmith<span style="font-family: 宋体">配置界面中配置生成的存储过程的前缀等属性。如下图所示。<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/9Prefix.jpg" border="0" /></span></p>
<p><span style="font-family: 宋体">如果要扩展</span>NetTiers<span style="font-family: 宋体">框架生成的代码，则可以修改</span>Processor<span style="font-family: 宋体">，添加相应的扩展代码。如下图所示。<br />
<img height="140" alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/10Processor.jpg" width="208" border="0" /></span></p>
<p><strong><span style="font-family: 宋体">五</span> <span style="font-family: 宋体">与现有技术架构的比较</span></strong></p>
<p><span style="font-family: 宋体">与现有的</span>MyGeneration<span style="font-family: 宋体">自定义模板相比，利用</span>CodeSmith + NetTiers<span style="font-family: 宋体">，架构基本上遵循</span>NetTiers<span style="font-family: 宋体">所定制的结构，每次修改数据库表结构后都需要重新生成代码，并将其拷贝到解决方案的相应位置。利用</span>CodeSmith<span style="font-family: 宋体">生成的自定义存储过程也是一样。</span></p>
<p><span style="font-family: 宋体">另外，</span>NetTiers<span style="font-family: 宋体">是一个相对完善的框架，其生成的文件较多，对硬件的要求也相对较高，特别是大型系统。<br />
</span><span style="font-family: 宋体"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/CodeSmith/11Compare.jpg" border="0" /><br />
<strong>六</strong></span><strong> <span style="font-family: 宋体">技术参考</span></strong></p>
<p><span style="font-family: 宋体">参考网站：</span><a href="http://www.cnblogs.com/iCaca/category/80950.html">http://www.cnblogs.com/iCaca/category/80950.html</a> </p>
<p><span style="font-family: 宋体">博客园网友的</span>Net Tiers<span style="font-family: 宋体">系列学习笔记</span></p>
<p><span style="font-family: 宋体">关于</span>EL<span style="font-family: 宋体">的可以查看</span>MSDN<span style="font-family: 宋体">的相关</span>WebCast</p>
<p><a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/EntLib.aspx">http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/EntLib.aspx</a> </p>
<p>CodeSmith<span style="font-family: 宋体">官网：</span><a href="http://www.codesmithtools.com/">http://www.codesmithtools.com</a> </p>
<p>NetTiers<span style="font-family: 宋体">官网：</span><a href="http://www.nettiers.com/">http://www.nettiers.com</a> </p>
<p>15<span style="font-family: 宋体">分钟快速构建数据访问层：</span><a href="http://onlytiancai.cnblogs.com/archive/2006/02/16/331700.html">http://onlytiancai.cnblogs.com/archive/2006/02/16/331700.html</a> </p>
 <img src="http://www.cnblogs.com/suryani/aggbug/973893.html?type=1" width="1" height="1" alt=""/><p>评论: 6　<a href="http://www.cnblogs.com/suryani/archive/2007/11/27/973893.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/suryani/archive/2007/11/27/973893.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>需求迭代与项目风险控制(舜亚工程师Jimmy: 《程序员》2007.2期)</title><link>http://www.cnblogs.com/suryani/archive/2007/08/15/856310.html</link><dc:creator>Suryani</dc:creator><author>Suryani</author><pubDate>Wed, 15 Aug 2007 02:33:00 GMT</pubDate><guid>http://www.cnblogs.com/suryani/archive/2007/08/15/856310.html</guid><description><![CDATA[<p>阅读: 1848 评论: 6 作者: <a href="http://www.cnblogs.com/suryani/" target="_blank">Suryani</a> 发表于 2007-08-15 10:33 <a href="http://www.cnblogs.com/suryani/archive/2007/08/15/856310.html" target="_blank">原文链接</a></p><span style="FONT-SIZE: 8pt">&nbsp;<strong>Attn:</strong> 这个文章由舜亚科技的Jimmy发表在《程序员》2007.2期， 其中的案例全部引自本公司的项目。<br><span><strong>作者介绍：</strong>柯自聪/eamoi 舜亚科技软件工程师，专注于</span><span>Web</span><span>应用程序开发，关注</span><span>OA</span><span>、门户、电子政务、电子商务领域、</span><span>RIA</span><span>，著有《</span><span>Ajax</span><span>开发精要</span><span>--</span><span>概念、案例与框架》一书以及《</span><span>Ajax</span><span>开发简略》、《</span><span>Liferay Portal</span><span>二次开发指南》等开源文档。<br>个人博客：<a href="http://www.blogjava.net/eamoi">http://www.blogjava.net/eamoi</a>&nbsp;<br></span><br><strong style="FONT-SIZE: 18pt">全文：</strong><img src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/images/emteeth.gif" align=absMiddle border=0><br></span>
<p><span>软件项目是需求驱动的典型代表，项目从立项、开发、测试到交付，需求的变化迭代是很正常的事情，这点对于大型项目尤其明显。需求迭代如果控制不好，很容易增大项目的风险，导致项目的失败。与国内的很多软件公司相似，笔者所参与的项目也存在需求迭代的问题。本文从需求迭代入手，结合项目实际，探讨需求迭代与项目风险控制的关系，希望项目需求有序迭代。</span></p>
<h2><a name=_Toc156632762><span style="FONT-SIZE: 12pt">需求迭代，不可避免的轮回</span></a></h2>
<p><span>软件项目的启动源于市场和客户的需求，通过对市场的需求调查以及典型目标客户的需求访问抽象出需求规格说明书，进而才开始原型系统的设计，经过对原型系统的评估之后启动真实系统的设计和开发。</span></p>
<p><span>在原型系统设计阶段，由于各种各样的因素，比如客户没有将实际需求表达清楚，或者需求分析人员对业务的理解有偏差，据此设计出来的原型系统可能与市场、客户的真实需求不是很匹配，那么随着原型系统构建的深入，必然触发需求的迭代。</span></p>
<p><span>在真实系统的设计和开发过程中，随着对系统的理解的深入，客户也可能对需求进行深化、扩展或者变更，研发工程师对需求的消化，这也会触发需求的迭代。</span></p>
<p><span>即使真实系统交付使用，随着业务的发展，客户的需求可能发生变化；而且客户在使用系统的过程中，必然会对系统提出进一步改进的要求，修改原有功能的操作方式，增加新的功能，这些也会要求需求的进一步迭代。</span></p>
<p><span>在这一系列的迭代过程中，如果没有很好的控制迭代的过程，评估迭代的成本，有效管理迭代的需求，那么很容易形成需求迭代无穷无尽的假象，项目团队穷于应付每一次需求迭代，项目开发高度紧张，发布日期遥遥无期，这样必然给项目带来很高的风险。</span></p>
<p><span>Diapers</span><span>项目是一个面向北美市场的电子商务站点，已经运行三年。最近客户决定对</span><span>Diapers</span><span>项目进行升级改造。项目经理或者需求分析工程师负责沟通客户，分析抽象客户的真实需求，并撰写需求说明书；软件工程师根据需求说明书拟定技术方案，并着手进行编码；测试工程师根据需求说明书和测试用例对项目进行测试；项目经理引导客户确认项目的最终功能呈现，并在必要的时候启动需求迭代过程。</span></p>
<p><span>由于</span><span>Diapers</span><span>是来自北美的外包项目，双方的沟通存在时间差，项目团队也没有条件与客户面对面的沟通。在整个项目的升级改造过程中，由于业务理解的偏差以及沟通不畅，需求经过了多次迭代；需求每迭代一次，团队成员都需要面对一堆冗长的需求说明书。由于</span><span>Diapers</span><span>已经是正式运营的站点，客户来自市场的压力同时也转嫁到项目团队身上，项目发布的压力一直困扰着团队成员。从</span><span>Diapers</span><span>项目的进展来看，需求的迭代似乎就是无穷无尽的轮回。</span></p>
<h2><a style="FONT-SIZE: 12pt" name=_Toc156632763>主动触发需求迭代</a><span style="FONT-SIZE: 12pt">，给予足够的消化时间</span></h2>
<p><span>导致</span><span>Diapers</span><span>项目的现状的主要原因是被动的进行需求迭代，迭代被动的由客户的反馈触发。每次需求迭代都可能打乱团队的开发计划，影响项目的发布，给团队带来更大的发布压力。因此，必须想方设法掌握需求迭代的主动权。</span></p>
<p><span>针对每次需求迭代给予充分的消化时间是一种有效的方式。从</span><span>Diapers</span><span>项目的情况来看，上一次需求还没有消化处理完毕，新的需求迭代又要开始了。项目发布迭代的速度根本就跟不上需求迭代的速度，新的需求一直步步进逼。在这种情况下，测试工程师压根儿就没有时间对项目进行全面的足够的测试。</span></p>
<p><span>找到问题的本质，</span><span>Diapers</span><span>项目团队开始调整发布节奏，加大人力资源投入，加快消化需求的速度；针对沟通不足的问题，项目经理集中精力与客户沟通，在双方时间交叉的部分尽量把有疑问的需求沟通清楚；发布节奏调整后，客户就有时间与项目团队同步开展测试工作，</span><span>bug</span><span>也能够在第一时间处理。调整后，项目团队有足够的时间来消化每次迭代的需求，也有足够的时间对项目进行测试。</span></p>
<p><span>尽早发布原型系统是主动触发需求迭代的另一种有效方式。原型系统通常快速构建，着重在界面的呈现和功能的模拟，通过虚拟数据模拟真实系统的运行情况。其能够在很大程度上模拟未来真实系统的呈现，在短时间内将抽象的客户需求表现出来，作为和客户进行沟通的有效媒介。相对于一堆抽象的文档，使用原型系统，客户更容易尽早发现真实系统与他们的需求之间的差距，减少未来需求迭代的次数。</span></p>
<p><span>因此，在需求抽象过程中，应该通过原型系统作为双方沟通的桥梁和媒介，双方应该先就原型系统的呈现展开讨论。另外，原型系统的发布时间也是比较重要的，在项目启动后应该尽早发布原型系统。</span></p>
<p><span>Claim</span><span>项目则是一个商业意外险理赔平台，为北美客户提供商业意外险的在线申报、理赔服务。在项目启动的初期，项目团队在理解抽象需求的基础上，第一时间发布了原型系统，使用虚拟数据模拟真实系统的界面呈现。这个项目比较有利的是，客户自己聘请了需求分析人员，能够最大程度的理解业务需求，正确的表述客户的需求，并绘制详细的原型界面；这点在双方的沟通和系统开发过程中发挥了比较显著的作用。由于</span><span>Claim</span><span>项目的需求迭代节奏一直在项目团队的可接受范围，所以项目一直有条不紊的推进，虽然需求也经过了多次迭代，但终归还在可控的范围内。</span></p>
<h2><a name=_Toc156632764><span style="FONT-SIZE: 12pt">评估每一次迭代的成本和风险</span></a></h2>
<p><span>能够预见到的是，需求的每次迭代都会不同程度的对项目产生影响，对此需要评估由此所带来的成本。不只是项目经理和需求分析工程师，软件工程师和测试工程师也应该参与这个过程，评估此次迭代是否会影响现有的技术架构，哪些功能点可能受到影响，哪些系统模块需要修改，测试用例是否应该重新编写，团队需要为此次迭代额外付出多少时间成本，是否会造成项目的延期等等。</span></p>
<p><span>评估之后，如果需求迭代对项目的进度可能造成比较明显的影响，项目经理应该和客户有效沟通，告知需求迭代的成本，尤其是时间成本。</span></p>
<p><span>另外，需求的每次迭代也必然给项目带来一定的风险，包括技术风险和发布风险。迭代后的需求可能影响原有的技术方案，尤其是核心业务逻辑的变更。团队要重新对技术方案进行梳理，检查该技术方案是否仍然可以达到既定的目的。需求迭代之后，软件工程师需要一定的时间调整开发进度，测试工程师也需要根据新的需求对系统重新测试，这必然影响项目的发布周期；作为项目经理，应该预见到这一点。</span></p>
<p><span>GS</span><span>项目是某公司重点研发的一个以政府机关行政审批业务为服务目标的产品，在其进行产品升级改造的同时，其竞争对手也在着手准备同类产品的新版本发布，市场的压力要求产品尽快完成版本的升级。但是在新产品即将进入集成测试阶段的时候，公司突然决定对产品的界面进行比较重大的调整。这一次调整导致代码和测试的返工，使该产品的发布时间推迟了两个月，错过了销售的黄金期，市场和客户对于新产品的期待已经逐渐降低，结果产品的销售量远远不如预期。如果公司之前对界面需求迭代有比较清晰的成本和风险评估，那么应该不会这么仓促的触发迭代。</span></p>
<p><span>Diapers</span><span>项目团队意识到</span><span>Diapers</span><span>项目的需求迭代的周期是比较短的，因此对于每次迭代的需求，软件工程师和测试工程师都会协同项目经理进行评估，判断消化所有需求并测试所需要投入的工作量，以及由此所可能带来的时间成本和技术风险，团队成员已经彻底摆脱了害怕需求迭代的心态。</span></p>
<h2><a name=_Toc156632765><span style="FONT-SIZE: 12pt">明确项目发布的需求边界</span></a></h2>
<p><span>软件不是十全十美的，需求的迭代是永无止境的。需求的迭代周期是不定的，与其在最终版本中包括所有的需求，不妨在这期间发布若干个小版本，明确每个小版本的需求边界。这好比长跑途中的若干个里程碑，每跨过一个里程碑就意味着向重点又前进了一步。</span></p>
<p><span>每个小版本都包含有限的功能需求，测试工程师可以针对这些功能需求同步展开测试工作，提早触发</span><span>Bug</span><span>，尽量争取测试时间。客户也可以从这些小版本中提前看到真实系统的雏形；随着版本的逐步升级，项目距离发布日期也越来越近，和需求的差距也越来越小。</span></p>
<p><span>工欲善其事，必先利其器。我们可以利用一些现成的工具来管理需求边界和跟踪</span><span>Bug</span><span>，比如</span><span>JIRA</span><span>。</span><span>JIRA</span><span>是集项目计划、任务分配、需求管理、错误跟踪于一体的商业软件，其提供了问题跟踪管理、问题跟进情况的分析报告、项目类别管理、组件</span><span>/</span><span>模块负责人、项目</span><span>email</span><span>地址等功能。许多著名的开源项目都采用了</span><span>JIRA</span><span>。</span></p>
<p><span>通过</span><span>JIRA</span><span>，可以整合客户、项目经理、开发人员、测试人员，使各种角色各司其职，团队内部信息能够很快得到交流和反馈，潜在的问题提前暴露，促进项目的可控。</span></p>
<p><span>如图</span><span>1</span><span>和图</span><span>2</span><span>所示，</span><span>JIRA</span><span>支持个项目，每个项目支持多种任务类型，比如</span><span>New Feature</span><span>、</span><span>Bug</span><span>、</span><span>Task</span><span>和</span><span>Improvement</span><span>，也允许自定义。<br></span></p>
<p align=center></p>
<p align=center><span><img height=154 alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/1.gif" width=410 border=0><br>图</span><span>1 JIRA</span><span>支持多个项目<br></span></p>
<p align=center></p>
<p align=center><span><br><img height=163 alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/2.gif" width=443 border=0><br>图</span><span>2 JIRA</span><span>支持多种任务类型</span></p>
<p><span>JIRA</span><span>以工作流的思想融合了项目管理、任务管理和缺陷管理等思维，允许设定项目的模块和版本，并为每个需求设置预期日期，将任务的处理指定到人。如图</span><span>3</span><span>所示。<br></span></p>
<p align=center></p>
<p align=center><span><span><img height=505 alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/3.gif" width=381 border=0></span><br>图</span><span>3 JIRA</span><span>将任务指定到人</span></p>
<p><span>JIRA</span><span>允许为每个项目设置优先级，比如</span><span>Blocker</span><span>、</span><span>Critical</span><span>、</span><span>Major</span><span>、</span><span>Minor</span><span>、</span><span>Trivial</span><span>，标识每个任务的重要程度，如图</span><span>4</span><span>所示。</span></p>
<p align=center></p>
<p align=center><span><img height=196 alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/4.gif" width=355 border=0><br>图</span><span>4 JIRA</span><span>支持优先级排序</span></p>
<p><span>如图</span><span>5</span><span>所示，如果任务定义了优先级，那么在每个人的桌面上，任务会自动排列。这点对于多任务的项目尤其重要。</span></p>
<p align=center></p>
<p align=center><span><img height=222 alt="" src="http://www.cnblogs.com/images/cnblogs_com/suryani/5.gif" width=534 border=0><br>图</span><span>5 JIRA</span><span>中的任务会自动排序</span></p>
<p><span>预见到需求迭代的被动性后，</span><span>Diapers</span><span>项目团队在</span><span>Diapers</span><span>项目上全面启动了</span><span>JIRA</span><span>进行项目管理，将需求分解细化后进入</span><span>JIRA</span><span>，排定任务的优先级并指定到人，确定每次小版本发布的需求编号，不定期的发布小版本。结合</span><span>SVN</span><span>等版本控制工具，</span><span>Diapers</span><span>项目团队能够将功能需求迭代的粒度控制到最小，项目逐步推进，客户对项目的进度有充分的了解，项目经理也能够准确把握项目的进度，团队中充满了乐观的情绪。</span></p>
<h2><a name=_Toc156632766><span style="FONT-SIZE: 12pt">安抚团队成员的情绪</span></a></h2>
<p><span>工程师对于冗长的需求说明书有天生的恐惧感，开发周期拉得太长，似乎需求迭代无穷无尽。如果需求的迭代周期不在可控范围之内，项目的发布边界模糊不清，项目发布的日期自然也遥遥无期。由此带来的结果是团队每天紧赶慢赶的跟踪需求迭代，消化处理新的需求，工作气氛也是高度紧张。每一次需求迭代，都会进一步增加这种紧张情绪。</span></p>
<p><span>项目经理应该把握项目的进展情况以及客户的真实需求，也要知悉客户的需求底线，更要在必要的时候安抚团队成员的情绪。</span></p>
<p><span>当原始需求第一次被抽象出来的时候，团队的第一要务是快速构建原型系统作为和客户沟通的主要媒介和依据，项目经理应该引导团队把握这一点。</span></p>
<p><span>之后的每一次需求迭代，项目经理要将需求分解细化，控制需求的粒度，并且确定优先级，消除团队成员的焦急情绪，按照先后顺序逐步的处理每一个粒度的需求，以发布每阶段的小版本为阶段性的目标。</span></p>
<p><span>在这个过程中，需求细化到最小粒度，还需要注意到每个需求之间的关联关系，关联的需求要优先集中处理，是降低每个小版本之间的耦合度。</span></p>
<p><span>Diapers</span><span>项目自从将需求细化成一个个任务并进入</span><span>JIRA</span><span>控制之后，软件工程师每天的只需要按照顺序处理</span><span>JIRA</span><span>上面的任务，并及时将代码以最小粒度的形式通过</span><span>SVN</span><span>工具提交；测试人员根据发布边界所指定的版本号从</span><span>SVN</span><span>下载最新代码测试，确认并关闭相应的任务；项目经理引导团队成员遵循规范的需求迭代程序，有条不紊的处理需求，轻松应对需求迭代。</span></p>
<p><font face="Courier New, Courier, mono" size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''~``<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( o o )<br>+------------------.oooO--(_)--Oooo.---------------------+<br>|&nbsp;Jimmy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; |<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E-mail:&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#122;&#99;&#107;&#101;&#48;&#55;&#50;&#56;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">zcke0728@gmail.com</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;|<br>|&nbsp;Suryani Tech. Inc.&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.suryani.cn/">http://www.suryani.cn</a>&nbsp;&nbsp;&nbsp;&nbsp;|<br>| Xiamen, China &nbsp;&nbsp;&nbsp;&nbsp; (&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>+---------------------\ (----(&nbsp;&nbsp; )-----------------------+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \_)&nbsp;&nbsp;&nbsp; ) /<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (_/</font><br></p>
  <img src="http://www.cnblogs.com/suryani/aggbug/856310.html?type=1" width="1" height="1" alt=""/><p>评论: 6　<a href="http://www.cnblogs.com/suryani/archive/2007/08/15/856310.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/suryani/archive/2007/08/15/856310.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>入门话题1. 在Web中控制图的显示外观？把一张500*800 的图, 显示成180*110 的小图.</title><link>http://www.cnblogs.com/suryani/archive/2007/08/15/854832.html</link><dc:creator>Suryani</dc:creator><author>Suryani</author><pubDate>Wed, 15 Aug 2007 02:10:00 GMT</pubDate><guid>http://www.cnblogs.com/suryani/archive/2007/08/15/854832.html</guid><description><![CDATA[<p>阅读: 139 评论: 2 作者: <a href="http://www.cnblogs.com/suryani/" target="_blank">Suryani</a> 发表于 2007-08-15 10:10 <a href="http://www.cnblogs.com/suryani/archive/2007/08/15/854832.html" target="_blank">原文链接</a></p><br>问题：&nbsp;在web中，如何把一张500*800 的图, 显示成180*110 的小图？<br>方法:&nbsp; a.&nbsp; 利用脚本控制. 在onload 里加个函数.&nbsp;&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">img&nbsp;</span><span style="COLOR: #ff0000">src&nbsp;</span><span style="COLOR: #0000ff">="Image/3pic2.gif"</span><span style="COLOR: #ff0000">&nbsp;style</span><span style="COLOR: #0000ff">="border:&nbsp;0"</span><span style="COLOR: #ff0000">&nbsp;width&nbsp;</span><span style="COLOR: #0000ff">="180"</span><span style="COLOR: #ff0000">&nbsp;onload</span><span style="COLOR: #0000ff">="DrawImage(this);"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;&lt;</span><span style="COLOR: #800000">&nbsp;script&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>function&nbsp;DrawImage(ImgD){&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;image=new&nbsp;Image();&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;image.src=ImgD.src;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;alert(image.width/image.height);<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;if(image.width&gt;0&nbsp;&amp;&amp;&nbsp;image.height&gt;0){<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(image.width/image.height&gt;=&nbsp;180/110){&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(image.width&gt;180){<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImgD.width=180;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImgD.height=image.height*110)/image.width;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{&nbsp;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImgD.width=image.width;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImgD.height=image.height;&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*ImgD.alt="bigpic"&nbsp;&nbsp;*/<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{&nbsp;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(image.height&gt;110){<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImgD.height=110;&nbsp;<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImgD.width=(image.width*110)/image.height;&nbsp;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{&nbsp;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImgD.width=image.width;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImgD.height=image.height;&nbsp;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*ImgD.alt="bigpic"&nbsp;&nbsp;*/&nbsp;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>}<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">&nbsp;script&nbsp;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>注意,这里设计 width="180", 注意这里最好限定, 如果不限定加载图时会生成原来大小的图,然后再缩小 .载入</p>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时屏幕会闪动<br>&nbsp;<br>&nbsp;</div>
<div>&nbsp; b. 利用CSS 控制<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #800000">&nbsp;img</span><span style="COLOR: #000000">{</span><span style="COLOR: #ff0000"><br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max-width</span><span style="COLOR: #000000">:</span><span style="COLOR: #0000ff">40px</span><span style="COLOR: #000000">;</span><span style="COLOR: #ff0000">&nbsp;//IE7&nbsp;Firefox<br></span><span style="COLOR: #008080">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #ff0000">with</span><span style="COLOR: #000000">:</span><span style="COLOR: #0000ff">express(this&gt;500)&nbsp;40px&nbsp;//IE6&nbsp;<br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;over-flow:hidden</span><span style="COLOR: #000000">;</span><span style="COLOR: #ff0000">&nbsp;<br></span><span style="COLOR: #008080">5</span>&nbsp;&nbsp;<span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">}</span><span style="COLOR: #800000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;<span style="COLOR: #800000"></span></div>
<br>讨论的话题： 1. 页面的大小有变小吗？页面加载速度呢？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 物理上把图片变小，效果如何？</div>
 <img src="http://www.cnblogs.com/suryani/aggbug/854832.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/suryani/archive/2007/08/15/854832.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/suryani/archive/2007/08/15/854832.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>舜亚茶话会(2) Ajax 和编程习惯</title><link>http://www.cnblogs.com/suryani/archive/2007/08/09/849579.html</link><dc:creator>Suryani</dc:creator><author>Suryani</author><pubDate>Thu, 09 Aug 2007 10:20:00 GMT</pubDate><guid>http://www.cnblogs.com/suryani/archive/2007/08/09/849579.html</guid><description><![CDATA[<p>阅读: 146 评论: 0 作者: <a href="http://www.cnblogs.com/suryani/" target="_blank">Suryani</a> 发表于 2007-08-09 18:20 <a href="http://www.cnblogs.com/suryani/archive/2007/08/09/849579.html" target="_blank">原文链接</a></p><div><span style="FONT-SIZE: 8pt">引言：这是公司的同事每周三的闲聊会内容，信手记下，很是粗糙。<br>欢迎参与讨论或了解更多内容，请写信到 hwx2006 # gmail.com ---) <img src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/images/emteeth.gif" align=absMiddle border=0></span><br><br>G.M. Steven ：</div>
<div style="FONT-SIZE: 10pt">1，使用安全的类型转换，不做强类型转换。</div>
<div style="FONT-SIZE: 10pt">2，关注StackTrace。</div>
<div style="FONT-SIZE: 10pt">3，UpdatePanel中的DefaultButton在Po<wbr>stBack后不正常工作问题，解决方法：在window.onload事件中捕捉onkeydown事件，在onkeydown中注册defaultButton。（启发<wbr>：可以从ViewSource里面获得很多有用的信息）。</div>
<div style="FONT-SIZE: 10pt">4，Js执行顺序，最重要的一点是自己写的JS代码最好写在Window<wbr>.Onload处，以免被系统生成的JS覆盖。<br><br>
<div style="FONT-SIZE: 10pt">Ajax Jimmy:</div>
<div style="FONT-SIZE: 10pt">1，现在我们做的项目中所使用到的Ajax技术：UpdatePa<wbr>nel，ProtoType。</div>
<div style="FONT-SIZE: 10pt">2，客户端脚本使用Hash Table，在ProtoType中有形如var a=$H();a(key)=value;的方法。</div>
<div style="FONT-SIZE: 10pt">3，IRF使用的AjaxRequest和.NET反射的比较，前者获取AjaxRequest在cs中加工数据然后返回加工后的<wbr>数据。后者形如XX.com/NCCICode/getcode.ajax?param<wbr>=value,相较前者返回的数据量少且结构简单。</div>
<div style="FONT-SIZE: 10pt">4，安全控制，通过注册开放让客户端访问服务器端的类<wbr>（小柯帮忙补充）。</div>
<div style="FONT-SIZE: 10pt">5，Response Result数据输出格式（Altlas已经封装）：</div>
<div style="FONT-SIZE: 10pt">（1）HTML格式。</div>
<div style="FONT-SIZE: 10pt">（2）Js块。</div>
<div style="FONT-SIZE: 10pt">（3）Jason</div>
<div style="FONT-SIZE: 10pt">（4）XML</div>
<div style="FONT-SIZE: 10pt">其中（1）可以直接使用，（2），（3）可以通过Eval调用。</div>
<div style="FONT-SIZE: 10pt">重点在于（3）和（4）的比较，（4）可以多包含一些约定的节点<wbr>，例如Exception等，不过速度比较慢，而且格式一定要约定<wbr>好。</div>
</div>
 <img src="http://www.cnblogs.com/suryani/aggbug/849579.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/suryani/archive/2007/08/09/849579.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/suryani/archive/2007/08/09/849579.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>舜亚茶话会(1) 把动态的页面转成html .</title><link>http://www.cnblogs.com/suryani/archive/2007/08/08/848146.html</link><dc:creator>Suryani</dc:creator><author>Suryani</author><pubDate>Wed, 08 Aug 2007 10:14:00 GMT</pubDate><guid>http://www.cnblogs.com/suryani/archive/2007/08/08/848146.html</guid><description><![CDATA[<p>阅读: 221 评论: 0 作者: <a href="http://www.cnblogs.com/suryani/" target="_blank">Suryani</a> 发表于 2007-08-08 18:14 <a href="http://www.cnblogs.com/suryani/archive/2007/08/08/848146.html" target="_blank">原文链接</a></p>主题： 首页静态化通过配置服务,自动生成 HTML页.
<div style="FONT-SIZE: 10pt"><br>问题：<br>分页面的静态化:</div>
<div style="FONT-SIZE: 10pt">比如有 <u>http://www.abc.hello.aspx<wbr>?SkuId=123</u> 的型式, google 等搜索引擎很难索引到。<br><br>方法：<br>可通过IIS配制后自动映射 成:&nbsp;<a onclick="return top.js.OpenExtLink(window,event,this)" href="" target=_blank href_cetemp><u>http://www.abc/SkuId/123.html</u></a>&nbsp;型式显示。</div>
 <img src="http://www.cnblogs.com/suryani/aggbug/848146.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/suryani/archive/2007/08/08/848146.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/suryani/archive/2007/08/08/848146.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>