<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[开源吧！]]></title>
<link>http://www.kaiyuan8.org</link>
<description><![CDATA[关注开源代码的实际应用]]></description>
<pubDate>2010-03-11 20:06:53Z</pubDate>
<item>
<title><![CDATA[ibatis中$与#的区别]]></title>
<link>http://www.kaiyuan8.org/Article/YusDUQomVjWHYEuQEDsQ.aspx</link>
<category><![CDATA[其它]]></category>
<author>KY8</author>
<pubDate>2009-10-07 15:35:03Z</pubDate>
<description><![CDATA[<p>在ibatis中，#Property#将会根据实际情况进行类型的转换，<br />
$Property$直接替换为属性的值，不进行类型的处理。<br />
例如：person.name=&quot;llz&quot;<br />
$name$=llz<br />
#name#=&#39;llz&#39;</p>]]></description>
</item>
<item>
<title><![CDATA[SharpZipLib使用示例]]></title>
<link>http://www.kaiyuan8.org/Article/eAoGqspRmqluRhxwMrml.aspx</link>
<category><![CDATA[.Net]]></category>
<author>KY8</author>
<pubDate>2009-03-27 23:53:31Z</pubDate>
<description><![CDATA[<p><strong>SharpZipLib </strong>是一个免费的Zip操作类库，可以利用它对 ZIP 等多种格式进行压缩与解压。SharpZipLib使用C#编写的，在VB.NET、C#或其他的.NET语言中都可以使用它创建Zip文件、并进行读取 和更新等操作。下载网址：http://www.icsharpcode.net/OpenSource/SharpZipLib /Download.aspx。目前的版本为0.85。<br />
<strong><br />
1、创建zip文件，并添加文件：</strong></p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">using</span><span>&nbsp;(ZipFile&nbsp;zip&nbsp;=&nbsp;ZipFile.Create(@</span><span class="string">&quot;E:\test.zip&quot;</span><span>))&nbsp;</span></span></li><li><span>{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;zip.BeginUpdate();&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;zip.Add(@<span class="string">&quot;E:\文件1.txt&quot;</span><span>);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;zip.Add(@<span class="string">&quot;E:\文件2.txt&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;zip.CommitUpdate();&nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p><strong>2、将文件夹压缩为文件:</strong><br />
(new FastZip()).CreateZip(@&quot;E:\test.zip&quot;, @&quot;E:\test\&quot;, true, &quot;&quot;);<br />
最后一个参数是使用正则表达式表示的过滤文件规则。CreateZip方法有3个重载版本，其中有目录过滤参数、文件过滤参数及用于指定是否进行子目录递归的一个bool类型的参数。<br />
<strong>3、将文件添加到已有zip文件中：</strong><br />
using (ZipFile zip = new ZipFile(@&quot;E:\test.zip&quot;))<br />
{<br />
&nbsp;&nbsp;&nbsp; zip.BeginUpdate();<br />
&nbsp;&nbsp;&nbsp; zip.Add(@&quot;E:\test.doc&quot;);<br />
&nbsp;&nbsp;&nbsp; zip.CommitUpdate();<br />
}<br />
<strong>4、列出zip文件中文件</strong><br />
using (ZipFile zip = new ZipFile(@&quot;E:\test.zip&quot;))<br />
{<br />
&nbsp;&nbsp;&nbsp; string list = string.Empty;<br />
&nbsp;&nbsp;&nbsp; foreach (ZipEntry entry in zip)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list += entry.Name + &quot;\r\n&quot;;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; MessageBox.Show(list);<br />
}<br />
<strong>5、删除zip文件中的一个文件</strong><br />
using (ZipFile zip = new ZipFile(@&quot;E:\test.zip&quot;))<br />
{<br />
&nbsp;&nbsp;&nbsp; zip.BeginUpdate();<br />
&nbsp;&nbsp;&nbsp; zip.Delete(@&quot;test.doc&quot;);<br />
&nbsp;&nbsp;&nbsp; zip.Delete(@&quot;test22.txt&quot;);<br />
&nbsp;&nbsp;&nbsp; zip.CommitUpdate();<br />
}<br />
<strong>6、解压zip文件中文件到指定目录下</strong><br />
(new FastZip()).ExtractZip(@&quot;E:\test.zip&quot;, @&quot;E:\test\&quot;, &quot;&quot;);<br />
<strong>7、常用类：</strong><br />
ZipInputStream、GZipInputStream用于解压缩Deflate、GZip格式流，ZipOutputStream、GZipOutputStream用于压缩Deflate、GZip格式流。<br />
StreamUtil类包含了几个Stream处理辅助方法：<br />
&nbsp;&nbsp;&nbsp; ①、Copy(Stream, Stream, Byte[])用于从一个Stream对象中复制数据到另一Stream对象。有多个重写<br />
&nbsp;&nbsp;&nbsp; ②、ReadFully(Stream, Byte [])用于从Stream对象中读取所有的byte数据。有多个重写</p>]]></description>
</item>
<item>
<title><![CDATA[独立小巧的JavaScript库(7):calendar.js]]></title>
<link>http://www.kaiyuan8.org/Article/KWsldcCvKdghMXzvXSjV.aspx</link>
<category><![CDATA[JavaScript]]></category>
<author>KY8</author>
<pubDate>2009-03-07 12:01:58Z</pubDate>
<description><![CDATA[<p><b>主要特点有：</b></p>
<ol>
    <li>小巧：整个组件代码只有一个文件lhgcalendar.js，大小为5.4K。</li>
    <li>调用简单：你只需要在相应位置添加一个事件来调用主函数即可（参考下面有示列）。</li>
    <li>效率高：你试下就知道了:-)。</li>
    <li>外观还看得过去：呵呵，这个算不上特点，本人界面设计能力差，不过提供的这2种样式还算过得去。</li>
    <li>支持的浏览器：<span>IE6+，Firefox2.0+，Chrome(谷歌浏览器)，Opera9.5+，Safari3.0+等。</span></li>
</ol>
<p><strong>组件结构</strong></p>
<ol>
    <li><span>lhgcalendar.js</span>：组件核心文件，其实也就这一个文件:-)。</li>
    <li><span>skin</span>：包含组件图片文件和样式表文件的文件夹。</li>
    <li><span>skin/default.css</span>：组件默认式表文件。</li>
    <li><span>skin/gray.css</span>：灰以样式的样式表文件。</li>
</ol>
<p>调用方法及参数说明</p>
<ol>
    <li>在需要调用的页面引入lhgcalendar.js，例如：&lt;script type=&quot;text/javascript&quot; src=&quot;lhgcalenar.js&quot;&gt;&lt;/script&gt;</li>
    <li>然后在要调用的位置上引发的事件中加入调用代码，例如：&lt;input type=&quot;text&quot; onclick=&quot;lhgcalendar();&quot; /&gt;</li>
    <li>参数说明：只有一个参数，就 是接收日期的控件的ID，用法见下面的示例<br />
    还有就是在lhgcalendar.js里有个组件的配置对象：var config = { dir : &#39;&#39;, skin : &#39;default&#39; } 中的dir指的是日历显示在控件的下面还右面， 默认是下面，写成&#39;right&#39;就是在右面；skin指的就是皮肤名称。</li>
    <li><span>注：日期的格式为 M-Y-D</span></li>
</ol>
<p><img src="/Attach/200903/633720245300862230_calendar.PNG" alt="" /></p>
<p><a href="/Attach/200903/633720245514612230_calendar-lhg.rar">点击下载此文件</a></p>]]></description>
</item>
<item>
<title><![CDATA[小巧独立的Javascript库(6):jsTree.js]]></title>
<link>http://www.kaiyuan8.org/Article/MQWADNWiUEjrRuUZdUIp.aspx</link>
<category><![CDATA[JavaScript]]></category>
<author>KY8</author>
<pubDate>2009-03-01 17:58:32Z</pubDate>
<description><![CDATA[<p><img src="/Attach/200903/633715271899375000_logo.png" alt="" />is an open soure treeview control written in JavaScript.<br />
<br />
I wrote the script for my <a style="font-weight: bold;" target="phpxplorer" href="http://www.phpxplorer.org/"><span style="color: rgb(0, 51, 153);">php</span><span style="color: rgb(170, 170, 170);">X</span><span style="color: rgb(0, 51, 153);">plorer</span></a> system. The script is not intended to be a website menu.<br />
Due to use of the DOM the script only works in modern browsers like MSIE &gt; 5.0, Netscape/Mozilla/Firefox and Opera.<br />
Without support for dead Browsers the size of the script is only 12kb and there are no browser switches inside the code.<br />
A funny feature is that the treeview is able to define its data definition by itself.<br />
Try to click on the node images of this little example tree with the left mouse button.</p>
<p><a href="/Attach/200903/633715271828125000_jsTree.rar">点击下载</a></p>
<p>http://www.webxplorer.org/jsTree/</p>]]></description>
</item>
<item>
<title><![CDATA[小巧独立的Javascript库(5):Ajax.js]]></title>
<link>http://www.kaiyuan8.org/Article/AZFWzoiyIklyLgvDwbQG.aspx</link>
<category><![CDATA[JavaScript]]></category>
<author>KY8</author>
<pubDate>2009-03-01 16:56:51Z</pubDate>
<description><![CDATA[<p>1、<a href="http://code.google.com/p/microajax/">MicroAjax.js</a></p>
<p>MicroAjax is one of the smallest and easiest AJAX libraries. Usage:</p>
<pre><ol class="dp-c"><li class="alt"><span><span>microAjax(</span><span class="string">&quot;/resource/url&quot;</span><span>,&nbsp;</span><span class="keyword">function</span><span>&nbsp;(res)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;alert&nbsp;(res);&nbsp;</span></li><li class="alt"><span>}); <br /></span></li></ol></pre>
<p>Download:<a rel="nofollow" href="http://microajax.googlecode.com/svn/trunk/microajax.js">trunk version (svn)</a>&nbsp; <a rel="nofollow" href="http://microajax.googlecode.com/files/microajax.minified.js">minified version (841 byte)</a></p>
<p>Help:<a href="http://code.google.com/p/microajax/wiki/FAQ">FAQ</a></p>
<hr />
<p>2、<a href="http://www.openjs.com/scripts/jx/">jx - JavaScript Ajax Library</a></p>
<p>jx is a small toolkit for providing AJAX support in JavaScript. It has two different version - <a href="http://www.openjs.com/scripts/jx/#jx">jx</a> and <a href="http://www.openjs.com/scripts/jx/#jxs">jxs</a>.</p>
<p>Features</p>
<ul>
    <li>Supports GET method</li>
    <li>Supports <acronym title="JavaScript Object Notation">JSON</acronym>.</li>
    <li>Small Size (&gt;1 KB compressed / 2.3 KB with all the comments)</li>
    <li>Very easy to use.</li>
</ul>
<p>&nbsp;</p>]]></description>
</item>
<item>
<title><![CDATA[小巧独立的Javascript库(4):subModal.js]]></title>
<link>http://www.kaiyuan8.org/Article/IgFNDaPZzbdBabTFxWUq.aspx</link>
<category><![CDATA[JavaScript]]></category>
<author>KY8</author>
<pubDate>2009-03-01 16:23:46Z</pubDate>
<description><![CDATA[<p><img src="/Attach/200903/633715221220625000_submodal-small[1].gif" alt="" /></p>
<p><a href="http://code.google.com/p/submodal/">subModal</a>是用DIV弹出层实现HTML页内对话框的Javascript Library</p>
<p>相关资源：</p>
<p>http://code.google.com/p/submodal/<br />
<a href="http://wangsong76.javaeye.com/blog/233809">subModal回调函数和添加title示例</a><br />
<a href="http://www.cnblogs.com/wdfrog/archive/2008/08/23/1274552.html">2个不错的js插件 iBox, subModal</a><br />
<a href="http://hi.baidu.com/phpasp/blog/item/0a9f337adfcac8ea2f73b369.html">HTML javascript实现模态窗口开源实现总结（lightbox，subModal，greybox，thickbox）</a></p>
<p><a href="/Attach/200903/633715223963125000_subModal-1.6.zip">点击下载</a></p>]]></description>
</item>
<item>
<title><![CDATA[小巧独立的Javascript库(3):Sizzle JavaScript Selector Library]]></title>
<link>http://www.kaiyuan8.org/Article/LKceFguEkXeJQFoUbFfl.aspx</link>
<category><![CDATA[JavaScript]]></category>
<author>KY8</author>
<pubDate>2009-03-01 16:21:20Z</pubDate>
<description><![CDATA[<p><a href="http://sizzlejs.com/">Sizzle</a>是 一个纯js写的CSS选择器引擎,js大师Resig的作品.据说,相比其它主流javascript库,在Firefox 3下快4倍, Opera 9下快3倍, Safari 3下快1.5倍.而且Resig正在说服其它主流的javascrip库的基础CSS选择器引擎也采用Sizzle,目前准备引入<a href="http://sizzlejs.com/">Sizzle</a>框架有: jQuery(1.3以上版本已经使用), MochiKit, Prototype, and Dojo.他们的目标也很简单,就是把大家的力量集中在一个统一的CSS选择器引擎上,不用各自为政.</p>
<p>A pure-JavaScript CSS selector engine designed to be easily dropped in to a host library.</p>
<p><b>Features:</b></p>
<ul>
    <li>Completely standalone (no library dependencies)</li>
    <li>Competitive performance for most frequently used selectors</li>
    <li>Only 4KB minified and gzipped</li>
    <li>Highly extensible with easy-to-use API</li>
    <li>Designed for optimal performance with event delegation</li>
    <li>Clear IP assignent (all code held by the Dojo Foundation, contributors sign CLAs)</li>
</ul>
<p><b>Code Features:</b></p>
<ul>
    <li>Provides meaningful error messages for syntax problems</li>
    <li>Uses a single code path (no XPath)</li>
    <li>Uses no browser-sniffing</li>
    <li>Caja-compatible code</li>
</ul>
<p><b>Source Code:</b></p>
<p><a href="http://github.com/jeresig/sizzle/tree/master">http://github.com/jeresig/sizzle/tree/master</a></p>
<p><b>Discussion:</b></p>
<p><a href="http://groups.google.com/group/sizzlejs">http://groups.google.com/group/sizzlejs</a></p>
<p><b>Documentation</b></p>
<p><a href="http://wiki.github.com/jeresig/sizzle">http://wiki.github.com/jeresig/sizzle</a></p>
<p><a href="/Attach/200903/633715213601562500_jeresig-sizzle-c3d5c1b37c481835bff383c8ed94c1f14b172b1d.zip">点击下载</a></p>]]></description>
</item>
<item>
<title><![CDATA[小巧独立的Javascript库(2):DomReady.js]]></title>
<link>http://www.kaiyuan8.org/Article/fcfpIPvQPWzaVNQOcGky.aspx</link>
<category><![CDATA[JavaScript]]></category>
<author>KY8</author>
<pubDate>2009-03-01 16:14:02Z</pubDate>
<description><![CDATA[<p>window.onload事件可以安全的执行javascript，因为该事件是在页面完全加载完后才开始执行（包括页面内的图片、flash等 所有元素），不会因为JS需要对某个DOM 操作，而页面还没有加载该节点而引起错误。但是这种安全是需要付出代价的：如果某些图片（或者一些别的东西）加载特别慢，那么load事件会等到很久之后 才会触发。针对这个问题，一些JS框架提供了一些补充方法。如：jquery的$(document).ready()、mootools的 domready事件。都是在页面的DOM加载完毕后立即执行，而不需要等待漫长的图片下载过程。如果不使用这些框架，可以使用这个独立的<a href="http://code.google.com/p/domready/">DomReady.js</a></p>
<p>使用方法：</p>
<pre><ol class="dp-xml"><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">lang</span><span>=</span><span class="attribute-value">&quot;en&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li><span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;domready.js&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;application/javascript&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;application/javascript&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DomReady.ready(function()&nbsp;{&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#39;dom&nbsp;is&nbsp;ready&#39;);&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;</span></li><li><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li></ol></pre>]]></description>
</item>
<item>
<title><![CDATA[小巧独立的Javascript库(1):Events.js]]></title>
<link>http://www.kaiyuan8.org/Article/yhHHgrjBYMdmKsniqbpo.aspx</link>
<category><![CDATA[JavaScript]]></category>
<author>KY8</author>
<pubDate>2009-03-01 16:07:11Z</pubDate>
<description><![CDATA[<p>Dean Edwards实现的Javascript Events管理：http://dean.edwards.name/weblog/2005/10/add-event/。特性：</p>
<ul>
    <li>it performs no object detection</li>
    <li>it does not use the <code>addeventListener</code>/<code>attachEvent</code> methods</li>
    <li>it keeps the correct scope (the <code>this</code> keyword)</li>
    <li>it passes the event object correctly</li>
    <li>it is <em>entirely</em> cross-browser (it will probably work on IE4 and NS4)</li>
    <li>and from what I can tell it does not leak memory</li>
</ul>
<pre><ol class="dp-c"><li class="alt"><span><span class="comment">//&nbsp;written&nbsp;by&nbsp;Dean&nbsp;Edwards,&nbsp;2005</span><span>&nbsp;</span></span></li><li><span><span class="comment">//&nbsp;http://dean.edwards.name/</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;</span></li><li><span><span class="keyword">function</span><span>&nbsp;addEvent(element,&nbsp;type,&nbsp;handler)&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;assign&nbsp;each&nbsp;event&nbsp;handler&nbsp;a&nbsp;unique&nbsp;ID</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!handler.$$guid)&nbsp;handler.$$guid&nbsp;=&nbsp;addEvent.guid++;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;create&nbsp;a&nbsp;hash&nbsp;table&nbsp;of&nbsp;event&nbsp;types&nbsp;for&nbsp;the&nbsp;element</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!element.events)&nbsp;element.events&nbsp;=&nbsp;{};&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;create&nbsp;a&nbsp;hash&nbsp;table&nbsp;of&nbsp;event&nbsp;handlers&nbsp;for&nbsp;each&nbsp;element/event&nbsp;pair</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;handlers&nbsp;=&nbsp;element.events[type];&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!handlers)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;handlers&nbsp;=&nbsp;element.events[type]&nbsp;=&nbsp;{};&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;store&nbsp;the&nbsp;existing&nbsp;event&nbsp;handler&nbsp;(if&nbsp;there&nbsp;is&nbsp;one)</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(element[</span><span class="string">&quot;on&quot;</span><span>&nbsp;+&nbsp;type])&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handlers[0]&nbsp;=&nbsp;element[<span class="string">&quot;on&quot;</span><span>&nbsp;+&nbsp;type];&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;<span class="comment">//&nbsp;store&nbsp;the&nbsp;event&nbsp;handler&nbsp;in&nbsp;the&nbsp;hash&nbsp;table</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;handlers[handler.$$guid]&nbsp;=&nbsp;handler;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span class="comment">//&nbsp;assign&nbsp;a&nbsp;global&nbsp;event&nbsp;handler&nbsp;to&nbsp;do&nbsp;all&nbsp;the&nbsp;work</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;element[<span class="string">&quot;on&quot;</span><span>&nbsp;+&nbsp;type]&nbsp;=&nbsp;handleEvent;&nbsp;</span></span></li><li><span>};&nbsp;</span></li><li class="alt"><span><span class="comment">//&nbsp;a&nbsp;counter&nbsp;used&nbsp;to&nbsp;create&nbsp;unique&nbsp;IDs</span><span>&nbsp;</span></span></li><li><span>addEvent.guid&nbsp;=&nbsp;1;&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span><span class="keyword">function</span><span>&nbsp;removeEvent(element,&nbsp;type,&nbsp;handler)&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;delete&nbsp;the&nbsp;event&nbsp;handler&nbsp;from&nbsp;the&nbsp;hash&nbsp;table</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(element.events&nbsp;&amp;&amp;&nbsp;element.events[type])&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;element.events[type][handler.$$guid];&nbsp;</span></span></li><li><span>&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>};&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">function</span><span>&nbsp;handleEvent(event)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="comment">//&nbsp;grab&nbsp;the&nbsp;event&nbsp;object&nbsp;(IE&nbsp;uses&nbsp;a&nbsp;global&nbsp;event&nbsp;object)</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;event&nbsp;=&nbsp;event&nbsp;||&nbsp;window.event;&nbsp;</span></li><li><span>&nbsp;&nbsp;<span class="comment">//&nbsp;get&nbsp;a&nbsp;reference&nbsp;to&nbsp;the&nbsp;hash&nbsp;table&nbsp;of&nbsp;event&nbsp;handlers</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;handlers&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.events[event.type];&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="comment">//&nbsp;execute&nbsp;each&nbsp;event&nbsp;handler</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;</span><span class="keyword">in</span><span>&nbsp;handlers)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.$$handleEvent&nbsp;=&nbsp;handlers[i];&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.$$handleEvent(event);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>};&nbsp;</span></li></ol></pre>
<p>下面是一个改进版（防止内存泄漏）：<br />
&nbsp;</p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">function</span><span>&nbsp;addEvent(element,&nbsp;type,&nbsp;handler)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;assign&nbsp;each&nbsp;event&nbsp;handler&nbsp;a&nbsp;unique&nbsp;ID</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!handler.$$guid)&nbsp;handler.$$guid&nbsp;=&nbsp;addEvent.guid++;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="comment">//&nbsp;assign&nbsp;each&nbsp;element&nbsp;a&nbsp;unique&nbsp;ID</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!element.$$guid)&nbsp;element.$$guid&nbsp;=&nbsp;addEvent.guid++;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;create&nbsp;a&nbsp;hash&nbsp;table&nbsp;of&nbsp;event&nbsp;types&nbsp;for&nbsp;the&nbsp;element</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!addEvent.handlers[element.$$guid])&nbsp;addEvent.handlers[element.$$guid]&nbsp;=&nbsp;{};&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;create&nbsp;a&nbsp;hash&nbsp;table&nbsp;of&nbsp;event&nbsp;handlers&nbsp;for&nbsp;each&nbsp;element/event&nbsp;pair</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;handlers&nbsp;=&nbsp;addEvent.handlers[element.$$guid][type];&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!handlers)&nbsp;{&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handlers&nbsp;=&nbsp;addEvent.handlers[element.$$guid][type]&nbsp;=&nbsp;{};&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;store&nbsp;the&nbsp;existing&nbsp;event&nbsp;handler&nbsp;(if&nbsp;there&nbsp;is&nbsp;one)</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(element[</span><span class="string">&quot;on&quot;</span><span>&nbsp;+&nbsp;type])&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handlers[0]&nbsp;=&nbsp;element[<span class="string">&quot;on&quot;</span><span>&nbsp;+&nbsp;type];&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;store&nbsp;the&nbsp;event&nbsp;handler&nbsp;in&nbsp;the&nbsp;hash&nbsp;table</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;handlers[handler.$$guid]&nbsp;=&nbsp;handler;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;assign&nbsp;a&nbsp;global&nbsp;event&nbsp;handler&nbsp;to&nbsp;do&nbsp;all&nbsp;the&nbsp;work</span><span>&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;element[<span class="string">&quot;on&quot;</span><span>&nbsp;+&nbsp;type]&nbsp;=&nbsp;handleEvent;&nbsp;</span></span></li><li class="alt"><span>};&nbsp;</span></li><li><span><span class="comment">//&nbsp;a&nbsp;counter&nbsp;used&nbsp;to&nbsp;create&nbsp;unique&nbsp;IDs</span><span>&nbsp;</span></span></li><li class="alt"><span>addEvent.guid&nbsp;=&nbsp;1;&nbsp;</span></li><li><span><span class="comment">//&nbsp;a&nbsp;global&nbsp;hash&nbsp;table&nbsp;containing&nbsp;all&nbsp;handlers</span><span>&nbsp;</span></span></li><li class="alt"><span>addEvent.handlers&nbsp;=&nbsp;{};&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">function</span><span>&nbsp;removeEvent(element,&nbsp;type,&nbsp;handler)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;<span class="comment">//&nbsp;check&nbsp;if&nbsp;the&nbsp;element&nbsp;has&nbsp;a&nbsp;guid</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!element.$$guid)&nbsp;</span><span class="keyword">return</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;delete&nbsp;the&nbsp;event&nbsp;handler&nbsp;from&nbsp;the&nbsp;hash&nbsp;table</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(addEvent.handlers[element.$$guid]&nbsp;&amp;&amp;&nbsp;addEvent.handlers[element.$$guid][type])&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;addEvent.handlers[element.$$guid][type][handler.$$guid];&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>};&nbsp;</span></li><li class="alt"><span><span class="keyword">function</span><span>&nbsp;handleEvent(event)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;grab&nbsp;the&nbsp;event&nbsp;object&nbsp;(IE&nbsp;uses&nbsp;a&nbsp;global&nbsp;event&nbsp;object)</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;event&nbsp;=&nbsp;event&nbsp;||&nbsp;window.event;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;get&nbsp;a&nbsp;reference&nbsp;to&nbsp;the&nbsp;hash&nbsp;table&nbsp;of&nbsp;event&nbsp;handlers</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;handlers&nbsp;=&nbsp;addEvent.handlers[</span><span class="keyword">this</span><span>.$$guid][event.type];&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;execute&nbsp;each&nbsp;event&nbsp;handler</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;</span><span class="keyword">in</span><span>&nbsp;handlers)&nbsp;{&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.$$handleEvent&nbsp;=&nbsp;handlers[i];&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.$$handleEvent(event);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>};&nbsp;</span></li></ol></pre>]]></description>
</item>
<item>
<title><![CDATA[14 CSS 工具及 n 个CSS框架]]></title>
<link>http://www.kaiyuan8.org/Article/YYadtAAfyFJzZWXwjmoB.aspx</link>
<category><![CDATA[HTML]]></category>
<author>KY8</author>
<pubDate>2009-03-01 13:54:19Z</pubDate>
<description><![CDATA[<h3>Optimizer/Formatter</h3>
<ul>
    <li><strong><a href="http://csstidy.sourceforge.net/">CSSTidy</a></strong> - CSS Tidy is an open source CSS parser and optimiser.</li>
    <li><strong><a target="_blank" title="Clean Css" href="http://www.cleancss.com/index.php">CleanCSS</a> </strong>- CleanCSS is a powerful CSS optimizer and formatter. Based on CSSTidy</li>
    <li><a href="http://www.cssoptimiser.com/"><strong>CSS Optimizer</strong> </a> - CSS Optimizer reduces the file size of cascading style sheets.</li>
    <li><strong><a href="http://juicystudio.com/services/csstest.php">CSS Analyzer</a></strong> - CSS Analyzer allows you to check the validity of your CSS against the W3C&rsquo;s validation service</li>
</ul>
<h3>Font</h3>
<ul>
    <li><strong><a href="http://riddle.pl/emcalc/">Em Calculator</a></strong> -  EM Calculator calculats pixel font sizes to ems.</li>
    <li><strong><a href="http://www.somacon.com/p334.php">CSS Font and Text Style Wizard</a></strong> - This wizard is good to experiment with font and text styles and generate sample CSS style source code.</li>
</ul>
<h3>Forms</h3>
<ul>
    <li><strong><a href="http://www.maketemplate.com/form/">CSS Form Code Maker</a></strong> -  Generates &lsquo;Colorful Box Layout&rsquo; For Forms</li>
    <li><strong><a href="http://www.jotform.com/">JotForm</a></strong> - JotForm is a web based WYSIWYG form builder</li>
</ul>
<h3>Navigation/Buttons</h3>
<ul>
    <li><strong><a href="http://www.devdude.com/tools/tool.pl?TID=11">CSS Buttons</a> </strong>- Css Button and Text field Generator.</li>
    <li><strong><a href="http://www.webmaster-toolkit.com/css-menu-generator.shtml">CSS Menu  Generator</a></strong> - CSS Menu Generator will generate both the CSS and the HTML code required to produce a text-based yet appealing set of navigation buttons.</li>
</ul>
<h3>Generator</h3>
<ul>
    <li><strong><a href="http://www.csscreator.com/version2/pagelayout.php">CSS Creator</a></strong> - Css Creator is a layout generator that will create a fluid or fixed width floated column layout, with up to 3 columns and with header and footer.</li>
    <li><strong><a href="http://www.qrone.org/cssdesigner.html">QrONE CSS Designer</a></strong> - QrONE is an online CSS generator and editor.</li>
    <li><strong><a href="http://www.web20generator.com/">Web 2.0 Generator</a></strong> - Web 2.0 Generator creates a full website layout with HTML and CSS.</li>
    <li><strong><a href="http://cssmate.com/csseditor.htm">CSS Mate</a> </strong>- CSS Mate is an online CSS editor.</li>
</ul>
<p>&nbsp;</p>
<ul>
    <li><a target="_blank" href="http://code.google.com/p/blueprintcss/" title="Blueprint"><img width="300" height="70" alt="" src="http://webtecker.com/wp-content/uploads/2008/04/blueprint-300x70.png" title="Blueprint" style="border: 0pt none ;" class="alignnone size-medium wp-image-188" /></a> - Blueprint CSS framework created by Olav Bjorkoy is a framework that offers an easily customizable grid, sensible typography, and even a stylesheet for printing. <a id="Due_credits">A lot of the CSS in this project is completely based on work by other people, like: </a>Jeff Croft , Nathan Borror, Christian Metts, and Eric Meyer. The Blueprint CSS Framework is available for use in all personal or commercial projects, under both the MIT and the GPL license.</li>
    <li><a href="http://www.yaml.de/en/home.html" title="YAML (Yet Another Multicolumn Layout)"><img width="112" height="58" alt="" src="http://webtecker.com/wp-content/uploads/2008/04/yaml.png" title="Yaml" style="border: 0pt none ;" class="alignnone size-medium wp-image-187" /></a> - YAML aka &ldquo;Yet Another Multicolumn Layout&rdquo;, is an (X)HTML/CSS framework for creating modern and flexible floated layouts. YAML created by Dirk Jesse fully supports all IE versions. The YAML framework is published under the Creative Commons Attribution 2.0 License, which permits both private and commercial use. YAML is also very flexible and comes with a bilingual documentation. YAML even has a layout/css <a href="http://builder.yaml.de/">builder</a>, that allows visual configuration of the basic layout elements, that is very cool.</li>
    <li><a target="_blank" href="http://960.gs/"><img width="150" height="100" alt="" src="http://webtecker.com/wp-content/uploads/2008/04/960.gif" title="960 Grid System" style="border: 0pt none ;" class="alignnone size-full wp-image-189" /></a> - 960 Grid System created by Nathan Smith is a <span class="caps">CSS</span> framework for grids. The 960 Grid System&rsquo;s purpose is to streamline web development workflow by providing commonly used dimensions, based on a width of 960 pixels. The reason for 960 pixels is because 960 is divisible by 2, 3, 4, 5, 6, 8, 10, 12, 15, 16, 20, 24, 30, 32, 40, 48, 60, 64, 80, 96, 120, 160, 192, 240, 320 and 480. This makes it a highly flexible base number to work with.</li>
    <li><a target="_blank" href="http://developer.yahoo.com/yui/grids/c"><img width="232" height="44" alt="" src="http://webtecker.com/wp-content/uploads/2008/04/y3.gif" title="Yahoo!" style="border: 0pt none ;" class="alignnone size-medium wp-image-194" /></a><strong><a target="_blank" href="http://developer.yahoo.com/yui/grids/" title="Yahoo UI CSS Framework"> UI Grid CSS</a></strong> - The entire YUI CSS foundation includes the Reset, Fonts, and Grids packages. It even contains a grid builder to allow for faster development. The Yahoo! UI Grid CSS supports easy customization of the width for fixed-width layouts.</li>
    <li><a target="_blank" href="http://code.google.com/p/logicss/"><img width="192" height="80" alt="" src="http://webtecker.com/wp-content/uploads/2008/04/logiccss.gif" title="Logiccss" style="border: 0pt none ;" class="alignnone size-full wp-image-190" /></a> - Logic CSS framework is a collection of CSS files and PHP utilities to cut development times for web-standards compliant xHTML layouts.</li>
    <li><a target="_blank" href="http://eswat.ca/archives/2007/06/18/eswat-web-project-framework-12/"><img width="296" height="71" alt="" src="http://webtecker.com/wp-content/uploads/2008/04/eswat.gif" title="ESWAT" class="alignnone size-full wp-image-191" /></a> - ESWAT is web project framework kit that contains a folder structure and some pre-written components. The ESWAT framework is meant to remove the hassle of recreating the same folders, HTML tags, CSS rules, Photoshop guides, etc.</li>
    <li><a target="_blank" href="http://elements.projectdesigns.org/"><img width="164" height="110" alt="" src="http://webtecker.com/wp-content/uploads/2008/04/logo1.png" title="Elements CSS Framework" class="alignnone size-full wp-image-192" /></a> - Elements is a CSS Framework that was developed by Ben Henschel. It lets you write CSS easier, faster, more efficient, and allows you to organize all of your project files. Elements goes beyond being just a framework, it&rsquo;s its own project workflow.</li>
</ul>
<hr />
<p><strong>YUI CSS库</strong><br />
<a href="http://developer.yahoo.com/yui/">http://developer.yahoo.com/yui/</a></p>
<p><strong>YAML（Yet Another Multicolumn Layout）</strong><br />
<a href="http://www.yaml.de/en/">http://www.yaml.de/en/ </a></p>
<p><strong>Content with Style: A CSS Framework</strong><br />
<a href="http://www.contentwithstyle.co.uk/Articles/17/">http://www.contentwithstyle.co.uk/Articles/17/</a></p>
<p><strong>Blueprint</strong><br />
<a href="http://code.google.com/p/blueprintcss/">http://code.google.com/p/blueprintcss/</a></p>
<p><strong>tripoli</strong><br />
<a href="http://monc.se/tripoli/">http://monc.se/tripoli/</a></p>
<p><strong>Elements</strong><br />
<a href="http://elements.projectdesigns.org/index.html">http://elements.projectdesigns.org/index.html</a></p>
<p><strong>WYMstyle: a CSS framework</strong><br />
<a href="http://www.wymstyle.org/en/">http://www.wymstyle.org/en/</a></p>
<p><strong>taffy-css-framework</strong><br />
<a href="http://code.google.com/p/taffy-css-framework/">http://code.google.com/p/taffy-css-framework/</a></p>
<hr />
<p>See Also:<br />
<a title="CSS Framework CSS框架入门教程" rel="bookmark" href="http://www.21andy.com/blog/20080509/1106.html">CSS Framework CSS框架入门教程</a><br />
<a href="http://www.phpchina.com/html/31/25831-16119.html">blueprint--css framework研究</a><br />
<a href="http://css.chinahtml.com/2007/css-118602092315431.shtml">理解Web框架，和如何构建一个CSS框架</a></p>]]></description>
</item>
<item>
<title><![CDATA[Wildcard Matching in C#]]></title>
<link>http://www.kaiyuan8.org/Article/oCNsfVkuPRedLxXanSvg.aspx</link>
<category><![CDATA[.Net]]></category>
<author>KY8</author>
<pubDate>2009-02-06 07:24:46Z</pubDate>
<description><![CDATA[<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">bool</span><span>&nbsp;Wildcard(</span><span class="keyword">string</span><span>&nbsp;pattern,&nbsp;</span><span class="keyword">string</span><span>&nbsp;input)&nbsp;</span></span></li><li><span>{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;Wildcard(pattern,&nbsp;0,&nbsp;input,&nbsp;0,&nbsp;</span><span class="keyword">false</span><span>);&nbsp;</span></span></li><li><span>}&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">bool</span><span>&nbsp;Wildcard(</span><span class="keyword">string</span><span>&nbsp;pattern,&nbsp;</span><span class="keyword">string</span><span>&nbsp;input,&nbsp;</span><span class="keyword">bool</span><span>&nbsp;insensitive)&nbsp;</span></span></li><li class="alt"><span>{&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;Wildcard(pattern,&nbsp;0,&nbsp;input,&nbsp;0,&nbsp;insensitive);&nbsp;</span></span></li><li class="alt"><span>}&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">bool</span><span>&nbsp;Wildcard(</span><span class="keyword">string</span><span>&nbsp;pattern,&nbsp;</span><span class="keyword">int</span><span>&nbsp;p,&nbsp;</span><span class="keyword">string</span><span>&nbsp;input,&nbsp;</span><span class="keyword">int</span><span>&nbsp;i,&nbsp;</span><span class="keyword">bool</span><span>&nbsp;insensitive)&nbsp;</span></span></li><li><span>{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(;&nbsp;;&nbsp;)&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">char</span><span>&nbsp;ic&nbsp;=&nbsp;input[i];&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">char</span><span>&nbsp;pc&nbsp;=&nbsp;pattern[p];&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">switch</span><span>(pc)&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;</span><span class="string">&#39;?&#39;</span><span>:&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;</span></span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;</span><span class="string">&#39;*&#39;</span><span>:&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p++;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;j&nbsp;=&nbsp;i;&nbsp;j&nbsp;&lt;&nbsp;input.Length;&nbsp;j++)&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(Wildcard(pattern,&nbsp;p,&nbsp;input,&nbsp;j,&nbsp;insensitive))&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">default</span><span>:&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(insensitive)&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ic&nbsp;=&nbsp;<span class="keyword">char</span><span>.ToLower(ic);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc&nbsp;=&nbsp;<span class="keyword">char</span><span>.ToLower(pc);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(ic&nbsp;!=&nbsp;pc)&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p++;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(p&nbsp;&gt;=&nbsp;pattern.Length)&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(i&nbsp;&gt;=&nbsp;input.Length)&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(i&nbsp;&gt;=&nbsp;input.Length)&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>}&nbsp;</span></li></ol></pre>]]></description>
</item>
<item>
<title><![CDATA[几个支持Asp.net的小巧的Web Server]]></title>
<link>http://www.kaiyuan8.org/Article/iVVwmrcUkqzVeEIaeNea.aspx</link>
<category><![CDATA[.Net]]></category>
<author>KY8</author>
<pubDate>2009-02-06 07:16:49Z</pubDate>
<description><![CDATA[<p>Cassini，是Asp.net上的一个项目。但是好像只有.Net 1.0 的。最新的叫 WebDev.WebServer2.&nbsp; 在.NET 安装包下面就有(不知道是否可以随意发布?). Codeplex 上有一个 Cassini 的包装器,支持.NET2.0, 可以让你在计算机内针对任意目录,右键支持直接将其转变为虚拟目录,进行Web服务.</p>
<p>以下为几个有用的链接,有心进行Asp.net程序桌面移植的朋友,可以看看.</p>
<p><a href="http://www.codeplex.com/WebServiceHoster" title="http://www.codeplex.com/WebServiceHoster">http://www.codeplex.com/WebServiceHoster</a>&nbsp; 自己在桌面程序中支持 Asp.net Host, 基于Cassini</p>
<p><a href="http://www.codeplex.com/CassiniWrapper" title="http://www.codeplex.com/CassiniWrapper">http://www.codeplex.com/CassiniWrapper</a></p>
<p>UltiDev Cassini Web Server: 不同与微软的那个 Cassini, 但是支持 .NET 目前所有的版本(1.0-3.5)</p>
<p><a href="http://ultidev.com/products/Cassini/index.htm" title="http://ultidev.com/products/Cassini/index.htm">http://ultidev.com/products/Cassini/index.htm</a></p>
<p>其他应用文章</p>
<p><a href="http://zhq.ahau.edu.cn/blog/article.asp?id=288" title="http://zhq.ahau.edu.cn/blog/article.asp?id=288">http://zhq.ahau.edu.cn/blog/article.asp?id=288</a></p>
<p><a href="http://zhq.ahau.edu.cn/blog/article/297.htm" title="http://zhq.ahau.edu.cn/blog/article/297.htm">http://zhq.ahau.edu.cn/blog/article/297.htm</a></p>
<p><a href="http://tv9.cnblogs.com/articles/73176.html" target="_blank">http://tv9.cnblogs.com/articles/73176.html</a></p>
<p>Mono XSP</p>
<p><a href="http://www.mono-project.com/ASP.NET" target="_blank">http://www.mono-project.com/ASP.NET</a></p>
<p><a target="_blank" href="http://www.codeproject.com/KB/cpp/ahttpserver_dotnet.aspx">Small and Reliable C++ HTTP Server with Complete ASP.NET Support</a></p>
<p><a href="http://www.codeplex.com/webserver" target="_blank">C# WebServer </a></p>]]></description>
</item>
<item>
<title><![CDATA[5 Open source MP3 decoder in C/C++]]></title>
<link>http://www.kaiyuan8.org/Article/ZGHjTIiDfiPqiyHCrsmG.aspx</link>
<category><![CDATA[C/C++]]></category>
<author>KY8</author>
<pubDate>2009-01-30 00:48:49Z</pubDate>
<description><![CDATA[<p>1. MAD: MPEG Audio Decoder<br />
http://www.underbit.com/products/mad/ or http://sourceforge.net/projects/mad/<br />
<br />
MAD is a high-quality fixed-point MPEG audio decoder with 24-bit output. The implementation is entirely new, based on the ISO/IEC standards, and performs especially well on systems without native floating-point support.<br />
<br />
2. Mpadec<br />
http://sourceforge.net/projects/mpadec<br />
<br />
Mpadec is a high-quality portable MPEG audio decoder library. It supports MPEG-1, MPEG-2 Layer I, Layer II and Layer III audio streams, including free-format streams.<br />
<br />
3.MPG321<br />
http://mpg321.sourceforge.net/<br />
<br />
mpg321 is a Free replacement for mpg123, a very popular command-line mp3 player. mpg123 is used for frontends, as an mp3 player and as an mp3 to wave file decoder (primarily for use with CD-recording software.) In all of these capacities, mpg321 can be used as a drop-in replacement for mpg123.<br />
<br />
4.MGP123<br />
http://sourceforge.net/projects/mpg123<br />
<br />
mpg123 is the fast and Free (LGPL since version 0.60) console based real time MPEG Audio Player for Layer 1, 2 and 3. It uses floating point math (unlike libmad). Starting with version 1.0, in also contains an up-to-date decoding library usable by 3rd party.<br />
<br />
5.FOOBAR2000<br />
http://www.foobar2000.org/<br />
<br />
The foobar2000 SDK contains a bugfixed C++ version of the mpg123 C code</p>]]></description>
</item>
<item>
<title><![CDATA[判断当前ASP.NET的.NET Framework(CLR)版本]]></title>
<link>http://www.kaiyuan8.org/Article/VXFkWlQAUBDgbnLWAbZM.aspx</link>
<category><![CDATA[.Net]]></category>
<author>KY8</author>
<pubDate>2009-01-29 02:02:42Z</pubDate>
<description><![CDATA[<p>可通过<strong>System.Environment.Version.ToString()</strong>取得当前CLR版本号，然后对照下表得到Revision版本：
<table>
    <tbody>
        <tr>
            <th>.NET Framework version</th>
            <th>Revision</th>
            <th>Version</th>
        </tr>
        <tr>
            <td>3.5</td>
            <td>Original release</td>
            <td>3.5.21022.8</td>
        </tr>
        <tr>
            <td>3.5</td>
            <td>Service Pack 1</td>
            <td>3.5.30729.1</td>
        </tr>
        <tr>
            <td>3.0</td>
            <td>Original release</td>
            <td>3.0.4506.30</td>
        </tr>
        <tr>
            <td>3.0</td>
            <td>Service Pack 1</td>
            <td>3.0.4506.648</td>
        </tr>
        <tr>
            <td>3.0</td>
            <td>Service Pack 2</td>
            <td>3.0.4506.2152</td>
        </tr>
        <tr>
            <td>2.0</td>
            <td>Original release</td>
            <td>2.0.50727.42</td>
        </tr>
        <tr>
            <td>2.0</td>
            <td>Service Pack 1</td>
            <td>2.0.50727.1433</td>
        </tr>
        <tr>
            <td>2.0</td>
            <td>Service Pack 2</td>
            <td>2.0.50727.3053</td>
        </tr>
        <tr>
            <td>1.1</td>
            <td>Original release</td>
            <td>1.1.4322.573</td>
        </tr>
        <tr>
            <td>1.1</td>
            <td>Service Pack 1</td>
            <td>1.1.4322.2032</td>
        </tr>
        <tr>
            <td>1.1</td>
            <td>Service Pack 1 (Windows Server 2003 32-bit version*)</td>
            <td>1.1.4322.2300</td>
        </tr>
        <tr>
            <td>1.0</td>
            <td>Original release</td>
            <td>1.0.3705.0</td>
        </tr>
        <tr>
            <td>1.0</td>
            <td>Service Pack 1</td>
            <td>1.0.3705.209</td>
        </tr>
        <tr>
            <td>1.0</td>
            <td>Service Pack 2</td>
            <td>1.0.3705.288</td>
        </tr>
        <tr>
            <td>1.0</td>
            <td>Service Pack 3</td>
            <td>1.0.3705.6018</td>
        </tr>
    </tbody>
</table>
*The Microsoft .NET Framework 1.1 is included with the 32-bit version of Windows Server 2003.</p>]]></description>
</item>
<item>
<title><![CDATA[CodePlex.com上的三个ISO读写类库]]></title>
<link>http://www.kaiyuan8.org/Article/puzSqdXJQDDgzpHyiPiZ.aspx</link>
<category><![CDATA[.Net]]></category>
<author>KY8</author>
<pubDate>2009-01-18 18:37:10Z</pubDate>
<description><![CDATA[<p><a href="http://www.codeplex.com/DiscUtils" target="_blank">.NET DiscUtils</a><br />
<br />
纯C#实现读写ISO和VHD文件的类库，以Stream进行文件读写，无需将整个文件加载到内存中。当前支持的文件系统格式：FAT、NTFS（只读）、VHD和VDI。范例：<br />
<br />
①、新建一个ISO文件：</p>
<pre><ol class="dp-c"><li class="alt"><span><span>CDBuilder&nbsp;builder&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;CDBuilder();&nbsp;</span></span></li><li><span>builder.UseJoliet&nbsp;=&nbsp;<span class="keyword">true</span><span>;&nbsp;</span></span></li><li class="alt"><span>builder.VolumeIdentifier&nbsp;=&nbsp;<span class="string">&quot;A_SAMPLE_DISK&quot;</span><span>;&nbsp;</span></span></li><li><span>builder.AddFile(@<span class="string">&quot;Folder\Hello.txt&quot;</span><span>,&nbsp;Encoding.ASCII.GetBytes(</span><span class="string">&quot;Hello&nbsp;World!&quot;</span><span>));&nbsp;</span></span></li><li class="alt"><span>builder.Build(@<span class="string">&quot;C:\temp\sample.iso&quot;</span><span>);&nbsp;</span></span></li></ol></pre>
<p>可以像上面那样以byte数组添加文件，也可以直接从Windows文件系统中加载，或者也可以是个Stream。生成的结果保存到Stream中，也可以直接保存到Windows的文件系统中。<br />
②、从ISO文件中读取文件</p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">using</span><span>&nbsp;(FileStream&nbsp;isoStream&nbsp;=&nbsp;File.Open(@</span><span class="string">&quot;C:\temp\sample.iso&quot;</span><span>))&nbsp;</span></span></li><li><span>{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;CDReader&nbsp;cd&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;CDReader(isoStream,&nbsp;</span><span class="keyword">true</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;Stream&nbsp;fileStream&nbsp;=&nbsp;cd.OpenFile(@<span class="string">&quot;Folder\Hello.txt&quot;</span><span>,&nbsp;FileMode.Open);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;Use&nbsp;fileStream...</span><span>&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p>目录结构以cd.Root为起点。<br />
③、新建一个虚拟硬盘：</p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">long</span><span>&nbsp;diskSize&nbsp;=&nbsp;30&nbsp;*&nbsp;1024&nbsp;*&nbsp;1024;&nbsp;</span><span class="comment">//30MB</span><span>&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span><span class="keyword">using</span><span>&nbsp;(Stream&nbsp;vhdStream&nbsp;=&nbsp;File.Create(@</span><span class="string">&quot;C:\TEMP\mydisk.vhd&quot;</span><span>))&nbsp;</span></span></li><li><span>{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Disk&nbsp;disk&nbsp;=&nbsp;Disk.InitializeDynamic(vhdStream,&nbsp;diskSize);&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;BiosPartitionTable.Initialize(disk,&nbsp;WellKnownPartitionType.WindowsFat);&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">using</span><span>&nbsp;(FatFileSystem&nbsp;fs&nbsp;=&nbsp;FatFileSystem.FormatPartition(disk,&nbsp;0,&nbsp;</span><span class="keyword">null</span><span>))&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fs.CreateDirectory(@<span class="string">&quot;TestDir\CHILD&quot;</span><span>);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;do&nbsp;other&nbsp;things&nbsp;with&nbsp;the&nbsp;file&nbsp;system...</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p>文件系统以fs.Root作为起点。<br />
④、新建一个虚拟软盘：</p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">using</span><span>&nbsp;(FileStream&nbsp;fs&nbsp;=&nbsp;File.Create(@</span><span class="string">&quot;myfloppy.vfd&quot;</span><span>))&nbsp;</span></span></li><li><span>{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">using</span><span>&nbsp;(FatFileSystem&nbsp;floppy&nbsp;=&nbsp;FatFileSystem.FormatFloppy(fs,&nbsp;FloppyDiskType.HighDensity,&nbsp;</span><span class="string">&quot;MY&nbsp;FLOPPY&nbsp;&nbsp;&quot;</span><span>))&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">using</span><span>&nbsp;(Stream&nbsp;s&nbsp;=&nbsp;floppy.OpenFile(</span><span class="string">&quot;foo.txt&quot;</span><span>,&nbsp;FileMode.Create))&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Use&nbsp;stream...</span><span>&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p><a href="http://www.codeplex.com/ImageMaster" target="_blank">Image Master </a><br />
用于读写iso文件的.Net应用程序，主要特性：<br />
&nbsp;&nbsp;&nbsp; * Read the contents of image files before burning them to disc.<br />
&nbsp;&nbsp;&nbsp; * Extract the contents of image files without burning them to disc.<br />
&nbsp;&nbsp;&nbsp; * Burn an image file to disc.<br />
&nbsp;&nbsp;&nbsp; * Burn files and/or folders directly to disc.<br />
&nbsp;&nbsp;&nbsp; * Supports multi-session burning.<br />
&nbsp;&nbsp;&nbsp; * Create image files for archiving.<br />
&nbsp;&nbsp;&nbsp; * Convert Bin Image Files (.bin), Nero Image Files (.nrg), Alcohol Image Files (.mdf), CloneCd Image Files (.img), DiscJuggler Image Files (.cdi) to iso images.<br />
<img height="300" src="/Attach/200901/633679024798437500_read.png" alt="" /><br />
<img height="300" src="/Attach/200901/633679024883906250_write.png" alt="" /><br />
在Windows XP SP2刻录光盘需要安装<a href="http://support.microsoft.com/kb/KB932716" target="_blank">Imapi v2.0</a>，在Windows Vista默认就已经安装了。</p>
<p><br />
<a href="http://www.codeplex.com/gomuiso9660" target="_blank">GomuISO9660 </a></p>
<p>C#实现的一个类库，用于操作ISO9660映像(.iso/.bin/.mdf...) ，主要特性：<br />
&nbsp;&nbsp;&nbsp; * Read ISO9660 discs images (supported formats are .iso/.bin/.mdf and CloneCd image).<br />
&nbsp;&nbsp;&nbsp; * Extract from discs images are by file or full.<br />
&nbsp;&nbsp;&nbsp; * Create an iso disc image file from CD/DVD source.<br />
&nbsp;&nbsp;&nbsp; * Convert from several disc image format to iso disc image file (supported formats are .bin/.mdf/.nrg/.img/.cdi).<br />
&nbsp;&nbsp;&nbsp; * Create iso disc image file from a source directory (not available yet).<br />
&nbsp;&nbsp;&nbsp; * Burn iso file.</p>]]></description>
</item>
<item>
<title><![CDATA[7个汇编开发环境]]></title>
<link>http://www.kaiyuan8.org/Article/UKHBtuoEQXpbbDqaKxst.aspx</link>
<category><![CDATA[其它]]></category>
<author>KY8</author>
<pubDate>2009-01-17 16:07:01Z</pubDate>
<description><![CDATA[<p>1、radasm<br />
http://www.radasm.com/<br />
2、masm32<br />
http://www.masm32au.com/masm32/m32v10r.zip<br />
3、masmplus<br />
http://www.aogosoft.com/masmplus/idesetup.exe<br />
4、nasm<br />
http://sourceforge.net/projects/nasm<br />
5、TASM 5.0<br />
http://www.programfan.com/download/down.asp?id=214&amp;url=1<br />
6、WINASM<br />
http://www.winasm.net/<br />
7、Visual ASM 6.0<br />
http://blog.ednchina.com/visualasm/80011/message.aspx</p>]]></description>
</item>
<item>
<title><![CDATA[通过System.Data.SQLite.dll往SQLite数据库中插入Blob数据]]></title>
<link>http://www.kaiyuan8.org/Article/qfuoQyWKDicoYpoirorz.aspx</link>
<category><![CDATA[.Net]]></category>
<author>KY8</author>
<pubDate>2009-01-14 18:23:12Z</pubDate>
<description><![CDATA[<p>有两种方法可以实现：<br />
①、通过SQLiteParameter</p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;TestSqliteBinary()&nbsp;</span></span></li><li><span>{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">using</span><span>&nbsp;(SQLiteConnection&nbsp;cnn&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SQLiteConnection(</span><span class="string">&quot;data&nbsp;source=temp.db&quot;</span><span>))&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnn.Open();&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">using</span><span>&nbsp;(SQLiteCommand&nbsp;cmd&nbsp;=&nbsp;cnn.CreateCommand())&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//cmd.CommandText&nbsp;=&nbsp;&quot;Create&nbsp;Table&nbsp;test(data&nbsp;Image)&quot;;</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//cmd.ExecuteNonQuery();</span><span>&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd.CommandText&nbsp;=&nbsp;<span class="string">&quot;insert&nbsp;into&nbsp;test&nbsp;values(@data)&quot;</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLiteParameter&nbsp;para&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;SQLiteParameter(</span><span class="string">&quot;@data&quot;</span><span>,DbType.Binary);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">string</span><span>&nbsp;file&nbsp;=&nbsp;@</span><span class="string">&quot;info.zip&quot;</span><span>;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileStream&nbsp;fs&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;FileStream(file,&nbsp;FileMode.Open);&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamUtil&nbsp;su&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;StreamUtil();&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">byte</span><span>[]&nbsp;buffer&nbsp;=&nbsp;su.StreamToBytes(fs);&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fs.Close();&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;para.Value&nbsp;=&nbsp;buffer;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd.Parameters.Add(para);&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd.ExecuteNonQuery();&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p><br />
②、通过16进制字符编码：</p>
<pre><ol class="dp-sql"><li class="alt"><span><span class="keyword">INSERT</span><span>&nbsp;</span><span class="keyword">INTO</span><span>&nbsp;Foo&nbsp;(blob)&nbsp;</span><span class="keyword">VALUES</span><span>(X</span><span class="string">&#39;BADF00D&#39;</span><span>)&nbsp;</span></span></li></ol></pre>
<p><br />
In the above example, the binary data is quoted as hex, but inserted into the database as actual binary characters.&nbsp; Data is retrieved as a byte[] array.</p>]]></description>
</item>
<item>
<title><![CDATA[SQLite体系结构]]></title>
<link>http://www.kaiyuan8.org/Article/BkdAOKQRCAdyDZFQkXbr.aspx</link>
<category><![CDATA[其它]]></category>
<author>KY8</author>
<pubDate>2009-01-14 09:34:59Z</pubDate>
<description><![CDATA[<p>这份文档描述了sqlite数据库的体系结构，这些信息对想理解或者修改内部工作原理的朋友们会很有用。<img src="/Attach/200901/633675225745533070_arch2633673608733906250[1].gif" alt="" /><br />
上图中包含了sqlite的主要的模块以及它们是怎么关联的。下面就简要介绍一下每个模块。<br />
&nbsp; （这份文档描述的是sqlite 3.0版本的，2.8以及以前的大体相似只是细节上有点不同）<br />
<br />
<strong>接口</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; 大部分sqlite的接口在main.c,legacy.c，vdbeapi.c源文件中实现，但是有些常规性的分散在其他的文件中，因为它们可以在文件 作用域内访问一些数据结构。比如，sqlite3_get_table() 在table.c中实现，sqlite3_mprintf() 在printf.c中实现，sqlite3_complete()在tokenizer.c中实现，tcl接口在tclsqlite.c中实现，更多关于 sqlite的c接口可以访问<br />
&nbsp;&nbsp;&nbsp;&nbsp; 为了避免与其他的软件产生命名冲突，所有的对外符号都以sqlite3作为前缀。（也就是说，这些符号构成了sqlite的api）<br />
<br />
<strong>分词器</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; 当一个包含sql语句的字符串执行的时候，接口把字符串传递给分词器。分词器的工作就是把原始的字符串分割成标记，然后一个一个的传给语法分析器。这个分词器在tokenizer.c中用c实现。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 注意在这个设计里面，分词器调用语法分析器。那些熟悉YACC或者BISON的朋友们习惯用另一种方式设计-----用语法分析器调用分词器。sqlite的作者分别用这两种方法实现过，最后发现第一种方法工作效率比较高。YACC有很多局限性。<br />
<br />
<strong>语法分析器</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; 语法分析器是一个根据环境给符号赋予意义的模块。这个分析器用了lemo的LALR(1)分析器生成。lemon跟YACC/BISON差不多，但是它用 了一种很少产生错误的输入句法（syntax），而且lemon可以产生一个可重入(reentrant)和线程安全(thread-safe)的分析 器。lemon可以定义无端点的破坏（non-terminal destructor）的概念，所以当出现错误句法时不会出现内存泄露。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 由于lemon是一个一般不会经常使用的程序，lemon完整的源文件(就一个c文件)在sqlite发布版本的tool文件夹下。关于lemon的文档在doc文件夹下。<br />
<br />
<strong>代码生成器</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在分析器把符号翻译(assemble)成完整的sql语句的后，它会调用代码生成器产生sql语句需要执行的虚拟机代码。代码生成器包含很多文 件，attach.c,auth.c,build.c,delete.c,expr.c,insert.c,pragma.c,select.c,trigger.c update.c,vacuum.c和where.c。这些文件是大部分古怪魔法(serious magic)发生的地方。expr.c处理表达式的代码生成，where.c 处理select，update，delete语句中where子句的代码生成，attach.c,delete.c insert.c select.c trigger.c update.c 和 vacuum.c 处理跟它们名字有关语句的代码生成(当有必要时，这些文件调用expr.c和where.c中常用的函数)。其余的sql 语句在build.c中生成。auth.c文件实现sqlite3_set_authorizer()接口.<br />
&nbsp;<br />
<strong>虚拟机</strong><br />
&nbsp;&nbsp; 由代码生成器生成的代码被虚拟机执行。更多的关于虚拟的的信息可以访问&mdash;&mdash;&mdash;&mdash;。摘要而言，虚拟机实现了一个专门处理数据库文件的抽象的计算引擎 (abstract computing engine)。这个虚拟机包含了一个作为中间存储器的栈，每条指令包含一个操作码和多达3个的操作数。<br />
&nbsp;&nbsp;&nbsp; 这个虚拟机完全在vdbe.c中实现，它有自己的头文件vdbe.h，里面定义了虚拟机和其他的模块的接口。vdbeInt.h里面定义了虚拟机里面私有 的数据结构，vdbeaux.c里面包含了虚拟机常用的工具，也包含了其余为构造虚拟机程序的库的接口模块。vdbeapi.c 包含了虚拟机对外的接口比如sqlite3_bind_... 的函数族。数据类型(individual values)(strings,integer,floating point numbers,和BLOBs)存储在一个内部的叫做&ldquo;mem&rdquo;对象当中，在vdbemen.c中。<br />
&nbsp;&nbsp;&nbsp; sqlite用回调c语言函数（c-language routines）的方法实现sql 函数。甚至内建的sql函数都是用这种方式实现的。很多内建的sql函数（比如coalesce(),count(),substr()，还有很多），在 func.c中实现，数据和时间的转换函数在date.c中实现。<br />
<br />
<strong>B-Tree</strong><br />
&nbsp;&nbsp; sqlite数据库在硬盘上用B-tree实现，具体代码在btree.c中。在数据库中的每个表和索引都使用单独的b-tree。所有的b-tree存 储在用一个文件中。文件格式的细节在btree.c开头的一大段注释中记录。b-tree的接口在btree.h头文件中记录。<br />
<br />
<strong>页缓存</strong><br />
&nbsp; B-tree模块需要以一个固定大小的块从硬盘读取数据。默认的块大小是1024个字节，可以在512和65536个字节间变化。页缓存的任务是读，写， 缓存块。页缓存提供回滚，原子委托抽象（atomic commit abstraction），处理数据文件的锁。b-tree需要从页缓存请求特殊的页，当修改页，委托，回滚时通知页缓存，页缓存处理所以的细节以确定快 速，安全，高效的处理请求。<br />
<br />
&nbsp; 实现页缓存的代码在pager.c中，页缓存子系统的接口在pager.h头文件中定义。<br />
<br />
<strong>操作系统接口</strong><br />
&nbsp;&nbsp; 为了在POSIX和win32操作系统之间移植，sqlite用了一个抽象的层作为与操作系统间的接口。实现OS抽象层的接口在os.h中定义，每一种支 持的系统有它们自己的实现方式，os_unix.c为unix，os_win.c为windows，当然也有自己相应的头文件os_unix.h和 os_win.h，等等。<br />
<br />
<strong>工具</strong><br />
&nbsp; 内存配置和字符串比较的功能在util.c中，语法分析器用到的符号表用hash 表实现，具体代码在hash.c中。utf.c包含了Unicode转换子程序。sqlite有它自己printf()实现(增加了很多功能)，在 printf.c中。也有自己的随机数生成的实现，在random.c中。<br />
&nbsp; <br />
<strong>测试代码</strong><br />
&nbsp;&nbsp;&nbsp; 如果你依赖测试脚本，一多半sqlite的代码是为了测试用的。很多assert()语句在主代码文件中。另外，从test1.c到test5.c和md5.c只是为测试实现的，os_test.c中的接口是为了模拟断电时，核实页中错误恢复机制的。</p>]]></description>
</item>
<item>
<title><![CDATA[压缩网站的JavaScript文件]]></title>
<link>http://www.kaiyuan8.org/Article/qlpxElwnRZVbfmJCoqFY.aspx</link>
<category><![CDATA[JavaScript]]></category>
<author>KY8</author>
<pubDate>2009-01-03 14:55:48Z</pubDate>
<description><![CDATA[<p>通常在一个 Web 2.0 应用中，会有很多业务逻辑相关的 JS 代码，而且很多逻辑从后台搬到了客户端执行，因此这部分客户端代码非常多。为了提供更快的响应速度，典型的做法是压缩所有客户端需要加载的资源包括图 片，HTML 文件，CSS 文件，JS 代码等等，而图片文件已经无法再进行压缩，只有 HTML，CSS，JS 等文本文件有进一步压缩的空间。<br />
<br />
进行JavaScript文件压缩的工具比较多：Douglas Crockford的<a target="_blank" href="http://crockford.com/javascript/jsmin">JSMIN</a>、<a href="http://dojotoolkit.org/docs/shrinksafe">the Dojo compressor</a>、Dean Edwards的<a href="http://dean.edwards.name/packer/">Packer</a>、<a target="_blank" href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a></p>
<p><a href="http://dojotoolkit.org/docs/shrinksafe">the Dojo compressor</a> shrinksafe 之所以称其&ldquo;safe&rdquo;，是因为它在压缩了 JS 文件以后，不会改变其对象内部方法和属性名称，引用到该段代码的地方不需要任何更改，还是可以直接调用其内部方法和属性。在 custom_rhino.jar 所在的目录运行 java &ndash;jar custom_rhino.jar &ndash;version 100 可以进入 rihno 的命令行状态。<br />
<img alt="" src="/Attach/200901/fig001.jpg" /></p>
<p>压缩一个 JS 文件的命令如下：</p>
<pre>
java -jar custom_rhino.jar -c infile.js &gt; outfile.js
</pre>
<p>经测试，一个 JS 文件经过这样的命令压缩后，可以减小 30% 左右，将压缩后的文件放回系统中，对该 JS 文件的功能调用没有任何影响。</p>
<p><a target="_blank" href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>不但可以压缩JavaScript还可以压缩CSS，用法：</p>
<pre><ol class="dp-xml"><li class="alt"><span><span>Usage:&nbsp;java&nbsp;-jar&nbsp;yuicompressor-x.y.z.jar&nbsp;[options]&nbsp;[input&nbsp;file]&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span>Global&nbsp;Options&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;-h,&nbsp;--help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Displays&nbsp;this&nbsp;information&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;--type&nbsp;<span class="tag">&lt;</span><span class="tag-name">js</span><span>|css</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Specifies&nbsp;the&nbsp;type&nbsp;of&nbsp;the&nbsp;input&nbsp;file&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;--charset&nbsp;<span class="tag">&lt;</span><span class="tag-name">charset</span><span class="tag">&gt;</span><span>&nbsp;Read&nbsp;the&nbsp;input&nbsp;file&nbsp;using&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">charset</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;--line-break&nbsp;<span class="tag">&lt;</span><span class="tag-name">column</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;Insert&nbsp;a&nbsp;line&nbsp;break&nbsp;after&nbsp;the&nbsp;specified&nbsp;column&nbsp;number&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;-v,&nbsp;--verbose&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Display&nbsp;informational&nbsp;messages&nbsp;and&nbsp;warnings&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;-o&nbsp;<span class="tag">&lt;</span><span class="tag-name">file</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Place&nbsp;the&nbsp;output&nbsp;into&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">file</span><span class="tag">&gt;</span><span>.&nbsp;Defaults&nbsp;to&nbsp;stdout.&nbsp;</span></span></li><li><span>&nbsp;</span></li><li class="alt"><span>JavaScript&nbsp;Options&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;--nomunge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Minify&nbsp;only,&nbsp;do&nbsp;not&nbsp;obfuscate&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;--preserve-semi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Preserve&nbsp;all&nbsp;semicolons&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;--disable-optimizations&nbsp;Disable&nbsp;all&nbsp;micro&nbsp;optimizations&nbsp;</span></li></ol></pre>
<p>JSMIN可以通过&ldquo;<a href="http://www.99cha.net/computer/javascript-compression.aspx">Javascript精简压缩</a>&rdquo;进行在线压缩</p>
<p>Packer可以通过&ldquo;<a href="http://www.99cha.net/computer/javascript-packer.aspx">Javascript混淆打包</a>&rdquo;进行在线压缩</p>]]></description>
</item>
<item>
<title><![CDATA[Google Chrome 构建指南]]></title>
<link>http://www.kaiyuan8.org/Article/chPSomuiVWCAqMvabvEZ.aspx</link>
<category><![CDATA[谷歌浏览器]]></category>
<author>KY8</author>
<pubDate>2009-01-03 05:12:48Z</pubDate>
<description><![CDATA[<p>首先，配置开发环境：<br />
&nbsp;&nbsp; 1. 安装VS2005，全部安装，不要只选VC++。<br />
&nbsp;&nbsp; 2. 安装<a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=bb4a75ab-e2d4-4c96-b39d-37baf6b5b1dc">VS2005 SP1</a>，根椐VS的语言选择安装，这里给出的链接是中文版的。<br />
&nbsp;&nbsp; 3. 安装<a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=F26B1AA4-741A-433A-9BE5-FA919850BDBF&amp;displaylang=en">Windows SDK 2008</a>，安装完后，执行：开始｜所有程序｜microsoft windows SDK v6.1｜Visual Studio Registration｜Windows SDK Configuration tool 将最新的SDK与VS2005关联起来。<br />
<br />
开发环境准备完毕，接下来下载Chrome的源代码：<br />
&nbsp;&nbsp; 1. 下载<a href="http://build.chromium.org/buildbot/archives/depot_tools_win.zip">depot_tools_win.zip</a>，下完解压到一个目录，假设解压后的目录是：C:\depot_tools。<br />
&nbsp;&nbsp; 2. 把depot_tools的路径加入PATH环境变量：我的电脑｜属性｜高级｜环境变量。<br />
&nbsp;&nbsp; 3. 创建一个存放代码的文件夹，假设是：c:\trunk；运行cmd并将当前路径定位到该文件夹： cd c:\trunk。<br />
&nbsp;&nbsp; 4. 在cmd里执行：gclient config http://src.chromium.org/svn/trunk/src。<br />
&nbsp;&nbsp; 5. 执行完后，再执行：gclient sync，此时就开始检出Chrome的代码，需要很长的时间。<br />
<br />
经过很长的时间，代码终于取下来了，现在开始构建：<br />
&nbsp;&nbsp; 1. 打开c:\trunk\src\chrome\chrome.sln。<br />
&nbsp;&nbsp; 2. 会看到app目录下有一个chrome_exe工程，构建它就行了。<br />
<br />
耐心地等待构建，幸运的话，目标文件会生成在：c:\trunk\src\chrome\debug</p>]]></description>
</item>
</channel>
</rss>