﻿<?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>博客园-首页原创区</title><link>http://www.cnblogs.com/</link><description>程序员的网上家园</description><language>zh-cn</language><lastBuildDate>Fri, 10 Feb 2012 18:08:16 GMT</lastBuildDate><pubDate>Fri, 10 Feb 2012 18:08:16 GMT</pubDate><ttl>60</ttl><item><title>所谓的高斯函数-&amp;gt;不用循环和求和函数求连续值的和。</title><link>http://www.cnblogs.com/AlfredLee/archive/2012/02/11/Gaussian_date.html</link><dc:creator>AlfredLee</dc:creator><author>AlfredLee</author><pubDate>Fri, 10 Feb 2012 16:39:00 GMT</pubDate><guid>http://www.cnblogs.com/AlfredLee/archive/2012/02/11/Gaussian_date.html</guid><description><![CDATA[<p><div class="cnblogs_code">
<pre><span style="color: #008080;">1</span> <span style="color: #0000ff;">var</span> a = <span style="color: #0000ff;">function</span>(i){<br /><span style="color: #008080;">2</span>   <span style="color: #0000ff;">return</span> eval(i+<span style="color: #0000ff;">new</span> Array(i).join("+(--i)"));<br /><span style="color: #008080;">3</span> };<br /><span style="color: #008080;">4</span> a(0)</pre>
</div>
<p>就这一句话。我目前看了下耗子的方法进行的改进 。应该是最简单的了。。不知道谁还有更简单的。</p>
<p>他还出了一个周的问题。这是个很不错的函数。</p>
<div class="cnblogs_code">
<pre>'今天是星期'+'日一二三四五六'.charAt(<span style="color: #0000ff;">new</span> Date().getDay())</pre>
</div>
<p>我还没见过这简单的周判定。不知道你是不是测试过。我想这也是最简单的了吧。。果断的拿来主义了。哈哈。。感谢耗子的指点帮助。</p>
<p>http://weibo.com/2108644904/y4zMkDHCh</p>
<p>　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　------------代码之美，在于运用<br /><br /></p><img src="http://www.cnblogs.com/AlfredLee/aggbug/2346255.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/AlfredLee/" target="_blank">AlfredLee</a> 发表于 2012-02-11 00:39 <a href="http://www.cnblogs.com/AlfredLee/archive/2012/02/11/Gaussian_date.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/AlfredLee/archive/2012/02/11/Gaussian_date.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/AlfredLee/archive/2012/02/11/Gaussian_date.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Shader Compiler 界面进展2</title><link>http://www.cnblogs.com/shiziyuan/archive/2012/02/11/2346231.html</link><dc:creator>柿子院</dc:creator><author>柿子院</author><pubDate>Fri, 10 Feb 2012 16:06:00 GMT</pubDate><guid>http://www.cnblogs.com/shiziyuan/archive/2012/02/11/2346231.html</guid><description><![CDATA[<p><div>&nbsp; &nbsp; 最近的结果.</div><div>&nbsp; &nbsp;&nbsp;<img src="http://images.cnblogs.com/cnblogs_com/shiziyuan/shadercompiler2-20.jpg" border="0" alt="" width="1139" height="598" /></div><div>&nbsp; &nbsp; wxWidgets中的Combobox和Choice的下拉栏不能显示超长的字, 使用 wxOwnerDrawnComboBox 就解决了.</div><div>&nbsp; &nbsp; 左边的文件列表的问题下一步解决.</div><p>&nbsp; &nbsp;&nbsp;&nbsp;</p><div>&nbsp; &nbsp; wxWidgets可以使用 DialogBlocks 边做边学, 快速看到控件属性的结果.</div><div>&nbsp; &nbsp; 最近写wxWidgets越来越顺手了, 其中用代码写控件也很简单, 尤其使用了sizer进行布局, 便脱离了要输入pos或size的问题,这也许就是sizer的初衷.</div><p>&nbsp; &nbsp; wxWidgets中工具类的使用非常方便, 只需包括一个1mb多的dll.&nbsp;</p><img src="http://www.cnblogs.com/shiziyuan/aggbug/2346231.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/shiziyuan/" target="_blank">柿子院</a> 发表于 2012-02-11 00:06 <a href="http://www.cnblogs.com/shiziyuan/archive/2012/02/11/2346231.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/shiziyuan/archive/2012/02/11/2346231.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shiziyuan/archive/2012/02/11/2346231.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>B2C电子商务系统研发——对交叉销售和向上销售业务的产品关联推荐分析和设计</title><link>http://www.cnblogs.com/winstonyan/archive/2012/02/10/b2c_research_cross_sell_up_sell_product_recommend.html</link><dc:creator>颜超敏</dc:creator><author>颜超敏</author><pubDate>Fri, 10 Feb 2012 15:48:00 GMT</pubDate><guid>http://www.cnblogs.com/winstonyan/archive/2012/02/10/b2c_research_cross_sell_up_sell_product_recommend.html</guid><description><![CDATA[<p><h1 style="background-color: #33ccff;">一、业务概述</h1>
<p><span style="font-size: 16px;"><strong># 交叉销售 Cross Sell</strong></span></p>
<ul>
<li>定义</li>
</ul>
<p>　　商家根据客户已经选择的产品推荐其它产品。例如在客户浏览苹果iPad时（或者加入购物车后），推荐适合iPad配套</p>
<p>的"ESK ipad2鳄鱼纹皮套"。</p>
<ul>
<li>原则</li>
</ul>
<p>　　交叉销售的原则是基于客户在购买当前产品的前提下购买更多产品。这些产品有可能是相关的（如附件类产品/配套产品），</p>
<p>也有可能是基于统计或者从众的购买建议（如Also Bought，即购买了该产品的顾客也购买了...。We guess you would like...</p>
<p>我们猜你可能会喜欢...）</p>
<p>&nbsp;　　交叉不会推荐同类和相似的产品，而是推荐一些完全不同的产品和服务（如周边产品）。</p>
<ul>
<li>常见类型</li>
</ul>
<ol>
<li style="list-style-type: none;"><ol>
<li>Also Bought：购买了当前产品的顾客也购买了...。通过分析订单信息获得。</li>
<li>Also View：浏览过当前产品的顾客也浏览了。</li>
<li>View and Bought：浏览了该产品最终购买了。通过分析浏览数据和订单数据获得的数据，并显示百分比。（见京东）</li>
<li>配件型产品：如在单反相机下面显示电池/三脚架/镜头等。</li>
<li>互补型产品：如在外套产品下显示裤子/鞋子等凑成合适的一套（需要较高的搭配水平）</li>
<li>经常一起购买的/最佳拍档：关系很紧密的两个或者多个产品，通过分析订单获得。并非产品包，只是一种推荐。（见卓越/当当）</li>
<li>和你兴趣相似的顾客还关注了：当当的一种类型。我觉得倒不如改成关注了当前产品的顾客还还关注了。</li>
</ol></li>
</ol>
<p><span style="font-size: 16px;"><strong># <span style="font-size: 16px;">向</span>上销售 Up Sell</strong></span></p>
<ul>
<li>定义</li>
</ul>
<p>　　商家基于客户选定的产品推荐更好的产品（对客户或者对商家自己）。例如客户浏览某款平板电视时，推荐更高型号/进口</p>
<p>品牌的产品给顾客。</p>
<ul>
<li>原则</li>
</ul>
<p>　　向上销售的原则是替换式，即建议购买我们推荐的，而不是当前浏览的。向上销售如果不是基于足够的统计数据，一般不好</p>
<p>处理。只有在熟悉当前客户的各种消费喜好的前提下，这样的推荐才比较精准和不会引起客户的不快。</p>
<p>　　向上推荐会推荐同产品分类下的或相似的产品，但更贵的或者对商家更有价值（推广/利润高）的产品。</p>
<ul>
<li>&nbsp;常见类型</li>
</ul>
<ol>
<li style="list-style-type: none;"><ol>
<li>同品牌的更高档产品：由于是同品牌的推荐，兼顾了顾客的品牌忠诚的可能性。</li>
<li>不同品牌的更高档产品：一般是推荐更好的品牌，但如何界定&ldquo;更好&rdquo;需要考虑。</li>
<li>价格相似：这里不一定是向上了，但由于满足替换原则，所以也归入向上销售类。</li>
<li>替换推荐：当当前产品缺货时，推荐其它有货的相似产品。（减少因为缺货导致顾客流失）</li>
</ol></li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实现交叉销售和向上销售（或其它一些扩展的业务类型）的关联推荐常见有三种模式，下面分别做阐述：</p>
<h1 style="background-color: #33ccff;">二、人工维护模式</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是最为基础的模式，也是其它模式都必然会支持的功能。即使是一些看上去可以通过算法获得真实的数据（如Also Buy）的</p>
<p>交叉销售，在实际运营中也有人工维护数据的需要。一般而言，人工维护的数据总是在最上面/最前面的，后面才是自动搜索/统计获得</p>
<p>的数据。当然，如果结果集是定时搜索出并将关联持久化的，那也可以再维护两类数据（人工维护+自动生成）的数据位置。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 人工维护的表设计最为简单，如果关联推荐类型也是固化的，甚至只需要一张&ldquo;产品关联推荐表&rdquo;即可。</p>
<p><img src="http://pic002.cnblogs.com/images/2012/342353/2012021022473512.jpg" alt="" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果希望推荐类型可以灵活定义，那么可以增加一张表&ldquo;产品关联类型&rdquo;表，用于方便维护推荐类型。</p>
<p><img src="http://pic002.cnblogs.com/images/2012/342353/2012021022474542.jpg" alt="" /></p>
<p>注：只设计了核心和常规的字段，读者可自行扩展。</p>
<h1 style="background-color: #33ccff;">三、人工维护+固化的自动搜索</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果只提供人工维护的方式，对于产品数据量大的网站，这类数据维护的工作量也会很大，而且在人工未维护到的情况下，</p>
<p>在前台的产品详细页面的这些关联推荐栏目下将没有显示（或者数量不足）推荐的产品，这必然导致用户体验的不佳和营销的适当了。</p>
<p>对于这种情况，则有必要引入自动搜索作为补充。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如某个栏目下显示4个产品（页面模板设计决定的），如果没有人工维护，那么会根据该推荐类型对应的算法搜索出4个产品来</p>
<p>显示。如果人工关联了2个产品，则剩余的2个产品由自动的来补充。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从前面第一节的举例来看，读者也应该看出，产品关联推荐的不同类设计的数据来源比较复杂，搜索算法也各有不同。比如Also Buy</p>
<p>是根据订单+订单子项+当前产品关联查询得出，而Also View却根据产品浏览统计数据。所以固化常见的若干条算法成了一种不错的选择，</p>
<p>而且也能够满足大部分的业务。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于前面第二节的表设计，在产品关联推荐类型表增加一个字段：是否支持自动。</p>
<p><img src="http://pic002.cnblogs.com/images/2012/342353/2012021022585087.jpg" alt="" /></p>
<p>&nbsp;当该字段=1时，表示该推荐类型支持自动算法。只有系统预设的推荐类型该字段才可能是1（系统预设的不一定支持自动）</p>
<h1 style="background-color: #33ccff;">四、前面的方式 + 基于规则推荐（Base Rule）</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于规则来进行推荐，这个规则是自定义的，而不是硬编码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至于自定义的灵活度能够支持到程度，则看系统的各类业务支持和规则数据的设计了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前实现了这种模式的我只看到Magento有，笔者用过，但感觉并不是十分的好，反而觉得是过分复杂了。</p>
<p><img src="http://pic002.cnblogs.com/images/2012/342353/2012021023291033.jpg" alt="" /></p>
<p>分为三部分：</p>
<ul>
<li>Rule Information：基础信息。包括名称/优先级/状态/适用于/有效期/最高限制推荐数量
<ul>
<li>Apply to：关联到系统预设的三大类推荐上（Relate Product/Up Sells/Cross Sells）</li>
</ul>
</li>
<li>Products to Match：即当前产品匹配条件。符合这些条件的产品，在它的详细页面中，这个推荐规则才会有效。</li>
<li>Products to Display：在匹配的&ldquo;当前产品&rdquo;详细页面的该类推荐下会显示这些产品（也是通过规则来设置）</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 举例：比如在Apply to中选择了Up sells类型，那么在Products to Display中就可以设置为&ldquo;大于匹配产品价格110%的产品&rdquo;，如图：</p>
<p><img src="http://pic002.cnblogs.com/images/2012/342353/2012021023401151.jpg" alt="" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 诚然，的确比较灵活，但笔者更喜欢直接在产品详细页面的&ldquo;关联推荐&rdquo;Tab页中设置各推荐类型的关联产品，这样更加直观，</p>
<p>可以清楚的知道每个产品究竟会推荐那些产品。而不是如这样，通过规则推荐，对于运营也不知道系统究竟会推荐那些产品给匹配的产品。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于这种模式，magento并没有通过直接表来管理（估计是通过它的EAV结构来实现的），笔者尚未分析出。而且笔者对这种模式</p>
<p>也还没有一种很好的设计方案，所以暂时就不提供了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有兴趣的读者可以研究一下Magento的Demo和它的文档：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.magentocommerce.com/wiki/modules_reference/english/enterprise_targetrule_adminhtml/targetrule/index</p>
<p><a style="color: #ffffff;" href="http://www.cnblogs.com/winstonyan/archive/2012/02/10/b2c_research_cross_sell_up_sell_product_recommend.html">B2C电子商务系统研发&mdash;&mdash;对交叉销售和向上销售的产品关联推荐分析和设计</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这份是它的官方提供的数据库结构图，读者也可以参考一下：<a href="http://files.cnblogs.com/winstonyan/MAGENTO_v1.3.2.4-Database_Diagram.pdf" target="_blank">Magento V1.3.2.4数据库结构图</a> (右键点击下载)</p>
<p>&nbsp;&nbsp;</p><img src="http://www.cnblogs.com/winstonyan/aggbug/2342061.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/winstonyan/" target="_blank">颜超敏</a> 发表于 2012-02-10 23:48 <a href="http://www.cnblogs.com/winstonyan/archive/2012/02/10/b2c_research_cross_sell_up_sell_product_recommend.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/winstonyan/archive/2012/02/10/b2c_research_cross_sell_up_sell_product_recommend.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/winstonyan/archive/2012/02/10/b2c_research_cross_sell_up_sell_product_recommend.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>将TFS2008迁移至TFS2010（在包含域控制器的Windows 2003 Server上）</title><link>http://www.cnblogs.com/RitchieChen/archive/2012/02/10/2346180.html</link><dc:creator>Ritchie(乞戈)</dc:creator><author>Ritchie(乞戈)</author><pubDate>Fri, 10 Feb 2012 14:44:00 GMT</pubDate><guid>http://www.cnblogs.com/RitchieChen/archive/2012/02/10/2346180.html</guid><description><![CDATA[<p><p>公司自2009年中开始使用TFS2008，用来进行项目管理跟踪和代码版本控制，由于测试工作的需要，围绕TFS所开发的部分测试工具无法在TFS2008上安装使用，为了更好的配合团队工作，决定将TFS升级到2010版本。</p>  <p><b>计划目标：将现有的TFS2008迁移到TFS2010。      <br /></b>开发部门有两台服务器，一台叫233，现有的TFS2008就安装在这台机器上。为了防止迁移升级过程出错，而导致已有数据丢失，计划决定将TFS2010安装到另一台232机器，并将旧的安装TFS2008机器(233)上的所有数据迁移到TFS2010机器上(232)。</p>  <h4><b>步骤1.备份数据</b></h4>  <p>备份以下数据库：【参考 <a href="http://msdn.microsoft.com/zh-cn/library/ms253070(v=vs.90).aspx">如何：备份 Team Foundation Server</a>】</p>  <p><b></b></p>  <blockquote>   <p><b><font color="#c0504d">ReportServer          <br />ReportServerTempDB           <br />WSS_Config           <br />WSS_Content</font></b></p>    <p><b><font color="#c0504d">TfsBuild          <br />TfsIntegration           <br />TfsVersionControl           <br />TfsWarehouse           <br />TfsWorkItemTracking           <br />TfsWorkItemTrackingAttachments           <br />TfsActivityLogging</font></b></p> </blockquote> <strong></strong>  <p>   <br />因为TFS2008安装使用的是2005数据库服务器，TFS2010需要安装SQL Server2008数据库服务器，所以先安装SQL Server2008数据库服务器，并将备份好的数据库还原到新安装的SQL Server2008数据库服务器上。</p>  <p><b><font color="#ff0000">！！</font>重要：</b>由于以前的TFS2008是采用域模式安装的，且232为域控制器，在安装SQL Server2008的过程中，提示并警告我SQL Server2008不建议安装在域控制器上，列举了包括用户权限在内容的可能引起的问题，由于只有两台机器，一台想保留TFS2008的现场，以防止可能出现问题面丢失数据。不得已，只得选择这个机器，这也成为我后来痛苦、折腾、兴奋（问题解决）的根源了。</p>  <h4><b>步骤2.安装TFS2010</b></h4>  <p>在232机器上安装TFS2010。232机器上安装有VS2008，安装过程中提示说“早期的VS2008版本要安装SP1之后才能继续安装”，无奈，卸之（在TFS2010安装包里有VS90SP1补丁，这是我后来寻找SharePoint的时候才偶然看到的）。继续安装TFS2010。过程顺利。</p>  <h4><b>步骤3.升级TFS</b></h4>  <p>在安装好TFS2010之后，打开“<b>Team Foundation 管理控制台</b>”选择“<b>升级</b>”，启动向导。这一部分，网上有不少同学已经做了，可参考的经验比较多，就是在选择的时候要注意，如果安装的数据库不是默认数据库实例，在每一步中要注意填写正确的数据库实例。</p>  <p>在升级的过程中，我发现232机器没有安装SharePoint Services，无奈，下之，安装。我安装的是3.0版本（77.8M），然后启动升级向导，步骤较多，出错的机率也比较高。下面就列举下我升级过程中出现的错误：</p>  <h5>3.1.应用层错误</h5>  <p>看到这个之后，有点纳闷了，网上看到别人的安装经验中，都没有这个错误，不过，仔细一看原来是FrongPage扩展错误。删之。</p>  <h5>3.2.报表错误</h5>  <p>提示未能访问“http://…….asmx”服务，<a href="http://blog.csdn.net/xinfu032/article/details/5620567">可以参考这个</a></p>  <p>&#160;</p>  <blockquote>   <p><strong><font color="#c0504d">解决的方法是：          <br />编辑以下文件:           <br />C:/Program Files/Microsoft SQL Server/MSRS10.&lt;ServerInstance&gt;/Reporting Services/ReportServer/rsreportserver.config           <br />修改 </font><font color="#c0504d">&lt;Add Key=&quot;SecureConnectionLevel&quot; Value=&quot;2&quot;/&gt;&#160; (将值修改为0)</font></strong></p> </blockquote>  <p>&#160;</p>  <h5>3.3.SharePoint警告</h5>  <blockquote>   <p><font color="#c0504d"><strong>TF255361:未能在指定的SharePoint Web应用程序上找到一个或多个团队项目门户网站……</strong></font></p> </blockquote>  <p>纠结的地方到了，项目门户网站的数据我已经备份到新的数据库服务器上了，可却找不到。网站里有不少内容，包括一些比较重要的文档。而且，最怕的是现有项目无法再建立门户网站，这样对项目维护很不利，因此，当时是想办法把网站建立起来，要将SharePoint警告消除。</p>  <p>在网上找呀找，找呀找，能找到的升级迁移方案中，都是不包含SharePoint的，难道是我们的用SharePoint的错？不过，在寻找过程中，也发现了一些SharePoint网站的备份还原方法，包括同机和多个机器之间的备份迁移。大喜！决定通过SharePoint管理中心，把当前的门户网站全都备份了，还原到232机器上。备份过程顺利（我只备份了其中的涉及WSS_Content的内容）。不过，还原过程不顺利，出现了各种各样的错误，最后都归结为一个错误：</p>  <blockquote>   <p><font color="#c0504d"><strong>对象 WSS_Content1 (原名称: WSS_Content) 的 OnRestore 事件失败。有关详细信息，请参阅备份目录中的错误日志。          <br />SqlException: 在数据库 'master' 中拒绝了 CREATE DATABASE 权限。其中我使用的是 域\administrator用户。</strong></font></p> </blockquote>  <p>不管是权限分配、文件读写权限都已经分配了，就是建立不起，administrator是管理员权限，出现这个问题真是难办呀，在CSDN上也找到类似的一个帖子，也是没能解决，有的说是SQL Server2008在域控制器下安装的问题，不可解。认了，安装的时候已经提示了。</p>  <h5><b>3.4.开始升级计划执行</b></h5>  <p>执行结果很顺利，中间没有再弹出“X”。安装完成后，以前的旧项目也已经移植过来了，包括源代码和工作区以及映射关系，也就是说，客户端只需要更改下TFS服务器的地址就可以了，其它的都不用更改。算是比较完美了。</p>  <h4><b>步骤4：再次建立并关联门户网站</b></h4>  <p>虽然无法将旧的门户网站备份迁移过程，不过可以在232上的SharePoint服务上建立新的网站集，并且可以重新将项目与此网站绑定（<i><b>项目上点击右键-&gt;团队项目设置-&gt;门户网站设置&lt;要有相应权限才可以&gt;</b></i>），将其设置为当前门户网站。如果使用同样的网站名称（与项目名称一致），那么绑定后，其和旧的门户网站一致，终端用户也不会感觉到其它不一样的地方。当然，TFS2010的新变化，包括WebAccess等，都是比较方便的，特别是工作项目和管理非常方便。</p>  <hr />  <p><font style="background-color: #ffff00"><strong>总结</strong></font></p>  <p>整个升级过程，花费了几乎两天的时间。仔细分析下，一是由于SQL Server2008数据库服务器的安装、数据备份与还原，二则是由于安装机器是域控制器，中间出现了很多意想不到的地方。特别是在SharePoint网站备份上，尝试了不少方法，包括更改用户、使用旧（233机器上）的SharePoint Services（这就包括安装SharePoint Services扩展）、将SQL Server2008安装到233上（逃离域控制器的魔咒），甚至想把232上的一切推翻，在233机器上实现，等等。整个过程确实是有点焦虑。</p>  <p>不过，迁移完成后，再回头想想，一个问题，两天时间也算是解决了。值得！就事写下了，如果以后大家在升级过程中可以参考一下<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="微笑" src="http://images.cnblogs.com/cnblogs_com/RitchieChen/201202/20120210223805465.png" />。</p><img src="http://www.cnblogs.com/RitchieChen/aggbug/2346180.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/RitchieChen/" target="_blank">Ritchie(乞戈)</a> 发表于 2012-02-10 22:44 <a href="http://www.cnblogs.com/RitchieChen/archive/2012/02/10/2346180.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/RitchieChen/archive/2012/02/10/2346180.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/RitchieChen/archive/2012/02/10/2346180.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>让SlickEdit 自动编译Keil C51工程</title><link>http://www.cnblogs.com/chaofeng/archive/2012/02/10/2346174.html</link><dc:creator>潮风工作室</dc:creator><author>潮风工作室</author><pubDate>Fri, 10 Feb 2012 14:35:00 GMT</pubDate><guid>http://www.cnblogs.com/chaofeng/archive/2012/02/10/2346174.html</guid><description><![CDATA[<p><p style="text-align: center;"><span style="font-size: 24pt;"><strong>让SlickEdit 自动编译Keil C51工程 </strong></span></p>
<p style="text-align: center;"><span style="font-size: 12pt;"><strong>吴宏伟 2012-2-10 </strong></span></p>
<p style="text-align: center;">&nbsp;</p>
<p>上一篇文章已经讲了如何手动调用Keil的C51编译器来编译我们的工程，今天跟大家说说如何在SlickEdit环境下配置编译命令。</p>
<ol>
<li>
<div style="text-align: justify;"><span style="font-size: 14pt;"><strong>首先新建一个SlickEdit工程 </strong></span></div>
<p style="text-align: justify; margin-left: 21pt;"><span style="font-size: 10pt;">假设工程路径为"D:\51"，在Build System界面下选择第二个选项， </span></p>
<p style="text-align: justify;"><img src="http://images.cnblogs.com/cnblogs_com/chaofeng/201202/201202102235163889.png" alt="" /></p>
</li>
</ol>
<p>配置 Build 命令的 Command Line为D:\51\automake.cmd,此文件内容下面将贴出来。</p>
<p style="text-align: justify; margin-left: 18pt;">&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://images.cnblogs.com/cnblogs_com/chaofeng/201202/201202102235176430.png" alt="" /></p>
<p>这样便完成了配置过程。其实最核心的地方就在automake.cmd文件，下面将对此文件的关键内容做一些讲解。</p>
<ol>
<li>
<div style="text-align: justify;"><span style="font-size: 14pt;"><strong>关键内容讲解 </strong></span></div>
<p style="text-align: justify; margin-left: 21pt;"><span style="font-size: 10pt;">（1）变量声明：SET PROJECT=D:\51 声明PROJECT变量的值为D:\51,之后需要引用此变量时，需用%PROJECT%。 </span></p>
<p style="text-align: justify;"><span style="font-size: 10pt;">（2） 变量值替换，格式为,%VAR:oldstr=newstr%, VAR为变量名，oldstr将替换成newstr; </span></p>
<p style="text-align: justify;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;例：SET OUTPUT=D:\51\51.hex,则%OUTPUT:.hex=% 将为 D:\51\51,即把.hex替换成空字符串。 </span></p>
<p style="text-align: justify;"><span style="font-size: 10pt;">（3）文件枚举,格式为:for /r "PATH" %%i in (*.c) do (&hellip;.) </span></p>
<p style="text-align: justify;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;/r表示搜索子目录，"PATH"为所要搜索的文件，*.c为所要搜索的类型。 Do 后面填写所要执行的操作。 </span></p>
<p style="text-align: justify;"><span style="font-size: 10pt;">（4）for循环内的变量多次赋值： </span></p>
<p style="text-align: justify;"><span style="font-size: 10pt;">在for语句里面重复对同一变量多次赋值时才需要使用"!"，并且在使用"!"调用变量时，要首先"启用延迟环境变量扩充"，启动命令为：SetLocal EnableDelayedExpansion。另外需要说明的是，"启用延迟环境变量扩充"后，所有的"!"都将被视为"取变量值"的特殊符号，即使用"^!"也不能输出符号"!"。若要输出"!"，则需要"停用延迟环境变量扩充"，命令为：SetLocal DisableDelayedExpansion。 </span></p>
</li>
<li>
<div style="text-align: justify;"><span style="font-size: 14pt;"><strong>使用此文件来编译工程有以下几点需要注意： </strong></span></div>
<ol>
<li>
<div style="text-align: justify;"><span style="font-size: 10pt;">工程路径包括文件名中不能含有空格； </span></div>
</li>
<li>
<div style="text-align: justify;"><span style="font-size: 10pt;">所要编译的文件只能是同一类型的文件，如都是C文件，或者都是ASM文件； </span></div>
</li>
</ol></li>
<li>
<div style="text-align: justify;"><span style="font-size: 14pt;"><strong>Automake.cmd文件的内容如下： </strong></span></div>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">@echo off </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">@rem 本批处理可自动编译PROJECT目录下（包括子目录）下的.C文件，并生成OUTPUT文件 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">@rem 本文件由HomeWay编写，潮风工作室, 2012/2/10 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">@rem 环境变量定义 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">@rem 请根据本机情况修改以下变量 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">PATH=D:\KEIL4\C51\BIN;%PATH% </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">SET C51INC=D:\KEIL4\C51\INC </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">SET C51LIB=D:\KEIL4\C51\LIB </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">@rem 工程所在目录 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">SET PROJECT=D:\51 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">@rem 输出文件 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">SET OUTPUT=D:\51\51.hex </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">@rem 枚举所有.C文件并编译 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">set OBJ= </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">SetLocal EnableDelayedExpansion </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">for /r "%PROJECT%" %%i in (*.c) do ( </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">set OBJ=!OBJ!%%i, </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">%rem compile the project files </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">C51 %%i </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">IF ERRORLEVEL 2 GOTO :FAILED </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">IF ERRORLEVEL 3 GOTO :FAILED </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">) </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">%rem 链接所有OBJECT文件 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">echo LINK:%OBJ:.c=.obj%%C51LIB%\C51S.lib </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">BL51 %OBJ:.c=.obj%%C51LIB%\C51S.lib TO %OUTPUT:.hex=% RAMSIZE(256) </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">IF ERRORLEVEL 2 GOTO :FAILED </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">IF ERRORLEVEL 3 GOTO :FAILED </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">%rem 生成HEX文件 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">OH51 %OUTPUT:.hex=% HEXFILE(%OUTPUT%) </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">goto :SUCCESS </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">:FAILED </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">echo 编译失败！ </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">exit 1 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">:SUCCESS </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">%rem 清除所有的临时文件 </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">del %OUTPUT:.hex=% </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">for /r "%PROJECT%" %%i in (*.obj) do del %%i </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">for /r "%PROJECT%" %%i in (*.lst) do del %%i </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">for /r "%PROJECT%" %%i in (*.m51) do del %%i </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0;">&nbsp;</span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">echo 编译成功！输出文件为：%OUTPUT% </span></p>
<p style="text-align: justify;"><span style="background-color: #c0c0c0; font-size: 10pt;">exit 0 </span></p>
<p style="text-align: justify;">&nbsp;</p>
<p style="text-align: justify;"><span style="font-size: 10pt;">本文章的演示文件下载：<a href="http://files.cnblogs.com/chaofeng/51-Se-Demo.zip">http://files.cnblogs.com/chaofeng/51-Se-Demo.zip</a></span></p>
</li>
</ol><img src="http://www.cnblogs.com/chaofeng/aggbug/2346174.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/chaofeng/" target="_blank">潮风工作室</a> 发表于 2012-02-10 22:35 <a href="http://www.cnblogs.com/chaofeng/archive/2012/02/10/2346174.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/chaofeng/archive/2012/02/10/2346174.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/chaofeng/archive/2012/02/10/2346174.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>MyJson, JSON C++ 的另一种实现</title><link>http://www.cnblogs.com/imlgc/archive/2012/02/10/2346150.html</link><dc:creator>Another 9527</dc:creator><author>Another 9527</author><pubDate>Fri, 10 Feb 2012 14:04:00 GMT</pubDate><guid>http://www.cnblogs.com/imlgc/archive/2012/02/10/2346150.html</guid><description><![CDATA[<p><p>原文：<a href="http://imlgc.com/?p=30">http://imlgc.com/?p=30</a></p>
<h1>简介</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSON，JavaScript Object Notation, 是一种轻量级的数据交换格式。本质上来说，它和XML, YAML等格式化的数据格式没有什么区别。都是为了方便（人机）阅读和交换的数据格式。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSON，是键值的数据结构，键是主要是指字符串，键主要是指字符串，JSON对象，JSON数组，true, false, null这几种类型。要详细了解这种简单而又实用的数据格式，请参阅，<a href="http://www.json.org/" target="_blank">英文官网</a>，<a href="http://www.json.org/json-zh.html" target="_blank">中文官网</a>。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSON的实现有很多，基本上世界上每种语言都有实现，用C++实现的也有不少，各有特色。因为年前很空闲，于是也随手实现了一个，且叫myjson，特点是：</p>
<ul>
<li>相对来说小，其实比较啰嗦</li>
<li>使用非常方便和直观</li>
<li>虽然不完全实现JSON，使用<a href="http://sourceforge.net/projects/jsoncpp/" target="_blank">jsoncpp</a>的测试数据完全测试过</li>
<li>在实时交互的系统中，可能效率不高</li>
<li>一时兴起写的，可能比较粗略</li>
<li>&hellip;&hellip;</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载：<a href="http://download.imlgc.com/code/c++/myjson/myjson.zip" target="_blank">myjson.zip</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myjson.zip 文件列表</p>
<table style="width: 518px;" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="200">文件/目录</td>
<td valign="top" width="316">说明</td>
</tr>
<tr>
<td valign="top" width="200">json.h</td>
<td valign="top" width="316">myjson 的头文件</td>
</tr>
<tr>
<td valign="top" width="200">json.cpp</td>
<td valign="top" width="316">myjson 的实现文件</td>
</tr>
<tr>
<td valign="top" width="200">test.h</td>
<td valign="top" width="316">简单的测试框架，在<a href="http://imlgc.com/?p=20">http://imlgc.com/?p=20</a>文章中说的的框架</td>
</tr>
<tr>
<td valign="top" width="200">test.cpp</td>
<td valign="top" width="316">myjson的测试文件</td>
</tr>
<tr>
<td valign="top" width="200">testdata</td>
<td valign="top" width="316">测试数据目录，jsoncpp的测试数据</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h1>实现</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myjson的主要类的结构：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/imlgc/201202/201202102203539715.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/imlgc/201202/201202102203551898.png" alt="image" width="490" height="256" border="0" /></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中JsonValueItem是一时手痒写的，仅充当桥梁作用，实际上我们使用时用到的是JsonArray, JsonValue，和Json这三个类。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 各个类的说明：</p>
<table style="width: 526px;" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="200">类</td>
<td valign="top" width="324">说明</td>
</tr>
<tr>
<td valign="top" width="200">Json</td>
<td valign="top" width="324">表示一个JSON对象。</td>
</tr>
<tr>
<td valign="top" width="200">JsonValue</td>
<td valign="top" width="324">表示JSON的值，值包含JSON对象，JSON数组，数值，字符串，false, true, null。</td>
</tr>
<tr>
<td valign="top" width="200">JsonArray</td>
<td valign="top" width="324">表示一个JSON数组，数组元素为JSON的值。</td>
</tr>
<tr>
<td valign="top" width="200">JsonValueItem</td>
<td valign="top" width="324">用于组织JSON数据结构的类，实际不会使用到，具体来说就是以键作为关键字，组成一有序的链表。</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要类主要函数说明：</p>
<table style="width: 531px;" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="59">类</td>
<td valign="top" width="177">函数</td>
<td valign="top" width="293">说明</td>
</tr>
<tr>
<td valign="top" width="59">Json</td>
<td valign="top" width="177">static int Parse(Json*&amp; pJson, const char* pBuf);</td>
<td valign="top" width="293">解析JSON数据。 <br />参数：pJson 返回的JSON对象 <br />参数：pBuf&nbsp; 要解析的数据 <br />返回：0成功，其它参考错误码</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">static int Load(Json*&amp; pJson, const char* pFilePath);</td>
<td valign="top" width="293">从文件解析JSON数据。 <br />参数：pJson 返回的JSON对象 <br />参数：pFilePath文件路径 <br />返回：0成功，其它参考错误码</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">int Save(const char* pFilePath);</td>
<td valign="top" width="293">将JSON对象保存到文件。 <br />参数：pFilePath文件路径 <br />返回：0成功，其它参考错误码</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">JsonValue* Set(const char* szKey, JsonValue&amp; sVal);</td>
<td valign="top" width="293">设置JSON键值。 <br />参数：szKey 健 <br />参数：sVal 值 <br />返回：JSON值，0则出错</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">JsonValue* Get(const char* szKey) const;</td>
<td valign="top" width="293">获取JSON值。 <br />参数：szKey 健 <br />返回：JSON值，0则出错</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">void Dump(std::string&amp; strDump) const;</td>
<td valign="top" width="293">将JSON对象以最紧密的方式导出。 <br />参数：strDump返回的数据 <br />返回：无</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">
<p>void DumpFormat(std::string&amp; strDump, int nSpace = FORMAT_SPACE) const;</p>
</td>
<td valign="top" width="293">将JSON对象以格式化的方式导出。 <br />参数：strDump返回的数据 <br />参数：Space 空格数 <br />返回：无</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">JsonValue&amp; operator [] (const char* szKey);/
<p>const JsonValue&amp; operator [] (const char* szKey) const;</p>
</td>
<td valign="top" width="293">JSON对象[]操作符，有点类似STL的MAP，当键不存在时，插入一个。 <br />参数：szKey 健 <br />返回：JSON值（可能无效）</td>
</tr>
<tr>
<td valign="top" width="59">JsonValue</td>
<td valign="top" width="177">
<p>operator const char*(); <br />operator char*(); <br />operator int(); <br />operator long long(); <br />operator float(); <br />operator double(); <br />operator Json(); <br />operator JsonArray(); </p>
</td>
<td valign="top" width="293">各种转换操作符。</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">
<p>JsonValue&amp; operator = (bool bVal); <br />JsonValue&amp; operator = (const char* szVal); <br />JsonValue&amp; operator = (int nVal); <br />JsonValue&amp; operator = (long long llVal); <br />JsonValue&amp; operator = (float fVal); <br />JsonValue&amp; operator = (double fVal); <br />JsonValue&amp; operator = (const Json&amp; sVal); <br />JsonValue&amp; operator = (const JsonArray&amp; sArr); </p>
</td>
<td valign="top" width="293">各种转换赋值符。</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">
<p>JsonValue&amp; operator [] (const char* szKey); <br />const JsonValue&amp; operator [] (const char* szKey) const; </p>
</td>
<td valign="top" width="293">当值是JSON对象是，此操作符有效。</td>
</tr>
<tr>
<td valign="top" width="59">JsonArray</td>
<td valign="top" width="177">JsonValue&amp; Get(int nIndex) const;</td>
<td valign="top" width="293">获取某下标的JSON值。 <br />参数：下标 <br />返回：JSON值</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">JsonValue&amp; operator[](int nIndex);/const JsonValue&amp; operator[](int nIndex) const;</td>
<td valign="top" width="293">同上</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">int Add(JsonValue&amp; sVal);</td>
<td valign="top" width="293">增加一JSON值到数组里。 <br />参数：sVal <br />返回：0</td>
</tr>
<tr>
<td valign="top" width="59">&nbsp;</td>
<td valign="top" width="177">int GetSize() const;</td>
<td valign="top" width="293">返回数值的长度。</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h1>示例</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单的演示：</p>
<pre class="csharpcode">    Json json;
    JsonValue jv = <span class="kwrd">true</span>;
    json[<span class="str">"a"</span>] = jv;
    jv = json;
    json.Set(<span class="str">"c"</span>, jv);
    jv = (<span class="kwrd">char</span>*)0;
    json.Set(<span class="str">"d"</span>, jv);
    JsonArray sArr;
    sArr[0] = 100;
    sArr[1] = <span class="str">"abcdefg"</span>;
    sArr[2] = <span class="kwrd">false</span>;
    jv = sArr;
    json.Set(<span class="str">"e"</span>, jv);
    
 <span class="rem">// 上述代码产生以下JSON数据</span>
{
  <span class="str">"a"</span>:<span class="kwrd">true</span>,
  <span class="str">"c"</span>:{
     <span class="str">"a"</span>:<span class="kwrd">true</span>
   },
   <span class="str">"d"</span>:<span class="kwrd">null</span>,
   <span class="str">"e"</span>:[
     100,
     <span class="str">"abcdefg"</span>,
     <span class="kwrd">false</span>
    ]
}</pre>
<style><!--
.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>
<h1>其它</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一时兴趣的东西，没有经过大脑的设计，如果用于实时系统还要应该考虑一下其性能，NEW太多了。但是用于实时系统的初始化和清理保存信息还是不错的。注意，这里说的是实时系统。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过还是很快的啦！两个测试用例在我非常烂的是电脑上还有下面的结果（实际上统计的时间不准确的，是相对大很多的）：</p>
<pre class="csharpcode">[==========] Running 2 tests from 1 test cases
[----------] 2 tests from Json
[ RUN      ] Json.ConstructJson
[       OK ] Json.ConstructJson (1 ms)
[ RUN      ] Json.ParseJson
[       OK ] Json.ParseJson (7 ms)
[----------] 2 tests from Json (17 ms total)

