﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-♂风车车.Net</title><link>http://www.cnblogs.com/xray2005/</link><description>－－要飞翔，必须靠自己！</description><language>zh-cn</language><lastBuildDate>Mon, 08 Sep 2008 09:34:15 GMT</lastBuildDate><pubDate>Mon, 08 Sep 2008 09:34:15 GMT</pubDate><ttl>60</ttl><item><title>[转]用powerdesigner创建access数据库 </title><link>http://www.cnblogs.com/xray2005/archive/2008/06/20/1227126.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Fri, 20 Jun 2008 15:12:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2008/06/20/1227126.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/1227126.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2008/06/20/1227126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/1227126.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/1227126.html</trackback:ping><description><![CDATA[<font face="Verdana">用powerdesigner创建access数据库&nbsp;</font>&nbsp;<br />
1、先用powerdesigner设计好表，生成sql语句。<br />
2、创建一个access空的数据库。<br />
3、打开powerdesigner所在目录，下边有一个Tools目录，打开目录下的Access.mdb<br />
4、双击出现一个对话框，选择好数据库文件(.mdb),选择好刚才生成的sql文件，点击creat。<br />
5、OK。<br />
<br />
本文转自 天使の泪的Blogs：<font face="Verdana">http://www.cnblogs.com/xioxu/archive/2006/08/23/484308.html</font>
<img src ="http://www.cnblogs.com/xray2005/aggbug/1227126.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42144/" target="_blank">[新闻]千亿美元市值榜:微软居首移动第二 诺基亚退榜</a>]]></description></item><item><title>[转]使用LINQ来简化编程的7个技巧 </title><link>http://www.cnblogs.com/xray2005/archive/2008/06/14/1221042.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Sat, 14 Jun 2008 03:53:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2008/06/14/1221042.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/1221042.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2008/06/14/1221042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/1221042.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/1221042.html</trackback:ping><description><![CDATA[使用LINQ来简化编程的7个技巧 <br />
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">转自：LoveCherry的Blogs，<font face="Verdana">http://www.cnblogs.com/lovecherry/archive/2008/05/23/1205565.html</font><br />
<br />
原文地址：<a href="http://igoro.com/archive/7-tricks-to-simplify-your-programs-with-linq/">http://igoro.com/archive/7-tricks-to-simplify-your-programs-with-linq/</a></span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">自从学习LINQ以来，我发现了很多使用LINQ来改善代码的方式。每一个技巧都让代码写起来更简单，可读性更强。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">这里总结了这些技巧。我会介绍如何使用LINQ来：</span></p>
<ul type="disc">
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">初始化数组</span>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">在一个循环中遍历多个数组</span>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">生成随机序列</span>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">生成字符串</span>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">转换序列或集合</span>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">把值转换为长度为1的序列</span>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">遍历序列的所有子集</span> </li>
</ul>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">如果你在LINQ方面有心得也欢迎在评论中一起分享。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">1. </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">初始化数组</span></strong></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">通常，我们需要把数组的值初始化为相同的值或递增的序列值，或者可能是一个步进不为1的递增/递减序列。有了LINQ，我们可以在数组的初始化器中完成所有工作，不再需要循环！</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">在如下的示例代码中，第一行代码初始化了一个长度为10的数组，所有元素都是-1，第二行代码初始化b为0、1、2到9，第三行代码初始化c为100、110、120到190.</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">int</span><span style="font-size: 12pt; font-family: 宋体">[] a = <span style="color: #2b91af">Enumerable</span>.Repeat(-1, 10).ToArray();</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">int</span><span style="font-size: 12pt; font-family: 宋体">[] b = <span style="color: #2b91af">Enumerable</span>.Range(0, 10).ToArray();</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">int</span><span style="font-size: 12pt; font-family: 宋体">[] c = <span style="color: #2b91af">Enumerable</span>.Range(0, 10).Select(i =&gt; 100 + 10 * i).ToArray();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">要提醒一下：如果你初始化一个很大的数组，最好不考虑这种优雅的方式而是使用传统的方式来替代。LINQ的这种解决方案会动态产生数组，因此垃圾数组需要在运行时被回收。也就是说，我总是会在小数组或测试调试代码的情况下使用这种技巧。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">2. </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">在一个循环中遍历多个数组</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">有个朋友问我一个C#的问题：有没有办法在一个循环中遍历多个集合？他的代码差不多是这样：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">foreach </span><span style="font-size: 12pt; font-family: 宋体">(<span style="color: blue">var </span>x <span style="color: blue">in </span>array1) {</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; DoSomething(x);</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">}</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">foreach </span><span style="font-size: 12pt; font-family: 宋体">(<span style="color: blue">var </span>x <span style="color: blue">in </span>array2) {</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; DoSomething(x);</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">这样的话，循环主体会很大，而且他也不希望这样重复的代码。但是，他又不希望创建一个数组来保存array1和array2的所有元素。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; LINQ</span><span style="font-size: 12pt; font-family: 宋体">提供了一种优雅的解决方案：Concat操作。我们可以使用单个循环来重写上面的代码，如下：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">foreach </span><span style="font-size: 12pt; font-family: 宋体">(<span style="color: blue">var </span>x <span style="color: blue">in </span>array1.Concat(array2)) {</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; DoSomething(x);</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">注意，由于LINQ在枚举器级别进行操作，他不会产生新的数组来保存array1和array2的元素。因此，除了优雅之外，这个方案还很高效。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">3. </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">生成随机序列</span></strong></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">这是一个生成N长度随机序列的简单技巧：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: #2b91af; font-family: 宋体">Random </span><span style="font-size: 12pt; font-family: 宋体">rand = <span style="color: blue">new </span><span style="color: #2b91af">Random</span>();</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">var </span><span style="font-size: 12pt; font-family: 宋体">randomSeq = <span style="color: #2b91af">Enumerable</span>.Repeat(0, N).Select(i =&gt; rand.Next());</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">有了LINQ的延迟特性，序列不会实现进行计算并保存到数组中，而是在迭代randomSeq的时候按需生成随机数。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">4. </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">生成字符串</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; LINQ</span><span style="font-size: 12pt; font-family: 宋体">同样也是生成各种类型字符串的好工具。对于测试或调试，生成字符串时很有用的。假设我们需要生成一个N长度的字符串，按照&#8220;ABCABCABC&#8221;的方式。使用LINQ，解决方案非常优雅：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">string </span><span style="font-size: 12pt; font-family: 宋体">str = <span style="color: blue">new string</span>(</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">Enumerable</span>.Range(0, N)</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; .Select(i =&gt; (<span style="color: blue">char</span>)(<span style="color: #a31515">&#8216;A&#8217; </span>+ i % 3))</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; .ToArray());</span></p>
<p style="text-align: left" align="left"><em><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; Petar Petrov</span></em><em><span style="font-size: 12pt; font-family: 宋体">给出了另外一种有趣的方式使用LINQ来生成字符串：</span></em></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">string </span><span style="font-size: 12pt; font-family: 宋体">values = <span style="color: blue">string</span>.Join(<span style="color: blue">string</span>.Empty, <span style="color: #2b91af">Enumerable</span>.Repeat(pattern, N).ToArray());</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">5. </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">转换序列或集合</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">在C#或VB中我们不能实现把序列从T类型转换为U类型，即使T从U类继承。因此，即使把List&lt;string&gt;转换为List&lt;object&gt;也很难实现。（要解释为什么，请看Bick Byer的<a href="http://blogs.msdn.com/rmbyers/archive/2005/02/16/375079.aspx">帖子</a>）。但是如果要把IEnumerable&lt;T&gt;转换为IEnumerable&lt;U&gt;的话，LINQ有一个简单而有效的解决方案：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: #2b91af; font-family: 宋体">IEnumerable</span><span style="font-size: 12pt; font-family: 宋体">&lt;<span style="color: blue">string</span>&gt; strEnumerable = &#8230;;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: #2b91af; font-family: 宋体">IEnumerable</span><span style="font-size: 12pt; font-family: 宋体">&lt;<span style="color: blue">object</span>&gt; objEnumerable = strEnumerable.Cast&lt;<span style="color: blue">object</span>&gt;();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">如果我们需要转换List&lt;T&gt;为List&lt;U&gt;，LINQ也提供了解决方案，但是它会进行列表的复制：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: #2b91af; font-family: 宋体">List</span><span style="font-size: 12pt; font-family: 宋体">&lt;<span style="color: blue">string</span>&gt; strList = &#8230;;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: #2b91af; font-family: 宋体">List</span><span style="font-size: 12pt; font-family: 宋体">&lt;<span style="color: blue">object</span>&gt; objList = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: blue">object</span>&gt;(strList.Cast&lt;<span style="color: blue">object</span>&gt;());</span></p>
<p style="text-align: left" align="left"><em><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; <a href="http://chriscavanagh.wordpress.com/">Chris Cavanagh</a></span></em><em><span style="font-size: 12pt; font-family: 宋体">建议另外一种解决方式：</span></em></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">var </span><span style="font-size: 12pt; font-family: 宋体">objList = strList.Cast&lt;<span style="color: blue">object</span>&gt;().ToList();</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">6. </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">把值转换为长度为1的序列</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">当我们需要把单个值转化为一个长度为1的序列时，会怎么做？我们可以创建一个长度为1的数组，但是我还是喜欢LINQ的Repeat操作：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: #2b91af; font-family: 宋体">IEnumerable</span><span style="font-size: 12pt; font-family: 宋体">&lt;<span style="color: blue">int</span>&gt; seq = <span style="color: #2b91af">Enumerable</span>.Repeat(myValue, 1);</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">7. </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">遍历序列的所有子集</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">有的时候，遍历数组的所有子集很有用。<a href="http://en.wikipedia.org/wiki/Subset_sum">子集和问题</a>、<a href="http://en.wikipedia.org/wiki/Boolean_satisfiability_problem">布尔可满足性问题</a>以及<a href="http://en.wikipedia.org/wiki/Knapsack_problem">背包问题</a>都可以通过遍历某个序列的所有子集来简单解决。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">有了LINQ，我们可以如下声场所有arr数组的子集：</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">T[] arr = ...;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">var </span><span style="font-size: 12pt; font-family: 宋体">subsets = <span style="color: blue">from </span>m <span style="color: blue">in </span><span style="color: #2b91af">Enumerable</span>.Range(0, 1 &lt;&lt; arr.Length)</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">select</span></span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: blue; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from </span><span style="font-size: 12pt; font-family: 宋体">i <span style="color: blue">in </span><span style="color: #2b91af">Enumerable</span>.Range(0, arr.Length)</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">where </span>(m &amp; (1 &lt;&lt; i)) != 0</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">select </span>arr[i];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">注意，如果子集的个数超过了int，上面的代码就不能工作。因此，仅当你知道arr的长度不超过30的时候才去使用这个方式。如果arr长度超过30，你应该不会是想去遍历所有的子集，因为可能这会耗费几分钟或更长的时间。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">评论和总结</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体">希望这些技巧对你有用，这些示例代码都使用C#实现，但是你可以很容易得改变为其它.NET语言。然而，LINQ对于支持扩展方法、lambda表达式和类型推断的语言更方便，比如C#和VB。这里的每一段代码都可行，但是我不能保证什么，请在使用前仔细检查。</span></p>
<img src ="http://www.cnblogs.com/xray2005/aggbug/1221042.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42142/" target="_blank">[新闻]Google申请“海上数据中心”专利 可能付诸行动</a>]]></description></item><item><title>LDAP 查询基本知识</title><link>http://www.cnblogs.com/xray2005/archive/2008/05/07/1187504.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Wed, 07 May 2008 14:30:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2008/05/07/1187504.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/1187504.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2008/05/07/1187504.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/1187504.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/1187504.html</trackback:ping><description><![CDATA[<h2>基本 LDAP 语法</h2>
<table cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td class="listBullet" valign="top">&#8226;</td>
            <td class="listItem">
            <p><strong>=（等于）</strong></p>
            <p>此 LDAP 参数表明某个属性等于某个值的条件得到满足。例如，如果希望查找&#8220;名&#8220;属性为&#8220;John&#8221;的所有对象，可以使用：</p>
            <p><span class="codeSample">(givenName=John)</span></p>
            <p>这会返回&#8220;名&#8221;属性为&#8220;John&#8221;的所有对象。圆括号是必需的，以便强调 LDAP 语句的开始和结束。</p>
            </td>
        </tr>
        <tr>
            <td class="listBullet" valign="top">&#8226;</td>
            <td class="listItem">
            <p><strong>&amp;（逻辑与）</strong></p>
            <p>如果具有多个条件并且希望全部条件都得到满足，则可使用此语法。例如，如果希望查找居住在 Dallas 并且&#8220;名&#8221;为&#8220;John&#8221;的所有人员，可以使用：</p>
            <p><span class="codeSample">(&amp;(givenName=John)(l=Dallas))</span></p>
            <p>请注意，每个参数都被属于其自己的圆括号括起来。整个 LDAP 语句必须包括在一对主圆括号中。操作符 &amp; 表明，只有每个参数都为真，才会将此筛选条件应用到要查询的对象。</p>
            </td>
        </tr>
        <tr>
            <td class="listBullet" valign="top">&#8226;</td>
            <td class="listItem">
            <p><strong>!（逻辑非）</strong></p>
            <p>此操作符用来排除具有特定属性的对象。假定您需要查找&#8220;名&#8221;为&#8220;John&#8221;的对象以外的所有对象。则应使用如下语句：</p>
            <p><span class="codeSample">(!givenName=John)</span></p>
            <p>此语句将查找&#8220;名&#8221;不为&#8220;John&#8221;的所有对象。请注意：<span class="codeSample">!</span> 操作符紧邻参数的前面，并且位于参数的圆括号内。由于本语句只有一个参数，因此使用圆括号将其括起以示说明。</p>
            </td>
        </tr>
        <tr>
            <td class="listBullet" valign="top">&#8226;</td>
            <td class="listItem">
            <p><strong>*（通配符）</strong></p>
            <p>可使用通配符表示值可以等于任何值。使用它的情况可能是：您希望查找具有职务头衔的所有对象。为此，可以使用：</p>
            <p><span class="codeSample">(title=*)</span></p>
            <p>这会返回&#8220;title&#8221;属性包含内容的所有对象。另一个例子是：您知道某个对象的&#8220;名&#8221;属性的开头两个字母是&#8220;Jo&#8221;。那么，可以使用如下语法进行查找：</p>
            <p><span class="codeSample">(givenName=Jo*)</span></p>
            <p>这会返回&#8220;名&#8221;以&#8220;Jo&#8221;开头的所有对象。</p>
            </td>
        </tr>
        <tr>
            <td class="listBullet" valign="top">&#8226;</td>
            <td class="listItem">
            <p>以下是 LDAP 语法的高级使用示例：</p>
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td class="listBullet" valign="top">&#8226;</td>
                        <td class="listItem">
                        <p>您需要一个筛选条件，用来查找居住在 Dallas 或 Austin，并且名为&#8220;John&#8221;的所有对象。使用的语法应当是：</p>
                        <p><span class="codeSample">(&amp;(givenName=John)(|(l=Dallas)(l=Austin)))</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td class="listBullet" valign="top">&#8226;</td>
                        <td class="listItem">
                        <p>您发现应用程序日志中有 9,548 个事件，因此需要查找导致这些日志事件的所有对象。在此情况下，您需要查找所有被禁用的用户 (<strong>msExchUserAccountControl</strong>=2)，这些用户的 <strong>msExchMasterAccountSID</strong> 没有值。使用的语法应当是：</p>
                        <p><span class="codeSample">(&amp;(msExchUserAccountControl=2)(!msExchMasterAccountSID=*))</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            <div class="alertType"><img height="10" alt="" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/note.gif" width="10" border="0" />&nbsp;&nbsp;注意：</div>
            <p>! 操作符与通配符的结合使用可查找属性未设置为任何值的对象。</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
