<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>启航</title>
    <description>技术、产品，市场，随笔(blog.havebb.com)</description>
    <link>http://blog.havebb.com/b/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 2.0.0.36</generator>
    <language>zh-CN</language>
    <blogChannel:blogRoll>http://blog.havebb.com/b/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://blog.havebb.com/syndication.axd</blogChannel:blink>
    <dc:creator>启航</dc:creator>
    <dc:title>启航</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/52live" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="52live" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>随意的代码</title>
      <description>&lt;p&gt;我闲暇时会阅读一些国外开源项目的源代码，一般好的开源项目代码都很“工整”。接触国内的开源项目不多，偶然看到也是一些“小玩意”——我自己也没有在开源项目上贡献过代码，目前我觉得比较大的贡献代码的障碍是“沟通问题”。当然经常打交道的则是同事们的代码，由于公司并没有Code Review的传统，一般我会因为好奇看看同事们的代码，不过很快我就没有任何兴趣再看这些代码了。本来就算是写得很好的代码要理解也不是一件容易的事情，糟糕的代码就更加难以理解了。然而最让我难以忍受的是代码“不工整”，很随意，甚至格式化没都没有做好。比如最近看到一段这样的代码：&lt;/p&gt;  &lt;p&gt;public class FacadeClass&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;public void DoSomthing(&lt;b&gt;int?&lt;/b&gt; src)&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; someClassInstance.DoSomething(&lt;b&gt;src.Value&lt;/b&gt;);&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;public class someClass&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void DoSomething(&lt;b&gt;int?&lt;/b&gt; src)&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(src.HasValue) do...&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else do...&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;为什么会写出这样的代码呢？好吧，如果你不会设计模式也没关系，不知道DI是什么也没什么，至少写代码不能太随意了吧？FacadeClass是给别人调用的，调用者看到函数DoSomething(int? src)这样的函数签名可能很自然的不会检查src是否为null而传入null值，于是程序就挂了。&lt;/p&gt;  &lt;p&gt;先不管程序写得是否优美，是否高效，至少不能这么随意吧？&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/mess-code.aspx</link>
      <comments>http://blog.havebb.com/b/post/mess-code.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=5e871e7a-a4ea-4896-82c8-f9b20831a6b0</guid>
      <pubDate>Mon, 06 Feb 2012 05:31:30 +0100</pubDate>
      <category>杂谈</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=5e871e7a-a4ea-4896-82c8-f9b20831a6b0</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=5e871e7a-a4ea-4896-82c8-f9b20831a6b0</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/mess-code.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=5e871e7a-a4ea-4896-82c8-f9b20831a6b0</wfw:commentRss>
    </item>
    <item>
      <title>用CronTrigger做时间段较为复杂的Quartz Job</title>
      <description>&lt;p&gt;我现在非常喜欢用Quartz做一些定时任务，CronTrigger和Calender配合起来可以做一些时间段比较复杂的重复任务。&lt;/p&gt;  &lt;p&gt;比如A任务的时间段是这样的：&lt;/p&gt;  &lt;p&gt;9:30 - 11:30&lt;/p&gt;  &lt;p&gt;13:00 - 15:00&lt;/p&gt;  &lt;p&gt;每10分钟执行一次。&lt;/p&gt;  &lt;p&gt;周六日不执行，遇到法定节假日也不执行。&lt;/p&gt;  &lt;p&gt;B任务只有上午的时间段稍有不同，它是从上午的9:00开始，并且执行的频率是每10秒一次。    &lt;br /&gt;我采用的方法是使用8个CronTrigger和一个AnnualCalendar。AnnualCalendar指定假日和周末。&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:7001e9f8-28a4-40e8-8454-61e06450ef62" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: c#;"&gt;var holidays = new AnnualCalendar(new WeeklyCalendar());&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;然后&lt;/p&gt;

&lt;p&gt;holidays.SetDayExcluded(...);&lt;/p&gt;

&lt;p&gt;这样我们可以排除周末和假日。&lt;/p&gt;

&lt;p&gt;接下来将CronTrigger存入XML文档：&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:fbc01afa-429c-4d4e-82a1-60e426e8a4a4" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;triggers&amp;gt;

     &amp;lt;trigger type="type1" exp="0/10 0-59 9-10 * * ?"&amp;gt;&amp;lt;/trigger&amp;gt;

     &amp;lt;trigger type="type1" exp="0/10 0-30 11 * * ?"&amp;gt;&amp;lt;/trigger&amp;gt;

     &amp;lt;trigger type="type1" exp="0/10 0-59 13-14 * * ?"&amp;gt;&amp;lt;/trigger&amp;gt;

&amp;lt;trigger type="type2" exp="0 30-59/10 9 * * ?"&amp;gt;&amp;lt;/trigger&amp;gt;

     &amp;lt;trigger type="type2" exp="0 0-59/10 10 * * ?"&amp;gt;&amp;lt;/trigger&amp;gt;

     &amp;lt;trigger type="type2" exp="0 0-30/10 11 * * ?"&amp;gt;&amp;lt;/trigger&amp;gt;

     &amp;lt;trigger type="type2" exp="0 0-59/10 13-14 * * ?"&amp;gt;&amp;lt;/trigger&amp;gt;

     &amp;lt;trigger type="type2" exp="0 0 15 * * ?"&amp;gt;&amp;lt;/trigger&amp;gt;

&amp;lt;triggers&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;在C#程序里面加载这个XML并创建任务：&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:b8bf164a-9fc9-4487-9b97-b67e804f0638" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: c#;"&gt;var x = XElement.Load(".\\Triggers.xml");

for(var int = 0; i &amp;lt; x.Elements().Count(); i++)