[==========] 2 tests from 1 test <span class="kwrd">case</span> ran (26 ms total)
[  PASSED  ] 2 tests</pre>
<style><!--
.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.cnblogs.com/imlgc/aggbug/2346150.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/imlgc/" target="_blank">Another 9527</a> 发表于 2012-02-10 22:04 <a href="http://www.cnblogs.com/imlgc/archive/2012/02/10/2346150.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/imlgc/archive/2012/02/10/2346150.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/imlgc/archive/2012/02/10/2346150.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>在 Windows Phone上使用QQConnect  OAuth2</title><link>http://www.cnblogs.com/shanyou/archive/2012/02/10/2346144.html</link><dc:creator>张善友</dc:creator><author>张善友</author><pubDate>Fri, 10 Feb 2012 13:55:00 GMT</pubDate><guid>http://www.cnblogs.com/shanyou/archive/2012/02/10/2346144.html</guid><description><![CDATA[<p><p><a href="http://www.cnblogs.com/shanyou/archive/2012/02/05/2338797.html">QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码</a> 这篇文章讲述的普通的ASP.NET站点上使用QQ互联，本篇文章主要介绍在WindowsPhone环境使用QQ互联OAuth2 SDK，本文的程序改自<a title="http://www.codeproject.com/Articles/321291/Google-OAuth2-on-Windows-Phone" href="http://www.codeproject.com/Articles/321291/Google-OAuth2-on-Windows-Phone">Google OAuth2 on Windows Phone</a>。QQ互联的OAuth2和Google 的OAuth2的流程上差不多，QQ互联的还更简单一点。</p>
<p>代码中使用了如下三个类库：</p>
<ul>
<li><a href="http://restsharp.org/">RestSharp</a></li>
<li><a href="http://json.codeplex.com/">JSON.NET</a></li>
<li><a href="http://mvvmlight.codeplex.com/">MVVM Light</a></li>
</ul>
<p>这些库都可以通过NuGet包安装，需要注意的是JSON.NET (4.0.7)目前和RestSharp的最新版本102.6.0.0不兼容，需要使用JSON.NET (4.0.5)版本。</p>
<p>想把这个例子跑起来，需要到<a href="http://connect.qq.com">http://connect.qq.com</a> 注册获取到appkey和appscrect，填写到配置文件：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/shanyou/201202/201202102154447580.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/shanyou/201202/201202102154473177.png" alt="image" width="659" height="219" border="0" /></a></p>
<p>其中CallBackURI是在登记的回调地址。程序采用MVVM模式，将OAuth2认证的页面为AuthenticationPage.xaml，登陆的逻辑都在ViewModel对应于AuthenticationViewModel，和QQ互联服务器交互的是AuthenticationProcess。交互的流程参照<a title="http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_Client-side" href="http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_Client-side" target="_blank">【QQ登录】开发攻略_Client-side</a>。</p>
<p>AuthenticationViewModel::GetAccessCode封装了OAuth2的验证授权的逻辑。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private bool _isAuthenticating; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Queue&lt;Action&lt;string,string&gt;&gt; _queuedRequests = new Queue&lt;Action&lt;string,string&gt;&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void GetAccessCode(Action&lt;string,string&gt; callback) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock (_sync) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_isAuthenticating) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _queuedRequests.Enqueue(callback); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (HasAuthenticated) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!_process.AuthResult.IsExpired) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callback(_process.AuthResult.AccessToken,_process.AuthResult.OpenId); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InvokeCallback(callback); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InvokeCallback(callback); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void InvokeCallback(Action&lt;string, string&gt; callback) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _isAuthenticating = true; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _queuedRequests.Enqueue(callback);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((PhoneApplicationFrame)App.Current.RootVisual).Navigate(new Uri("/AuthenticationPage.xaml", UriKind.Relative)); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthUri = _process.AuthUri; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>1、如果正在认证过程中，把调用方法放到队列里，然后返回。</p>
<p>2、如果验证过了，并且票据还是有效的，直接回调方法。</p>
<p>3、如果没有认证过，或者票据已经失效了，转到验证页面，可以使用QQ号码登陆。</p>
<p>AuthenticationPage.xaml页面带了一个WebBrowser对象，将一个绑定是AuthenticationViewModel的AuthUri ，类似于</p>
<p>http://openapi.qzone.qq.com/oauth/show?which=Login&amp;display=mobile&amp;response_type=token&amp;client_id=204134&amp;redirect_uri=win8charm.com&amp;scope=get_user_info,add_share,list_album,upload_pic,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,add_one_blog,add_topic,get_tenpay_addr&amp;display=mobile</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/shanyou/201202/201202102154498915.png"><img style="display: inline; border: 0px;" title="qoauth2windowsphone" src="http://images.cnblogs.com/cnblogs_com/shanyou/201202/201202102154502701.png" alt="qoauth2windowsphone" width="252" height="577" border="0" /></a></p>
<p>用户登陆后，如果是首次登陆还需要授权API的访问，然后会返回到redirect_uri参数指定的地址，这里可以拿到返回的用户的Access Token：</p>
<p>private void webBrowser1_Navigating(object sender, NavigatingEventArgs e) <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (e.Uri.Host.Equals("win8charm.com")) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; webBrowser1.Visibility = Visibility.Collapsed; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.Cancel = true; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // setting this text will bind it back to the view model <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; codeBlock.Text = e.Uri.Fragment.Replace("#", ""); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />}</p>
<p>把返回的AccessToken通过页面的一个CodeBlock的掩藏TextBlock将结果传递给View Model ，将Access Token和OpenID结果解析完成，完成整个验证过程。</p>
<p>private string _code; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Code <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _code; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _code = value; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _process.ExchangeCodeForToken(Code); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>public void ExchangeCodeForToken(string code) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (string.IsNullOrEmpty(code)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnAuthenticationFailed(EventArgs.Empty); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OAuthToken response = this.restApi.GetUserAccessToken(code); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetAccessToken(response); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void GetAccessToken(OAuthToken response) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Debug.Assert(response != null); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthResult = new Model.AuthResult() <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; AccessToken = response.AccessToken, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expires = response.ExpiresAt <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } ; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; restApi.GetUserOpenIdAsync(AuthResult.AccessToken, GetUserOpenId, GetUserOpenIdFailure); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void GetUserOpenId(string response) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (string.IsNullOrEmpty(response)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnAuthenticationFailed(EventArgs.Empty); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthResult.OpenId = response; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnAuthenticated(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>在认证成功或者失败的时候引发认证成功或者失败的事件最终完成整个登陆过程。</p><img src="http://www.cnblogs.com/shanyou/aggbug/2346144.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/shanyou/" target="_blank">张善友</a> 发表于 2012-02-10 21:55 <a href="http://www.cnblogs.com/shanyou/archive/2012/02/10/2346144.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/shanyou/archive/2012/02/10/2346144.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shanyou/archive/2012/02/10/2346144.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Windows Phone开发之路(15) 基本导航</title><link>http://www.cnblogs.com/mcgrady/archive/2012/02/10/2346118.html</link><dc:creator>永远的麦子</dc:creator><author>永远的麦子</author><pubDate>Fri, 10 Feb 2012 13:15:00 GMT</pubDate><guid>http://www.cnblogs.com/mcgrady/archive/2012/02/10/2346118.html</guid><description><![CDATA[<p><p>　　一个稍微复杂一点的应用中，可能会用到多个页面，要在这些页面中跳转，就必须用到导航功能。</p>
<p>　　下面这个实例实现的功能是：从主页面MainPage导航到页面SecondPage,然后再从SecondPage返回到MainPage页面这样一个基本功能。</p>
<p>　　<strong>MainPage XAML代码：</strong></p>
<div class="cnblogs_code">
<pre>&lt;Grid x:Name=<span style="color: #800000;">"</span><span style="color: #800000;">ContentPanel</span><span style="color: #800000;">"</span> Grid.Row=<span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span> Margin=<span style="color: #800000;">"</span><span style="color: #800000;">12,0,12,0</span><span style="color: #800000;">"</span>&gt;<br />            &lt;TextBlock Text=<span style="color: #800000;">"</span><span style="color: #800000;">Navigate to Second Page!</span><span style="color: #800000;">"</span><br />                       HorizontalAlignment=<span style="color: #800000;">"</span><span style="color: #800000;">Center</span><span style="color: #800000;">"</span><br />                       VerticalAlignment=<span style="color: #800000;">"</span><span style="color: #800000;">Center</span><span style="color: #800000;">"</span><br />                       Padding=<span style="color: #800000;">"</span><span style="color: #800000;">0,34</span><span style="color: #800000;">"</span><br />                      ManipulationStarted=<span style="color: #800000;">"</span><span style="color: #800000;">TextBlock_ManipulationStarted</span><span style="color: #800000;">"</span>/&gt;<br />&lt;/Grid&gt;</pre>
</div>
<p>　　<strong>MainPage C#代码：</strong></p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> MainPage : PhoneApplicationPage<br />    {<br />        <span style="color: #008000;">//</span><span style="color: #008000;"> 构造函数</span><span style="color: #008000;"><br /></span>        <span style="color: #0000ff;">public</span> MainPage()<br />        {<br />            InitializeComponent();<br />        }<br /><br />        <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> TextBlock_ManipulationStarted(<span style="color: #0000ff;">object</span> sender, ManipulationStartedEventArgs e)<span style="color: #008000;">//</span><span style="color: #008000;">处理ManipulationStarted事件</span><span style="color: #008000;"><br /></span>        {<br />            <span style="color: #008000;">//</span><span style="color: #008000;">todo:当单击TextBlock时跳转到SecondPage页面</span><span style="color: #008000;"><br /></span>            <span style="color: #0000ff;">this</span>.NavigationService.Navigate(<span style="color: #0000ff;">new</span> Uri(<span style="color: #800000;">"</span><span style="color: #800000;">/SecondPage.xaml</span><span style="color: #800000;">"</span>, UriKind.Relative));<span style="color: #008000;">//</span><span style="color: #008000;">调用NavigationService类的Navigate()方法实现导航</span><span style="color: #008000;"><br /></span><br />            e.Complete();<span style="color: #008000;">//</span><span style="color: #008000;">表示不再处理其它Manipulation事件</span><span style="color: #008000;"><br /></span>            e.Handled = <span style="color: #0000ff;">true</span>;<span style="color: #008000;">//</span><span style="color: #008000;">标记路由事件已处理，不需要向上传递事件</span><span style="color: #008000;"><br /></span>        }<br />    }</pre>
</div>
<p>　　</p>
<p>　　<strong>SecondPage XAML代码：</strong></p>
<div class="cnblogs_code">
<pre>&lt;Grid x:Name=<span style="color: #800000;">"</span><span style="color: #800000;">ContentPanel</span><span style="color: #800000;">"</span> Grid.Row=<span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span> Margin=<span style="color: #800000;">"</span><span style="color: #800000;">12,0,12,0</span><span style="color: #800000;">"</span>&gt;<br />            &lt;TextBlock Text=<span style="color: #800000;">"</span><span style="color: #800000;">Go back to Main Page</span><span style="color: #800000;">"</span><br />                       HorizontalAlignment=<span style="color: #800000;">"</span><span style="color: #800000;">Center</span><span style="color: #800000;">"</span><br />                       VerticalAlignment=<span style="color: #800000;">"</span><span style="color: #800000;">Center</span><span style="color: #800000;">"</span><br />                       Padding=<span style="color: #800000;">"</span><span style="color: #800000;">0,34</span><span style="color: #800000;">"</span><br />                       ManipulationStarted=<span style="color: #800000;">"</span><span style="color: #800000;">TextBlock_ManipulationStarted</span><span style="color: #800000;">"</span>/&gt;<br />&lt;/Grid&gt;</pre>
</div>
<p>　　<strong>SecondPage C#代码：</strong></p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> SecondPage : PhoneApplicationPage<br />    {<br />        <span style="color: #0000ff;">public</span> SecondPage()<br />        {<br />            InitializeComponent();<br />        }<br /><br />        <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> TextBlock_ManipulationStarted(<span style="color: #0000ff;">object</span> sender, ManipulationStartedEventArgs e)<span style="color: #008000;">//</span><span style="color: #008000;">处理ManipulationStarted事件</span><span style="color: #008000;"><br /></span>        {<br />            <span style="color: #008000;">//</span><span style="color: #008000;">todo:返回到Main Page页面</span><span style="color: #008000;"><br /></span>            <span style="color: #0000ff;">this</span>.NavigationService.GoBack();<span style="color: #008000;">//</span><span style="color: #008000;">调用NavigationService类的GoBack()方法返回到前一个页面，等价于下一行代码<br />            </span><span style="color: #008000;">//</span><span style="color: #008000;">this.NavigationService.Navigate(new Uri("/MainPage.xaml",UriKind.Relative));</span><span style="color: #008000;">//</span><span style="color: #008000;">不同的是程序不再回到原来的MainPage实例，而是导航到一个新的MainPage实例</span><span style="color: #008000;"><br /></span><br />            e.Complete();<br />            e.Handled = <span style="color: #0000ff;">true</span>;<br />        }<br />    }</pre>
</div>
<p>　　效果如图：</p>
<p><img src="http://pic002.cnblogs.com/images/2012/311549/2012021020575094.jpg" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://pic002.cnblogs.com/images/2012/311549/2012021020580640.jpg" alt="" /><br />　点击TextBlock导航到SecondPage页面&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;点击TextBlock返回到MainPage页面</p>
<p>　　注意：1，ManipulationStarted事件,是在对UIElement对象(在这里指TextBlock)开始操作时发生。即单击它就立即发生。<br />　　　　　2，NavigationService属性，它是Page类中定义的只读属性，它是NavigationService类型的，而NavigationService类是密封类，我们不能对其进行实例化，而由宿主类型创建它们自己的NavigationService实例，其中NavigationService类中包含了Navigate()方法和GoBack()方法。<br />　　　　　3，注意this.NavigationService.GoBack()和this.NavigationService.Navigate(new Uri("/MainPage.xaml",UriKind.Relative))的区别，虽然它们实现的效果是一样的，但是它们的原理是不一样的。</p>
<p>　　下一篇将总结Silverlight应用程序中页面间数据的传递。</p><img src="http://www.cnblogs.com/mcgrady/aggbug/2346118.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/mcgrady/" target="_blank">永远的麦子</a> 发表于 2012-02-10 21:15 <a href="http://www.cnblogs.com/mcgrady/archive/2012/02/10/2346118.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/mcgrady/archive/2012/02/10/2346118.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/mcgrady/archive/2012/02/10/2346118.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>C# 线程手册 第三章 使用线程 AutoResetEvent, Mutex &amp;amp; Interlocked</title><link>http://www.cnblogs.com/danielWise/archive/2012/02/10/2346117.html</link><dc:creator>DanielWise</dc:creator><author>DanielWise</author><pubDate>Fri, 10 Feb 2012 13:13:00 GMT</pubDate><guid>http://www.cnblogs.com/danielWise/archive/2012/02/10/2346117.html</guid><description><![CDATA[<p><h2>AutoResetEvent 类</h2>
<p>AutoResetEvent类的工作方式与ManualResetEvent类似。它会等超时事件发生或者信号事件发生然后通知正在等待的线程。ManualResetEvent和AutoResetEvent之间最重要差别之一是AutoResetEvent在WaitOne()方法执行完会改变自身状态。下面列表显示了如何使用AutoResetEvent类：</p>
<pre class="code"><span style="color: green;">/*************************************
/* Copyright (c) 2012 Daniel Dong
 * 
 * Author：oDaniel Dong
 * Blog：o  www.cnblogs.com/danielWise
 * Email：o guofoo@163.com
 * 
 */

</span><span style="color: blue;">using </span>System;
<span style="color: blue;">using </span>System.Collections.Generic;
<span style="color: blue;">using </span>System.Text;
<span style="color: blue;">using </span>System.Threading;

<span style="color: blue;">namespace </span>AutoReset
{
    <span style="color: blue;">class </span><span style="color: #2b91af;">Auto
    </span>{
        [<span style="color: #2b91af;">STAThread</span>]
        <span style="color: blue;">static void </span>Main()
        {
            <span style="color: #2b91af;">AutoResetEvent </span>aRE = <span style="color: blue;">new </span><span style="color: #2b91af;">AutoResetEvent</span>(<span style="color: blue;">true</span>);
            <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Before First WaitOne"</span>);
            <span style="color: blue;">bool </span>state = aRE.WaitOne(1000, <span style="color: blue;">true</span>);
            <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"After First WaitOne " </span>+ state);
            state = aRE.WaitOne(5000, <span style="color: blue;">true</span>);
            <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"After Second WaitOne " </span>+ state);
            <span style="color: #2b91af;">Console</span>.ReadLine();
        }
    }
}</pre>
<p>AutoReset的输出结果与<a href="http://www.cnblogs.com/danielWise/archive/2012/02/10/2345130.html">上一篇</a>的ManualReset例子一样：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/danielWise/201202/201202102113106619.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="2012-2-10 16-25-24" src="http://images.cnblogs.com/cnblogs_com/danielWise/201202/201202102113101669.png" alt="2012-2-10 16-25-24" width="316" height="96" border="0" /></a></p>
<p>通过AutoReset例子，AutoResetEvent和ManualResetEvent的差别很清晰了。事件对象状态在第一个WaitOne()函数由signaled变成non-signaled, 然后在第二个WaitOne()函数由non-signaled变成signaled. 结果是线程不会在第一个WaitOne()方法等待而不得不在第二个WaitOne()方法等待直到超时退出。</p>
<h2>Mutex 类</h2>
<p>Mutex， ManualResetEvent和AutoResetEvent类都继承自WaitHandle类。它与Monitor非常类似除了它可以用于进程间同步而后者不可以。我们来看一个例子，WroxMutex.cs:</p>
<pre class="code"><span style="color: green;">/*************************************
/* Copyright (c) 2012 Daniel Dong
 * 
 * Author：oDaniel Dong
 * Blog：o  www.cnblogs.com/danielWise
 * Email：o guofoo@163.com
 * 
 */