摘自：<font face="Verdana">www.microsoft.com</font>
   <img src ="http://www.cnblogs.com/xray2005/aggbug/1187504.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42141/" target="_blank">[新闻]用Google Earth实时追踪人造卫星</a>]]></description></item><item><title>PKI常用术语 </title><link>http://www.cnblogs.com/xray2005/archive/2008/03/04/1089451.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Mon, 03 Mar 2008 16:46:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2008/03/04/1089451.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/1089451.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2008/03/04/1089451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/1089451.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/1089451.html</trackback:ping><description><![CDATA[<p><font face="Verdana"><span style="color: red"><font style="color: #0000ff" face="Verdana"><strong>1. 数字摘要(Digital Digest)：<br />
</strong></font></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对需要加密的信息原文通过特定的变换后，将其&#8220;摘要&#8221;成一串128比特的密文，这串密文又称为数字指纹(Finger Print)。于是，利用这段摘要，就可以验证通过网络传输收到的文件是否是未被非法篡改的文件原文了。 <br />
<span style="color: #0000ff"><strong>2. 数字信封(Digital Envelop)：<br />
</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信息发送方使用密码对信息进行加密，从而保证只有规定的收信人才能阅读信的内容。采用数字信封技术后，即使加密文件被他人非法截获，因为截获者无法得到发送方的通信密钥，故不可能对文件进行解密。 <br />
<span style="color: #0000ff"><strong>3. 数字签名(Digital Signature)：<br />
</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 即是只有信息发送者才能产生的、别人无法伪造的一段数字串。这段数字串同时也是对发送者发送的信息的真实性的一个证明。<br />
<strong style="color: #0000ff">4. 数字时间戳(Digital Time Stamp-DTS)：<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件签署日期与签名一样都是防止合同文件等被伪造和篡改的关键性标记，在电子商务中，数字时间戳是一个经加密后形成的凭证文档。包括需盖戳的文件摘要，DTS机构收到文件的时间以及DTS机构的数字签名三项内容。 <br />
<span style="color: #0000ff"><strong>5. 数字证书(Digital Certificate，Digital ID)：<br />
</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数字证书又称为数字凭证，用以证实一个用户的身份和对网络资源的访问权限。它包括：(1)由金融机构通过数字签名发放的、且不能被他人更改的；(2)由收单银行批准、金融机构颁发的，证明商家是否具有信用卡支付交易资格的；(3)由收单银行或其他负责进行认证收款的机构持有、提供客户对帐号等信息加密密码的；(4)各级、各类CA机构所持有的CA等。<br />
</font><font face="Verdana"><span style="color: #0000ff"><font face="Verdana"><strong>6.证书:</strong></font></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个电子商务系统中，所有参与活动的实体都必须用证书来表明自己的身份。证书一方面可以用来向系统中的其它实体证明自己的身份（每份证书都是经&#8220;相对权威的机构&#8221;签名的），另一方面由于每份证书都携带着证书持有者的公钥（签名证书携带的是签名公钥，密钥加密证书携带的是密钥加密公钥），所以，证书也可以向接收者证实某人或某个机构对公开密钥的拥有，同时也起着公钥分发的作用。<br />
<span style="color: #0000ff"><strong>7.CA:</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CA是Certificate Authority的缩写，是证书授权的意思。在电子商务系统中，所有实体的证书都是由证书授权中心既CA中心分发并签名的。一个完整、安全的电子商务系统必须建立起一个完整、合理的CA体系。CA体系由证书审批部门和证书操作部门组成。<br />
<span style="color: #0000ff"><strong>8.RA:</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RA即证书发放审核部门，它是CA系统的一个功能组件。它负责对证书申请者进行资格审查，并决定是否同意给该申请者发放证书，并承担因审核错误引起的、为不满足资格的证书申请者发放证书所引起的一切后果，因此它应由能够承担这些责任的机构担任。<br />
<span style="color: #0000ff"><strong>9.CP:</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CP即证书发放的操作部门，它是CA系统的一个功能组件，负责为已授权的申请者制作、发放和管理证书，并承担因操作运营错误所产生的一切后果，包括失密和为没有获得授权者发放证书等，它可以由审核授权部门自己担任，也可委托给第三方担任。<br />
<strong><span style="color: #0000ff">10.RS:</span><br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RS即证书授理者，它是CA系统的一个功能组件，接收用户的证书申请请求，转发给CP和RA进行相应的处理。<br />
<span style="color: #0000ff"><strong>11.CRL:<br />
</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRL是证书作废表的缩写。CRL中记录尚未过期但已声明作废的用户证书序列号，供证书使用者在认证对方证书时查询使用。CRL通常被称为证书黑名单。<br />
<span style="color: #0000ff"><strong>12.OCSP:</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OCSP即在线证书状态协议（Online Certificate Status Protocol），使用户可以实时查询证书的作废状态。<br />
<span style="color: #0000ff"><strong>13.KMC:</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key Management Center密钥管理中心.<br />
<span style="color: #0000ff"><strong>14.ROOTCA:<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">&nbsp;根CA<br />
</span></span><br />
&nbsp;<br />
</font></p>
  <img src ="http://www.cnblogs.com/xray2005/aggbug/1089451.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42140/" target="_blank">[新闻]传IBM将以35亿美元至40亿美元收购北电</a>]]></description></item><item><title>PKI应用体系架构 </title><link>http://www.cnblogs.com/xray2005/archive/2008/03/04/1089444.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Mon, 03 Mar 2008 16:38:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2008/03/04/1089444.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/1089444.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2008/03/04/1089444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/1089444.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/1089444.html</trackback:ping><description><![CDATA[<font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于电子商务、电子政务、网上银行、网上证券等金融业网上交易业务的飞速发展，网络安全，特别是互联网通信的安全性令人瞩目。为此，越来越多的安全协议如ssl、set、s/mime 等得到了广泛的应用。但是，最新发展起来的网络安全技术和安全服务规范却是公钥基础设施pki（public key infrastructure）。&nbsp;<br />