{

     var a = x.Elements().ElementAt(i);

     ...

     var type = Type.GetType(a.Attribute("type").Value);

     if(type == null) ...

     var trigger = new CronTrigger(type.Name + "Trigger" + i, type.Name, a.Attribute("exp").Value) { CalendarName = calendarName};

     var jobDetail = new JobDetail(type.Name + "Job" + i, type);

     var firstTime = scheduler.ScheduleJob(jobDetail, trigger);

}
&lt;/pre&gt;&lt;/div&gt;</description>
      <link>http://blog.havebb.com/b/post/crontrigger-quartz.aspx</link>
      <comments>http://blog.havebb.com/b/post/crontrigger-quartz.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=073690c5-d098-4008-8967-0db2e32e1c20</guid>
      <pubDate>Sat, 04 Feb 2012 14:53:44 +0100</pubDate>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=073690c5-d098-4008-8967-0db2e32e1c20</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=073690c5-d098-4008-8967-0db2e32e1c20</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/crontrigger-quartz.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=073690c5-d098-4008-8967-0db2e32e1c20</wfw:commentRss>
    </item>
    <item>
      <title>架构和武器</title>
      <description>&lt;p&gt;做架构的人需要了解很多概念性的东西，也要了解这些有哪些武器（工具）可以让我们的开发生活更加简单。工作量尽量少，开发效率尽量高。&lt;/p&gt;  &lt;p&gt;日志：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; log4net&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/jkowalski/NLog/"&gt;NLog&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;AOP：&lt;/p&gt;  &lt;p&gt;DI：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; autofac&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; windsor castle&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; structmap&lt;/p&gt;  &lt;p&gt;Unit Test&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; moq&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SRP&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 里氏替换法则&lt;/p&gt;  &lt;p&gt;持续集成&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TeamCity&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CruiseControl.NET&lt;/p&gt;  &lt;p&gt;SOA：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WCF&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; REST （概念）&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Web Service&lt;/p&gt;  &lt;p&gt;MVC&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ASP.NET MVC&lt;/p&gt;  &lt;p&gt;MVVM&lt;/p&gt;  &lt;p&gt;ORM&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EF （Code First很好，但是查询效率是个问题，不知道现在查询效率有没有提高？）&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; LINQ 2 SQL （现在差不多可以忘记它了……）&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PetaPOCO&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dapper （StackOverflow.com使用的Tiny ORM）&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NHibernate&lt;/p&gt;  &lt;p&gt;Caching&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EntLib Cache&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; memcached and it's client&lt;/p&gt;  &lt;p&gt;函数式语言&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; F#&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Erlang？？&lt;/p&gt;  &lt;p&gt;作业调度&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Quartz （作业调度，这个框架相当有必要了解。）&lt;/p&gt;  &lt;p&gt;工作流&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WorkFlow&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/phatboyg/Stact"&gt;Stact&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;自动化&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AutoHotKey&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PowerShell&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bat&lt;/p&gt;  &lt;p&gt;多线程和并行计算&lt;/p&gt;  &lt;p&gt;事务&lt;/p&gt;  &lt;p&gt;动态语言&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ruby&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Python&lt;/p&gt;  &lt;p&gt;MONO&lt;/p&gt;  &lt;p&gt;Linux&lt;/p&gt;  &lt;p&gt;MySQL&lt;/p&gt;  &lt;p&gt;反向代理&lt;/p&gt;  &lt;p&gt;DNS轮询&lt;/p&gt;  &lt;p&gt;NoSQL&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Redis&lt;/p&gt;  &lt;p&gt;YUI&lt;/p&gt;  &lt;p&gt;JQuery&lt;/p&gt;  &lt;p&gt;CSS GRID&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BluePrint&lt;/p&gt;  &lt;p&gt;Profiler&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Red Gate Tools&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; JetBrians Tools&lt;/p&gt;  &lt;p&gt;Source Control&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SVN&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; git&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bugfree&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chiliproject （红辣椒项目，用Ruby写的。）&lt;/p&gt;  &lt;p&gt;Topshelf&lt;/p&gt;  &lt;p&gt;NServiceBus&lt;/p&gt;  &lt;p&gt;MSBUILD&lt;/p&gt;  &lt;p&gt;nant&lt;/p&gt;  &lt;p&gt;IlMerge&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/architecture-and-tools.aspx</link>
      <comments>http://blog.havebb.com/b/post/architecture-and-tools.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=275ea233-e04c-4d7e-bb02-f87be3981552</guid>
      <pubDate>Sun, 22 Jan 2012 10:24:00 +0100</pubDate>
      <category>杂谈</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=275ea233-e04c-4d7e-bb02-f87be3981552</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=275ea233-e04c-4d7e-bb02-f87be3981552</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/architecture-and-tools.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=275ea233-e04c-4d7e-bb02-f87be3981552</wfw:commentRss>
    </item>
    <item>
      <title>认识Topshelf</title>
      <description>&lt;p&gt;Topshelf是一个库，可以帮助我们写Windows Service程序。这是我以前很想要的一个软件或者模式，我经常写Windows Service，为了让Service运行起来我们需要为建立一个Windows Service工程，并为这个工程设定一系列的属性。为了方便，我们写一些bat脚本以帮助我们安装、卸载服务。由于Windows Service没有界面，要运行就得先安装，这使得开发期间很不方便，主要是Windows Service不好调试（因为Service需要安装、启动等等一系列操作，并且查看日志不方便。），相对来说控制台程序就方便多了。所以，我希望一个这个宿主程序可以安装为Windows Service，又可以以控制台的方式运行。Topshelf可以帮我们轻松做到这一点。&lt;/p&gt;  &lt;p&gt;Topshelf支持两种使用方式：&lt;/p&gt;  &lt;p&gt;1. 自己编写控制台程序。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.havebb.com/b/image.axd?picture=Image_77.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Image" border="0" alt="Image" src="http://blog.havebb.com/b/image.axd?picture=Image_thumb_72.png" width="244" height="108" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;这个控制台程序也可以通过命令行安装为Windows服务，我们只需要运行下面的命令：&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;安装服务：&lt;/p&gt;    &lt;p&gt;{your_exe} install&lt;/p&gt;    &lt;p&gt;删除服务：&lt;/p&gt;    &lt;p&gt;{your_exe} uninstall&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;如果应用程序中有多个服务，可以选择其中一个进行安装：&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;/instance:{instance_name}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;2. 开箱即用的宿主：Topshelf.Host.exe。&lt;/p&gt;  &lt;p&gt;这个程序可以将我们写的一些dll直接加载为服务，也就是说连控制台程序都不用自己写了，只需要把我们写的dll放入指定文件夹，Topshelf.Host会自动加载dll并启动之。当然写的时候要遵守Topshelf.Host定义的一些规则。&lt;/p&gt;  &lt;p&gt;参考：&lt;a href="http://topshelf-project.com/documentation/getting-started/"&gt;http://topshelf-project.com/documentation/getting-started/&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/about-topshelf.aspx</link>
      <comments>http://blog.havebb.com/b/post/about-topshelf.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=10905f64-c8fe-4d5e-b22b-e44bd4c74eb8</guid>
      <pubDate>Fri, 20 Jan 2012 06:55:39 +0100</pubDate>
      <category>.NET</category>
      <category>软件使用</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=10905f64-c8fe-4d5e-b22b-e44bd4c74eb8</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=10905f64-c8fe-4d5e-b22b-e44bd4c74eb8</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/about-topshelf.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=10905f64-c8fe-4d5e-b22b-e44bd4c74eb8</wfw:commentRss>
    </item>
    <item>
      <title>索爱X10成功刷上MIUI</title>
      <description>&lt;p&gt;贪鲜将X10的系统升级到最新的2.3.3，看起来是好多了，但是有个致命问题——系统不稳定，上网的时候系统经常自己重新启动。看着微博啥的突然就黑屏然后重启，非常令人不爽。经过一段时间的观察，一般重启的时候都是在上网。今天终于忍不住了，豁出去将系统刷成MIUI。&lt;/p&gt;  &lt;p&gt;经过一个小时的折腾，终于看到了传说中的MIUI。&lt;/p&gt;  &lt;p&gt;刷的是这个：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.miui.com/forum-viewthread-tid-218033-highlight-x10.html"&gt;http://www.miui.com/forum-viewthread-tid-218033-highlight-x10.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;稳定性似乎不行，换。&lt;/p&gt;  &lt;p&gt;换了这个帖子的1.9.9。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.miui.com/thread-249796-1-1.html"&gt;http://www.miui.com/thread-249796-1-1.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;刷了之后有几点不满意：&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;修改的字体我不喜欢， &lt;/li&gt;    &lt;li&gt;稳定性不行（也可能是我刷的时候没有清掉数据） &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;先观察一下效果，很可能换成这里或者XDA论坛上面的ROM，不过XDA上面的ROM不知对中文支持怎么样？ &lt;/p&gt;  &lt;p&gt;最好发现要换XDA上面的ROM不容易，因为上面的ROM下载网址大多被屏蔽了。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=1209749"&gt;http://forum.xda-developers.com/showthread.php?t=1209749&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=936733"&gt;http://forum.xda-developers.com/showthread.php?t=936733&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=1288660"&gt;http://forum.xda-developers.com/showthread.php?t=1288660&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;最好刷了这个：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.miui.com/thread-249796-5-1.html"&gt;http://www.miui.com/thread-249796-5-1.html&lt;/a&gt; 46楼&lt;/p&gt;  &lt;p&gt;&lt;a href="http://115.com/file/dn1f06y6"&gt;http://115.com/file/dn1f06y6&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;这两天看起来还是蛮稳定的。&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;后续：&lt;/p&gt;  &lt;p&gt;继续努力，现在刷的还是不稳定。昨晚又重新刷上了这个ROM，清掉缓存之后刷，&lt;b&gt;今天上班的时候玩微博只重启了一次2012-1-17&lt;/b&gt;~~~如果和官方ROM的稳定性差不多，那我毫不犹豫使用MIUI！&lt;/p&gt;  &lt;p&gt;今晚刷这个 &lt;a href="http://115.com/file/clt2fbhu"&gt;http://115.com/file/clt2fbhu&lt;/a&gt;，下载来看了下，觉得太麻烦了，要解锁loader，所以暂时没有刷这个ROM。&lt;/p&gt;  &lt;p&gt;不稳定的话，考虑刷回2.1，然后搞个MIUI算了。&lt;/p&gt;  &lt;p&gt;虽然不稳定，至少听歌不会有杂音了。杂音是因为系统资源时不时出现紧张导致的吗？&lt;/p&gt;  &lt;p&gt;MIUI还不错，很多东西内置，不用安装三方软件。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=1253277"&gt;http://forum.xda-developers.com/showthread.php?t=1253277&lt;/a&gt; 破解Bootloader&lt;/p&gt;  &lt;p&gt;&lt;b&gt;今天用着MIUI 1.9.9比较稳定，一路玩微博没有重启！！！2012-1-18&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;SO，是否考虑不用再刷了。&lt;/p&gt;  &lt;p&gt;这个ROM没有了官方的旧电视关闭效果，虽然有点遗憾，不过这个不重要。&lt;/p&gt;  &lt;p&gt;只是似乎每次WIFI需要自己手工连接，这倒不是什么大问题。&lt;/p&gt;  &lt;p&gt;截图为证：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.havebb.com/b/image.axd?picture=miui-x10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="miui-x10" border="0" alt="miui-x10" src="http://blog.havebb.com/b/image.axd?picture=miui-x10_thumb.png" width="127" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/索爱X10成功刷上MIUI.aspx</link>
      <comments>http://blog.havebb.com/b/post/索爱X10成功刷上MIUI.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=ae089b12-0caa-4a59-90f4-33c7b839d656</guid>
      <pubDate>Wed, 18 Jan 2012 05:23:52 +0100</pubDate>
      <category>手机</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=ae089b12-0caa-4a59-90f4-33c7b839d656</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=ae089b12-0caa-4a59-90f4-33c7b839d656</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/索爱X10成功刷上MIUI.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=ae089b12-0caa-4a59-90f4-33c7b839d656</wfw:commentRss>
    </item>
    <item>
      <title>2012年第一篇</title>
      <description>&lt;p&gt;似乎2011年年会场景还历历在目，可是现在已经是2012年了。因为心中还有梦想，所以是时候总结一下过去，把握未来的方向。生活方面的总结在2011年12月31日晚上写完，文章写在时间跨了一年。这里只写工作方面的总结。&lt;/p&gt;  &lt;h2&gt;失败的架构设计&lt;/h2&gt;  &lt;p&gt;如果要我总结2011年的工作，我大概会脸红心跳的写上一句“参与某某系统的架构设计”。我不能说那不是在“架构”，但是我觉得“设计”两字则可以去掉。&lt;/p&gt;  &lt;h4&gt;这是架构设计？&lt;/h4&gt;  &lt;p&gt;某个项目我参与了“架构设计”，之所以打上引号是因为经过一年时间的观察，这根本就不是什么“架构设计”。年底正好因为一个代码的改动触动整个系统的多个地方，我不得不对代码的一些角落进行review，现在看来那次设计只能说是项目代码结构设计。回忆起来，我做代码结构设计时参照的是DDD的概念——当然是照猫画虎，结果一些地方搞得太复杂（必须反思），有人理解不了。于是BOSS大手一挥，搞成“经典三层”。没办法，我极力劝说如果不使用LINQ 2 SQL这类ORM也要自己写一些库帮助我们减轻DAL层的负担——当然其他层也要做一些抽象工作。后来我得到一个DAL基类，使用不方便的基类，事实证明这个项目团队成员自己造的轮子质量不怎么样。下半年我看到PetaPOCO和Dapper时心里不免一声叹息。不过看到PetaPOCO也使用了T4来帮助生成Entity，也算是个安慰——T4是由我引入团队。&lt;/p&gt;  &lt;h4&gt;为什么不能叫做“架构设计”？&lt;/h4&gt;  &lt;p&gt;架构设计不是机械的把各个代码分层摆放，为了体现分层，把代码结构搞成Entity-&amp;gt;EntityDAL-&amp;gt;EntityBLL这样的机械映射。于是N多BLL啥也没有，除了对DAL同名方法的调用。复杂的BLL类则变成大杂烩，各种各样的类紧密的糅合在一个类里面，超过50行的方法体到处可见。&lt;/p&gt;  &lt;h4&gt;真正的“架构设计”是怎样的？&lt;/h4&gt;  &lt;p&gt;架构对团队中开发者都会有影响，有了架构则意味着在此架构之下编写代码需要收到一定的约束。然而团队成员的素质也会影响架构。差的架构使开发人员缚手缚脚，而团队成员素质不高则无法理解架构设计者的意图。架构设计不应该仅仅是代码结构设计，也应该包含领域模型的设计。在上一个项目中，人们只关注代码结构而领域模型的设计则被完全忽略，没有认真设计。因而一些关键的领域模型设计不合理，给系统的稳定性带来影响，经常出现各种各样的问题，很难维护。&lt;/p&gt;  &lt;h4&gt;为什么他们不肯改变？&lt;/h4&gt;  &lt;p&gt;不肯改变可能是因为人天生惧怕未知事务。很多时候改变意味着需要学习没有接触过的技术，复杂一些的技术往往有一定的学习曲线，在学习过程中难免遇到困难。&lt;/p&gt;  &lt;p&gt;然而技术必须进步，不学习不改变的后果可能是被淘汰。&lt;/p&gt;  &lt;p&gt;很多开发人员喜欢一直使用自己熟悉的那一套东西，也许是没有时间学习，也许是没有兴趣。&lt;/p&gt;  &lt;h4&gt;过度设计？&lt;/h4&gt;  &lt;p&gt;不设计是错，过度设计也是个错。过度设计会导致系统过度复杂，会影响开发进度，并且越是复杂的系统越容易出错。&lt;/p&gt;  &lt;h4&gt;换平台？&lt;/h4&gt;  &lt;p&gt;从熟悉的平台转换到新的平台或者旧平台版本升级都需要小心，特别是在项目时间很紧的情况下。我认为技术人员喜欢“折腾”并不是坏事，但是折腾也要看情况。在项目工期紧张的情况下转换平台可能会将项目成员的战斗力极大的削弱。总之换平台这种事情事先要做大量的测试，最好团队大多数人对新平台都比较熟悉。&lt;/p&gt;  &lt;h2&gt;不太理想的环境&lt;/h2&gt;  &lt;p&gt;我对“环境”的要求其实也不高，较为宽敞的办公环境，一台强劲的工作电脑，可以装各种最新的软件，能安装几个虚拟机——最好有双屏。然而现实情况则是差劲的电脑，有时候慢得令人难以忍受。这还只是“硬”环境，还有软环境。&lt;/p&gt;  &lt;h4&gt;讨厌的官腔。&lt;/h4&gt;  &lt;p&gt;软件开发团队应该尽量平等，有职务上的差别，但不能出现森严的等级。一个成熟的从业者应该是自我驱动的，而不是靠压力驱动。&lt;/p&gt;  &lt;h4&gt;搞运动？&lt;/h4&gt;  &lt;p&gt;常见的场景：某某向BIG BOSS提出系统增加某某功能可以帮助某某部门提升XX倍效率或XX种好处，于是BIG BOSS亲自下令，某某功能作用很大，必须在某月某号上线！&lt;/p&gt;  &lt;p&gt;结果开发人员赶出来，程序自然是相当的不稳定，数据库查询超时啊，某个查询条件不能用啊……最后，当然，实际上这个功能也没几个人在用。&lt;/p&gt;  &lt;h2&gt;需要改变的自己&lt;/h2&gt;  &lt;p&gt;就算是清清楚楚知道自己的缺点和问题也未必能够改变，然而不改变则无法成功。每日三省吾身的同时也要付出行动纠正。&lt;/p&gt;  &lt;h4&gt;执行力差是我的顽疾。&lt;/h4&gt;  &lt;p&gt;很久以来，我个人的大问题是“执行力”差，其实就是懒惰。很多想法都停留在想法阶段，没有付诸行动。&lt;/p&gt;  &lt;p&gt;心智不够成熟，处事的方式也有待提高。最近意识到这个问题，开始看一些通俗心理学方面的书籍。&lt;/p&gt;  &lt;p&gt;在情绪控制方面有了一些提高。&lt;/p&gt;  &lt;h4&gt;今年要提高阅读量&lt;/h4&gt;  &lt;p&gt;去年的阅读量不高，有些书读了也没有消化。今年要改变这个现状，首先从提高阅读量开始。可以从泛读开始，虽然对于一些复杂的书籍很难通过泛读获得大量信息，但是可以开阔视野，往往经过一番工作实践之后回头再看可以获得非常好的效果。&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/2012.aspx</link>
      <comments>http://blog.havebb.com/b/post/2012.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=b60b8f95-6d47-4e97-afb4-d01f10eca031</guid>
      <pubDate>Tue, 03 Jan 2012 16:20:00 +0100</pubDate>
      <category>杂谈</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=b60b8f95-6d47-4e97-afb4-d01f10eca031</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=b60b8f95-6d47-4e97-afb4-d01f10eca031</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/2012.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=b60b8f95-6d47-4e97-afb4-d01f10eca031</wfw:commentRss>
    </item>
    <item>
      <title>远程桌面链接Console + 密码保存</title>
      <description>&lt;p&gt;如果经常使用Windows的远程桌面管理电脑，就可能会遇到这样的问题：&lt;br /&gt;遇到错误：&amp;ldquo;已超过允许的最大终端连接数&amp;rdquo;。要等其他帐号注销才能链接，有时候我们等不起啊，得立刻连上去。&lt;br /&gt;每次都要输入密码？为了安全，服务器的密码往往使用复杂的密码，每次都要输入令人不耐。&lt;br /&gt;如何解决？&lt;br /&gt;建一个批处理文件：&lt;br /&gt;mstsc /console "c:\my.rdp"&lt;/p&gt;
