﻿<?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>博客园-Jim dot NET</title><link>http://www.cnblogs.com/jimnox/</link><description>技术总是用来服务于人的。
Technique must serve people all the time.</description><language>zh-cn</language><lastBuildDate>Tue, 18 Nov 2008 22:31:11 GMT</lastBuildDate><pubDate>Tue, 18 Nov 2008 22:31:11 GMT</pubDate><ttl>60</ttl><item><title>零散的一句话经验总结</title><link>http://www.cnblogs.com/jimnox/archive/2008/11/07/1329383.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Fri, 07 Nov 2008 15:38:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/11/07/1329383.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1329383.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/11/07/1329383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1329383.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1329383.html</trackback:ping><description><![CDATA[<p>发此文，并保持更新，有些心得的时候便以尽可能简单的话记录在内。</p>
<ol>
<li>还记得.NET架构图吗？C#排在哪？最顶上！&mdash;&mdash;语言永远是最表层的，掌握它在干什么，才能真正掌握它。</li>
<li>封装变化，Don't Repeat Yourself。Program to an interface, not to an implemention.</li>
<li>Refactory to Patterns. Not Design to Patterns. 靠重构达到模式，而不是设计&mdash;&mdash;设计总是不周到的，只有勤于重构才能写出更好的代码。</li>
</ol>
<p>希望这篇随笔能记录我技术的成长。</p><img src ="http://www.cnblogs.com/jimnox/aggbug/1329383.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43598/" target="_blank">[新闻]应用程序架构指导包2.0 Beta 2发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>log4net轻松使用日期作为动态文件名</title><link>http://www.cnblogs.com/jimnox/archive/2008/11/04/1326277.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Tue, 04 Nov 2008 05:59:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/11/04/1326277.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1326277.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/11/04/1326277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1326277.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1326277.html</trackback:ping><description><![CDATA[<p>由于用了NHibernate，所以log4net就不用白不用了。想用日期作为日志文件的名字，不会配置，g.cn之，发现园子里有前辈用编程解决了，觉得未免大动干戈。于是继续g.cn，找到了一个国外的文章，上面给出了我想要的答案。</p>
<p>一下是我写的一个配置
<div class="cnblogs_code">
<pre><img id="Code_Closed_Image_135535" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_135535').style.display='none'; document.getElementById('Code_Open_Image_135535').style.display='inline'; document.getElementById('Code_Open_Text_135535').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" alt="" width="11" height="16" align="top" /><img id="Code_Open_Image_135535" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_135535').style.display='none'; getElementById('Code_Closed_Image_135535').style.display='inline'; getElementById('Code_Closed_Text_135535').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" width="11" height="16" align="top" /><span id="Code_Closed_Text_135535" class="cnblogs_code_Collapse">Code</span><span id="Code_Open_Text_135535" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">appender </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="dataAccessLogFile"</span><span style="color: #FF0000;"> type</span><span style="color: #0000FF;">="log4net.Appender.RollingFileAppender,log4net"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">file </span><span style="color: #FF0000;">value</span><span style="color: #0000FF;">="./Log/DataAccess/"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">appendToFile </span><span style="color: #FF0000;">value</span><span style="color: #0000FF;">="true"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">rollingStyle </span><span style="color: #FF0000;">value</span><span style="color: #0000FF;">="Date"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">datePattern </span><span style="color: #FF0000;">value</span><span style="color: #0000FF;">="yyyy-MM-dd&amp;quot;.log&amp;quot;"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">maxSizeToRollBackups </span><span style="color: #FF0000;">value</span><span style="color: #0000FF;">="10"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">maximumFileSize </span><span style="color: #FF0000;">value</span><span style="color: #0000FF;">="5MB"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">staticLogFileName </span><span style="color: #FF0000;">value</span><span style="color: #0000FF;">="false"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">layout </span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="log4net.Layout.PatternLayout,log4net"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">conversionPattern </span><span style="color: #FF0000;">value</span><span style="color: #0000FF;">="%d - %-5level - %c - %m%n"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />    </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">layout</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">appender</span><span style="color: #0000FF;">&gt;</span></span></pre>
</div>
用过log4net的朋友应该都能看明白了吧？呵呵。</p>
<p>其中比较关键的是</p>
<p>&lt;file value="./Log/DataAccess/" /&gt;这里我只指定一个前缀<br />&lt;rollingStyle value="Date" /&gt;表示文件&ldquo;滚动&rdquo;的类型是日期<br />&lt;datePattern value="yyyy-MM-dd&amp;quot;.log&amp;quot;" /&gt;设置文件名后缀的格式，那个&amp;quot;起到的作用是转义，就是把.log当作字面义，而不是时间日期的格式定义。<br />&lt;staticLogFileName value="false" /&gt;关掉固定文件名</p>
<p>这样就会生成按日期.log作为文件名的日志文件了。</p><img src ="http://www.cnblogs.com/jimnox/aggbug/1326277.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43597/" target="_blank">[新闻]推波助澜 微软推出“I'm a PC”商店</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>NHibernate学习、使用心得小结帖</title><link>http://www.cnblogs.com/jimnox/archive/2008/11/03/1325270.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Mon, 03 Nov 2008 02:46:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/11/03/1325270.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1325270.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/11/03/1325270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1325270.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1325270.html</trackback:ping><description><![CDATA[<p>本文会持续更新</p>
<p>最近学习和使用NHibernate，使用的版本是NHibernate 2.0.1 GA，中间还算有不少收获，都是细节，系列教程里一般不会有的，在这里记录下。</p>
<ol>
<li>&nbsp;对于one-to-many的配置是相当繁琐的，如果你的数据库中外键逻辑上是无约束的（也就是one端不存在，many端也可存在，比如有一张自关联的表，你用ParentID=0来表示是根级，那么ID=0的记录可能是不存在的），但实际上是约束的键，那么这时候你直接插入many端会被数据库报错的。对于这个问题，我提出两种解决方案：第一，把外键设置为无约束的，这样可能会损失一些级联删除、更新的功能；第二，添加一个ID为0的记录作为全部记录的的根节点。&mdash;&mdash;我推荐采用2方案。</li>
<li>还是one-to-many的问题：在one-to-many的配置中，对于many端，.hbm.xml中的&lt;many-to- one&gt;结点一定要小心配置，首先是not-null要指定，同时应该把insert置为true&mdash;&mdash;说实话，这两个我不是很肯定，有心的朋友希望 能实验下。这不算啥，最值得注意的是one端主键的unsaved-value一定要小心！以刚才那个例子，如果你的ID=0是有意义的，那么一定要把 unsaved-value显示指定为-1之类无意义数据，并且修改one端实体类ID的初始值&mdash;&mdash;声明或者在构造方法里都行。否则NH会认为这是空对 象，在你保存many端的时候把外键设置为Null</li>
<li>还是one-to-many的问题&hellip;&hellip;汗：对one端的ICriteria做CreateCriteria可以join加载many端，但是这样做是inner join的，显然如果这个one端没many端（这个是很正常的，比如文章可能没有回复），这样这条one端记录就不会被选择了。如果我们需要选择，应该使用left outer join（不知道的复习下数据库原理吧，呵呵）。这时候使用ICriteria.CreateCriteria的另一个重载，可以跟上一个枚举参数作为连接类型，这样就爽了。
    </li>