<font face="Verdana"><strong><span style="color: #0000ff"><font face="Verdana"><strong>&nbsp;一个标准的pki域必须具备以下主要内容。</strong> <br />
</font></span></strong><font face="Verdana"><strong>1． 认证机构ca（certificate authority）</strong> <br />
&nbsp;&nbsp;&nbsp; ca是pki的核心执行机构，是pki的主要组成部分，业界人士通常称它为认证中心。从广义上讲，认证中心还应该包括证书申请注册机构ra（registration authority），它是数字证书的申请注册、证书签发和管理机构。图1是中国金融ca和ra结构图。 <br />
&nbsp;&nbsp;&nbsp; ca的主要职责包括： <br />
&nbsp;&nbsp;&nbsp; 验证并标识证书申请者的身份。对证书申请者的信用度、申请证书的目的、身份的真实可靠性等问题进行审查，确保证书与身份绑定的正确性。&nbsp;<br />
&nbsp;&nbsp;&nbsp; 确保ca用于签名证书的非对称密钥的质量和安全性。为了防止被破译，ca用于签名的私钥长度必须足够长并且私钥必须由硬件卡产生，私钥不出卡。 <br />
&nbsp;&nbsp;&nbsp; 管理证书信息资料。管理证书序号和ca标识，确保证书主体标识的惟一性，防止证书主体名字的重复。在证书使用中确定并检查证书的有效期，保证不使用过期或已作废的证书，确保网上交易的安全。发布和维护作废证书列表（crl），因某种原因证书要作废，就必须将其作为&#8220;黑名单&#8221;发布在证书作废列表中，以供交易时在线查询，防止交易风险。对已签发证书的使用全过程进行监视跟踪，作全程日志记录，以备发生交易争端时，提供公正依据，参与仲裁。 <br />
&nbsp;&nbsp;&nbsp; 由此可见，ca是保证电子商务、电子政务、网上银行、网上证券等交易的权威性、可信任性和公正性的第三方机构。 <br />
<br />
<font face="Verdana"><strong>2． 证书和证书库</strong> <br />
&nbsp;&nbsp;&nbsp; 证书是数字证书或电子证书的简称，它符合x.509标准，是网上实体身份的证明。证书是由具备权威性、可信任性和公正性的第三方机构签发的，因此，它是权威性的电子文档。 <br />
&nbsp;&nbsp;&nbsp; 证书库是ca颁发证书和撤消证书的集中存放地，它像网上的&#8220;白页&#8221;一样，是网上的公共信息库，可供公众进行开放式查询。一般来说，查询的目的有两个：其一是想得到与之通信实体的公钥;其二是要验证通信对方的证书是否已进入 &#8220;黑名单&#8221;。证书库支持分布式存放，即可以采用数据库镜像技术，将ca签发的证书中与本组织有关的证书和证书撤消列表存放到本地，以提高证书的查询效率，减少向总目录查询的瓶颈。<br />
<font face="Verdana"><strong>&nbsp;<br />
3． 密钥备份及恢复 <br />
</strong>&nbsp;&nbsp;&nbsp; 密钥备份及恢复是密钥管理的主要内容，用户由于某些原因将解密数据的密钥丢失，从而使已被加密的密文无法解开。为避免这种情况的发生，pki提供了密钥备份与密钥恢复机制：当用户证书生成时，加密密钥即被ca备份存储；当需要恢复时，用户只需向ca提出申请，ca就会为用户自动进行恢复。 <br />
</font>
<p><font face="Verdana"><strong>4． 密钥和证书的更新 <br />
</strong>&nbsp;&nbsp;&nbsp; 一个证书的有效期是有限的，这种规定在理论上是基于当前非对称算法和密钥长度的可破译性分析；在实际应用中是由于长期使用同一个密钥有被破译的危险，因此，为了保证安全，证书和密钥必须有一定的更换频度。为此，pki对已发的证书必须有一个更换措施，这个过程称为&#8220;密钥更新或证书更新&#8221;。 <br />
&nbsp;&nbsp;&nbsp; 证书更新一般由pki系统自动完成，不需要用户干预。即在用户使用证书的过程中，pki也会自动到目录服务器中检查证书的有效期，当有效期结束之前，pki/ca会自动启动更新程序，生成一个新证书来代替旧证书。 </font></p>
<p><font face="Verdana"><strong>&nbsp;5.证书历史档案</strong> <br />
&nbsp;&nbsp;&nbsp; 从以上密钥更新的过程，我们不难看出，经过一段时间后，每一个用户都会形成多个旧证书和至少一个当前新证书。这一系列旧证书和相应的私钥就组成了用户密钥和证书的历史档案。 <br />
&nbsp;&nbsp;&nbsp; 记录整个密钥历史是非常重要的。例如，某用户几年前用自己的公钥加密的数据或者其他人用自己的公钥加密的数据无法用现在的私钥解密，那么该用户就必须从他的密钥历史档案中，查找到几年前的私钥来解密数据。 </font></p>
<p><font face="Verdana">&nbsp;<strong>6.客户端软件 <br />
</strong>&nbsp;&nbsp;&nbsp; 为方便客户操作，解决pki的应用问题，在客户装有客户端软件，以实现数字签名、加密传输数据等功能。此外，客户端软件还负责在认证过程中，查询证书和相关证书的撤消信息以及进行证书路径处理、对特定文档提供时间戳请求等。 </font></p>
<p><font face="Verdana"><strong>7.交叉认证 <br />
</strong>&nbsp;&nbsp;&nbsp; 交叉认证就是多个pki域之间实现互操作。交叉认证实现的方法有多种：一种方法是桥接ca，即用一个第三方ca作为桥，将多个ca连接起来，成为一个可信任的统一体；另一种方法是多个ca的根ca（rca）互相签发根证书，这样当不同pki域中的终端用户沿着不同的认证链检验认证到根时，就能达到互相信任的目的。 </font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;<br />
<span style="color: #0000ff"><strong>PKI服务</strong> </span></strong></font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; pki作为安全基础设施，能为不同的用户按不同安全需求提供多种安全服务。这些服务主要包括认证、数据完整性、数据保密性、不可否认性、公正及时间戳服务。&nbsp;</font><font face="Verdana"><br />
<strong>&nbsp;1． 认证</strong> <br />
&nbsp;&nbsp;&nbsp; 认证服务即身份识别与鉴别，就是确认实体即为自己所声明的实体，鉴别身份的真伪。我们以甲乙双方的认证为例:甲首先要验证乙的证书的真伪，当乙在网上将证书传送给甲时，甲首先要用ca的公钥解开证书上ca的数字签名，如果签名通过验证，则证明乙持有的证书是真的;接着甲还要验证乙身份的真伪，乙可以将自己的口令用自己的私钥进行数字签名传送给甲，甲已经从乙的证书中或从证书库中查得了乙的公钥，甲就可以用乙的公钥来验证乙的数字签名。如果该签名通过验证，乙在网上的身份就确凿无疑&nbsp;<br />
<strong>2． 数据完整性服务 <br />
</strong>&nbsp;&nbsp;&nbsp; 数据完整性服务就是确认数据没有被修改。实现数据完整性服务的主要方法是数字签名，它既可以提供实体认证，又可以保障被签名数据的完整性，这是由密码哈希算法和签名算法提供的保证。哈希算法的特点是输入数据的任何变化都会引起输出数据不可预测的极大变化，而签名是用自己的私钥将该哈希值进行加密，然后与数据一道传送给接受方。如果敏感数据在传输和处理过程中被篡改，接受方就不会收到完整的数据签名，验证就会失败。反之，如果签名通过了验证，就证明接收方收到的是未经修改的完整数据。 <br />
<strong>3． 数据保密性服务 <br />
</strong>&nbsp;&nbsp;&nbsp; pki的保密性服务采用了&#8220;数字信封&#8221;机制，即发送方先产生一个对称密钥，并用该对称密钥加密敏感数据。同时，发送方还用接收方的公钥加密对称密钥，就像把它装入一个&#8220;数字信封&#8221;。然后，把被加密的对称密钥（&#8220;数字信封&#8221;）和被加密的敏感数据一起传送给接收方。接收方用自己的私钥拆开&#8220;数字信封&#8221;，并得到对称密钥，再用对称密钥解开被加密的敏感数据。&nbsp;<br />
<strong>&nbsp;4． 不可否认性服务</strong> <br />
&nbsp;&nbsp;&nbsp; 不可否认性服务是指从技术上保证实体对其行为的认可。在这中间，人们更关注的是数据来源的不可否认性、接收的不可否认性以及接收后的不可否认性。此外还有传输的不可否认性、创建的不可否认性和同意的不可否认性。&nbsp;<br />
<strong>&nbsp;5． 公证服务</strong> <br />
&nbsp;&nbsp;&nbsp; pki中的公证服务与一般社会公证人提供的服务有所不同，pki中支持的公证服务是指&#8220;数据认证&#8221;，也就是说，公证人要证明的是数据的有效性和正确性，这种公证取决于数据验证的方式。例如，在pki 中被验证的数据是基于哈希值的数字签名、公钥在数学上的正确性和签名私钥的合法性。 </p>
<p><strong><span style="color: #0000ff"><strong>&nbsp;应用模式</strong>&nbsp;</span></strong><br />
&nbsp;&nbsp; 上述pki提供的安全服务恰好能满足电子商务、电子政务、网上银行、网上证券等金融业交易的安全需求，是确保这些活动顺利进行必备的安全措施，没有这些安全服务，电子商务、电子政务、网上银行、网上证券等都无法正常运作。 <br />
<strong>模式1：电子商务应用</strong> <br />
&nbsp;&nbsp;&nbsp; 电子商务的参与方一般包括买方、卖方、银行和作为中介的电子交易市场。买方通过自己的浏览器上网，登录到电子交易市场的web服务器并寻找卖方。当买方登录服务器时，互相之间需要验证对方的证书以确认其身份，这被称为双向认证。 <br />
&nbsp;&nbsp;&nbsp; 在双方身份被互相确认以后，建立起安全通道，并进行讨价还价，之后向商场提交订单。订单里有两种信息:一部分是订货信息，包括商品名称和价格；另一部分是提交银行的支付信息，包括金额和支付账号。买方对这两种信息进行&#8220;双重数字签名&#8221;，分别用商场和银行的证书公钥加密上述信息。当商场收到这些交易信息后，留下订货单信息，而将支付信息转发给银行。商场只能用自己专有的私钥解开订货单信息并验证签名。同理，银行只能用自己的私钥解开加密的支付信息、验证签名并进行划账。银行在完成划账以后，通知起中介作用的电子交易市场、物流中心和买方，并进行商品配送。整个交易过程都是在pki所提供的安全服务之下进行，实现了安全、可靠、保密和不可否认性。 <br />
<strong>模式2：电子政务</strong> <br />
&nbsp;&nbsp;&nbsp; 电子政务包含的主要内容有：网上信息发布、办公自动化、网上办公、信息资源共享等。按应用模式也可分为g2c、g2b、g2g，pki在其中的应用主要是解决身份认证、数据完整性、数据保密性和不可抵赖性等问题。 <br />
&nbsp;&nbsp;&nbsp; 例如，一个保密文件发给谁或者哪一级公务员有权查阅某个保密文件等，这些都需要进行身份认证，与身份认证相关的还有访问控制，即权限控制。认证通过证书进行，而访问控制通过属性证书或访问控制列表（acl）完成。有些文件在网络传输中要加密以保证数据的保密性;有些文件在网上传输时要求不能被丢失和篡改;特别是一些保密文件的收发必须要有数字签名等。只有pki提供的安全服务才能满足电子政务中的这些安全需求。 <br />
<strong>模式3：网上银行 <br />
</strong>&nbsp;&nbsp;&nbsp; 网上银行是指银行借助于互联网技术向客户提供信息服务和金融交易服务。银行通过互联网向客户提供信息查询、对账、网上支付、资金划转、信贷业务、投资理财等金融服务。网上银行的应用模式有b2c个人业务和b2b对公业务两种。 <br />
&nbsp;&nbsp;&nbsp; 网上银行的交易方式是点对点的，即客户对银行。客户浏览器端装有客户证书，银行服务器端装有服务器证书。当客户上网访问银行服务器时，银行端首先要验证客户端证书，检查客户的真实身份，确认是否为银行的真实客户；同时服务器还要到ca的目录服务器，通过ldap协议查询该客户证书的有效期和是否进入&#8220;黑名单&#8221;；认证通过后，客户端还要验证银行服务器端的证书。双向认证通过以后，建立起安全通道，客户端提交交易信息，经过客户的数字签名并加密后传送到银行服务器，由银行后台信息系统进行划账，并将结果进行数字签名返回给客户端。这样就做到了支付信息的保密和完整以及交易双方的不可否认性。&nbsp;<br />
<strong>&nbsp;模式4：网上证券</strong>&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;网上证券广义地讲是证券业的电子商务，它包括网上证券信息服务、网上股票交易和网上银证转账等。一般来说，在网上证券应用中，股民为客户端，装有个人证书；券商服务器端装有web证书。在线交易时，券商服务器只需要认证股民证书，验证是否为合法股民，是单向认证过程，认证通过后，建立起安全通道。股民在网上的交易提交同样要进行数字签名，网上信息要加密传输；券商服务器收到交易请求并解密，进行资金划账并做数字签名，将结果返回给客户端。</font></p>
<br />
</font></font></font></font>
 <img src ="http://www.cnblogs.com/xray2005/aggbug/1089444.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42140/" target="_blank">[新闻]传IBM将以35亿美元至40亿美元收购北电</a>]]></description></item><item><title>设计模式(Design Patterns)--抽象工厂模式（Abstract Factory）</title><link>http://www.cnblogs.com/xray2005/archive/2008/02/21/1075808.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Wed, 20 Feb 2008 16:34:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2008/02/21/1075808.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/1075808.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2008/02/21/1075808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/1075808.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/1075808.html</trackback:ping><description><![CDATA[摘要: 概述 在软件系统中，经常面临着&#8220;一系列相互依赖的对象&#8221;的创建工作；同时由于需求的变化，往往存在着更多系列对象的创建工作。如何应对这种变化？如何绕过常规的对象的创建方法（new），提供一种&#8220;封装机制&#8221;来避免客户程序和这种&#8220;多系列具体对象创建工作&#8221;的紧耦合？这就是我们要说的抽象工厂模式。意图提供一个创建一系列相关或相互依赖对象的接&nbsp;&nbsp;<a href='http://www.cnblogs.com/xray2005/archive/2008/02/21/1075808.html'>阅读全文</a><img src ="http://www.cnblogs.com/xray2005/aggbug/1075808.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42139/" target="_blank">[新闻]Google卫星已经开始工作</a>]]></description></item><item><title>设计模式(Design Patterns)--工厂方法模式（Factory Method）</title><link>http://www.cnblogs.com/xray2005/archive/2008/02/17/1071576.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Sun, 17 Feb 2008 13:44:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2008/02/17/1071576.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/1071576.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2008/02/17/1071576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/1071576.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/1071576.html</trackback:ping><description><![CDATA[摘要: 概述在软件系统中，经常面临着&#8220;某个对象&#8221;的创建工作，由于需求的变化，这个对象的具体实现经常面临着剧烈的变化，但是它却拥有比较稳定的接口。如何应对这种变化？提供一种封装机制来隔离出&#8220;这个易变对象&#8221;的变化，从而保持系统中&#8220;其它依赖该对象的对象&#8221;不随着需求的改变而改变？这就是要说的Factory Method模式了。意图定义一个用户&nbsp;&nbsp;<a href='http://www.cnblogs.com/xray2005/archive/2008/02/17/1071576.html'>阅读全文</a><img src ="http://www.cnblogs.com/xray2005/aggbug/1071576.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42138/" target="_blank">[新闻]Chrome又曝漏洞 “保存为”功能“引狼入室”</a>]]></description></item><item><title>设计模式(Design Patterns)--单件模式（Singleton Pattern）</title><link>http://www.cnblogs.com/xray2005/archive/2008/02/17/1071492.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Sun, 17 Feb 2008 11:53:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2008/02/17/1071492.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/1071492.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2008/02/17/1071492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/1071492.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/1071492.html</trackback:ping><description><![CDATA[摘要: 概述 Singleton模式要求一个类有且仅有一个实例，并且提供了一个全局的访问点。这就提出了一个问题：如何绕过常规的构造器，提供一种机制来保证一个类只有一个实例？客户程序在调用某一个类时，它是不会考虑这个类是否只能有一个实例等问题的，所以，这应该是类设计者的责任，而不是类使用者的责任。 从另一个角度来说，Singleton模式其实也是一种职责型模式。因为我们创建了一个对象，这个对象扮演了独一无二&nbsp;&nbsp;<a href='http://www.cnblogs.com/xray2005/archive/2008/02/17/1071492.html'>阅读全文</a><img src ="http://www.cnblogs.com/xray2005/aggbug/1071492.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42138/" target="_blank">[新闻]Chrome又曝漏洞 “保存为”功能“引狼入室”</a>]]></description></item><item><title>automation服务器不能创建对象 </title><link>http://www.cnblogs.com/xray2005/archive/2007/11/24/971131.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Sat, 24 Nov 2007 08:06:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2007/11/24/971131.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/971131.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2007/11/24/971131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/971131.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/971131.html</trackback:ping><description><![CDATA[<p><font face="Courier New">automation服务器不能创建对象 </font><br />