</span><span style="color: blue;">using </span>System;
<span style="color: blue;">using </span>System.Collections.Generic;
<span style="color: blue;">using </span>System.Text;
<span style="color: blue;">using </span>System.Threading;

<span style="color: blue;">namespace </span>WroxMutex
{
    <span style="color: blue;">class </span><span style="color: #2b91af;">NETMutex
    </span>{
        <span style="color: blue;">static </span><span style="color: #2b91af;">Mutex </span>myMutex;

        <span style="color: blue;">public static void </span>Main()
        {
            myMutex = <span style="color: blue;">new </span><span style="color: #2b91af;">Mutex</span>(<span style="color: blue;">true</span>, <span style="color: #a31515;">"WROX"</span>);
            <span style="color: #2b91af;">NETMutex </span>nm = <span style="color: blue;">new </span><span style="color: #2b91af;">NETMutex</span>();
            <span style="color: #2b91af;">Thread </span>t = <span style="color: blue;">new </span><span style="color: #2b91af;">Thread</span>(<span style="color: blue;">new </span><span style="color: #2b91af;">ThreadStart</span>(nm.Run));
            t.Start();
            <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Thread Sleep for 5 sec"</span>);
            <span style="color: #2b91af;">Thread</span>.Sleep(5000);
            <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Thread Woke Up"</span>);
            myMutex.ReleaseMutex();
            <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Before WaitOne"</span>);
            myMutex.WaitOne();
            <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Lock owned by Main Thread"</span>);
            <span style="color: #2b91af;">Console</span>.ReadLine();
        }

        <span style="color: blue;">public void </span>Run()
        {
            <span style="color: blue;">try
            </span>{
                myMutex.WaitOne();
                <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Thread Sleep for 10 sec"</span>);
                <span style="color: #2b91af;">Thread</span>.Sleep(10000);
            }
            <span style="color: blue;">catch </span>(<span style="color: #2b91af;">AbandonedMutexException </span>ex)
            {
                <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Exception on return from WaitOne." </span>+
                    <span style="color: #a31515;">"\r\n\tMessage: {0}"</span>, ex.Message);
            }
            <span style="color: blue;">finally
            </span>{
                <span style="color: green;">// Whether or not the exception was thrown, the current
                // thread owns the mutex, and must release it.
                //
                </span>myMutex.ReleaseMutex();
            }
            <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"End of Run() method"</span>);
        }
    }
}</pre>
<p>WroxMutex输出结果如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/danielWise/201202/201202102113107557.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="2012-2-10 17-09-41" src="http://images.cnblogs.com/cnblogs_com/danielWise/201202/201202102113117623.png" alt="2012-2-10 17-09-41" width="251" height="106" border="0" /></a></p>
<p>在WroxMutex中，我们使用一个布尔值和一个字符串来作为Mutex构造函数的参数，它们分别表示调用线程应该有Mutex的最初所有权以及Mutex的名字。我们然后创建一个线程用来调用Run()方法。Mutex仍然属于主线程。在Run()方法中，线程t 不得不等待主线程释放Mutex锁。因此，线程t 会在Run()方法中对WaitOne()函数调用处等待。在睡眠5秒后，主线程释放Mutex锁。线程t获得Mutex锁的所有权并继续睡眠。现在，Main()方法无法获得Mutex 锁直到线程t释放它或者线程t退出。在这种情况下，线程t超时并退出，所以Mutex锁又重新被主线程获取。</p>
<h2>Interlocked 类</h2>
<p>Interlocked 可以用来对多线程共享访问的一个整型变量进行同步访问控制。这个操作在一个原子操作中进行。我们来看一个例子， WroxInterlocked.cs:</p>
<pre class="code"><span style="color: green;">/*************************************
/* copyright (c) 2012 daniel dong
 * 
 * author：daniel dong
 * blog：  www.cnblogs.com/danielwise
 * email： guofoo@163.com
 * 
 */