<li>在使用many-to-many关系的时候，我们会用一个中间表做过度。通常这个中间表是只作过度用的，我们没必要去定义实体类。但是如果我 们遇到一个这样的表是有其数据的，有意义的实体类，比如你的User-Group是many-to-many关系，同时那个UserInGroup还记录 了某个用户对于那个组有什么特殊的权限，或者什么时候加入啊这类的数据，那么它就是有意义的了。这时候我们应该为UserInGroup定义联合主键。首 先是定义一个UserInGroupPk这样的联合主键类，把UserInGroup的主键定义为UserInGroupPk，然后再去hbm里配置。这 时候千万要记得必须显式override这个联合主键类的Equals, GetHashCode和ToString方法，我也不知道为什么，反正不这样NH就不让你映射成功。</li>
<li>ICriteria可以投影，其中有RowCount方法，相当于count(*)，在判断是否存在对象的时候就不用判断是否能取到了。类似地ICriteria功能甚强，还没研究很多。
    </li>
<li>这是一个疑问，不是心得。使用ICriteria可以投影，但是投影了一个类的多个属性以后（比如User有Username, Password, Gender, Address，只投影Username, Password），就只能返回objcet[]（使用UniqueResult()）或者IList&lt;object[]&gt;（使用List()）了；而如果只投影一个属性，则根据这个属性的类型可以使用类似UniqueResult&lt;int&gt;(),List&lt;decimal&gt;()这样的，返回那个投影的唯一列的类型。但是这样就失去了NH的自动绑定到Model对象的功能了，我对此甚是郁闷，不知道还有什么好方法，请有心得的朋友指点。</li>
<li>接着上一条：后来我到网上查了查，原来国外有人已经做了一个类似的东西，用反射的，虽然性能下降，不过可以说是用C#时间换数据库时间和最宝贵的IO，我觉得是值的，基本的思路是实现了个NHibernate.Transform.IResultTransformer接口，并且通过ICriteria.SetResultTransfomer注入到ICriteria中去。这样做有两个比较大的弊端&mdash;&mdash;第一、使用反射构建对象，性能有不小损失；第二、投影出来的只能是属性，不能是组函数（虽然说这么想就太贪心了），不过相信还是有其用武之地的。后来我索性写成了Extension Method，代码如下：
<div class="cnblogs_code"><img id="Code_Closed_Image_134518" onclick="this.style.display='none';
    document.getElementById('Code_Closed_Text_134518').style.display='none';
    document.getElementById('Code_Open_Image_134518').style.display='inline';
    document.getElementById('Code_Open_Text_134518').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" alt="" width="11" height="16" align="top" /><img id="Code_Open_Image_134518" style="display: none;" onclick="this.style.display='none';
    document.getElementById('Code_Open_Text_134518').style.display='none';
    getElementById('Code_Closed_Image_134518').style.display='inline';
    getElementById('Code_Closed_Text_134518').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" width="11" height="16" align="top" /><span id="Code_Closed_Text_134518" class="cnblogs_code_Collapse">Code</span><span id="Code_Open_Text_134518" style="display: none;"><br />
    <!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ICriteriaExtentions&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;ICriteria&nbsp;SetProjection(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">&nbsp;ICriteria&nbsp;ctr,&nbsp;IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;projects)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(projects&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProjectionList&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Projections.ProjectionList();<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;s&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;projects)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Add(Projections.Property(s));<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;ctr.SetProjection(list);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ctr;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
    }<br />
    <br />
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ISessionExtensions&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;ICriteria&nbsp;CreateCriteria(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">&nbsp;ISession&nbsp;session,&nbsp;Type&nbsp;type,&nbsp;IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;projects)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICriteria&nbsp;criteria&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.CreateCriteria(type);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(projects&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;criteria.SetProjection(projects)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.SetResultTransformer(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ProjectPropertyResultTransformer(type,&nbsp;projects));<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;criteria;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
    }<br />
    </span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;国外高人的代码，实现IResultTransfomer</span><span style="color: #008000;"><br />
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ProjectPropertyResultTransformer&nbsp;:&nbsp;IResultTransformer&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Type&nbsp;result;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;PropertyInfo[]&nbsp;properties;<br />
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ProjectPropertyResultTransformer(Type&nbsp;type,&nbsp;</span><span style="color: #0000ff;">params</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;names)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;type;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PropertyInfo</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;props&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PropertyInfo</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;names)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.Add(result.GetProperty(name));<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;props.ToArray();<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ProjectPropertyResultTransformer(Type&nbsp;type,&nbsp;IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;names)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">(type,&nbsp;names.ToArray())&nbsp;{&nbsp;}<br />
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;TransformTuple(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">[]&nbsp;tuple,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;aliases)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;instance&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Activator.CreateInstance(result);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;tuple.Length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties[i].SetValue(instance,&nbsp;tuple[i],&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;instance;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;IList&nbsp;TransformList(IList&nbsp;collection)&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;collection;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
    }</span></span></div>
