<?xml version="1.0" encoding="UTF-8" ?><?XML-stylesheet type="text/css" href="http://www.goberl.com/Theme/feed.css" ?><rss version="2.0">	<channel>	<title><![CDATA[Goberl]]></title>	<link><![CDATA[http://www.goberl.com/]]></link>	<description><![CDATA[我的网路在何方?]]></description>	<language>Zh-CN</language>	 <ttl>60</ttl><item>	<title><![CDATA[对Google搜索结果的排序]]></title>	<link><![CDATA[http://www.goberl.com/archive/item39.aspx]]></link>	<description><![CDATA[<p>前两天用Google.COM搜索，发现上面增加了几项新功能。有两项功能都需要Google用户激活该项服务并登陆过后才可显示和使用。一项功能是对搜索的结果进行评论，另外一项是对搜索结果进行&ldquo;个性化&rdquo;排名。先看看下面这张图片。</p>
<p style="text-align: center;"><img height="246" width="521" alt="Google搜索" src="/fckeditor/FCKPro/upLoadFiles/image/Google_SearchComment.jpg" /></p>
<p>&nbsp;上图中的每个搜索结果的链接后面都有两个用于排序和删除的按钮。你可以把本来排名在第二的移到最顶上，也可以把后一页的链接移动到第一页，还可以从搜索结果中删除某一链接。这些操作将会影响你下一次使用同样关键词的搜索结果及其排序情况。我觉得Google可能会在<span style="color: rgb(128, 128, 0);">一定程度上</span>从成千上万的搜索者的排序操作中来决定一个网站对该关键词的匹配程度，也就是说Google在<span style="color: rgb(128, 128, 0);">一定程度上</span>希望借助搜索者的人为活动来决定该网页内容对关键词的匹配。</p>
<p style="text-align: center;">&nbsp;<img height="85" width="521" src="/fckeditor/FCKPro/upLoadFiles/image/Google_SearchTrack01.jpg" alt="Google搜索" /><br />
<img height="101" width="521" src="/fckeditor/FCKPro/upLoadFiles/image/Google_SearchTrack02.jpg" alt="Google搜索" /></p>
<p>上面两张图片显示了Google对搜索结果的统计情况&mdash;&mdash;被引用次数、有几个版本、作者，有点像百度新闻频道对同一新闻的统计信息。这给人感觉更像科学规范的论文，而不是目前中国互联网普遍存在的网络抄袭文摘&mdash;&mdash;同一信息很容易出现在N多网站，却很少出现链接该信息的最终来源。<img src="/fckeditor/editor/images/smiley/myface/img58.gif" alt="" /></p>]]>	</description>	<pubDate>2009-1-6 9:28</pubDate>	<category><![CDATA[Google微软]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item39.aspx</guid></item><item>	<title><![CDATA[汉明码解析]]></title>	<link><![CDATA[http://www.goberl.com/archive/item38.aspx]]></link>	<description><![CDATA[<p><a href="http://baike.baidu.com/view/890413.html">汉明码</a>生成过程：</p>
<p>把信息和校验码安排成一个n位区块，其中校验位的位置分别是在n位区块中的第2^(n-k-1),...2^2,2^1,2^0位，其余位置依次放置原始信息。<br />
<strong>发送端：</strong></p>
<ol>
    <li>每个信息位为1的位置以二进制值表示；</li>
    <li>所有信息位是1的位置值一起经过XOR产生汉明码，依次填入位置；</li>
    <li>将n位信息传输给接收端。</li>
</ol>
<p><strong>接收端：</strong></p>
<ol>
    <li>对所接收到的信息位是1的位置值做XOR运算，得到汉明码；</li>
    <li>用此汉明码和校验码进行XOR运算，如果其结果为零，则表示没有错误，如果结果不为零，则此结果即表明了发生错误的位置。</li>
</ol>
<p>例子中采用8位信息，4位校验码，n=12，k=8。</p>
<p style="text-align: center;"><img height="305" width="521" alt="R.W.Hamming,汉明码" src="/fckeditor/FCKPro/upLoadFiles/image/Hamming-1.png" /><br />
<img height="131" width="521" alt="R.W.Hamming,汉明码" src="/fckeditor/FCKPro/upLoadFiles/image/Hamming-2.png" /></p>
<p><span style="font-size: larger;"><strong>说明</strong> </span><br />
<br />
&nbsp;&nbsp; 校验位的位置由n=12，k=8，计算得出:2^3=8,2^2=4,2^1=2,2^0=1，即校验位分别在区块的8、4、2、1位置。<br />
&nbsp;&nbsp; 以上&ldquo;区块位置二进制&rdquo;&mdash;&mdash;是把区块位置的十进制换为2进制，如12的十进制换为2进制，[12]10=[1100]2。<br />
&nbsp; &nbsp;信息位是1的位置值一起经过XOR产生汉明码。发送端信息为1的区块有：10、9、7、3。（注意：第4、2、1的区块信息虽然是1，但却不是信息位，而是校验位）经计算得出汉明码为0111，依次填入第8、4、2、1的校验码位置。</p>
<p style="text-align: center;"><img height="140" width="147" alt="汉明码" src="/fckeditor/FCKPro/upLoadFiles/image/Hamming-3.jpg" /></p>
<p>&nbsp; 接受端信息位为1的区块有：11、10、9、7、3</p>
<p style="text-align: center;"><img height="149" width="132" alt="汉明码" src="/fckeditor/FCKPro/upLoadFiles/image/Hamming-4.jpg" /></p>
<p>&nbsp; 取出接受端收到的汉明码（由n、k计算出汉明码位置）：0111,让0111与接收端根据接受到的数据产生的汉明码1100与运算（XOR），其结果为1011，不全为0，所以得出传输的数据有错误，把1011换算成10进制[1011]2=[11]10,所以出错的位置为区块的第11位，即区块位置的第11位的1应该是0，从而查错纠错。<br />
&nbsp;</p>
<p>&nbsp;</p>]]>	</description>	<pubDate>2009-1-4 1:29</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item38.aspx</guid></item><item>	<title><![CDATA[RSA解析]]></title>	<link><![CDATA[http://www.goberl.com/archive/item37.aspx]]></link>	<description><![CDATA[<p><b>模表示法</b><br />
<br />
&nbsp; 为了描述RSA公钥加密系统，可以方便地采用记号x(mod m)来表示数值x被m除得到的余数，如9(mod 7)=2。注意，若x是一个0到m-1范围的整数，那么x( mod m)=x。<br />
数学告诉我们，若p和q是素数，m是从0到pq之间的一个整数，那么对于任意正整数k，有：</p>
<p style="text-align: center;"><img height="66" width="336" alt="" src="/fckeditor/FCKPro/upLoadFiles/image/RSA-1.png" /></p>
<p>假定p和q分别为素数3和5，m为整数4，对于此论断来说，对于任意正整数k，值mk(p-1)(q-1)除以15将产生余数1。具体说，若k=1，则：</p>
<p style="text-align: center;"><img height="48" width="521" alt="" src="/fckeditor/FCKPro/upLoadFiles/image/RSA-2.png" /></p>
<p>若k=2时：</p>
<p style="text-align: center;"><img height="40" width="521" alt="" src="/fckeditor/FCKPro/upLoadFiles/image/RSA-3.png" /></p>
<p>&nbsp;</p>
<p><b>公钥密码学</b><br />
<br />
现在我们将在RSA算法的基础上建立和分析一个加密系统，首先挑选两个素数p和q，它们的乘积用n表示。然后挑选另两个正整数e和d，使得对于某个正整数k，有e&times;d=k(p-1)(q-1)+1。值e和d分别是加密和解密过程的组成部分（已被证明是数学事实）。<br />
于是我们选取了五个值：p、q、n、e、d。值e和n是加密键，值d和n是解密键。值p和q值用来建立加密系统。</p>
<p style="text-align: center;"><img height="92" width="521" src="/fckeditor/FCKPro/upLoadFiles/image/RSA-4.png" alt="" /></p>
<p>&nbsp;</p>
<p><b>加密过程</b><br />
<br />
现在来看消息怎样加密，这里假定一个消息编码为位模式（ASCII或Unicode），翻译为二进制时这个位模式的值小于n（如果它不小于n，就得把消息分割成小段，再分别对每段进行加密）。<br />
假设翻译为二进制表示时，我们的消息表示为值m。于是消息的加密版是值c=me(mod n)的二进制表示。就是说，加密后的消息是me除以n所得余数的二进制表示。</p>
<p style="text-align: center;"><img height="75" width="521" src="/fckeditor/FCKPro/upLoadFiles/image/RSA-4-5.png" alt="" /></p>
<p>&nbsp;</p>
<p><b>解密过程</b><br />
<br />
为了对以二进制表示的值所表示的信息解密，要计算cd(mod n)。就是计算cd，结果除以n，保留余数。这个余数就是原消息m。因为：</p>
<p style="text-align: center;"><img height="372" width="424" alt="" src="/fckeditor/FCKPro/upLoadFiles/image/RSA-5.png" /><br />
<img height="72" width="521" alt="RSA" src="/fckeditor/FCKPro/upLoadFiles/image/RSA-6.png" /></p>
<p>&nbsp;</p>
<p><b>总结</b> <br />
<br />
概括来说，一个RSA系统的产生是通过选取两个素数p和q，再从这两个数产生值n、e、d。值n和e用来加密消息，即公钥。值n和d用来解密信息，即私钥。这种系统的漂亮在于，知道如何加密消息，却不能解密消息。所以加密键n和e可以广泛传播，确实，即使你的对手可能得到这些加密键，他们还是不能对截取的消息进行解密。因为只有知道解密键的那个人才能解密消息。<br />
这种系统的安全所基于的基础是，只知道加密键n和e，不允许计算解密键d和n，但是，有做这种事的算法呀！一种方法可以找值n的因数来发现值p和q，再找一个值k，使得k(p-1)(q-1)+1被e整除（商为d），而确定d。另一方面，这个过程的第一步就可能是费时的（尤其如果值p和q取得非常大）。事实上，如果p和q大得其二进制表示需要几百位，那么即使最著名的求因数算法也要花上几年的时间才能从n求出p和q。因此，一个加密消息的内容，即使是在其保密性要求已经过时很久后，它的安全性仍会保持。</p>
<p style="text-align: center;"><img height="431" width="521" src="/fckeditor/FCKPro/upLoadFiles/image/RSA-7.png" alt="RSA" /></p>
<p>&nbsp;</p>]]>	</description>	<pubDate>2009-1-4 0:43</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item37.aspx</guid></item><item>	<title><![CDATA[EAN-13校验码]]></title>	<link><![CDATA[http://www.goberl.com/archive/item36.aspx]]></link>	<description><![CDATA[<p><a href="http://baike.baidu.com/view/1192234.htm">EAN-13</a>校验码生成过程：</p>
<ol>
    <li>从代码位置2开始，所有偶数位的数字代码求和为S1；</li>
    <li>将S1&times;3得到S2；</li>
    <li>从代码位置序号3开始，所有奇数位的数字代码求和为S3；</li>
    <li>将S2+S3=S4;</li>
    <li>取S4的个位数为S5；</li>
    <li>将10-S5=S6；</li>
    <li>S6便为该条形码的校验码。</li>
</ol>
<p>考虑计算234235654652的校验码<br />
<img height="434" width="500" style="margin: 0px auto;" src="/fckeditor/FCKPro/upLoadFiles/image/EAN-13.png" alt="" /></p>]]>	</description>	<pubDate>2009-1-4 0:13</pubDate>	<category><![CDATA[Mis]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item36.aspx</guid></item><item>	<title><![CDATA[改进判断图片格式的方法]]></title>	<link><![CDATA[http://www.goberl.com/archive/item35.aspx]]></link>	<description><![CDATA[<p>在机房值班，由于浏览器是IE6，博客背景图片png的半透明效果没有正常显示出来&mdash;&mdash;该呈现半透明的却成了灰色，看着就不舒服。</p>
<p>当时是为了增加背景的圆角效果，不想用html或者js实现，就用了一个半透明的png图片。自己一直用Firefox和IE7，所以调试和浏览的时候也没注意到这个问题。在网上搜索了一下实现IE6支持半透明，方式方法很多，可考虑到兼容性，也没打算修改。</p>
<p>不过在浏览《<a class="singleposttitle" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/forward/archive/2008/01/11/1035367.html">IE6 透明图片 DIV + CSS</a> 》的时候，读到里面&ldquo;<span style="color: #808000">gif要是真正的gif格式才可以 </span>&rdquo;让我想起上次用QQ相册上传图片的事。当时我要上传的图片格式是BMP的，上传时说格式不正确，我直接把后缀名改没jpg，上传仍然说格式不正确，也没在意那个现象。直到刚才我才意识到，判断图片格式的时候不应该用后缀名判断。</p>
<p>判断图片格式不应该用后缀名判断，这是为了安全性。web程序上传图片一般都需要判断格式，以前看MSDN和别人的代码都是用后缀名判断图片格式，也没意识里面的安全隐患。.NET判断图片格式是<a href="http://zhidao.baidu.com/question/61749459.html?si=3">用Image.RawFormat来判断</a>的。以下是RawFormat的一些对应码。</p>
<p class="CodecSharp">ImageFormatUndefined := &quot;{B96B3CA9-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatMemoryBMP := &quot;{B96B3CAA-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatBMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatEMF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{B96B3CAC-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatWMF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{B96B3CAD-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatJPEG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatPNG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatGIF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatTIFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatEXIF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{B96B3CB2-0728-11D3-9D7B-0000F81EF32E}&quot; <br />
ImageFormatIcon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{B96B3CB5-0728-11D3-9D7B-0000F81EF32E}&quot;</p>
<p class="CodecSharp">ImageCodecBMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{557CF400-1A04-11D3-9A73-0000F81EF32E}&quot; <br />
ImageCodecJPG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{557CF401-1A04-11D3-9A73-0000F81EF32E}&quot; <br />
ImageCodecGIF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{557CF402-1A04-11D3-9A73-0000F81EF32E}&quot; <br />
ImageCodecEMF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{557CF403-1A04-11D3-9A73-0000F81EF32E}&quot; <br />
ImageCodecWMF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{557CF404-1A04-11D3-9A73-0000F81EF32E}&quot; <br />
ImageCodecTIF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{557CF405-1A04-11D3-9A73-0000F81EF32E}&quot; <br />
ImageCodecPNG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{557CF406-1A04-11D3-9A73-0000F81EF32E}&quot; <br />
ImageCodecICO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{557CF407-1A04-11D3-9A73-0000F81EF32E}&quot;</p>
<p class="CodecSharp">JPEG <br />
EncoderTransformation&nbsp;&nbsp; := &quot;{8D0EB2D1-A58E-4EA8-AA14-108074B7B6F9}&quot; <br />
EncoderQuality&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}&quot; <br />
EncoderLuminanceTable&nbsp;&nbsp; := &quot;{EDB33BCE-0266-4A77-B904-27216099E717}&quot; <br />
EncoderChrominanceTable := &quot;{F2E455DC-09B3-4316-8260-676ADA32481C}&quot;</p>
<p class="CodecSharp">TIFF <br />
EncoderCompression&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{E09D739D-CCD4-44EE-8EBA-3FBF8BE4FC58}&quot; <br />
EncoderColorDepth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{66087055-AD66-4C7C-9A18-38A2310B8337}&quot; <br />
EncoderSaveFlag&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := &quot;{292266FC-AC40-47BF-8CFC-A85B89A655DE}&quot;<br />
<br />
来自：<a href="http://blog.blueshop.com.tw/yowcheng/archive/2007/07/01/51831.aspx">http://blog.blueshop.com.tw/yowcheng/archive/2007/07/01/51831.aspx</a></p>]]>	</description>	<pubDate>2008-12-27 20:09</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item35.aspx</guid></item><item>	<title><![CDATA[第一次使用手机发布日志]]></title>	<link><![CDATA[http://www.goberl.com/archive/item34.aspx]]></link>	<description><![CDATA[<p>多日未更新博客了，只因考试忙“复习”。说是忙复习，其实并非复习，平时上课都盯着前面的幻灯片，自己不在书上动一笔一墨，等期末了，全书还如同新书。要考试了才来边回忆边学习，所以复习也并非复习了。</p><p>今晚考了《计算机网络》，有点危险。接下来的三门考试要轻松些了。元旦放假四天，然后收假回来在没有课程和考试安排的几天里悠闲地等待寒假的到来。</p><p>今晚第一次使用手机发表日志，兴许遇到Bug。</p>]]>	</description>	<pubDate>2008-12-24 8:05</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item34.aspx</guid></item><item>	<title><![CDATA[我们从远古走来]]></title>	<link><![CDATA[http://www.goberl.com/archive/item33.aspx]]></link>	<description><![CDATA[<p>从校园网FTP服务器上下载了3部《探索&middot;发现》的&ldquo;考古中国&rdquo;系列视频，大约有15部。看了爽得我不行了，不得不叹服先辈们的智慧。</p>
<p>最有印象的是秦始皇之墓、中山靖王之墓、朱元璋之墓、三星堆遗址。虽然目前为止，由于技术原因始皇墓仍未发掘，但从他的兵马俑和秦长城的壮观中我们已经能够领略这千古一帝当初的风采了。也由于历史文献对始皇地宫记述的缺少，人们也无法获知这个&ldquo;伟大&rdquo;人物的&ldquo;寝宫&rdquo;内有些什么，仅仅只能从司马迁的《史记》里面读到<span style="color: rgb(128, 128, 0);">&ldquo;始皇初继位，穿治郦山，及并天下，天下徒送诣七十万人，穿三泉，下铜而致椁，宫观百官奇器珍怪徙臧满之。令匠作机弩矢，有所穿近者，辄射之。以水银为百川江河大海，机相灌输，上具天文，下具地理。以人鱼膏为烛，度不灭者久之。&rdquo;</span>修建时间之久、修建人数之多足以说明其工程的巨大。解说词讲到，经测定秦皇地宫距地面30多米，内有大约100吨的水银。同时，其水银可能主要来自四川东北部。除去生产100吨水银的工程难度，要把100吨重的水银运送到几百公里之外的地方，在当时的交通情况下，我们现在真的是难以想象的。</p>
<p>而中山靖王刘胜之墓让我感到惊奇的是他身上穿的&ldquo;金缕玉衣&rdquo;，一种用1公斤多重的金线和2400多片玉片穿织而成的衣服。在这发掘之前，人们还仅能从古书记载中读到金缕玉衣，以为那只是传说，可事实让人们开眼了。明朝开国皇帝朱元璋之墓也是壮观得很，除了在地下修建如皇宫般的建筑外，在外面盖上土之后，还得在上面修建大规模的皇宫般建筑群。用汉白玉做成的巨大石门，一件需要花费十年才能做成的衣服，这些都不得不让人感叹。</p>
<p>虽然，这些辉煌的成就、帝国的强大都成为历史，可他们给我们留下了不灭的文化；那些宏伟的建筑、精妙的手工制品正是文化的一种载体，具有不灭文化的民族是有希望的民族。我朋友曾经跟我说道：你发现没有？占中国主导文化的汉文化具有强大的生命力，即使被我们的少数名族统治，比如元、清统治，他们也会被我们同化、融合。这说明了文化的强大感染力和号召力。中国现在也在努力发展软实力，文化也是重要的一部分。像孔老夫子这样没有高大宏伟墓地的人却仍然被人们所称道，为何呢？他对中国文化影响太深远了。历史的丰碑是不能用现实中的石碑、玉石来替代的，他需要万千人们的共同努力。</p>
<p>&hellip;&hellip;</p>
<p><span style="color: rgb(128, 128, 0);"><strong>用历史对照自己；用历史激励自己；在历史中寻找自己&mdash;&mdash;我们从远古走来！</strong></span></p>]]>	</description>	<pubDate>2008-12-13 19:48</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item33.aspx</guid></item><item>	<title><![CDATA[考试了]]></title>	<link><![CDATA[http://www.goberl.com/archive/item32.aspx]]></link>	<description><![CDATA[<p>下周开始得期末考试了，忙着复习。挂了可不好过，不但麻烦还得交Money.</p>
<p>《管理信息系统》《计算机网络》《应用统计》《信息管理学》一门一门的就来了。<img src="/fckeditor/editor/images/smiley/myface/img2.gif" alt="" /></p>]]>	</description>	<pubDate>2008-12-7 0:59</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item32.aspx</guid></item><item>	<title><![CDATA[一款碎片整理工具]]></title>	<link><![CDATA[http://www.goberl.com/archive/item31.aspx]]></link>	<description><![CDATA[<p>从去年开始，一直都是用Disk Defrag整理系统碎片。Disk Defrag整理碎片最大的特点就是快捷，其次是占用较低的资源。如果用Winodws自带的碎片整理工具，通常是挂半天的机让它慢慢地磨&mdash;&mdash;我忍受不了那个如蜗牛一样的处理软件啊。</p>
<p>Disk Defrag还有一个吸引人的地方是它那赏心悦目的程序处理界面，模拟显示磁盘上的每一个碎片、已经整理的碎片，同时显示当前处理的文件，这给人一种高效 的感觉。而Windows自带工具就仅仅显示一个处理进度的百分比和缓慢变化的图像，有时候二三十分钟都不动一下，给人感觉像是这程序都无响应了。</p>
<p>Disk Defrag的官方下载地址：<a href="http://www.auslogics.com/en/software/disk-defrag">http://www.auslogics.com/en/software/disk-defrag</a></p>
<p style="text-align: center"><img style="width: 566px; height: 444px" alt="碎片处理工具" src="/fckeditor/FCKPro/upLoadFiles/image/Disk_Defrag.jpg" /></p>]]>	</description>	<pubDate>2008-12-1 0:59</pubDate>	<category><![CDATA[Google微软]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item31.aspx</guid></item><item>	<title><![CDATA[重温血色]]></title>	<link><![CDATA[http://www.goberl.com/archive/item30.aspx]]></link>	<description><![CDATA[<p>前两天又看了一片《血色浪漫》，从第9集开始看的。没有从第1集看，我怕我实在是忍受不了里面那伙人的调侃。这部连续剧的前几集和《阳光灿烂的日子》里面夏雨扮演的马小军那伙人差不多，一个一个的都不好好学习，主要精力都放在打架、追女孩子上去了。他们那打架简直就可以和古惑仔匹敌，拿着砖头打人没想过留不留活口。我听我爷爷说，那一代人都比较有血性，天不怕地不怕，不过都还比较有能耐&mdash;&mdash;可能是因为经过那个&ldquo;动乱&rdquo;的年代，经得起大风大浪，他们那代人，现在都应该成为了社会的主干吧。</p>
<p>我一好友曾对我说&ldquo;平生不看《血色浪漫》，枉活于世上&rdquo;，我当时不以为然，咋有那么严重，不就一电视剧嘛。可看过后，也觉得这是我这20年来看过的最好看的一部电视剧，可能是因为我也喜欢那个红色年代吧。我当时边看电影边截图，最后截了50多张上传到相册了。可能里面的台词太够经典了从而迷住了我，而那种台词不像《情深深，雨蒙蒙》那般诗意得让人无法想象，也不像《奋斗》里面的每一句台词都很幽默，幽默得我不敢相信世人都如此幽默。而更让我着迷的是那里面的一个个角色，真如现实般。真是<strong>性格决定命运</strong>啊，不同的性格走上了不同的道路。里面最让我惋惜的是宁伟&mdash;&mdash;一个被毒贩认为是超级杀手的特种兵，由于社会和个人性格原因，却走上了真正的杀手之路，到头来只能怪自己命不好自杀了。</p>
<p>谈到《血色浪漫》，又不得不说说里面的男人和女人。钟跃民、郑桐、袁军、张海洋、周晓白、秦岭、高玥。我都不愿评述他们每一个人的性格特点，因为我的表述无法展现一个完整的他们。<br />
现在还特别记得贴吧里的两个帖子《如果你是女人，你如何看待这几个男人》，《如果你是男人，你如何看待这几个女人》，由于有些人是看电视，有些是看小说，再加上不同人的不同认知，最后答案也就千差万别了。而我呢&mdash;&mdash;钟跃民这种人仅适合谈恋爱，郑桐很是浪漫，最喜欢高玥。</p>
<p>以下是当初收集的一点台词：</p>
<ol style="background-color: rgb(251, 237, 187);">
    <li>如果有人认为我卖煎饼很丢人的话,我只能说他是个俗人</li>
    <li>你有没有发现，当你回家，以前自己的恋人已经成为别人的老婆了</li>
    <li>任何承诺在时间面前都是苍白的</li>
    <li>一个没有未来的人很难想象他会忠于爱情</li>
    <li>靠劳动吃饭，永远不丢人</li>
    <li>托毛主席的福，俺也当上八路啦，俺娘说啦，不打死几个日本鬼子，不让回家。</li>
    <li>我们这里七男三女，狼多肉少！</li>
    <li>有天天拿着菜刀出门的诗人吗？</li>
    <li>就是有人往我嘴里撒尿，我也得张嘴接着，还得说跟他妈啤酒似的，味道好极了</li>
    <li>七岁那年你用李奶奶的炉子烧开水，李奶奶还说呢，呀！这孩子长大了懂事了知道烧开水了，结果怎么着．那水一开你拎起水壶直接浇花去了．这也是你小子干的吧</li>
    <li>最近刚看了一本书，对我教育意义挺大的，这本书的名字叫《雷锋同志的故事》</li>
    <li>唉，孙子，你丫不服，咱单练</li>
    <li>远看金鸡独立,近看骏马缺蹄,跑似风摆荷叶,躺在炕上不一般齐</li>
    <li>我们要从思想上教育他们，精神上感化他们</li>
    <li>革命只有分工不同，没有高低贵贱这分</li>
    <li>对待自己的阶级姐妹，就不能关心一下？</li>
    <li>全世界的无产阶级革命者，因为国际歌，就可以成为亲人</li>
    <li>我们是祖国的花朵，需要常浇水（多发点生活费）</li>
    <li>可还有这么种情况，狗熊本来不在意，因为对狗熊而言，掰棒子本是一种嗜好，并不一定要吃，就算是掰着玩吧，可有的棒子却当了真，主动把脑袋伸过去，狗熊当然来者不拒，于是棒子就提出进一步要求，要狗熊停止掰棒子的嗜好，一辈子只吃这一根棒子。狗熊当然做不到。</li>
    <li>胜不妄喜,败不妄馁,胸有惊雷而面如平湖者,可拜上将军&nbsp; &nbsp;</li>
    <li>凯鲁亚尅的那句话说得真好，我还年轻，我渴望上路，带着最初的激情，寻找着最初的梦想，感受着最初的体验，我们上路吧！</li>
    <li>三大纪律八项注意第七条：不许调戏妇女。</li>
    <li>你要是再看见大胖女人，你就上去 啪 啪 给她俩大耳刮子,然后你再对她说,我告诉你,你要是再敢勾引我爸, 我他妈还抽你!(袁军声情并茂地对王小三的教唆)</li>
    <li>是女人都比它苗条</li>
    <li>你丫不服，咱俩找地儿单练！</li>
    <li>吴满囤说：&ldquo; 俺们老家穷，穷的要死，我下面还有6、7个弟弟妹妹，我们都吃不饱饭，每天尽吃些 野菜糊糊，吃的我两眼都发绿，两腿直打摆子。&rdquo;</li>
    <li>美国货，点儿三八口径，这消声器也挺配套的，比我那可乐牌的消声器可强多了</li>
    <li>你知不知道我这样 很他妈难过</li>
    <li>我五十多岁的老头子泡二十岁的妞，老牛吃嫩草，我还长脸了呢！</li>
    <li>秦岭：一个男人为一个女人花了很多钱 那个女人是该忠实于那个男人 ，这毕竟是个男权的社会，而男权社会的种种道德法则就是约束女人的</li>
    <li>几年没见，真是个女医生的形象了 ，举手投足之间 ，都透出着一种从容不迫胸有成竹的气度，一看就知道这是一医术精湛的医生，肯定连盲肠手术都能做</li>
    <li>毒贩子：你们在部队好好的，干吗来这里（热带丛林）？钟：我说来采蘑菇的，你信吗？&nbsp;</li>
</ol>]]>	</description>	<pubDate>2008-11-30 2:43</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item30.aspx</guid></item><item>	<title><![CDATA[ASP.NET之AJAX Extensions]]></title>	<link><![CDATA[http://www.goberl.com/archive/item29.aspx]]></link>	<description><![CDATA[<p>上次在修改评论模块的验证机制时，Ajax用到了AJAX Extensions。第一次把它用到实际作品中，也就难免犯错误，当时耗费了我不少的力气才找出错误的根源。故在此谈谈用后的一点思绪。</p>
<p><br />
<strong>1.如果web服务中暴露给客户端调用的方法中需要用到Session，则需要设置EnableSession。</strong>如：</p>
<pre class="CodecSharp" id="CodecSharp0"><a onclick='copyCodeByID(0)' href="javascript:void(0);">复制代码</a> 
    [WebMethod(EnableSession = <span class="code-keyword">true</span>)]
    <span class="code-keyword">public</span> <span class="code-keyword">string</span> DeleteCommentByID(int replayID)
    {
       <span class="code-note">//删除评论<br /></span>    }
</pre>
<p>每一个暴露给客户端的方法或者类都需要关键字[WebMethod],同时需要引入 System.Web.Script.Services空间，以及添加关键字[ScriptService]</p>
<p><br />
<strong>2.如果前台Javascript调用后台类中的方法，传递的参数个数不一致，会导致页面下载、显示缓慢，呈现服务器忙的状态；运行调用方法的Javascript，IE提示错误&ldquo;缺少对象&rdquo;。</strong><br />
前台调用后台类方法的一般格式为<span style="color: rgb(128, 128, 0);">[nameSpace].className.方法名称(param1,param2,&hellip;&hellip;,succeededCallback, failedCallback, userContext).</span></p>
<ul>
    <li>nameSpace是命名空间;</li>
    <li>className是类名称;</li>
    <li>param1、param2&hellip;&hellip;是传递的参数;</li>
    <li>succeededCallback是成功调用后执行的Javascript函数;</li>
    <li>failedCallback是调用失败后要执行的Javascript函数;</li>
    <li>userContext是用户上下文对象。</li>
</ul>
<p>在上述格式中，命名空间、succeededCallback、failedCallback、userContext是可选的。需要注意的是如果省略了 前面的某一个参数，却又保留了后面的参数，则需要为前面的参数留下空位置。如：[nameSpace].className.方法名称 (param1,param2,&hellip;&hellip;,succeededCallback, , userContext)中省略了failedCallback但保留了userContext，则需要用双逗号留下空位置。</p>
<p>我不喜欢用UpdatePanel，因为我不能接受这个控件带来的程序性能。虽然说用了它可以大大减轻编程人员的负担&mdash;&mdash;一个对Javascript一点 也不了解的人可以利用这个控件生成具有强大功能的Ajax页面，因为编程人员不必为Ajax页面写一句Javascript代码，可想而知此控件功能的牛 &times;。不过如果遇到大量如同表格类数据，又需要分页、排序、修改、删除等功能的，如果对性能要求不是很高还是可以考虑它的，毕竟可以为我们节省开发时间。提 高了开发效率就降低了程序的运行性能，鱼和熊掌难以兼得啊。</p>]]>	</description>	<pubDate>2008-11-26 5:29</pubDate>	<category><![CDATA[Bug回收站]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item29.aspx</guid></item><item>	<title><![CDATA[这是个境界问题]]></title>	<link><![CDATA[http://www.goberl.com/archive/item28.aspx]]></link>	<description><![CDATA[<p>发现自己最近总是大喜大悲，喜怒无常。自己的情绪不那么容易控制，说话时为了产生强烈效果通常是&ldquo;无所不用其极&rdquo;。外界很小的事物也会对我产生强烈刺激。我还以为自己是嫉恶如仇，其实是心感愤懑，人家古人愤懑是因为忧国忧民，我却因&ldquo;小人&rdquo;小事&mdash;&mdash;思想境界问题！</p>
<p><br />
&ldquo;这是一个浮躁的社会&rdquo;，我也难逃这浮躁的心情。我看不惯自我为中心，跑去网站激动了几句，打算洗个澡睡觉，等明天来反省今天的思绪和行为。人总会有激动的时候，憋久了会出问题的，所以得发泄发泄，可这发泄总不能建立在他人的痛苦之上。初中时的思想政治书中有一引文诉说了一个故事：侍从知道了国王长着驴耳朵的秘密，总是不吐不快，于是他每天都要跑到一个挖好的小洞旁大声地说：国王长着驴耳朵，借此来发泄。这就是很好的发泄方式，可我今天没有挖洞，我是跑去激动地说了几句。</p>
<p style="text-align: left;"><br />
突然想到一首与这个标题无关的诗，鲁迅的<strong>《自嘲》</strong>：</p>
<p style="text-align: center;"><strong>运交华盖欲何求？未敢翻身已碰头。</strong><br />
破帽遮颜过闹市，漏船载酒泛中流。<br />
横眉冷对千夫指，俯首甘为孺子牛。<br />
躲进小楼成一统，管他冬夏与春秋。</p>]]>	</description>	<pubDate>2008-11-22 5:45</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item28.aspx</guid></item><item>	<title><![CDATA[上周星期六]]></title>	<link><![CDATA[http://www.goberl.com/archive/item27.aspx]]></link>	<description><![CDATA[<p>上周星期六头脑发热，突然想做一个运用到PR的应用&mdash;&mdash;类似hao123的博客导航站点。可经过一晚上的&ldquo;清醒&rdquo;，却又觉得没有多大价值，于是只好放弃，可这不能抹杀我对PR查询实现原理的好奇心。到百度、google中国上搜索PR查询实现原理，没发现结果，最后还是在google.com上搜索到一篇讲述ASP.NET实现PR查询的文章。（<a href="http://www.codeproject.com/KB/aspnet/Google_Pagerank.aspx">Request Google&acute;s Pagerank programmatically </a>）也就做了一个<a href="http://www.goberl.com/functionAspx/checkPageRank.aspx">查询Google Pagerank</a>的页面，这次头脑热也就这样结束了。<br />
<br />
那天看了网友唏嘘一世给我的留言，采用了他的文章《<a href="http://www.xixuyishi.com/Blogs/?Show=Log&amp;LogID=94">日志评论的审核机制</a>》里面的方法，修改了留言模块的验证机制，在此表示感谢！同时增加了博主回复功能、邮件提示功能。并且把原来的纯Javascript实现的Ajax换成了 atlas&mdash;&mdash;直接调用后台的web服务，感觉好轻松，Javascript直接调用后台web服务中的public方法，是如此的简单和清晰。后台不再需要通过Request来验证和获取数据了，因为传输的数据直接在调用的方法（函数）里面传递过去了；传输的数据也不需要担心&amp;、+、?等特殊符号的传递问题了。不过有点感觉不爽的是生成的页面里有几个网址很&ldquo;乱&rdquo;的script引用，这或多或少地影响网页的下载速度啊。在写这个版本的博客时，我还没接触atlas，所以就没用到它，经过这次使用才发现工作的高效性和程序的稳定性（对我来说）啊。</p>
<p>昨晚在更新web.config的时候，没有注意里面的enableViewState为false，印象中也误以为在页面里面把它设置成true可覆盖web.config中的设置，结果害得我的DropDownList无法获取值，调试了2小时才找到web.config的enableViewState，将其改为true，立马正常了。哎~~这么小的一个错误又调试了2~3小时，什么效率呢？<img src="/fckeditor/editor/images/smiley/myface/img23.gif" alt="" /></p>]]>	</description>	<pubDate>2008-11-18 17:10</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item27.aspx</guid></item><item>	<title><![CDATA[关于百度的&quot;中国证券&quot;]]></title>	<link><![CDATA[http://www.goberl.com/archive/item26.aspx]]></link>	<description><![CDATA[<p>为了不让百度的机器人看见在揭它主人的短，以下称百度为BD。</p>
<p>上面的一句话就看得出下面不会说BD的好，不过首先声明我不是故意挑人家的短处来说的。</p>
<p>先说说为什么我要取这样一个标题。看看这个链接<span style="text-decoration: underline;">，</span><a href="http://www.baidu.com/s?wd=%D6%D0%B9%FA%D6%A4%C8%AF">中国证券</a>，这是一个在BD搜索&ldquo;中国证券&rdquo;的网址。这个关键词出现的搜索结果的第一页全是BD的推广&mdash;&mdash;是不是很刺激呢？其实，在我发现这个关键词之前，我在网上看到一种说法&mdash;&mdash;用BD查询信息，第一第二页全是&ldquo;推广&rdquo;，我当时还不以为然&mdash;&mdash;BD会&ldquo;笨&rdquo;到全篇幅都来做广告吗？看来的确是实践是检验真理的唯一标准啊，主观臆断是很容易出错的，这个&ldquo;中国证券&rdquo;的关键词足以说明第一第二页全是广告的可能。其实呢，无论是只有1页全是广告，还是只有2页全是广告，都无法掩盖BD广告泛滥的事实。</p>
<p>其实呢，仅仅一个广告泛滥还是无法破坏BD在我心目中的神圣地位的，人家免费给你提供搜索服务，做一点广告难道就过分了。可偏偏又让我看到一篇&ldquo;<span>BD</span><strong><span>遭遇中国网络反垄断调查第一案</span></strong>&rdquo;的文章，文章中叙述了几家公司遭遇BD垄断的事情。看完后心寒啊，如果文章中描述的都是事实我不得不想感叹&mdash;&mdash;民族品牌咋就没有一点民族的味道呢，却还偏偏搞自家人&mdash;&mdash;XX乳业公司奶粉害了人，不是花心思去关心卧病在床受病痛折磨的病人，而是在那花大力气大声的喊&ldquo;我们的生产经过&hellip;检验&hellip;&hellip;保证健康&rdquo;。没一点社会责任感，有的全是自己的生存、发展、利益，这怎能让我们都来捧我们的国货呢？</p>
<p style="text-align: center;"><img height="427" width="540" src="/fckeditor/FCKPro/upLoadFiles/image/baiDu.jpg" alt="百度推广" /></p>]]>	</description>	<pubDate>2008-11-14 4:45</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item26.aspx</guid></item><item>	<title><![CDATA[网络广告]]></title>	<link><![CDATA[http://www.goberl.com/archive/item25.aspx]]></link>	<description><![CDATA[<p>博客上的广告挂了有一个月了，通过这个月的后台数据、<wbr></wbr>前台广告内容现总结如下几点。以下观点仅个人意见，谢谢！<br />
<br />
一、<strong>对于小流量的站点挂广告，最大的受益者是广告提供商</strong>。<wbr></wbr>这就有点像那天<b>扫视</b>到的某一新闻节目中提到的&mdash;&mdash;<wbr></wbr>生产商明知道产品不合格，会有人投诉、理赔甚至会被罚款，<wbr></wbr>可他们还是会坚持生产。为何？<wbr></wbr>假设1000位用户发现产品不合格了，而实际要求赔偿恐怕不多，<wbr></wbr>特别是那些小商品，<wbr></wbr>一般人不会因为一瓶矿泉水没有达到标准净重而上法庭。<wbr></wbr>所以当这1000件不合格产品中绝大多数产品不要求赔偿时，<wbr></wbr>生产它们是盈利的。而拿到网络广告上来说呢，<wbr></wbr>由于小流量的站点很难筹集到广告服务商设置的最小支付金额，<wbr></wbr>当N多个小站点都出现这种情况时会发现广告的覆盖面在增加，<wbr></wbr>而成本却没有增加，所以最大的受益者是广告提供商。<wbr></wbr>其实这里说的小流量站点是指点击数较低的站点。<br />
<br />
二、<strong>网站内容严重影响点击率</strong>。首先内容决定用户，<wbr></wbr>而用户又决定点击率。<wbr></wbr>如果你的站点内容是一些IT类的技术性文章，<wbr></wbr>访问这些页面的人必然是熟悉网络的网虫，<wbr></wbr>你想让他们点击你挂载的广告，恐怕比较难。<wbr></wbr>而如果你的访问者是一些对网络不甚了解的人，<wbr></wbr>而你的广告内容又是一些让人产生好奇心使人产生联想的链接，那你可以乐一乐了。<br />
<br />
三、<strong><font size="-1">AdSense</font>可以为你的网页优化提供一些参考</strong>。<wbr></wbr><font size="-1">AdSense提供的广告的特点是广告内容与网页内容相联系。</font>这有什么参考价值呢？Google的机器人分析你的网页内容，<wbr></wbr>获取了某些关键字，这些关键字这在一定程度上（可能Google的爬虫看到的不是这些关键字，同时由于广告是有限的，不可能任何内容都有与之相匹配的广告）显示了Google机器人在你网页上看到了什么。通过显示的广告内容，你可以选择性地强化那些关键字。<br />
<br />
四、<strong>广告数量得合理</strong>。<wbr></wbr>别搞得广告内容比网页实际内容还多，通常那些黄色网站就爱用这招&mdash;&mdash;因为你的一不小心，就&ldquo;踩&rdquo;上了广告 。<br />
<br />
五、<strong>本人PS太菜</strong>，不能做漂亮图片，遂采用简约风格。为了增加一点视觉效果，仍然留一图片广告，点缀点缀！</p>]]>	</description>	<pubDate>2008-11-8 18:06</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item25.aspx</guid></item><item>	<title><![CDATA[校庆前后]]></title>	<link><![CDATA[http://www.goberl.com/archive/item24.aspx]]></link>	<description><![CDATA[<p>近期Blog没有更新，一是因为<a href="http://www.google.cn/search?q=%E8%A5%BF%E5%8D%97%E7%9F%B3%E6%B2%B9%E5%A4%A7%E5%AD%A6%E6%A0%A1%E5%BA%8650%E5%91%A8%E5%B9%B4&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:zh-CN:official&amp;client=firefox-a">校庆</a>忙着耍去了，人啊就是懒，二是因为在瞎搞那个古惑仔外挂。今天突然觉得做那个不是外挂的外挂很恼火：首先说实现它的原理很简单，没有多大的学习价值，其次是没有多大实用价值（可能仅仅可以满足一下我的虚荣心吧）。不过通过写这个小玩样儿，我才发现自己没有真正理解什么是面向对象编程（OOP），写那些代码都不敢拿出来让人看，自己都觉得很零乱，没有面向对象的味道啊。<br />
<br />
这周跑了几趟图书馆，昨还去把我的借书卡换了下&mdash;&mdash;实在是烂得不像样，本来质量就差可又被我放衣服兜里一洗，真可谓惨不忍睹。本来是想去图书馆上自习复习复习的，可一跑去就被那些图书分类号为TP*的图书给吸引了，瞎逛了下，发现了一本《C#技术内幕》。看来2章，大有感触。我才发现&mdash;&mdash;没进图书馆时，觉得图书馆太远跑去了也可能看不进去；可进去了才想感叹&mdash;&mdash;书山有路勤为径。不知道为何，总不喜欢去那，感觉人太多，静不下来，所以通常是借了书到教室看。<br />
<br />
现发布古惑仔外挂FightIngV1.5.1的所有源码（由于本人自学C#仅7月，又主要偏向于asp.net，故请谅解此代码的混乱，此源码基于VS2005 C#），不再打算发布新版本FightIng了。<a href="http://www.goberl.com/fckeditor/FCKPro/upLoadFiles/file/FightIngV1_5_1Source.rar">源码下载</a></p>]]>	</description>	<pubDate>2008-11-7 4:47</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item24.aspx</guid></item><item>	<title><![CDATA[校内网古惑仔之横行天下外挂下载]]></title>	<link><![CDATA[http://www.goberl.com/archive/item23.aspx]]></link>	<description><![CDATA[<p><strong>下载地址：</strong><strong><br />
<br />
</strong>&nbsp; <a href="http://www.goberl.com/userashx/fileDownLoad.ashx?fn=FightIng_V1.5.1.rar">古惑仔横行天下挂机外挂v1.5.0修订版</a>（<strong>已修复</strong><a href="http://www.goberl.com/userashx/fileDownLoad.ashx?fn=FightIng_V1.5.0.rar">v1.5.0</a><strong>中一特大Bug</strong>）&mdash;&mdash;办假证~黑吃黑。已更新 2008 年 11 月 5 日.（游戏已改版，黑吃黑任务已经不能执行）</p>
<ul>
    <li><span style="color: rgb(255, 0, 0);"><strong>不再计划发布新版本，谢谢各位的支持.<br />
    </strong></span></li>
    <li><strong><span style="color: rgb(128, 128, 0);"><span style="color: rgb(255, 0, 0);">请不要使用任何下载工具下载，仅支持浏览器默认下载。若是由于是非电信用户无法下载，请<a href="mailto:Guijunyao@gmail.com?subject=FightIng%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD">Email</a></span></span></strong><span style="color: rgb(255, 0, 0);"><strong>.<br />
    </strong></span></li>
    <li><span style="color: rgb(255, 0, 0);"><strong>如果发现安装缓慢，请下载</strong></span><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5"><span style="color: rgb(255, 0, 0);"><strong>Microsoft.NET Framework 2.0</strong></span></a><span style="color: rgb(255, 0, 0);"><strong>安装后再运行安装.</strong></span></li>
</ul>
<p>&nbsp;V1.5.0特征：</p>
<ol>
    <li><span style="color: rgb(128, 128, 0);">做完任务5+10+5=20秒后自动存钱&mdash;&mdash;降低进监狱概率、降低被抢劫现金的概率</span></li>
    <li><span style="color: rgb(128, 128, 0);">在刷新页面(执行任务的时间周期会刷新页面)5秒</span><span style="color: rgb(128, 128, 0);">后</span><span style="color: rgb(128, 128, 0);">执行任务&mdash;&mdash;降低进监狱概率</span></li>
    <li><span style="color: rgb(128, 128, 0);">手动设置执行任务和存钱的时间周期。<strong>执行任务与存钱的时间之差必须大于5秒，否则无法执行</strong>（<span style="color: rgb(255, 0, 0);">需要重新启动程序才能生效</span>）</span></li>
    <li><span style="color: rgb(128, 128, 0);">自动记录上次任务（<strong>不同账号的登陆，请注意重新选择任务</strong>）</span></li>
    <li><span style="color: rgb(128, 128, 0);">通过存储用户名和密码（&ldquo;个性化设置&rdquo;内的用户名和密码），启动程序后自动运行任务并最小化到任务栏</span></li>
    <li><span style="color: rgb(128, 128, 0);">通过输入用户名和密码（&ldquo;个性化设置&rdquo;内的用户名和密码），且把程序快捷方式放入开始菜单的&ldquo;启动&rdquo;里面可实现开机自启动、自动运行上次运行的任务、自动最小化到右下角</span></li>
    <li><span style="color: rgb(128, 128, 0);">修改了&ldquo;黑吃黑&rdquo;任务的检查机制。（由于本人账号不足30级，没有经过测试，如发现无法执行本任务，请Email或者留言）</span><span style="color: rgb(128, 128, 0);"><br />
    </span></li>
    <li><span style="color: rgb(128, 128, 0);">对于某些玩家说的会弹出脚本错误的情况，可以把系统的IE6.0升级到IE7.0解决此问题</span></li>
    <li><span style="color: rgb(128, 128, 0);">由于这次改动交大，又没有账号进行仔细的测试，所以Bug难免，望各位指出，谢谢！</span></li>
</ol>
<p><br />
&nbsp; <a href="http://www.goberl.com/userashx/fileDownLoad.ashx?fn=FightIng_V1.4.1.rar">古惑仔横行天下挂机外挂v1.4.1</a>&mdash;&mdash;办假证~黑吃黑。已更新 2008 年 11 月 1 日.&nbsp; <br />
&nbsp;&nbsp; <a href="http://www.goberl.com/userashx/fileDownLoad.ashx?fn=FightIng_V1.4.0.rar">古惑仔横行天下挂机外挂v1.4.0</a>&mdash;&mdash;办假证~海上走私、黑吃黑（<strong>待测试</strong>），现金大于3000时自动存钱。已更新 2008 年 10 月 31 日.<br />
&nbsp; <br />
<strong>下载说明：</strong><br />
<br />
&nbsp; <strong><span style="color: rgb(128, 128, 0);">后续版本（更高等级的任务）的下载将在本页更新。如有需求，请记住本页网址。<span style="color: rgb(255, 0, 0);"><br />
</span> </span></strong></p>
<hr />
<h2 style="text-align: center;">系统说明</h2>
<p><br />
<strong>1.系统功能</strong><br />
<br />
&nbsp;&nbsp; 为广大《古惑仔》玩家<span style="color: rgb(128, 128, 0);">自动执行任务</span>&mdash;&mdash;升经验，从而快速升级。<br />
<br />
<br />
<strong>2.系统要求</strong><br />
&nbsp;&nbsp; IE6.0++；<br />
&nbsp;&nbsp; Microsoft.NET Framework 2.0；<br />
<br />
<br />
<strong>3.使用说明</strong><br />
<br />
&nbsp;&nbsp; 请在运行软件后，输入用户名和密码、<span style="color: rgb(128, 128, 0);">勾选&quot;下次自动登录&quot;</span>登陆校内网，并点击相应链接或者点击&ldquo;〖打开古惑仔〗&rdquo;进入古惑仔任务页面（http://mob.xiaonei.com/job.do），然后选择你需要执行的任务即可。<br />
<br />
注意：<span style="color: rgb(128, 128, 0);">选择的任务必须是在满足精力的条件下能够执行的任务（武器、弟兄等条件均满足）</span>。 <br />
<br />
一台电脑只能运行一个账号。如果任务列表中没有你们的任务选择，请联系 Guijunyao(at)gmail.com<br />
<br />
同时，请各位谅解程序的中Bug，本人虚心接受各位的意见和建议....<br />
<br />
<strong>4.声明</strong><br />
<br />
&nbsp; <span style="color: rgb(0, 0, 255);"><strong>本程序纯属个人娱乐学习所用，任何个人或者组织都不得用于商业目的。同时，使用本程序乃自愿&mdash;&mdash;由使用本程序带来的后果自负。我们是应该遵循游戏公平的原则&hellip;&hellip;</strong></span><br />
&nbsp;<br />
<br />
<br />
&nbsp; 历史版本：<br />
<br />
&nbsp; <a href="http://www.goberl.com/userashx/fileDownLoad.ashx?fn=FightIng_1.0.3.rar">古惑仔横行天下挂机外挂v1.0.3</a>。已更新 2008 年 10 月 28 日<br />
&nbsp;&nbsp;<a href="http://www.goberl.com/userashx/fileDownLoad.ashx?fn=FightIng.rar">FightIng_1.0.2.rar</a> （古惑仔横行天下挂机外挂v1.0.2）<br />
&nbsp;</p>]]>	</description>	<pubDate>2008-10-30 22:41</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item23.aspx</guid></item><item>	<title><![CDATA[&quot;古惑仔之横行天下&quot;挂机外挂解析]]></title>	<link><![CDATA[http://www.goberl.com/archive/item22.aspx]]></link>	<description><![CDATA[<p><strong>下载最新版</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.goberl.com/archive/item23.aspx">古惑仔挂机外挂</a></p>
<p><strong>引言</strong><br />
前些日子，看见宿舍有同学在玩校内网的web游戏&mdash;&mdash;古惑仔之横行天下。发现其操作比较简单，无非就是点击不同页面的不同按钮来做任务、攻击、存/取钱。由于其升级主要靠做任务，遂写了一个不是外挂的外挂&mdash;&mdash;帮助玩家自动做任务。我之所以说它不是外挂，是由于到目前为止我还未见过如此简单的外挂。同时我在给它取名时，谓之&ldquo;<strong>FightIng</strong>&rdquo;。以下将把古惑仔之横行天下简称为&ldquo;古惑仔&rdquo;。</p>
<p><strong>FightIng工作原理</strong></p>
<p>1.正如我上面提到的，古惑仔游戏升级主要靠做任务，此外挂的目标就是帮助玩家做任务。而帮助玩家做任务的具体方法和步骤就是模拟点击(click)web页面中相应任务的按钮（input，type=&quot;sumit&quot;）。System.Windows.Forms.WebBrowser控件的InvokeMember方法能够帮助我们模拟点击该按钮。</p>
<p>2.由于页面中任务众多，但我们需要程序点击特定任务的按钮。如何到达到这一目标呢？.WebBrowser的Document为我们提供一个html文档树，它可以让我们轻而易举的获取某一任务的按钮并模拟点击(click)。</p>
<p>3.具体如何获取特定任务的按钮。经分析任务页面（job.do）的源码，发现所有任务的源码都被放在一个独立的&lt;form&gt;元素内。如下：</p>
<div class="CodecSharp">办假证 <br />
&lt;form name=&quot;&quot; action=<u>&quot;<span style="color: rgb(128, 128, 0);"><strong>./djob.do</strong></span></u>&quot; method=&quot;post&quot;&gt; 								<br />
&lt;input name=&quot;id&quot; value=&quot;<span style="color: rgb(128, 128, 0);"><u><strong>1</strong></u></span>&quot; type=&quot;hidden&quot;&gt; <br />
&lt;input class=&quot;sub_btn&quot; name=&quot;&quot; value=&quot;立刻行动&quot;   type=&quot;submit&quot;&gt; <br />
&lt;/form&gt;</div>
<p>注意上面的棕色字体部分。无论什么任务，唯一区别就在value的值不同，此处的value=&ldquo;1&rdquo;表示的任务为&ldquo;办假证&rdquo;。下面列出了1~20级的任务列表，前面的数字表示value的值。</p>
<ul>
    <li>1:办假证</li>
    <li>2:夜总会看场子</li>
    <li>3:替人追债</li>
    <li>4:抢地盘</li>
    <li>5:放高利贷</li>
    <li>6:砸赌场</li>
    <li>7:走私洋酒</li>
    <li>8:酿酒</li>
    <li>9:抢地下钱庄</li>
</ul>
<p>我们就可以通过WebBrowser.Document.GetElementsByTagName(&quot;form&quot;)来获取任务页面（job.do）所有的form元素。（<span style="color: rgb(128, 128, 0);">此处要注意，由于页面中存在不是任务的form，如搜索框。为了比避免出错，我们可以把循环form获取按钮的代码放在try&hellip;&hellip;catch中，也可以先获取任务列表的父元素&lt;table id=&quot;job_list&quot; class=&quot;item_table&quot; cellspacing=&quot;3&quot; cellpadding=&quot;0&quot;&gt;，再用父元素的GetElementsByTagName(&quot;form&quot;)来获取所有任务。 </span>）同时获取form元素的第一（&lt;input name=&quot;id&quot; value=&quot;<span style="color: rgb(128, 128, 0);"><u><strong>N</strong></u></span>&quot; type=&quot;hidden&quot;&gt; ）、第二个子元素(&lt;input class=&quot;sub_btn&quot; name=&quot;&quot; value=&quot;立刻行动&quot;   type=&quot;submit&quot;&gt; )。通过第一个元素的value判断当前任务的名称，通过InvokeMember第二个元素，来达到模拟点击（click）特定任务的按钮。</p>
<pre class="CodecSharp" id="CodecSharp0"><a onclick='copyCodeByID(0)' href="javascript:void(0);">复制代码</a>

 <span class="code-keyword">try</span>

            {

                HtmlDocument htmlDoc = _wb.Document;

                HtmlElementCollection formCollHtmlEle = htmlDoc.GetElementsByTagName(<span class="code-str">&quot;form&quot;</span>);

                <span class="code-keyword">for</span> (int i = 1; i &lt; formCollHtmlEle.Count; i++)

                {

                    <span class="code-keyword">if</span> (formCollHtmlEle[i].Children[0].GetAttribute(<span class="code-str">&quot;value&quot;</span>) == id.ToString())

                    {

                        formCollHtmlEle[i].Children[1].InvokeMember(<span class="code-str">&quot;click&quot;</span>);

                        _wb.Refresh();

                        <span class="code-keyword">break</span>;

                    }

                }

            }

            <span class="code-keyword">catch</span> { }



</pre>
<p>&nbsp;</p>
<p>4.注意个别任务,如&ldquo;走私洋酒&rdquo;。走私洋酒需要酿酒，本来可以通过执行任务返回的信息里获取是否需要酿酒，可事实发现InvokeMember激活的click事件没有返回&ldquo;&hellip;&hellip;酒水不足&hellip;&hellip;&rdquo;。无奈，只好通过获取当前精力来判断是否该酿酒了。由于走私洋酒的精力要求点数为18点，如果程序发现当前的精力点数大于19（避免误差）了，则说明没有正常执行走私洋酒，可能原因是酒水不足，遂酿酒一次。</p>
<pre class="CodecSharp" id="CodecSharp1"><a onclick='copyCodeByID(1)' href="javascript:void(0);">复制代码</a>

<span class="code-keyword">if</span> (id == 7)<span class="code-note">//如果任务有其他准备条件，在此添加<br /><br /></span>{<span class="code-note">//如果是走私洋酒，则检查酒水是否满足。判断条件：精力大于19（避免误差），则说明酒水不足，此次执行酿酒<br /><br /><br /></span>       <span class="code-keyword">if</span> (GetCurrentSprit() &gt; 19) { ExecuteByID(8); <span class="code-keyword">return</span>; } 
	    }


</pre>
<p>&nbsp;</p>
<p>5.接下来就是需要排除Bug了。如，在WebBrowser下载文档和加载文档时获取Document是错误的，获取Document不存在的子元素是错误的。</p>
<p><br />
说的不够清楚，还请谅解。如有问题，可留言、Email。<a href="http://www.goberl.com/fckeditor/FCKPro/upLoadFiles/file/FightIng_Source.rar">源码下载</a>。</p>]]>	</description>	<pubDate>2008-10-29 0:23</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item22.aspx</guid></item><item>	<title><![CDATA[数据字典]]></title>	<link><![CDATA[http://www.goberl.com/archive/item21.aspx]]></link>	<description><![CDATA[<p>一个关于数据字典的示范：</p>
<p><span style="font-size: larger;"><strong>&nbsp; 数据字典 </strong></span> <style type="text/css">
<!--
.tableBorder{border:solid 1px #000000;}
-->
</style>
<table class="tableBorder">
    <tbody>
        <tr>
            <td class="tableBorder"><strong>数据项编号：</strong></td>
            <td class="tableBorder">DI001</td>
        </tr>
        <tr>
            <td class="tableBorder"><strong>数据项名称：</strong></td>
            <td class="tableBorder">学号</td>
        </tr>
        <tr>
            <td class="tableBorder"><strong>简述：</strong></td>
            <td class="tableBorder">学籍信息管理信息系统中的学生编号</td>
        </tr>
        <tr>
            <td class="tableBorder"><strong>别名：</strong></td>
            <td class="tableBorder">学生编码</td>
        </tr>
        <tr>
            <td class="tableBorder"><strong>类型：</strong></td>
            <td class="tableBorder">文本</td>
        </tr>
        <tr>
            <td class="tableBorder"><strong>长度：</strong></td>
            <td class="tableBorder">10</td>
        </tr>
        <tr>
            <td class="tableBorder"><strong>取值/含义：</strong></td>
            <td class="tableBorder">aabbccddee<br />
            aa&mdash;&mdash;入学年份<br />
            bb&mdash;&mdash;学院编号<br />
            cc&mdash;&mdash;专业编号<br />
            dd&mdash;&mdash;班号<br />
            ee&mdash;&mdash;流水号<br />
            Instance:0809030101</td>
        </tr>
    </tbody>
</table>
</p>]]>	</description>	<pubDate>2008-10-24 19:39</pubDate>	<category><![CDATA[Mis]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item21.aspx</guid></item><item>	<title><![CDATA[软件工程师毫无用处]]></title>	<link><![CDATA[http://www.goberl.com/archive/item20.aspx]]></link>	<description><![CDATA[<p>&ldquo;软件工程师毫无用处，我宁愿雇佣雷达专家教会他如何编程，也不愿意雇佣程序员来教会他雷达信号流程&rdquo;。<br />
在周二的《管理信息系统》课上，老师在课件里提到这句话。我当时一听，心里就是一震。说这话不是明摆着打击Programer吗？<br />
细细想来，这句话的含义不在于贬低Programer，而在于强调信息系统开发的&ldquo;系统需求&rdquo;、&ldquo;软件需求&rdquo;、&ldquo;初步设计&rdquo;等阶段的重要性。Program只是系统开发的一部分，如果仅懂programing而不懂得系统业务、流程，是做不出好的MIS的。<br />
<br />
细想我在《观博客，显缺陷》中提到的博客缺陷，归根到底产生原因是由于没有一个良好的需求分析、系统分析这一步。如果你在系统都做完的情况下，再增加或者修改系统的功能（业务），难免会&ldquo;劳师动众&rdquo;&ldquo;劳民伤财&rdquo;。<br />
<br />
初学编程时，教材上建议你学会程序流程图、学数据库时老师要求你学会实体-关系法。这些看上去没多大作用（程序小显示不出其高级之处）的简单方法，只有当 你面对难题感到迷惑时才会显示其真正的威力。对于这个&ldquo;实体-关系法&rdquo;我可是屡试不爽啊。其实，这些看似简单的方法的作用就在于让人的思路简单明了、清晰 而不混乱。<br />
<br />
而系统开发流程正是一个使思路清晰的方法，它让我们明白每个阶段的任务和目的&mdash;&mdash;每个阶段都是为整个系统服务的；有了它，才能有条不紊的进行每一步工作；同时，也是它让我们清楚系统的最终目标的。<br />
<br />
&nbsp;</p>
<p style="text-align: center;"><img height="282" width="504" alt="MIS信息系统开发" src="/fckeditor/FCKPro/upLoadFiles/image/misDesign.jpg" /></p>]]>	</description>	<pubDate>2008-10-19 4:11</pubDate>	<category><![CDATA[Mis]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item20.aspx</guid></item><item>	<title><![CDATA[需要改进的是方法]]></title>	<link><![CDATA[http://www.goberl.com/archive/item19.aspx]]></link>	<description><![CDATA[<p>这段时间一直在接触.net的Sysytem.Drawing类，想学会饼图、柱状图的绘制。由于学校图书馆没有这方面的书，只好到MSDN上看了。<br />
<br />
由于MSDN没有像图书的简介和目录那么具有较强的针对性（通常某一图书或者图书的某一章会详细介绍某一个类的常用方法和对象），总不能从总体上了解学习的过程和步骤。再加上人总有一蹴而就的思想，所以忽略了很多看上去没多大价值但实际上很具有价值的东西。这不，前些天为了实现渐变色，自己写了一类，可昨天才发现，渐变色的类（LinearGradientBrush）早已在由Microsoft写了。我花了半天时间写了一个只能水平渐变色的类后，正在考略垂直渐变和斜线渐变的时候，发现了微软早已为我做了这些工作&mdash;&mdash;我可真想自嘲一番啊。这也使得我不得不怀疑自己的学习方法。如果你不知道系统早已为你写了Sina函数，你为了求出正弦值还不得不去学习微积分&mdash;&mdash;这似乎很是浪费时间。</p>
<p>&nbsp;</p>
<p>顺便说一下，由于平时得上课，所以博客更新都集中到周末。</p>
<p>以下分别是由.net的LinearGradientBrush类和自己写的类生成的具有渐变色的圆柱:</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="text-align: center;"><span style="font-family: 宋体;"><img height="300" width="100" src="/fckeditor/FCKPro/upLoadFiles/image/GradientByMS.jpg" alt="" /></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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="300" width="100" src="/fckeditor/FCKPro/upLoadFiles/image/GradientByMySelf.jpg" alt="" /></p>
<p class="MsoNormal" style="text-align: center;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; by MS class &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; by myself class &nbsp;&nbsp;&nbsp;</p>
<p class="MsoNormal" style="text-align: center;">&nbsp;</p>
<p class="MsoNormal" style="text-align: left;">以下是学习过程中的&ldquo;实验品&rdquo;：</p>
<p class="MsoNormal" style="text-align: center;">&nbsp;</p>
<p class="MsoNormal" style="text-align: center;"><img height="320" width="320" src="/fckeditor/FCKPro/upLoadFiles/image/drawPieByCSharp.jpg" alt="饼图" /><br />
&nbsp;</p>
<p class="MsoNormal" style="text-align: center;">饼图一</p>
<p class="MsoNormal" style="text-align: center;">&nbsp;</p>
<p class="MsoNormal" style="text-align: center;"><img height="320" width="520" src="/fckeditor/FCKPro/upLoadFiles/image/drawPieByCSharp2.jpg" alt="饼图" /><br />
饼图二</p>
<p>&nbsp;</p>]]>	</description>	<pubDate>2008-10-18 4:28</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item19.aspx</guid></item><item>	<title><![CDATA[观博客，显缺陷]]></title>	<link><![CDATA[http://www.goberl.com/archive/item18.aspx]]></link>	<description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 突然发现本博客设计时的重大缺陷&mdash;&mdash;排名要分先后。</p>
<p><br />
<strong>1.评论</strong><br />
&nbsp; 评论模块的失败之处在于没有人性化地处理验证码的验证方式。众所周知，验证码是为了防止恶意用户的恶意行为，对于一个不起眼的个人博客，有几个会感兴趣来hack呢？所以这里的验证码是&ldquo;奢侈&rdquo;的（&ldquo;<a href="http://www.auiou.com/relevant/00001054.jsp">奢侈的验证码</a>&rdquo;），可又不得不防啊，所以应该在怀疑有人恶意灌水的情况下才让其输入验证码才是人性化的；<br />
&nbsp; 再次就是欠缺关闭评论、新评论邮件提示两项功能。关闭评论能够提高文章的权限层次，邮件提示可以让博主或者留言者接收感兴趣的文章的新回复。</p>
<p><br />
<strong>2.Tag标签</strong><br />
&nbsp; 由于本博客数据库设计不够精细，导致每篇文章的tag标签只能唯一。如此明显的失误很是失败。</p>
<p><br />
<strong>3.友情链接</strong><br />
&nbsp; 友情链接的最大遗憾是没有在有新增站点时提示博主的功能，如果能够通过邮件及时提示博主，且在邮件中提供仅需输入密码就可管理新增站点的链接，那是何等高效啊。</p>
<p><br />
<strong>4.缺少博主简介</strong></p>
<p><br />
<strong>5.提供的xml数据源不够丰富</strong></p>
<p><br />
<strong>6.缺少图片水印处理</strong></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 我觉得我的更像一个信息孤岛，值得深思。。</p>]]>	</description>	<pubDate>2008-10-12 8:13</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item18.aspx</guid></item><item>	<title><![CDATA[ASP.NET创建标准url实现SEO]]></title>	<link><![CDATA[http://www.goberl.com/archive/item17.aspx]]></link>	<description><![CDATA[<p><strong>引言</strong><br />
<br />
&nbsp; SEO是&ldquo; Search Engine Optimization&rdquo;的简写。他是一门提高网站流量的艺术、手段和科学。<br />
&nbsp; 学会怎样构建网站和网页以改进搜索引擎对网站和网页的编排已经成为SEO中的重要组成部分。<br />
&nbsp; 在这篇文章中，我们将看到最常见的SEO方法&mdash;&mdash;创建标准的URL链接。<br />
&nbsp; 目前，大多数网站都是基于数据库驱动的或者是属于动态网页，他们几乎都是通过查询字符串来传递数据的。搜索引擎的爬行通常不会索引url中存在问号或者其他字符的网页。如果搜索引擎不能识别网站的页面和内容，就意味着这个网站的网页失去了（许多）存在的页面。怎样解决这个问题呢。这篇文章将利用一个简单的WebSite工程来讨论以上涉及的问题。<br />
<br />
<strong>标准的url</strong><br />
<br />
&nbsp; 标志的url是通过没有存在问号或其他（特殊）字符来传递数据的url，这些url将会最大化地被搜索引擎索引，从而提高你网站的排名。相比动态的URL，搜索引擎更喜欢静态不变的url。<br />
&nbsp;&nbsp; 一个动态的url是一个查询数据库或者执行某段脚本的网页地址。相比静态url，动态url对应的内容始终保持一致除非编入HTML的编码被改变，动态url产生于查询网站数据库。这些动态页面仅仅是展示数据库查询结果的模板。<br />
&nbsp;&nbsp; 搜索引擎不会索引动态url的原因，是由于这些链接中包含了不规范的字符，例如?,&amp;,%,=等等，任何不规范的字符都将被忽略。例如，如下链接：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.goberl.com">http://www.myweb.com/default.aspx?id=120</a><br />
&nbsp;&nbsp; 忽略了不规范字符后，链接将会呈现如下状态：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.goberl.com">http://www.myweb.com/default.aspx</a><br />
&nbsp;&nbsp; 这些完全不一样的url链接被搜索引擎忽略了不规范字符后都将呈现为相同url，从而导致搜索引擎不会索引你的所有动态页面。搜索引擎会<br />
<br />
索引如下样式的链接：<br />
&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.goberl.com">http://www.myweb.com/page/120.aspx</a><br />
&nbsp; 虽然目前的搜索引擎在优化它们对动态url的索引情况，但是它们更偏爱于静态url。<br />
<br />
<br />
<strong>创建符合SEO的标准url</strong><br />
<br />
&nbsp; 这个webSite工程到底有什么功能呢？它能够创建标准的url以使你网站的排名提高。<br />
&nbsp; 在这个示例中，我们先看看下面的链接：<br />
&nbsp;&nbsp;&nbsp; <a href="http://www.goberl.com">http://www.myweb.com/Order.aspx?Itemid=10&amp;Item=Apple</a><br />
&nbsp;&nbsp;&nbsp; <a href="http://www.goberl.com">http://www.myweb.com/Order.aspx?Itemid=11&amp;Item=Orange</a> <br />
&nbsp; 这个工程的功能就是把上面的链接转换成如下样式的url：<br />
&nbsp;&nbsp;&nbsp; <a href="http://www.goberl.com">http://www.myweb.com/shop/10/Apple.aspx</a><br />
&nbsp;&nbsp;&nbsp; <a href="http://www.goberl.com">http://www.myweb.com/shop/11/Orange.aspx </a><br />
&nbsp; 我们首先要做的，是把含有查询字符串的url转换为具有相同内容但不含有不规则字符的url，在转换url时，使查询字符串的值以&quot;/&quot;结束作为url路径的一部分，使查询字符串的名称作为网页文件的名称。当点击一个被转换了的url时，我们在Global.asax 文件的Application_BeginRequest事件中重写被点击的url，使其还原为能够显示实际内容的含有查询字符串的url，而此时的实际网页文件名称是在网站的web.config中得到的。<br />
&nbsp; 接下来我们详细介绍如何创建标准的url。此webSite工程展示了如何创建符合SEO的标准url，这也是一个重写url的方法。你可以在你的应运程序中利用这个方法来重写url。<br />
&nbsp; <br />
<br />
<strong>转换url的方法&mdash;&mdash;GetContextualURL</strong><br />
<br />
&nbsp; 这个方法实现了转换url的功能，其中网页名称将被作为一个参数。在示例中，我们将用如下链接来展示url的转化情况：<br />
&nbsp;&nbsp;&nbsp;<span style="color: rgb(128, 128, 0);"> &quot;Order.aspx?Itemid=10&amp;Item=Apple&quot;</span><br />
&nbsp; 此方法将以<span style="color: rgb(128, 128, 0);">GetContextualURL(&quot;Order.aspx?Itemid=10&amp;Item=Apple&quot;,&quot;Apple&quot;)</span>的格式被执行。<br />
&nbsp; 在这个方法中，查询字符串的值将被拆分并重组。重组的url的网页名称apple.aspx将作为实际网页名称Order.aspx的别名，而这个Order.aspx是从web.config中获取的。重组的url的格式将是如下格式：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(128, 128, 0);"> &quot;~/shop/10/Apple.aspx&quot; </span><br />
&nbsp;&nbsp; 通过循环web.config的AppSettings属性，找出对应键（&ldquo;apple&rdquo;）的值&ldquo;order.aspx&rdquo;，AppSettings的键为&ldquo;order.aspx&rdquo;的别名。如果你需要转化更多的页面url，你就得在web.config中添加相应的别名/网页名称。<br />
&nbsp;  <br />
&nbsp; <br />
</p>
<div class="CodecSharp">public string GetContextualURL(string Url,string PageName)<br />
{<br />
&nbsp;&nbsp;&nbsp; string DestID = string.Empty;<br />
&nbsp;&nbsp;&nbsp; string DestAlias = string.Empty;<br />
&nbsp;&nbsp;&nbsp; string Str = Url.Split('?')[1].Split('=')[1] + &quot;/&quot;;<br />
&nbsp;&nbsp;&nbsp; string DestPage = Url.Split('?')[0];<br />
&nbsp;&nbsp;&nbsp; string ItemID = Url.Split('?')[1].Split('=')[1].Split('&amp;')[0];<br />
&nbsp;&nbsp;&nbsp; string NewUrl = string.Empty;<br />
<br />
&nbsp;&nbsp;&nbsp; //Get all the Key/Value pairs from web.config<br />
<br />
&nbsp;&nbsp;&nbsp; string[] KeyList = WebConfigurationManager.AppSettings.AllKeys;<br />
<br />
&nbsp;&nbsp;&nbsp; //Iterate the collection to find the specfic key/value pair<br />
<br />
&nbsp;&nbsp;&nbsp; for (int KeyCount = 0; KeyCount &lt; KeyList.Length; KeyCount++)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DestID = WebConfigurationManager.AppSettings[KeyList[KeyCount]].Trim();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DestAlias = KeyList[KeyCount];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (DestID.ToLower() == DestPage.Trim().ToLower())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; //Form the contextual URL<br />
<br />
&nbsp;&nbsp;&nbsp; NewUrl = &quot;~&quot; + DestAlias + ItemID + &quot;/&quot; + PageName + &quot;.aspx&quot;;<br />
<br />
&nbsp;&nbsp;&nbsp; return NewUrl;<br />
}<br />
</div>
<p><br />
<br />
<strong>Application_BeginRequest Event</strong><br />
<br />
&nbsp; 任何向服务器发送的请求都会执行此事件，因此我在此事件中重写被转化了的url，使其还原为实际的url。在这个事件中，我先检查请求的url是否是一个被转化了的url，如果是就分解url并获得id参数和name参数，然后利用他们重组一个包含查询字符串的实际url，再执行它。<br />
&nbsp; <br />
</p>
<div class="CodecSharp">protected void Application_BeginRequest(object sender, EventArgs e)<br />
{<br />
&nbsp;&nbsp;&nbsp; //Get the current http context<br />
<br />
&nbsp;&nbsp;&nbsp; HttpContext InRequest = HttpContext.Current;<br />
<br />
&nbsp;&nbsp;&nbsp; //Get the current path<br />
<br />
&nbsp;&nbsp;&nbsp; string OldPath = InRequest.Request.Path.ToLower();<br />
<br />
&nbsp;&nbsp;&nbsp; //Check the path whether it is a contextual path<br />
<br />
&nbsp;&nbsp;&nbsp; if (InRequest.Request.RawUrl.Split('/').Length &gt; 3)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string Path = InRequest.Request.RawUrl.Split('/')[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Path = &quot;/&quot; + Path + &quot;/&quot;;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string NewPath = &quot;/furl/&quot; + WebConfigurationManager.AppSettings[Path];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string ItemName = InRequest.Request.RawUrl.Split('/')<br />
<br />
[InRequest.Request.RawUrl.Split('/').Length - 1].Split('.')[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string ID = InRequest.Request.RawUrl.Split('/')[3];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Rewrite the path with the actual path<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InRequest.RewritePath(NewPath, &quot;&quot;, &quot;?id=&quot; + ID + <br />
<br />
&quot;&amp;id2=&quot; + ItemName, true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</div>
<p><br />
<br />
<strong>实际请求页</strong><br />
<br />
&nbsp; 在实际请求页order.aspx的Page_Load中获取id参数和name参数的值。<br />
&nbsp; Label1.Text = Request.QueryString[1] +&quot;, Qty &quot;+ Request.QueryString[0];<br />
<br />
<br />
<strong>总结</strong><br />
<br />
&nbsp;&nbsp; 有很多方法都可以实现SEO&mdash;&mdash;网页索引，提升网站排名的战略等等，然而，让搜索引擎索引动态网页内容是SEO的首要目标，也是SEO的一个良好开端。<br />
<br />
<br />
<br />
<strong>License</strong><br />
<br />
This article has no explicit license attached to it but may contain usage terms in the article text or the download files <br />
<br />
themselves. If in doubt please contact the author via the discussion board below.<br />
<br />
A list of licenses authors might use can be found <a href="http://www.codeproject.com/info/Licenses.aspx">here</a><br />
<br />
本文来源：[<a href="http://www.codeproject.com/KB/aspnet/Friendly_URLs_in_ASPNet.aspx">http://www.codeproject.com/KB/aspnet/Friendly_URLs_in_ASPNet.aspx</a>]</p>
<p>&nbsp;</p>
<p>个人学习所用，英语水平有限，欢迎指正。Goberl翻译于2008年10月11日。<a href="http://www.goberl.com/fckeditor/FCKPro/upLoadFiles/file/furl.zip">源码下载</a><br />
&nbsp;</p>]]>	</description>	<pubDate>2008-10-12 3:33</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item17.aspx</guid></item><item>	<title><![CDATA[操作必须使用一个可更新的查询。]]></title>	<link><![CDATA[http://www.goberl.com/archive/item16.aspx]]></link>	<description><![CDATA[<p>&nbsp; 昨天下午开始做一友情链接系统，今下午做好了。可当我发布到桌面，建了虚拟目录、测试，发现凡是执行了INSERT 或者UPDATE 的页面都Bug了。奇怪的是，我建在D盘的主虚拟目录里面的项目能够正常执行页面的。</p>
<p>&nbsp; 调试了一番，最后发现出现这个问题的原因在于虚拟目录所在盘的格式：</p>
<p>&nbsp; 我的C盘是NTFS格式,D盘是FAT32格式。应用程序能够在D盘，也就是FAT32格式的盘符上正常执行，而在NTFS格式的盘上出现Bug，且提示&ldquo;<span style="color: rgb(0, 0, 255);">操作必须使用一个可更新的查询。</span>&rdquo;</p>
<p>&nbsp; 应用程序出现Bug的表象就表明无法向Access里面写数据，网上搜索的结果显示&ldquo;<a href="http://zhidao.baidu.com/question/11297420.html?si=1">Access数据库所在目录没有写权限</a>&rdquo;。可还是不明白为什么在默认情况下我的NTFS盘就没给ASPNET_wp赋权。</p>
<p style="text-align: center;">&nbsp;&nbsp; 友情链接系统的几个截图：</p>
<p style="text-align: center;"><a href="http://www.goberl.com/fckeditor/FCKPro/upLoadFiles/image/link1.jpg"><img height="362" width="500" alt="友情链接，goberl" src="/fckeditor/FCKPro/upLoadFiles/image/link1.jpg" /></a></p>
<p style="text-align: center;"><a href="http://www.goberl.com/fckeditor/FCKPro/upLoadFiles/image/link2.jpg"><img height="362" width="500" alt="友情链接，goberl" src="/fckeditor/FCKPro/upLoadFiles/image/link2.jpg" /></a></p>
<p style="text-align: center;"><a href="http://www.goberl.com/fckeditor/FCKPro/upLoadFiles/image/link3.jpg"><img height="362" width="500" alt="友情链接，goberl" src="/fckeditor/FCKPro/upLoadFiles/image/link3.jpg" /></a></p>
<p style="text-align: center;"><a href="http://www.goberl.com/fckeditor/FCKPro/upLoadFiles/image/link4.jpg"><img height="362" width="500" alt="友情链接，goberl" src="/fckeditor/FCKPro/upLoadFiles/image/link4.jpg" /></a></p>
<p>&nbsp;</p>]]>	</description>	<pubDate>2008-10-5 5:45</pubDate>	<category><![CDATA[Bug回收站]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item16.aspx</guid></item><item>	<title><![CDATA[无果]]></title>	<link><![CDATA[http://www.goberl.com/archive/item15.aspx]]></link>	<description><![CDATA[<p>&nbsp;&nbsp; 近日，发现Blog总出现404错误，想通过修改Web.Config的debug为false后查看错误提示信息，可一修改了，网站马上正常工作。</p>
<p>&nbsp; 我怀疑是ASP.NET的缓存在作怪，因为这种错误从没发生在重新启动网站时。今早，获取了一点Bug信息，提示什么&ldquo;Unable &hellip;&hellip;System.Web.Compilation.BuildResultCompiledAss&hellip;&hellip;&rdquo;，可不小心把错误提示信息丢失，也就没到网上找原因。</p>
<p>&nbsp; 看见友情链接中百度已经来访40次了，由于新版没有用户搜索来访，所以这40次全是Baidu的机器人留下的痕迹，当时在写友情链接这个模块时，就把google和baidu的机器人特别处理了一下。</p>
<p>&nbsp;&nbsp; <img src="/fckeditor/editor/images/smiley/myface/img10.gif" alt="" /></p>
<p>&nbsp;</p>]]>	</description>	<pubDate>2008-10-4 11:43</pubDate>	<category><![CDATA[咸鱼炒蛋]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item15.aspx</guid></item><item>	<title><![CDATA[利用C#+GDI创建水印图片]]></title>	<link><![CDATA[http://www.goberl.com/archive/item14.aspx]]></link>	<description><![CDATA[<p><em><strong>引言</strong></em><br />
&nbsp;&nbsp; 当我们在网站上展示发布的图片时，通常有必要在图片上打上水印或者版权信息，比如提供一些关于图片属于哪个组织或者个人的版权信息。如果通过手工给这些图片添加这类信息，通常会耗费时间并且不能使所有图片保持一致。这里可以用C#和GDI轻松完成这个程序。<br />
<br />
<img height="346" width="449" alt="" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/watermark_final.jpg" /></p>
<p><br />
<em><strong>概述</strong></em><br />
&nbsp; 下面将展示给你处理图像的各种技术，以下展示了部分列表：<br />
&nbsp;&nbsp;&nbsp; 1.嵌在图片上的文本的位置与图像的尺寸相关。<br />
&nbsp;&nbsp;&nbsp; 2.选择System.Drawing.Font中的合适字体尺寸以便于阅读。<br />
&nbsp;&nbsp;&nbsp; 3.操作不透明的文本字符串。<br />
&nbsp;&nbsp;&nbsp; 4.通过特定颜色的位图替换来实现透明。<br />
&nbsp;&nbsp;&nbsp; 5.通过5&times;5的矩阵像素来改变图片的透明度。<br />
<br />
<em><strong>定义图像</strong></em></p>
<p><img height="154" width="200" alt="" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/watermark_photo_small.jpg" /><br />
<br />
&nbsp; 这个程序的第一步是加载一个需要应用水印的图片。图片可以是任何尺寸和分辨率。在我们这个例子中，我们将用一个449&times;346，分辨列为72dpi的图片。<br />
&nbsp; 要实现这个实例，我们先定义两个字符串。第一个String指明图片的输入输出所在的文件夹路径；第二个String用来存储我们应用到水印中的版权信息。<br />
<br />
<a href="http://www.goberl.com"><span style="display: none; font-size: 11px;">来自Goberl，转载请注明出处</span></a></p>
<div class="CodecSharp">string WorkingDirectory = @&quot;C:\Projects\WaterMark&quot;;<br />
string Copyright = &quot;Copyright &copy; 2002&nbsp;&nbsp;&nbsp;&nbsp; - AP Photo/David Zalubowski&quot;;</div>
<p><br />
&nbsp; 接下来，我们为需要打水印的图片创建一个Image对象，并定义两个变量存储这张图片的宽度和高度，他们将用于创建一个24 bits/像素的Bitmap对象，接着利用Bitmap对象创建一个 Graphics对象。</p>
<div class="CodecSharp">Image imgPhoto = Image.FromFile(WorkingDirectory +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&quot;\\watermark_photo.jpg&quot;);<br />
int phWidth = imgPhoto.Width; <br />
int phHeight =imgPhoto.Height;<br />
<br />
Bitmap bmPhoto = new Bitmap(phWidth,<br />
&nbsp;&nbsp;&nbsp; &nbsp;phHeight,PixelFormat.Format24bppRgb);<br />
bmPhoto.SetResolution(72, 72); <br />
<br />
Graphics grPhoto = Graphics.FromImage(bmPhoto);</div>
<p>&nbsp; 下面这段代码载入一张背景颜色为绿色（A=0,R=0,G=255,B=0）格式为BMP的水印图片(这张图片将作为水印显示到上面载入的图片上)，同时定义了存储图片宽和高的变量。<br />
<br />
<img height="45" width="80" alt="" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/watermark.gif" /></p>
<div class="CodecSharp">Image imgWatermark = new Bitmap(WorkingDirectory <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + &quot;\\watermark.bmp&quot;);<br />
int wmWidth = imgWatermark.Width;<br />
int wmHeight = imgWatermark.Height;</div>
<p><strong>第一步、添加水印字符串</strong><br />
&nbsp;&nbsp; 下面这段代码将把imgPhoto添加到Graphics对象中。原始图片的所有特征&mdash;&mdash;宽度、高度、像素&mdash;&mdash;都将就载入到Graphics对象中。</p>
<div class="CodecSharp">grPhoto.SmoothingMode = SmoothingMode.AntiAlias;<br />
grPhoto.DrawImage(<br />
&nbsp;&nbsp;&nbsp; imgPhoto,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; new Rectangle(0, 0, phWidth, phHeight), <br />
&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; phWidth,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; phHeight,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; GraphicsUnit.Pixel);</div>
<p>&nbsp; 为了更好地兼容版权字符串，我们将测试7种不同的字体大小，以便选出其中最合适的字体应用到我们的图片中。为了提高性能，我们定义了一个int数组来存储我们的字体大小，并利用循环来测试版权字符串的字体大小，一旦我们找到合适的字体就退出循环并向Graphics对象中写入字符串。</p>
<div class="CodecSharp">int[] sizes = new int[]{16,14,12,10,8,6,4};<br />
Font crFont = null; <br />
SizeF crSize = new&nbsp;&nbsp;&nbsp; SizeF(); <br />
for (int i=0 ;i&lt;7; i++)<br />
{ <br />
&nbsp;&nbsp;&nbsp; crFont = new Font(&quot;arial&quot;, sizes[i],FontStyle.Bold);<br />
&nbsp;&nbsp;&nbsp; crSize = grPhoto.MeasureString(Copyright, crFont);<br />
&nbsp;&nbsp;&nbsp; if((ushort)crSize.Width &lt; (ushort)phWidth)<br />
&nbsp;&nbsp;&nbsp; break;<br />
}</div>
<p>&nbsp; 不同图片可能会有不同高度，我们将让字符串的垂直位置位于离图片底部5%处（字符串的中部位于5%处，而不是底部或者顶部位于5%处）。用版权字符串的高度来决定它所在的y方向上的坐标，通过计算图片中心位置并定义一个StringFormat对象，设置StringAlignment来使版权信息位于图片的中心。</p>
<div class="CodecSharp">int yPixlesFromBottom = (int)(phHeight *.05);<br />
float yPosFromBottom = ((phHeight - <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; yPixlesFromBottom)-(crSize.Height/2));<br />
float xCenterOfImg = (phWidth/2);<br />
<br />
StringFormat StrFormat = new StringFormat();<br />
StrFormat.Alignment = StringAlignment.Center;</div>
<p>&nbsp; 目前，我们已经获得了所必须的坐标。接下来将创建一个黑色为60%（透明度的值为153）的 SolidBrush对象，绘制版权字符串时，并使其坐标位置在已计算的位置上向右和下各偏移1px，为了实现阴影效果，再创建一个颜色为白色的SolidBrush对象重复绘制一次版权字符串，并使其坐标位置直接为已计算的坐标位置。</p>
<div class="CodecSharp">SolidBrush semiTransBrush2 = <br />
&nbsp;&nbsp;&nbsp; new SolidBrush(Color.FromArgb(153, 0, 0,0)); <br />
<br />
grPhoto.DrawString(Copyright,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; crFont,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; semiTransBrush2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; new PointF(xCenterOfImg+1,yPosFromBottom+1), <br />
&nbsp;&nbsp;&nbsp; StrFormat);<br />
<br />
SolidBrush semiTransBrush = new SolidBrush(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Color.FromArgb(153, 255, 255, 255));<br />
<br />
grPhoto.DrawString(Copyright,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; crFont,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; semiTransBrush,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; new PointF(xCenterOfImg,yPosFromBottom),&nbsp; <br />
&nbsp;&nbsp;&nbsp; StrFormat);</div>
<p><br />
<img height="51" width="449" alt="" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/watermark_copyright.jpg" /><br />
<br />
<br />
<strong>第二步、添加水印图片</strong><br />
&nbsp; 为上述已经修改了的图片创建一个Bitmap，并将其载入到一个新建的Graphic对象中。</p>
<div class="CodecSharp">Bitmap bmWatermark = new Bitmap(bmPhoto); <br />
bmWatermark.SetResolution(imgPhoto.HorizontalResolution,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imgPhoto.VerticalResolution);<br />
<br />
Graphics grWatermark =Graphics.FromImage(bmWatermark);</div>
<p>&nbsp; 为了获得半透明水印图片，将定义一个ImageAttributes 对象，通过两次颜色处理来设置ImageAttributes的两个属性以达到颜色的改变（由有色转变为半透明）。<br />
&nbsp; 第一步颜色处理是把水印图片的背景色替换为透明(Alpha=0, R=0, G=0, B=0)。为了实现这一步，我们需要用到 Colormap和RemapTable。以上载入的水印图片的背景颜色为100%绿色，这有利于我们查找并替换他们。</p>
<div class="CodecSharp">ImageAttributes imageAttributes = new ImageAttributes();<br />
ColorMap colorMap = new ColorMap();<br />
<br />
colorMap.OldColor=Color.FromArgb(255, 0, 255, 0);<br />
colorMap.NewColor=Color.FromArgb(0, 0, 0, 0);<br />
ColorMap[] remapTable = {colorMap};<br />
<br />
imageAttributes.SetRemapTable(remapTable,ColorAdjustType.Bitmap);</div>
<p>&nbsp; 第二步颜色处理为改变水印图片的透明度。这一步将用到一个包含了RGBA信息的5&times;5的矩阵像素，这个矩阵的第三行第三列被设置为0.3f以获得半透明效果。这步操作将使水印图片呈半透明。</p>
<div class="CodecSharp">float[][] colorMatrixElements = { <br />
&nbsp;&nbsp; new float[] {1.0f,&nbsp; 0.0f,&nbsp; 0.0f,&nbsp; 0.0f, 0.0f},<br />
&nbsp;&nbsp; new float[] {0.0f,&nbsp; 1.0f,&nbsp; 0.0f,&nbsp; 0.0f, 0.0f},<br />
&nbsp;&nbsp; new float[] {0.0f,&nbsp; 0.0f,&nbsp; 1.0f,&nbsp; 0.0f, 0.0f},<br />
&nbsp;&nbsp; new float[] {0.0f,&nbsp; 0.0f,&nbsp; 0.0f,&nbsp; 0.3f, 0.0f},<br />
&nbsp;&nbsp; new float[] {0.0f,&nbsp; 0.0f,&nbsp; 0.0f,&nbsp; 0.0f, 1.0f}<br />
};<br />
<br />
ColorMatrix wmColorMatrix = new<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ColorMatrix(colorMatrixElements);<br />
<br />
imageAttributes.SetColorMatrix(wmColorMatrix, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ColorMatrixFlag.Default, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ColorAdjustType.Bitmap);</div>
<p>&nbsp; 通过上面两种颜色处理添加到imageAttributes对象后，我们就可以让水印图片显示到图片的右上角了。水印图片的位置离顶上边缘10px，右侧边缘10px。</p>
<div class="CodecSharp">int xPosOfWm = ((phWidth - wmWidth)-10);<br />
int yPosOfWm = 10;<br />
<br />
grWatermark.DrawImage(imgWatermark, <br />
&nbsp;&nbsp;&nbsp; new Rectangle(xPosOfWm,yPosOfWm,wmWidth,&nbsp; wmHeight),<br />
&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; wmWidth,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; wmHeight,&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; GraphicsUnit.Pixel, <br />
&nbsp;&nbsp;&nbsp; imageAttributes);</div>
<p>&nbsp; 最后一步，我们将用添加了水印的位图代替原始图片，释放Graphic对象并存储图像为文件。<br />
<br />
<a href="http://www.goberl.com"><span style="display: none; font-size: 11px;">来自Goberl，转载请注明出处</span></a></p>
<div class="CodecSharp">imgPhoto = bmWatermark;<br />
grPhoto.Dispose();<br />
grWatermark.Dispose();<br />
<br />
\\watermark_final.jpg&quot;, <br />
imgPhoto.Save(WorkingDirectory + &quot;<br />
&nbsp;&nbsp;&nbsp; ImageFormat.Jpeg);<br />
imgPhoto.Dispose();<br />
imgWatermark.Dispose();</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img height="90" width="169" alt="" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/watermark_small.jpg" /><br />
That's it! Compile the project, run it, and see what happens! The code is fairly straightforward if it all makes sense then these techniques can be used for 100's of different image manipulations. The possibilities are endless. <br />
<br />
<br />
&nbsp; 原文来自:[http://www.codeproject.com/KB/GDI-plus/watermark.aspx]<br />
&nbsp; 个人学习所用，英语水平有限，欢迎指正。Goberl翻译于2008年10月2日。<a href="http://www.goberl.com/fckeditor/FCKPro/upLoadFiles/file/Watermark_src.zip">源码下载</a><br />
<br />
&nbsp;</p>]]>	</description>	<pubDate>2008-10-3 3:21</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item14.aspx</guid></item><item>	<title><![CDATA[C#实现渐变色]]></title>	<link><![CDATA[http://www.goberl.com/archive/item13.aspx]]></link>	<description><![CDATA[<p>&nbsp; C# GDI实现渐变色：</p>
<p>&nbsp; 先看看示例页面，<a href="http://www.goberl.com/functionAspx/03GradientColor.aspx">www.goberl.com/functionAspx/03GradientColor.aspx</a></p>
<p>&nbsp; 写得很粗糙，如果图片太大，而渐变色的起始和终止颜色相差又不大，就无法绘制渐变色了。其实GDI绘制这个渐变色图像就用了N个矩形填充，而要实现渐变色的关键就是对颜色的计算。</p>
<p>&nbsp; 关于GDI要实现渐变色&mdash;&mdash;即RGB实现渐变色的原理或者规律稍后再叙！</p>
<p>===========================================================</p>
<p>(<strong>跳过个人学习的误区。</strong></p>
<p><strong><span style="color: rgb(128, 128, 0);">要实现渐变色请参见：</span></strong><a href="http://www.goberl.com/archive/item19.aspx">http://www.goberl.com/archive/item19.aspx</a></p>
<p>或者：<a href="http://msdn.microsoft.com/zh-cn/library/system.drawing.drawing2d.lineargradientbrush.lineargradientbrush(VS.85).aspx">LinearGradientBrush</a>及其相关类</p>
<p><strong><span style="color: rgb(128, 128, 0);">具体实现的代码方法见：</span></strong><a href="http://forums.asp.net/t/1333757.aspx">http://forums.asp.net/t/1333757.aspx</a></p>
<p>)<br />
本段更新于2008年10月18日</p>
<p>=============================================================</p>
<p>&nbsp; 效果图：</p>
<p style="text-align: center;"><br />
<img onerror="this.alt='图像参数出错。。';" style="border: 1px solid rgb(0, 0, 0);" src="http://www.goberl.com/functionAspx/showGradientColorPIC.ashx?width=250&amp;height=30&amp;step=2&amp;color1=FF0000&amp;color2=FFFFFF" alt="" /></p>
<p style="text-align: center;"><br />
<img onerror="this.alt='图像参数出错。。';" style="border: 1px solid rgb(0, 0, 0);" src="http://www.goberl.com/functionAspx/showGradientColorPIC.ashx?width=250&amp;height=30&amp;step=2&amp;color1=00FF00&amp;color2=FFFFFF" alt="" /></p>
<p style="text-align: center;"><br />
<img onerror="this.alt='图像参数出错。。';" style="border: 1px solid rgb(0, 0, 0);" src="http://www.goberl.com/functionAspx/showGradientColorPIC.ashx?width=250&amp;height=30&amp;step=2&amp;color1=0000FF&amp;color2=FFFFFF" alt="" /></p>]]>	</description>	<pubDate>2008-9-30 11:01</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item13.aspx</guid></item><item>	<title><![CDATA[在线查询汉字Unicode编码]]></title>	<link><![CDATA[http://www.goberl.com/archive/item12.aspx]]></link>	<description><![CDATA[<p>&nbsp;&nbsp; 今天在专业英语课上，看见课本上说Japanese和Chinese字符都是用Unicode编码的，突然让我想起正则表达式中&ldquo;\unnnn&mdash;&mdash;一个4位十六进制指定的Unicode字符&rdquo;这句话&mdash;&mdash;求出中文字符的Unicode，不就得到了该中文字符在正则表达式的匹配符吗？遂得如下页面，以便查询某一汉字在正则表达式中的匹配符。网上很多网站都提供了Unicode查询，但我的目的是提供查询某汉字的正则表达式匹配符。 &nbsp; &nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.goberl.com/functionaspx/demandRegexCoding.aspx">在线查询汉字Unicode编码</a>、<a href="http://www.goberl.com/functionaspx/demandRegexCoding.aspx">在线查询单个汉字正则表达式</a></p>
<p>&nbsp;</p>]]>	</description>	<pubDate>2008-9-28 7:38</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item12.aspx</guid></item><item>	<title><![CDATA[生成缩略图——内存不足]]></title>	<link><![CDATA[http://www.goberl.com/archive/item11.aspx]]></link>	<description><![CDATA[<p>&nbsp;&nbsp; 昨调试程序，生成缩略图时中提示&ldquo;<font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">System.OutOfMemoryException: 内存不足。</font>&rdquo;。在网上溜达了一圈。总结如下：</p>
<p><font><font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
<ol>
    <li>GetThumbnailImage(newWidth, newHeight, callback, IntPtr.Zero);中的宽度或者高度 为0或者负数,可能出现内存不足 。</li>
    <li>提供给System.Drawing.Image对象的Stream释放（Dispose）太早，也会导致<font><font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">内存不足。</font></font></li>
    <li><font><font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">确实是因为</font></font><font><font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">Stream提供的字节流太大，导致内存不足，但这种可能性太小了。现在的Web服务器配置不可能处理一个普通的图片都会导致内存不足。现在计算机的发展远远超过了</font></font>摩尔定律的约每隔18个月便会增加一倍，性能也将提升一倍的规律。价格猛降。前两天买了个金士顿2G1年保修的U盘，才35RMB，宿舍一兄弟伙配了台AMD 4800+双核的电脑2000不到，降价太黑人了。是不是再等几年就普及4核6核了。</li>
</ol>
<p>&nbsp;&nbsp; 关于C#,VB.NET生成缩略图请参见：</p>
<p><a href="http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx">http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx</a></p>
</font></font></p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]>	</description>	<pubDate>2008-9-27 5:59</pubDate>	<category><![CDATA[Bug回收站]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item11.aspx</guid></item><item>	<title><![CDATA[互联网中的间谍]]></title>	<link><![CDATA[http://www.goberl.com/archive/item10.aspx]]></link>	<description><![CDATA[<p>&nbsp;&nbsp; &nbsp; 悠哉悠哉进了Google的生活搜索，随手&ldquo;Google 搜索&rdquo;出现了一大片的信息。突然发现网页右侧有图片、图例，仔细一瞧&mdash;&mdash;大为惊诧！何也？惊诧于Google的&ldquo;以人为本&rdquo;，惊诧于Google的&ldquo;神通广大&rdquo;，惊诧于Google的特色网络服务。</p>
<p><br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(128, 128, 0);">1.Google生活搜索之房屋</span></p>
<p style="text-align: center;"><img height="275" width="212" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/Goberl1.jpg" alt="" /></p>
<p style="text-align: left;">&nbsp;&nbsp; 一看这个图例，咋让我想到了炒股的波状图。Google应该不会派专人来研究房价吧<br />
&nbsp;&nbsp; 看一张图例还不够刺激，再看看这个二手房价格走势、租房供给量走势、二手房供给量走势，真可谓一览无余啊！</p>
<p style="text-align: center;"><img src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/Goberl2.jpg" style="width: 552px; height: 398px;" alt="" /></p>
<p>&nbsp;&nbsp;&nbsp; Google除了能给普通用户提供图例外，还为广大网站主提供了额外的服务&mdash;&mdash;通过一小段代码可以让这些图例显示到自己的网站中。<a href="http://shenghuo.google.cn/shenghuo/st?a_y0=9&amp;a_n0=%E6%88%BF%E5%B1%8B&amp;a_n1=%E5%9F%8E%E5%B8%82&amp;a_y1=1&amp;a_o1=0&amp;a_v1=%E6%88%90%E9%83%BD">点击详情</a></p>
<p><br />
&nbsp; &nbsp; <span style="color: rgb(128, 128, 0);">2.Google生活搜索之工作</span><br />
&nbsp;&nbsp; 输入了一个&ldquo;互联网&rdquo;，出现了很多有关这个职称的工作岗位，发现她的信息都来自各招聘网站，但增加了许多查询限制选项，如行业、雇主、学历、工作经验、薪酬等。使用Google的&ldquo;工作&rdquo;搜索无需担心信息过期，因为她的更新周期小于1小时。如果Google让&ldquo;Google 快讯&rdquo;和这个结合起来，不知道有多爽啊。而右侧的图例居然让我想到了管理人力资源的政府部门。</p>
<p style="text-align: center;"><img height="263" width="187" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/Goberl3.jpg" alt="" /></p>
<p style="text-align: left;"><br />
&nbsp; &nbsp; <span style="color: rgb(128, 128, 0);">3.Google生活搜索之出行票务</span><br />
&nbsp;&nbsp; 这个显示未来火车票数量的图例不得不让我大跌眼镜&mdash;&mdash;虽然我没有眼镜。</p>
<p style="text-align: center;"><img height="210" width="196" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/Goberl5.jpg" alt="" /></p>
<p style="text-align: left;">&nbsp;&nbsp; </p>
<p style="text-align: left;">&nbsp;</p>
<p style="text-align: left;">&nbsp;&nbsp;&nbsp;&nbsp; 又一次见识了Googl高招啊，我只想说&mdash;&mdash;<strong>间谍猛于军队，孰知Google之猛，有甚于是间谍者乎</strong>！</p>
<p style="text-align: left;">&nbsp; &nbsp;&nbsp; 信息管理、管理信息&mdash;&mdash;得向Google学习。<br />
&nbsp;</p>
<p style="text-align: center;">&nbsp;&nbsp;&nbsp;&nbsp; 以下引用Google的代码显示了成都租房价格的走势图。<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
<iframe height="410" frameborder="0" width="450" src="http://shenghuo.google.cn/shenghuo/trends?bid=8740591319305346797&amp;c=0&amp;t=1&amp;d=0&amp;i=7"></iframe></p>
<p style="text-align: center;">&nbsp;</p>]]>	</description>	<pubDate>2008-9-21 8:04</pubDate>	<category><![CDATA[Google微软]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item10.aspx</guid></item><item>	<title><![CDATA[及时关闭数据库的Connection]]></title>	<link><![CDATA[http://www.goberl.com/archive/item9.aspx]]></link>	<description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 前几天无聊得很，到<a href="http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/msdnwebcast.aspx">微软的网络课堂</a>上下载了几个感兴趣的视频。看了其中的一部名为《<a href="https://msevents.microsoft.com/cui/r.aspx?t=3&amp;c=zh-cn&amp;r=1298688213">开发高性能的ASP.NET应用</a>》的课程，里面讲的好多知识都未接触过，看后感慨良深&mdash;&mdash;咋认识越多，不懂的就越多。&nbsp;</p>
<p>&nbsp;&nbsp; 看了两三部，其中印象最深的一个就是关于关闭数据库连接的问题。</p>
<p>&nbsp;&nbsp; 通常我们为了提高应用程序的性能，在与数据库交互时，在对数据库进行操作后会立即关闭数据库连接。但这个立即关闭数据库连接到底是什么意思呢？我们先来看看下面这个例子。</p>
<p><br />
&nbsp;&nbsp;<span style="color: rgb(0, 0, 0);"> Note: con是一个SQLConnection对象,sqlCMD是一个SQLCommand对象，省略了SQL语句的部分内容.</span><br />
&nbsp;&nbsp; 假设有下列3个SQL语句需要依次执行，且不方便于把三个语句写入一个SQL语句中。<br />
&nbsp;&nbsp;&nbsp;<span style="color: rgb(128, 128, 0);">&nbsp; String strSql1=&quot;INSERT INTO [Employees] &hellip;&hellip;&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp; String strSql2=&quot;UPDATE [Employees] &hellip;&hellip;&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp; String strSql3=&quot;DELETE FROM [Employees]&hellip;&hellip;&quot;</span><br />
&nbsp;&nbsp; 第一种方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(128, 128, 0);">con.Open();<br />
&nbsp;&nbsp;&nbsp;&nbsp; sqlCMD= new SQLiteCommand(strSql1, con); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; sqlCMD.ExecuteNonQuer();<br />
&nbsp;&nbsp;&nbsp;&nbsp; sqlCMD= new SQLiteCommand(strSql2, con); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; sqlCMD.ExecuteNonQuer();<br />
&nbsp;&nbsp;&nbsp;&nbsp; sqlCMD= new SQLiteCommand(strSql3, con); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; sqlCMD.ExecuteNonQuer();<br />
&nbsp;&nbsp;&nbsp;&nbsp; con.Close();</span><br />
&nbsp; 第二种方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(128, 128, 0);"> con.Open();<br />
&nbsp;&nbsp;&nbsp;&nbsp; sqlCMD= new SQLiteCommand(strSql1, con);<br />
&nbsp;&nbsp; &nbsp; </span><span style="color: rgb(128, 128, 0);">sqlCMD.ExecuteNonQuer();</span><span style="color: rgb(128, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp; con.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp; con.Open();<br />
&nbsp;&nbsp;&nbsp;&nbsp; sqlCMD= new SQLiteCommand(strSql2, con); <br />
</span><span style="color: rgb(128, 128, 0);">&nbsp;&nbsp; &nbsp; </span><span style="color: rgb(128, 128, 0);">sqlCMD.ExecuteNonQuer();</span><span style="color: rgb(128, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp; con.Close();con.Open();<br />
&nbsp;&nbsp;&nbsp;&nbsp; sqlCMD= new SQLiteCommand(strSql3, con); <br />
</span><span style="color: rgb(128, 128, 0);">&nbsp;&nbsp; &nbsp; </span><span style="color: rgb(128, 128, 0);">sqlCMD.ExecuteNonQuer();</span><span style="color: rgb(128, 128, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp; con.Close();</span><br />
<br />
&nbsp;&nbsp; 这两种方法哪一个更具有性能优势呢？我平时用的是第一种，觉得它有效。可我看了这个视频后，我发现<br />
自己的&ldquo;想当然&rdquo;错误了。当<span style="color: rgb(0, 0, 255);">数据库连接池启用</span>的情况下，第一种方法&ldquo;<span style="color: rgb(0, 0, 255);">会导致非常大的性能问题</span>&rdquo;&ldquo;<span style="color: rgb(0, 0, 255);">甚至会导致连接的漏洞</span>&rdquo;为什么呢?为什么会这样呢？</p>
<p>&nbsp;&nbsp;&nbsp; 原来如此：<br />
&nbsp;&nbsp;&nbsp;&nbsp; 第一种方法看似只打开了一次数据库连接，并在最后一次性关闭，而实质是每执行一次ExecuteNonQuer()，数据库就为其创建一个连接，此连接直 到最后的con.Close()或者&ldquo;垃圾回收&rdquo;时才释放&mdash;&mdash;此过程中数据库需要一直维护其连接。上面的例子执行了3次，数据库就为其创建3个连接。假设 是一个循环，执行了千次万次，这种操作方法带来的后果是恐怖的。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 第二种方法为什么会高效呢？那样<span style="color: rgb(0, 0, 255);">反复的打开/关闭数据库连接</span>还高效？谁不知道打开/关闭数据库连接是<br />
非常耗时的。问题的关键就在于<span style="color: rgb(0, 0, 255);">数据库的连接池</span>，ADO.NET自动启用的连接池技术让我们快速从数据库的连接池中获取一个连接,我们反复地Open/Close的连接其实是从连接池中获取的。<br />
<span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：这种情况的前提是启动了数据库的连接池技术。</span></p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp; 一句话&mdash;&mdash;只在需要时才打开数据库连接，使用后立刻关闭连接，如此，提升程序性能。<br />
<br />
&nbsp;</p>]]>	</description>	<pubDate>2008-9-20 8:04</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item9.aspx</guid></item><item>	<title><![CDATA[不确定项目数的选择题或者投票的数据库设计]]></title>	<link><![CDATA[http://www.goberl.com/archive/item8.aspx]]></link>	<description><![CDATA[<p>&nbsp;&nbsp; 每当在无聊的生活中呆上一天半天，总想找点所谓能够&ldquo;成就&rdquo;自我，能够带来惬意的事情来做，无论是游戏，打球，写程序都如小孩子在玩泥&mdash;&mdash;玩一会就丢一边去了。生活就如没有远大目标的航船在大海上漂泊着，每当经过某一个不知名的岛屿，都登陆上去看一看，玩一玩，玩够了，返回航船继续依旧的漂泊。</p>
<p>&nbsp;&nbsp; 我又想用&ldquo;偶发突想&rdquo;这个短语来修饰我又想出了个小玩样儿，但很不情愿地用这个短语，因为我用得自己都厌烦了，而事实上也不知道那种状态是否是真的算&quot;偶发突想&quot;&hellip;&hellip;N天以前，我想做一个投票系统，可在设计数据库的时候遇到了困难，我不知道该如何设计数据库来解决&ldquo;不确定投票项目数&rdquo;的情况。一个投票题目可能有2个选项，3个，4个或者更多，同时一个投票题目可能是多选。这种有点复杂（在我看来）的关系让我在我N天前放弃了做投票系统的打算。可N天后，也就是今天，我又&ldquo;偶发突想&rdquo;地想通了这个问题，理顺了这种&ldquo;有点复杂&rdquo;的关系。</p>
<p style="text-align: left; ">&nbsp;&nbsp;先看下这张图片：</p>
<p style="text-align: center; "><img alt="数据库设计，不定项选择数据库设计" width="0" height="0" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/DtaBase%20Desgin.jpg" /><img alt="数据库设计，不定项选择数据库设计" width="560" height="175" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/DtaBase%20Desgin.jpg" /></p>
<p style="text-align: left; ">&nbsp;&nbsp;解释解释（此图是关于投票或者选择题有未知个数选项的数据库设计）：<br />
&nbsp;&nbsp;首先，在<span style="color: rgb(128, 128, 0); ">题目</span>表中一个投票或者选择题必然有一个题目，比如：关于年龄段的调查。此处的<span style="color: rgb(128, 128, 0); ">题目ID</span>字段标示为主键(自动编号),<span style="color: rgb(128, 128, 0); ">标题</span>字段存储题目,<span style="color: rgb(128, 128, 0); ">类型</span>字段存储此投票或者选择题目是多项选择还是单项选择；<br />
&nbsp;&nbsp;其次，在<span style="color: rgb(128, 128, 0); ">题项</span>表中每个投票或者选择题都有N个选项，比如：5~16,17~22,22~40,40以上的四个选项。此处的<span style="color: rgb(128, 128, 0); ">题项ID</span>字段标示为主键(自动编号)，<span style="color: rgb(128, 128, 0); ">题项内容</span>字段存储选项内容，<span style="color: rgb(128, 128, 0); ">题目ID</span>为引用自<span style="color: rgb(128, 128, 0); ">题目</span>表的外码。</p>
<p style="text-align: left; ">&nbsp;&nbsp;如此设计，就可解决不确定项投票或者选择题以及是否多选的问题。只是这样的设计会导致绑定数据时的难度，需要在Item_DataBind事件下判断每个投票或者选择题类型并绑定各个题项，这种绑定方法难免会影响程序的性能。</p>
<p style="text-align: left; ">&nbsp;&nbsp; 以下是Power Desiger生成Sql文件(MS SQL2000):</p>
<p style="text-align: left; ">&nbsp;</p>
<pre id="CodecSharp" class="CodecSharp"><a onclick='copyCode()' href="javascript:void(0);">复制代码</a>
/*==============================================================*/
/* DBMS name:      Microsoft SQL Server 2000                    */
/* Created on:     2008-9-4 20:11:26                            */
/*==============================================================*/


alter table 题项
   drop constraint FK_题项_REFE_题目ID
go

if exists (select 1
            from  sysindexes
           where  id    = object_id('topic')
            and   name  = 'Index_查询'
            and   indid > 0
            and   indid &lt; 255)
   drop index topic.Index_查询
go

if exists (select 1
            from  sysindexes
           where  id    = object_id('topic')
            and   name  = 'Index_连接'
            and   indid > 0
            and   indid &lt; 255)
   drop index topic.Index_连接
go

if exists (select 1
            from  sysindexes
           where  id    = object_id('题项')
            and   name  = 'Index_更新'
            and   indid > 0
            and   indid &lt; 255)
   drop index 题项.Index_更新
go

if exists (select 1
            from  sysindexes
           where  id    = object_id('题项')
            and   name  = 'Index_连接'
            and   indid > 0
            and   indid &lt; 255)
   drop index 题项.Index_连接
go

if exists (select 1
            from  sysobjects
           where  id = object_id('topic')
            and   type = 'U')
   drop table topic
go

if exists (select 1
            from  sysobjects
           where  id = object_id('题项')
            and   type = 'U')
   drop table 题项
go

/*==============================================================*/
/* Table: topic                                                 */
/*==============================================================*/
create table topic (
   题目ID                 integer              identity,
   标题                   varchar(250)         null,
   类型                   varchar(10)          null,
   constraint PK_TOPIC primary key (题目ID)
)
go

declare @Cmttopic varchar(128)
select @Cmttopic = user_name()
execute sp_addextendedproperty 'MS_Description', 
   '每个投票OR选择题的题目内容',
   'user', @Cmttopic, 'table', 'topic'
go

execute sp_addextendedproperty 'MS_Description', 
   '多选OR单选',
   'user', '', 'table', 'topic', 'column', '类型'
go

/*==============================================================*/
/* Index: Index_连接                                              */
/*==============================================================*/
create unique index Index_连接 on topic (
题目ID ASC
)
go

/*==============================================================*/
/* Index: Index_查询                                              */
/*==============================================================*/
create unique index Index_查询 on topic (
题目ID ASC,
类型 ASC
)
go

/*==============================================================*/
/* Table: 题项                                                    */
/*==============================================================*/
create table 题项 (
   题项ID                 integer              identity,
   选项内容                 varchar(250)         null,
   题目ID                 integer              null,
   constraint PK_题项 primary key (题项ID)
)
go

declare @Cmt题项 varchar(128)
select @Cmt题项 = user_name()
execute sp_addextendedproperty 'MS_Description', 
   '投票OR选择题的各个选项',
   'user', @Cmt题项, 'table', '题项'
go

execute sp_addextendedproperty 'MS_Description', 
   '投票选项OR题目选项内容',
   'user', '', 'table', '题项', 'column', '选项内容'
go

/*==============================================================*/
/* Index: Index_连接                                              */
/*==============================================================*/
create index Index_连接 on 题项 (
题目ID ASC
)
go

/*==============================================================*/
/* Index: Index_更新                                              */
/*==============================================================*/
create unique index Index_更新 on 题项 (
题项ID ASC
)
go

alter table 题项
   add constraint FK_题项_REFE_题目ID foreign key (题目ID)
      references topic (题目ID)
go
</pre>
<p>&nbsp;</p>]]>	</description>	<pubDate>2008-9-5 5:40</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item8.aspx</guid></item><item>	<title><![CDATA[让web服务器自动执行起来]]></title>	<link><![CDATA[http://www.goberl.com/archive/item7.aspx]]></link>	<description><![CDATA[<p>&nbsp; 如何让我们的asp.net程序在某个时刻自动执行某些任务呢？<br />
<br />
&nbsp; 当我们为桌面程序设计某个计划任务时，一个时钟控件（Timer）就轻而易举地解决了，可我们如何让我们的web程序能具有像时钟控件一样的功能呢?(注：此处的自动执行不是某个用户访问某一页面时才自动执行，而是只要Web服务器正常工作，则无论有没有用户访问都可自动执行某些任务的情况)<br />
<br />
&nbsp; 吾漫游于搜索引擎间，终得甜头啊~~~<img src="/fckeditor/editor/images/smiley/myface/img6.gif" alt="" /><br />
<br />
&nbsp;&nbsp; 其思路如下：<br />
<br />
&nbsp;&nbsp;&nbsp; 在Application_Start里面添加一进程，通过while(true)让它陷入执行任务的&ldquo;死&rdquo;循环，此死循环非绝对死循环&mdash;&mdash;每当它执行一次任务后，我们就让它沉睡一会，Thread.Sleep(3000)。由此，每隔3秒就可执行一次我们安排的任务，至于任务和执行时间个间隔完全可以&ldquo;自治&rdquo;。<br />
<br />
&nbsp;&nbsp; Global.asax文件部分源码：<br />
<br />
复制代码<br />
<pre id='CodecSharp' class='CodecSharp'><a href='javascript:void(0);' onclick='copyCode()'>复制代码</a>

   <span class='code-keyword'>private</span> <span class='code-keyword'>void</span> start()


    {//调用进程


        ThreadStart myThreadStart = <span class='code-keyword'>new</span> ThreadStart(startJob);


        schedulerThread = <span class='code-keyword'>new</span> Thread(myThreadStart);


        schedulerThread.Start();


    }


    <span class='code-keyword'>private</span> <span class='code-keyword'>void</span> startJob()


    {//循环执行，间隔3秒


        <span class='code-keyword'>while</span> (<span class='code-keyword'>true</span>)


        {//每隔3秒执行一次


            ThreadStart myThreadDelegate = <span class='code-keyword'>new</span> ThreadStart(excuteJob);


            Thread myThread = <span class='code-keyword'>new</span> Thread(myThreadDelegate);


            myThread.Start();


            Thread.Sleep(3000);


        }


    }


    <span class='code-keyword'>private</span> <span class='code-keyword'>void</span> excuteJob()


    {


        //此处添加需要执行的任务，如备份数据库、发送信息等待  



        //此处的任务是每隔3秒刷新一次www.goberl.com本站的页面


        //==================================================任务开始


        WebRequest wres;


        String url = <span class='code-str'>&quot;http://www.goberl.com/&quot;</span>;


        wres = WebRequest.Create(url);


        WebResponse wreq = wres.GetResponse();


        Encoding code = Encoding.GetEncoding(<span class='code-str'>&quot;gb2312&quot;</span>);


        StreamReader sr1 = <span class='code-keyword'>new</span> StreamReader(wreq.GetResponseStream(), code);


        String strtemp = sr1.ReadToEnd();


        sr1.Close();


        //==================================================任务结束


        //记录执行的次数


        int readCount=-2;


        <span class='code-keyword'>using</span> (StreamReader sr = <span class='code-keyword'>new</span> StreamReader(System.AppDomain.CurrentDomain.BaseDirectory+<span class='code-str'>@&quot;/countRecord.txt&quot;</span>))


        {//获取文本文件中的数字


            String line;


            <span class='code-keyword'>while</span> (((line = sr.ReadLine()) != <span class='code-keyword'>null</span>))


            {


                readCount = Convert.ToInt32(line);


            }



        }


        <span class='code-keyword'>if</span> (readCount != -2)


        {//如果成功读取了文本文件中的数据则是该数字自增1，并写入文本文件


            readCount++;


            <span class='code-keyword'>using</span> (StreamWriter sw = <span class='code-keyword'>new</span> StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + <span class='code-str'>@&quot;/countRecord.txt&quot;</span>, <span class='code-keyword'>false</span>))


            {


                sw.Write(readCount.ToString());               


            }


        }    


    }


    <span class='code-keyword'>public</span> System.Threading.Thread schedulerThread = <span class='code-keyword'>null</span>;


    <span class='code-keyword'>void</span> Application_Start(<span class='code-keyword'>object</span> sender, EventArgs e) 


    {


        // 在应用程序启动时运行的代码


        HttpContext.Current.Application.Lock();


        HttpContext.Current.Application[<span class='code-str'>&quot;TimeStamp&quot;</span>] = DateTime.Now;


        HttpContext.Current.Application.UnLock();


        start();    //调度


    }


 </pre><br />
<br />
&nbsp; 源码下载：<a href="/fckeditor/FCKPro/upLoadFiles/image/archiveFile/asp_net%E7%92%81%E2%80%B3%E5%9E%9D%E6%B5%A0%E8%AF%B2%E5%A7%9F.rar">download</a></p>]]>	</description>	<pubDate>2008-9-4 2:15</pubDate>	<category><![CDATA[网络编程]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item7.aspx</guid></item><item>	<title><![CDATA[chrome]]></title>	<link><![CDATA[http://www.goberl.com/archive/item6.aspx]]></link>	<description><![CDATA[<p>&nbsp;&nbsp; 今天看见chrome，欣喜十分，忙下载Beta版试用，第一感觉是窗体简洁，第二感觉是小巧玲珑。用了那么几个小时，感觉还不错。安装的时候，也自动导入了我Firefox的书签。现在欠缺点的就是支持的插件、主题还没有，但由于它是开源的，相信不久的将来，这些东东一定会极大的丰富。</p>
<p>&nbsp;&nbsp;发现chrome的任务管理(shift+Esc),里面详细列表了chrome进程的内存占用情况，其中包括物理内存(<span class="Apple-style-span" style="border-collapse: collapse; font-size: 11px; font-weight: bold; line-height: 11px; white-space: nowrap; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">Memory<span class="Apple-style-span" style="border-collapse: separate; font-size: 12px; font-weight: normal; line-height: normal; white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; ">)、虚拟内存(<span class="Apple-style-span" style="border-collapse: collapse; font-size: 11px; font-weight: bold; line-height: 11px; white-space: nowrap; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">Virtual memory<span class="Apple-style-span" style="border-collapse: separate; font-size: 12px; font-weight: normal; line-height: normal; white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; ">)，详细显示了各个页面占用内存的情况，让人一目了然啊。不知道Google开发者把这些数据显示给用户，用意何为。是在寓意chrome占用内存少？是提醒Web开发者也得关心关心客户端的Broswer，让它们也尽量减减&ldquo;刑&rdquo;？（现在某些网页，几乎可以让某些浏览器打开网页缓慢甚至崩溃，客户端脚本太多，效率低下是一方面原因的）还是其他更重要的原因呢！</span></span></span></span></p>
<p>&nbsp;&nbsp;关于chrome遵循W3C标志情况，还不咋地清楚，不过相对于目前的浏览器相信它做的更好些吧。发现Firefox(3.0)对缓存的页面有缩小显示的迹象&mdash;&mdash;本来两div间距只有10px(在IE7、Opera显示为10px，今天发现在Chrome也显示为10px)，可显示出来却有20px，而div内的字体间距、字体、div宽度看起来似乎变窄了。</p>
<p>&nbsp;&nbsp;其实，我急着用chrome的Beta版还有个原因，Google既然推出了Google Web Accelerator，必然会在自己浏览器访问网页速度方面下点功夫，(其他方面当然也不例外了)再则，要想自己&ldquo;后来居上&rdquo;，没半斤八两的也是不行的。可能Google就是抱着&ldquo;开源&rdquo;这个大树吧，google的目标不是程序的最终用户，而是编写程序的Programer。</p>
<p>&nbsp;chrome下载：&nbsp;<a href="http://www.google.com/chrome">http://www.google.com/chrome</a></p>
<p style="text-align: center; ">&nbsp;<img alt="chrome" src="http://www.google.com/chrome/intl/zh-CN/images/dlpage_lg.jpg" /></p>
<p style="text-align: center; "><img width="560" height="404" alt="chrome(" src="/fckeditor/FCKPro/upLoadFiles/image/archivePic/chrome(1).jpg" /></p>
<p style="text-align: center; ">&nbsp;</p>
<p>&nbsp;</p>]]>	</description>	<pubDate>2008-9-4 0:07</pubDate>	<category><![CDATA[Google微软]]></category>	<author><![CDATA[Goberl]]></author>	<guid>http://www.goberl.com/archive/item6.aspx</guid></item><item>	<title><![CDATA[关于网页加速器]]></title>	<link><![CDATA[http://www.goberl.com/archive/item5.aspx]]></link>	<description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 今天上99sushe.com查询英语成绩，在该网站上看见一条关于网页加速器的推广广告。忽觉奇怪，咋现在都流行起做这个来了。</p>
<p>&nbsp;&nbsp; 我最开始使用的网页加速器是腾讯的，用了不到半天，感觉效果不大，就卸载了。直到前段时间在Google上闲逛，发现Google的Google Web Accelerator，觉得新鲜就下载下来试用试用。用了几天，发觉它能在一定程度上提高访问速度&mdash;&mdash;我用了1周累积起来节省了27分钟。可我对这些节省时间不怎么感兴趣，因为有很多节省出来的时间都是从我频繁访问的网站中节省的，而我访问的这些网站都是网络巨头，访问它们的服务器都很快的(比如百度、新浪、凤凰卫视)。过了两天我把Firfox换3.0了，Google Web Accelerator也不兼容了，就卸载了它。</p>
<p><br />
&nbsp;&nbsp; 觉得把网页加速器叫&ldquo;浏览器外挂&rdquo;更有趣(可能是以前玩游戏玩得我忘不了外挂这个词)。它们的功能之一就是把频繁访问的网页数据存储起来，以备再次使用，所以Google上面说用Google Web Accelerator在才开始的一段时间里效果不会很明显，因为它缓存的数据太少了。同时，它们可以加快浏览器与服务器间的请求速