</span><span style="color: blue;">using </span>System;
<span style="color: blue;">using </span>System.Collections.Generic;
<span style="color: blue;">using </span>System.Text;
<span style="color: blue;">using </span>System.Threading;

<span style="color: blue;">namespace </span>WroxInterlocked
{
    <span style="color: blue;">class </span><span style="color: #2b91af;">WinterLocked
    </span>{
        <span style="color: blue;">public </span><span style="color: #2b91af;">ManualResetEvent </span>a = <span style="color: blue;">new </span><span style="color: #2b91af;">ManualResetEvent</span>(<span style="color: blue;">false</span>);
        <span style="color: blue;">private int </span>i = 5;

        <span style="color: blue;">public void </span>Run(<span style="color: blue;">object </span>s)
        {
            <span style="color: #2b91af;">Interlocked</span>.Increment(<span style="color: blue;">ref </span>i);
            <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Thread ID = {0} Count = {1}"</span>, 
                <span style="color: #2b91af;">Thread</span>.CurrentThread.GetHashCode(), i);
        }
    }

    <span style="color: blue;">public class </span><span style="color: #2b91af;">MainApp
    </span>{
        <span style="color: blue;">public static void </span>Main()
        {
            <span style="color: #2b91af;">ManualResetEvent </span>mR = <span style="color: blue;">new </span><span style="color: #2b91af;">ManualResetEvent</span>(<span style="color: blue;">false</span>);
            <span style="color: #2b91af;">WinterLocked </span>wL = <span style="color: blue;">new </span><span style="color: #2b91af;">WinterLocked</span>();
            <span style="color: blue;">for </span>(<span style="color: blue;">int </span>i = 1; i &lt;= 10; i++)
            {
                <span style="color: #2b91af;">ThreadPool</span>.QueueUserWorkItem(<span style="color: blue;">new </span><span style="color: #2b91af;">WaitCallback</span>(wL.Run), 1);
            }
            mR.WaitOne(10000, <span style="color: blue;">true</span>);
            <span style="color: #2b91af;">Console</span>.ReadLine();
        }
    }
}</pre>
<p>WroxInterlocked 的输出结果如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/danielWise/201202/201202102113112357.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="Interlocked" src="http://images.cnblogs.com/cnblogs_com/danielWise/201202/201202102113124375.jpg" alt="Interlocked" width="356" height="206" border="0" /></a></p>
<p>WroxInterlocked 显示了如何使用Interlocked类。我们在一个原子操作中增加全局变量i 的值。对应Increment()方法，也有一个Decrement()方法对变量值进行递减。Exchange()方法也按照同样行为更改作为ByRef 参数传递给它的两个变量值。</p>
<h2>静态变量和静态方法的同步</h2>
<p>同步锁对静态变量和静态方法的处理方法与实例变量和实例方法不同。静态变量是类变量，而属于一个对象的变量是对象变量或者实例变量。换句话说，一个类对象只有一个静态变量和静态方法实例而一个类对象的每个实例都可以有多个实例变量和实例方法。所以，<strong>如果你同步一个静态变量或者一个静态方法，那么锁就会应用到整个类上</strong>(<em>或者说类类对象的所有实例上，这也是为什么我们经常定义一个私有静态对象作为锁</em>)。结果是其他对象都不被允许访问类的静态变量。</p>
<h2>ThreadStaticAttribute 类</h2>
<p>ThreadStaticAttribute 用于静态变量，可以为每个访问静态变量的线程创建一个单独的静态变量拷贝，而不是在不同线程间共享静态变量(默认行为)。这意味着应用了ThreadStaticAttribute 的静态变量不会在访问它的线程间共享。每个访问它的线程都会拥有一个单独的拷贝。如果一个线程修改了变量值，其他线程访问同一个变量的时候不会看到改动后的值。这个行为与静态变量的默认行为相悖。简而言之，ThreadStaticAttribute 给了我们一个两全其美的方案(静态和实例)。</p>
<p>下面列表显示了ThreadStaticAttribute的使用， WroxShared.cs:</p>
<pre class="code"><span style="color: green;">/*************************************
/* copyright (c) 2012 daniel dong
 * 
 * author：daniel dong
 * blog：  www.cnblogs.com/danielwise
 * email： guofoo@163.com
 * 
 */