<a href="http://ayende.com/Blog/archive/2007/08/26/Partial-Object-Queries-With-NHibernate.aspx">那篇文章的原文</a>
</li>
<li>合理地配置log4net不仅可以让我们更了解NHibernate在干什么，还可以帮助我们轻松地为项目搭建数据层。有时间我再总结一下log4net的使用新的吧。</li>
<li>随用one-to-one关系（虽然不推荐这么做），默认地，延迟加载是被关闭的，必须把主要端（比如User-Profile中的User端）的one-to-one的constrained设置为true，这样才能保证NHibernate认为你自己会保证参照完整性，而不是它通过inner join来保证，这样就实现延迟加载了。如果需要立即加载，可以用NHibernateUtil.Initialize或者用Criteria API来做。这时候你会发现加载次要端的时候NHibernate又来了个inner join，如法炮制在次要端的one-to-one里把constrained也设置为true，一切OK。</li>
<li>使用ISession.Get和Load是有差别的，大概就是Get在任何情况下都会和Database同步，而Load会优先考虑ISession的会话级proxy一级缓存。使用Criteria API查询在任何情况下都得不到一级缓存（至少我没发现怎么才能得到），而二级缓存由于NHibernate.Caches项目迟迟未发布支持2.0.1 GA的版本，所以我没能测试。</li>
<li>使用IInterceptor接口可以定义SessionFactory级别或者Session级别的事件拦截器，借此可以帮助我们面向切面（AOP）地对NHibernate的操作进行一些监管和干预。IInterceptor接口是一个比较庞大的接口，为了避免一次性实现很多方法，我们可以实现自己的类并且让它继承自EmptyInterceptor，这是一个以空方法体实现了IInterceptor的所有方法的适配器类，我们只需要重写其中一部分自己需要的方法就可以使用了。我尝试通过OnLoad来监控Session执行SQL的次数，未果，因为OnLoad是在加载每一个实体类对象的时候发生的，也就是说如果一条查询得到了100条记录，它就会发生100次OnLoad，至于怎么统计SQL的次数，我还在研究当中。</li>
<li>借用经典的Customer - Order模型，举个例子。这是一个one - to - many的关系，其中我们都打开了lazy="true"。举这个例子是为了说明NHibernate的延迟加载机制是非常棒的。首先我们加载Customer[1]这个实例，用ISession.Load，这时会发现没有执行SQL，直到访问了1号客户的非主键属性（因为主键我们已经知道啦）的时候，才会执行SQL，这是ISession级别的缓存在帮忙，使用Load方法有这个惠顾，而使用Get没有，这个区别前面已经说到了。接着我们来个ISession.CreateQuery("from Order o").List&lt;Order&gt;();这时候执行了SQL，我们取出了所有的Order，试想一下有时候会出现这样的情况，我们加载了Order的列表，并且需要列出每条Order及它的Customer的信息，当我们只需要知道Customer的主键（比如用ID，GUID）的时候我们是不用关联加载的，因为这是Order的外键。在关系模型中这很自然，但是在OO模型中就不自然了，我们要以外键实体而非外键列的形式暴露关系，所以Order中我们只能有Customer对象而不能有CustomerId属性。这时候尝试访问每一条Order.Customer.CustomerId，发现没有执行SQL，因为访问的是Costomer的主键，也就是Order中的外键，是不需关联的，所以自然不会发生SQL执行。当我们尝试访问Order.Customer.Firstname的时候发现SQL执行了，这是因为NHibernate发现了你在访问one端，所以自动执行了延迟的加载。再往下，发现加载过的Customer，包括刚才那个Customer[1]，只要加载过的对象就不会被加载第二次了，更神奇的是只要主键相同的两个one端对象都会是ReferenceEqual的！NHibernate是怎么知道我们在访问one端或者many端的属性呢？经过观察就能发现其实加载Order列表的时候，每个Order的Customer属性都不是Customer的POCO类，而是一个CustomerProxy，NHibernate构建了动态代理，这就是为什么我们需要延迟加载的时候一定要把属性设置为Virual的原因。</li>
</ol><img src ="http://www.cnblogs.com/jimnox/aggbug/1325270.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43596/" target="_blank">[新闻]火狐中国版正式发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>嘿嘿，用上正版了！</title><link>http://www.cnblogs.com/jimnox/archive/2008/10/22/1317165.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Wed, 22 Oct 2008 13:13:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/10/22/1317165.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1317165.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/10/22/1317165.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1317165.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1317165.html</trackback:ping><description><![CDATA[<p>微软对大学生很好啊，向大学生免费（学习用，不可商业用）发放Windows Server 2003 Standard, Visual Studio 2008/2005 Professional, SQL Server 2005 Developer Edition和Expression Studio。</p>
<p>通过教育网IP和邮箱可以认证，学生可以免费下载到以上产品作为学习研究用，不可用于商业，不可用于建设所属教育机构的教学管理信息系统。呵呵。</p>
<p>昨天把Server 03弄下来了，今天把Visual Studio 2008 Professional弄下来了，为了向同学兼容，装个Visual C#和VWD 2005 Express Edition就好，呵呵。这样又可以减少一点我电脑里的盗版软件啦！现在在考虑要不要用别的产品取代Photoshop呢！不过PS用熟了，常用那几个快捷键都比较熟悉，估计换了不适应吧。<br />
</p>
<p>可惜微软没给学生发放Office 2007啊，呵呵，贪心了点。 <br />
</p>
最后白话一句，这篇文章里有好多个&#8220;呵呵&#8221;哦，呵呵。<img src="http://www.cnblogs.com/Emoticons/QQ/13.gif"  alt="" /><img src ="http://www.cnblogs.com/jimnox/aggbug/1317165.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43595/" target="_blank">[新闻]微软：中国移动全球率先使用IE Mobile 6</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>难得我发回火</title><link>http://www.cnblogs.com/jimnox/archive/2008/10/17/1313592.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Fri, 17 Oct 2008 08:05:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/10/17/1313592.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1313592.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/10/17/1313592.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1313592.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1313592.html</trackback:ping><description><![CDATA[<p>Why?因为我PSP里的记忆棒莫名其妙的就没了！</p>
<p>我大概有一个月没用过PSP了，上次用完就关机、充满电、然后开关拨到Hold，装便携包里，放我枕头靠墙一边了。今天周末好不容易我打算玩一玩游 戏，把PSP拿出来，发现无法开机，想想是没电了吧——虽然我记得我是充满电关机的。我还是插上电，开机OK，输入时间——输入就输入吧，彻底断电关机的 确要输入时间。玩个游戏吧，我的DJMAX啊。结果&#8230;&#8230;没记忆棒了！我￥%&amp;*&amp;&#8230;&#8230;%￥##￥%&#8230;&#8230;&amp;*我说这什么概念，打开 记忆棒卡口一看，还真没记忆棒了，我衰了。我相信这肯定不是我的功劳，我游戏和存档都在记忆棒里，没事我拆它下来干嘛。我也绝对不相信它是掉了——除非它 能从按压式的插卡槽里&#8220;掉&#8221;出来、再从塑料卡口里&#8220;掉&#8221;出来、再从便携包里&#8220;掉&#8221;出来、再从我混乱的枕头边&#8220;掉&#8221;出来。我的确不记得最后一次关机是待机还 是彻底关机，但是就算被待机耗完电，我也可以肯定我这段时间是没动过PSP的。<br />
</p>
<p>问了寝室里的人有没有别人用过我PSP，都说没注意，没注意就没注意吧，这年头，谁注意别人啊？更别提注意别人的东西了。<br />
</p>
<p>上网查了下报价，8G高速组棒，210块，200多块钱就这么莫名其妙的没了。<br />
</p>
<p>我就纳闷了，那位偷了（先就暂定为偷了吧）我记忆棒的哥们，我PSP，价值1400吧，你不偷，我笔记本电脑还撂床上呢，那还好几千呢，虽然机器是 两年前的吧，不过光我那两条2G内存随便拉一条也比个记忆棒值钱吧？你还就这么看得起一根记忆棒？我还真纳闷了，真是逼我每天紧缩柜子是吧。我还真是不想 用锁这种自欺欺人的东西，从来都防君子不防小人，可这回我还真就遇到小人了？<br />
</p>
<p>我印象中我从高三起就从来没发过火，生气——有，但是从没到发火的程度。200多块钱我不是丢不起，我丢掉的不止是点财产，更多的是我对同学的信任——好人固然是多数，脑残的也是存在的。<br />
</p>
<p>失望啊&#8230;&#8230;<br />
</p>
<p>想不通啊想不通&#8230;&#8230; <br />
</p><img src ="http://www.cnblogs.com/jimnox/aggbug/1313592.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43594/" target="_blank">[新闻]消息汇总:迅雷人事变动 员工与公关部说法大相径庭</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>从一个url所想到的：url的用户友好性</title><link>http://www.cnblogs.com/jimnox/archive/2008/10/14/1310900.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Tue, 14 Oct 2008 08:17:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/10/14/1310900.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1310900.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/10/14/1310900.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1310900.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1310900.html</trackback:ping><description><![CDATA[<p>今天无意中听到A与B打电话的过程中有下面几句对话：</p>
<p>&#8220;www.xxxxx.com.cn/somefunction.aspx&#8221;</p>
<p>"点什么？"<br />
</p>
<p>"点a~s~p~x~"</p>
<p>"$%^&amp;*("<br />
</p>
<p>"@#$%^&amp;*"</p>
<p>整段对话有4~5个来回，一个.aspx后缀占了其中的3~4个。<br />
</p>
<p>由此我开始浮想联翩——为什么一个&#8220;.aspx&#8221;后缀就这么麻烦呢？</p>
<p>我得出的结论是：因为它是无意义的！<br />
</p>
<p>somefunction.aspx这个url指向的页面是完成somefunction这个功能的，在这里，&#8220;somefunction&#8221;是一个有意义的url。但是".aspx"却不是！它是什么呢？在非Web技术人员（甚至非ASP.NET开发人员）的眼里，它就是几个拗口的字母。</p>
<p>在我们强调功能的时候，突然回头发现：一个对用户友好的url是多么重要。<br />
</p>
<p>于是url rewrite出现了。</p>
<p>url rewrite，不仅仅是为了Search Engine Friendly，不仅仅是为了让一个url变得&#8220;好看&#8221; ，还有一个重要的作用就是让一个url&#8220;对用户友好&#8221;。<br />
</p>
<p>ASP.NET MVC中的url routing，粗略的看可以当成一个url rewrite来看。但它起到了一个很好的改善url用户友好性的作用——www.xxxxx.com/Product/ListAll——这是一个多么简单明了的url？<br />
</p>
<p>虽然url更多时候是不用用户手动输入，而是浏览器在关注、&lt;a&gt;标签在关注的，但是用户手动输入url是难免的，所以从这个细微的地方，我们就可以稍稍改善一下url对用户的友好性。<br />
</p><img src ="http://www.cnblogs.com/jimnox/aggbug/1310900.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43592/" target="_blank">[新闻]Google iPhone语音识别程序已经上线</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>上学期成绩排名出来了</title><link>http://www.cnblogs.com/jimnox/archive/2008/10/08/1306603.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Wed, 08 Oct 2008 12:37:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/10/08/1306603.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1306603.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/10/08/1306603.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1306603.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1306603.html</trackback:ping><description><![CDATA[<p>考试成绩专业第三。</p>
<p>算上德育分总成绩，还是第三。<br />
</p>
<p>根据初评，终于在第二个学年拿到了国家奖学金。</p>
<p>很高兴啊——更多是欣慰吧。<br />
</p><img src ="http://www.cnblogs.com/jimnox/aggbug/1306603.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43591/" target="_blank">[新闻]为何Apple更精于UI设计 ？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Mono 2.0发布了，看起来感觉很好</title><link>http://www.cnblogs.com/jimnox/archive/2008/10/07/1305338.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Tue, 07 Oct 2008 02:54:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/10/07/1305338.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1305338.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/10/07/1305338.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1305338.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1305338.html</trackback:ping><description><![CDATA[<p>昨天才看到mono 2.0发布了，看看官方网站，特性很不错</p>
<h2> Microsoft Compatible APIs </h2>
<ul>
    <li> ADO.NET 2.0 API for accessing databases. </li>
