<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[H31Home RSS]]></title>
<link>http://h31home.com/rss/</link>
<description><![CDATA[In 2008,H31Home Will Do The Best!   创造机会的人是勇者；等待机会的人是愚者]]></description>
<language>zh-cn</language>
<copyright>Copyright 2006-2008 H31Home.com</copyright>
<webMaster><![CDATA[H31H31@163.com(H31Home)]]></webMaster>
<generator>H31Home Rss v2.0</generator> 
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47330</link>
<title><![CDATA[挂上这家伙，猛车狂飙70码无人敢挡]]></title>
<author>uygnaf</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-11 10:43:39</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47330</guid>
<description><![CDATA[ <p><img border=0 src="http://img.diglog.com/img/2010/3/middle_b270d9af32404778b65523575a5ba92b.jpg" /></p><br/>在自家车屁股上挂上这家伙，狂飙70码无人敢挡，上班不再迟到<br/><br/>原始链接:http://xiabuy.com/2010/03/ballon-car.html<br/>diglog链接:http://www.diglog.com/story/entertainment_other_332364.html  ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47331</link>
<title><![CDATA[10个愚蠢的小配件]]></title>
<author>yleo</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-11 9:46:31</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47331</guid>
<description><![CDATA[ <p><img border=0 src="http://img.diglog.com/img/2010/3/middle_e80f11eea9104ea1b16d062bc0590112.jpg" /></p><br/>10个愚蠢的小配件(厕所高尔夫—— 拉shi的时候也可以运动哦)<br/><br/>原始链接:http://hi.baidu.com/yleo550/blog/item/4e3af2ff9eb28f1d08244da7.html<br/>diglog链接:http://www.diglog.com/story/technology_gadgets_332352.html  ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47319</link>
<title><![CDATA[CLR 与 C++的常用类型转换笔记]]></title>
<author>Davy.xu</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-11 9:37:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47319</guid>
<description><![CDATA[ <p></p> <p>1. System::String 转换到 const wchar_t*</p> <div class="csharpcode">&nbsp;</div> <div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">const</span> wchar_t* ToUnmanagedUnicode( System::String^ str )</pre><pre><span class="lnum">   2:  </span>{</pre><pre class="alt"><span class="lnum">   3:  </span>    pin_ptr&lt;<span class="kwrd">const</span> WCHAR&gt; nativeString1  = PtrToStringChars( str );</pre><pre><span class="lnum">   4:  </span>    <span class="kwrd">return</span> (<span class="kwrd">const</span> wchar_t*)nativeString1;</pre><pre class="alt"><span class="lnum">   5:  </span>}</pre></div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p>&nbsp;</p>
<p>2.&nbsp; const wchar_t* / const char* 转换到 System::String</p>
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">const</span> wchar_t* p= L<span class="str">"hello"</span>;</pre></div>
<div class="csharpcode"><pre><span class="lnum">   2:  </span>&nbsp;</pre></div>
<div class="csharpcode"><pre class="alt"><span class="lnum">   3:  </span>System::String( p ).ToString();</pre></div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p>&nbsp;</p>
<p>3.&nbsp; C++数值类型转CLR数值类型</p>
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">int</span> a;</pre><pre><span class="lnum">   2:  </span>&nbsp;</pre><pre class="alt"><span class="lnum">   3:  </span>System::Int32 b = System::Int32( a );</pre></div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p>&nbsp;</p>
<p>4. HWND 转为IWin32Window</p>
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">ref</span> <span class="kwrd">class</span> WindowWrapper : System::Windows::Forms::IWin32Window</pre><pre><span class="lnum">   2:  </span>{</pre><pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">public</span>: WindowWrapper(IntPtr handle)</pre><pre><span class="lnum">   4:  </span>    {</pre><pre class="alt"><span class="lnum">   5:  </span>        _hwnd = handle;</pre><pre><span class="lnum">   6:  </span>    }</pre><pre class="alt"><span class="lnum">   7:  </span>&nbsp;</pre><pre><span class="lnum">   8:  </span><span class="kwrd">public</span>:</pre><pre class="alt"><span class="lnum">   9:  </span>    property IntPtr Handle</pre><pre><span class="lnum">  10:  </span>    {</pre><pre class="alt"><span class="lnum">  11:  </span>        <span class="kwrd">virtual</span> IntPtr get(<span class="kwrd">void</span>){<span class="kwrd">return</span> _hwnd;};</pre><pre><span class="lnum">  12:  </span>    };</pre><pre class="alt"><span class="lnum">  13:  </span>&nbsp;</pre><pre><span class="lnum">  14:  </span>    <span class="kwrd">private</span>: IntPtr _hwnd;</pre><pre class="alt"><span class="lnum">  15:  </span>};</pre><pre><span class="lnum">  16:  </span>&nbsp;</pre><pre class="alt"><span class="lnum">  17:  </span>HWND nativehwnd;</pre><pre><span class="lnum">  18:  </span>IWin32Window^ w = gcnew Managed::WindowWrapper( System::IntPtr( nativehwnd ) );</pre></div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style><img src ="http://www.cppblog.com/sunicdavy/aggbug/109406.html" width = "1" height = "1" /><br><br><div align=right>Davy.xu 2010-03-11 09:37 发表评论</div> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47312</link>
<title><![CDATA[控制台输出螺旋型数字]]></title>
<author>elite_lcf</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-11 1:48:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47312</guid>
<description><![CDATA[ <p>阅读: 43 评论: 1 作者: elite_lcf 发表于 2010-03-11 01:48 原文链接</p><p>先上最终效果图</p><p><img src="http://images.cnblogs.com/cnblogs_com/hanyulcf/%E6%97%A0%E6%A0%87%E9%A2%98.jpg" width="453" height="489" alt="" />&nbsp;</p><p>&nbsp;</p><p>对输入的指定数组规模做一个螺旋型的数字输出：</p><p>假设输入3，输出如下：</p><p>1 &nbsp;2 &nbsp;3 </p><p>8 &nbsp;9 &nbsp;4</p><p>7 &nbsp;6 &nbsp;5</p><p>&nbsp;</p><p><img src="http://images.cnblogs.com/cnblogs_com/hanyulcf/%E6%97%A0.jpg" width="214" height="209" alt="" />&nbsp;</p><p>按照这种顺序进行。</p><p>&nbsp;</p><p>实现代码如下：</p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iomanip</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000FF;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000FF;">namespace</span><span style="color: #000000;">&nbsp;std;<br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000FF;">void</span><span style="color: #000000;">&nbsp;inputGrid(</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;n,</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">m)<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">{</span><span style="color: #008000;">//</span><span style="color: #008000;">n表示规模，m为二维数组指针</span><span style="color: #008000;"><br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;row</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">,line</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">,flag</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">row,line表示第几次行处理或列处理；</span><span style="color: #008000;"><br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">,j</span><span style="color: #000000;">=-</span><span style="color: #800080;">1</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">for</span><span style="color: #000000;">(</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;num</span><span style="color: #000000;">=</span><span style="color: #800080;">1</span><span style="color: #000000;">;num</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">n</span><span style="color: #000000;">*</span><span style="color: #000000;">n;)<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">flag)<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">行处理</span><span style="color: #008000;"><br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;addnum;<br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">if</span><span style="color: #000000;">(row</span><span style="color: #000000;">%</span><span style="color: #800080;">2</span><span style="color: #000000;">==</span><span style="color: #800080;">0</span><span style="color: #000000;">)addnum</span><span style="color: #000000;">=</span><span style="color: #800080;">1</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">往前走</span><span style="color: #008000;"><br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">else</span><span style="color: #000000;">&nbsp;addnum</span><span style="color: #000000;">=-</span><span style="color: #800080;">1</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">往回走</span><span style="color: #008000;"><br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;num_row</span><span style="color: #000000;">=</span><span style="color: #000000;">n</span><span style="color: #000000;">-</span><span style="color: #000000;">row;<br /></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">while</span><span style="color: #000000;">(num_row)<br /></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="color: #008000;">//</span><span style="color: #008000;">将本行剩余空白列全部填满</span><span style="color: #008000;"><br /></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num_row</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j</span><span style="color: #000000;">+=</span><span style="color: #000000;">addnum;<br /></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">(m</span><span style="color: #000000;">+</span><span style="color: #000000;">n</span><span style="color: #000000;">*</span><span style="color: #000000;">i</span><span style="color: #000000;">+</span><span style="color: #000000;">j)</span><span style="color: #000000;">=</span><span style="color: #000000;">num;<br /></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag</span><span style="color: #000000;">=</span><span style="color: #800080;">1</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">else</span><span style="color: #000000;"><br /></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">列处理</span><span style="color: #008000;"><br /></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;addnum;<br /></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">if</span><span style="color: #000000;">(line</span><span style="color: #000000;">%</span><span style="color: #800080;">2</span><span style="color: #000000;">==</span><span style="color: #800080;">0</span><span style="color: #000000;">)addnum</span><span style="color: #000000;">=</span><span style="color: #800080;">1</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">往前走</span><span style="color: #008000;"><br /></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">else</span><span style="color: #000000;">&nbsp;addnum</span><span style="color: #000000;">=-</span><span style="color: #800080;">1</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">往回走</span><span style="color: #008000;"><br /></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;num_line</span><span style="color: #000000;">=</span><span style="color: #000000;">n</span><span style="color: #000000;">-</span><span style="color: #000000;">line</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">while</span><span style="color: #000000;">(num_line)<br /></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="color: #008000;">//</span><span style="color: #008000;">将本列剩余空白项全部填满</span><span style="color: #008000;"><br /></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num_line</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000;">+=</span><span style="color: #000000;">addnum;<br /></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">(m</span><span style="color: #000000;">+</span><span style="color: #000000;">n</span><span style="color: #000000;">*</span><span style="color: #000000;">i</span><span style="color: #000000;">+</span><span style="color: #000000;">j)</span><span style="color: #000000;">=</span><span style="color: #000000;">num;<br /></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">for(int&nbsp;i=0;i&lt;n*n;i++)<br /></span><span style="color: #008080;">48</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">49</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(m+i)=i;<br /></span><span style="color: #008080;">50</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">53</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;main()<br /></span><span style="color: #008080;">54</span>&nbsp;<span style="color: #000000;">{<br /></span><span style="color: #008080;">55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;n</span><span style="color: #000000;">=</span><span style="color: #800080;">1</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">m,</span><span style="color: #000000;">*</span><span style="color: #000000;">tm;<br /></span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">while</span><span style="color: #000000;">(n</span><span style="color: #000000;">!=-</span><span style="color: #800080;">1</span><span style="color: #000000;">)<br /></span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #800000;">"</span><span style="color: #800000;">请输入回形数规模:(输入-1退出)</span><span style="color: #800000;">"</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cin</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">n;<br /></span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">if</span><span style="color: #000000;">(n</span><span style="color: #000000;">==-</span><span style="color: #800080;">1</span><span style="color: #000000;">)<br /></span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(n</span><span style="color: #000000;">*</span><span style="color: #000000;">n</span><span style="color: #000000;">*</span><span style="color: #0000FF;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000FF;">int</span><span style="color: #000000;">));<br /></span><span style="color: #008080;">64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;inputGrid(n,m);<br /></span><span style="color: #008080;">65</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">for</span><span style="color: #000000;">(</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">n;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br /></span><span style="color: #008080;">66</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">67</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tm</span><span style="color: #000000;">=</span><span style="color: #000000;">m</span><span style="color: #000000;">+</span><span style="color: #000000;">n</span><span style="color: #000000;">*</span><span style="color: #000000;">i;<br /></span><span style="color: #008080;">68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">for</span><span style="color: #000000;">(</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;j</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;j</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">n;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br /></span><span style="color: #008080;">69</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">70</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">setw(</span><span style="color: #800080;">3</span><span style="color: #000000;">)</span><span style="color: #000000;">&lt;&lt;*</span><span style="color: #000000;">(tm</span><span style="color: #000000;">+</span><span style="color: #000000;">j)</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #800000;">"</span><span style="color: #800000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">72</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #800000;">"</span><span style="color: #800000;">\n</span><span style="color: #800000;">"</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">73</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">74</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">75</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">return&nbsp;0;</span><span style="color: #008000;"><br /></span><span style="color: #008080;">76</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">}</span></div></div><p>&nbsp;</p><p>&nbsp;</p><img src="http://www.cnblogs.com/hanyulcf/aggbug/1683098.html?type=1" width="1" height="1" alt=""/><p>评论: 1　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌雅虎等抗议英国屏蔽含盗版内容网站计划<span style="color:gray">(2010-03-10 22:47)</span><br/>· Twitter开始监控所有外部链接 以防钓鱼式攻击<span style="color:gray">(2010-03-10 22:40)</span><br/>· IBM联手大学开发老年与文盲群体易用手机<span style="color:gray">(2010-03-10 21:32)</span><br/>· Arm称今年将有五十余款iPad类平板电脑上市<span style="color:gray">(2010-03-10 21:31)</span><br/>· 互联网泡沫十周年 当年热股今何在<span style="color:gray">(2010-03-10 21:22)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47313</link>
<title><![CDATA[程序员你12点前睡觉了吗？]]></title>
<author>吉日嘎拉&amp;gt;不仅权限设计</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 22:46:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47313</guid>
<description><![CDATA[ <p>阅读: 637 评论: 16 作者: 吉日嘎拉&amp;gt;不仅权限设计 发表于 2010-03-10 22:46 原文链接</p><p>&nbsp;&nbsp;&nbsp; 最近发现很多同事，在上班时有些打瞌睡，中午也在眯一会儿，当然我不是周扒皮，但是总的感觉来说，想提醒他们一下，平时还是需要注意一些的，虽然大家没有表面上说你什么，但是大家都看在眼里，谁在好好工作，谁在打瞌睡，其实每个人心里都有一杆秤的，只是我们都比较含蓄，有些话只能放在心里永远都不能说出来而已。</p>
<p>&nbsp;&nbsp; 我也是从20来岁一直走过来的，那时候晚上也睡不着，精力旺盛，经常弄到凌晨2-3点，我也很能理解大家，但是当时没多少人能提醒我，很中肯的把其中的利弊给我讲好，现在我想从我的心得体验给大家随便说几句。</p>
<p>&nbsp;&nbsp; 1：晚上熬呀，很容易早上迟到，早上起不来，那真的是更大的痛苦，早上又赶车、挤车，很容易出事情或被小偷啥的光顾，因为你精神不集中。</p>
<p>&nbsp;&nbsp; 2：不管是你的领导，同事，都看着你平时工作精力不集中、对你的评价、对你认识会比较糟糕，以后有好事情一般不会轮到你，影响你的前程。</p>
<p>&nbsp;&nbsp; 3：由于晚上没休息好，工作效率会很低，思路也会混乱，迷迷糊糊、稀里糊涂一天就过去，很容易代码没写好，测试没测好，该做的事情没仔细做好，从此个人、公司有了噩梦的开始。</p>
<p>&nbsp;&nbsp; 4：一个作息不规律、邋遢、稀里糊涂、抓不住主次的同事，我就是有妹妹也不会介绍给他。</p>
<p>&nbsp;&nbsp; 5：你的不按时休息、很可能会影响家人的休息，你的女朋友、你的父母、你的家人的休息还是多多少少被影响的。</p>
<p>&nbsp;&nbsp; 6：晚上加班了，没几个人能看到你加班了，但是早上迟到了，所有的同事都看到你迟到了。</p>
<p>&nbsp;&nbsp; 7：年轻时身体像铁一样，等过了30岁，通宵一晚上要痛苦3-4天才能缓过劲来，若年轻时不珍惜好，过了30多岁，啥病都找上门来了，赚的可能没给的药费多。</p>
<p>&nbsp;&nbsp;&nbsp; 【换个牙齿，比较实在的社区卫生所，1000元左右一个，当然你可以选择一个铁的，更便宜一些】</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 一天天都过得很快，不要指望一天能干出天的事情，但是也不要不在乎人生过去的每一天，人生每天都是现场直播，需要你直播好每一天，一晃眼10多年过去了，最牛的人，都是最有目的最有计划的，做事情也很有条理，哪些事情是必须做的，哪些事情是可以靠别人做的，哪些是重点，哪些是关键，那些事情自己做不了？</p>
<p>&nbsp;&nbsp; 你每天的表现，就是你的未来的必然，生活好每天，别稀里糊涂、连个按时睡觉、按时起床也做不到，就不太好了。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 上班打瞌睡，会影响你的前程。。。。。。。。。。。。。。。。。。。。。。。。。虽然别人没直接说你。。。。。。今天我告诉你</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 今天没做好的事情，好好休息，明天精神饱满的继续干，若一天计划的事情没做好，干到深夜、凌晨才做好，那是计划不好，规划不好，水平不好。</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/jirigala/aggbug/1682969.html?type=1" width="1" height="1" alt=""/><p>评论: 16　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌雅虎等抗议英国屏蔽含盗版内容网站计划<span style="color:gray">(2010-03-10 22:47)</span><br/>· Twitter开始监控所有外部链接 以防钓鱼式攻击<span style="color:gray">(2010-03-10 22:40)</span><br/>· IBM联手大学开发老年与文盲群体易用手机<span style="color:gray">(2010-03-10 21:32)</span><br/>· Arm称今年将有五十余款iPad类平板电脑上市<span style="color:gray">(2010-03-10 21:31)</span><br/>· 互联网泡沫十周年 当年热股今何在<span style="color:gray">(2010-03-10 21:22)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47314</link>
<title><![CDATA[D3D学习总结基础篇（二）--从古墓丽影的画面设置了解基础概念]]></title>
<author>靁电</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 22:22:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47314</guid>
<description><![CDATA[ <p>阅读: 199 评论: 0 作者: 靁电 发表于 2010-03-10 22:22 原文链接</p><p>上一篇文章比较理论，讲的都是数学，这一篇呢。。。讲的还是基础理论-。- </p>
<p>虽然编程上，实践非常重要，但由于D3D编程有太多的理论知识沉淀，所以，在弄清楚这些概念之后，再开始coding也不迟。 </p>
<p>相信很多玩家和我一样，当年曾因为电脑配置差而不能流畅运行一些大型3D游戏，不得已在画面设置上做出许多让步，通过不断的实验得到画面和流畅度的平衡点。这篇文章就从画面设置菜单开始，来介绍3D图形学中的基础概念。顺便再说下，本文中的理论大部分来自<span style="color: red">Introduction to 3D Game Programming with DirectX 10</span>一书，越来越觉得自己像技术翻译了。。。</p>
<p><span style="color: red">=========================================分割线== </span></p>
<p style="text-align: center"><img alt="" src="http://images.cnblogs.com/cnblogs_com/raidencheng/031010_1421_D3D1.jpg" /> </p>
<p>首先看上面这张图，是古墓丽影的display setting（google上随便找的，不知道是哪个版本的古墓，反正不是地下世界就是传奇）。这里列出了几个典型的设置项，我们就从这些item中挑几个来分析吧： </p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt"><strong>1. Anti Aliasing 全屏抗锯齿： </strong></span></p>
<p>这是非常常见的技术，在Direct X中，抗锯齿技术叫做multisampling，下面来具体讲下这个技术。 </p>
<p>由于一个像素点在屏幕上并非是无限小的，因此，任意线条都不可能完美现实在屏幕上。举个简单的例子： </p>
<p style="text-align: center"><img alt="" src="http://images.cnblogs.com/cnblogs_com/raidencheng/031010_1421_D3D2.jpg" /> </p>
<p>上图中，上面的那条线呈明显的阶梯状，也就是我们所说的"锯齿"，下图，通过对每个点和周围点进行取样，生成一些相似颜色的点，来实现抗锯齿的效果（不确认我这样说是否准确），这就是D3D用到的multisampling（多抽样）技术。当然，提高分辨率可以将锯齿现象减少，通常也会带来较大的性能损失，不过抗锯齿技术也是相当吃性能的。。。 </p>
<p>在D3D中，通过改变下面这个结构的值来设抗锯齿效果： </p>
<p><span style="font-family: 宋体; font-size: 12pt">&nbsp;</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">typedef&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;DXGI_SAMPLE_DESC&nbsp;{&nbsp;<br /><br />UINT&nbsp;Count;</span><span style="color: #008000">//</span><span style="color: #008000">对每一个像素生成几个取样&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />UINT&nbsp;Quality;&nbsp;<br /><br />}&nbsp;DXGI_SAMPLE_DESC,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">LPDXGI_SAMPLE_DESC;<br /></span></div></div>
<p>&nbsp;</p>
<p>&nbsp;</span></p>
<p>如果要开发成熟的3D应用，要考虑到不同级别硬件的要求，可以通过以下代码来check硬件设备是否支持某个级别的抗锯齿： </p>
<p><pre><code><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">HRESULT&nbsp;ID3D10Device::CheckMultisampleQualityLevels(<br />&nbsp;&nbsp;DXGI_FORMAT&nbsp;Format,&nbsp;UINT&nbsp;SampleCount,&nbsp;UINT&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pNumQualityLevels);<br /><br /></span></div></div><p>&nbsp;</p>			</code></pre>
<p>&nbsp;</p>
<p>如果硬件不支持，该函数返回0。（DXGI_FORMAT会在后面提到，如果没忘记的话。。。） </p>
<p><span style="font-size: 12pt"><strong>2. Texture 纹理 </strong></span></p>
<p>纹理质量对3D游戏的显示效果有着至关重要的作用，这里就具体讲一下D3D中的Textures。 </p>
<p>我们通常认为，纹理就是一张2D图片，微观的说，就是一个矩阵，每个矩阵元素对应一个像素点的颜色，事实上，早期的游戏确实就是这么实现的。不过，到了3D时代，事情变的复杂了很多，纹理的用途很多，在矩阵中的每一个元素不仅对应着一个像素点的颜色，可还可能对应一个数字，一个向量，或者一个数组。有点抽象，具体的说，比如，有种技术叫"mipmap"（这里就不详细解释了，可以去google下），实现这种技术的某种方法就是在纹理中存放mipmap level。当然，同一个纹理文件不可能包含任意信息，同一种纹理类型里存放的数据是固定的。D3D中，通过枚举类型DXGI_FORMAT来设定纹理的类型，下随便举几种纹理类型： </p>
<p>DXGI_FORMAT_R32G32B32_FLOAT: 每个元素包含三个32位浮点数。 </p>
<p>DXGI_FORMAT_R16G16B16A16_UNORM: 每个元素包含4个16位组件对应[0,1]，一般用来做阴影。 </p>
<p>这里就不再往细的写了，因为这块具体的算法很多我也不理解，有兴趣的朋友参看http://msdn.microsoft.com/en-us/library/ee418116(VS.85).aspx。 </p>
<p>对于类型中的R, G, B, A分别对应red, green, blue, and alpha，前三个是三原色，最后一个代表着透明度，术语叫做阿尔法通道，用过3DMax或者Maya等建模工具的人应该不会陌生。另外需要说明的是，纹理并不一定要存放颜色的信息，比如DXGI_FORMAT_R32G32B32_FLOAT，可以存放一个三维的向量。 </p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt"><strong>3. Triple Buffering 三倍缓冲 </strong></span></p>
<p>我们经常看到游戏设置里会有双倍缓冲(double buffering)，三倍缓冲（triple buffering）之类的选项。具体是什么意思呢，无论硬件有多快，渲染一个画面都是需要花费一定时间的，一般来说，渲染一个画面是从上往下垂直的顺序渲染的，这样给用户的体验就很不好，我没应该没看过游戏把渲染过程展现给用户的吧，这样画面可是会很闪。。。Swap Chain就是为了避免这种情况设计的技术，实现很简单，就是用一个缓冲区存储下一帧需要渲染的内容，这样，"画"的过程就不会让用户看见了。 </p>
<p>具体过程看下面的图解： </p>
<p style="text-align: center"><img alt="" src="http://images.cnblogs.com/cnblogs_com/raidencheng/031010_1421_D3D3.png" /> </p>
<p>Buffer A和Buffer B是两个缓冲区（double buffering），有两个指针指向他们，Front Buffer Ptr始终指向现实给用户的那一帧画面，Back Buffer Ptr则始终指向下一帧，就是要在背后渲染的那一帧，然后通过不断的调换指针指向，来实现swap chain。 </p>
<p>如果有三个Buffer，就称为Triple buffering。 </p>
<p>Swap chain技术被封装在接口IDXGISwapChain中，具体的后面再说。 </p>
<p>&nbsp;</p>
<p><strong style="font-size: 12pt">4. Depth Buffering 深度缓冲</strong><span style="font-size: 12pt"> </span></p>
<p>最后说下这个深度缓冲，事实上，他是一种特殊的纹理，不保存图像信息，保存的是depth信息。事实上，深度信息就是一个0到1的浮点数（0表示该像素离屏幕最近，1最远），每个像素点对应一个depth项。他是用来让3D引擎知道该把哪个像素画在前面，如下图： </p>
<p style="text-align: center"><img alt="" src="http://images.cnblogs.com/cnblogs_com/raidencheng/031010_1421_D3D4.jpg" /> </p>
<p>四个图形重叠在了同一快位置，但并没有出现前后的错位，具体是怎么实现的呢，虽然不难，但描述有些困难，下面还是有图示先： </p>
<p style="text-align: center"><img alt="" src="http://images.cnblogs.com/cnblogs_com/raidencheng/031010_1421_D3D5.png" /> </p>
<p>上图展示了一种情况，p1,p2,p3分别为三个图形上的三个点，他们重合到了一起，对应到界面上的p点，那p点到底该渲染啥呢，显然是p1嘛，但要让计算机明白这个，需要一个比较麻烦的推导过程（笔者再小小的偷下懒，借用下书上的表格）： </p>
<div>
<table style="border-collapse: collapse" border="0">
<colgroup>
<col style="width: 101px">
<col style="width: 46px">
<col style="width: 30px">
<col style="width: 407px"></colgroup>
<tbody valign="top">
<tr>
<td style="border-bottom: 0.75pt outset; border-left: 0.75pt outset; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: 0.75pt outset; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt"><strong>Operation </strong></span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: 0.75pt outset; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt"><strong><em>P</em> </strong></span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: 0.75pt outset; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt"><strong><em>d</em> </strong></span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: 0.75pt outset; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt"><strong>Description </strong></span></p></td></tr>
<tr>
<td style="border-bottom: 0.75pt outset; border-left: 0.75pt outset; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt">Clear operation </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt">Black </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt">1.0 </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt">Pixel and corresponding depth entry initialized. </span></p></td></tr>
<tr>
<td style="border-bottom: 0.75pt outset; border-left: 0.75pt outset; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt">Draw cylinder </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt"><em>P</em><sub>3</sub> </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt"><em>d</em><sub>3</sub> </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt">Since <em>d</em><sub>3</sub> &#8804; <em>d</em> = 1.0, the depth test passes and we update the buffers by setting <em>P</em> = <em>P</em><sub>3</sub> and <em>d</em> = <em>d</em><sub>3</sub>. </span></p></td></tr>
<tr>
<td style="border-bottom: 0.75pt outset; border-left: 0.75pt outset; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt">Draw sphere </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt"><em>P</em><sub>1</sub> </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt"><em>d</em><sub>1</sub> </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt">Since <em>d</em><sub>1</sub> &#8804; <em>d</em> = <em>d</em><sub>3</sub>, the depth test passes and we update the buffers by setting <em>P</em> = <em>P</em><sub>1</sub> and <em>d</em> = <em>d</em><sub>1</sub>. </span></p></td></tr>
<tr>
<td style="border-bottom: 0.75pt outset; border-left: 0.75pt outset; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt">Draw cone </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px" colspan="2">
<p><span style="font-family: 宋体; font-size: 12pt"><em>P</em><sub>1</sub> </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt"><em>d</em><sub>1</sub> </span></p></td>
<td style="border-bottom: 0.75pt outset; border-left: medium none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; border-top: medium none; border-right: 0.75pt outset; padding-top: 1px">
<p><span style="font-family: 宋体; font-size: 12pt">Since d<sub>2</sub> &gt; <em>d</em> = <em>d</em><sub>1</sub>, the depth test fails and we do not update the buffers. </span></p></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>推导步骤： </p>
<ol><li>清空屏幕：将D 设置为1，也就是最远，然后用一种单一的颜色来填充整个屏幕。假设三个图形的渲染顺序是，圆柱，球和圆锥。</li><li>不断的判断所需要画的像素的depth值dx，如果他小于当前的D ，就让D=dx，P=当前像素；否则，不做任何处理。</li><li>一切需要渲染的元素判断完了，讲当前的P渲染。 </li></ol>
<p>今天就写到这里吧，其实偶很菜，写这些博文也是为了加深自己对基础的印象，欢迎大牛拍砖。</p><img src="http://www.cnblogs.com/raidencheng/aggbug/1682941.html?type=1" width="1" height="1" alt=""/><p>评论: 0　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌雅虎等抗议英国屏蔽含盗版内容网站计划<span style="color:gray">(2010-03-10 22:47)</span><br/>· Twitter开始监控所有外部链接 以防钓鱼式攻击<span style="color:gray">(2010-03-10 22:40)</span><br/>· IBM联手大学开发老年与文盲群体易用手机<span style="color:gray">(2010-03-10 21:32)</span><br/>· Arm称今年将有五十余款iPad类平板电脑上市<span style="color:gray">(2010-03-10 21:31)</span><br/>· 互联网泡沫十周年 当年热股今何在<span style="color:gray">(2010-03-10 21:22)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47332</link>
<title><![CDATA[clikclak | AnimeTaste]]></title>
<author>plidezus</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 22:03:44</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47332</guid>
<description><![CDATA[ <p><img border=0 src="http://img.diglog.com/img/2010/3/middle_cecce9796e8144f4b57fbe02fc1c60c7.jpg" /></p><br/>很有爱的3D动画，字幕和音效尤其出色！<br/><br/>原始链接:http://www.animetaste.net/?p=1809<br/>diglog链接:http://www.diglog.com/story/entertainment_other_332311.html  ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47333</link>
<title><![CDATA[各式各样的26个字母]]></title>
<author>yleo</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 21:45:37</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47333</guid>
<description><![CDATA[ <p><img border=0 src="http://img.diglog.com/img/2010/3/middle_9ae90818381a477c940033114b8a4af5.jpg" /></p><br/>字母表大家都很熟悉了，这些好玩的字母表，有的来自于生活，有的是艺术，有的有点少儿不宜……<br/><br/>原始链接:http://hi.baidu.com/yleo550/blog/item/fbb5d0ec0298c8222cf53413.html<br/>diglog链接:http://www.diglog.com/story/culture_art_332310.html  ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47320</link>
<title><![CDATA[写着玩(1)&mdash;&mdash;地形编辑]]></title>
<author>Heath</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 21:36:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47320</guid>
<description><![CDATA[ &nbsp;&nbsp;&nbsp;&nbsp; 摘要: 地形编辑的基本要求实际上只有三个：1) 地形网格的生成 2) 画刷所在区域的定位 3) 网格顶点高度值的修改 ...&nbsp;&nbsp;阅读全文<img src ="http://www.cppblog.com/heath/aggbug/109392.html" width = "1" height = "1" /><br><br><div align=right>Heath 2010-03-10 21:36 发表评论</div> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47315</link>
<title><![CDATA[新的开始新的思考(一)]]></title>
<author>shaipe</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 21:05:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47315</guid>
<description><![CDATA[ <p>阅读: 550 评论: 1 作者: shaipe 发表于 2010-03-10 21:05 原文链接</p><blockquote>
<p>　　毕业已快五年的技术人,是应该好好的思考和计划一下自己的技术人生啦!</p>
<p>&nbsp;</p>
<p>　　从这篇日志开始准备把自己的思考和实际中的问题都一并写出来和大家分享,希望有什么不对的地方大家多多指教!</p>
<p>&nbsp;</p>
<p>　　从学校一所普通学校的非计算机专业毕业以后就走上了编程之路,开始用VB做毕业设计,项目中使用Asp做项目,还用Delphi做过Com+主要是用来做工作流的解析(也就是所谓的工作流引擎),记得那会客户的流程变化特别大,客户需要自己绘制一些简单的流程.</p>
<p>&nbsp;</p>
<p>　　记得2005年冬开始看到一些关于Ajax的新闻和用法(具体时间记不太清楚了),刚毕业那会儿对技术有着很高的热情,有很多很多的东西想去学习, 总觉得时间总是不够用.我开始给公司介绍Ajax叫公司的项目中可以使用Ajax这样来提高用户体验,在公司里用公司的电脑学校Ajax和一些新的东西.当有一天领导看到我在学习这些东西的时候,给我说了一句"这些东西我们又用不到学这些干什么"从那以后我就按时下班了.</p>
<p>&nbsp;</p>
<p>　　再过了几个月之后我从公司离开了,出来后几个朋友找到我说我们一起创业吧,我一个写了一套基于Ajax办证系统,一个人从规划到项目的完成到实施完只用了5个月的时间,好像这一套东西卖了一个客户五万,可到2007年春由于种种原因从一起合伙的公司中出来了,也从南京来到了上海滩.</p>
<p>那时候没有资本只能还是给别人打工,进入一家公司做做erp刚进公司的时候,先从一个人搞需求并慢慢招人来做OA以及ERP中的其他项目.在做OA项目的过程中,发现了很多关于开发和管理方面的问题,也一次一次的进行改进,和想了很多提高工作效率的办法,为公司提供了自己封装的Ajax框架,和数据显示和快速录入的DataGrid控件.</p>
<p>&nbsp;</p>
<p>　　由于ERP中以前的项目没有引入Ajax很多用户不停的反应太慢,给老项目中引入Ajax,也不断的研究怎么才能提高页面的执行和加载速度,在页面中尽量减少使用服务端控件可以减小页面生成的代码,应用Ajax进行异步的数据提取和处理等方法.</p>
<p>于是花了几个月的时间把oa项目基作完成,后期公司领导要求引入工作流,又开始继续我的工作流的研究,因为项目紧,人力资源紧,时间紧工作流里要学习的东西也多,于是一个人用了一个月的时间完成了OA项目里的一个工作流引擎.</p>
<p>&nbsp;</p>
<p>　　OA项目结束以后又开始了新的财务,生产等ERP中其他项目的设计规划,在这期间也学习了财务知识和关于生产方面的流程以及管理方面的知识,也不断的为项目的顺利完成提供和思考着高效的开发模式,以及系统运行的稳定和执行效率问题,在这一个一个的项目中积累了很多很多的经验.</p></blockquote><img src="http://www.cnblogs.com/shaipe/aggbug/1682891.html?type=1" width="1" height="1" alt=""/><p>评论: 1　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌雅虎等抗议英国屏蔽含盗版内容网站计划<span style="color:gray">(2010-03-10 22:47)</span><br/>· Twitter开始监控所有外部链接 以防钓鱼式攻击<span style="color:gray">(2010-03-10 22:40)</span><br/>· IBM联手大学开发老年与文盲群体易用手机<span style="color:gray">(2010-03-10 21:32)</span><br/>· Arm称今年将有五十余款iPad类平板电脑上市<span style="color:gray">(2010-03-10 21:31)</span><br/>· 互联网泡沫十周年 当年热股今何在<span style="color:gray">(2010-03-10 21:22)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47316</link>
<title><![CDATA[蜘蛛侠论坛核心框架分析1 - 如何设计与实现当前访问用户]]></title>
<author>netfocus</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 20:27:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47316</guid>
<description><![CDATA[ <p>阅读: 504 评论: 2 作者: netfocus 发表于 2010-03-10 20:27 原文链接</p><p>论坛演示地址：http://www.entityspider.com/ <br />源代码下载地址：http://files.cnblogs.com/netfocus/Forum.rar </p>
<p>&nbsp;</p>
<p>蜘蛛侠论坛采用Forms验证方式。</p>
<p>&nbsp;</p>
<p>1： 当用户输入用户名和密码并登陆, 此时, 我们会将当前用户的身份标识保存到客户端：</p>
<p>文件：</p>
<p>\Core\Managers\MemberManager.cs</p>
<p>代码：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">CookieManager.AddCookieToResponse(<br />FormsAuthentication.GetAuthCookie(member.MemberId.Value.ToString(),&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">),&nbsp;expireDays);</span></div></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>2： 用户登陆后, ASP.NET下次就自动知道当前访问用户的身份标识了. 我们可以通过如下方式获取当前登陆用户的标识：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">HttpContext.Current.User.Identity.Name</span></div></div>
<p>&nbsp;</p>
<p>另外, 如何判断一个用户是否处于登陆状态？ 我们可以通过如下的方式来判断：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">HttpContext.Current.Request.IsAuthenticated</span></div></div>
<p>&nbsp;</p>
<p>如果该属性返回TRUE，则表示当前用户已登陆，否则，表示未登陆。</p>
<p>&nbsp;</p>
<p>3： 在什么时候获取当前用户的所有信息？</p>
<p>ASP.NET提供了一个时机，让我们对用户执行身份验证。该时机就是<font size="2">Application对象的<font size="2">AuthenticateRequest事件。所以，我们可以在该事件的处理函数中确定当前访问用户是否已经登陆，</font></font></p>
<p><font size="2"><font size="2">文件：</font></font></p>
<p>\Core\Components\Common\HttpModule.cs</p>
<p><font size="2"><font size="2">代码：</font></font><font size="2"><font size="2"></p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Application_AuthenticateRequest(Object&nbsp;source,&nbsp;EventArgs&nbsp;e)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HttpRequest&nbsp;request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;HttpContext.Current.Request;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(request.Url.LocalPath.ToLower().EndsWith(</span><span style="color: #800000">"</span><span style="color: #800000">.aspx</span><span style="color: #800000">"</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;request.Url.LocalPath.ToLower().EndsWith(</span><span style="color: #800000">"</span><span style="color: #800000">.ashx</span><span style="color: #800000">"</span><span style="color: #000000">))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCurrentUser();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetCurrentUser()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">HttpContext.Current.Request.IsAuthenticated)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: yellow">HttpContext.Current.User&nbsp;</span><span style="color: #000000; background-color: yellow">=</span><span style="color: #000000; background-color: yellow">&nbsp;UserManager.GetAnonymousUser();</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UserManager.GetUser(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Guid(HttpContext.Current.User.Identity.Name));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(user&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&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;</span><span style="color: #000000; background-color: yellow">HttpContext.Current.User&nbsp;</span><span style="color: #000000; background-color: yellow">=</span><span style="color: #000000; background-color: yellow">&nbsp;user;</span><span style="color: #000000"><br />&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;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&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;MemberManager.Logout();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpContext.Current.User&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UserManager.GetAnonymousUser();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemberManager.Logout();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpContext.Current.User&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UserManager.GetAnonymousUser();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div></div>
<p>&nbsp;</p>
<p>大家可以看到，我们在AuthenticateRequest事件的处理函数中确定一个当前用户，SetCurrentUser函数实现该功能。该函数首先判断当前用户是否已经登陆，如果未登陆，则获取一个匿名用户对象，并赋值给HttpContext.Current.User；如果已经登陆，则根据用户标识从数据库获取登陆用户对象，并同样把该用户对象赋值给HttpContext.Current.User;这里有一个很关键的问题，我们为什么可以把当前获取的用户对象赋值给HttpContext.Current.User？其实很简单，我们只要让我们自己定义的User类实现IPrinciple接口即可，User类的代码如下：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;User&nbsp;:&nbsp;Entity,&nbsp;IPrincipal<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IIdentity&nbsp;identity&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;Implementation&nbsp;of&nbsp;IPrincipal</span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IIdentity&nbsp;Identity<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;identity;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;identity&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;IsInRole(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;roleName)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Return&nbsp;true&nbsp;or&nbsp;false&nbsp;by&nbsp;your&nbsp;own&nbsp;logic.</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />}</span></div></div>
<p>&nbsp;</p>
<p>这里我为了突出重点，所以把User类的其他不相关的东西删除了。大家可以看到，我们只要让User类实现IPrinciple接口就行了。然后我们可以为User类包含很多我们自定义的属性。</p>
<p>这样的做法有什么好处呢？其实我们也完全可以把当前用户放在Session或Cache等其他地方。我觉得最大的好处就是自然，因为ASP.NET提供给我们的HttpContext.Current.User对象的意图就是表示当前发送请求的用户实例，但因为该对象所存储的信息非常少，基本上就只存放了一个标识当前登陆用户的标识（如用户名）。但大部分情况下，我们都需要更多的用户信息，所以就自然而然很容易想到扩展该User属性。</p>
<p>&nbsp;</p>
<p>当然还有一个需要说明的细节是，</p>
<p>因为我们自己创建了一个新的User对象，并且赋值给了HttpContext.Current.User，而赋值之前，HttpContext.Current.User.Identity不为空，所以为了一致，我们也应该给我们自己定义的User类的Identity属性赋值。</p>
<p>文件：</p>
<p>\Core\UserRolePermissions\User.cs</p>
<p>代码：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;User&nbsp;GetAnonymousUser()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Activator.CreateInstance(Configuration.Instance.UserType)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;User;<br />&nbsp;&nbsp;&nbsp;&nbsp;user.SetRoles(Configuration.Instance.AnonymousDefaultRoleList);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: yellow">user.Identity&nbsp;</span><span style="color: #000000; background-color: yellow">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff; background-color: yellow">new</span><span style="color: #000000; background-color: yellow">&nbsp;GenericIdentity(</span><span style="color: #0000ff; background-color: yellow">string</span><span style="color: #000000; background-color: yellow">.Empty);</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;user;<br />}<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;User&nbsp;GetUser(Guid&nbsp;memberId)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TRequest</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TRequest</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />&nbsp;&nbsp;&nbsp;&nbsp;request.Data&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Activator.CreateInstance(Configuration.Instance.UserType)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;User;<br />&nbsp;&nbsp;&nbsp;&nbsp;request.Data.MemberId.Value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;memberId;<br />&nbsp;&nbsp;&nbsp;&nbsp;EntityList&nbsp;users&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Engine.GetAll(request);<br />&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(users.Count&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;users[</span><span style="color: #800080">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;User;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(user&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeUser(user);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;user;<br />}<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;InitializeUser(User&nbsp;user)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(user&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEntityList</span><span style="color: #000000">&lt;</span><span style="color: #000000">Role</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;roles&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TEntityList</span><span style="color: #000000">&lt;</span><span style="color: #000000">Role</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(UserAndRole&nbsp;userAndRole&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;RoleManager.GetUserRoles(user.EntityId.Value))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;roles.Add(userAndRole.Role);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.SetRoles(roles);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: yellow">user.Identity&nbsp;</span><span style="color: #000000; background-color: yellow">=</span><span style="color: #000000; background-color: yellow">&nbsp;HttpContext.Current.User.Identity;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div></div>
<p>&nbsp;</p>
<p>大家可以看到黄色高亮度显示的那几行代码，我对Identity属性进行了赋值。</p>
<p>&nbsp;</p>
<p>4： 如何在页面中访问当前用户？</p>
<p>文件：</p>
<p>\Business\Controls\ForumUserControl.cs</p>
<p>代码：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ForumUserControl&nbsp;:&nbsp;BaseUserControl<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;ForumUser&nbsp;CurrentUser<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: yellow">return</span><span style="color: #000000; background-color: yellow">&nbsp;HttpContext.Current.User&nbsp;</span><span style="color: #0000ff; background-color: yellow">as</span><span style="color: #000000; background-color: yellow">&nbsp;ForumUser;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;ValidatePermission(PermissionType&nbsp;permission)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;CurrentUser.GetPermissions().ValidatePermission((</span><span style="color: #0000ff">long</span><span style="color: #000000">)permission);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;ValidatePermission(PermissionType&nbsp;permission,&nbsp;Entity&nbsp;entity)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;CurrentUser.GetPermissions(entity).ValidatePermission((</span><span style="color: #0000ff">long</span><span style="color: #000000">)permission);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div></div>
<p>&nbsp;</p>
<p>ForumUserControl是一个基类UserControl，我们可以在该控件中提供一个表示当前登陆用户的属性CurrentUser，这样一来，我们在各个地方就可以很容易的访问我们自定义好的用户对象啦。是不是很简单呢？</p>
<p>&nbsp;</p>
<p>好了， 以上就是蜘蛛侠论坛中当前登陆用户的设计与实现。因为觉得可能对大家有用，所以写出来与大家分享。</p>
<p></font></font>&nbsp;</p><img src="http://www.cnblogs.com/netfocus/aggbug/1682871.html?type=1" width="1" height="1" alt=""/><p>评论: 2　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌雅虎等抗议英国屏蔽含盗版内容网站计划<span style="color:gray">(2010-03-10 22:47)</span><br/>· Twitter开始监控所有外部链接 以防钓鱼式攻击<span style="color:gray">(2010-03-10 22:40)</span><br/>· IBM联手大学开发老年与文盲群体易用手机<span style="color:gray">(2010-03-10 21:32)</span><br/>· Arm称今年将有五十余款iPad类平板电脑上市<span style="color:gray">(2010-03-10 21:31)</span><br/>· 互联网泡沫十周年 当年热股今何在<span style="color:gray">(2010-03-10 21:22)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47317</link>
<title><![CDATA[千奇百怪的linux发音!]]></title>
<author>豆浆咖啡</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 20:19:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47317</guid>
<description><![CDATA[ <p>阅读: 660 评论: 6 作者: 豆浆咖啡 发表于 2010-03-10 20:19 原文链接</p><p>&nbsp;&nbsp;&nbsp; 最近就很郁闷,说到linux这个系统大家都很熟悉,但是许多人的读法都不相同,原来的我一直读成"<span style="color: #ff0000;">你留客死</span>"，但是我经常听到其他千奇百怪的读法"<span style="color: #ff0000;">你雷客死</span>"(其他读法实在打不出来),本来也没对此事作个深究，今天突然吃饱撑着抱着疑问上网Search了下还真发现了不少有趣的东西，传说Linux的发明人(Linus Torvalds)录了一段录音,录音如下：</p>
<p>[hjp3]hjptype=song&amp;player=1&amp;son=http://www.paul.sladen.org/pronunciation/torvalds-says-linux.mp3&amp;autoplay=no&amp;autoreplay=1&amp;bgcolor=FFFFFF&amp;width=200&amp;height=20[/hjp3]</p>
<p>&nbsp;&nbsp;&nbsp; 这段录音说了一段话"Hello，this is Linus Torvalds and I pronounce Linux as Linux"虽然不是很清晰，但是也能听出里面的Linux发音大致为"<span style="color: #ff0000;">你呢课死</span>"or&ldquo;<span style="color: #ff0000;">你拿课死</span>"之类的...听了这个录音的我更加郁闷了....其实我以前也曾经读成&ldquo;<span style="color: #ff0000;">你拿课死</span>"的，但是没人懂我在说什么，我只好改掉读成"<span style="color: #ff0000;">你留客死</span>"，.以前的同学老师朋友（包括现在的）都是读"<span style="color: #ff0000;">你留客死</span>"的，╮(╯▽╰)╭到底怎么回事？</p>
<p>&nbsp;&nbsp;&nbsp; 网上这三种读法都有人念，....于是没有解决问题的我又抱着这个硕大的疑问来到了博客园，本来想这篇文章不能发到首页上去的....但是为了解决这件事还是明知不可为而为之，希望大家给我个满意的答案!</p><img src="http://www.cnblogs.com/cracker/aggbug/1682867.html?type=1" width="1" height="1" alt=""/><p>评论: 6　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌雅虎等抗议英国屏蔽含盗版内容网站计划<span style="color:gray">(2010-03-10 22:47)</span><br/>· Twitter开始监控所有外部链接 以防钓鱼式攻击<span style="color:gray">(2010-03-10 22:40)</span><br/>· IBM联手大学开发老年与文盲群体易用手机<span style="color:gray">(2010-03-10 21:32)</span><br/>· Arm称今年将有五十余款iPad类平板电脑上市<span style="color:gray">(2010-03-10 21:31)</span><br/>· 互联网泡沫十周年 当年热股今何在<span style="color:gray">(2010-03-10 21:22)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47334</link>
<title><![CDATA[美国加州大学正在研制能修理水管的机器人 - 机器人智能网]]></title>
<author>yiyix</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 19:35:11</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47334</guid>
<description><![CDATA[ <p><img border=0 src="http://img.diglog.com/img/2010/3/middle_71357661f2f247dc9000f76cf4890384.jpg" /></p><br/>机器人应用广泛的一个重要原因就是能帮助或代替人类一些危险的或难以完成的工作，比如深入自来水管道内部检测和修理管道（日本管道巡检机器人）。加州大学正在研制一个能在水管内部修复老化管道的机器人。<br/><br/>原始链接:http://www.robotain.com/news/keji/201003/10458.html<br/>diglog链接:http://www.diglog.com/story/technology_hardware_332305.html  ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47321</link>
<title><![CDATA[vc2008 fstream不支持中文路径的解决方案]]></title>
<author>clane</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 19:19:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47321</guid>
<description><![CDATA[ &nbsp;&nbsp;&nbsp;&nbsp; 项目编译后给朋友试运行，发现运行出错，提示路径不正确找不到配置文件。因为朋友是放在桌面运行的，于是推测是中文路径的问题（因为路径中包含"桌面"两个汉字)。反应很诧异，什么年代了，还有中文路径的问题...<br>&nbsp;&nbsp;&nbsp;&nbsp; 跟踪了一下ifstream的open函数，发现ifstream在打开文件之前会通过_mbstowcs_l_helper函数把文件路径从mutilbyte转换到unicode。其中的关键转换函数如下:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(_loc_update.GetLocaleT()</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">locinfo</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lc_handle[LC_CTYPE]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;_CLOCALEHANDLE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;C&nbsp;locale:&nbsp;easy&nbsp;and&nbsp;fast&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(count&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n)<br>&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;</span><span style="color: #000000;">*</span><span style="color: #000000;">pwcs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(wchar_t)&nbsp;((unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">)s[count]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">s[count])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;count;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pwcs</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&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;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;count;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></div>
&nbsp;&nbsp;&nbsp; 而vc的默认local信息就是<span style="color: #000000;">_CLOCALEHANDLE,于是中文字符很悲剧的被转换成了</span>莫名其妙的一串东西。google了下，似乎很多人碰到了这个问题，也没有特别好的解决方案，要不直接unicode,要不每次调用fstream前后都调用一遍setlocal，对代码的侵入性都很强。<br>&nbsp;&nbsp;&nbsp; 我做了个封装的解决方案，使用个模板类对fstream做一个wrapper，代码如下:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;fstream_fix<br>&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;T<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;fstream_fix(){};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T1</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;fstream_fix(T1&nbsp;v1){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.936</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T::open(v1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T1,</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T2</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;fstream_fix(T1&nbsp;v1,T2&nbsp;v2){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.936</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T::open(v1,v2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T1</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;open(T1&nbsp;v1){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.936</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T::open(v1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T1,</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T2</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;open(T1&nbsp;v1,T2&nbsp;v2){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.936</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T::open(v1,v2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br><br>#define ifstream fstream_fix&lt;ifstream&gt;<br>#define ofstream fstream_fix&lt;ofstream&gt;</span><span style="color: #000000;"></span></div>
&nbsp;&nbsp;&nbsp; OK.完美，对原项目没有任何影响，ifstream fi(filepath);filepath中含有中文也能正常工作了。:) 当然要注意的是，在宏定义之后，就不能再include &lt;fstream&gt;，不然可能会有编译错误。<br><br><br><br><img src ="http://www.cppblog.com/clane/aggbug/109382.html" width = "1" height = "1" /><br><br><div align=right>clane 2010-03-10 19:19 发表评论</div> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47318</link>
<title><![CDATA[VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题]]></title>
<author>Birdshover</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 18:51:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47318</guid>
<description><![CDATA[ <p>阅读: 389 评论: 2 作者: Birdshover 发表于 2010-03-10 18:51 原文链接</p><p>本文记录一下我在VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题。其它Linux系统碰到的问题应该大同小异。</p>
<p>&nbsp;</p>
<p><b>一、网络问题</b></p>
<p>Sun的VirtualBox中文界面，而且开源，有什么理由不用呢？最近想看看各种Linux操作系统的差异，和RHEL系列的比，果然有很大的差别。下载Debian,第一张盘就行了，因为习惯自己编译了，不用本地源，常用的东西都是下载好了的。接下来，安装好Debian,无论是中文也好英文也罢。</p>
<p>&nbsp;</p>
<p>下面就是配置网络的问题，由于Debian默认的网段是10.10.*.*的，我本机还访问不了，因此需要修改IP地址。修改了很多次才成功。记录下成功的这次。</p>
<p>&nbsp;</p>
<p>安装完VirtualBox虚拟机后，会多一个网卡&mdash;&mdash;VirtualBox Host-Only Network，默认IP是192.168.56.1。启动VirtualBox时，网络连接选择Host-only Adapter。这种模式是主机和虚拟机能够互相通信，但是虚拟机不能上网。对开发环境来说已经足够了。至于Nat和Bridged没有去尝试，Nat的要做端口映射，Bridged要占用主机网段IP，可能会抢同事的IP，就不尝试了。</p>
<p>&nbsp;</p>
<p>下面是配置网络。Debian的网络设置和RHEL的不一样。设置网卡是在/etc/network/interfaces文件，设置DNS是在/etc/resolv.conf 文件。现在设置如下：</p>
<p>&nbsp;</p>
<p>首先通过命令 # ifconfig -a 查看到当前外网网卡标识。我前几次操作错误，现在的标识是eth2。</p>
<p>在/etc/network/interfaces 文件加入：</p>
<p>&nbsp;</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">auto eth2</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">iface eth2 inet dhcp</div>
<p>
auto eth2</p>
<p>iface eth2 inet dhcp</p>
<p>&nbsp;</p>
<p>然后通过&nbsp;</p>
<p>#ifdown&nbsp;eth2</p>
<p>#ifup eth2</p>
<p>重新载入设置。现在网络就OK了。</p>
<p>&nbsp;</p>
<p><b>二、Java安装</b></p>
<p>Cassandra是基于Java的程序，先去下载和Jre，我下载的Jre1.6 update18&mdash;&mdash;&ldquo;jre-6u18-linux-i586.bin&rdquo;。把文件传过去，然后在虚拟机运行：</p>
<p>#cd ~ &nbsp; &nbsp;//我的是root帐号，我的文件就传到了/root目录</p>
<p>#chmod +x&nbsp;jre-6u18-linux-i586.bin</p>
<p>#./jre-6u18-linux-i586.bin</p>
<p>#cp jre1.6.0_18/ /usr/local/ -r</p>
<p>现在就把jre的文件拷贝到了/usr/local/jre1.6.0_18/目录。</p>
<p>现在要设置Java了，在RHEL使用alternatives命令，而在Debian使用update-alternatives命令，语法一样的。</p>
<p>Debian默认是没装Java的，现在开始设置：</p>
<p>#update-alternatives --install &nbsp;/usr/bin/java java /usr/local/jre1.6.0_18/bin/java 300 &nbsp;</p>
<p>如果要是已经安装了java要换版本，可以用update-alternatives --display java查看当前安装的java,使用update-alternatives --config java进行版本切换。</p>
<p>现在输入</p>
<p>#java -version</p>
<p>
<p>java version "1.6.0_18"</p>
<p>Java(TM) SE Runtime Environment (build 1.6.0_18-b07)</p>
<p>Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode)</p>
<p>&nbsp;</p>
<p>OK了，一切正常。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</p>
<p><b>三、安装和启动</b></p>
<p>先到http://incubator.apache.org/cassandra/页面下载Cassandra。</p>
<p>我下载的是&nbsp;apache-cassandra-0.5.1-bin.tar.gz</p>
<p>然后传到虚拟机上。</p>
<p>执行命令</p>
<p>#tar zxvf apache-cassandra-0.5.1-bin.tar.gz &nbsp; //解压缩</p>
<p>#cd&nbsp;apache-cassandra-0.5.1/bin</p>
<p>#./cassandra</p>
<p>输出</p>
<p>
<p>Listening for transport dt_socket at address: 8888</p>
<p>INFO - Replaying /var/lib/cassandra/commitlog/CommitLog-1268246662083.log</p>
<p>INFO - LocationInfo has reached its threshold; switching in a fresh Memtable</p>
<p>INFO - Enqueuing flush of Memtable(LocationInfo)@19897293</p>
<p>INFO - Sorting Memtable(LocationInfo)@19897293</p>
<p>INFO - Writing Memtable(LocationInfo)@19897293</p>
<p>INFO - Completed flushing /var/lib/cassandra/data/system/LocationInfo-1-Data.db</p>
<p>INFO - Log replay complete</p>
<p>INFO - Saved Token found: 59927080841113489954773621748862915294</p>
<p>INFO - Starting up server gossip</p>
<p>&nbsp;</p>
<p>成功了，呵呵。</p>
<p>&nbsp;</p>
<p>当然，要用到生产环境的话可能还需要做很多工作。比如配置啊，开发啊什么的。自己弄来看看的话，这已经是第一步了，呵呵。</p>
</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/birdshover/aggbug/1682837.html?type=1" width="1" height="1" alt=""/><p>评论: 2　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌雅虎等抗议英国屏蔽含盗版内容网站计划<span style="color:gray">(2010-03-10 22:47)</span><br/>· Twitter开始监控所有外部链接 以防钓鱼式攻击<span style="color:gray">(2010-03-10 22:40)</span><br/>· IBM联手大学开发老年与文盲群体易用手机<span style="color:gray">(2010-03-10 21:32)</span><br/>· Arm称今年将有五十余款iPad类平板电脑上市<span style="color:gray">(2010-03-10 21:31)</span><br/>· 互联网泡沫十周年 当年热股今何在<span style="color:gray">(2010-03-10 21:22)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47335</link>
<title><![CDATA[水彩画风格网站设计欣赏]]></title>
<author>mohaiguyan</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 17:27:08</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47335</guid>
<description><![CDATA[ <p><img border=0 src="http://img.diglog.com/img/2010/3/middle_617a51c33f2343738f72e334d59451a9.jpg" /></p><br/>Web Designer Wall<br/><br/>Boompa Shop<br/><br/>Agami Creative<br/><br/>原始链接:http://www.36ria.cn/?p=1600<br/>diglog链接:http://www.diglog.com/story/technology_design_332283.html  ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47311</link>
<title><![CDATA[Silverlight Path的Data生成]]></title>
<author>ghj1976</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 16:10:53</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47311</guid>
<description><![CDATA[ <p>Path的Data数据有下面几种生成方式： </p>  <ol>   <li>来自其它矢量图。比如使用 Expression Design，就可以直接粘贴来自其它软件的矢量图形，然后选择导出，导出时做如后选择：文件-&gt;导出-&gt;导出属性-&gt;格式-&gt;XAML Silverlight 画布，即可得到XAML格式的矢量图形，也就是Path。 </li>    <li>使用转换路径，比如，我们要把文字转成图形，相当于印刷行业里的文字转曲，可以直接用 Expression Blend。选中对象-&gt;路径-&gt;转换为路径，即可。 </li>    <li>自己动手写。当然这也是最难的方式。不过对于简单图形来说非常有用。用Design生成的数据量很大，手写就会变得很简洁。这篇博客就是要介绍Path命令的格式，以及如何写一些简单的Path。 </li> </ol>  <p>首先是Path命令列表</p>  <p>下面这个地址有详细描述，Silverlight路径标记语法，我下面用表格的方式给出，更直观点。     <br /></p>  <p>说明：</p>  <ul>   <li>下面命令中，语法部分显示的是单个空格，实际上使用单个空格的地方也可以使用多个空格； </li>    <li>命令前后的空格也不是必须的； </li>    <li>如果结果字符串比较明确，则无需使用逗号或空白将两个数字隔开。例如，2..3 解释为两个数字：&quot;2.&quot;和&quot;.3&quot;。同样，2-3 包含两个数字：&quot;2&quot;和&quot;-3&quot;。 </li>    <li>下面的命令中，绝大多数大写表示绝对值，小写表示相对于前一点的值。 </li> </ul>  <p>&#160;</p>  <table border="2" cellspacing="0" cellpadding="2"><tbody>     <tr>       <td valign="top" colspan="2">类型</td>        <td valign="top">命令格式</td>        <td valign="top">解释</td>     </tr>      <tr>       <td valign="top" colspan="2">移动指令&#160; Move Command（M）</td>        <td valign="top">M x,y          <br />或           <br />m x,y</td>        <td valign="top">比如：M 100,240 或 m 100,240          <br />          <br />大写的 M 指示 x,y 是绝对值；           <br />小写的 m 指示 x,y 是相对于上一个点的偏移量，如果是 (0,0)，则表示不存在偏移。           <br />当您在 move 命令之后列出多个点时，即使您指定的是线条命令，也将绘制出连接这些点的线。</td>     </tr>      <tr>       <td style="width: 186px" valign="middle" rowspan="8">绘制指令          <br />（Draw Command）           <br />          <br />通过使用一个大写或小写字母输入各命令：           <br />          <br />其中大写字母表示绝对值，           <br />小写字母表示相对值。           <br />          <br />线段的控制点是相对于上一线段的终点而言的。           <br />          <br />依次输入多个同一类型的命令时，可以省略重复的命令项；           <br />          <br />例如，L 100,200 300,400 等同于 L 100,200 L 300,400。</td>        <td style="width: 212px" valign="top">         <p>直线:Line(L)</p>       </td>        <td valign="top">格式：          <br />L 结束点坐标           <br />或:           <br />l 结束点坐标。           <br /></td>        <td valign="top">比如：L 100,100 或 l 100 100。          <br />坐标值可以使用x,y（中间用英文逗号隔开）或x y（中间用半角空格隔开）的形式。</td>     </tr>      <tr>       <td style="width: 212px" valign="top">         <p>水平直线: Horizontal line(H)</p>       </td>        <td valign="top">格式：          <br />H x值           <br />或           <br />h x值           <br />(x为System.Double类型的值)           <br /></td>        <td valign="top">绘制从当前点到指定x坐标的直线。          <br />比如：H 100或h 100，也可以是：H 100.00或h 100.00等形式。</td>     </tr>      <tr>       <td style="width: 212px" valign="top">         <p>垂直直线: Vertical line(V)</p>       </td>        <td valign="top">V y值          <br />或           <br />v y值           <br />(y为System.Double类型的值)</td>        <td valign="top">绘制从当前点到指定y坐标的直线。          <br />比如：V 100或y 100，也可以是：V 100.00或v 100.00等形式。</td>     </tr>      <tr>       <td style="width: 212px" valign="top">         <p>三次方程式贝塞尔曲线:            <br />Cubic Bezier curve(C)</p>       </td>        <td valign="top">C 第一控制点 第二控制点 结束点          <br />或           <br />c 第一控制点 第二控制点 结束点</td>        <td valign="top">通过指定两个控制点来绘制由当前点到指定结束点间的三次方程贝塞尔曲线。          <br />比如：C 100,200 200,400 300,200 或 c 100,200 200,400 300,200           <br />其中，点(100,200)为第一控制点，点(200,400)为第二控制点，点(300,200)为结束点。</td>     </tr>      <tr>       <td style="width: 212px" valign="top">         <p>二次方程式贝塞尔曲线:            <br />Quadratic Bezier curve(Q)</p>       </td>        <td valign="top">Q 控制点 结束点          <br />或           <br />q 控制点 结束点           <br /></td>        <td valign="top">通过指定的一个控制点来绘制由当前点到指定结束点间的二次方程贝塞尔曲线。          <br />比如：q 100,200 300,200。其中，点(100,200)为控制点，点(300,200)为结束点。</td>     </tr>      <tr>       <td style="width: 212px" valign="top">         <p>平滑三次方程式贝塞尔曲线:            <br />Smooth cubic Bezier curve(S)</p>       </td>        <td valign="top">S 控制点 结束点          <br />或           <br />s 控制点 结束点           <br /></td>        <td valign="top">通过一个指定点来“平滑地”控制当前点到指定点的贝塞尔曲线。          <br />          <br />比如：S 100,200 200,300</td>     </tr>      <tr>       <td style="width: 212px" valign="top">         <p>平滑二次方程式贝塞尔曲线:            <br />smooth quadratic Bezier curve(T)</p>       </td>        <td valign="top">T 控制点 结束点          <br />或           <br />t 控制点 结束点           <br /></td>        <td valign="top">与平滑三次方程贝塞尔曲线类似。在当前点与指定的终点之间创建一条二次贝塞尔曲线。控制点假定为前一个命令的控制点相对于当前点的反射。如果前一个命令不存在，或者前一个命令不是二次贝塞尔曲线命令或平滑的二次贝塞尔曲线命令，则此控制点就是当前点。          <br />          <br />比如：T 100,200 200,300</td>     </tr>      <tr>       <td style="width: 212px" valign="top">椭圆圆弧: elliptical Arc(A)</td>        <td valign="top">A 尺寸 圆弧旋转角度值 优势弧的标记 正负角度标记 结束点          <br />或：           <br />a 尺寸 圆弧旋转角度值 优势弧的标记 正负角度标记 结束点           <br /></td>        <td valign="top">         <p>在当前点与指定结束点间绘制圆弧。</p>          <ul>           <li>尺寸(Size): System.Windows.Size类型，指定椭圆圆弧X,Y方向上的半径值。 </li>            <li>旋转角度（rotationAngle）：System.Double类型。 </li>            <li>圆弧旋转角度值（rotationAngle）：椭圆弧的旋转角度值。 </li>            <li>优势弧的标记（isLargeArcFlag）：是否为优势弧，如果弧的角度大于等于180度，则设为1，否则为0。 </li>            <li>正负角度标记（sweepDirectionFlag）：当正角方向绘制时设为1，否则为0。 </li>            <li>结束点（endPoint）：System.Windows.Point类型。 </li>         </ul>          <p>比如：A 5,5 0 0 1 10,10</p>       </td>     </tr>      <tr>       <td valign="top" colspan="2">关闭指令&#160; (close Command):          <br />可选的关闭命令</td>        <td valign="top">用Z或z表示</td>        <td valign="top">用以将图形的首、尾点用直线连接，以形成一个封闭的区域。</td>     </tr>      <tr>       <td style="width: 186px" valign="top" rowspan="2">填充规则（fillRule）          <br />          <br />如果省略此命令，则路径使用默认行为:即 EvenOdd。           <br />如果指定此命令，则必须将其置于最前面。&gt; </td>        <td style="width: 212px" valign="top">EvenOdd 填充规则</td>        <td valign="top">F0 指定 EvenOdd 填充规则。</td>        <td valign="top">EvenOdd 确定一个点是否位于填充区域内的规则方法：从该点沿任意方向画一条无限长的射线，然后计算该射线在给定形状中因交叉而形成的路径段数。如果该数为奇数，则点在内部；如果为偶数，则点在外部。</td>     </tr>      <tr>       <td style="width: 212px" valign="top">Nonzero 填充规则</td>        <td valign="top">F1 指定 Nonzero 填充规则。</td>        <td valign="top">Nonzero 确定一个点是否位于路径填充区域内的规则方法：从该点沿任意方向画一条无限长的射线，然后检查形状段与该射线的交点。从 0 开始计数，每当线段从左向右穿过该射线时加 1，而每当路径段从右向左穿过该射线时减 1。计算交点的数目后，如果结果为 0，则说明该点位于路径外部。否则，它位于路径内部。</td>     </tr>   </tbody></table>  <p>&#160;</p>  <p>一些简单例子：</p>  <p>Xaml 文件</p>  <pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">UserControl</span>
	<span style="color: #ff0000">xmlns</span>=<span style="color: #0000ff">&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span>
	<span style="color: #ff0000">xmlns</span>:<span style="color: #ff0000">x</span>=<span style="color: #0000ff">&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span>
	<span style="color: #ff0000">x</span>:<span style="color: #ff0000">Class</span>=<span style="color: #0000ff">&quot;SilverlightApplication_Test.MainPage&quot;</span>
	<span style="color: #ff0000">Width</span>=<span style="color: #0000ff">&quot;640&quot;</span> <span style="color: #ff0000">Height</span>=<span style="color: #0000ff">&quot;500&quot;</span><span style="color: #0000ff">&gt;</span>
	<span style="color: #0000ff">&lt;</span><span style="color: #800000">Canvas</span> <span style="color: #ff0000">Background</span>=<span style="color: #0000ff">&quot;Black&quot;</span><span style="color: #0000ff">&gt;</span>
		<span style="color: #008000">&lt;!-- 1 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;BlanchedAlmond&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;M101,95 L269,95&quot;</span><span style="color: #0000ff">/&gt;</span>
		<span style="color: #008000">&lt;!-- 2 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;Blue&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;m101,95 l269,95&quot;</span><span style="color: #0000ff">/&gt;</span>
		<span style="color: #008000">&lt;!-- 3 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;BlanchedAlmond&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;M101,95 58,54 60,38&quot;</span><span style="color: #0000ff">/&gt;</span>
		<span style="color: #008000">&lt;!-- 4 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;BurlyWood&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;M30,185 H100&quot;</span><span style="color: #0000ff">/&gt;</span>
		<span style="color: #008000">&lt;!-- 5 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;BurlyWood&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;M30,185 v100&quot;</span><span style="color: #0000ff">/&gt;</span>
	<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Canvas</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">UserControl</span><span style="color: #0000ff">&gt;</span></pre>

<p>执行效果，下面数字分别标识了上面代码注释中的5条线。</p>

<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.joycode.com/images/metaapis/64/WindowsLiveWriter/Path_E1BF/image_thumb.png" width="296" height="216" /> </p>

<p>Xaml 文件</p>

<pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">UserControl</span>
	<span style="color: #ff0000">xmlns</span>=<span style="color: #0000ff">&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span>
	<span style="color: #ff0000">xmlns</span>:<span style="color: #ff0000">x</span>=<span style="color: #0000ff">&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span>
	<span style="color: #ff0000">x</span>:<span style="color: #ff0000">Class</span>=<span style="color: #0000ff">&quot;SilverlightApplication_Test.MainPage&quot;</span>
	<span style="color: #ff0000">Width</span>=<span style="color: #0000ff">&quot;640&quot;</span> <span style="color: #ff0000">Height</span>=<span style="color: #0000ff">&quot;500&quot;</span><span style="color: #0000ff">&gt;</span>
	<span style="color: #0000ff">&lt;</span><span style="color: #800000">Canvas</span> <span style="color: #ff0000">Background</span>=<span style="color: #0000ff">&quot;Black&quot;</span><span style="color: #0000ff">&gt;</span>
		<span style="color: #008000">&lt;!-- 1 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;AliceBlue&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;M 150,50 c 80,3 8,60 120,30&quot;</span> <span style="color: #0000ff">/&gt;</span>
		
		<span style="color: #008000">&lt;!-- 2 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;Aqua&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;M 70,150 Q 80,30 120,90&quot;</span> <span style="color: #0000ff">/&gt;</span>

		<span style="color: #008000">&lt;!-- 3 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;Azure&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;M 90,150 s 118,3 190,90&quot;</span> <span style="color: #0000ff">/&gt;</span>

		<span style="color: #008000">&lt;!-- 4 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;RosyBrown&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;M 350,110 t10,20 32,10&quot;</span> <span style="color: #0000ff">/&gt;</span>

		<span style="color: #008000">&lt;!-- 5 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;Red&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;M 90,180 a 2 3 8 1 0 29,90&quot;</span> <span style="color: #0000ff">/&gt;</span>
	<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Canvas</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">UserControl</span><span style="color: #0000ff">&gt;</span></pre>

<p>执行效果，下面数字分别标识了上面代码注释中的5条线。</p>

<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.joycode.com/images/metaapis/64/WindowsLiveWriter/Path_E1BF/image_thumb_1.png" width="416" height="286" />&#160; </p>

<p>Xaml 文件</p>

<pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">UserControl</span>
	<span style="color: #ff0000">xmlns</span>=<span style="color: #0000ff">&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span>
	<span style="color: #ff0000">xmlns</span>:<span style="color: #ff0000">x</span>=<span style="color: #0000ff">&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span>
	<span style="color: #ff0000">x</span>:<span style="color: #ff0000">Class</span>=<span style="color: #0000ff">&quot;SilverlightApplication_Test.MainPage&quot;</span>
	<span style="color: #ff0000">Width</span>=<span style="color: #0000ff">&quot;640&quot;</span> <span style="color: #ff0000">Height</span>=<span style="color: #0000ff">&quot;500&quot;</span><span style="color: #0000ff">&gt;</span>
	<span style="color: #0000ff">&lt;</span><span style="color: #800000">Canvas</span> <span style="color: #ff0000">Background</span>=<span style="color: #0000ff">&quot;Black&quot;</span><span style="color: #0000ff">&gt;</span>
		<span style="color: #008000">&lt;!-- 1 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;AliceBlue&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;F0 M 150,50 c 5,30 8,60 120,30 z&quot;</span> <span style="color: #0000ff">/&gt;</span>
		
		<span style="color: #008000">&lt;!-- 2 //--&gt;</span>
		<span style="color: #0000ff">&lt;</span><span style="color: #800000">Path</span> <span style="color: #ff0000">Stroke</span>=<span style="color: #0000ff">&quot;Red&quot;</span> <span style="color: #ff0000">Data</span>=<span style="color: #0000ff">&quot;F1 M 95,180 a 2 3 8 1 0 29,90z&quot;</span> <span style="color: #0000ff">/&gt;</span>
	<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Canvas</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">UserControl</span><span style="color: #0000ff">&gt;</span></pre>

<p>执行效果，</p>

<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.joycode.com/images/metaapis/64/WindowsLiveWriter/Path_E1BF/image_thumb_2.png" width="296" height="255" />&#160; </p>

<p>更复杂的，建议还是用前2种方法吧。&#160; </p>

<p>&#160;</p>

<p><strong>参考资料：</strong></p>

<p>silverlight中path对象使用总结 
  <br />http://www.cnblogs.com/daizhj/archive/2008/07/14/1242181.html</p>

<p>Silverlight里C#绘制Path的方法 
  <br />http://mcs.szu.edu.cn/user/zouzhxi/Article_53515</p>

<p>SilverLight 关于Path的Data生成问题 
  <br />http://www.thinkaspx.com/wordpress/silverlight-on-the-path-of-the-data-generation-problem.Thinkaspx</p>

<p>Silverlight学习笔记--绘制与着色（上） 
  <br />http://blog.joycode.com/ghj/archive/2009/11/24/115786.joy</p>

<p>乱弹琴 Silverlight 2.0 (14) 几何图形(Geometry)(二)路径标记语法 
  <br />http://www.cnblogs.com/zxjay/archive/2008/04/18/1200692.html</p><br/><hr/>博客堂源代码发布已经发布于Codeplex，邀请您来捉臭虫<img src="http://blog.joycode.com/ajaxhelper.aggbug?PostId=115904&BlogId=64" > ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47322</link>
<title><![CDATA[盖莫游戏引擎中的光照系统]]></title>
<author>ccsdu2009</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 15:31:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47322</guid>
<description><![CDATA[ &nbsp;&nbsp;&nbsp;&nbsp; 摘要: 引擎中的光照系统是在就存在了的只是感觉一直有点问题，索性重新设计了.光照系统的有关对象和单元有:渲染基类RenderBase对象基类Object光描述符LightDesc光类Light光管理器LightManager在引擎中我们认识光是一种资源所以光管理器是从资源管理器中获得的也就是:RefPtr&lt;LightManager&gt; lightmanager&nbsp; = resourcem...&nbsp;&nbsp;阅读全文<img src ="http://www.cppblog.com/gaimor/aggbug/109361.html" width = "1" height = "1" /><br><br><div align=right>ccsdu2009 2010-03-10 15:31 发表评论</div> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47299</link>
<title><![CDATA[银光中国回复“菩提树下的杨过“的”转贴投诉“]]></title>
<author>silverlightchina</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 15:20:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47299</guid>
<description><![CDATA[ <p>阅读: 339 评论: 8 作者: silverlightchina 发表于 2010-03-10 15:20 原文链接</p><p>首先我想对网友&#8220;菩提树下的杨过&#8221;表示抱歉，在转载的过程中引起了这些误会和矛盾，对此我们表示深深的歉意。</p><p>&nbsp;</p><p>银光中国（SilverlightChina.Net)是一个非盈利性的专注讨论Silverlight技术社区， 众所周知，一门技术的发展需要众多的开发人员的支持和帮助，所以，银光中国多数文章是从国内或者国外网站收集而来的，在收集的过程中，为了保证项目源码的完整性和可用性，我们会对代码进行调试，在编译成功后，发布到网站，有时我们会对部分代码进行修改，其目的是希望能够帮助更多的朋友了解和学习Silverlight技术，顺利地学习和阅读项目源代码。在每次转贴过程中，我们一贯保证作者版权为主，从来没有修改任何作者的版权信息，在每篇文章的开始部分，我们都会明显标明出处和作者，对于优秀的Silverlight系列文章，我们会单独开设专题，对作者和文章教程进行宣传。而且，在每次的转贴后，我们都会在作者原文留言，通知该文章被银光中国网收录。在收录过程中，如果作者有所异议，可以发邮件到admin@silverlightchina.net，我们会及时处理。</p><p>&nbsp;</p><p>对于网友&#8220;菩提树下的杨过&#8221;提出没有标示出版权信息，请看下图文章版权信息，同时您也可以访问其他文章页面，每篇文章都会有相关作者的版权信息，并且会在文章开始进行明显标注：</p><p>http://www.silverlightchina.net/html/works/2009/1019/207.html</p><p><img alt="" src="http://images.cnblogs.com/cnblogs_com/silverlightchina/1.jpg" border="0" height="191" width="646" />&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>http://www.silverlightchina.net/html/works/2010/0205/673.html</p><p><img alt="" src="http://images.cnblogs.com/cnblogs_com/silverlightchina/3.jpg" border="0" height="285" width="615" />&nbsp;</p><p>&nbsp;</p><p><br /></p><p><br /></p><p>对于 网友&#8220;菩提树下的杨过&#8221;提出问题的解释：<br /></p><p>&nbsp;</p><p>对于转贴的解释: <br /></p><p>对于网友&#8220;菩提树下的杨过&#8221;得文章，本站编辑在发布项目前进行了抓图，为了更好的宣传网站，修改了部分图片，这里我们表示深深地歉意，同时也希望网友&#8220;菩提树下的杨过&#8221;能够理解。在随后的时间，我们将修改部分抓图信息；<br /></p><p>&nbsp;</p><p>对于广告的解释：</p><p>银光中国，在转贴后，都会给作者留言，留下文章地址，目的也是为了让作者对于文章版权信息进行监督。这样的做法，是对作者负责的一种行为方式。</p><p>&nbsp;</p><p>&nbsp;</p><p>银光中国网<br /></p><img src="http://www.cnblogs.com/silverlightchina/aggbug/1682607.html?type=1" width="1" height="1" alt=""/><p>评论: 8　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌地图添加自行车路线 提供骑行线路<span style="color:gray">(2010-03-10 15:54)</span><br/>· 华尔街日报：谷歌超速网络建设面临两大挑战<span style="color:gray">(2010-03-10 15:51)</span><br/>· Myspace联席总裁：网站将全新改版以夺回市场<span style="color:gray">(2010-03-10 15:46)</span><br/>· Sun首席开源官菲普斯离职<span style="color:gray">(2010-03-10 15:29)</span><br/>· 腾讯在Facebook发布首款社交游戏“牧场生活”<span style="color:gray">(2010-03-10 15:26)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47323</link>
<title><![CDATA[方便易用的客户端网络库]]></title>
<author>饭中淹</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 14:49:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47323</guid>
<description><![CDATA[ <p>详情参阅 读我.txt<br>/Files/johndragon/ClientNet.zip<br><br>另外：静态链接需要将 ClientNet.lib 手动连接到工程的连接项里，或者在代码中使用<br>#pragma comment( lib, "ClientNet.lib" ) <br>来进行连接。<br><br></p>
<img src ="http://www.cppblog.com/johndragon/aggbug/109356.html" width = "1" height = "1" /><br><br><div align=right>饭中淹 2010-03-10 14:49 发表评论</div> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47310</link>
<title><![CDATA[Mozilla 被指抄袭 Web 设计公司的网站设计]]></title>
<author>comsharp</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 14:44:44</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47310</guid>
<description><![CDATA[ <p><img border=0 src="http://img.diglog.com/img/2010/3/middle_44a48014d04449a3a2b34b2102e08425.gif" /></p><br/>设计抄袭是一个经典的话题，毕加索说过，好的艺术家复制，伟大的艺术家剽窃，Web 或 UI 设计这种会随着时间改变的东西，抄袭更是不在话下，国内就不必说了，这种事，微软都不能免俗。最近，Mozilla 被指在一款产品的 UI 设计中全盘照抄一家 Web 设计公司的网站设计，而这家设计公司曾为 Mozilla 提供过设计提案，不过被Mozilla否决了。<br/><br/>原始链接:http://www.comsharp.com/GetKnowledge/zh-CN/It_News_K920.aspx<br/>diglog链接:http://www.diglog.com/story/technology_web2_332256.html  ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47298</link>
<title><![CDATA[世界上最早的浏览器]]></title>
<author>cy</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 14:39:18</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47298</guid>
<description><![CDATA[ <p>刚才成功地在自己的Ubuntu 9.04上编译运行了世界上最早的浏览器之一Mosaic 2.7b6，很神奇的是你还可以用它来打开许多网页，虽然不支持CSS，Javascript，还要忍受极度丑陋的排版，背景颜色以及文本样式... </p>  <p>用目前世界上速度最快的浏览器打开同一个网页来看，有种穿越的错觉... </p>  <p>可执行文件：http://www.iamyuan.cn/downloads/mosaic.zip     <br />源码：http://github.com/alandipert/ncsa-mosaic</p>  <p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot-Opera" border="0" alt="Screenshot-Opera" src="http://blog.joycode.com/images/metaapis/170/WindowsLiveWriter/89069babc4c4_CCC8/Screenshot-Opera_thumb.png" width="644" height="463" /> </p>  <p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="opera" border="0" alt="opera" src="http://blog.joycode.com/images/metaapis/170/WindowsLiveWriter/89069babc4c4_CCC8/opera_thumb.png" width="644" height="459" /></p><br/><hr/>博客堂源代码发布已经发布于Codeplex，邀请您来捉臭虫<img src="http://blog.joycode.com/ajaxhelper.aggbug?PostId=115903&BlogId=170" > ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47300</link>
<title><![CDATA[信息系统开发平台OpenExpressApp － 支持日志功能]]></title>
<author>快乐学习</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 14:04:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47300</guid>
<description><![CDATA[ <p>阅读: 306 评论: 0 作者: 快乐学习 发表于 2010-03-10 14:04 原文链接</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般信息系统都有审计功能，现在给OpenExpressApp增加简单的日志功能，主要就是记录用户的一些操作（如登录、打开模块、查看数据、点击按钮等）或者系统操作时的一些信息收集（比如保存错误等）。为了便于统一查看，这些日志信息现在全部在服务器的数据库中记录下来，包含操作类型、操作时间、操作内容、操作者、客户端机器名等信息。</p>
<p>　　具体设计参考<b>BloodyAngel</b>写的<b>多层分布式设计模式</b>，这个是由他来设计实现的！</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/zgynhqf/WindowsLiveWriter/bf01545ffe83_8BF8/image_thumb_3.png" height="382" width="647" /></p>
<p>更多内容：<img class="fl pic" src="http://img.wanlibo.com/images_cn/productView-pdf_46x35.gif" /><i><b><i class="tit_common"><b><span style="font-size: large;"> 开源信息系统开发平台之OpenExpressApp框架.pdf</span></b></i></b></i></p>
<p>&nbsp;</p>
<p><b>欢迎转载，转载请注明：转载自周金根 [ http://zhoujg.cnblogs.com/ ]</b></p><img src="http://www.cnblogs.com/zhoujg/aggbug/1682460.html?type=1" width="1" height="1" alt=""/><p>评论: 0　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌地图添加自行车路线 提供骑行线路<span style="color:gray">(2010-03-10 15:54)</span><br/>· 华尔街日报：谷歌超速网络建设面临两大挑战<span style="color:gray">(2010-03-10 15:51)</span><br/>· Myspace联席总裁：网站将全新改版以夺回市场<span style="color:gray">(2010-03-10 15:46)</span><br/>· Sun首席开源官菲普斯离职<span style="color:gray">(2010-03-10 15:29)</span><br/>· 腾讯在Facebook发布首款社交游戏“牧场生活”<span style="color:gray">(2010-03-10 15:26)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47301</link>
<title><![CDATA[多层分布式设计模式]]></title>
<author>BloodyAngel</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 12:58:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47301</guid>
<description><![CDATA[ <p>阅读: 637 评论: 2 作者: BloodyAngel 发表于 2010-03-10 12:58 原文链接</p><p>&nbsp;&nbsp;&nbsp; 原来就想写一些关于分布式的设计。正好目前开发的GIX4项目中，需要对客户端的许多操作进行记录。这个功能的设计或多或少能说明，一般情况下，多层的分布式系统应该如何设计。现在我就对这个功能进行描述。</p>
<p>&nbsp;</p>
<p><strong><font size="4">功能描述</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; GIX4项目中有个审核日志记录功能，它需要以下功能：</p>
<p>&nbsp;&nbsp;&nbsp; 需要把客户的所有操作记录下来，以便支持审计。如，当用户进行：登录、打开模块、查看数据、点击按钮&#8230;&#8230;等操作时，把相关的数据全部在服务器的数据库中记录下来，这些数据有：操作类型、操作时间、操作内容、操作者、客户端机器名等。</p>
<p>&nbsp;&nbsp;&nbsp; 在服务端对某些特定的事件进行记录，如：计算出错。</p>
<p>&nbsp;</p>
<p><strong><font size="4">设计目标</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; 这个模块需要支持以下目标：</p>
<p>&nbsp;&nbsp;&nbsp; *为客户端代码、服务器端代码都提供简单统一的接口。</p>
<p>&nbsp;&nbsp;&nbsp; *需要异步记录。</p>
<p>&nbsp;&nbsp;&nbsp; *如果扩展为多级物理层时，也需要使用相同的接口。</p>
<p>&nbsp;</p>
<p><strong><font size="4">设计</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; 先把设计完成的图贴出来，然后再逐一描述：</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/zgynhqf/WindowsLiveWriter/bf01545ffe83_8BF8/image_thumb_1.png" width="1028" height="626" /> </p>
<p>图1 全部类图</p>
<p><strong><font size="4">通用部分</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; 首先，API设计之初，先根据需求，定出使用的接口。它们包含两个类：一个是贫血数据类AuditLogItem，一个是对AuditLogItem进行操作的静态类AuditLogService。AuditLogService暂时公布两个静态方法，一个记录日志方法Log()，另一个方法是异步记录LogAsync()。如下：</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/zgynhqf/WindowsLiveWriter/bf01545ffe83_8BF8/image_thumb.png" width="677" height="387" /> </p>
<p>&nbsp;&nbsp;&nbsp; 由于各物理层都使用AuditLogService的方法，而实现不同。这里把使用了Provider模式，提取接口IAuditLogProvider，这里就不再需要异步方法了：</p><pre class="code"><span style="color: gray">/// &lt;summary&gt;
/// </span><span style="color: green">审计功能提供程序
</span><span style="color: gray">/// &lt;/summary&gt;
</span><span style="color: blue">public interface </span><span style="color: #2b91af">IAuditLogProvider
</span>{
    <span style="color: gray">/// &lt;summary&gt;
    /// </span><span style="color: green">记录指定的日志
    </span><span style="color: gray">/// &lt;/summary&gt;
    /// &lt;param name="log"&gt;&lt;/param&gt;
    </span><span style="color: blue">void </span>Log(<span style="color: #2b91af">AuditLogItem </span>log);
}
</pre>
<p>&nbsp;&nbsp;&nbsp; 除了最终与数据库通信的服务器外，其它节点都默认使用ClientAuditLogProvider作为提供程序。此提供程序使用了ICommunication，而ICommunication则是负责向&#8220;下一节点&#8221;通信并提交日志记录功能。</p>
<p><strong><font size="4">GIX4实现部分</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; 这部分主要是两个类：ServerAuditLogProvider 和 CSLACommandCommunication。</p>
<p>&nbsp;&nbsp;&nbsp; ServerAuditLogProvider 使用CSLA的类库把AuditLogItem转换为相应的数据库模型存入数据库中：</p><pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">ServerAuditLogProvider </span>: <span style="color: #2b91af">IAuditLogProvider
</span>{
    <span style="color: blue">public void </span>Log(<span style="color: #2b91af">AuditLogItem </span>log)
    {
        <span style="color: blue">var </span>dbItem = <span style="color: #2b91af">AuditItem</span>.New();

        dbItem.Title = log.Title;
        dbItem.Content = log.Content;
        dbItem.User = log.User;
        dbItem.MachineName = log.MachineName;
        dbItem.Type = log.Type;
        dbItem.LogTime = log.LogTime;

        dbItem.Save();
    }
}</pre>
<p>&nbsp;&nbsp;&nbsp; CSLACommandCommunication 则是使用WCF和CSLA命令模式作为基础框架，让当前节点把请求发送给下一节点，下一节点接到请求后，使用本节点的提供程序Provider来处理请求。其中重要的代码在内部类AuditServerCommand中，如下：</p><pre class="code">[<span style="color: #2b91af">Serializable</span>]
<span style="color: blue">public class </span><span style="color: #2b91af">AuditServerCommand </span>: Csla.<span style="color: #2b91af">CommandBase
</span>{
    <span style="color: blue">private </span><span style="color: #2b91af">AuditLogItem </span>_logItem;

    <span style="color: blue">public </span>AuditServerCommand(<span style="color: #2b91af">AuditLogItem </span>logItem)
    {
        <span style="color: blue">if </span>(logItem == <span style="color: blue">null</span>) <span style="color: blue">throw new </span><span style="color: #2b91af">ArgumentNullException</span>(<span style="color: #a31515">"logItem"</span>);

        <span style="color: blue">this</span>._logItem = logItem;
    }

    <span style="color: blue">protected override void </span>DataPortal_Execute()
    {
        <span style="color: green">//server log
        </span><span style="color: #2b91af">AuditLogService</span>.Log(<span style="color: blue">this</span>._logItem);
    }
}</pre>
<p><strong><font size="4"></font></strong>&nbsp;</p>
<p><strong><font size="4">整个过程</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; 整个过程其实很简单，一图胜千言：</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/zgynhqf/WindowsLiveWriter/bf01545ffe83_8BF8/image_thumb_2.png" width="1028" height="626" /> </p>
<p><strong><font size="4"></font></strong>&nbsp;</p>
<p><strong><font size="4">后记</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; 其实本次设计过程的<strong>思路</strong>很简单：分析要提供的API（场景驱动）、分析分布式实现的差异、编写基础部分、编码与重构。</p>
<p>&nbsp;&nbsp;&nbsp; 其实熟悉CSLA的人应该知道，它里面的通信机制也是采用了类似的方式实现的。所以这应该算是一种分布式的设计模式吧。 :)</p><img src="http://www.cnblogs.com/zgynhqf/aggbug/1682403.html?type=1" width="1" height="1" alt=""/><p>评论: 2　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌地图添加自行车路线 提供骑行线路<span style="color:gray">(2010-03-10 15:54)</span><br/>· 华尔街日报：谷歌超速网络建设面临两大挑战<span style="color:gray">(2010-03-10 15:51)</span><br/>· Myspace联席总裁：网站将全新改版以夺回市场<span style="color:gray">(2010-03-10 15:46)</span><br/>· Sun首席开源官菲普斯离职<span style="color:gray">(2010-03-10 15:29)</span><br/>· 腾讯在Facebook发布首款社交游戏“牧场生活”<span style="color:gray">(2010-03-10 15:26)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47302</link>
<title><![CDATA[如何使用WF4.0啊？]]></title>
<author>Jeffrey.Liang</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 11:24:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47302</guid>
<description><![CDATA[ <p>阅读: 682 评论: 11 作者: Jeffrey.Liang 发表于 2010-03-10 11:24 原文链接</p><p>最近有个项目客户明确要求使用WF4.0,所以我安装了VS2010 beta 2，可发现VS2010 beta 2里的workflow那一块跟WF3.0里的很多都不一样。比如说，以前在3.0中可以用state machine workflow library来创建一个工作流，4.0中就没这个选项了。那要在VS2010 beta 2中创建一个工作流项目，并且希望能把这个工作流项目编译成一个DLL,改怎么操作啊？以前在3.0自定义的activity在4.0还能用吗？</p>
<p>4.0中怎么没状态机了啊？</p>
<p>我没找到2010 的MSDN安装包，MS提供的SDK samples只有代码又没文档，谁能提供给我学习4.0的资料啊？</p>
<p>谢谢各位了！</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/Jeffreyliang/aggbug/1682350.html?type=1" width="1" height="1" alt=""/><p>评论: 11　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌地图添加自行车路线 提供骑行线路<span style="color:gray">(2010-03-10 15:54)</span><br/>· 华尔街日报：谷歌超速网络建设面临两大挑战<span style="color:gray">(2010-03-10 15:51)</span><br/>· Myspace联席总裁：网站将全新改版以夺回市场<span style="color:gray">(2010-03-10 15:46)</span><br/>· Sun首席开源官菲普斯离职<span style="color:gray">(2010-03-10 15:29)</span><br/>· 腾讯在Facebook发布首款社交游戏“牧场生活”<span style="color:gray">(2010-03-10 15:26)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47303</link>
<title><![CDATA[项目优化经验&mdash;&mdash;垃圾回收导致的性能问题]]></title>
<author>lovecindywang</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 11:22:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47303</guid>
<description><![CDATA[ <p>阅读: 876 评论: 21 作者: lovecindywang 发表于 2010-03-10 11:22 原文链接</p><p>谈谈最近优化一个网站项目的经验，首先说一下背景情况：</p>  <p>1） 在页面后台代码中我们把页面上大部分的HTML都使用字符串来拼接生成然后直接赋值给LiteralControl。</p>  <p>2） 网站CPU很高，基本都在80%左右，即使使用了StringBuilder来拼接字符串性能也不理想。</p>  <p>3） 为了改善性能，把整个字符串保存在memcached中，性能还是不理想。</p>  <p>在比较了这个网站和其它网站服务器上相关性能监视器指标后发现有一个参数特别显眼：</p>  <p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/WindowsLiveWriter/aec714cfdc70_8CFD/image_thumb.png" width="244" height="94" /> </p>  <p>就是其中的每秒分配字节数，这个性能比较差的网站每秒分配2GB的内存（而且需要注意由于性能监视器是每秒更新一下，对于一个非常健康的网站这个值应该经常看到是0才对）！而其它一些网站只分配200M左右的内存。服务器配备4G内存，而每秒分配2G内存，我想垃圾回收器一定需要不断运行来回收这些内存。观察%Time in GC可以发现，这个值一直在10%左右，也就是说上次回收到这次回收间隔10秒的话，这次垃圾回收1秒，由于回收的时间相对固定，那么这个值可以反映回收的频繁度。</p>  <p>知道了这个要点就知道了方向，在项目中找可能的问题点：</p>  <p>1） 是否分配了大量临时的小对象</p>  <p>2） 是否分配了数量不多但比较大的大对象</p>  <p>在经历了一番查找之后，发现一个比较大的问题，虽然使用了memcached来缓存整个页面的HTML，但是在输出之前居然进行了几次string的Replace操作，这样就产生了几个大的字符串，我们来做一个实验模拟这种场景：</p>  <pre class="code"><span style="color: blue">public partial class </span><span style="color: #2b91af">_Default </span>: System.Web.UI.<span style="color: #2b91af">Page
</span>{
    <span style="color: blue">static string </span>template;
    <span style="color: blue">protected void </span>Page_Load(<span style="color: blue">object </span>sender, <span style="color: #2b91af">EventArgs </span>e)
    {
        <span style="color: blue">if </span>(template == <span style="color: blue">null</span>)
        {
            <span style="color: #2b91af">StringBuilder </span>sb = <span style="color: blue">new </span><span style="color: #2b91af">StringBuilder</span>();
            <span style="color: blue">for </span>(<span style="color: blue">int </span>i = 0; i &lt; 10000; i++)
                sb.Append(<span style="color: #a31515">&quot;1234567890&quot;</span>);
            template = sb.ToString(); 
        }

        <span style="color: #2b91af">Stopwatch </span>sw = <span style="color: #2b91af">Stopwatch</span>.StartNew();

        <span style="color: blue">for </span>(<span style="color: blue">int </span>i = 0; i &lt; 1; i++)
        {
            <span style="color: blue">long </span>mem1 = <span style="color: #2b91af">GC</span>.GetTotalMemory(<span style="color: blue">false</span>);
            <span style="color: blue">string </span>s = template + i;
            <span style="color: blue">long </span>mem2 = <span style="color: #2b91af">GC</span>.GetTotalMemory(<span style="color: blue">false</span>);
            Response.Write((mem2 - mem1).ToString(<span style="color: #a31515">&quot;N0&quot;</span>));
            Response.Write(<span style="color: #a31515">&quot;&lt;br/&gt;&quot;</span>);
            <span style="color: #2b91af">GC</span>.KeepAlive(s);
        }

        <span style="color: blue">for </span>(<span style="color: blue">int </span>i = 0; i &lt; 100000; i++)
        {
            <span style="color: blue">double </span>d = <span style="color: #2b91af">Math</span>.Sqrt(i);
        }

        <span style="color: #2b91af">Thread</span>.Sleep(30);
        Response.Write(sw.ElapsedMilliseconds);
    }
}</pre>

<p>在这段代码中：</p>

<p>1） 我们首先使用一个静态变量模拟缓存中的待输出的HTML</p>

<p>2） 我们中间的一段代码测算一下这个字符串占用的内存空间</p>

<p>3） 随后我们做了一些消耗CPU的运算操作来模拟页面的一些计算</p>

<p>4） 然后休眠一段时间</p>

<p>4） 最后我们输出了页面执行时间</p>

<p>我们这么做的目的是模拟一个比较“正常的”ASP.NET页面需要做的一些工作：</p>

<p>1） 内存上的分配</p>

<p>2） 一些计算</p>

<p>3） 涉及到IO访问的一些等待</p>

<p>来看看输出结果：</p>

<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/WindowsLiveWriter/aec714cfdc70_8CFD/image_thumb_1.png" width="169" height="56" /> </p>

<p>这里可以看到，我们这个字符串占用差不多200K的字节，字符串是字符数组，CLR中字符采用Unicode双字节存储，因此10万长度的字符串占用200千字节，并且也可以看到这个页面执行时间30毫秒，差不多是一个正常aspx页面的时间，而200K不到的字符串也差不多相当于这个页面的HTML片段，现在我们来改一下其中的一段代码模拟优化前进行的Replace操作带来的几个大字符串：</p>

<pre class="code"><span style="color: blue">for </span>(<span style="color: blue">int </span>i = 0; i &lt; 10; i++)
{
    <span style="color: green">//long mem1 = GC.GetTotalMemory(false);
    </span><span style="color: blue">string </span>s = template + i;
    <span style="color: green">//long mem2 = GC.GetTotalMemory(false);
    //Response.Write((mem2 - mem1).ToString(&quot;N0&quot;));
    //Response.Write(&quot;&lt;br/&gt;&quot;);
    //GC.KeepAlive(s);
</span>}</pre>

<p>然后使用IDE自带压力测试1000常量用户来测试这个页面：</p>

<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/WindowsLiveWriter/aec714cfdc70_8CFD/image_thumb_3.png" width="244" height="80" /> </p>

<p>可以看到每秒分配了超过400M字节（这和我们线上环境比还差点毕竟请求少），CPU占用基本在120-160左右（双核），我们去掉每秒分配内存这个数值，来看看垃圾回收频率和CPU占用两个值的图表：</p>

<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/WindowsLiveWriter/aec714cfdc70_8CFD/image_thumb_4.png" width="220" height="244" /> </p>

<p>可以看到红色的CPU波动基本和蓝色的垃圾回收波动保持一致（这里不太准确的另外一个原因是压力测试客户端运行于本机，而为w3wp关联2个处理器）！为什么说垃圾回收会带来CPU的波动，从理论上来说有以下原因：</p>

<p>1） 垃圾回收的时候会暂时挂起所有线程，然后GC会检测扫描每一个线程栈上可回收对象，然后会移动对象，并且重新设置对象指针，这整个过程首先是消耗CPU的</p>

<p>2） 而且在这个过程之后恢复线程执行，这个时候CPU往往会引起一个高峰因为已经有更多的请求等待了</p>

<p>我们把Math.Sqrt这段代码注释掉并且把w3wp和VSTestHost关联到不同的处理器来看看对于CPU计算很少的页面，上图更明显的对比：</p>

<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/WindowsLiveWriter/aec714cfdc70_8CFD/image_thumb_6.png" width="244" height="129" />&#160;</p>

<p>这说明垃圾回收的确会占用很多CPU资源，但这只是一部分，其实我觉得网站的CPU压力来自于几个地方：</p>

<p>1） 就是大量的内存分配带来的垃圾回收所占用的CPU，对于ASP.NET框架内部的很多行为无法控制，但是可以在代码中尽量避免在堆上产生很多不必要的对象</p>

<p>2） 是实际的CPU运算，不涉及IO的运算，这些可以通过改良算法来优化，但是优化比较有限</p>

<p>3） 是IO操作这块，数据量的多少很关键，还有要考虑memcached等外部缓存对象序列化反序列化的消耗</p>

<p>4） 虽然很多IO操作不占用CPU资源，线程处于休眠状态，但是很多时候其实是依托新线程进行的，带来的就是线程切换和线程创建消耗的消耗，这一块可以通过合理使用多线程来优化</p>

<p>发现了这个问题之后优化就很简单了，把Replace操作放到memcached的Set操作之前，取出之后不产生过多大字符串，把for循环改为一次，再来看一下：</p>

<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/WindowsLiveWriter/aec714cfdc70_8CFD/image_thumb_5.png" width="244" height="98" /></p>

<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/WindowsLiveWriter/aec714cfdc70_8CFD/image_thumb_2.png" width="244" height="242" />&#160; </p>

<p>这次内存分配明显少了很多，CPU降下来了，降的不多，但从压力测试监视器中看到页面执行平均时间从5秒变为3秒了，每秒平均请求数从170到了200（最高从200到了300）。在这里要说明一点很多时候网站的性能优化不能光看CPU还要对比优化前后网站的负载，因为在优化之后页面执行时间降低了，负载量就增大了CPU消耗也随之增大。并且可以看到垃圾回收频率的缩短很明显，从长期在30%到几十秒一次30%。</p>

<p>最后想补充几点：</p>

<p>1） 有的时候我们会使用<span style="color: #2b91af">GC</span>.GetTotalMemory(<span style="color: blue">true</span>); 来得到垃圾回收之后内存分配数，类似这样涉及到垃圾回收的代码在项目上线后千万不能出现，否则很可能会% Time in GC达到80%以上大量占用CPU。</p>

<p>2） 对于放在缓存中的对象我们往往会觉得性能得到保障大量去使用，其实缓存实现的只是把创造这个对象过程的时间转化为空间，而在拿到这个对象之后再进行很多运算带来的大量空间始终会进行垃圾回收。做网站和做应用程序不一样，一个操作如果申请200K堆内存，一个页面执行这个操作10次，一秒200多个请求，大家可以自己算一下平均每秒需要分配多少内存，这个数值是相当可怕的，网站是一个多线程的环境，我们对内存的使用要考虑更多。</p><img src="http://www.cnblogs.com/lovecindywang/aggbug/1682344.html?type=1" width="1" height="1" alt=""/><p>评论: 21　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌地图添加自行车路线 提供骑行线路<span style="color:gray">(2010-03-10 15:54)</span><br/>· 华尔街日报：谷歌超速网络建设面临两大挑战<span style="color:gray">(2010-03-10 15:51)</span><br/>· Myspace联席总裁：网站将全新改版以夺回市场<span style="color:gray">(2010-03-10 15:46)</span><br/>· Sun首席开源官菲普斯离职<span style="color:gray">(2010-03-10 15:29)</span><br/>· 腾讯在Facebook发布首款社交游戏“牧场生活”<span style="color:gray">(2010-03-10 15:26)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47324</link>
<title><![CDATA[续 一些VC经验 (终于找到粘附件的地方了，这下下载方便了)]]></title>
<author>郑晓源</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 11:02:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47324</guid>
<description><![CDATA[ 续 一些VC经验 (终于找到粘附件的地方了，这下下载方便了)&nbsp; <br>如果下不了，请直接邮我 jetty2k_kyj@163.com&nbsp;，来信必复。<br>欢迎交流，共同进步。<br>点击下载( rar[txts] )：/Files/jetty2k-kyj/vc.rar
<img src ="http://www.cppblog.com/jetty2k-kyj/aggbug/109339.html" width = "1" height = "1" /><br><br><div align=right>郑晓源 2010-03-10 11:02 发表评论</div> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47304</link>
<title><![CDATA[ASP.NET MVC 路由规则XML化]]></title>
<author>tandly</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 10:46:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47304</guid>
<description><![CDATA[ <p>阅读: 582 评论: 7 作者: tandly 发表于 2010-03-10 10:46 原文链接</p><p>&nbsp; 很久没写文章了，不是懒得写，是写不出。。</p>
<p>&nbsp; 最近由于工作关系，重新回顾了ASP.NET MVC 的 1.0 版本。2.0版本还没有研究。</p>
<p>由于MVC框架发展不久，还有很多不足的地方。其中关于路由规则配置这一块问题比较大。首先路由规则是在全局配置问价 Global.asax 的 Application_Start()事件中注册的。</p>
<p>&nbsp;</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">	public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "User",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "User", action = "Show", id = "0" }  // Parameter defaults
            );
        }

        protected void Application_Start()
        {

            RegisterRoutes(RouteTable.Routes);

        }</pre>
<p>&nbsp;</p>
<p>默认硬编码的方式使得以后可维护程度大大降低。MVC 1.0 似乎没有提供很好的基于配置文件的路由规则设置。所以只好自己实现了。直到写这篇文章时，才找到了一个比较好的解决方案。</p>
<p>&nbsp;</p>
<p>以下是 自定义的XML 格式</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;MapRoutes&gt;</pre>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">  &lt;!--默认规则--&gt;
  &lt;MapRoute name="Default" url="{controller}/{action}"&gt;
    &lt;Params&gt;
      &lt;Item key="controller" default="Article"/&gt;
      &lt;Item key="action" default="Index"/&gt;
    &lt;/Params&gt;
  &lt;/MapRoute&gt;

  &lt;!--显示新闻列表的路由规则--&gt;
  &lt;MapRoute name="ShowArticleList" url="{controller}/{action}/{typeId}/{pageIndex}/{pageSize}"&gt;
    &lt;Params&gt;
      &lt;Item key="controller" default="Article"/&gt;
      &lt;Item key="action" default="Index"/&gt;
      &lt;Item key="typeId" default="1"/&gt;
      &lt;Item key="pageIndex" default="1"/&gt;
      &lt;Item key="pageSize" default="10"/&gt;
    &lt;/Params&gt;
  &lt;/MapRoute&gt;

&lt;/MapRoutes&gt;</pre>
<p>&nbsp;</p>
<p>一下是全部代码</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">/* ***********************************************
 * 作者 :汤晓华/tension 任何转载请务必保留此头部信息 版权所有 盗版必究
 * Email:tension1990@hotmail.com 
 * 描述 :
 * 创建时间:2010-3-9 15:17:26
 * 修改历史:
 * ***********************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;
using System.Xml.Linq;
using Microsoft.CSharp;
using System.CodeDom.Compiler;

namespace Tension.Mvc
{
    public static class RouteHelper
    {
        /// &lt;summary&gt;
        /// 从XML文件中注册路由规则
        /// &lt;/summary&gt;
        /// &lt;param name="routes"&gt;&lt;/param&gt;
        /// &lt;param name="cfgFile"&gt;&lt;/param&gt;
        public static void Register(this RouteCollection routes, string cfgFile)
        {

            IList&lt;Route&gt; Routes = GetRoutes(cfgFile);

            foreach (var item in Routes)
            {
                //路由规则对象
                object obj = CreateObjectFormString(item.ToString(), item.Name);
                routes.MapRoute(
                       item.Name,               // Route name
                       item.Url,                // URL with parameters
                        obj                     // Parameter defaults
                   );

            }
        }

        /// &lt;summary&gt;
        ///  从XML文件中注册路由规则 默认文件为网站根目录下MapRoute.config
        /// &lt;/summary&gt;
        /// &lt;param name="routes"&gt;&lt;/param&gt;
        public static void Register(this RouteCollection routes)
        {
            Register(routes, string.Format("{0}\\MapRoute.config", Tension.ServerInfo.GetRootPath()));
        }


        /// &lt;summary&gt;
        /// 从string动态创建类对象
        /// &lt;/summary&gt;
        /// &lt;param name="codeString"&gt;&lt;/param&gt;
        /// &lt;param name="className"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        private static object CreateObjectFormString(string codeString, string className)
        {
            CSharpCodeProvider ccp = new CSharpCodeProvider();
            CompilerParameters param = new CompilerParameters(new string[] { "System.dll" });
            CompilerResults cr = ccp.CompileAssemblyFromSource(param, codeString);
            Type type = cr.CompiledAssembly.GetType(className);
            return type.GetConstructor(System.Type.EmptyTypes).Invoke(null);
        }

        /// &lt;summary&gt;
        /// 从XML文件中解析路由规则
        /// &lt;/summary&gt;
        /// &lt;param name="configFile"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        private static IList&lt;Route&gt; GetRoutes(string configFile)
        {
            StringBuilder sb = new StringBuilder();


            Console.WriteLine(sb.ToString());
            IList&lt;Route&gt; Routes = new List&lt;Route&gt;();

            XElement xe = XElement.Load(configFile);

            #region MyRegion
            foreach (var item in xe.Elements("MapRoute"))
            {

                //名称属性
                XAttribute xaName = item.Attribute("name");
                if (xaName == null || string.IsNullOrEmpty(xaName.Value))
                {
                    throw new ArgumentNullException("name！说明：路由配置文件中某规则缺少name属性或name属性的值为空字符串");
                }

                //URL属性
                XAttribute urlName = item.Attribute("url");
                if (urlName == null || string.IsNullOrEmpty(urlName.Value))
                {
                    throw new ArgumentNullException("url！说明：路由配置文件中某规则缺少url属性或url属性的值为空字符串");
                }


                Dictionary&lt;string, string&gt; DictParams = new Dictionary&lt;string, string&gt;();



                #region MyRegion
                foreach (var pItem in item.Element("Params").Elements("Item"))
                {
                    XAttribute itemKey = pItem.Attribute("key");
                    if (itemKey == null || string.IsNullOrEmpty(itemKey.Value))
                    {
                        throw new ArgumentNullException("Item-&gt;key！说明：路由配置文件中某规则缺少Item-&gt;key属性或Item-&gt;key属性的值为空字符串");
                    }

                    XAttribute itemDefault = pItem.Attribute("default");
                    if (itemDefault == null || string.IsNullOrEmpty(itemDefault.Value))
                    {
                        throw new ArgumentNullException("Item-&gt;default！说明：路由配置文件中某规则缺少Item-&gt;default属性或Item-&gt;default属性的值为空字符串");
                    }
                    DictParams.Add(itemKey.Value, itemDefault.Value);
                }
                #endregion

                Routes.Add(new Route() { Name = xaName.Value, Url = urlName.Value, Params = DictParams });


            }
            #endregion

            return Routes;
        }
    }


    /// &lt;summary&gt;
    /// 路由规则
    /// &lt;/summary&gt;
    public class Route
    {
        public string Name { get; set; }
        public string Url { get; set; }
        public Dictionary&lt;string, string&gt; Params { get; set; }

        /// &lt;summary&gt;
        /// 重写ToString 方法 产生需要动态代码段
        /// &lt;/summary&gt; 
        /// &lt;returns&gt;&lt;/returns&gt;
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("public class {0}", Name);
            sb.Append("{");
            foreach (var item in Params)
            {
                sb.AppendFormat("public string {0}", item.Key);
                sb.Append("{get{return \"");
                sb.Append(item.Value);
                sb.Append("\";}} ");
            }

            sb.Append("}");
            return sb.ToString();
        }
    }
}</pre>
<p>&nbsp;</p>
<p>在实现过程中遇到的最大问题就是 参数列表的动态装载 看一下以下代码</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"> routes.MapRoute(
                "User",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "User", action = "Show", id = "0" }  // Parameter defaults
            );</pre>
<p>&nbsp;</p>
<p>这是硬编码实现的路由规则注册 </p>
<p>其中 第三个参数（new { controller = "User", action = "Show", id = "0" } ） 是一个匿名对象</p>
<p>该对象如何动态构建成了难题。（才疏学浅） </p>
<p>尝试着传入一个 Dictionary&lt;K,T&gt; 但是没有用，ASP.NET 解析这个参数的时候是以反射形式读取的对象属性。</p>
<p>后来想到了使用代码段 在运行时动态创建对象。</p>
<p>&nbsp;</p>
<p>我们将类似代码段</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">public class Default{public string controller{get{return "Article";}} public str
ing action{get{return "Index";}} public string id{get{return "0";}} public strin
g page{get{return "1";}} public string size{get{return "10";}} }</pre>
<p>&nbsp;</p>
<p>传入方法</p>
<p>&nbsp;</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">private static object CreateObjectFormString(string codeString, string className)
        {
            CSharpCodeProvider ccp = new CSharpCodeProvider();
            CompilerParameters param = new CompilerParameters(new string[] { "System.dll" });
            CompilerResults cr = ccp.CompileAssemblyFromSource(param, codeString);
            Type type = cr.CompiledAssembly.GetType(className);
            return type.GetConstructor(System.Type.EmptyTypes).Invoke(null);
        }</pre>
<p>&nbsp;</p>
<p>即可有运行时动态的创建我们需要的参数对象。</p>
<p>以后就可以方便的在XML注册路由了。</p>
<p>public static void Register(this RouteCollection routes)&nbsp; 对 RouteCollection 对象添加了扩展方法</p>
<p>引入对应的命名空间后就方便的注册了。</p>
<p>&nbsp;</p>
<p>改进后的注册方法</p>
<p>&nbsp;</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        }

        protected void Application_Start()
        {

            RegisterRoutes(RouteTable.Routes);

            //执行RouteCollection的扩展方法 用来注册XML文件中的路由配置信息
            RouteTable.Routes.Register();
        }</pre>
<p>&nbsp;</p>
<p>代码下载地址</p>
<p>/tandly/MvcRouteHelper.rar</p>
<p>&nbsp;</p>
<p>苏州 晴 </p>
<p>汤晓华 QQ 1881597 MSN tension1990@hotmail.com</p>
<p>2010 03 10</p><img src="http://www.cnblogs.com/tandly/aggbug/1682301.html?type=1" width="1" height="1" alt=""/><p>评论: 7　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌地图添加自行车路线 提供骑行线路<span style="color:gray">(2010-03-10 15:54)</span><br/>· 华尔街日报：谷歌超速网络建设面临两大挑战<span style="color:gray">(2010-03-10 15:51)</span><br/>· Myspace联席总裁：网站将全新改版以夺回市场<span style="color:gray">(2010-03-10 15:46)</span><br/>· Sun首席开源官菲普斯离职<span style="color:gray">(2010-03-10 15:29)</span><br/>· 腾讯在Facebook发布首款社交游戏“牧场生活”<span style="color:gray">(2010-03-10 15:26)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47305</link>
<title><![CDATA[为什么我的敏捷项目有如此多的问题？]]></title>
<author>taowen</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 10:22:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47305</guid>
<description><![CDATA[ <p>阅读: 945 评论: 14 作者: taowen 发表于 2010-03-10 10:22 原文链接</p><p>OK，敏捷哈。不争论什么是敏捷。我们来看一些现象，然后你来告诉我，你有没有遇到过这些问题。</p>
<p><strong>没人提真正的Feedback</strong></p>
<p>每个迭代结束之后，我都会做Showcase。但是从Showcase上收集到最多的，就是UI的问题，字体太小之类的。每个Release发布之后，项目都会部署一个试用版本。但就是不见真正的用户来&ldquo;试用&rdquo;，就更别提Feedback了。敏捷不是强调Feedback吗？客户（Customer）时间不够，同时他们也不是最终用户，提不出足够有深度的Feedback。而最终用户呢，压根就没兴趣。</p>
<p><strong>架构咋弄啊</strong></p>
<p>每个迭代都要被催着出东西，哪里有时间弄架构哦。一开始就一个劲的加功能。前几个迭代大家都很Happy，功能出来的特别快。后来就越来越慢了，团队情绪也很差。</p>
<p><strong>客户说没有不是Must Have的</strong></p>
<p>事情实在太多了，做不完呀。那让客户来排优先级吧，把哪些是Must Have的找出来。但是客户说了，这些都很重要，没有这个Feature，或者那个Feature系统就压根没有用处。</p>
<p><strong>路漫漫其修远兮，我到底在往哪走</strong></p>
<p>团队的成员越来越多地在抱怨，天天做Story。但是这些Story都是干什么用的呢？这做一点，那做一点，根本就整合不到一个Vision里去。客户说，我给了你Vision啊，你看这个Feature那个Feature，这些要做的东西就是我们的Vision啊（心里还在犯嘀咕呢，你们干活的吵什么吵）。</p>
<p>&nbsp;</p>
<p>这些问题都有一个相同的最终根源。我们先来看最明显的Feedback问题。为什么客户和最终用户都不提Feedback？因为不关他们的事！做Showcase不过就是在眼前晃两下，有深度的Feedback不是那么容易及时地想到的。而Release又有多少是真正部署到产品环境的？最终用户一方面还用这旧的系统，天天忙着四脚朝天的，哪里有时间来试用我们的新系统呢？无论你是设置了一个测试机在他的桌子旁边，还是一天三次的发Email提醒。只要你的系统不是完成他工作必须的一部分，他就不会理你。</p>
<p>为什么Release出来的系统不能部署到Production环境呢？这不是很奇怪吗。是的，确实很奇怪。但是，假如你是客户，你被你的组织委任了一个替换现有系统的差事。现有的系统有100个功能，完全开发完这些功能可能需要两年。但是，每三个月都有一次绩效考核。你会不会希望每三个月，就让领导看到你都弄出了点了啥？于是你找到了一个号称可以做敏捷开发的外包公司，要求他们每三个月给你出一个版本。但是这个版本能真正上Production么？不能！现有系统有100个功能，那么多用户在用呢。你三个月弄出来的系统怎么替换这么大一个系统啊？一个&ldquo;成熟的企业&rdquo;，对于一个这样系统的GO OR NOT GO MEETING都要开三个月呢。</p>
<p>也许你要说，我们是真正的Green Field开发，彻底重头写的。那么有你开发的系统之前，这家企业是怎么运作的？至少有一个Paper Process吧。没有电子系统，人们就用纸笔，各种单据来工作呗。IT系统不过是Paper Process的自动化而已。再说了，这年头还真没几个请得起我们，而且现在还没有一个IT系统的，需要从Paper Process开始的？</p>
<p>除非你做的是非常有创新性的企业开发。通过创新性的IT系统，开发新的业务。比如通过新的交易应用来辅助新的Margin Loan产品的市场投放。大部分时间来说，我们都是被引入进来&ldquo;替换&rdquo;现有的Paper Process，或者现有的遗留应用的。</p>
<p>&nbsp;</p>
<p>假设我们要替换的就是一个有100个功能的遗留应用，我们是怎么来&ldquo;玩&rdquo;敏捷的呢？基本上来说，我们假设了一个温室的环境。在这个环境里，你可以假设你做的是Green Field的开发。把100个功能，分成多个Release，每个Release又分成多个Iteration。在每个Release之后都会发布一个Pilot版本给测试用户试用。这样就可以迭代式地添加Feature，直到最后能够替换原有的系统。从我的经验看来，正是这种做法，部分导致了以上问题（甚至有些情况下是根源）。前面已经提到了，这样会导致缺少来自最终用户的，真正的Feedback。其次，由于少了一个Feature都无法替换旧的系统，客户很难做出优先级的正确选择。以替换旧的系统为目的，所有的Feature都是Must Have。同时这样会导致每个Release缺乏明确的，唯一的Goal。经常是这个Feature做一些，那个Feature做一些，Team会觉得没有明确的目标。</p>
<p>&nbsp;</p>
<p>如果我们不以替换旧的系统为目标？那么应该以什么为目标？这个时候你可以去看看Eric Evan的Strategic Design。他说，你应该想想What drives you to spend million dollars on this project in the first place（你为什么在最开始要在这个项目上决定花上一百万美元）。这个背后一定是原因的。基于对这个原因的理解，我们可以选定一定的Feature来实现。然后就开始实现，然后把实现部署了让所有的用户去用。用这种策略，而不是前面那种策略，这样就逼着我们去做很多事情。而我相信这些事情，很有可能就有助于解决前面四个问题。特别是，其中的架构问题。为什么呢？架构是什么？架构就是对问题的一种分解方式。怎么样才能迫使我们去思考架构问题呢？在现有的系统上打个洞，然后挖掉一块，围一道墙，里面再把新的Feature做出来。没有对系统整体的了解，没有对模块的分解，没有对模块之间耦合依赖关系的分析，是不可能做到这些的。这样就迫使我们做出一个低耦合高内聚的架构！</p>
<p>&nbsp;</p>
<p>把这种策略做到极致就是之前我说过的持续部署才是王道。不但每个Release都和旧的系统集成起来，然后真正的部署。甚至，我们可以做到每个迭代都部署。在Fred George描述的团队里，甚至都没有迭代。一个Feature开发出来就立马被部署了。</p><img src="http://www.cnblogs.com/taowen/aggbug/1682104.html?type=1" width="1" height="1" alt=""/><p>评论: 14　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌地图添加自行车路线 提供骑行线路<span style="color:gray">(2010-03-10 15:54)</span><br/>· 华尔街日报：谷歌超速网络建设面临两大挑战<span style="color:gray">(2010-03-10 15:51)</span><br/>· Myspace联席总裁：网站将全新改版以夺回市场<span style="color:gray">(2010-03-10 15:46)</span><br/>· Sun首席开源官菲普斯离职<span style="color:gray">(2010-03-10 15:29)</span><br/>· 腾讯在Facebook发布首款社交游戏“牧场生活”<span style="color:gray">(2010-03-10 15:26)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
<item>
<link>http://h31home.com/rss/blogto.asp?ID=47306</link>
<title><![CDATA[silverlight 之 – Blend 之 Style for Button （三）]]></title>
<author>zhanxp</author>
<category><![CDATA[]]></category>
<pubDate>2010-3-10 10:11:00</pubDate>
<guid>http://h31home.com/rss/blogto.asp?ID=47306</guid>
<description><![CDATA[ <p>阅读: 455 评论: 3 作者: zhanxp 发表于 2010-03-10 10:11 原文链接</p><p>通过把定义的样式加入资源字典(Style.xaml)的方法大大方便的我们后续的工作，我们再次使用时只有选择&ldquo;样式库&rdquo;标签就可以快速设置，同时有利于设计的统一性；</p>
<p>&nbsp;</p>
<p>但是当我们尝试用我们定义的样式来填充一个按钮时，发现他还是白色的，几乎没什么变化：</p>
<p>&nbsp;</p>
<p><img height="244" width="128" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE08_thumb.jpg" alt="截图08" border="0" title="截图08" style="display: inline; border: 0px;" /> </p>
<p>（分别是：Border，Grid，Canvas，StackPanel，Button）</p>
<p>那么下面我们就来研究下 button的样式制作？</p>
<p>开始之前我们准备足够用的&ldquo;库样式&rdquo;；</p>
<p>在这里纠正一下我发现在新的方法来定义资源字典（<strong>我很菜的，也才研究，请原谅</strong>）</p>
<p><strong>在填充后面会有一个小白色的框，点击以后里面有转换为新资源这一项</strong></p>
<p><img height="244" width="166" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE09_thumb.jpg" alt="截图09" border="0" title="截图09" style="display: inline; border: 0px;" />&nbsp;&nbsp; <img height="209" width="325" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE10_thumb.jpg" alt="截图10" border="0" title="截图10" style="display: inline; border: 0px;" /> </p>
<p>&nbsp;</p>
<p>同时我们准备几个将要用到的&ldquo;单色填充&rdquo;，做完以后 ColorCard.xaml 页面是这样：</p>
<p><img height="244" width="201" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE11_thumb.jpg" alt="截图11" border="0" title="截图11" style="display: inline; border: 0px;" /> </p>
<p>ColorCard.xaml&nbsp; 代码：</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">	&lt;Grid x:Name="LayoutRoot" Background="#FF6A6A6A"&gt;
		&lt;Rectangle Fill="{StaticResource FA}" Stroke="Black" Height="50" HorizontalAlignment="Left" Margin="33,37,0,0" VerticalAlignment="Top" Width="151"/&gt;
		&lt;Rectangle Stroke="Black" Height="50" HorizontalAlignment="Left" Margin="33,113,0,0" VerticalAlignment="Top" Width="151" Fill="{StaticResource FB}"/&gt;
		&lt;Rectangle Stroke="Black" Height="50" HorizontalAlignment="Left" Margin="33,181,0,0" VerticalAlignment="Top" Width="151" Fill="{StaticResource FC}"/&gt;
		&lt;Rectangle Stroke="Black" Height="50" HorizontalAlignment="Left" Margin="33,0,0,177" VerticalAlignment="Bottom" Width="151" Fill="{StaticResource FD}"/&gt;
		&lt;Rectangle Stroke="Black" Height="50" HorizontalAlignment="Left" Margin="33,0,0,103" VerticalAlignment="Bottom" Width="151" Fill="{StaticResource FE}"/&gt;
		&lt;Rectangle Stroke="Black" Height="50" HorizontalAlignment="Left" Margin="33,0,0,32" VerticalAlignment="Bottom" Width="151" Fill="{StaticResource FF}"/&gt;
		&lt;Rectangle Fill="{StaticResource CA}" Stroke="Black" Height="50" Margin="217,37,272,0" VerticalAlignment="Top"/&gt;
		&lt;Rectangle Fill="{StaticResource CB}" Stroke="Black" Height="50" Margin="217,113,272,0" VerticalAlignment="Top"/&gt;
		&lt;Rectangle Fill="{StaticResource CC}" Stroke="Black" Height="50" Margin="217,181,272,0" VerticalAlignment="Top"/&gt;
		&lt;Rectangle Fill="{StaticResource CD}" Stroke="Black" Height="50" Margin="217,0,272,177" VerticalAlignment="Bottom"/&gt;
		&lt;Rectangle Fill="{StaticResource CE}" Stroke="Black" Height="50" Margin="217,0,272,103" VerticalAlignment="Bottom"/&gt;
		&lt;Rectangle Fill="{StaticResource CF}" Stroke="Black" Height="50" Margin="217,0,272,32" VerticalAlignment="Bottom"/&gt;
		&lt;TextBlock Height="17" HorizontalAlignment="Left" Margin="73,54,0,0" VerticalAlignment="Top" Width="69" Foreground="White" TextWrapping="Wrap"&gt;&lt;Run Text="F"/&gt;&lt;Run Text="A"/&gt;&lt;/TextBlock&gt;
		&lt;TextBlock Height="17" HorizontalAlignment="Left" Margin="73,133,0,0" VerticalAlignment="Top" Width="69" Foreground="White" TextWrapping="Wrap" Text="FB"/&gt;
		&lt;TextBlock Height="17" HorizontalAlignment="Left" Margin="73,196,0,0" VerticalAlignment="Top" Width="69" Foreground="White" TextWrapping="Wrap" Text="FC"/&gt;
		&lt;TextBlock Height="17" HorizontalAlignment="Left" Margin="73,0,0,195" VerticalAlignment="Bottom" Width="69" Foreground="White" TextWrapping="Wrap" Text="FD"/&gt;
		&lt;TextBlock Height="17" HorizontalAlignment="Left" Margin="73,0,0,119" VerticalAlignment="Bottom" Width="69" Foreground="White" TextWrapping="Wrap" Text="FE"/&gt;
		&lt;TextBlock Height="17" HorizontalAlignment="Left" Margin="73,0,0,51" VerticalAlignment="Bottom" Width="69" Foreground="White" TextWrapping="Wrap" Text="FF"/&gt;
		&lt;TextBlock Height="17" Margin="268,54,303,0" VerticalAlignment="Top" Foreground="White" Text="CA" TextWrapping="Wrap"/&gt;
		&lt;TextBlock Height="17" Margin="268,133,303,0" VerticalAlignment="Top" Foreground="White" Text="CB" TextWrapping="Wrap"/&gt;
		&lt;TextBlock Height="17" Margin="268,196,303,0" VerticalAlignment="Top" Foreground="White" Text="CC" TextWrapping="Wrap"/&gt;
		&lt;TextBlock Height="17" Margin="268,0,303,195" VerticalAlignment="Bottom" Foreground="White" Text="CD" TextWrapping="Wrap"/&gt;
		&lt;TextBlock Height="17" Margin="268,0,303,119" VerticalAlignment="Bottom" Foreground="White" Text="CE" TextWrapping="Wrap"/&gt;
		&lt;TextBlock Height="17" Margin="268,0,303,51" VerticalAlignment="Bottom" Foreground="White" Text="CF" TextWrapping="Wrap"/&gt;
	&lt;/Grid&gt;	</pre>
<p>&nbsp;</p>
<p>Style.xaml&nbsp; 代码：</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">&lt;LinearGradientBrush x:Key="FA" EndPoint="0.5,1" StartPoint="0.5,0"&gt;
					&lt;GradientStop Color="#FF606060" Offset="0"/&gt;
					&lt;GradientStop Color="Black" Offset="1"/&gt;
					&lt;GradientStop Color="#FE333333" Offset="0.487"/&gt;
					&lt;GradientStop Color="#FE161515" Offset="0.574"/&gt;
	&lt;/LinearGradientBrush&gt;
	&lt;LinearGradientBrush x:Key="FB" EndPoint="0.5,1" StartPoint="0.5,0"&gt;
		&lt;GradientStop Color="#FF6A6A6A"/&gt;
		&lt;GradientStop Color="#FF1A1A1A" Offset="1"/&gt;
		&lt;GradientStop Color="#FF504F4F" Offset="0.481"/&gt;
		&lt;GradientStop Color="#FF333232" Offset="0.553"/&gt;
	&lt;/LinearGradientBrush&gt;
	&lt;LinearGradientBrush x:Key="FC" EndPoint="0.5,1" StartPoint="0.5,0"&gt;
		&lt;GradientStop Color="#FFD0C3C3" Offset="0.004"/&gt;
		&lt;GradientStop Color="#FF393939" Offset="1"/&gt;
		&lt;GradientStop Color="#FF6A6A6A" Offset="0.523"/&gt;
		&lt;GradientStop Color="#FFA39D9D" Offset="0.469"/&gt;
	&lt;/LinearGradientBrush&gt;
	&lt;LinearGradientBrush x:Key="FD" EndPoint="0.5,1" StartPoint="0.5,0"&gt;
		&lt;GradientStop Color="#FFE6E6E6" Offset="0"/&gt;
		&lt;GradientStop Color="#FF979393" Offset="1"/&gt;
		&lt;GradientStop Color="#FFA19898" Offset="0.542"/&gt;
		&lt;GradientStop Color="#FFC2C0C0" Offset="0.485"/&gt;
	&lt;/LinearGradientBrush&gt;
	&lt;LinearGradientBrush x:Key="FE" EndPoint="0.5,1" StartPoint="0.5,0"&gt;
		&lt;GradientStop Color="Black" Offset="0"/&gt;
		&lt;GradientStop Color="#FF5C5C5C" Offset="1"/&gt;
		&lt;GradientStop Color="#FF1A1A1A" Offset="0.42"/&gt;
	&lt;/LinearGradientBrush&gt;
	&lt;LinearGradientBrush x:Key="FF" EndPoint="0.5,1" StartPoint="0.5,0"&gt;
		&lt;GradientStop Color="#FF4484F7" Offset="0"/&gt;
		&lt;GradientStop Color="#FF012D7C" Offset="1"/&gt;
		&lt;GradientStop Color="#FF255FC8" Offset="0.489"/&gt;
		&lt;GradientStop Color="#FF0343B6" Offset="0.557"/&gt;
	&lt;/LinearGradientBrush&gt;
	&lt;SolidColorBrush x:Key="CA" Color="Black"/&gt;
	&lt;SolidColorBrush x:Key="CB" Color="#FF2B2B2B"/&gt;
	&lt;SolidColorBrush x:Key="CC" Color="#FF686666"/&gt;
	&lt;SolidColorBrush x:Key="CD" Color="#FFBCBCBC"/&gt;
	&lt;SolidColorBrush x:Key="CE" Color="#FFED6D00"/&gt;
	&lt;SolidColorBrush x:Key="CF" Color="#FF034BCE"/&gt;</pre>
<p>&nbsp;</p>
<p>这样我们的色卡就走完了，这个页面留着到时候参考用；</p>
<p><strong>突然发现还没进入 关于 button 的主题，</strong></p>
<p>》 1. 好新建一个 UserControlCard.xaml；</p>
<p>》 2. 从左边选择 button 工具创建一个button；</p>
<p>》 3. 选择这个button 从左上角依次点开到 》 编辑副本见下图：</p>
<p><img height="207" width="319" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE12_thumb.jpg" alt="截图12" border="0" title="截图12" style="display: inline; border: 0px;" /> </p>
<p><img height="209" width="323" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE13_thumb.jpg" alt="截图13" border="0" title="截图13" style="display: inline; border: 0px;" /> </p>
<p>确认后进入编辑页面：在左下角依次选择他们，然后在右边设置相应的画笔：（使用我们刚才定义的资源库）</p>
<p><img height="223" width="244" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE14_thumb.jpg" alt="截图14" border="0" title="截图14" style="display: inline; border: 0px;" /> <img height="233" width="244" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE15_thumb.jpg" alt="截图15" border="0" title="截图15" style="display: inline; border: 0px;" /> </p>
<p>&nbsp;</p>
<p>从上面下来，大概分别是（我也不太确定）：</p>
<p>背景》</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 》 鼠标移动到上面时的动画</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 》 好像是类似于遮罩</p>
<p>文本》</p>
<p>不可用时》</p>
<p>获得焦点时》</p>
<p>&nbsp;</p>
<p>最后效果看起来是这样：</p>
<p><img height="151" width="244" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE17_thumb.jpg" alt="截图17" border="0" title="截图17" style="display: inline; border: 0px;" /> </p>
<p>&nbsp;</p>
<p>如果不满意可以反复修改，（反复修改？ 设计师的痛！）：</p>
<p>》 选择按钮以后，</p>
<p>》 依次展开到编辑当前模板</p>
<p>&nbsp;</p>
<p><img height="186" width="354" src="http://images.cnblogs.com/cnblogs_com/zhanxp/WindowsLiveWriter/silverlightBlendStyleforButton_8883/%E6%88%AA%E5%9B%BE18_thumb.jpg" alt="截图18" border="0" title="截图18" style="display: inline; border: 0px;" /> </p>
<p>&nbsp;</p>
<p>恩，蓝色按钮就到这里，最重要是反复研究，而且最好编译一下在浏览器里面看实际<strong>鼠标动作</strong>的样子！</p>
<p>放代码了：</p>
<p>UserControlCard.xaml</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">	&lt;Grid x:Name="LayoutRoot"&gt;
		&lt;Rectangle Fill="{StaticResource FA}" Stroke="Black" Height="57" HorizontalAlignment="Left" VerticalAlignment="Top" Width="163"/&gt;
		&lt;Button Height="41" HorizontalAlignment="Left" Margin="23,7,0,0" Style="{StaticResource BlueButtonStyle}" VerticalAlignment="Top" Width="112" Content="by zhanxp" BorderThickness="2"/&gt;
	&lt;/Grid&gt;</pre>
<p>Style.xaml 中自动生成的：</p>
<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">	&lt;Style x:Key="BlueButtonStyle" TargetType="Button"&gt;
		&lt;Setter Property="Background" Value="#FF1F3B53"/&gt;
		&lt;Setter Property="Foreground" Value="#FFFFFFFF"/&gt;
		&lt;Setter Property="Padding" Value="3"/&gt;
		&lt;Setter Property="BorderThickness" Value="1"/&gt;
		&lt;Setter Property="BorderBrush"&gt;
			&lt;Setter.Value&gt;
				&lt;LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"&gt;
					&lt;GradientStop Color="#FFA3AEB9" Offset="0"/&gt;
					&lt;GradientStop Color="#FF8399A9" Offset="0.375"/&gt;
					&lt;GradientStop Color="#FF718597" Offset="0.375"/&gt;
					&lt;GradientStop Color="#FF617584" Offset="1"/&gt;
				&lt;/LinearGradientBrush&gt;
			&lt;/Setter.Value&gt;
		&lt;/Setter&gt;
		&lt;Setter Property="Template"&gt;
			&lt;Setter.Value&gt;
				&lt;ControlTemplate TargetType="Button"&gt;
					&lt;Grid&gt;
						&lt;VisualStateManager.VisualStateGroups&gt;
							&lt;VisualStateGroup x:Name="CommonStates"&gt;
								&lt;VisualState x:Name="Normal"/&gt;
								&lt;VisualState x:Name="MouseOver"&gt;
									&lt;Storyboard&gt;
										&lt;DoubleAnimationUsingKeyFrames Storyboard.TargetName="BackgroundAnimation" Storyboard.TargetProperty="Opacity"&gt;
											&lt;SplineDoubleKeyFrame KeyTime="0" Value="1"/&gt;
										&lt;/DoubleAnimationUsingKeyFrames&gt;
									&lt;/Storyboard&gt;
								&lt;/VisualState&gt;
								&lt;VisualState x:Name="Pressed"&gt;
									&lt;Storyboard&gt;
										&lt;DoubleAnimationUsingKeyFrames Storyboard.TargetName="BackgroundAnimation" Storyboard.TargetProperty="Opacity"&gt;
											&lt;SplineDoubleKeyFrame KeyTime="0" Value="1"/&gt;
										&lt;/DoubleAnimationUsingKeyFrames&gt;
									&lt;/Storyboard&gt;
								&lt;/VisualState&gt;
								&lt;VisualState x:Name="Disabled"&gt;
									&lt;Storyboard&gt;
										&lt;DoubleAnimationUsingKeyFrames Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="Opacity"&gt;
											&lt;SplineDoubleKeyFrame KeyTime="0" Value=".55"/&gt;
										&lt;/DoubleAnimationUsingKeyFrames&gt;
									&lt;/Storyboard&gt;
								&lt;/VisualState&gt;
							&lt;/VisualStateGroup&gt;
							&lt;VisualStateGroup x:Name="FocusStates"&gt;
								&lt;VisualState x:Name="Focused"&gt;
									&lt;Storyboard&gt;
										&lt;DoubleAnimationUsingKeyFrames Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Opacity"&gt;
											&lt;SplineDoubleKeyFrame KeyTime="0" Value="1"/&gt;
										&lt;/DoubleAnimationUsingKeyFrames&gt;
									&lt;/Storyboard&gt;
								&lt;/VisualState&gt;
								&lt;VisualState x:Name="Unfocused"/&gt;
							&lt;/VisualStateGroup&gt;
						&lt;/VisualStateManager.VisualStateGroups&gt;
						&lt;Border x:Name="Background" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3" BorderBrush="{StaticResource FE}" Background="{StaticResource FF}"&gt;
							&lt;Grid Margin="1"&gt;
								&lt;Border x:Name="BackgroundAnimation" Opacity="0"&gt;
									&lt;Border.Background&gt;
										&lt;LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"&gt;
											&lt;GradientStop Color="#FF1464F3" Offset="0"/&gt;
											&lt;GradientStop Color="#FF01215A" Offset="1"/&gt;
											&lt;GradientStop Color="#FF064BC6" Offset="0.489"/&gt;
											&lt;GradientStop Color="#FF013AA1" Offset="0.557"/&gt;
										&lt;/LinearGradientBrush&gt;
									&lt;/Border.Background&gt;
								&lt;/Border&gt;
								&lt;Rectangle x:Name="BackgroundGradient" Fill="{StaticResource FF}" Opacity="0" OpacityMask="{StaticResource FE}"/&gt;
							&lt;/Grid&gt;
						&lt;/Border&gt;
						&lt;Rectangle x:Name="FocusVisualElement" StrokeThickness="2" RadiusX="2" RadiusY="2" Margin="1" IsHitTestVisible="false" Opacity="0"&gt;
							&lt;Rectangle.Fill&gt;
								&lt;LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"&gt;
									&lt;GradientStop Color="#FF085BF1" Offset="0"/&gt;
									&lt;GradientStop Color="#FF022F80" Offset="1"/&gt;
									&lt;GradientStop Color="#FF125BDE" Offset="0.489"/&gt;
									&lt;GradientStop Color="#FF0343B6" Offset="0.557"/&gt;
								&lt;/LinearGradientBrush&gt;
							&lt;/Rectangle.Fill&gt;
						&lt;/Rectangle&gt;
						&lt;Rectangle x:Name="DisabledVisualElement" Fill="{StaticResource FC}" IsHitTestVisible="false" Opacity="0" RadiusX="2" RadiusY="2"/&gt;
						&lt;ContentPresenter x:Name="contentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/&gt;
					&lt;/Grid&gt;
				&lt;/ControlTemplate&gt;
			&lt;/Setter.Value&gt;
		&lt;/Setter&gt;
	&lt;/Style&gt;
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>谢谢收看~~~</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>silverlight 之 &ndash; Blend 一切源于Brush（一）</p>
<p>silverlight 之 &ndash; Blend 之 LinearGradientBrush （二）</p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/zhanxp/aggbug/1682258.html?type=1" width="1" height="1" alt=""/><p>评论: 3　查看评论　发表评论</p><p>找优秀程序员，就在博客园</p><hr/><p>最新新闻：<br/>· 谷歌地图添加自行车路线 提供骑行线路<span style="color:gray">(2010-03-10 15:54)</span><br/>· 华尔街日报：谷歌超速网络建设面临两大挑战<span style="color:gray">(2010-03-10 15:51)</span><br/>· Myspace联席总裁：网站将全新改版以夺回市场<span style="color:gray">(2010-03-10 15:46)</span><br/>· Sun首席开源官菲普斯离职<span style="color:gray">(2010-03-10 15:29)</span><br/>· 腾讯在Facebook发布首款社交游戏“牧场生活”<span style="color:gray">(2010-03-10 15:26)</span><br/></p><p>编辑推荐：过去十年值得关注的十大技术事件<br/></p><p>网站导航：博客园首页&nbsp;&nbsp;个人主页&nbsp;&nbsp;新闻&nbsp;&nbsp;闪存&nbsp;&nbsp;小组&nbsp;&nbsp;博问&nbsp;&nbsp;社区&nbsp;&nbsp;知识库</p> ]]></description>
</item>
</channel>
</rss>