&lt;p&gt;或者，直接在运行里面输入也可以。&lt;/p&gt;
&lt;p&gt;my.rdp是预先保存起来的远程桌面配置文件。&lt;br /&gt;参考：http://www.360doc.com/content/10/0324/10/61497_20031899.shtml&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/mstsc-console-remote-desktop.aspx</link>
      <comments>http://blog.havebb.com/b/post/mstsc-console-remote-desktop.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=45dc3ca7-de9a-429f-99de-caf8846f4a37</guid>
      <pubDate>Thu, 22 Dec 2011 05:59:00 +0100</pubDate>
      <category>软件使用</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=45dc3ca7-de9a-429f-99de-caf8846f4a37</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=45dc3ca7-de9a-429f-99de-caf8846f4a37</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/mstsc-console-remote-desktop.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=45dc3ca7-de9a-429f-99de-caf8846f4a37</wfw:commentRss>
    </item>
    <item>
      <title>微软的CRM</title>
      <description>&lt;p&gt;今天终于见到微软Dynamic CRM 2011真容。看起来很有意思，跟我之前接触过的CRM风格完全不同，很多值得学习和借鉴的地方。秉承微软软件的一贯风格，Dynamic CRM也是重度依赖微软的各种软件，并且只能使用IE浏览器浏览。界面是类似Office 2010的风格，各种窗体也是类似Windows Form风格。这个软件是用ASP.NET做的，下载过其安装文件，配置项不是一般的多啊。&lt;/p&gt;  &lt;p&gt;里面有很多设计上可以学习的地方，比如界面可以做各种定制，流程、角色、权限、表单都可以自定义。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.havebb.com/b/image.axd?picture=image_76.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.havebb.com/b/image.axd?picture=image_thumb_71.png" width="644" height="309" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Dashboard&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/first-look-dynamic-crm-2011.aspx</link>
      <comments>http://blog.havebb.com/b/post/first-look-dynamic-crm-2011.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=6041e0bd-084b-4de9-9b0a-4990398f1b75</guid>
      <pubDate>Fri, 09 Dec 2011 16:02:58 +0100</pubDate>
      <category>软件使用</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=6041e0bd-084b-4de9-9b0a-4990398f1b75</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=6041e0bd-084b-4de9-9b0a-4990398f1b75</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/first-look-dynamic-crm-2011.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=6041e0bd-084b-4de9-9b0a-4990398f1b75</wfw:commentRss>
    </item>
    <item>
      <title>ASP.NET和负载均衡</title>
      <description>&lt;p&gt;ASP.NET和负载均衡&lt;br /&gt;用了负载均衡，有些具体实现方式就不同了。首先要注意的几个地方：&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. Session State存储的问题，如果网站需要使用Session，那么就不能将Session以InProc的模式存储。必须将Session存储在Session State Server或者数据库中。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. Machine Key的问题。每台机器要使用相同的Machine Key。否则同一个客户会生成不同的SessionID。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. 并发控制、数据同步的问题。&lt;br /&gt;&lt;br /&gt;参考资料：&lt;br /&gt;http://www.west-wind.com/presentations/loadbalancing/networkloadbalancingwindows2003.asp （配置负载均衡，以前也许用得上，现在人们用ngnix了。）&lt;br /&gt;http://serverfault.com/questions/267422/how-to-load-balance-sql-server-2008-for-high-usage-asp-net-applications&lt;br /&gt;http://www.codeproject.com/KB/architecture/dbloadbalancerservice.aspx&lt;br /&gt;http://stackoverflow.com/questions/3347463/asp-net-load-balancing&lt;br /&gt;http://blog.maartenballiauw.be/post/2007/11/ASPNET-load-balancing-and-ASPNET-state-server-%28aspnet_state%29.aspx （负载均衡与Session State。存储Session的方式最起码不能用InProc模式了。）&lt;br /&gt;http://blog.maartenballiauw.be/post/2008/01/ASPNET-Session-State-Partitioning.aspx （这个以前从为接触过！）&lt;br /&gt;http://wiki.asp.net/page.aspx/1248/aspnet-and-load-balancing/（没真正使用过LB，那么有很多细节很可能想不到。这篇文章介绍了一些需要注意的地方。）&lt;br /&gt;http://social.technet.microsoft.com/Search/en-us/?query=Network+Load+Balancing&amp;amp;refinement=0&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/asp-net-and-load-balance.aspx</link>
      <comments>http://blog.havebb.com/b/post/asp-net-and-load-balance.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=1abdeb40-5aae-4395-8eee-0289a399c896</guid>
      <pubDate>Mon, 28 Nov 2011 05:18:00 +0100</pubDate>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>互联网</category>
      <category>疑难杂症</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=1abdeb40-5aae-4395-8eee-0289a399c896</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=1abdeb40-5aae-4395-8eee-0289a399c896</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/asp-net-and-load-balance.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=1abdeb40-5aae-4395-8eee-0289a399c896</wfw:commentRss>
    </item>
    <item>
      <title>ASP.NET调用存储过程突然变慢？</title>
      <description>&lt;p&gt;有一个ASP.NET程序的内容搜索使用的是SQL SERVER 2005存储过程，里面连接6个表，搜索的添加组合多。程序编写者通过分页读取N条记录，并且在存储过程中统计数据总行数。刚刚部署上去速度快， 效果似乎令人满意。但是过了段时间之后页面突然变慢，开始以为是数据库负担较重，但是经过检查发现数据库的负担并不重。并且有个有趣的现象——通过数据库管理器调用该存储过程速度非常快。&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ASP.NET调用SQL后台存储过程时，有时突然就变得很慢，在后台直接执行存储过程没问题，但在前台调用存储过程时就是很慢，而且在前台调用成功后，再次调用还是一样的慢，但更新一下存储过程再调用就很快了。但这始终不能彻底解决问题，过段时间又会出来同样的问题。环境（NET2.0+SQL2005)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;要解决这个问题，可以不用存储过程，或者在存储过程耗时比较长的语句上加上with recompile，叫数据库别缓存执行计划。不过这样似乎存储过程的优势没那么明显了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;数据库查询性能优化别迷信存储过程，如果没用好，存储过程也会成为性能杀手。其实我们在网络上查找的各种“优化指南”很可能有其局限性，有其适应范围，如果我们一味迷信，则可能陷入麻烦。要知道这世上暂时没有银弹。我们不应该期望一种方法可以解决所有问题。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;遇到问题需要用一些手段进行调查，另外平时知识的积累也非常重要，如果知识面不够，可能看到问题现象也无法联想到解决方案。&lt;/p&gt;  &lt;p&gt;参考：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://s.yanghao.org/program/viewdetail.php?i=36240"&gt;http://s.yanghao.org/program/viewdetail.php?i=36240&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://stackoverflow.com/questions/2462312/sql-server-stored-procedure-suddenly-become-slow"&gt;http://stackoverflow.com/questions/2462312/sql-server-stored-procedure-suddenly-become-slow&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/produce-suddenly-slow.aspx</link>
      <comments>http://blog.havebb.com/b/post/produce-suddenly-slow.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=16c170ca-bbd9-4853-b891-e90f967c6a1c</guid>
      <pubDate>Sat, 12 Nov 2011 15:14:23 +0100</pubDate>
      <category>ASP.NET</category>
      <category>数据库</category>
      <category>疑难杂症</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=16c170ca-bbd9-4853-b891-e90f967c6a1c</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=16c170ca-bbd9-4853-b891-e90f967c6a1c</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/produce-suddenly-slow.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=16c170ca-bbd9-4853-b891-e90f967c6a1c</wfw:commentRss>
    </item>
    <item>
      <title>控件性能优化记</title>
      <description>&lt;p&gt;&amp;nbsp;有个项目的性能需要优化，我发现几乎每个页面都要加载一个用户控件：菜单。这个菜单空间有时候需要600+ms，因为有其他事情，就匆匆加了缓存，于是速到降到200+ms。由于这个菜单几乎每个页面都会加载，耗时200+ms仍然不能接受。因为菜单每次访问不同的页面都需要更新样式，所以也不好直接将生成的HTML缓存起来。最近有些时间做性能优化，决定仔细看看有什么地方需要优化。&lt;br /&gt;粗略看了下，这个菜单一共有三级（最多三级），原来的开发者在一个Repeater里面层级嵌套了两个Repeater，通过这些层级嵌套逐级绑定菜单。为了写cookies记录当前菜单，通过ajax先访问一个专门写cookies的页面，调用成功后跳转到菜单对应的页面。Repeater的数据绑定使用Eval。&lt;br /&gt;做了那些优化？&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 缓存数据，避免不必要的查询。改写之后只在用户每次登录的时候读取一次用户的信息，在Session有效期内不再读取任何数据库。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 去掉控件嵌套，使用个Repeater空间，绑定第一级菜单，数据的绑定用强类型而不是Eval()函数，比如((Customer)Container.DateItem).Name，相对Eval，这种做法能够节省点时间。看起来Repeater的性能还是不错的，只是如果用到嵌套就要小心一些。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第二级和第三级菜单用StringBuilder生成，只是这样似乎稍微难维护一些，用控件绑定的情况下可以较容易看清菜单的HTML结构。用StringBuilder生成之后就没那么容易了。不过我觉得这个问题对于性能的提升来说是可以容忍的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 去掉AJAX设置Cookies的调用，改用被访问的页面来设置Cookies。&lt;br /&gt;&lt;br /&gt;最后优化结果的6MS消耗在菜单集合的遍历&amp;mdash;&amp;mdash;MoveNext函数，是不是还有改进空间？&lt;br /&gt;性能优化先要知道性能损耗在什么地方，然后对症下药，因此最好有个好用的Profiler。&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/optimize-control-performance.aspx</link>
      <comments>http://blog.havebb.com/b/post/optimize-control-performance.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=1cf20644-3efa-4310-b04e-0dd529b460e6</guid>
      <pubDate>Fri, 28 Oct 2011 05:59:00 +0100</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=1cf20644-3efa-4310-b04e-0dd529b460e6</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=1cf20644-3efa-4310-b04e-0dd529b460e6</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/optimize-control-performance.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=1cf20644-3efa-4310-b04e-0dd529b460e6</wfw:commentRss>
    </item>
    <item>
      <title>IIS CPU占用居高不下之ASP.NET篇2</title>
      <description>&lt;p&gt;这篇讨论我们如何在产品服务器的IIS上找出性能杀手。首先，我们要找到几样武器。&lt;/p&gt;  &lt;h4&gt;IIS 6.0 资源工具包工具 &lt;/h4&gt;  &lt;p&gt;&lt;a href="http://support.microsoft.com/kb/840671"&gt;http://support.microsoft.com/kb/840671&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;IIS6提供的几个有用的工具，在做性能方面的测试时最有用的可能是tinyGet这个工具。&lt;/p&gt;  &lt;h4&gt;Windows Debug Tool&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx"&gt;http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;下面主要用windbg、adplus来分析IIS CPU占用高的问题。&lt;/p&gt;  &lt;h4&gt;首先用adplus获取内存转储。&lt;/h4&gt;  &lt;blockquote&gt;   &lt;p&gt;adplus -hang -pn w3wp.exe -quiet&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;安装好Windows Debug工具之后可以在安装目录找到adplus.vbs文件。上面命令的意思是立即为名为w3wp.exe的进程创建内存转储。adplus还有一些其他的参数，这里先不管。adplus运行时会使系统变慢，她会在硬盘上创建一个大文件，文件的大小与w3wp.exe私有内存的大小有关，对于一个运行ASP.NET的w3wp.exe来说，200M以上很平常。&lt;/p&gt;  &lt;h4&gt;用windbg打开刚刚获得的内存转储文件并开始分析。&lt;/h4&gt;  &lt;p&gt;其中很重要的一步：在windbg的命令窗口输入.load sos.dll，可以从.net framework文件夹找到这个dll。目前一共有三个版本分别是.net1.1、.net2.0和.net4.0。.net 3.0和.net 3.5和.net2.0使用同一个dll。打开内存转储文件后如果没有安装Windows的调试符号库，windbg会做提示，不过分析托管程序似乎没有这些调试符号库也不会有太大的影响。&lt;/p&gt;  &lt;h4&gt;然后在windbg的命令窗口输入不同的命令以获取需要的信息。&lt;/h4&gt;  &lt;p&gt;输入!threadpool命令，可以看到CPU使用率。&lt;/p&gt;  &lt;p&gt;输入.time命令，查看系统正常运行时间。分系统时间和用户时间，一般出问题都是用户时间。&lt;/p&gt;  &lt;p&gt;输入!runaway命令，查看所有线程的用户时间，不过这里显示的线程耗费时间并不能完全认为时间越大就是杀手，但至少是重大嫌疑人。&lt;/p&gt;  &lt;p&gt;输入~#s命令（#用上面看到的线程ID替代），查看线程上下文。&lt;/p&gt;  &lt;p&gt;输入kb 2000命令，查看非托管堆栈。如果没有下载安装Windows调试symbols会缺少一些信息。&lt;/p&gt;  &lt;p&gt;输入!clrstack命令，查看托管堆栈。这个可以帮我们获得.net调用堆栈，可以获得一些很重要的信息。&lt;/p&gt;  &lt;p&gt;输入~* kb 2000命令，查看所有非托管堆栈。不过比较难获取有用的信息。可能可以看到GC被触发。&lt;/p&gt;  &lt;p&gt;输入!dumpheap -min 85000命令，查看堆里面大的对象。&lt;/p&gt;  &lt;p&gt;输入!do &amp;lt;address of string&amp;gt;命令，查看内存中保存了什么。&lt;/p&gt;  &lt;p&gt;参考资料：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx"&gt;http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/iis-high-cpu-asp-net-2.aspx</link>
      <comments>http://blog.havebb.com/b/post/iis-high-cpu-asp-net-2.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=6ad3bcf0-db99-4094-9fca-b2fdd9f4fa76</guid>
      <pubDate>Tue, 18 Oct 2011 15:57:41 +0100</pubDate>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>疑难杂症</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=6ad3bcf0-db99-4094-9fca-b2fdd9f4fa76</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=6ad3bcf0-db99-4094-9fca-b2fdd9f4fa76</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/iis-high-cpu-asp-net-2.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=6ad3bcf0-db99-4094-9fca-b2fdd9f4fa76</wfw:commentRss>
    </item>
    <item>
      <title>IIS CPU占用居高不下之ASP.NET篇1</title>
      <description>&lt;p&gt;这篇文章探讨使IIS CPU居高不下的原因——ASP.NET方面。&lt;/p&gt;  &lt;h4&gt;没有批编译&lt;/h4&gt;  &lt;p&gt;产品服务器上的网站要在config中关闭debug模式。我看到一些产品服务器上的网站没有关闭debug模式，并且这些网站是面向公众的站点。他们部署的时候采用Debug模式编译，为了方便将源代码（aspx未经预编译）也一起发布到产品服务器。这些做法是网站性能的杀手，应该避免。&lt;/p&gt;  &lt;p&gt;如果在网站上启用debug，会怎么样呢？&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ASP.NET网页的编译时间会变长，因为一些批编译的优化会被关闭，代码不是以最优方式执行。 &lt;/li&gt;    &lt;li&gt;代码执行会变慢，因为为了方便调试一些附加的路径会被启用。 &lt;/li&gt;    &lt;li&gt;程序运行时会占用更多内存。 &lt;/li&gt;    &lt;li&gt;通过WebResources.axd下载的图片和脚本不会被缓存，这个也挺要命。 &lt;/li&gt;    &lt;li&gt;网页的执行不会超时，为了方便调试，ASP.NET页面执行时如果开启了debug模式则执行时页面不会超时。这在产品服务器中可能会因耗尽线程池而让网站挂掉。 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;这些都是启用了ASP.NET调试模式带来的后果，通过aspx和配置文件都可以启用调试模式。在产品服务器上我们可以修改machine.config，增加一项配置：&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:04923685-4244-4e41-8619-190ab6a2a32e" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;system.web&amp;gt;
          &amp;lt;deployment retail=”true”/&amp;gt;
    &amp;lt;/system.web&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这样我们可以关闭所有此服务器上的ASP.NET网站都关闭调试模式。&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/iis-high-cpu-asp-net-1.aspx</link>
      <comments>http://blog.havebb.com/b/post/iis-high-cpu-asp-net-1.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=b46a2a05-5d1c-4e59-9d54-936af62d6a87</guid>
      <pubDate>Mon, 17 Oct 2011 15:45:51 +0100</pubDate>
      <category>ASP.NET</category>
      <category>疑难杂症</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=b46a2a05-5d1c-4e59-9d54-936af62d6a87</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=b46a2a05-5d1c-4e59-9d54-936af62d6a87</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/iis-high-cpu-asp-net-1.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=b46a2a05-5d1c-4e59-9d54-936af62d6a87</wfw:commentRss>
    </item>
    <item>
      <title>ClickOnce和MSBuild</title>
      <description>&lt;p&gt;话说C/S架构和B/S架构相比有一个传统意义上的不方便，就是部署相对麻烦。在程序部署之后我们经常会因为各种原因要更新程序，B/S程序我们只需要更新网站文件就可以了，可是C/S软件就要将程序分发给所有用户。所以C/S架构的软件通常提供“自动更新”。一般来说，这会增加程序员的开发工作量。于是微软提供了“ClickOnce”。有这个“ClickOnce”我们不用为了程序的“自动更新”编写代码，只需要做些设置，然后将程序文件放到网站上。&lt;/p&gt;  &lt;h4&gt;调整参数&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blog.havebb.com/b/image.axd?picture=image_74.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.havebb.com/b/image.axd?picture=image_thumb_69.png" width="244" height="181" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;选中要发布的项目，然后点“Publish”&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://blog.havebb.com/b/image.axd?picture=image_75.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.havebb.com/b/image.axd?picture=image_thumb_70.png" width="244" height="96" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; 然后根据向导的提示一步步完成发布操作。&lt;/p&gt;  &lt;p&gt;不过，这种手工发布的方式在一个复杂的团队开发项目中并不是很合适。手工部署很容易出现错误，如果要根据不同的环境发布程序更是会让人抓狂！&lt;/p&gt;  &lt;p&gt;因此我希望能够通过一些“脚本”帮助解决这些恼人的问题——这个时候就是MSBuild大展身手的时候！下一篇将专门说MSBuild如何自动化部署ClickOnce应用。&lt;/p&gt;  &lt;h4&gt;参考&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/7azx932h(v=VS.90).aspx"&gt;http://msdn.microsoft.com/en-us/library/7azx932h(v=VS.90).aspx&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/clickonce-msbuild-1.aspx</link>
      <comments>http://blog.havebb.com/b/post/clickonce-msbuild-1.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=6ef8297d-ee66-4e46-99ee-1b9dffd287a3</guid>
      <pubDate>Thu, 22 Sep 2011 13:29:09 +0100</pubDate>
      <category>.NET</category>
      <category>软件使用</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=6ef8297d-ee66-4e46-99ee-1b9dffd287a3</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=6ef8297d-ee66-4e46-99ee-1b9dffd287a3</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/clickonce-msbuild-1.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=6ef8297d-ee66-4e46-99ee-1b9dffd287a3</wfw:commentRss>
    </item>
    <item>
      <title>将Log4Net的消息实时显示在Windows Form的TextBox控件中</title>
      <description>&lt;p&gt;log4net真是个不错的库，在我最近写的程序中，如果没有UI，我几乎都会在程序中引入log4net。我们需要知道程序发生了什么。我通常将日志写入文本文件，如果要实时查看日志可以使用BareTail之类的软件打开日志文件。如果新的日志消息被加入文件，BareTail会将新的消息显示在列表中，而如果使用记事本之类的软件我们需要重新打开软件才能看到新的日志消息。&lt;/p&gt;  &lt;p&gt;log4net提供了很多Appender，可以让我们将日志消息“附加”到各种“媒介”上——文本文件、数据库、UDP广播、内存……这次我利用MemoryAppender实现我需要的功能——将日志消息实时显示在Windows Form程序的TextBox控件中。&lt;/p&gt;  &lt;p&gt;程序分为总共有两个Form，主Form上面有一个TextBox控件。&lt;/p&gt;  &lt;p&gt;Form1代码：&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:2122bcbd-8da1-401d-97e1-0c2879b64573" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: c#;"&gt;using System;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using log4net;