</ul>
<ul>
    <li> ASP.NET 2.0 API for developing Web-based applications. </li>
</ul>
<ul>
    <li> Windows.Forms 2.0 API to create desktop applications. </li>
</ul>
<ul>
    <li> System.XML 2.0: An API to manipulate XML documents. </li>
</ul>
<ul>
    <li> System.Core: Provides support for the Language Integrated Query (LINQ). </li>
</ul>
<ul>
    <li> System.Xml.Linq: Provides a LINQ provider for XML. </li>
</ul>
<ul>
    <li> System.Drawing 2.0 API: A portable graphics rendering API.<br />
    </li>
</ul>
<h2> Mono APIs </h2>
<ul>
    <li> Gtk# 2.12: A binding to the Gtk+ 2.12 and GNOME libraries for creating desktop applications on Linux, Windows and MacOS X. </li>
    <li> Mono.Cecil: A library to manipulate ECMA CLI files (the native format used for executables and libraries). </li>
    <li> Mono.Cairo: A binding to the Cairo Graphics library to produce 2D graphics and render them into a variety of forms (images, windows, postscript and PDF). </li>
    <li> Mono's SQLite support: a library to create and consume databases created with SQLite. </li>
    <li> Mono.Posix: a library to access Linux and Unix specific functionality from your managed application. With both a low-level interface as well as higher level interfaces.<br />
    </li>