</span><span style="color: blue;">using </span>System;
<span style="color: blue;">using </span>System.Collections.Generic;
<span style="color: blue;">using </span>System.Text;
<span style="color: blue;">using </span>System.Threading;

<span style="color: blue;">namespace </span>WroxStatic
{
    <span style="color: blue;">class </span><span style="color: #2b91af;">ThreadStatic
    </span>{
        [System.<span style="color: #2b91af;">ThreadStaticAttribute</span>()]
        <span style="color: blue;">public static int </span>x = 1;
        <span style="color: blue;">public static int </span>y = 1;

        <span style="color: blue;">public void </span>Run()
        {
            <span style="color: blue;">for </span>(<span style="color: blue;">int </span>i = 1; i &lt;= 10; i++)
            {
                <span style="color: #2b91af;">Thread </span>t2 = <span style="color: #2b91af;">Thread</span>.CurrentThread;
                x++; 
                y++;
                <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"i = " </span>+ i
                    +<span style="color: #a31515;">" ThreadID = " </span>+ t2.GetHashCode()
                    +<span style="color: #a31515;">" x(static attribute) = " </span>+ x
                    + <span style="color: #a31515;">" y = " </span>+ y);
                <span style="color: #2b91af;">Thread</span>.Sleep(1000);
            }
        }
    }

    <span style="color: blue;">public class </span><span style="color: #2b91af;">MainApp
    </span>{
        <span style="color: blue;">public static void </span>Main()
        {
            <span style="color: #2b91af;">ThreadStatic </span>tS = <span style="color: blue;">new </span><span style="color: #2b91af;">ThreadStatic</span>();
            <span style="color: #2b91af;">Thread </span>t1 = <span style="color: blue;">new </span><span style="color: #2b91af;">Thread</span>(<span style="color: blue;">new </span><span style="color: #2b91af;">ThreadStart</span>(tS.Run));
            <span style="color: #2b91af;">Thread </span>t2 = <span style="color: blue;">new </span><span style="color: #2b91af;">Thread</span>(<span style="color: blue;">new </span><span style="color: #2b91af;">ThreadStart</span>(tS.Run));
            t1.Start();
            t2.Start();
            <span style="color: #2b91af;">Console</span>.ReadLine();
        }
    }
}</pre>
<p>WroxShared.cs 的输出结果如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/danielWise/201202/201202102113137506.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="ThreadStaticAttribute" src="http://images.cnblogs.com/cnblogs_com/danielWise/201202/201202102113142588.jpg" alt="ThreadStaticAttribute" width="503" height="343" border="0" /></a></p>
<p>应用了ThreadStaticAttribute的一个静态变量和一个实例变量的差别是静态变量不需要生成一个对象实例来访问它，而如果你不创建一个对象实例就访问其实例变量，编译时就会报错。简而言之，再一次的，应用了ThreadStaticAttribute的静态变量不用生成新实例就可以访问且每个访问它的线程都有自己的拷贝，不会共享此静态变量。</p>
<h2>同步和性能</h2>
<p>同步为我们的计算体验带来质的飞跃的同时也带来了获得同步锁的时间开销。结果是其性能总是比那么非线程安全的版本要低。由于多个线程可能会在同一时间访问对象来获得同步锁，整体应用程序的性能可能在不经意间被影响。当开发人员在设计大型应用程序时必须要权衡好这类问题。最重要的部分是除非对吞吐量进行压力测试否则这些线程性能问题不易被发现。在设计大规模的多线程应用程序时压力测试是及其重要的。开发人员需要平衡这些因素：</p>
<p><strong>&nbsp; 为了安全，尽可能多的使用同步。但这会让程序变得越来越慢，甚至比单线程版本还要慢。</strong></p>
<p><strong>&nbsp; 为了性能，尽可能少的使用同步。</strong></p>
<p>多线程设计就是这两个因素之间不断的平衡。</p>
<p>&nbsp;</p>
<p>下一篇介绍 避免死锁&hellip;</p><img src="http://www.cnblogs.com/danielWise/aggbug/2346117.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/danielWise/" target="_blank">DanielWise</a> 发表于 2012-02-10 21:13 <a href="http://www.cnblogs.com/danielWise/archive/2012/02/10/2346117.html" target="_blank">原文链接</a></p><p>评论: 1　<a href="http://www.cnblogs.com/danielWise/archive/2012/02/10/2346117.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/danielWise/archive/2012/02/10/2346117.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>用python实现有道翻译，配合Goldendict显示</title><link>http://www.cnblogs.com/skyhacker/archive/2012/02/10/2346111.html</link><dc:creator>SkyHacker</dc:creator><author>SkyHacker</author><pubDate>Fri, 10 Feb 2012 13:12:00 GMT</pubDate><guid>http://www.cnblogs.com/skyhacker/archive/2012/02/10/2346111.html</guid><description><![CDATA[<p><p>先上效果图（划词翻译）：</p>
<p><img title="Goldendict划词翻译" src="http://pic002.cnblogs.com/images/2012/139208/2012021020423346.png" alt="Goldendict划词翻译" /></p>
<p>代码：</p>
<div class="cnblogs_code">
<pre><span style="color: #008080;">  1</span> <span style="color: #008000;">#</span><span style="color: #008000;">!/usr/bin/env python</span><span style="color: #008000;"><br /></span><span style="color: #008080;">  2</span> <span style="color: #008000;">#</span><span style="color: #008000;">coding:utf-8</span><span style="color: #008000;"><br /></span><span style="color: #008080;">  3</span> <br /><span style="color: #008080;">  4</span> <span style="color: #0000ff;">import</span> json<br /><span style="color: #008080;">  5</span> <span style="color: #0000ff;">from</span> urllib <span style="color: #0000ff;">import</span> urlopen<br /><span style="color: #008080;">  6</span> <span style="color: #0000ff;">import</span> sys<br /><span style="color: #008080;">  7</span> reload(sys)                      <span style="color: #008000;">#</span><span style="color: #008000;">要reload一次sys才能使用setdefaultencoding函数</span><span style="color: #008000;"><br /></span><span style="color: #008080;">  8</span> <br /><span style="color: #008080;">  9</span> sys.setdefaultencoding(<span style="color: #800000;">'</span><span style="color: #800000;">utf-8</span><span style="color: #800000;">'</span>)  <span style="color: #008000;">#</span><span style="color: #008000;">要将系统默认字符编码设置为utf-8,在Goldendict才能正常输出</span><span style="color: #008000;"><br /></span><span style="color: #008080;"> 10</span> <br /><span style="color: #008080;"> 11</span> html = <span style="color: #800000;">"""</span><span style="color: #800000;"><br /></span><span style="color: #008080;"> 12</span> <span style="color: #800000;">&lt;html&gt;<br /></span><span style="color: #008080;"> 13</span> <span style="color: #800000;">&lt;head&gt;<br /></span><span style="color: #008080;"> 14</span> <span style="color: #800000;">&lt;script type="text/javascript"&gt;function playSound(){var ky = document.getElementById("key");var word = ky.childNodes[0].nodeValue;var api = "http://dict.youdao.com/dictvoice?audio=" + encodeURIComponent(word);var ado = document.getElementById("media");try{ado.ended = true;ado.setAttribute("src",api);ado.load();ado.play();return false;}catch(err){alert(err.description);return false;}}&lt;/script&gt;<br /></span><span style="color: #008080;"> 15</span> <span style="color: #800000;">&lt;/head&gt;<br /></span><span style="color: #008080;"> 16</span> <span style="color: #800000;">&lt;body&gt;<br /></span><span style="color: #008080;"> 17</span> <span style="color: #800000;">&lt;style type="text/css"&gt;<br /></span><span style="color: #008080;"> 18</span> <span style="color: #800000;">      div.block {<br /></span><span style="color: #008080;"> 19</span> <span style="color: #800000;">      border:1px solid #BEBEBE;<br /></span><span style="color: #008080;"> 20</span> <span style="color: #800000;">      background:#F0F0F0;<br /></span><span style="color: #008080;"> 21</span> <span style="color: #800000;">      margin-left:20px;<br /></span><span style="color: #008080;"> 22</span> <span style="color: #800000;">      border-radius: 5px;<br /></span><span style="color: #008080;"> 23</span> <span style="color: #800000;">      }<br /></span><span style="color: #008080;"> 24</span> <span style="color: #800000;">      div.name {<br /></span><span style="color: #008080;"> 25</span> <span style="color: #800000;">      margin-top:10px;<br /></span><span style="color: #008080;"> 26</span> <span style="color: #800000;">      margin-bottom:5px;<br /></span><span style="color: #008080;"> 27</span> <span style="color: #800000;">      margin-left:20px;<br /></span><span style="color: #008080;"> 28</span> <span style="color: #800000;">      font-size:13px;<br /></span><span style="color: #008080;"> 29</span> <span style="color: #800000;">      font-weight:bold;<br /></span><span style="color: #008080;"> 30</span> <span style="color: #800000;">      }<br /></span><span style="color: #008080;"> 31</span> <span style="color: #800000;">      div.item {<br /></span><span style="color: #008080;"> 32</span> <span style="color: #800000;">      padding:5px;<br /></span><span style="color: #008080;"> 33</span> <span style="color: #800000;">      font-size:12px;<br /></span><span style="color: #008080;"> 34</span> <span style="color: #800000;">      margin: 0px 10px 0px 10px;<br /></span><span style="color: #008080;"> 35</span> <span style="color: #800000;">      }<br /></span><span style="color: #008080;"> 36</span> <span style="color: #800000;">      #web {<br /></span><span style="color: #008080;"> 37</span> <span style="color: #800000;">      border-style: none none solid none;<br /></span><span style="color: #008080;"> 38</span> <span style="color: #800000;">      border-color: #BEBEBE;<br /></span><span style="color: #008080;"> 39</span> <span style="color: #800000;">      border-bottom-width: 1px;<br /></span><span style="color: #008080;"> 40</span> <span style="color: #800000;">      }<br /></span><span style="color: #008080;"> 41</span> <span style="color: #800000;">    &lt;/style&gt;<br /></span><span style="color: #008080;"> 42</span> <span style="color: #800000;">    &lt;div class="content"&gt;<br /></span><span style="color: #008080;"> 43</span> <span style="color: #800000;">      &lt;div class="name"&gt;&lt;i&gt;查询:&lt;/i&gt;&lt;/div&gt;<br /></span><span style="color: #008080;"> 44</span> <span style="color: #800000;">      &lt;div class="block"&gt;<br /></span><span style="color: #008080;"> 45</span> <span style="color: #800000;">       %s<br /></span><span style="color: #008080;"> 46</span> <span style="color: #800000;">      &lt;/div&gt;<br /></span><span style="color: #008080;"> 47</span> <span style="color: #800000;">      &lt;div class="name"&gt;&lt;i&gt;有道翻译:&lt;/i&gt;&lt;/div&gt;<br /></span><span style="color: #008080;"> 48</span> <span style="color: #800000;">      &lt;div class="block"&gt;<br /></span><span style="color: #008080;"> 49</span> <span style="color: #800000;">    %s<br /></span><span style="color: #008080;"> 50</span> <span style="color: #800000;">      &lt;/div&gt;<br /></span><span style="color: #008080;"> 51</span> <span style="color: #800000;">      &lt;div class="name"&gt;&lt;i&gt;有道词典-基本词典:&lt;/i&gt;&lt;/div&gt;<br /></span><span style="color: #008080;"> 52</span> <span style="color: #800000;">      &lt;div class="block"&gt;<br /></span><span style="color: #008080;"> 53</span> <span style="color: #800000;">    %s<br /></span><span style="color: #008080;"> 54</span> <span style="color: #800000;">      &lt;/div&gt;<br /></span><span style="color: #008080;"> 55</span> <span style="color: #800000;">      &lt;div class="name"&gt;&lt;i&gt;有道词典-网络释义:&lt;/i&gt;&lt;/div&gt;<br /></span><span style="color: #008080;"> 56</span> <span style="color: #800000;">      &lt;div class="block"&gt;<br /></span><span style="color: #008080;"> 57</span> <span style="color: #800000;">       %s<br /></span><span style="color: #008080;"> 58</span> <span style="color: #800000;">      &lt;/div&gt;<br /></span><span style="color: #008080;"> 59</span> <span style="color: #800000;">      &lt;div class="name"&gt;&lt;i&gt;更多结果:&lt;/i&gt;&lt;/div&gt;<br /></span><span style="color: #008080;"> 60</span> <span style="color: #800000;">      &lt;div class="block"&gt;<br /></span><span style="color: #008080;"> 61</span> <span style="color: #800000;">       %s<br /></span><span style="color: #008080;"> 62</span> <span style="color: #800000;">      &lt;/div&gt;<br /></span><span style="color: #008080;"> 63</span> <span style="color: #800000;">    &lt;/div&gt;<br /></span><span style="color: #008080;"> 64</span> <span style="color: #800000;">&lt;/body&gt;<br /></span><span style="color: #008080;"> 65</span> <span style="color: #800000;">&lt;/html&gt;<br /></span><span style="color: #008080;"> 66</span> <span style="color: #800000;">"""</span><br /><span style="color: #008080;"> 67</span> <br /><span style="color: #008080;"> 68</span> errorHtml = <span style="color: #800000;">"""</span><span style="color: #800000;"><br /></span><span style="color: #008080;"> 69</span> <span style="color: #800000;">&lt;html&gt;&lt;body&gt;<br /></span><span style="color: #008080;"> 70</span> <span style="color: #800000;">&lt;div class="block"&gt;<br /></span><span style="color: #008080;"> 71</span> <span style="color: #800000;">&lt;div class="item"&gt;%&lt;/div&gt;<br /></span><span style="color: #008080;"> 72</span> <span style="color: #800000;">&lt;/div&gt;<br /></span><span style="color: #008080;"> 73</span> <span style="color: #800000;">&lt;/body&gt;&lt;/html&gt;<br /></span><span style="color: #008080;"> 74</span> <span style="color: #800000;">"""</span><br /><span style="color: #008080;"> 75</span> <br /><span style="color: #008080;"> 76</span> errorResult = {<span style="color: #800000;">'</span><span style="color: #800000;">0</span><span style="color: #800000;">'</span>:<span style="color: #800000;">''</span>, <span style="color: #800000;">'</span><span style="color: #800000;">20</span><span style="color: #800000;">'</span>:<span style="color: #800000;">'</span><span style="color: #800000;">要翻译的文本过长</span><span style="color: #800000;">'</span>, <span style="color: #800000;">'</span><span style="color: #800000;">30</span><span style="color: #800000;">'</span>:<span style="color: #800000;">'</span><span style="color: #800000;">无法进行有效的翻译</span><span style="color: #800000;">'</span>,<br /><span style="color: #008080;"> 77</span>               <span style="color: #800000;">'</span><span style="color: #800000;">40</span><span style="color: #800000;">'</span>:<span style="color: #800000;">'</span><span style="color: #800000;">不支持的语言类型</span><span style="color: #800000;">'</span>, <span style="color: #800000;">'</span><span style="color: #800000;">50</span><span style="color: #800000;">'</span>:<span style="color: #800000;">'</span><span style="color: #800000;">无效的key</span><span style="color: #800000;">'</span>}<br /><span style="color: #008080;"> 78</span> <br /><span style="color: #008080;"> 79</span> <span style="color: #0000ff;">def</span> printHtml(errorCode, query, translation, basic, web):<br /><span style="color: #008080;"> 80</span>     <span style="color: #800000;">"""</span><span style="color: #800000;">打印html</span><span style="color: #800000;">"""</span><br /><span style="color: #008080;"> 81</span>     <span style="color: #0000ff;">if</span> errorCode != 0:<br /><span style="color: #008080;"> 82</span>         <span style="color: #0000ff;">print</span> errorHtml % errorResult[errorCode]<br /><span style="color: #008080;"> 83</span>         <span style="color: #0000ff;">return</span><br /><span style="color: #008080;"> 84</span>     item = <span style="color: #800000;">'</span><span style="color: #800000;">&lt;div class="item"&gt;%s&lt;/div&gt;</span><span style="color: #800000;">'</span><br /><span style="color: #008080;"> 85</span>     <span style="color: #008000;">#</span><span style="color: #008000;">有道翻译</span><span style="color: #008000;"><br /></span><span style="color: #008080;"> 86</span>     q = item % (<span style="color: #800000;">'</span><span style="color: #800000;">&lt;b&gt;"%s"&lt;/b&gt;</span><span style="color: #800000;">'</span> % query)<br /><span style="color: #008080;"> 87</span>     trans = <span style="color: #800000;">''</span><br /><span style="color: #008080;"> 88</span>     <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> translation:<br /><span style="color: #008080;"> 89</span>         trans += item % (<span style="color: #800000;">'</span><span style="color: #800000;">&lt;b&gt;"%s"&lt;/b&gt;</span><span style="color: #800000;">'</span> % i)<br /><span style="color: #008080;"> 90</span> <br /><span style="color: #008080;"> 91</span>     <span style="color: #008000;">#</span><span style="color: #008000;">有道词典</span><span style="color: #008000;"><br /></span><span style="color: #008080;"> 92</span>     key = <span style="color: #800000;">''</span><br /><span style="color: #008080;"> 93</span>     <span style="color: #0000ff;">if</span> basic:<br /><span style="color: #008080;"> 94</span>         key += <span style="color: #800000;">'</span><span style="color: #800000;">&lt;span id="key" style="font-weight:bold"&gt;%s&lt;/span&gt;</span><span style="color: #800000;">'</span> % (query + <span style="color: #800000;">'</span> <span style="color: #800000;">'</span>)<br /><span style="color: #008080;"> 95</span>         <span style="color: #0000ff;">if</span> <span style="color: #800000;">'</span><span style="color: #800000;">phonetic</span><span style="color: #800000;">'</span> <span style="color: #0000ff;">in</span> basic.keys():<br /><span style="color: #008080;"> 96</span>             key += <span style="color: #800000;">'</span><span style="color: #800000;">[%s]</span><span style="color: #800000;">'</span> % basic[<span style="color: #800000;">'</span><span style="color: #800000;">phonetic</span><span style="color: #800000;">'</span>]<br /><span style="color: #008080;"> 97</span>             key += <span style="color: #800000;">'</span><span style="color: #800000;">&lt;button id="sound" onclick="playSound()"&gt;sound&lt;/button&gt;&lt;audio id="media"&gt;&lt;/audio&gt;</span><span style="color: #800000;">'</span><br /><span style="color: #008080;"> 98</span>         key = item % key<br /><span style="color: #008080;"> 99</span>         <span style="color: #0000ff;">if</span> <span style="color: #800000;">'</span><span style="color: #800000;">explains</span><span style="color: #800000;">'</span> <span style="color: #0000ff;">in</span> basic.keys():<br /><span style="color: #008080;">100</span>             <span style="color: #008000;">#</span><span style="color: #008000;">判断查询的词是不是中文</span><span style="color: #008000;"><br /></span><span style="color: #008080;">101</span>             isChinese = False<br /><span style="color: #008080;">102</span>             <span style="color: #0000ff;">for</span> c <span style="color: #0000ff;">in</span> query:<br /><span style="color: #008080;">103</span>                 <span style="color: #0000ff;">if</span> ord(c) &gt;= 0x4e00 <span style="color: #0000ff;">and</span> ord(c) &lt;= 0x9fa5:<br /><span style="color: #008080;">104</span>                     isChinese = True<br /><span style="color: #008080;">105</span>                     <span style="color: #0000ff;">break</span><br /><span style="color: #008080;">106</span>             <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> isChinese:<br /><span style="color: #008080;">107</span>                 <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> basic[<span style="color: #800000;">'</span><span style="color: #800000;">explains</span><span style="color: #800000;">'</span>]:<br /><span style="color: #008080;">108</span>                     key += item % i<br /><span style="color: #008080;">109</span>             <span style="color: #0000ff;">else</span>:<br /><span style="color: #008080;">110</span>                 <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> basic[<span style="color: #800000;">'</span><span style="color: #800000;">explains</span><span style="color: #800000;">'</span>]:<br /><span style="color: #008080;">111</span>                     key += item % (<span style="color: #800000;">'</span><span style="color: #800000;">&lt;a href="%s"&gt;%s&lt;/a&gt;</span><span style="color: #800000;">'</span> % (i, i))<br /><span style="color: #008080;">112</span>         key += item % (<span style="color: #800000;">'</span><span style="color: #800000;">&lt;a href="http://dict.youdao.com/w/%s"&gt;%s&lt;/a&gt;</span><span style="color: #800000;">'</span> % (query, <span style="color: #800000;">'</span><span style="color: #800000;">更多解释</span><span style="color: #800000;">'</span>))<br /><span style="color: #008080;">113</span> <br /><span style="color: #008080;">114</span>     <span style="color: #008000;">#</span><span style="color: #008000;">web词典</span><span style="color: #008000;"><br /></span><span style="color: #008080;">115</span>     webdict = <span style="color: #800000;">''</span><br /><span style="color: #008080;">116</span>     webitem = <span style="color: #800000;">'</span><span style="color: #800000;">&lt;div %s class="item"&gt;%s&lt;br/&gt;%s&lt;/div&gt;</span><span style="color: #800000;">'</span><br /><span style="color: #008080;">117</span>     <span style="color: #0000ff;">if</span> web:<br /><span style="color: #008080;">118</span>         <span style="color: #0000ff;">if</span> len(web) &gt; 1:<br /><span style="color: #008080;">119</span>             <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(len(web)-1):<br /><span style="color: #008080;">120</span>                 webdict += webitem % (<span style="color: #800000;">'</span><span style="color: #800000;">id="web"</span><span style="color: #800000;">'</span>, web[i][<span style="color: #800000;">'</span><span style="color: #800000;">key</span><span style="color: #800000;">'</span>], <span style="color: #800000;">'</span><span style="color: #800000;">, </span><span style="color: #800000;">'</span>.join(web[i][<span style="color: #800000;">'</span><span style="color: #800000;">value</span><span style="color: #800000;">'</span>]))<br /><span style="color: #008080;">121</span>         webdict += webitem % (<span style="color: #800000;">''</span>, web[-1][<span style="color: #800000;">'</span><span style="color: #800000;">key</span><span style="color: #800000;">'</span>], <span style="color: #800000;">'</span><span style="color: #800000;">, </span><span style="color: #800000;">'</span>.join(web[-1][<span style="color: #800000;">'</span><span style="color: #800000;">value</span><span style="color: #800000;">'</span>]))<br /><span style="color: #008080;">122</span> <br /><span style="color: #008080;">123</span>     <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> key:<br /><span style="color: #008080;">124</span>         key = item % <span style="color: #800000;">'</span><span style="color: #800000;">对不起,没有结果</span><span style="color: #800000;">'</span><br /><span style="color: #008080;">125</span>     <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> webdict:<br /><span style="color: #008080;">126</span>         webdict = item % <span style="color: #800000;">'</span><span style="color: #800000;">对不起,没有结果</span><span style="color: #800000;">'</span><br /><span style="color: #008080;">127</span>     <span style="color: #008000;">#</span><span style="color: #008000;">更多搜索</span><span style="color: #008000;"><br /></span><span style="color: #008080;">128</span>     moreSearch = <span style="color: #800000;">'</span><span style="color: #800000;">&lt;div class="item"&gt;&lt;a href="http://dict.bing.com.cn/?FORM=BNGCN#</span><span style="color: #800000;">'</span> + \<br /><span style="color: #008080;">129</span>       query + <span style="color: #800000;">'</span><span style="color: #800000;">"&gt;通过Bing词典搜索&lt;/a&gt;&lt;/div&gt;</span><span style="color: #800000;">'</span><br /><span style="color: #008080;">130</span>     moreSearch += <span style="color: #800000;">'</span><span style="color: #800000;">&lt;div class="item"&gt;&lt;a href="http://test.iciba.com/</span><span style="color: #800000;">'</span> + \<br /><span style="color: #008080;">131</span>       query + <span style="color: #800000;">'</span><span style="color: #800000;">"&gt;通过iciba词典搜索&lt;/a&gt;&lt;/div&gt;</span><span style="color: #800000;">'</span><br /><span style="color: #008080;">132</span>     moreSearch += <span style="color: #800000;">'</span><span style="color: #800000;">&lt;div class="item"&gt;&lt;a href="http://www.baidu.com/s?wd=</span><span style="color: #800000;">'</span> + \<br /><span style="color: #008080;">133</span>       query + <span style="color: #800000;">'</span><span style="color: #800000;">"&gt;通过百度搜索&lt;/a&gt;&lt;/div&gt;</span><span style="color: #800000;">'</span><br /><span style="color: #008080;">134</span>     moreSearch += <span style="color: #800000;">'</span><span style="color: #800000;">&lt;div class="item"&gt;&lt;a href="http://www.google.com.hk/#q=</span><span style="color: #800000;">'</span> + \<br /><span style="color: #008080;">135</span>       query + <span style="color: #800000;">'</span><span style="color: #800000;">"&gt;通过Google搜索&lt;/a&gt;&lt;/div&gt;</span><span style="color: #800000;">'</span><br /><span style="color: #008080;">136</span> <br /><span style="color: #008080;">137</span>     <span style="color: #0000ff;">print</span> html % (q, trans, key, webdict, moreSearch)<br /><span style="color: #008080;">138</span> <br /><span style="color: #008080;">139</span> <span style="color: #0000ff;">def</span> getData(string):<br /><span style="color: #008080;">140</span>     data = json.loads(string)<br /><span style="color: #008080;">141</span>     errorCode = data[<span style="color: #800000;">'</span><span style="color: #800000;">errorCode</span><span style="color: #800000;">'</span>]<br /><span style="color: #008080;">142</span>     query = data[<span style="color: #800000;">'</span><span style="color: #800000;">query</span><span style="color: #800000;">'</span>]<br /><span style="color: #008080;">143</span>     translation = data[<span style="color: #800000;">'</span><span style="color: #800000;">translation</span><span style="color: #800000;">'</span>]<br /><span style="color: #008080;">144</span>     basic = {}<br /><span style="color: #008080;">145</span>     <span style="color: #0000ff;">if</span> <span style="color: #800000;">'</span><span style="color: #800000;">basic</span><span style="color: #800000;">'</span> <span style="color: #0000ff;">in</span> data.keys():<br /><span style="color: #008080;">146</span>         basic = data[<span style="color: #800000;">'</span><span style="color: #800000;">basic</span><span style="color: #800000;">'</span>]<br /><span style="color: #008080;">147</span>     web = []<br /><span style="color: #008080;">148</span>     <span style="color: #0000ff;">if</span> <span style="color: #800000;">'</span><span style="color: #800000;">web</span><span style="color: #800000;">'</span> <span style="color: #0000ff;">in</span> data.keys():<br /><span style="color: #008080;">149</span>         web = data[<span style="color: #800000;">'</span><span style="color: #800000;">web</span><span style="color: #800000;">'</span>]<br /><span style="color: #008080;">150</span>     <br /><span style="color: #008080;">151</span>     printHtml(errorCode, query, translation, basic, web)<br /><span style="color: #008080;">152</span> <br /><span style="color: #008080;">153</span> <span style="color: #0000ff;">def</span> searchWord(word):<br /><span style="color: #008080;">154</span>     url = r<span style="color: #800000;">'</span><span style="color: #800000;">http://fanyi.youdao.com/openapi.do?keyfrom=&lt;yourname&gt;&amp;key=&lt;yourkey&gt;&amp;type=data&amp;doctype=json&amp;version=1.1&amp;q=</span><span style="color: #800000;">'</span> + word<br /><span style="color: #008080;">155</span>     f = urlopen(url)<br /><span style="color: #008080;">156</span>     jsonStr = f.read()<br /><span style="color: #008080;">157</span>     getData(jsonStr)<br /><span style="color: #008080;">158</span> <br /><span style="color: #008080;">159</span> <span style="color: #0000ff;">if</span> <span style="color: #800080;">__name__</span> == <span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span>:<br /><span style="color: #008080;">160</span>     searchWord(sys.argv[1])</pre>
</div>
<p>后记：</p>
<ol>
<li>一开始我是申请返回有道翻译的xml文件的，然后发现json文件体积比xml文件小多了，而且python更方便读取解析json文件。</li>
<li>最痛苦就是设计web的显示界面，花了一晚时间上w3cschool学习html和css。</li>
<li>发声部分是学javascript的朋友帮我写的。</li>
<li>这是我第三个版本的代码，写多了，领悟也多了，主要是终于意识到字符串格式化的好处。一开始用+来连接两个字符串使得可读性低~~，有时使得html代码错乱。</li>
<li>其实html代码可以写成一个独立的文件，由pyfanyi.py读入，这样更加好，编辑html文件也更容易。</li>
<li>在ubuntu下用自己写的翻译软件看英文好有感觉，呵呵。</li>
</ol>
<p>使用：</p>
<p>安装Goldendict，ubuntu可以在软件中心安装。</p>
<p>把pyfanyi.py复制到/usr/bin文件夹里</p>
<p>在编辑-&gt;Dictionaries-&gt;Pragrams里添加一个程序，名字填 pyfanyi，Type选Html，命令填pyfanyi.py %GDWORD%</p><img src="http://www.cnblogs.com/skyhacker/aggbug/2346111.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/skyhacker/" target="_blank">SkyHacker</a> 发表于 2012-02-10 21:12 <a href="http://www.cnblogs.com/skyhacker/archive/2012/02/10/2346111.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/skyhacker/archive/2012/02/10/2346111.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/skyhacker/archive/2012/02/10/2346111.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130795/" target="_blank">Chrome将给老机带来更快的3D绘图性能</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130794/" target="_blank">在线支付创业公司Stripe获红杉资本等1800万美元的投资，公司估值达1亿美元</a><span style="color:gray">(2012-02-10 23:20)</span><br/>· <a href="http://news.cnblogs.com/n/130793/" target="_blank">创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》</a><span style="color:gray">(2012-02-10 23:19)</span><br/>· <a href="http://news.cnblogs.com/n/130792/" target="_blank">霍金的伟大与不幸</a><span style="color:gray">(2012-02-10 23:17)</span><br/>· <a href="http://news.cnblogs.com/n/130791/" target="_blank">Linux为什么成功？因为它的失败是免费的！</a><span style="color:gray">(2012-02-10 22:41)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>