using log4net.Appender;
using log4net.Config;
using log4net.Core;

namespace Log4NetScrollingTextbox
{
    public partial class Form1 : Form
    {
        private static readonly ILog logger = LogManager.GetLogger(typeof (Form1));
        private readonly MemoryAppender appender;
        private readonly Thread logWatcher;
        private bool logWatching = true;

        public Form1()
        {
            InitializeComponent();
            FormClosing += Form1_FormClosing;
            appender = new MemoryAppender();
            BasicConfigurator.Configure(appender);

            logWatcher = new Thread(LogerWatch);
            logWatcher.Start();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            logWatching = false;
            logWatcher.Join();
        }

        private void LogerWatch()
        {
            while (logWatching)
            {
                LoggingEvent[] events = appender.GetEvents();
                if (events != null &amp;amp;&amp;amp; events.Length &amp;gt; 0)
                {
                    // if there are events, we clear them from the logger,  
                    // since we're done with them  
                    appender.Clear();
                    foreach (LoggingEvent ev in events)
                    {
                        string line = ev.LoggerName + ": " + ev.RenderedMessage + "\r\n";
                        AppendLog(line);
                    }
                }

                Thread.Sleep(500);
            }
        }

        private void AppendLog(string line)
        {
            if (textBox1.InvokeRequired)
            {
                BeginInvoke(new Action&amp;lt;string&amp;gt;(DoAppendLog), line);
            }
            else
            {
                DoAppendLog(line);
            }
        }