</ul>
<h3> Third Party APIs bundled with Mono </h3>
<ul>
    <li> Extensive support for databases: PostgreSQL, DB2, Oracle, Sybase, SQL server, SQLite and Firebird. </li>
    <li> C5 Generics Library: we are bundling the C5 generics collection class library as part of Mono.<br />
    </li>
</ul>
<h2> Compilers </h2>
<p>These compilers are part of the Mono 2.0 release: </p>
<ul>
    <li> C# 3.0 compiler implementation, with full support for LINQ. </li>
    <li> Visual Basic 8 compiler. </li>
    <li> IL assembler and disassembler and the development toolchain required to create libraries and applications.<br />
    </li>
</ul>
<h2> Tools </h2>
<p>Mono includes profiling tools, the standard development kit tools that are part of the .NET framework </p>
<ul>
    <li> <a href="http://www.mono-project.com/Debugger" title="Debugger">Debugger</a>: this is the first release when we support a debugger for managed code. </li>
    <li> <a href="http://www.mono-project.com/Gendarme" title="Gendarme">Gendarme</a>: is an extensible rule-based tool to find problems in .NET applications and libraries. Gendarme inspects programs and libraries that contain code in ECMA CIL format (Mono and .NET) and looks for common problems with the code, problems that compiler do not typically check or have not historically checked. </li>
    <li> <a href="http://www.mono-project.com/Linker" title="Linker">Mono Linker</a>: a linker that allows developers to reduce the size of their executables and libraries by removing features from libraries using an XML definition of the desired public API. </li>
    <li> Mono Tuner: a tool to apply arbitrary user-defined transformations to assemblies. Mono uses this library to produce the Silverlight core libraries from the main system libraries. </li>
    <li> Mono Documentation Tools: the Mono Documentation framework has been upgraded to support documenting generics and extension methods. The tools can be used to produce online and offline documentation for any any APIs, and are used by the project to document our own APIs. </li>