regsvr32&nbsp;scrrun.dll </p>
<img src ="http://www.cnblogs.com/xray2005/aggbug/971131.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42137/" target="_blank">[新闻]测试版Office Live Workspace发布6月内用户数量达百万</a>]]></description></item><item><title>使用自己的按钮关闭或刷新RadWindow</title><link>http://www.cnblogs.com/xray2005/archive/2007/11/09/954056.html</link><dc:creator>♂风车车.Net</dc:creator><author>♂风车车.Net</author><pubDate>Fri, 09 Nov 2007 02:05:00 GMT</pubDate><guid>http://www.cnblogs.com/xray2005/archive/2007/11/09/954056.html</guid><wfw:comment>http://www.cnblogs.com/xray2005/comments/954056.html</wfw:comment><comments>http://www.cnblogs.com/xray2005/archive/2007/11/09/954056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xray2005/comments/commentRss/954056.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xray2005/services/trackbacks/954056.html</trackback:ping><description><![CDATA[<font face="Courier New">
<p align="left"><font face="Courier New">使用自己的按钮关闭RadWindow<br />
在最近的一个项目中，使用到了telerik的一套控件: RadControls Q12007 FOR asp.net.<br />
在使用的RadWindow弹出窗口后,使用自己的button关闭这个窗口,而不是用radwindow上的[x]关闭.经过查找资料,发现原来这样写就可以了</font></p>
<p align="left"><font face="Courier New">&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;GetRadWindow()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;oWindow&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;(window.radWindow)&nbsp;oWindow&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;window.radWindow;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(window.frameElement.radWindow)&nbsp;oWindow&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">window.frameElement.radWindow;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;oWindow;<br />
}&nbsp;</span></div>
<p align="left"></font>&nbsp;</p>
<p align="left"><font face="Courier New">然后按钮执行以下代码,就可以关了.<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;oWindow&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetRadWindow();<br />
oWindow.Close();</span></div>
<p align="left"><br />
</font></p>
<p><font face="Courier New">要刷新的父页面的话，加上：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">GetRadWindow().BrowserWindow.location.reload();</span></div>
<p><font face="Courier New">就可以了。</font><br />
<br />
总的来说,这套控件还是蛮强大的,只是感觉它载入的时候比较慢,目前还没有研究怎么去优化调用它.</font></p>
</font>
<img src ="http://www.cnblogs.com/xray2005/aggbug/954056.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42136/" target="_blank">[新闻]2008年9月8日科技博客精选</a>]]></description></item></channel></rss>