        private void DoAppendLog(string line)
        {
            if (textBox1.Lines.Length &amp;gt; 99)
            {
                var builder = new StringBuilder(textBox1.Text);
                // strip out a nice chunk from the beginning  
                builder.Remove(0, textBox1.Text.IndexOf('\r', 3000) + 2);
                builder.Append(line);
                textBox1.Clear();
                // using AppendText since that makes sure the TextBox stays 
                // scrolled at the bottom 
                textBox1.AppendText(builder.ToString());
            }
            else
            {
                textBox1.AppendText(line);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 1000;
            timer1.Enabled = true;
        }

        private void Timer1Tick(object sender, EventArgs e)
        {
            logger.Info(string.Format("现在时间是：{0}", DateTime.Now));
        }

        private void Button1Click(object sender, EventArgs e)
        {
            var form = new Form2();
            form.Show();
        }
    }
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Form2代码：&lt;/p&gt;



&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:4700161b-97c4-4e5b-94bf-be77a89c9745" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: c#;"&gt;using System;
using System.Windows.Forms;
using log4net;

namespace Log4NetScrollingTextbox
{
    public partial class Form2 : Form
    {
        public static readonly ILog logger = LogManager.GetLogger(typeof (Form2));

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            logger.Info("Form2 Opened.");
            timer1.Interval = 1000;
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            logger.Info(string.Format("现在时间是：{0}", DateTime.Now));
        }
    }
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;MemoryAppender的代码来自：&lt;a href="http://www.claassen.net/geek/blog/2005/06/log4net-scrollingtextbox.html"&gt;http://www.claassen.net/geek/blog/2005/06/log4net-scrollingtextbox.html&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/log4net-scrolling-log-in-textbox.aspx</link>
      <comments>http://blog.havebb.com/b/post/log4net-scrolling-log-in-textbox.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=4fab9665-5724-4b0b-9a3f-22a73a35b83a</guid>
      <pubDate>Tue, 20 Sep 2011 14:05:20 +0100</pubDate>
      <category>.NET</category>
      <category>软件使用</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=4fab9665-5724-4b0b-9a3f-22a73a35b83a</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=4fab9665-5724-4b0b-9a3f-22a73a35b83a</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/log4net-scrolling-log-in-textbox.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=4fab9665-5724-4b0b-9a3f-22a73a35b83a</wfw:commentRss>
    </item>
    <item>
      <title>IIS的CPU占用率居高不下？</title>
      <description>&lt;p&gt;有一天项目的IIS工作进程w3wpCPU占用率居高不下，当时想用.NET Performance Profiler工具检查是哪里出了问题。但是由于改Profiler工具需要重启IIS，这个可能导致问题不能重现，后来又去下载了微软的ProcessMonitor，不过等我们下载到工具，IIS已经恢复平静，并再也没有出现过。&lt;/p&gt;  &lt;p&gt;不过，现在不出现并不代表永远不会出现。所以还是要准备一些工具和方法来解决这些问题。&lt;/p&gt;  &lt;p&gt;分析IIS日志，检查是不是有很多500错误，这些出现500错误的页面绝对是我们关注的重点。有一些工具可以帮助我们对IIS日志进行全面分析。&lt;/p&gt;  &lt;p&gt;LogParser，可以帮我们分析文本日志文件，有了她我们就可以知道忙碌的IIS都忙了些啥。&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=24659"&gt;http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=24659&lt;/a&gt; 下载LogParser&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blog.csdn.net/downmoon/article/details/4509513"&gt;http://blog.csdn.net/downmoon/article/details/4509513&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/2005/08/microsoft-logparser.html"&gt;http://www.codinghorror.com/blog/2005/08/microsoft-logparser.html&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://visuallogparser.codeplex.com/"&gt;http://visuallogparser.codeplex.com/&lt;/a&gt; 来个GUI&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.brothersoft.com/log-parser-lizard-238815.html"&gt;http://www.brothersoft.com/log-parser-lizard-238815.html&lt;/a&gt; 另外一个GUI&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.symantec.com/connect/articles/forensic-log-parsing-microsofts-logparser"&gt;http://www.symantec.com/connect/articles/forensic-log-parsing-microsofts-logparser&lt;/a&gt; 介绍LogParser&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;有了LogParser，我们可以这样查出10个最慢的网页：&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:75680eb2-9cc2-49f6-8cd9-07ec0a3828e7" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: sql;"&gt;SELECT TOP 10 cs-uri-stem AS Url, MIN(time-taken) as [Min], 

AVG(time-taken) AS [Avg], max(time-taken) AS [Max], 

count(time-taken) AS Hits 

FROM ex*.log 

WHERE time-taken &amp;lt; 120000 

GROUP BY Url 

ORDER BY [Avg] DESC

&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;很方便，很实用，不是吗？剩下的事情就是分析这10个网页为什么这么慢。这个时候可以清楚Performance Profiler大神来帮忙。&lt;/p&gt;

&lt;p&gt;awStats，也是一个IIS日志分析工具，这个工具以报表形式展示日志分析结果，这些结果对运维人员更有用，而开发人员则获取到的有用信息可能比较有限。另外，这个东东比较难安装和配置。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://awstats.sourceforge.net/"&gt;http://awstats.sourceforge.net/&lt;/a&gt; 下载awStats&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;搭建测试环境，对网站程序进行压力测试，配合Performance Profiler检查程序有哪些地方性能可以优化。&lt;/p&gt;

&lt;p&gt;Red Gate .NET Performance Profiler，很不错的工具，可以得到很详细的报告。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/"&gt;http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;&lt;a href="http://www.codeproject.com/KB/showcase/netapp_performance.aspx"&gt;http://www.codeproject.com/KB/showcase/netapp_performance.aspx&lt;/a&gt; 介绍文章&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;JetBrian dotTrace&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://www.jetbrains.com/profiler/"&gt;http://www.jetbrains.com/profiler/&lt;/a&gt; 下载地址&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CLRProfiler，免费啊！&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=13382"&gt;http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=13382&lt;/a&gt; 原来微软也出了一个免费的工具&lt;/p&gt;

  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms979205.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms979205.aspx&lt;/a&gt; 介绍文章&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;更多工具：&lt;a href="http://en.wikipedia.org/wiki/List_of_performance_analysis_tools#.NET"&gt;http://en.wikipedia.org/wiki/List_of_performance_analysis_tools#.NET&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如何避免CPU占用率居高不下，当然写高质量的代码，哈哈。写代码的时候注意，免得要花了几天时间最后发现导致问题出现的仅仅是一个低级错误……&lt;/p&gt;

&lt;p&gt;还有什么神秘武器没？&lt;/p&gt;

&lt;p&gt;后记：上次工作中遇到的IIS CPU占用居高不下原因可能非常简单，就是程序非常频繁地访问某个网页。程序被关闭之后CPU占用立即降了下来。由于出现频繁访问需要一定的条件才会出现，所以之后一直也没有出现。&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/about-iis-high-cpu.aspx</link>
      <comments>http://blog.havebb.com/b/post/about-iis-high-cpu.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=afd16736-9188-4042-aa9a-237e162e6286</guid>
      <pubDate>Fri, 16 Sep 2011 14:03:39 +0100</pubDate>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>疑难杂症</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=afd16736-9188-4042-aa9a-237e162e6286</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=afd16736-9188-4042-aa9a-237e162e6286</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/about-iis-high-cpu.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=afd16736-9188-4042-aa9a-237e162e6286</wfw:commentRss>
    </item>
    <item>
      <title>C#调用Win32 API枚举窗体和控件</title>
      <description>&lt;p&gt;有时候可能需要枚举一些非托管程序的窗体或控件，此时我们需要调用Win32 API。主要用到两个API函数：EnumWindows和EnumChildWindows。以下是示例代码，来自：&lt;a href="http://www.vbaccelerator.com/home/NET/Code/Libraries/Windows/Enumerating_Windows/article.asp"&gt;http://www.vbaccelerator.com/home/NET/Code/Libraries/Windows/Enumerating_Windows/article.asp&lt;/a&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:74205bd8-5fce-4b3e-a66f-e8ae79b1c760" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: c#;"&gt;    #region EnumWindows
    /// 