</ul>
<p>&nbsp;</p>
<p>看起来现在的MONO已经是完全胜任.NET 2.0的工作，并且有众多3.0的特性了，连Linq都有了，SQLite的Provider也有了，的确很不错，感觉现在的MONO已经走出实验室，可以进行小规模的Linux平台上应用开发了。</p>
<p>不过有些方面还是比较担心，最主要的一个是IDE支持了。随着现在.NET新特性的增多，没有IDE很多东西都会显得开发困难，没有好的IDE支持，尤其是好的Intellisense，单靠文本编辑器要用C#写应用还真有点头疼。希望MonoDevelop的新版早日发布吧。什么时候SharpDevelop要是也有个基于MONO和Gtk#的跨平台版本，那真是为C#吹响跨平台的号角了，哈哈。<br />
</p>
<p>由于自己的Linux分区太小，装了乱七八糟一大堆东西后基本上没空间了，所以打算重装个Linux，或者OpenSolaris，到时候再好好体验一把Mono！ <br />
</p><img src ="http://www.cnblogs.com/jimnox/aggbug/1305338.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43590/" target="_blank">[新闻]全球最快计算机排名 上海“魔方”进前十</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Lex——修改中又出现新的问题</title><link>http://www.cnblogs.com/jimnox/archive/2008/10/01/1302696.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Tue, 30 Sep 2008 16:48:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/10/01/1302696.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1302696.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/10/01/1302696.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1302696.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1302696.html</trackback:ping><description><![CDATA[<p>昨天费了很大的劲，重写了Lex很多代码，主要是NFA生成的部分，把原来很多在字符串级别的预处理都变成了在结点级别的，省了很多结点，大概从2900个省到了几百个吧（这么大的差距，汗一个），随之而来的还有相当明显的性能提升——2900个结点需要12s，现在几百个结点用500ms左右，对于C#来说这性能我基本上满意了，因为我同学用的C++，相同数量级下他大概100ms，而且他的NFA转DFA估计比我快不少，我又没办法优化，so，对于这个性能我基本上还是满意的，毕竟生成DFA基本上是一劳永逸的，DFA出来就可以一直用了。</p>
<p>同时有了新的功能，那就是[]表达式可以支持形如[^ABC]这样的式子了，结果证明通过这个功能我可以匹配"apple\""为String，而不是先前的None了。</p>
<p>但是郁闷的事情就出现了，就是现在的程序在基于字符驱动的不间断匹配过程当中总是找不到掐断状态，这让我非常晕，因为我不知道是预处理错、还是生成NFA错，还是epsilon闭包错，还是基于epsilon闭包的子集构造错，由于相当复杂，我没法进行大数据调试，只能调40个结点左右的小数据。但是郁闷的是小数据下我没发现问题——一切正常！</p>
<p>今天下午发现闭包有些隐晦的问题，修改之，觉得不会错了，好像有点效果，但是问题还是依旧。<br />
</p>
<p>现在被这个问题弄得头都晕了，那么多结点那么多边，要查不该有却多出来的边从哪生成的，实在太难了，我得好好想想我会错哪，并且找个调试的办法。 <br />
</p>
<p>我坚信我这么做是正确的，因为我相信终究能找到这个终结条件的问题所在，为了那难得的性能提升（其实生成NFA还有性能提升余地，也许可以省10%左右的结点）和必须的表达式功能，就算拼了老命我也得把这问题查出来！@#￥%（）<img src="http://www.cnblogs.com/Emoticons/yoyocici/224023962.gif"  alt="" /></p><img src ="http://www.cnblogs.com/jimnox/aggbug/1302696.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43589/" target="_blank">[新闻]百度股价大跌25%</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Lex写得人都快死了</title><link>http://www.cnblogs.com/jimnox/archive/2008/09/29/1301785.html</link><dc:creator>JimLiu</dc:creator><author>JimLiu</author><pubDate>Sun, 28 Sep 2008 17:06:00 GMT</pubDate><guid>http://www.cnblogs.com/jimnox/archive/2008/09/29/1301785.html</guid><wfw:comment>http://www.cnblogs.com/jimnox/comments/1301785.html</wfw:comment><comments>http://www.cnblogs.com/jimnox/archive/2008/09/29/1301785.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/jimnox/comments/commentRss/1301785.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jimnox/services/trackbacks/1301785.html</trackback:ping><description><![CDATA[<p>编译原理课程的&#8220;小&#8221;作业，十一期间主要任务——Lex</p>
<p>我选择C#写，主要是为了做到后期语法分析和语义分析的时候能应用上面向对象的优势，C++那个面向对象系统我太不熟悉了。</p>
<p>经过2天艰苦卓绝的编码，一天艰苦卓绝的Debug，在无数次把apple123认为是Numeric、把_sl2Jd_3JK认为是保留字后，今天在我手动追踪调试高达65个有向图结点的构造过程中，终于发现了一个相当隐晦的BUG，二话不说改之。整个程序豁然开朗，一下子就可以识别很多符号了。</p>
<p>目前支持的正则运算符有<br />
</p>
<ol>
    <li>或、连接，括号优先级 <br />
    </li>
    <li>*闭包，+闭包，?表达式</li>
    <li>[]内用A-Z表范围的写法</li>
    <li> .通配符（除回车、换行以为所有非控制字符）<br />
    </li>
</ol>
<p>其他好像还有一两个小的，我忘了，汗一个 <br />
</p>
<p>再看看我的&#8220;处女LEX输出&#8221;</p>
<div style="font-family: courier new;" class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a,&nbsp;b;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;s</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="font-family: courier new;"><span style="color: #800000;">sdfj2098;</span></span><span style="color: #800000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d%d</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d\n</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;a</span><span style="color: #000000;">+</span><span style="color: #000000;">b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;<br />
}</span></div>
<p>上面是源程序<br />
</p>
<p>下面是Lex生成的词法分析器的输出 <br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-family: courier new;"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReservedWord<br />
main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Identifier<br />
(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReservedWord<br />
a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifier<br />
,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;None<br />
b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifier<br />
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReservedWord<br />
</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifier<br />
</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
</span><span style="color: #800000;">"</span><span style="color: #800000;">sdfj2098;</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp; String<br />
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
scanf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Identifier<br />
(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
</span><span style="color: #800000;">"</span><span style="color: #800000;">%d%d</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String<br />
,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;None<br />
</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifier<br />
,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;None<br />
</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifier<br />
)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
printf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Identifier<br />
(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
</span><span style="color: #800000;">"</span><span style="color: #800000;">%d\n</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String<br />
,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;None<br />
a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifier<br />
</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifier<br />
)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReservedWord<br />
</span><span style="color: #800080;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Numeric<br />
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol<br />
}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Symbol</span></span><span style="color: #000000;"><br />
</span></div>
<p>基本上还算正确</p>
<p>还有个大点的，但是不恶心的代码，有两三百行的，基本正确。</p>
<p>这玩意——不怕代码大，就怕代码恶心-&gt;_&lt;-<br />
</p>
<p>目前最大的缺陷是字符串和注释的屏蔽，还有很多问题要解决。字符串一猥琐点就出问题了，比如"apple\""我就解析不正常了，因为我无法得知那个\"被转义了，我就天真地以为那个"是真的引号&#8230;&#8230;而且一开始没考虑到字符串和注释，以为空格和换行全部都可以用来做定界用，其实在注释和字符串中的空格是完全没有定界作用的，Block Comment里的换行也是无意义的，所以我那个匹配策略就有问题了，因为我把空格和换行全当定界符用了<br />
</p>
<p>有个很大的缺点，就是算的慢，一方面和我算法有莫大联系，同时因为用C#，方便是方便了，但是运算量一大起来速度就比C++慢了不止一点两点，从NFA生成DFA的过程中2900个结点用了12秒，还不包括DFA优化的过程——那可是我想了巨久都只能想到O(n^3)的啊。<br />
</p>
<p>程序写得奇烂无比，解析正则表达式用了很多巨猥琐的手段，自己都快看不下去了。<br />
</p>
<p>到时候要是真要出后端，我就弄个把小型C语言编译成IL代码的，给弄个printf用Console.Write()来耍耍，给它安个class Main一套着，管它面向对象还是面向过程呢，反正纯恶搞， 哈哈 ！<br />
</p>
<p>明天继续，坚决把那个恶心的匹配策略改了，争取搞定字符串&#8230;&#8230;被编程迷失心智了&#8230;&#8230; <br />
</p><img src ="http://www.cnblogs.com/jimnox/aggbug/1301785.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43588/" target="_blank">[新闻]杨致远将辞去雅虎CEO职务</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>