    /// EnumWindows wrapper for .NET
    /// 

    public class EnumWindows
    {
        #region Delegates
        private delegate int EnumWindowsProc(IntPtr hwnd, int lParam);
        #endregion

        #region UnManagedMethods
        private class UnManagedMethods
        {
            [DllImport("user32")]
            public extern static int EnumWindows (
                EnumWindowsProc lpEnumFunc, 
                int lParam);
            [DllImport("user32")]
            public extern static int EnumChildWindows (
                IntPtr hWndParent,
                EnumWindowsProc lpEnumFunc, 
                int lParam);
        }
        #endregion

        #region Member Variables
        private EnumWindowsCollection items = null;
        #endregion

        /// 

        /// Returns the collection of windows returned by
        /// GetWindows
        /// 

        public EnumWindowsCollection Items
        {
            get
            {
                return this.items;
            }
        }

        /// 

        /// Gets all top level windows on the system.
        /// 

        public void GetWindows()
        {
            this.items = new EnumWindowsCollection();
            UnManagedMethods.EnumWindows(
                new EnumWindowsProc(this.WindowEnum),
                0);
        }

        /// 

        /// Gets all child windows of the specified window
        /// 

        /// Window Handle to get children for
        public void GetWindows(
            IntPtr hWndParent)
        {
            this.items = new EnumWindowsCollection();
            UnManagedMethods.EnumChildWindows(
                hWndParent,
                new EnumWindowsProc(this.WindowEnum),
                0);
        }

        #region EnumWindows callback
        /// 

        /// The enum Windows callback.
        /// 

        /// Window Handle
        /// Application defined value
        /// 1 to continue enumeration, 0 to stop
        private int WindowEnum(
            IntPtr hWnd,
            int lParam)
        {
            if (this.OnWindowEnum(hWnd))
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        #endregion

        /// 

        /// Called whenever a new window is about to be added
        /// by the Window enumeration called from GetWindows.
        /// If overriding this function, return true to continue
        /// enumeration or false to stop.  If you do not call
        /// the base implementation the Items collection will
        /// be empty.
        /// 

        /// Window handle to add
        /// True to continue enumeration, False to stop
        protected virtual bool OnWindowEnum(
            IntPtr hWnd)
        {
            items.Add(hWnd);
            return true;
        }

        #region Constructor, Dispose
        public EnumWindows()
        {
            // nothing to do
        }
        #endregion
    }    
    #endregion EnumWindows
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;不过上面的代码是有问题的，不过稍作修改就可以使之正常工作。&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/csharp-invoke-win32-api.aspx</link>
      <comments>http://blog.havebb.com/b/post/csharp-invoke-win32-api.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=3bb3a06b-2a50-4c52-ba76-827743101ba5</guid>
      <pubDate>Thu, 15 Sep 2011 13:49:40 +0100</pubDate>
      <category>.NET</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=3bb3a06b-2a50-4c52-ba76-827743101ba5</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=3bb3a06b-2a50-4c52-ba76-827743101ba5</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/csharp-invoke-win32-api.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=3bb3a06b-2a50-4c52-ba76-827743101ba5</wfw:commentRss>
    </item>
    <item>
      <title>ccnet权限管理</title>
      <description>&lt;p&gt;默认情况下ccent任何人都可以通过WebDashboard控制项目的集成。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.havebb.com/b/image.axd?picture=ScreenClip.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ScreenClip" border="0" alt="ScreenClip" src="http://blog.havebb.com/b/image.axd?picture=ScreenClip_thumb.png" width="244" height="107" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;任何人都可以看项目日志，可以下载包。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.havebb.com/b/image.axd?picture=ScreenClip(1).png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ScreenClip(1)" border="0" alt="ScreenClip(1)" src="http://blog.havebb.com/b/image.axd?picture=ScreenClip(1)_thumb.png" width="244" height="179" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;但有时候我们可能不希望如此开放。此时我们可以编辑ccnet.config。&lt;/p&gt;  &lt;p&gt;全局权限：&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:c74b3180-f3c3-4107-b886-0793e26f856c" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;internalSecurity&amp;gt;
    &amp;lt;users&amp;gt;
      &amp;lt;!-- Authenticated users --&amp;gt;
      &amp;lt;passwordUser name="bob" display="Bob (Team Lead)" password="bob1"/&amp;gt;
      &amp;lt;passwordUser name="jane" display="Jane (BA)" password="jane2"/&amp;gt;
      &amp;lt;passwordUser name="john" display="John (QA)" password="john3"/&amp;gt;
      &amp;lt;passwordUser name="joe" display="Joe (QA)" password="joe4"/&amp;gt;
      &amp;lt;!-- Generic role --&amp;gt;
      &amp;lt;simpleUser name="*"/&amp;gt;
    &amp;lt;/users&amp;gt;
    &amp;lt;permissions&amp;gt;
      &amp;lt;!-- Roles --&amp;gt;
      &amp;lt;rolePermission name="Testers" forceBuild="Allow" defaultRight="Allow"&amp;gt;
        &amp;lt;users&amp;gt;
          &amp;lt;userName name="john"/&amp;gt;
          &amp;lt;userName name="joe"/&amp;gt;
        &amp;lt;/users&amp;gt;
      &amp;lt;/rolePermission&amp;gt;
      &amp;lt;rolePermission name="Releasers" forceBuild="Allow" defaultRight="Allow"&amp;gt;
        &amp;lt;users&amp;gt;
          &amp;lt;userName name="bob"/&amp;gt;
          &amp;lt;userName name="jane"/&amp;gt;
        &amp;lt;/users&amp;gt;
      &amp;lt;/rolePermission&amp;gt;
    &amp;lt;/permissions&amp;gt;
  &amp;lt;/internalSecurity&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这里我们定义了用户，并且为用户分了组（Role）。然后我们可以将权限附加到每个项目。&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:9a394303-7066-473b-a929-6b6cc701c4e4" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;security type="defaultProjectSecurity" defaultRight="Allow"&amp;gt;
      &amp;lt;permissions&amp;gt;
        &amp;lt;!-- Grant permissions to this project --&amp;gt;
        &amp;lt;rolePermission name="Testers" ref="Testers"/&amp;gt;
        &amp;lt;rolePermission name="Releasers" ref="Releasers"/&amp;gt;
      &amp;lt;/permissions&amp;gt;
&amp;lt;/security&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;让我们看看效果：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.havebb.com/b/image.axd?picture=ScreenClip(2).png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ScreenClip(2)" border="0" alt="ScreenClip(2)" src="http://blog.havebb.com/b/image.axd?picture=ScreenClip(2)_thumb.png" width="244" height="105" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;没有登录的情况下看不到任何项目。不过，这登录按钮跑哪去了？我要怎么登录管理我的项目？这个问题困扰了我一段时间，我就是找不到这个登录链接，囧。后来才发现原来要先点Servers下面的链接——WebDashboard可以管理多个持续集成服务。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.havebb.com/b/image.axd?picture=ScreenClip(3).png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ScreenClip(3)" border="0" alt="ScreenClip(3)" src="http://blog.havebb.com/b/image.axd?picture=ScreenClip(3)_thumb.png" width="244" height="100" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;输入用户名和密码。现在可以看到项目。更多信息要参见文档了……&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/ccnet-security.aspx</link>
      <comments>http://blog.havebb.com/b/post/ccnet-security.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=6a58be25-3af9-42d8-8a23-200b77054c54</guid>
      <pubDate>Fri, 19 Aug 2011 14:56:33 +0100</pubDate>
      <category>软件使用</category>
      <category>疑难杂症</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=6a58be25-3af9-42d8-8a23-200b77054c54</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=6a58be25-3af9-42d8-8a23-200b77054c54</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/ccnet-security.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=6a58be25-3af9-42d8-8a23-200b77054c54</wfw:commentRss>
    </item>
    <item>
      <title>解决JS跨域的问题</title>
      <description>&lt;p&gt;解决JS跨域的问题&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd573303(v=vs.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/dd573303(v=vs.85).aspx&lt;/a&gt; IE8以上浏览器可用。局限性非常明显——不支持其他浏览器。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://api.jquery.com/jQuery.ajax/"&gt;http://api.jquery.com/jQuery.ajax/&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://54min.com/post/cross-domain-in-ajax-using-jsonp.html"&gt;http://54min.com/post/cross-domain-in-ajax-using-jsonp.html&lt;/a&gt; 相对较好的方案，多种浏览器支持。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://developer.yahoo.com/javascript/howto-proxy.html"&gt;http://developer.yahoo.com/javascript/howto-proxy.html&lt;/a&gt; 使用服务端Proxy，如果服务端不能访问其他服务器，这招就不灵了。&lt;/p&gt;  &lt;p&gt;上面提供了几种方法，要根据实际环境选用一个。每一个方式都有一定的局限性。&lt;/p&gt;  &lt;p&gt;在一个实际项目中，我采用了JQuery JSONP方式解决跨域问题，但是可能有些浏览器工作簿正常。&lt;/p&gt;  &lt;p&gt;参见一下网址：&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://sprain.ch/blog/2010/07/07/jsonp-jquery-and-php-make-cross-domain-ajax-calls-work/"&gt;http://sprain.ch/blog/2010/07/07/jsonp-jquery-and-php-make-cross-domain-ajax-calls-work/&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://remysharp.com/2007/10/08/what-is-jsonp/"&gt;http://remysharp.com/2007/10/08/what-is-jsonp/&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;主要代码：&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:600453d9-c7a9-42d6-b864-d41c1fd50c37" class="wlWriterEditableSmartContent"&gt;&lt;pre class="brush: javascript;"&gt;&amp;lt;script src="http://code.jquery.com/jquery-latest.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
   $(document).ready(function() {
//Go get some cat pics from Flickr
     $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&amp;amp;tagmode=any&amp;amp;format=json&amp;amp;jsoncallback=?");
});
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;代码的关键是使用getJSON，并且在URL后面加上jsoncallback=?。另外服务器端要返回一个JSON字符串，否则页面会出现JS错误。&lt;/p&gt;

&lt;p&gt;话说经过我在IE9上测试，这个方法是可行的！但是不知道其他浏览器会怎么样？稳定否？&lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 经过测试，在IE6 IE8 IE9 Chrome 8是可以的。但是Firefox 4 beta X上失败了。&lt;/p&gt;</description>
      <link>http://blog.havebb.com/b/post/js-cross-domain-with-jsonp.aspx</link>
      <comments>http://blog.havebb.com/b/post/js-cross-domain-with-jsonp.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=7a1419af-1046-44ca-b488-a2ac96cfe13c</guid>
      <pubDate>Thu, 18 Aug 2011 15:41:04 +0100</pubDate>
      <category>ASP.NET</category>
      <category>疑难杂症</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=7a1419af-1046-44ca-b488-a2ac96cfe13c</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=7a1419af-1046-44ca-b488-a2ac96cfe13c</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/js-cross-domain-with-jsonp.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=7a1419af-1046-44ca-b488-a2ac96cfe13c</wfw:commentRss>
    </item>
    <item>
      <title>单元测试随想</title>
      <description>&lt;ol&gt;   &lt;li&gt;有时执行函数A验证的却是函数B。&lt;/li&gt;    &lt;li&gt;搞清楚stub和mock的不同。stub和mock都是fake。stub是为了让被测试的函数能够更好的运行，stub按照我们的意愿返回值，我们不会验证stub的，因为它被设定总是正确的，从而我们能够验证被测试的函数。stub不会导致测试失败，而mock会，我们通常要验证mock记录下来的被测试函数的行为。如果mock记录下来的不是预期行为，那么测试失败。&lt;/li&gt;    &lt;li&gt;测试要验证行为还是状态。&lt;/li&gt;    &lt;li&gt;用依赖注入或者控制反转来避免外部依赖对测试的负面影响。&lt;/li&gt;    &lt;li&gt;必需的外部依赖可以构造函数注入，然而一但需要注入的组件越来越多，单元测试或者类的消费者可能疲于适应注入组件的增加或者减少。为了应对这种情况，我们可以使用依赖注入容器。&lt;/li&gt;    &lt;li&gt;如果某个组件不是必需的，可以使用属性注入。不过通过属性注入的组件在类里面最好有默认值，否则可能在某些时候遇到讨厌的未将对象引用到实例。&lt;/li&gt;    &lt;li&gt;工厂类也可以帮我们隔离依赖，将工厂方法设为虚方法可以让我们在测试的时候容易控制工厂方法的输出。&lt;/li&gt;    &lt;li&gt;如果类有一个方法需要调用外部依赖，我们可以将这个方法设为虚方法，测试时继承比类，同时重写虚方法以返回我们需要的值。这样我们消除了外部依赖的影响，并且不需要新建接口。&lt;/li&gt;    &lt;li&gt;上面的方法可能违背了面向对象设计原则，比如我们将本来不需要暴露的方法暴露出来，仅仅为了测试。&lt;/li&gt;    &lt;li&gt;有时我们要测试的仅仅是类A方法A1正确的调用了类B的方法B1，这个时候我们需要mock来帮忙。&lt;/li&gt;    &lt;li&gt;一个测试只测试一个功能点，只使用一个mock，其他都是stub。如果用构造函数注入，我们不得不在每个测试方法加上外部依赖注入，如果外部依赖比较多，这个注入就会变得很烦人！&lt;/li&gt;    &lt;li&gt;还有好多疑惑没有解除！可能还是要看xunit那本书。不过最主要的还是自己不断实践。别想着看看书就能掌握这个技术。&lt;/li&gt;    &lt;li&gt;要深入了解自己所使用的工具，这样才会知道测试中产生的结果是怎么回事。&lt;/li&gt;    &lt;li&gt;如果需要，测试类也可以使用继承。继承abstract类可以让我们不会忘记有哪些方法需要测试。这在测试一个接口的多个实现时很有用。&lt;/li&gt;    &lt;li&gt;unit test应该尽量简单，以防止unit test出现bug。unit test应该是bug free的可以完全信任的。一但出现bug，要定位bug会变得麻烦，因为不知道是产品代码出现问题还是unit trst出现问题。&lt;/li&gt;    &lt;li&gt;总结一句，单元测试即平时做多一点来避免软件项目的失败！平时随意享受一时的轻松快意换来的是后面加倍的辛苦甚至软件项目的失败。&lt;/li&gt;    &lt;li&gt;unit test不应该保护逻辑，不应包含动态值、IO读写、多线程等容易出错的代码。&lt;/li&gt;    &lt;li&gt;写出容易维护的unit test代码。在软件工程中，容易维护都是一个软件项目成功的关键。&lt;/li&gt; &lt;/ol&gt;</description>
      <link>http://blog.havebb.com/b/post/about-unit-test.aspx</link>
      <comments>http://blog.havebb.com/b/post/about-unit-test.aspx#comment</comments>
      <guid>http://blog.havebb.com/b/post.aspx?id=36f265d1-f42c-48a5-a4b8-e5f5a8b06c2e</guid>
      <pubDate>Sun, 14 Aug 2011 14:13:12 +0100</pubDate>
      <category>杂谈</category>
      <dc:publisher>chris</dc:publisher>
      <pingback:server>http://blog.havebb.com/b/pingback.axd</pingback:server>
      <pingback:target>http://blog.havebb.com/b/post.aspx?id=36f265d1-f42c-48a5-a4b8-e5f5a8b06c2e</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://blog.havebb.com/b/trackback.axd?id=36f265d1-f42c-48a5-a4b8-e5f5a8b06c2e</trackback:ping>
      <wfw:comment>http://blog.havebb.com/b/post/about-unit-test.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.havebb.com/b/syndication.axd?post=36f265d1-f42c-48a5-a4b8-e5f5a8b06c2e</wfw:commentRss>
    </item>
  </channel>
</rss>

