<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:trackbac="http://www.wyjexplorer.cn/Blog"><channel><title>汪宇杰的博客(RSS)</title><link>http://www.wyjexplorer.cn/　</link><description>来自汪宇杰个人网站的最新博客 wyjexplorer.cn</description><copyright>2012 wyjexplorer.cn</copyright><generator>Edi Wang's RSS Generator</generator><item><title>LINQ重写博客垃圾图片回收算法</title><link>http://www.wyjexplorer.cn/Blog/View/2724E13341E85EB4.html</link><description>&lt;p&gt;本人博客后台管理模块有个功能，可以扫描图片上传文件夹下所有未被引用的博客。思路很简单，从所有Blog Model中解析出所有文章使用的图片文件名，排除站外引用，放入一个List&amp;lt;string&amp;gt; usedPicList。再遍历图片上传文件夹，把所有图片文件的结果加入FileInfo[] fiAllPicList。然后比较usedPicList和fiAllPicList，找出所有fiAllPicList中有，而usedPicList中木有的图片，就是未被任何文章引用的垃圾图片了。&lt;/p&gt;
&lt;p&gt;原先这个比较算法是用传统方法写的，很蛋疼，用了两重循环，一个标志位才解决问题：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;List&amp;lt;FileInfo&amp;gt; garbagePicList = new List&amp;lt;FileInfo&amp;gt;();

for (int k = 0; k &amp;lt; fiAllPicList.Length; k++)
{
    bool found = false;
    for (int l = 0; l &amp;lt; usedPicList.Count; l++)
    {
        if (fiAllPicList[k].Name == usedPicList[l].ToString())
        {
            found = true;
        }
    }
    if (!found)
    {
        garbagePicList.Add(fiAllPicList[k]);
    }
}&lt;/pre&gt;
&lt;p&gt;今天用LINQ重写了一下：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;List&amp;lt;FileInfo&amp;gt; garbagePicList = new List&amp;lt;FileInfo&amp;gt;();

var query = from pic in fiAllPicList
            where !usedPicList.Contains(pic.Name)
            select pic;

garbagePicList = query.ToList();&lt;/pre&gt;
&lt;p&gt;清晰明了，碉堡了！ &lt;/p&gt;</description><pubDate>Mon, 20 Feb 2012 20:40:34 GMT</pubDate></item><item><title>LINQ操作数组（交集,并集,差集,最值,平均,去重复）</title><link>http://www.wyjexplorer.cn/Blog/View/DBD2F9D182057445.html</link><description>&lt;p&gt;数组是大学里经常拿来做算法练习的对象。一些经典算法非常有价值，考试、装逼、面试都十分有用。但现在是效率时代，编程讲究生产效率，利用LINQ，可以让程序猿避免写一些基本算法，把精力花在业务处理上。&lt;/p&gt;
&lt;p&gt;下面以数组为例，展示一些常用LINQ操作。&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;static void Main(string[] args)
{
    int[] a = { 1, 2, 3, 4, 5, 6, 7 };
    int[] b = { 4, 5, 6, 7, 8, 9, 10 };
    int[] c = { 1, 2, 3, 3, 4, 1, 2, 4, 6, 1, 6, 5 };

    // 交集
    var fuck = a.Intersect(b);

    // 并集
    var shit = a.Union(b);

    // a有b没有的
    var diff1 = a.Except(b);

    // b有a没有的
    var diff2 = b.Except(a);

    var max = a.Max();
    var min = a.Min();
    var avg = a.Average();
    var dis = c.Distinct();

    Print(fuck);
    Print(shit);
    Print(diff1);
    Print(diff2);
    Console.WriteLine(max);
    Console.WriteLine(min);
    Console.WriteLine(avg);
    Print(dis);

    Console.ReadKey();
}

private static void Print(IEnumerable&amp;lt;int&amp;gt; list)
{
    foreach (var item in list)
    {
        Console.Write(item + " ");
    }
    Console.WriteLine();
}&lt;/pre&gt;
&lt;p&gt;有图有真相:&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/linqarr_201202201203180312.PNG" alt="" width="323" height="186" /&gt;&lt;/p&gt;
&lt;p&gt;一些参考：&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/bb397894.aspx" target="_blank"&gt;http://msdn.microsoft.com/zh-cn/library/bb397894.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx&lt;/a&gt;&lt;/p&gt;</description><pubDate>Mon, 20 Feb 2012 12:08:29 GMT</pubDate></item><item><title>C#多线程Singleton(单件)模式模板</title><link>http://www.wyjexplorer.cn/Blog/View/2D6EB3D4F18FF6A1.html</link><description>&lt;p&gt;最近在研究设计模式，我会陆续总结一些实用的代码出来。&lt;/p&gt;
&lt;p&gt;下面是一个C#多线程单件模式的代码模板。把T换成你自己的类型就可以使用了。其精妙之处就在于用lock语句锁定资源来避免多线程同时走入if语句去创建多个对象。&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;private static volatile T _instance = null;
private static object objLock = new Object();

private T()
{

}

public static T Instance
{
    get
    {
        if (_instance == null)
        {
            lock (objLock)
            {
                if (_instance == null)
                {
                    _instance = new T();
                }
            }
        }
        return _instance;
    }
}&lt;/pre&gt;
&lt;p&gt;在必要的时候需如果要刷新当前instance，可以这样写：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public static void RefreshInstance()
{
    _instance = new T();
}&lt;/pre&gt;</description><pubDate>Sun, 19 Feb 2012 18:09:57 GMT</pubDate></item><item><title>JQuery操作表格(隔行着色,高亮显示,筛选数据)</title><link>http://www.wyjexplorer.cn/Blog/View/E65C61C20A634328.html</link><description>&lt;p&gt;最近项目里对表格的操作比较多。以往我们要做一些效果的时候往往通过程序代码来实现，这个努力不值，因为JQuery是完全可以做到的，并且是客户端运行，不经过服务器处理，给用户的反应快，也减少了服务器压力（现在的PC多暴力啊！）。哥查了些资料，写了4个Demo：&lt;/p&gt;
&lt;p&gt;1. 隔行着色&lt;/p&gt;
&lt;pre class="brush: jscript;fontsize: 100; first-line: 1; "&gt;$('#table1 tr:odd').addClass('odd');
$('#table1 tr:even').addClass('even');&lt;/pre&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/jqtable1_201202181958596406.PNG" alt="" width="413" height="160" /&gt;&lt;/p&gt;
&lt;p&gt;2. 高亮含有特定数据的行&lt;/p&gt;
&lt;pre class="brush: jscript;fontsize: 100; first-line: 1; "&gt;$("#table2 tr:contains('Fuck')").addClass("selected");&lt;/pre&gt;
&lt;p&gt;&lt;img src="/Uploads/jqtable2_201202182001392656.PNG" alt="" width="550" height="156" /&gt; &lt;/p&gt;
&lt;p&gt;3. 筛选数据&lt;/p&gt;
&lt;pre class="brush: jscript;fontsize: 100; first-line: 1; "&gt;$("#filter").click(
	function(){
		$("#table3 .datarow").hide().filter(":contains('ABCDEFG')").show();
	}
);&lt;/pre&gt;
&lt;p&gt;4. 根据用户输入，即时筛选数据&lt;/p&gt;
&lt;pre class="brush: jscript;fontsize: 100; first-line: 1; "&gt;$("#keyword").keyup(function(){
	$("#table3 .datarow").hide().filter(":contains('" + ($(this).val()) + "')").show();
}).keyup();
&lt;/pre&gt;
&lt;p&gt;筛选前：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/jqtable3_201202182004553437.PNG" alt="" width="511" height="216" /&gt; &lt;/p&gt;
&lt;p&gt;输入ck：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/jqtable4_201202182004580625.PNG" alt="" width="487" height="113" /&gt;&lt;/p&gt;</description><pubDate>Sat, 18 Feb 2012 20:05:36 GMT</pubDate></item><item><title>JQuery获取浏览器窗口内容部分高度</title><link>http://www.wyjexplorer.cn/Blog/View/480818BA7CFADA58.html</link><description>&lt;p&gt;有时候我们需要得到浏览器窗口内容部分的高度，而不是整个窗口的高度。我试了下JQuery下的window对象，似乎读的正是内容部分，有点意外，不过恰好满足了我们的要求。&lt;/p&gt;
&lt;p&gt;下面是测试代码，记得先引用JQuery库&lt;/p&gt;
&lt;pre class="brush: jscript;fontsize: 100; first-line: 1; "&gt;&amp;lt;script type="text/javascript"&amp;gt;
	$(document).ready(
		function()
		{
			var h = $(window).height();
			alert(h);
		}
	)
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Firefox下：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/jqwindowheightFirefox_201202161625543437.PNG" alt="" width="258" height="160" /&gt;&lt;/p&gt;
&lt;p&gt;IE下：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/jqwindowheightIE_201202161625575937.PNG" alt="" width="194" height="178" /&gt;&lt;/p&gt;
&lt;p&gt;可以发现它获取的却是是窗口的内容部分高度，而不是浏览器窗口的高度。Oh Yeah!&lt;/p&gt;</description><pubDate>Thu, 16 Feb 2012 16:27:04 GMT</pubDate></item><item><title>JQuery实现鼠标点击文本框显示隐藏提示文本</title><link>http://www.wyjexplorer.cn/Blog/View/CC7CC4287205653F.html</link><description>&lt;p&gt;我们做搜索框的时候，经常需要这样一个效果：搜索框默认显示一段提示文本，比如&amp;ldquo;输入关键词&amp;rdquo;，鼠标点击后，清空这段文本。鼠标再次点击别的地方，又要恢复这段文本。&lt;/p&gt;
&lt;p&gt;比如本人网站的搜索框：&lt;/p&gt;
&lt;p&gt;不使用的时候：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/jqsearchtxt1_201202131702219375.PNG" alt="" width="375" height="206" /&gt;&lt;/p&gt;
&lt;p&gt;鼠标点击后：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/jqsearchtxt2_201202131702278593.PNG" alt="" width="341" height="206" /&gt;&lt;/p&gt;
&lt;p&gt;用JQuery实现这个效果非常简单，下面是代码：&lt;/p&gt;
&lt;pre class="brush: jscript;fontsize: 100; first-line: 1; "&gt;$(document).ready(function () {
    var searchBox = $("#ctl00_txtSearch"); 
    searchBox.focus(function () {
        if (searchBox.val() == this.title) { // TextBox控件ToolTip属性转换为Html为title属性
            searchBox.val("");
        }
    });
    searchBox.blur(function () {
        if (searchBox.val() == "") {
            searchBox.val(this.title);
        }
    });
    searchBox.blur();
});&lt;/pre&gt;
&lt;p&gt;其中#ctl00_txtSearch是搜索框的ID（ASP.NET可以通过ClientID获取这个ID）&amp;nbsp;&lt;/p&gt;</description><pubDate>Mon, 13 Feb 2012 17:04:10 GMT</pubDate></item><item><title>让Repeater和GridView支持DataPager分页</title><link>http://www.wyjexplorer.cn/Blog/View/D68510CFF5BCF229.html</link><description>&lt;p&gt;.NET 3.5中的DataPager碉堡了，可惜只支持ListView。传统的GridView和Repeater都无法直接使用DataPager分页。但我们如果稍加改造，就可以让Repeater和GridView支持DataPager分页。本网站的博客和留言板就是用Repeater+DataPager做的分页。&lt;/p&gt;
&lt;p&gt;改造办法是自己写一个控件，让它继承GridView或Repeater，并实现&lt;span style="color: #8c8cb4;"&gt;IPageableItemContainer&lt;/span&gt; 接口。下面要发的是国外某高手写的代码，测试有效。具体使用的时候，要建一个类库项目，把代码编译成dll后，就可以添加到VS的工具箱里了！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、自定义Repeater&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;using System.Web.UI;
using System.Web.UI.WebControls;

namespace WYJ.Web.Controls
{
    /// &amp;lt;summary&amp;gt;
    /// Repeater with support for DataPager
    /// &amp;lt;/summary&amp;gt;
    [ToolboxData("&amp;lt;{0}:DataPagerRepeater runat=server PersistentDataSource=true&amp;gt;&amp;lt;/{0}:DataPagerRepeater&amp;gt;")]
    public class DataPagerRepeater : Repeater, System.Web.UI.WebControls.IPageableItemContainer, INamingContainer
    {
        /// &amp;lt;summary&amp;gt;
        /// Number of rows to show
        /// &amp;lt;/summary&amp;gt;
        public int MaximumRows { get { return ViewState["MaximumRows"] != null ? (int)ViewState["MaximumRows"] : -1; } }

        /// &amp;lt;summary&amp;gt;
        /// First row to show
        /// &amp;lt;/summary&amp;gt;
        public int StartRowIndex { get { return ViewState["StartRowIndex"] != null ? (int)ViewState["StartRowIndex"] : -1; } }

        /// &amp;lt;summary&amp;gt;
        /// Total rows. When PagingInDataSource is set to true you must get the total records from the datasource (without paging) at the FetchingData event
        /// When PagingInDataSource is set to true you also need to set this when you load the data the first time.
        /// &amp;lt;/summary&amp;gt;
        public int TotalRows { get { return ViewState["TotalRows"] != null ? (int)ViewState["TotalRows"] : -1; } set { ViewState["TotalRows"] = value; } }

        /// &amp;lt;summary&amp;gt;
        /// If repeater should store data source in view state. If false you need to get and bind data at post back. When using a connected data source this is handled by the data source.  
        /// &amp;lt;/summary&amp;gt;        
        public bool PersistentDataSource
        {
            get { return ViewState["PersistentDataSource"] != null ? (bool)ViewState["PersistentDataSource"] : true; }
            set { ViewState["PersistentDataSource"] = value; }
        }
        /// &amp;lt;summary&amp;gt;
        /// Set to true if you want to handle paging in the data source. 
        /// Ex if you are selecting data from the database and only select the current rows 
        /// you must set this property to true and get and rebind data at the FetchingData event. 
        /// If this is true you must also set the TotalRecords property at the FetchingData event.     
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;seealso cref="FetchingData"/&amp;gt;
        /// &amp;lt;seealso cref="TotalRows"/&amp;gt;
        public bool PagingInDataSource
        {
            get { return ViewState["PageingInDataSource"] != null ? (bool)ViewState["PageingInDataSource"] : false; }
            set { ViewState["PageingInDataSource"] = value; }
        }
        /// &amp;lt;summary&amp;gt;
        /// Checks if you need to rebind data source at postback
        /// &amp;lt;/summary&amp;gt;
        public bool NeedsDataSource
        {
            get
            {
                if (PagingInDataSource)
                    return true;
                if (IsBoundUsingDataSourceID == false &amp;amp;&amp;amp; !Page.IsPostBack)
                    return true;
                if (IsBoundUsingDataSourceID == false &amp;amp;&amp;amp; PersistentDataSource == false &amp;amp;&amp;amp; Page.IsPostBack)
                    return true;
                else
                    return false;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Loading ViewState
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="savedState"&amp;gt;&amp;lt;/param&amp;gt;
        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);


            //if (Page.IsPostBack)
            //{


            //    if (!IsBoundUsingDataSourceID &amp;amp;&amp;amp; PersistentDataSource &amp;amp;&amp;amp; ViewState["DataSource"] != null)
            //    {
            //        this.DataSource = ViewState["DataSource"];
            //        this.DataBind(true);
            //    }
            //    if (IsBoundUsingDataSourceID)
            //    {
            //        this.DataBind();
            //    }
            //}
        }

        protected override void OnLoad(System.EventArgs e)
        {
            if (Page.IsPostBack)
            {
                if (NeedsDataSource &amp;amp;&amp;amp; FetchingData != null)
                {
                    if (PagingInDataSource)
                    {
                        SetPageProperties(StartRowIndex, MaximumRows, true);
                    }
                    FetchingData(this, null);
                }

                if (!IsBoundUsingDataSourceID &amp;amp;&amp;amp; PersistentDataSource &amp;amp;&amp;amp; ViewState["DataSource"] != null)
                {
                    this.DataSource = ViewState["DataSource"];
                    this.DataBind();
                }
                if (IsBoundUsingDataSourceID)
                {
                    this.DataBind();
                }

            }

            base.OnLoad(e);


        }



        /// &amp;lt;summary&amp;gt;
        /// Method used by pager to set totalrecords
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="startRowIndex"&amp;gt;startRowIndex&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="maximumRows"&amp;gt;maximumRows&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="databind"&amp;gt;databind&amp;lt;/param&amp;gt;
        public void SetPageProperties(int startRowIndex, int maximumRows, bool databind)
        {
            ViewState["StartRowIndex"] = startRowIndex;
            ViewState["MaximumRows"] = maximumRows;

            if (TotalRows &amp;gt; -1)
            {
                if (TotalRowCountAvailable != null)
                {
                    TotalRowCountAvailable(this, new PageEventArgs((int)ViewState["StartRowIndex"], (int)ViewState["MaximumRows"], TotalRows));
                }
            }
        }
        /// &amp;lt;summary&amp;gt;
        /// OnDataPropertyChanged
        /// &amp;lt;/summary&amp;gt;
        protected override void OnDataPropertyChanged()
        {
            if (MaximumRows != -1 || IsBoundUsingDataSourceID)
            {
                this.RequiresDataBinding = true;
                
            }
            
                base.OnDataPropertyChanged();
        }

        /// &amp;lt;summary&amp;gt;
        /// Renders only current items selected by pager
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="writer"&amp;gt;&amp;lt;/param&amp;gt;
        protected override void RenderChildren(HtmlTextWriter writer)
        {
            if (!PagingInDataSource &amp;amp;&amp;amp; MaximumRows != -1)
            {
                foreach (RepeaterItem item in this.Items)
                {
                    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                    {
                        item.Visible = false;
                        if (item.ItemIndex &amp;gt;= (int)ViewState["StartRowIndex"] &amp;amp;&amp;amp; item.ItemIndex &amp;lt; ((int)ViewState["StartRowIndex"] + (int)ViewState["MaximumRows"]))
                        {
                            item.Visible = true;
                        }
                    }
                    else
                    {
                        item.Visible = true;
                    }
                }
            }
            base.RenderChildren(writer);
        }

        /// &amp;lt;summary&amp;gt;
        /// Get Data
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
        protected override System.Collections.IEnumerable GetData()
        {
            System.Collections.IEnumerable dataObjects = base.GetData();

            if (dataObjects == null &amp;amp;&amp;amp; this.DataSource != null)
            {
                if (this.DataSource is System.Collections.IEnumerable)
                    dataObjects = (System.Collections.IEnumerable)this.DataSource;
                else
                    dataObjects = ((System.ComponentModel.IListSource)this.DataSource).GetList();
            }

            if (!PagingInDataSource &amp;amp;&amp;amp; MaximumRows != -1 &amp;amp;&amp;amp; dataObjects != null)
            {
                int i = -1;

                if (dataObjects != null)
                {
                    i = 0;
                    foreach (object o in dataObjects)
                    {
                        i++;
                    }

                }

                ViewState["TotalRows"] = i;

                if (!IsBoundUsingDataSourceID &amp;amp;&amp;amp; PersistentDataSource)
                    ViewState["DataSource"] = this.DataSource;

                SetPageProperties(StartRowIndex, MaximumRows, true);
                
            }

            if (PagingInDataSource &amp;amp;&amp;amp; !Page.IsPostBack)
            {
                SetPageProperties(StartRowIndex, MaximumRows, true);
            }

            return dataObjects;
        }




        /// &amp;lt;summary&amp;gt;
        /// Event when pager/repeater have counted total rows
        /// &amp;lt;/summary&amp;gt;
        public event System.EventHandler&amp;lt;PageEventArgs&amp;gt; TotalRowCountAvailable;

        /// &amp;lt;summary&amp;gt;
        /// Event when repeater gets the data on postback
        /// &amp;lt;/summary&amp;gt;
        public event System.EventHandler&amp;lt;PageEventArgs&amp;gt; FetchingData;

    }

}
&lt;/pre&gt;
&lt;p&gt;ASPX页面要做的事情（以我网站的留言板为例）：&lt;/p&gt;
&lt;p&gt;首先得把标签注册进来&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;%@ Register Assembly="WYJ.Web.Controls" Namespace="WYJ.Web.Controls" TagPrefix="WYJ" %&amp;gt;&lt;/pre&gt;
&lt;p&gt;然后添加我们的Repeater&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;WYJ:DataPagerRepeater ID="rptLeaveword" runat="server" PersistentDataSource="true"&amp;gt;
    &amp;lt;ItemTemplate&amp;gt;
        &amp;lt;div class="leavewordentry"&amp;gt;
            &amp;lt;div class="datebox"&amp;gt;
                &amp;lt;div class="time"&amp;gt;
                    &amp;lt;%# ((GeekStudio.ORM.Model.Leaveword)Container.DataItem).Posttime.ToString("HH:mm") %&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;div class="day"&amp;gt;
                    &amp;lt;%# ((GeekStudio.ORM.Model.Leaveword)Container.DataItem).Posttime.ToString("dd") %&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class="month"&amp;gt;
                    &amp;lt;%# ((GeekStudio.ORM.Model.Leaveword)Container.DataItem).Posttime.ToString("MMM", new CultureInfo("en-US")).ToUpper() %&amp;gt;&amp;lt;%# ((GeekStudio.ORM.Model.Leaveword)Container.DataItem).Posttime.ToString(" yyyy") %&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="contentbox"&amp;gt;
                &amp;lt;h2 class="username"&amp;gt;
                    &amp;lt;a id="&amp;lt;%# GeekStudio.Common.IdEncryptor.EncodeId(((GeekStudio.ORM.Model.Leaveword)Container.DataItem).Id) %&amp;gt;"
                        name="&amp;lt;%# GeekStudio.Common.IdEncryptor.EncodeId(((GeekStudio.ORM.Model.Leaveword)Container.DataItem).Id) %&amp;gt;"&amp;gt;
                        &amp;lt;%# ((GeekStudio.ORM.Model.Leaveword)Container.DataItem).Username %&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;
                &amp;lt;div class="lvwordcontent"&amp;gt;
                    &amp;lt;%# ((GeekStudio.ORM.Model.Leaveword)Container.DataItem).Content %&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/ItemTemplate&amp;gt;
&amp;lt;/WYJ:DataPagerRepeater&amp;gt;&lt;/pre&gt;
&lt;p&gt;之后添加.NET自带的DataPager，并自定义一些分页样式&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;div class="pager"&amp;gt;
    &amp;lt;div class="fr"&amp;gt;
        共&amp;lt;%=Math.Ceiling((double)DataPager1.TotalRowCount / DataPager1.PageSize)%&amp;gt;页，&amp;lt;%=DataPager1.TotalRowCount%&amp;gt;条记录，每页显示
        &amp;lt;asp:LinkButton ID="lnkbtn10" CssClass="currentpagesize" runat="server" OnClick="lnkbtn10_Click"&amp;gt;10&amp;lt;/asp:LinkButton&amp;gt;
        &amp;lt;asp:LinkButton ID="lnkbtn20" runat="server" OnClick="lnkbtn20_Click"&amp;gt;20&amp;lt;/asp:LinkButton&amp;gt;
        &amp;lt;asp:LinkButton ID="lnkbtn30" runat="server" OnClick="lnkbtn30_Click"&amp;gt;30&amp;lt;/asp:LinkButton&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;asp:DataPager ID="DataPager1" PagedControlID="rptLeaveword" runat="server"&amp;gt;
        &amp;lt;Fields&amp;gt;
            &amp;lt;asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False"
                ShowPreviousPageButton="False" FirstPageText="首页" /&amp;gt;
            &amp;lt;asp:NextPreviousPagerField ShowNextPageButton="False" ButtonType="Image" PreviousPageImageUrl="~/Images/icons/pagerprevious.png" /&amp;gt;
            &amp;lt;asp:NumericPagerField CurrentPageLabelCssClass="current" /&amp;gt;
            &amp;lt;asp:NextPreviousPagerField ShowPreviousPageButton="False" ButtonType="Image" NextPageImageUrl="~/Images/icons/pagernext.png" /&amp;gt;
            &amp;lt;asp:NextPreviousPagerField ShowLastPageButton="True" ShowNextPageButton="False"
                ShowPreviousPageButton="False" LastPageText="尾页" /&amp;gt;
        &amp;lt;/Fields&amp;gt;
    &amp;lt;/asp:DataPager&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;后台代码：&lt;/p&gt;
&lt;p&gt;分页部分不需要代码。下面发的代码是切换每页显示数量的：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;protected void lnkbtn10_Click(object sender, EventArgs e)
{
    DataPager1.PageSize = 10;
    lnkbtn10.CssClass = "currentpagesize";
    lnkbtn20.CssClass = "";
    lnkbtn30.CssClass = "";
}

protected void lnkbtn20_Click(object sender, EventArgs e)
{
    DataPager1.PageSize = 20;
    lnkbtn20.CssClass = "currentpagesize";
    lnkbtn10.CssClass = "";
    lnkbtn30.CssClass = "";
}

protected void lnkbtn30_Click(object sender, EventArgs e)
{
    DataPager1.PageSize = 30;
    lnkbtn30.CssClass = "currentpagesize";
    lnkbtn10.CssClass = "";
    lnkbtn20.CssClass = "";
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;二、自定义GridView&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;using System;
using System.Collections;
using System.Web.UI.WebControls;

namespace WYJ.Web.Controls
{
    /// &amp;lt;summary&amp;gt;
    /// DataPagerGridView is a custom control that implements GrieView and IPageableItemContainer
    /// &amp;lt;/summary&amp;gt;
    public class DataPagerGridView : GridView, IPageableItemContainer
    {
        public DataPagerGridView()
            : base()
        {
            PagerSettings.Visible = false;
        }

        /// &amp;lt;summary&amp;gt;
        /// TotalRowCountAvailable event key
        /// &amp;lt;/summary&amp;gt;
        private static readonly object EventTotalRowCountAvailable = new object();

        /// &amp;lt;summary&amp;gt;
        /// Call base control's CreateChildControls method and determine the number of rows in the source 
        /// then fire off the event with the derived data and then we return the original result.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="dataSource"&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="dataBinding"&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
        protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding)
        {
            int rows = base.CreateChildControls(dataSource, dataBinding);

            //  if the paging feature is enabled, determine the total number of rows in the datasource
            if (this.AllowPaging)
            {
                //  if we are databinding, use the number of rows that were created, otherwise cast the datasource to an Collection and use that as the count
                int totalRowCount = dataBinding ? rows : ((ICollection)dataSource).Count;

                //  raise the row count available event
                IPageableItemContainer pageableItemContainer = this as IPageableItemContainer;
                this.OnTotalRowCountAvailable(new PageEventArgs(pageableItemContainer.StartRowIndex, pageableItemContainer.MaximumRows, totalRowCount));

                //  make sure the top and bottom pager rows are not visible
                if (this.TopPagerRow != null)
                    this.TopPagerRow.Visible = false;

                if (this.BottomPagerRow != null)
                    this.BottomPagerRow.Visible = false;
            }
            return rows;
        }

        /// &amp;lt;summary&amp;gt;
        /// Set the control with appropriate parameters and bind to right chunk of data.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="startRowIndex"&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="maximumRows"&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="databind"&amp;gt;&amp;lt;/param&amp;gt;
        void IPageableItemContainer.SetPageProperties(int startRowIndex, int maximumRows, bool databind)
        {
            int newPageIndex = (startRowIndex / maximumRows);
            this.PageSize = maximumRows;

            if (this.PageIndex != newPageIndex)
            {
                bool isCanceled = false;
                if (databind)
                {
                    //  create the event arguments and raise the event
                    GridViewPageEventArgs args = new GridViewPageEventArgs(newPageIndex);
                    this.OnPageIndexChanging(args);

                    isCanceled = args.Cancel;
                    newPageIndex = args.NewPageIndex;
                }

                //  if the event wasn't cancelled change the paging values
                if (!isCanceled)
                {
                    this.PageIndex = newPageIndex;

                    if (databind)
                        this.OnPageIndexChanged(EventArgs.Empty);
                }
                if (databind)
                    this.RequiresDataBinding = true;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// IPageableItemContainer's StartRowIndex = PageSize * PageIndex properties
        /// &amp;lt;/summary&amp;gt;
        int IPageableItemContainer.StartRowIndex
        {
            get { return this.PageSize * this.PageIndex; }
        }

        /// &amp;lt;summary&amp;gt;
        /// IPageableItemContainer's MaximumRows  = PageSize property
        /// &amp;lt;/summary&amp;gt;
        int IPageableItemContainer.MaximumRows
        {
            get { return this.PageSize; }
        }

        /// &amp;lt;summary&amp;gt;
        /// 
        /// &amp;lt;/summary&amp;gt;
        event EventHandler&amp;lt;PageEventArgs&amp;gt; IPageableItemContainer.TotalRowCountAvailable
        {
            add { base.Events.AddHandler(DataPagerGridView.EventTotalRowCountAvailable, value); }
            remove { base.Events.RemoveHandler(DataPagerGridView.EventTotalRowCountAvailable, value); }
        }

        /// &amp;lt;summary&amp;gt;
        /// 
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;
        protected virtual void OnTotalRowCountAvailable(PageEventArgs e)
        {
            EventHandler&amp;lt;PageEventArgs&amp;gt; handler = (EventHandler&amp;lt;PageEventArgs&amp;gt;)base.Events[DataPagerGridView.EventTotalRowCountAvailable];
            if (handler != null)
            {
                handler(this, e);
            }
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;用法与Repeater类似，不多发了～&lt;/p&gt;</description><pubDate>Sat, 11 Feb 2012 18:05:34 GMT</pubDate></item><item><title>CSS的z-index Demo</title><link>http://www.wyjexplorer.cn/Blog/View/B4F69B1BC99DDB13.html</link><description>&lt;p&gt;写了个最简单的DEMO，演示了3个DIV互相遮盖的情况。&lt;/p&gt;
&lt;p&gt;记住：z-index要配合position属性才有效！&lt;/p&gt;
&lt;p&gt;效果图：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/zindexfuck_201202101727491562.PNG" alt="" width="402" height="354" /&gt;&lt;/p&gt;
&lt;p&gt;全部代码：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;

&amp;lt;head&amp;gt;
&amp;lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type" /&amp;gt;
&amp;lt;title&amp;gt;CSS z-index demo - Edi&amp;lt;/title&amp;gt;

&amp;lt;script type="text/javascript" language="javascript" src="jquery-1.7.1.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type="text/javascript" language="javascript"&amp;gt;

&amp;lt;/script&amp;gt;

&amp;lt;style type="text/css"&amp;gt;
	*
	{
		margin: 0;
		padding: 0;
	}
	
	.box
	{
		width: 256px;
		padding: 5px;
		border: 1px solid #000;
		margin: 20px;
		height: auto;
	}
	
	#box1
	{
		background-color: #F4F4F4;
	}
	
	#box2
	{
		background-color: #FFC;
		position: relative;
		z-index: 1;
		margin-top: -80px;
		margin-left: 50px;
	}
	
	#boxinbox
	{
		background-color: #F00;
		position: relative;
		z-index: 2;
		margin-left: -20px;
		width: 80px;
	}

&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
	&amp;lt;div class="box" id="box1"&amp;gt;
		&amp;lt;div&amp;gt;Tasks&amp;lt;/div&amp;gt;
		&amp;lt;div&amp;gt;
		SharePoint 2010客户端开发身份验证，如果开发客户端运行的环境是在域环境中，&lt;br /&gt;那么SharePoint是采取默认认证方式，如果不是域环境中的机器，那么就需要下面的认证方法。
		&amp;lt;div id="boxinbox"&amp;gt;HAHA&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;

	&amp;lt;div class="box" id="box2"&amp;gt;
		&amp;lt;div&amp;gt;Defects&amp;lt;/div&amp;gt;
		&amp;lt;div&amp;gt;
		开闭原则指的是一个软件实体应对对扩展开发，对修改关闭&lt;br /&gt;(Software entities should be open for extension, but closed for modification)。&lt;br /&gt;这个原则是说在设计一个模块的时候，应对使这个模块可以在不被修改的前提下被扩展，&lt;br /&gt;换言之，应对可以不必修改源代码的情况下 改变这个模块的行为。
		&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/pre&gt;</description><pubDate>Fri, 10 Feb 2012 17:28:09 GMT</pubDate></item><item><title>关于C# if语句中并列条件的执行</title><link>http://www.wyjexplorer.cn/Blog/View/68A4FCFD13810302.html</link><description>&lt;p&gt;我们知道，当两个条件进行逻辑与操作的时候，其中任何一个条件为假，则表达式的结果为假。所以，遇到（A 且 B）这种表达式，如果A为假的话，B是不是真假都无所谓了，当遇到一个假条件的时候，程序也就没有必要去额外的判断剩下的东西了。C#语言中也是如此。当多个条件进行逻辑与操作的时候，判定会从表达式左边执行到右边，遇到任何一个为假，后面就都不做了。这很聪明，然而如果后面的条件会抛出异常，就是个潜在的问题。一旦之前的条件为真，就会继续执行，执行到抛出异常的条件时，程序就爆了，哈哈。&lt;/p&gt;
&lt;p&gt;我们可以写个简单的demo试试。下面的这段代码是坑爹的，之后我会说明原因，但大家可以先从直观的层面上理解一下，最后我会给出正确的测试方法。&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;static void Main(string[] args)
{
    DataSet ds = null;

    if (false &amp;&amp; ds.Tables[0].Rows.Count &gt; 0)
    {
        Console.WriteLine("Fuck");
    }
    else
    {
        Console.WriteLine("Shit");
    }

    if (true &amp;&amp; ds.Tables[0].Rows.Count &gt; 0)
    {
        Console.WriteLine("WOW");
    }
    else
    {
        Console.WriteLine("KAO");
    }

    Console.ReadKey();
}&lt;/pre&gt;
&lt;p&gt;这段代码乍看没问题，并且在运行时也给出了我们期望的结果，即第一段语句输出Shit，不抛出异常（当前面为false，后面会抛异常的ds.Tables[0].Rows.Count &gt; 0就不做），而第二段语句因为之前是true，所以要执行对dataset的判断，所以抛出异常。但如果用reflector反编译程序集，就会发现，编译器已经把上面的代码优化成了下面这种形式，我们的if语句中写死的true和false已经被阉割掉了，所以并不能说明if语句执行的问题。&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;private static void Main(string[] args)
{
    DataSet ds = null;
    Console.WriteLine("Shit");
    if (ds.Tables[0].Rows.Count &gt; 0)
    {
        Console.WriteLine("WOW");
    }
    else
    {
        Console.WriteLine("KAO");
    }
    Console.ReadKey();
}&lt;/pre&gt;
&lt;p&gt;其实，如果你仔细观察，在输入这段代码的过程中，VS就已经提示if (false &amp;&amp; ds.Tables[0].Rows.Count &gt; 0)中，后者是不可达的。这是即时编译的效果。既然即时编译说后面的代码不可达，就意味着不可达的代码会在编译期被切掉。因此，刚才我们在上面看到的编译结果也就是自然的事情了。&lt;/p&gt;
&lt;p&gt;同样，如果你直接把1 == 0, 1 == 1这样的条件拼上去的话，编译器也会发现的。所以我们要找一种不会被编译器发现的写法，要让我们的条件判定代码只能在运行时执行，而不是编译时被调整。比如下面这种：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;static void Main(string[] args)
{
    DataSet ds = null;

    int i = 0;
    int j = 1;

    if (i + j == 0 &amp;&amp; ds.Tables[0].Rows.Count &gt; 0)
    {
        Console.WriteLine("Fuck");
    }
    else
    {
        Console.WriteLine("Shit");
    }

    if (i + j == 1 &amp;&amp; ds.Tables[0].Rows.Count &gt; 0)
    {
        Console.WriteLine("WOW");
    }
    else
    {
        Console.WriteLine("KAO");
    }

    Console.ReadKey();
}&lt;/pre&gt;
&lt;p&gt;我们再来执行，发现这次的结果是真正意义的满足了我们的目的，说明了当多个条件进行逻辑与的时候，C#的执行机制：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/iffucks_201202081708298593.PNG" alt="" width="621" height="275" /&gt;&lt;/p&gt;
&lt;p&gt;写这篇文章的意义，是为了让大家在写程序的时候，注意条件中可能发生异常的地方。比如我们模拟String.IsNullOrEmpty()。&lt;/p&gt;
&lt;p&gt;在or关系中，只要有一个true，整个表达式就是true了。但如果你让可能引发异常的语句先于之后会返回true的语句执行，就会爆。&lt;/p&gt;
&lt;p&gt;比如这样写的话会爆，因为判断Length的前提是得有个string：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public static bool IsNullOrEmpty(string str)
{
    if (str.Length == 0 || str == null)
    {
        return true;
    }
    return false;
}&lt;/pre&gt;
&lt;p&gt;&lt;img src="/Uploads/stringfuck_201202081709513750.PNG" alt="" width="568" height="280" /&gt; &lt;/p&gt;
&lt;p&gt;这样写就正常：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public static bool IsNullOrEmpty(string str)
{
    if (str == null || str.Length == 0)
    {
        return true;
    }
    return false;
}&lt;/pre&gt;
&lt;p&gt;&lt;img src="/Uploads/stringnullok_201202081712243437.PNG" alt="" width="377" height="322" /&gt;&lt;/p&gt;
&lt;p&gt;微软是这样写的，碉堡了！&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public static bool IsNullOrEmpty(string value)
{
    if (value != null)
    {
        return (value.Length == 0);
    }
    return true;
}&lt;/pre&gt;
&lt;p&gt;上面这段代码可以用reflector打开mscorlib中的System.String找到～ &lt;/p&gt;</description><pubDate>Wed, 08 Feb 2012 17:13:37 GMT</pubDate></item><item><title>JQuery1.7中文API手册(CHM格式)下载</title><link>http://www.wyjexplorer.cn/Blog/View/AE009DD0B922141C.html</link><description>&lt;p&gt;JQuery1.7的手册找了很多次了，都TM是要注册，回复，扣积分下载的。哥把下到的共享出来，直接可以下载！如果打开CHM什么也看不到的朋友请在文件属性里点击“解除锁定”。如图：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/jqchm_201202041924530625.PNG" alt="" width="377" height="485" /&gt;&lt;/p&gt;
&lt;p&gt;另发一本英文版，带JQuery UI的参考手册：&lt;/p&gt;
&lt;p&gt;&lt;a href="/BlogAttachment/jquery_with_ui_api_1_7_1_en.rar"&gt;传送门：JQuery 1.7及JQuery UI 英文API(CHM)2.20MB&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sat, 04 Feb 2012 19:26:11 GMT</pubDate></item><item><title>C#字符和ASCII码互转</title><link>http://www.wyjexplorer.cn/Blog/View/E3864BE9831A70DF.html</link><description>&lt;p&gt;废话不多，直接上代码。&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;static void Main(string[] args)
{
    char[] charFucks = new char[] { 'f', 'u', 'c', 'k' };
    foreach (var item in charFucks)
    {
        Console.Write(Convert.ToInt32(item) + " ");
    }

    Console.WriteLine();

    int[] asciiFucks = new int[] { 102, 117, 99, 107 };
    foreach (var item in asciiFucks)
    {
        Console.Write((char)item);
    }

    Console.ReadKey();
}&lt;/pre&gt;
&lt;p&gt;有图有真相：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/csharpascii_201202021704008906.PNG" alt="" width="344" height="211" /&gt;&lt;/p&gt;</description><pubDate>Thu, 02 Feb 2012 17:04:27 GMT</pubDate></item><item><title>JQuery让页脚部固定在网页底部</title><link>http://www.wyjexplorer.cn/Blog/View/6330322638CBA1D1.html</link><description>&lt;p&gt;一般，在网页上，如果内容较少，页脚就会跑到屏幕中间去，可能会让用户感到蛋疼。&lt;/p&gt;
&lt;p&gt;上次看了一篇文章，用CSS的办法来固定页脚到浏览器窗口底部。他优点很明显，不需要JS，并且在调整浏览器窗口大小的时候仍然可以自适应，但写法略复杂，如果项目比较赶进度，就不太能用上了。&lt;/p&gt;
&lt;p&gt;今天我就遇到了赶进度的蛋疼事情，所以用JQuery简单搞了一个，但本人前端开发水平很烂，有不完善的地方，高手莫喷。代码如下：&lt;/p&gt;
&lt;pre class="brush: jscript;fontsize: 100; first-line: 1; "&gt;// 重定位页脚函数
function repositionFooter(){
	var h = $(window).height();
	$(".innerBlock").css('min-height',h - 230)
};

// 用户调整窗口大小时重定位页脚
var resizeTimer = null;
$(window).bind('resize', function(){
	if(resizeTimer) clearTimeout(resizeTimer);
	resizeTimer = setTimeout(repositionFooter,100);
	
});

// 页面加载的时候重定位页脚
$(document).ready(repositionFooter);&lt;/pre&gt;
&lt;p&gt;.innerBlock是内容box的class，这段代码的作用是：获取当前document对象的高度，然后减去header的高度，设给内容box，于是页脚就在屏幕最下面了。 &lt;/p&gt;</description><pubDate>Wed, 01 Feb 2012 16:57:37 GMT</pubDate></item><item><title>VMWare安装Windows 8 Developer Preview蓝屏的解决办法</title><link>http://www.wyjexplorer.cn/Blog/View/7B829B2D7DA28214.html</link><description>&lt;p&gt;昨天晚上想试一下Win8，用VMWare8装了一下，结果在"Getting Devices Ready"的时候爆了：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/1_201201280844347812.PNG" alt="" width="805" height="605" /&gt;&lt;/p&gt;
&lt;p&gt;重启之后，又爆了：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2_201201280845386406.PNG" alt="" width="585" height="454" /&gt;&lt;/p&gt;
&lt;p&gt;根据经验，这应该是安装硬件驱动的时候爆了，说明Win8无法正确识别VMWare的硬件。但很奇怪，我记得网上说VMWare8是可以装Windows8的。经过一番摸索，终于找到了正确的安装办法：&lt;/p&gt;
&lt;p&gt;首先，创建虚拟机的时候要选Custom：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vmwin8-0_201201280851255468.PNG" alt="" width="446" height="461" /&gt;&lt;/p&gt;
&lt;p&gt;然后选Workstation 8.0&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vmwin8-1_201201280851314062.PNG" alt="" width="448" height="462" /&gt;&lt;/p&gt;
&lt;p&gt;选择 I will install the operating system later.&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vmwin8-2_201201280851341406.PNG" alt="" width="445" height="461" /&gt;&lt;/p&gt;
&lt;p&gt;这里选Windows系统，在Version里选择Windows7，如果你下载的Win8镜像是64位的，就选Windows7 x64&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vmwin8-3_201201280851366875.PNG" alt="" width="446" height="462" /&gt;&lt;/p&gt;
&lt;p&gt;到Network Type这步的时候，选择Bridged networking&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vmwin8-4_201201280851392187.PNG" alt="" width="444" height="460" /&gt;&lt;/p&gt;
&lt;p&gt;然后一路next到虚拟机创建完成。然后打开设置，做最重要的一步：把软驱Remove掉！&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vmwin8-5_201201280851416250.PNG" alt="" width="508" height="590" /&gt;&lt;/p&gt;
&lt;p&gt;OK，接下来该怎么装就怎么装吧 :)&lt;/p&gt;</description><pubDate>Sat, 28 Jan 2012 08:56:02 GMT</pubDate></item><item><title>GridView手写事件，包括取主键、取值、更新、选择、删除</title><link>http://www.wyjexplorer.cn/Blog/View/4F671BE81F5637A9.html</link><description>&lt;p&gt;刚才在调整网站友情链接管理页面，里面有个简单的GridView。因为更改了架构，所以需要手工给GridView编写编辑、删除等事件。最近也经常碰到有人问我GridView的问题，于是写成经验之书以警后人。&lt;/p&gt;
&lt;p&gt;图片是本网站后台的友情链接管理页面：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/12_201201251041441406.PNG" alt="" width="703" height="532" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 手写[编辑]功能时，要编写的事件：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一共有3个：&lt;/p&gt;
&lt;p&gt;RowEditing&lt;/p&gt;
&lt;p&gt;RowCancelingEdit&lt;/p&gt;
&lt;p&gt;RowUpdating&lt;/p&gt;
&lt;p&gt;前两者的代码比较固定，一般都是：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;protected void gvFriendLink_RowEditing(object sender, GridViewEditEventArgs e)
{
    gvFriendLink.EditIndex = e.NewEditIndex;
    FetchData();
}

protected void gvFriendLink_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    gvFriendLink.EditIndex = -1;
    FetchData();
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;其中，FetchData()是给GridView绑定数据的方法。EditIndex = -1的意思是退出编辑模式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 在RowUpdating事件中的取值问题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2.1 取不到值&lt;/p&gt;
&lt;p&gt;如果你直接访问GridView.Row[i].Cell[j].Text是没用的。因为在编辑模式下，这个Cell里其实是有控件的，在这个例子里是个TextBox。所以我们需要强制类型转换一下：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;protected void gvFriendLink_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    GeekStudio.ORM.Model.FriendLink model = new GeekStudio.ORM.Model.FriendLink()
    {
        Id = Convert.ToInt32(((TextBox)gvFriendLink.Rows[gvFriendLink.EditIndex].Cells[1].Controls[0]).Text),
        Title = ((TextBox)gvFriendLink.Rows[gvFriendLink.EditIndex].Cells[2].Controls[0]).Text,
        Url = ((TextBox)gvFriendLink.Rows[gvFriendLink.EditIndex].Cells[3].Controls[0]).Text,
        OrderId = Convert.ToInt32(((TextBox)gvFriendLink.Rows[gvFriendLink.EditIndex].Cells[4].Controls[0]).Text)
    };

    optFriendLink.Update(model);

    gvFriendLink.EditIndex = -1;
    FetchData();
}&lt;/pre&gt;
&lt;p&gt;2.2 取不到新值&lt;/p&gt;
&lt;p&gt;如果你在GridView编辑的时候，明明填写了新值，更新之后却不变，比如单元格里原先是abc，你编辑的时候写了abcd，走到更新事件中，获取的值还是abc。这时候你要检查，你是不是忘记判断页面PostBack了？&lt;/p&gt;
&lt;p&gt;解决办法：把数据绑定方法写在if(!Page.IsPostBack)里面&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        FetchData();            
    }
}

protected void FetchData()
{
    gvFriendLink.DataSource = optFriendLink.GetModelList(0);
    gvFriendLink.DataBind();
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. 手写删除事件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;做删除操作，我们只要编写RowDeleting事件就可以：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;protected void gvFriendLink_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    int id = Convert.ToInt32(gvFriendLink.Rows[e.RowIndex].Cells[1].Text);
    optFriendLink.Delete(id);
    FetchData();
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4. 获取主键的办法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;细心的童鞋会发现，在刚才的删除事件中，我获取主键的方法非常傻逼，居然是直接访问Cells[1]，也就是第二个单元格的值。但很多时候，项目里要求GridView上不能显示数据库中的主键字段，怎么办呢？&lt;/p&gt;
&lt;p&gt;其实GridView自带访问主键的属性，叫做DataKey。&lt;/p&gt;
&lt;p&gt;为了用这个属性，你首先得给GridView指定一个DataKeyName&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/dkname_201201251101320625.PNG" alt="" width="240" height="372" /&gt;&lt;/p&gt;
&lt;p&gt;然后在代码里你就可以访问某行对应的主键了：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;int id = Convert.ToInt32(gvFriendLink.DataKeys[e.RowIndex].Value);&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5. GridView中选取某行的操作&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我的友情链接模块没有这个需求，所以给贴一个以前做的选课系统里的例子：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;protected void gvCourses_SelectedIndexChanged(object sender, EventArgs e)
{
    int userId = uid;
    int courseId = Convert.ToInt32(gvCourses.SelectedRow.Cells[0].Text);
    dalUca.Add(new Course.Model.UserCourseAssociation() { UserId = userId, CourseId = courseId });
    FetchAllCourse();
    FetchUserCourse(userId);
}&lt;/pre&gt;
&lt;p&gt;其实就是一个SelectedIndexChanged事件。但前提是你的GridView里必须有某个按钮可以触发这个事件：&lt;/p&gt;
&lt;p&gt;一般是一个Select Command：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;asp:CommandField ShowSelectButton="True" /&amp;gt;&lt;/pre&gt;</description><pubDate>Wed, 25 Jan 2012 11:13:20 GMT</pubDate></item><item><title>网站建设的一些体会——技术背后的思考</title><link>http://www.wyjexplorer.cn/Blog/View/2E2A46CFE1B78030.html</link><description>&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt;&lt;strong&gt;极致的高深就是简洁&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我是今年六月开始我的毕业设计的，这个项目是对我大一时做的个人网站进行重构，算是个维护项目。刚开始时，我就预感到这是一项艰巨的任务。首先，在用户界面上，我需要创作一个新的形象。大一时设计的旧版界面已经略显过时了。在新版面的设计上，我不想给访客留下诸如“简陋”——设计的过于简单，或“华而不实”——漂亮但不中用的印象。我研究了国内外许多网站，最终体会到一个事实——极致的高深就是简洁。所以设计的大方向已经确定——尽量减少页面元素和装饰，通过科学的排版体现信息的本质。一个经久的设计一定是简洁的设计。同年微软针在Windows8 BUILD大会展示的Metro界面也印证了这个未来的设计趋势。&lt;/p&gt;
&lt;p&gt;对于我来说，我是学计算机的，没有专门学过视觉设计，因此我购买了许多UI设计类的图书来学习。但至今，我并没有对自己的设计感到满意。我已经发现，“极致的高深就是简洁”其实更侧重与人的素养，一个优秀的设计，是设计师本身心灵价值的体现。如果思想境界不够高尚，还要去模仿简洁风格的设计，那最终的作品给人的感觉就是简陋，恰好反应了设计师本身的素质。这些思考让我看到了很多技术以外的东西——我曾经一味追求技术上的深入，但忽略了很多应该从生活中体会的内容。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. &lt;/strong&gt;&lt;strong&gt;一个良好的设计，应该要满足当前时代背景下的人们普遍的价值取向。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你的设计可能的确非常优秀，但可惜的是多数人的思想觉悟不够高，不能体会你的高深内涵，于是你会觉得高处不胜寒。历史上许多著名的科学家的苦逼故事都印证了这一点，比如玩豌豆的那位孟德尔，太苦逼了。至于高处不胜寒，不谦虚的说，我本人有太多感触了——和别人不一样是非常苦逼的，这可能会让你变成毅丝。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. &lt;/strong&gt;&lt;strong&gt;如果一样东西是精品，那么请保持它的少数。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当初我发现微软的Metro风格时，我曾经做了件蠢事——刻意去模仿Windows 8的Metro开始界面，即在网站的每处都采用颜色块进行设计，而且是五颜六色的。但让我感到奇怪的是，为什么Metro在微软的网站上看起来如此清爽，但在我的网站上看缺适得其反呢？——我甚至不能引导用户的视线。最终我发现了一个道理：Metro颜色块之所以好看，是因为大量的空白衬托了这一设计。也就是绿叶才能衬托鲜花——如果一朵花生长在一片花丛中，你根本不会注意到它。很可惜，在我们国家，一旦某事物被公开了它的价值，那么它就会被炒烂，最终失去价值——四六级、公务员。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt;&lt;strong&gt;不要认为没用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我的另一个工作是代码重构与重写。重写很简单——如果现有模块不能正常工作，我就会重写它。但重构比较特殊，因为这不是一个“对于错”的过程，而是一个“好与更好”的过程。重构是幕后工作，因为它的定义就是：在不改变软件的可观察行为的前提下，调整现有的代码，提高其可理解性，降低修改的成本。这就意味着从网站的访客的角度，是看不出网站幕后发生的变化的。就算你写了非常棒的代码，人家也是不知道的——从他们的角度看，一个傻瓜程序员写的代码和一个资深程序员写的代码，最后展现给用户的行为是一致的。用户并不关心技术，他们只要可用的软件。所以从这方面来讲，重构确实有点吃力不讨好。&lt;/p&gt;
&lt;p&gt;但我做的真的是无用功吗？&lt;/p&gt;
&lt;p&gt;设想，如果需求发生变化，程序需要拓展，这时候经过重构的代码，其应对修改的能力非常强，会让你从痛苦中解脱出来。这也是为什么在公司里，项目做完之后，程序员还会代码进行调整。不然以后需求一变，就又有一帮苦逼要加班了。所以说，不要认为你所做的事情没用——聪明地去做事，可能现在尝不到甜头，但受用时一下就能把别人拉开十万八千里。所以我们要经常对自己进行重构。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt;&lt;strong&gt;矛盾和辨证&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我体会到的一点就是封装性和灵活度的把握：程序员希望保持良好的封装，即使用某个模块十分简单。但程序员也希望在必要时，能够保持灵活性——自己可以控制细小的单元。讽刺的是，这两种期望本身就是矛盾的——鱼和熊掌不可兼得，所以，如何把握其中的平衡点，是个很有考究的事情，这需要良好的洞察力。&lt;/p&gt;
&lt;p&gt;总结：技术学到一定境界，就是在学做人，然后通过对自己的重构，重新反应到技术上。这是我目前最大的感悟，写成经验之书，以警后人。&lt;/p&gt;
&lt;p&gt;对了，本人思想觉悟不够高尚，此文可能略水，请高手们不要贱笑。&lt;/p&gt;</description><pubDate>Tue, 24 Jan 2012 17:48:09 GMT</pubDate></item><item><title>VS2010如何调试IIS上的网站</title><link>http://www.wyjexplorer.cn/Blog/View/4E6859FE1E6691A4.html</link><description>&lt;p&gt;通常，我们在Visual Studio里调试ASP.NET网站，都是加个断点，然后按F5，在VS自带的虚拟服务器下调试的。但有时候，VS自带的服务器弱爆了，无法满足一些特定情况的要求，我们必须把网站放在IIS里跑。这下该怎么调试呢？&lt;/p&gt;
&lt;p&gt;其实很简单， 首先还是和原来一样，加上断点。但不要按F5了。选择工具菜单（调试菜单也可以），附加到进程。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/debugiis0_201201231316522031.PNG" alt="" width="678" height="341" /&gt;&lt;/p&gt;
&lt;p&gt;然后会惊现一个对话框，勾选最下面的两个复选框：显示所有用户进程、显示所有会话中的进程。然后选择IIS进程，即w3wp.exe。最后点击"附加"。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/debugiis1_201201231318048750.PNG" alt="" width="854" height="659" /&gt;&lt;/p&gt;
&lt;p&gt;现在打开你的浏览器，访问IIS中的网站，并触发要调试的程序。小卡一会儿后，光标就成功跳到断点处了，和以前一样可以DEBUG了，碉堡啦！！！&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/debugiis2_201201231320082500.PNG" alt="" width="767" height="424" /&gt;&lt;/p&gt;</description><pubDate>Mon, 23 Jan 2012 13:20:52 GMT</pubDate></item><item><title>ASP.NET生成验证码</title><link>http://www.wyjexplorer.cn/Blog/View/5BC460B0653C3C76.html</link><description>&lt;p&gt;好吧，生成验证码不是什么秘密了。原理是产生随机字符，并将字符生成为图片，同时储存到Session里去，然后验证用户输入的内容是否与Session中的验证码相符。下面是本人网站生成验证码的handler：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;&amp;lt;%@ WebHandler Language="C#" Class="VDC" %&amp;gt;

using System;
using System.Web;
using System.Drawing;

public class VDC : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
    //产生验证码的字符集(去除I 1 l L，O 0等易混字符)
    public string charSet = "2,3,4,5,6,8,9,A,B,C,D,E,F,G,H,J,K,M,N,P,R,S,U,W,X,Y";

    public void ProcessRequest(HttpContext context)
    {
        string validateCode = CreateRandomCode(4);
        context.Session["ValidateCode"] = validateCode;
        CreateImage(validateCode, context);
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// 生成验证码
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="n"&amp;gt;位数&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;验证码字符串&amp;lt;/returns&amp;gt;
    private string CreateRandomCode(int n)
    {
        string[] CharArray = charSet.Split(',');
        string randomCode = "";
        int temp = -1;

        Random rand = new Random();
        for (int i = 0; i &amp;lt; n; i++)
        {
            if (temp != -1)
            {
                rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
            }
            int t = rand.Next(CharArray.Length - 1);
            if (temp == t)
            {
                return CreateRandomCode(n);
            }
            temp = t;
            randomCode += CharArray[t];
        }
        return randomCode;
    }

    private void CreateImage(string checkCode, HttpContext context)
    {
        int iwidth = (int)(checkCode.Length * 13);
        System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 23);
        Graphics g = Graphics.FromImage(image);
        Font f = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Italic | System.Drawing.FontStyle.Bold));

        // 前景色
        Brush b = new System.Drawing.SolidBrush(Color.Black);

        // 背景色
        g.Clear(Color.White);

        // 填充文字
        g.DrawString(checkCode, f, b, 0, 1);

        // 随机线条
        Pen linePen = new Pen(Color.Gray, 0);
        Random rand = new Random();
        for (int i = 0; i &amp;lt; 5; i++)
        {
            int x1 = rand.Next(image.Width);
            int y1 = rand.Next(image.Height);
            int x2 = rand.Next(image.Width);
            int y2 = rand.Next(image.Height);
            g.DrawLine(linePen, x1, y1, x2, y2);
        }

        // 随机点
        for (int i = 0; i &amp;lt; 30; i++)
        {
            int x = rand.Next(image.Width);
            int y = rand.Next(image.Height);
            image.SetPixel(x, y, Color.Gray);
        }

        // 边框
        g.DrawRectangle(new Pen(Color.Gray), 0, 0, image.Width - 1, image.Height - 1);

        // 输出图片
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        context.Response.ClearContent();
        context.Response.ContentType = "image/Jpeg";
        context.Response.BinaryWrite(ms.ToArray());
        g.Dispose();
        image.Dispose();
    }

}&lt;/pre&gt;
&lt;p&gt;验证码图片效果：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vdc_201201231235375468.PNG" alt="" width="54" height="28" /&gt;&lt;/p&gt;
&lt;p&gt;使用方法：&lt;/p&gt;
&lt;p&gt;在网页里加入一个image控件，把url指定为这个handler，再弄个文本框给用户输入验证码。&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;asp:Image runat="server" ID="VDCode" CssClass="icoimg" ImageUrl="VDC.ashx"&amp;gt;&amp;lt;/asp:Image&amp;gt;&lt;/pre&gt;
&lt;p&gt;验证方法：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;if (txtValidateCode.Text.Trim() == Session["ValidateCode"].ToString()) {.....}&lt;/pre&gt;</description><pubDate>Mon, 23 Jan 2012 12:38:15 GMT</pubDate></item><item><title>Visual Studio成就系统初体验</title><link>http://www.wyjexplorer.cn/Blog/View/583B03F2587F7F35.html</link><description>&lt;p&gt;话说Code4Fun的那帮家伙真是太闲了，发明了一个VS的成就插件，就和魔兽世界里的成就系统差不多。今天下下来玩了一把，挺不错的。&lt;/p&gt;
&lt;p&gt;首先在VS2010的拓展管理器里，下载并安装Visual Studio Achievements。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/1_201201221051199218.PNG" alt="" width="957" height="661" /&gt;&lt;/p&gt;
&lt;p&gt;重启Visual Studio以后，第一次会让你登录自己的账户，可以用Live帐号登录。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2_201201221053068750.PNG" alt="" width="1024" height="563" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/3_201201221053541718.PNG" alt="" width="1026" height="562" /&gt;&lt;/p&gt;
&lt;p&gt;登录成功以后，会弹出这个界面，选择Yes! Authorize this!：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/4_201201221054327812.PNG" alt="" width="1027" height="563" /&gt;&lt;/p&gt;
&lt;p&gt;随后，两个成就立即解锁，屌爆了：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/6_201201221055227031.PNG" alt="" width="515" height="230" /&gt;&lt;/p&gt;
&lt;p&gt;如果要查看自己的成就，可以工具-Achievements菜单里找到：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/7_201201221057056562.PNG" alt="" width="873" height="641" /&gt;&lt;/p&gt;
&lt;p&gt;更牛逼的是，这个成就系统还提供了public API和widget，可以很方便的把自己的成就整合到个人博客上去。也可以使用这个API自己封装一个ASP.NET或其他平台的组件，专门显示成就，这似乎也挺蛋疼的。&lt;/p&gt;
&lt;p&gt;传送门：&lt;a href="http://channel9.msdn.com/Blogs/C9Team/Visual-Studio-Achievements-API" target="_blank"&gt;Visual Studio Achievements API&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;传送门：&lt;a href="http://channel9.msdn.com/Blogs/C9Team/Visual-Studio-Achievements-Widget" target="_blank"&gt;Visual Studio Achievements&amp;nbsp;Widget&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果图方便的话，Widget是最省事的，把一小段JavaScript代码嵌入在页面上即可，这是我用Widget的效果（该页面在我本机，还未发布到网站上）：&lt;/p&gt;
&lt;p&gt;脚本：&lt;/p&gt;
&lt;pre class="brush: jscript;fontsize: 100; first-line: 1; "&gt;&amp;lt;script src="http://video.ch9.ms/widgets/VSachievements.min.js?user=wyjexplorer&amp;amp;maxAchievements=10" id="ch9VSachievements" defer="defer"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/8_201201221100491875.PNG" alt="" width="762" height="747" /&gt;&lt;/p&gt;
&lt;p&gt;如果你看不到你的用户名，去Channel 9上面设置一下自己的profile就好了：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/9_201201221102549375.PNG" alt="" width="439" height="223" /&gt;&lt;/p&gt;</description><pubDate>Sun, 22 Jan 2012 11:06:45 GMT</pubDate></item><item><title>SharePoint 2010 MasterPage及Layout的弄法</title><link>http://www.wyjexplorer.cn/Blog/View/077790473D908570.html</link><description>&lt;p&gt;&lt;strong&gt;自定义MasterPage的方法：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;代码部分：&lt;/p&gt;
&lt;p&gt;需要一个master文件和一个aspx（layout）文件。比如：AMWUIMaster.master和AMWUILayout.aspx。&lt;/p&gt;
&lt;p&gt;AMWUILayout.aspx里要注意路径：&lt;/p&gt;
&lt;p&gt;&amp;lt;%@ Page Language="C#" Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage" MasterPageFile="&lt;strong&gt;/_catalogs/masterpage/&lt;/strong&gt;AMWUIMaster.master" meta:webpartpageexpansion="full" meta:progid="SharePoint.WebPartPage.Document" %&amp;gt;&lt;/p&gt;
&lt;p&gt;如果是子站点，引用Master的路径会有变，在我机器上是MasterPageFile="&lt;strong&gt;&lt;/strong&gt;AMWUIMaster.master" 。其他环境请自己看一下。&lt;/p&gt;
&lt;p&gt;关于CSS和Script的引用需要在Master里这样写：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;SharePoint:CssLink runat="server" Version="4"/&amp;gt;
    &amp;lt;SharePoint:ScriptLink defer="true" runat="server"/&amp;gt;
   
    &amp;lt;SharePoint:ScriptLink language="javascript" name="core.js" OnDemand="true" runat="server"/&amp;gt;
   
    &amp;lt;SharePoint:CssRegistration name="/_layouts/1033/STYLES/AMW/amw.css" After="corev4.css" runat="server"/&amp;gt;
    &amp;lt;SharePoint:ScriptLink language="javascript" name="/_layouts/1033/amw.js" OnDemand="false" runat="server"/&amp;gt;&lt;/pre&gt;
&lt;p&gt;配置部分：&lt;/p&gt;
&lt;p&gt;1.在Site Settings里的Site Collection Features里激活&lt;strong&gt;SharePoint Server Publishing Infrastructure&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;2.还是Site Settings里：Galleries -&amp;gt; Master Pages。然后把那个master文件和aspx文件传上去。或者在Sharepoint Designer里传。&lt;/p&gt;
&lt;p&gt;重点是属性设置：&lt;/p&gt;
&lt;p&gt;AMWUIMaster.master的属性要改为：Content Type : Master Page&lt;/p&gt;
&lt;p&gt;AMWUILayout.aspx的属性改为：Content Type : Page Layout ，Associated Content Type : Page Layout Content Types -&amp;gt; Welcome Page&lt;/p&gt;
&lt;p&gt;接着把这两个文件Check In，Publish，Approve&lt;/p&gt;
&lt;p&gt;然后建立一个页面测试：&lt;/p&gt;
&lt;p&gt;注意：不要New 一个Page&lt;/p&gt;
&lt;p&gt;测试可行的办法是：Site Actions -&amp;gt; More Options -&amp;gt; Page -&amp;gt; Publish XXX Pages，然后在右边窗格里就可以选我们的Layout了&lt;/p&gt;
&lt;p&gt;碉堡了！&lt;/p&gt;</description><pubDate>Sat, 21 Jan 2012 14:23:32 GMT</pubDate></item><item><title>C#中两个问号(a ?? b)是咩啊？有喵用？</title><link>http://www.wyjexplorer.cn/Blog/View/BE0235FC6F56D2EF.html</link><description>&lt;p&gt;不卖关子，直接开门见山：&lt;/p&gt;
&lt;p&gt;C#中两个问号的作用是判断??左边的对象是否为null，如果不为null则使用??左边的对象，如果为null则使用??右边的对象。&lt;/p&gt;
&lt;p&gt;比如：a = b ?? c，如果b为null，则a = c，如果b不为null，则a = b。&lt;/p&gt;
&lt;p&gt;下面一段代码演示了这两种情况：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;static void Main(string[] args)
{
    NewFuck();
    Shit();
    Console.ReadKey();
}

private static void NewFuck()
{
    string fuck = "Fuck";
    Console.WriteLine(fuck ?? "fuck not found.");
}

private static void Shit()
{
    object shit = null;
    string b = (string)shit ?? "shit not found.";
    Console.WriteLine(b);
}&lt;/pre&gt;
&lt;p&gt;执行结果如图如真相：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/wen0_201201201958275781.PNG" alt="" width="287" height="99" /&gt;&lt;/p&gt;
&lt;p&gt;很明显，这种类似三目表达式的运算符可以用来在妹子面前装B，看个直观的例子：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;//文艺Fuck
private static void NewFuck()
{
    string fuck = "Fuck";
    Console.WriteLine(fuck ?? "fuck not found.");
}

//普通Fuck
private static void Fuck()
{
    string fuck = "Fuck";
    string s = fuck != null ? fuck : "fuck not found.";
    Console.WriteLine(s);
}     

//2BFuck
private static void SBFuck()
{
    string fuck;
    fuck = "Fuck";
    string s;
    if (fuck != null)
    {
        s = fuck;
    }
    else
    {
        s = "fuck not found.";
    }
    Console.WriteLine(s);
}&lt;/pre&gt;
&lt;p&gt;这三个方法在结果上是相同的，都会在屏幕上输出Fuck。当然，写个例子只是Demo级别的，我们在实际编程的时候用??运算符往往更有用，可以省去很多麻烦。比如处理页面QueryString的时候：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;// 原先要这样处理参数：
string tmd = String.Empty;
if (Request["Select"] != null)
{
    tmd = Request["Select"];
}
else
{
    tmd = "All";
}

// 现在重构为：
string tmd1 = Request["Select"] ?? "All";&lt;/pre&gt;
&lt;p&gt;怎么样？有没有觉得屌爆了。Session什么的也可以这么处理。顺便提一句，实际项目中处理参数比这个要复杂。往往包括类型转换等操作。类型转换建议用as操作符，强转不好。&lt;/p&gt;</description><pubDate>Fri, 20 Jan 2012 20:06:18 GMT</pubDate></item><item><title>SharePoint 2010部署项目后找不到WebPart的解决办法</title><link>http://www.wyjexplorer.cn/Blog/View/1B7BC9FB7DEEFC3B.html</link><description>&lt;p&gt;最近被SharePoint坑足了爹，比如部署一个wsp后，插入webpart的时候，在custom里找不到自己的webpart。如果你碰到和我一样的情况，请按以下步骤检查：&lt;/p&gt;
&lt;p&gt;用解压软件打开你的WSP，看看里面是不是有你的webpart。如果没有，可能是你编译的时候忘记package了。&lt;/p&gt;
&lt;p&gt;如果wsp是好的，并且feature也已经激活了，还是看不到webpart，请这样操作：&lt;/p&gt;
&lt;p&gt;1. 在Site Settings，Galleries里选择WebPart：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/webpartfuck0_201201201706299062.PNG" alt="" width="420" height="341" /&gt;&lt;/p&gt;
&lt;p&gt;2. 如果找得到你的WebPart，请检查它是否设置到Custom组里，如果没有请更改设置为Custom就OK了：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/webpartfuck1_201201201706352500.PNG" alt="" width="722" height="51" /&gt;&lt;/p&gt;
&lt;p&gt;3. 如果找不到，请在Document菜单下，选择New：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/webpartfuck2_201201201706400000.PNG" alt="" width="470" height="329" /&gt;&lt;/p&gt;
&lt;p&gt;然后找到并选中你的WebPart，然后点Populate Gallery：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/webpartfuck3_201201201706437187.PNG" alt="" width="417" height="196" /&gt;&lt;/p&gt;
&lt;p&gt;然后&lt;strong&gt;别忘了去把这个设为Custom&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果连这里面都没有，那我也不知道了，你就只能自己看一下了&amp;hellip;&amp;hellip;&lt;/p&gt;</description><pubDate>Fri, 20 Jan 2012 17:10:19 GMT</pubDate></item><item><title>C#自动属性的实质</title><link>http://www.wyjexplorer.cn/Blog/View/223AB727B589C173.html</link><description>&lt;p&gt;C#自动属性很爽，但它并不是真正意义上去掉了private字段，只是编译器帮我们做了这件事情。我们可以写个类测试一下：&lt;/p&gt;
&lt;p&gt;原始C#代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public class PropTest
{
    public int MyProperty { get; set; }

    public string Abc { get; private set; }

    public void Test()
    {
        MyProperty = 1;
        Abc = "fuck";
    }
}&lt;/pre&gt;
&lt;p&gt;上面这段代码没有写private字段，看似很好，但编译过后，在IL里其实是这样的：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;.class public auto ansi beforefieldinit PropTest
    extends [mscorlib]System.Object
{
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
    {
        .maxstack 8
        L_0000: ldarg.0 
        L_0001: call instance void [mscorlib]System.Object::.ctor()
        L_0006: ret 
    }

    .method public hidebysig instance void Test() cil managed
    {
        .maxstack 8
        L_0000: nop 
        L_0001: ldarg.0 
        L_0002: ldc.i4.1 
        L_0003: call instance void TestConsole.PropTest::set_MyProperty(int32)
        L_0008: nop 
        L_0009: ldarg.0 
        L_000a: ldstr "fuck"
        L_000f: call instance void TestConsole.PropTest::set_Abc(string)
        L_0014: nop 
        L_0015: ret 
    }


    .property instance string Abc
    {
        .get instance string TestConsole.PropTest::get_Abc()
        .set instance void TestConsole.PropTest::set_Abc(string)
    }

    .property instance int32 MyProperty
    {
        .get instance int32 TestConsole.PropTest::get_MyProperty()
        .set instance void TestConsole.PropTest::set_MyProperty(int32)
    }


    .field private string &amp;lt;Abc&amp;gt;k__BackingField
    {
        .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
    }

    .field private int32 &amp;lt;MyProperty&amp;gt;k__BackingField
    {
        .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
    }

}&lt;/pre&gt;
&lt;p&gt;翻译回C#，就是这样的：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public class PropTest
{
    // Fields
    [CompilerGenerated]
    private string &amp;lt;Abc&amp;gt;k__BackingField;
    [CompilerGenerated]
    private int &amp;lt;MyProperty&amp;gt;k__BackingField;

    // Methods
    public void Test()
    {
        this.MyProperty = 1;
        this.Abc = "fuck";
    }

    // Properties
    public string Abc
    {
        [CompilerGenerated]
        get
        {
            return this.&amp;lt;Abc&amp;gt;k__BackingField;
        }
        [CompilerGenerated]
        private set
        {
            this.&amp;lt;Abc&amp;gt;k__BackingField = value;
        }
    }

    public int MyProperty
    {
        [CompilerGenerated]
        get
        {
            return this.&amp;lt;MyProperty&amp;gt;k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            this.&amp;lt;MyProperty&amp;gt;k__BackingField = value;
        }
    }
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;可以看到，编译器给我们自动生成了2个private字段，碉堡了！&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description><pubDate>Wed, 18 Jan 2012 17:21:09 GMT</pubDate></item><item><title>SharePoint 2010如何删除一个wsp</title><link>http://www.wyjexplorer.cn/Blog/View/F0DE161C7C9573CB.html</link><description>&lt;p&gt;最近被SharePoint的项目搞的蛋都碎了。抽空整理一下一些经验以警后人～&lt;/p&gt;
&lt;p&gt;话说要在SharePoint 2010里删除一个Feature或者一个WebPart，似乎只能删整个Solution，也就是部署上去的那个wsp文件。方法是这样的：&lt;/p&gt;
&lt;p&gt;1.以管理猿身份运行Central Administration，然后再&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;左边的&lt;/strong&gt;&lt;/span&gt;System Settings里，选择&lt;strong&gt;Manage farm solutions&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/RemoveSolution%20(1)_201201172048562187.PNG" alt="" width="727" height="398" /&gt;&lt;/p&gt;
&lt;p&gt;2.选择你要删除的wsp，比如amw.ui.wsp&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/RemoveSolution%20(2)_201201172049078750.PNG" alt="" width="569" height="379" /&gt;&lt;/p&gt;
&lt;p&gt;3.选择Retract Solution&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/RemoveSolution%20(3)_201201172049124218.PNG" alt="" width="593" height="417" /&gt;&lt;/p&gt;
&lt;p&gt;4.选择Now，也就是立即Retract&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/RemoveSolution%20(4)_201201172049169687.PNG" alt="" width="387" height="341" /&gt;&lt;/p&gt;
&lt;p&gt;5. 现在可以看到amw.ui.wsp的状态是Retracting，稍等片刻再刷新，就变成了Not Deployed&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/RemoveSolution%20(5)_201201172049204531.PNG" alt="" width="472" height="65" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/RemoveSolution%20(6)_201201172049242187.PNG" alt="" width="442" height="80" /&gt;&lt;/p&gt;
&lt;p&gt;6. 再次点击amw.ui.wsp，选择Remove Solution&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/RemoveSolution%20(7)_201201172049278281.PNG" alt="" width="437" height="276" /&gt;&lt;/p&gt;
&lt;p&gt;搞定！&lt;/p&gt;</description><pubDate>Tue, 17 Jan 2012 20:54:22 GMT</pubDate></item><item><title>SharePoint 2010手动部署wsp包</title><link>http://www.wyjexplorer.cn/Blog/View/F82F23065433C319.html</link><description>&lt;p&gt;昨天试着直接在SP网站上上传wsp，结果爆了。今天换了种办法在本机测试成功。赶紧写下经验之书以警后人……&lt;/p&gt;
&lt;p&gt;首先，只需要一个wsp文件，比如D:\SPDeploy\AMW.UI.wsp。dll是不需要额外拷贝的，因为wsp其实是个cab压缩包，用7z打开可以看见里面有个dll。&lt;/p&gt;
&lt;p&gt;然后打开SharePoint 2010 Management Shell，用命令部署：&lt;/p&gt;
&lt;p&gt;语法是：&lt;strong&gt;Add-SPSolution -LiteralPath "wsp路径"，&lt;span style="color: #ff0000;"&gt;然后重启一下iis&lt;/span&gt;。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/SharePointWSP%20(1)_201201171704167968.PNG" alt="" width="671" height="436" /&gt;&lt;/p&gt;
&lt;p&gt;你会看到Deployed是False，没关系，这没有灭，只是剧情需要。现在在GAC里可以看见我们的dll了：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/SharePointWSP%20(2)_201201171704432656.PNG" alt="" width="302" height="141" /&gt;&lt;/p&gt;
&lt;p&gt;然后打开Central Admin：&lt;/p&gt;
&lt;p&gt;点开左边的System Settings，选择Manage Farm Solutions。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/SharePointWSP%20(3)_201201171705138906.PNG" alt="" width="866" height="394" /&gt;&lt;/p&gt;
&lt;p&gt;之后你会看到我们的amw.ui.wsp是not deployed，没关系，这没有爆，还是剧情需要。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/SharePointWSP%20(4)_201201171705226250.PNG" alt="" width="701" height="387" /&gt;&lt;/p&gt;
&lt;p&gt;我们点进去，给他deploy一下：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/SharePointWSP%20(5)_201201171706432968.PNG" alt="" width="630" height="400" /&gt;&lt;/p&gt;
&lt;p&gt;点Deploy Solution&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/SharePointWSP%20(6)_201201171706487812.PNG" alt="" width="891" height="570" /&gt;&lt;/p&gt;
&lt;p&gt;搞定～&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/SharePointWSP%20(7)_201201171708110781.PNG" alt="" width="552" height="139" /&gt;&lt;/p&gt;</description><pubDate>Tue, 17 Jan 2012 17:08:40 GMT</pubDate></item><item><title>用LINQ查询XML并绑定给GridView显示</title><link>http://www.wyjexplorer.cn/Blog/View/A723254D5450AC35.html</link><description>&lt;p&gt;前天嘴贱，建议老Y用XML存一个表格然后绑给GridView，本意是用个偷懒的办法快速解决了那个case，结果做的时候没那么方便，或者说直接把GridView绑定到一个XML文件不太好，如果通过DataTable来处理也显得比较麻烦。&lt;/p&gt;
&lt;p&gt;比较好的办法其实是绑给业务对象，就和以前ORM一样做，GridView最终绑的是一个List&amp;lt;数据Model&amp;gt;。那么怎么来读取XML呢最方便呢？当然是用LINQ！可以参考我博客上的这篇文章：http://www.wyjexplorer.cn/Blog/View/EC3073A1BDFB9D90.html&lt;/p&gt;
&lt;p&gt;今天抽出来单独写了一个Demo示众，3步搞定！&lt;/p&gt;
&lt;p&gt;1.搞个XML文件：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;Contacts&amp;gt;
    &amp;lt;Person&amp;gt;
        &amp;lt;Id&amp;gt;1&amp;lt;/Id&amp;gt;
        &amp;lt;Name&amp;gt;Fucker&amp;lt;/Name&amp;gt;
        &amp;lt;Mobile&amp;gt;13838389438&amp;lt;/Mobile&amp;gt;
        &amp;lt;Address&amp;gt;No.250, Fucking Road&amp;lt;/Address&amp;gt;
    &amp;lt;/Person&amp;gt;
    &amp;lt;Person&amp;gt;
        &amp;lt;Id&amp;gt;2&amp;lt;/Id&amp;gt;
        &amp;lt;Name&amp;gt;Dick&amp;lt;/Name&amp;gt;
        &amp;lt;Mobile&amp;gt;1234567890123&amp;lt;/Mobile&amp;gt;
        &amp;lt;Address&amp;gt;No.13, 2B Road, Shit City&amp;lt;/Address&amp;gt;
    &amp;lt;/Person&amp;gt;
    &amp;lt;Person&amp;gt;
        &amp;lt;Id&amp;gt;3&amp;lt;/Id&amp;gt;
        &amp;lt;Name&amp;gt;Shitter&amp;lt;/Name&amp;gt;
        &amp;lt;Mobile&amp;gt;987654321098&amp;lt;/Mobile&amp;gt;
        &amp;lt;Address&amp;gt;No.38, SB Street&amp;lt;/Address&amp;gt;
    &amp;lt;/Person&amp;gt;
&amp;lt;/Contacts&amp;gt;&lt;/pre&gt;
&lt;p&gt;2.给他创建一个数据模型类：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
/// &amp;lt;summary&amp;gt;
/// Summary description for Person
/// &amp;lt;/summary&amp;gt;
namespace LinqXMLGridViewDemo
{
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Mobile { get; set; }
        public string Address { get; set; }
 
        public Person()
        {
            //
            // TODO: Add constructor logic here
            //
        }
    }
}&lt;/pre&gt;
&lt;p&gt;3. 页面上拖个GridView，后台代码这样写：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using LinqXMLGridViewDemo;
 
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var query = GetXMLData();
 
        gvContact.DataSource = query;
        gvContact.DataBind();
    }
 
    private List&amp;lt;Person&amp;gt; GetXMLData()
    {
        var xDoc = XDocument.Load(Server.MapPath("~/App_Data/Data.xml"));
        var query = (from person in xDoc.Descendants("Person")
                     select new Person()
                     {
                         Id = Convert.ToInt32(person.Element("Id").Value),
                         Name = person.Element("Name").Value,
                         Mobile = person.Element("Mobile").Value,
                         Address = person.Element("Address").Value
                     }).ToList();
        return query;
    }
 
}&lt;/pre&gt;
&lt;p&gt;有图有真相：&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/image_201201131658511406.png" alt="" width="364" height="142" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;碉堡了～&lt;/p&gt;</description><pubDate>Fri, 13 Jan 2012 16:59:40 GMT</pubDate></item><item><title>CSS两列布局，左边自适应，右边固定</title><link>http://www.wyjexplorer.cn/Blog/View/B580E52EE1951D8D.html</link><description>&lt;p&gt;废话不多说，直接上代码，大家自己看一下：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;

&amp;lt;head&amp;gt;
&amp;lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type" /&amp;gt;
&amp;lt;title&amp;gt;Layout&amp;lt;/title&amp;gt;
&amp;lt;style type="text/css"&amp;gt;
*{
	margin:0;padding:0
}
.wrap
{
	overflow:auto; _display:inline-block; padding: 10px; overflow: hidden;
}
.right
{
	width: 200px;
	padding: 10px;
	background-color: #F4F4F4;
	border: 1px solid #CECECE;
	float: right;
}
.left
{
	padding: 10px;
	background-color: #F4F4F4;
	border: 1px solid #CECECE;
	margin-right: 230px;
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
	&amp;lt;div class="wrap"&amp;gt;
	
		&amp;lt;div class="right"&amp;gt;
			I'm 200px width.
		&amp;lt;/div&amp;gt;
			
		&amp;lt;div class="left"&amp;gt;
			I'm auto witdh.
		&amp;lt;/div&amp;gt;
		
	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;有图有真相：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/0_201201102207403593.PNG" alt="" width="955" height="147" /&gt;&lt;/p&gt;</description><pubDate>Tue, 10 Jan 2012 22:08:01 GMT</pubDate></item><item><title>ASP.NET给用户控件(.ascx)增加属性</title><link>http://www.wyjexplorer.cn/Blog/View/52EE77DA3888A482.html</link><description>&lt;p&gt;我们常用ascx封装用户控件，但我们要访问ascx里的控件的值非常麻烦，如果能给用户控件封装几个属性，就可以在VS的属性面板里进行设置，或者在程序里直接访问&amp;ldquo;ascx控件.属性值&amp;rdquo;了。&lt;/p&gt;
&lt;p&gt;其实做法很简单，因为用户控件也是一个类，所以我们可以给这个类增加属性，就像设计一个普通的类一样对待。注意，是C#的属性，是public的，而不是字段。&lt;/p&gt;
&lt;p&gt;下面的代码演示了我如何将TinyMCE文本编辑器封装为一个Editor.ascx，并给它设置&lt;strong&gt;Text&lt;/strong&gt;属性：&lt;/p&gt;
&lt;p&gt;ascx页面代码：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;%@ Control Language="C#" AutoEventWireup="true" CodeFile="Editor.ascx.cs" Inherits="Console_Editor" %&amp;gt;
&amp;lt;script type="text/javascript" src="/Editor/tiny_mce/tiny_mce.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type="text/javascript"&amp;gt;
    tinyMCE.init({
        // General options
        mode: "textareas",
        theme: "advanced",
        width: "800",
        height: "400"...
		//tinyMCE的初始化代码......
    });
&amp;lt;/script&amp;gt;
&amp;lt;textarea id="content" cols="20" rows="2" runat="server"&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;C#代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;using System;

public partial class Console_Editor : System.Web.UI.UserControl
{

    public string Text
    {
        get { return this.content.InnerText; }
        set { this.content.InnerText = value; }
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}&lt;/pre&gt;
&lt;p&gt;上面代码中的public string Text，就是给这个控件封装了一个名为Text的字符串类型的属性。用处是赋值和获取文本域（Textarea）的内容。于是，我们就可以在VS的属性设计器里看到这个ascx的变化了：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/ascxprop_201201091950035781.PNG" alt="" width="217" height="244" /&gt;&lt;/p&gt;
&lt;p&gt;当然，我们在程序里也能直接通过控件ID.Text来给属性赋值（set），比如 txtEditorBlogContent.Text = &amp;ldquo;abc&amp;rdquo;;它最终会将ascx中id为content的文本域的内容置为&amp;ldquo;abc&amp;rdquo;。并且也可以读取（get），比如 model.Content = txtEditorBlogContent.Text;&lt;/p&gt;</description><pubDate>Mon, 09 Jan 2012 19:55:28 GMT</pubDate></item><item><title>高效程序猿之（四）VS2010其他技巧</title><link>http://www.wyjexplorer.cn/Blog/View/F957F8F148865937.html</link><description>&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt;&lt;strong&gt;快速打开项目文件夹&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一种方法是在开始页面上，对项目点右键，选择&amp;ldquo;打开所在的文件夹&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-1-1_201201080952240781.PNG" alt="" width="346" height="150" /&gt;&lt;/p&gt;
&lt;p&gt;另一种方法，是在项目打开后，对解决方案或项目点右键，同样有个&amp;ldquo;在Windows资源管理器中打开文件夹&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-1-2_201201080952543125.PNG" alt="" width="507" height="466" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;&lt;strong&gt;重命名&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果要对代码中的一个变量或类名进行重命名，就需要更改所有用到这个类型的语句。手动一个个更改显然会蛋疼。VS给了我们一种高效的重命名办法：&lt;/p&gt;
&lt;p&gt;在类型名称上点右键，重构，重命名。更快的办法是将光标点到类型名称上，然后按下Ctrl+R,R&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-2-1_201201080953150468.PNG" alt="" width="629" height="348" /&gt;&lt;/p&gt;
&lt;p&gt;这样，VS就会自动查找和替换所有被引用的名称&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-2-2_201201080953287031.PNG" alt="" width="547" height="369" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;&lt;strong&gt;快速输入相同数据&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;大家可能知道Word中的矩形选择框，同样，VS2010中也有这个功能，并且现在可以选择0字符宽度的选择框用于输入内容。方法是按住ALT，然后按住鼠标左键选择。&lt;/p&gt;
&lt;p&gt;例如下面的实例，我希望给每个&amp;lt;a&amp;gt;标记之前，都加上&amp;lt;li&amp;gt;，我可以按住ALT+鼠标左键，选中第一个&amp;lt;a&amp;gt;到最后一个&amp;lt;a&amp;gt;之前的位置，可以看见淡淡的一条竖线。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-3-1_201201080953454843.PNG" alt="" width="302" height="205" /&gt;&lt;/p&gt;
&lt;p&gt;然后我直接键入&amp;lt;li&amp;gt;就行了！碉堡了吧！&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-3-2_201201080954065312.PNG" alt="" width="268" height="221" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt;&lt;strong&gt;快速输入自定义代码段&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你有一段代码，经常需要用到，你可以选中它，然后拖到工具箱上。以后要用的时候，只要从工具箱上把代码片段直接拖进代码中就行了！就像拖控件那样！&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-4-1_201201080954226093.PNG" alt="" width="662" height="289" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt;&lt;strong&gt;快速重命名命名空间&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要对命名空间进行重命名，如果一个个cs文件手动改过来，蛋都要碎了，还说不定会有遗漏。VS提供了一种统一的对命名空间重命名的功能：&lt;/p&gt;
&lt;p&gt;首先你要打开类视图&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-5-1_201201080954364687.PNG" alt="" width="328" height="525" /&gt;&lt;/p&gt;
&lt;p&gt;然后在类视图中，展开项目，就可以看到里面的所有命名空间，并且一次性重命名&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-5-2_201201080954578125.PNG" alt="" width="212" height="513" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-5-3_201201080955189531.PNG" alt="" width="529" height="345" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt;&lt;strong&gt;查看调用关系&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你要分析别人的系统，那查看方法或类型之间的调用关系是必不可少的。除了断点调试，我们现在有了更直接的办法：可以在名称上点右键，选择查看调用层次结构。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-6-1_201201080955349375.PNG" alt="" width="576" height="451" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7.&lt;/strong&gt;&lt;strong&gt;分屏显示&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个理想的工作环境是拥有多台显示器，尤其是搞设计和开发工作的。如果你有幸获得了双屏幕，那就不要浪费了VS2010的强大功能：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-8-1_201201080955542031.PNG" alt="" width="682" height="406" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/vsgx4-8-2_201201080956171718.PNG" alt="" width="819" height="279" /&gt;&lt;/p&gt;</description><pubDate>Sun, 08 Jan 2012 09:56:49 GMT</pubDate></item><item><title>ASP.NET使用ashx输出图片</title><link>http://www.wyjexplorer.cn/Blog/View/D90C44D6665168A8.html</link><description>&lt;p&gt;以前我们在.NET里动态输出图片，往往是建一个aspx，把里面的html代码都删光，然后在cs代码里用response输出一个图片类型的stream。之后指定Image控件的url为这个aspx就行。但是，更好的做法是用ashx。&lt;/p&gt;
&lt;p&gt;先简单介绍一下ashx：&lt;/p&gt;
&lt;p&gt;ashx是ASP.NET里的web handler，用来处理Http请求。因为它不是aspx，所以它无需走aspx的生成过程，避免了事件、控件树等的处理，因此性能比aspx好，并且编写ashx只需要关心request的处理，不用关心web界面上的表现，有点类似JavaEE里的Servlet。动态生成图片这样的事用ashx做再好不过啦！&lt;/p&gt;
&lt;p&gt;以我网站Web App里二维码生成器为例。原先生成图片的aspx后台代码如下：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;protected void Page_Load(object sender, EventArgs e)
{
    System.Drawing.Image image = (System.Drawing.Image)Session["tempImg"];

    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    Response.ClearContent();
    Response.ContentType = "image/Jpeg";
    Response.BinaryWrite(ms.ToArray());
    image.Dispose();
    Session.Clear();
}&lt;/pre&gt;
&lt;p&gt; 现在把它做到ashx里，完整的ashx代码如下：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;&lt;%@ WebHandler Language="C#" Class="GetQRImage" %&gt;

using System;
using System.Web;

public class GetQRImage : IHttpHandler, System.Web.SessionState.IReadOnlySessionState
{

    public void ProcessRequest(HttpContext context)
    {
        System.Drawing.Image image = (System.Drawing.Image)context.Session["tempImg"];

        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        context.Response.ClearContent();
        context.Response.ContentType = "image/Jpeg";
        context.Response.BinaryWrite(ms.ToArray());
        image.Dispose();
        context.Session.Clear();
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}&lt;/pre&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;p&gt;1. 因为IHttpHandler接口的约定，ashx里必须包含IsReusable的实现&lt;/p&gt;
&lt;p&gt;2. 我需要在ashx里&lt;strong&gt;读取&lt;/strong&gt;Session，所以我必须实现&lt;strong&gt;IReadOnlySessionState&lt;/strong&gt;接口。如果要&lt;strong&gt;写&lt;/strong&gt;Session，就要实现&lt;strong&gt;IRequiresSessionState&lt;/strong&gt;接口。&lt;/p&gt;
&lt;p&gt;3. ProcessRequest的参数是HttpContext，所以Reponse或者Session什么的请使用context来访问。&lt;/p&gt;</description><pubDate>Sat, 07 Jan 2012 17:05:09 GMT</pubDate></item><item><title>C#将窗口最小化到系统托盘，并显示图标和快捷菜单</title><link>http://www.wyjexplorer.cn/Blog/View/126A325E821EED1F.html</link><description>&lt;p&gt;1. 拖一个notifyIcon和一个contextMenuStrip过来，他们会出现在窗体设计器的最下方：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/cswindow1_201201031659496093.PNG" alt="" width="280" height="106" /&gt;&lt;/p&gt;
&lt;p&gt;然后完成你的menu，它暂时会出现在form上，但没关系，运行的时候不会显示。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/cswindow1-1_201201031701145937.PNG" alt="" width="350" height="169" /&gt;&lt;/p&gt;
&lt;p&gt;2. 给notifyIcon设置icon属性，这一步很重要，不然系统托盘处不会有图标。然后将ContextMenuStrip属性设置为刚才的那个快捷菜单。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/cswindow2_201201031702206718.PNG" alt="" width="253" height="284" /&gt;&lt;/p&gt;
&lt;p&gt;3. 现在运行程序的时候，任务栏右下角系统托盘处就会有我们的图标和菜单：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/cswindow3_201201031703419062.PNG" alt="" width="244" height="114" /&gt;&lt;/p&gt;
&lt;p&gt;4. 现在我们来处理最小化隐藏和还原的问题：&lt;/p&gt;
&lt;p&gt;首先要将form的ShowInTaskBar属性设为false，这样它就不会在任务栏中显示。但如果现在最小化，屏幕左下角仍然会有一条细小的标题栏。这里我们需要手工处理一下：&lt;/p&gt;
&lt;p&gt;在form的resize事件里这样写：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;private void frmMain_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        this.Visible = false;
        this.notifyIcon.Visible = true;
    }
}&lt;/pre&gt;
&lt;p&gt;上面的代码会判断窗体的状态，如果是最小化的，则将窗体隐藏。&lt;/p&gt;
&lt;p&gt;点击菜单中的&amp;ldquo;Open Main Window&amp;rdquo;还原窗体的代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;private void openMainWindowToolStripMenuItem_Click(object sender, EventArgs e)
{
    this.Visible = true;
    this.WindowState = FormWindowState.Normal;
    this.Show();
}&lt;/pre&gt;</description><pubDate>Tue, 03 Jan 2012 17:08:59 GMT</pubDate></item><item><title>Windows 7 64位版IIS不能连接Access数据库的解决办法</title><link>http://www.wyjexplorer.cn/Blog/View/3D1A3F2832463CCC.html</link><description>&lt;p&gt;今天我把系统换成了64位版的Windows7，结果配完IIS打开网站测试的时候，顿时菊花一紧：未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/0_201201011549020156.PNG" alt="" width="595" height="340" /&gt;&lt;/p&gt;
&lt;p&gt;查了半天发现是IIS跑在64位环境下引起的。而64位下，是木有Access数据库的驱动的（包括Excel也不行）。&lt;/p&gt;
&lt;p&gt;解决办法是：在目标网站的应用程序池中选择高级设置，然后将启用32位应用程序设置为true，重启IIS即可！&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/1_201201011550512343.PNG" alt="" width="737" height="588" /&gt;&lt;/p&gt;</description><pubDate>Sun, 01 Jan 2012 15:53:18 GMT</pubDate></item><item><title>C#读取新浪微博RSS的问题</title><link>http://www.wyjexplorer.cn/Blog/View/6F39CBFA4B535FB0.html</link><description>&lt;p&gt;最近准备把网站首页的微博更新区域改一下，现在用的是新浪官方的iframe，我想用RSS读取。找到了一个新浪微博RSS的生成器：&lt;a href="http://ishow.sinaapp.com/rss.php"&gt;http://ishow.sinaapp.com/rss.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;它生成的地址像这样：&lt;a href="http://myrss.sinaapp.com/sina.php?uid=1248491634&amp;amp;item=10"&gt;http://myrss.sinaapp.com/sina.php?uid=1248491634&amp;amp;item=10&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其实读RSS也就是用C#读个XML文件，并绑定到数据显示控件上，很容易实现。这个功能前天就写好了，测试很正常。然而今天我打开本地站点时，居然报异常了：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/weiboerror_201112272102437031.JPG" alt="" width="231" height="77" /&gt;&lt;/p&gt;
&lt;p&gt;我郁闷了，我这几天可木有动过代码啊，难道是RSS本身格式有问题？&lt;/p&gt;
&lt;p&gt;我试着在Firefox里打开RSS地址，结果Firefox没能解析完整，这必须是xml格式有问题。于是我把RSS源代码复制到VS里检查，终于发现问题所在了：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/0_201112272105343593.JPG" alt="" width="305" height="109" /&gt;&lt;/p&gt;
&lt;p&gt;原来，我的惯用符号&amp;ldquo;&amp;lt;---&amp;rdquo;没有被正确处理，正好和xml的&amp;ldquo;&amp;lt;&amp;rdquo;标记冲突了。我顿时口吐三公升地沟油啊。。。&lt;/p&gt;
&lt;p&gt;原来这个RSS生成器，只给description加了CDATA，却没有给title加～&lt;/p&gt;
&lt;p&gt;这个生成器很好用，但希望作者能赶紧修复这个问题，非常感谢！&lt;/p&gt;</description><pubDate>Tue, 27 Dec 2011 21:09:53 GMT</pubDate></item><item><title>ASP.NET Forms验证实现只有特定目录才要求登录</title><link>http://www.wyjexplorer.cn/Blog/View/F23E1FCD18D391AE.html</link><description>&lt;p&gt;哥最近准备把网站的登录模块重写，采用ASP.NET自带的Forms验证方式。一直觉得微软的登录肯定要比自己写程序判断Session神马的要完善。&lt;/p&gt;
&lt;p&gt;我的场景是这样的：&lt;/p&gt;
&lt;p&gt;一个普通的网站，分为前台和后台。前台是给Internet访客看的，无需登录。后台是给管理员发表文章和管理网站的，要求登录才能访问。&lt;/p&gt;
&lt;p&gt;这样的网站我们通常这样设计目录结构：&lt;/p&gt;
&lt;p&gt;Web -----网站根目录&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console ----- 后台管理入口&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Default.aspx&lt;/strong&gt; ----- 登录页（一般叫做Login.aspx）&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Welcome.aspx&lt;/strong&gt; ----- 欢迎页（登录成功就跳转到此页）&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;.aspx -----各种后台页面&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Default.aspx&lt;/strong&gt; ----- 网站首页（无需登录就能看）&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;..aspx -----各种网站内容页面（也是无需登录就能看）&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;这个例子中我们要求只有Console下的页面才需要登录。这是肿么做的呢？&lt;/p&gt;
&lt;p&gt;先来看看最简单的Forms验证：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、在web.config&lt;/strong&gt;&lt;strong&gt;的system.web&lt;/strong&gt;&lt;strong&gt;节点下加入下面的代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;authentication mode="Forms"&amp;gt;
    &amp;lt;forms loginUrl="Console/Default.aspx" name=".ASPXFORMSAUTH" defaultUrl="Console/Welcome.aspx"&amp;gt;
    &amp;lt;/forms&amp;gt;
&amp;lt;/authentication&amp;gt;
&amp;lt;authorization&amp;gt;
    &amp;lt;deny users="?"/&amp;gt;
&amp;lt;/authorization&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、登录页面Default.aspx&lt;/strong&gt;&lt;strong&gt;和欢迎页面Welcome.aspx&lt;/strong&gt;&lt;strong&gt;的代码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个与本文讨论内容无关，大家自己看一下MSDN的例子：http://msdn.microsoft.com/zh-cn/library/xdt4thhy%28v=VS.80%29.aspx&lt;/p&gt;
&lt;p&gt;配置完这些，我们访问网站中的任意页面，都会要求登录了。可是在我们的需求里，&lt;strong&gt;我们希望只有&lt;/strong&gt;&lt;strong&gt;Console&lt;/strong&gt;&lt;strong&gt;下的页面才需要登录访问&lt;/strong&gt;，怎么写呢？&lt;/p&gt;
&lt;p&gt;我一开始的想法是在Console目录下建个web.config，并把关于验证的authentication和authorization节点都放在Console/web.config的system.web下。后来发现这样做会引起运行时错误：&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level.&amp;nbsp; This error can be caused by a virtual directory not being configured as an application in IIS.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;无奈，查MSDN也没查出个P来。经过一番开荒摸索，我终于找到了最简单的解决办法：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、把Web&lt;/strong&gt;&lt;strong&gt;根目录下的web.config&lt;/strong&gt;&lt;strong&gt;中allow users&lt;/strong&gt;&lt;strong&gt;的属性值设为&amp;ldquo;*&lt;/strong&gt;&lt;strong&gt;&amp;rdquo;，意思是允许任意用户访问根目录下的所有页面。&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;authentication mode="Forms"&amp;gt;
    &amp;lt;forms loginUrl="Console/Default.aspx" name=".ASPXFORMSAUTH" defaultUrl="Console/Welcome.aspx"&amp;gt;
    &amp;lt;/forms&amp;gt;
&amp;lt;/authentication&amp;gt;
&amp;lt;authorization&amp;gt;
    &amp;lt;allow users="*"/&amp;gt;
&amp;lt;/authorization&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、在Console&lt;/strong&gt;&lt;strong&gt;下再建个web.config&lt;/strong&gt;&lt;strong&gt;，这个文件的作用域只是Console&lt;/strong&gt;&lt;strong&gt;目录下的所有页面&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Console\Web.config文件全部代码：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;system.web&amp;gt;
        &amp;lt;authorization&amp;gt;
            &amp;lt;deny users="?"/&amp;gt;
        &amp;lt;/authorization&amp;gt;
    &amp;lt;/system.web&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最终的目录结构：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/forms-project-tree_201112271659229062.PNG" alt="" width="166" height="165" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;现在再访问Web\Default.aspx&lt;/strong&gt;&lt;strong&gt;就不需要登录了：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/forms-frontpage_201112271659448125.PNG" alt="" width="395" height="120" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果访问Console\Welcome.aspx&lt;/strong&gt;&lt;strong&gt;就会被强制要求登录：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/forms-loginpage_201112271700041250.PNG" alt="" width="575" height="224" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;登录之后就可以看Welcome.aspx&lt;/strong&gt;&lt;strong&gt;了：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/forms-adminpage_201112271700300156.PNG" alt="" width="473" height="161" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总结：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以下是我自己的理解，可能会坑爹，大家自己凑合着看吧：&lt;/p&gt;
&lt;p&gt;1. authentication节点&lt;span style="color: #ff0000;"&gt;只能在网站根目录的web.config中定义一次&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;2. 让Web\Console\Web.Config下的&lt;span style="color: #ff0000;"&gt;allow users="?"&lt;/span&gt; 覆盖掉 Web\Web.Config下的allow users="*"&lt;/p&gt;</description><pubDate>Tue, 27 Dec 2011 17:01:35 GMT</pubDate></item><item><title>当using遇到return</title><link>http://www.wyjexplorer.cn/Blog/View/00EC6701795272C5.html</link><description>&lt;p&gt;C#一大牛逼之处就是using语句简化了我们的程序。它的作用是在using结束后，立即释放被引用的资源。实质其实是调用被引用对象的Dispose()方法。这也是为喵被using的类型一定要实现IDisposable接口。虽然在.NET和JAVA里，程序员都不用关心手动释放内存的问题，但我认为在使用资源的时候加上using，是一种良好的习惯。有时候如果你不释放资源的话，可能会发生独占的问题。&lt;/p&gt;
&lt;p&gt;好了，扯多了，话说回来，看看我今天遇到的一个有意思的问题。&lt;/p&gt;
&lt;p&gt;今天心血来潮，想检验一下自己的代码，于是给项目启用了代码分析，用的是&amp;ldquo;Microsoft最少量建议规则&amp;rdquo;。结果以下代码产生了编译警告：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public DataSet ExecuteDataSet(DbCommand cmd, Trans t)
{
    cmd.Connection = t.DbConnection;
    cmd.Transaction = t.DbTrans;
    DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper._dbProviderName);
    DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
    dbDataAdapter.SelectCommand = cmd;
    DataSet ds = new DataSet();
    dbDataAdapter.Fill(ds);
    this._connection.Close();
    return ds;
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff0000;"&gt;CA2000 : Microsoft.Reliability : 在方法 'DbHelper.ExecuteDataSet(DbCommand, Trans)' 中，'ds' 对象未按所有异常路径释放。请在对 'ds' 对象的所有引用超出范围之前，对该对象调用 System.IDisposable.Dispose。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;于是我给ds套了个using，警告就木了：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public DataSet ExecuteDataSet(DbCommand cmd, Trans t)
{
    cmd.Connection = t.DbConnection;
    cmd.Transaction = t.DbTrans;
    DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper._dbProviderName);
    DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
    dbDataAdapter.SelectCommand = cmd;
    using (DataSet ds = new DataSet())
    {
        dbDataAdapter.Fill(ds);
        this._connection.Close();
        return ds;
    }
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;但我突然觉得不对劲啊。但我担心ds是否真的能return出去。因为using完成后，ds就被释放了，所以调用这个方法可能获取不到原本想要的那个ds。&lt;/p&gt;
&lt;p&gt;于是我上微博向微软MVP求教，老徐给我的答复是：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="http://weibo.com/frankxulei"&gt;老徐FrankXuLei&lt;/a&gt;：如果再返回前调用了Dispose,应该对象就无法访问了，资源可能被释放了，这里要返回该对象的有效引用，不需要使用Using&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;看来是有点问题。于是我写了个小测试，预期结果是Query方法返回null：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;static void Main(string[] args)
{
    DataSet ds = Query("SELECT * FROM Feedback");
    Console.WriteLine(ds.Tables[0].Rows[0]["Username"].ToString());
    Console.ReadKey();
}

public static DataSet Query(string SQL)
{
    using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\test.mdb"))
    {
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }
        try
        {
            using (DataSet Ds = new DataSet())
            {
                OleDbDataAdapter comm = new OleDbDataAdapter(SQL, conn);
                comm.Fill(Ds, "ds");
                return Ds;
            }
        }
        catch
        {
            return null;
        }
    }
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;结果让我感到意外，程序居然得到了数据，说明Ds对象还活着！&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/using_201112262206101093.JPG" alt="" width="301" height="115" /&gt;&lt;/p&gt;
&lt;p&gt;我纳闷了，既然我都写了using，那Ds的Dispose()方法应该会被立即调用，Ds如果被销毁了，就应该return null出去。既然能读出数据，说明Ds活着，没有被销毁，那我们的using都干什么去了呢？Dispose()方法什么时候被调用呢？&lt;/p&gt;
&lt;p&gt;于是我掏出了.NET程序猿必备神器Reflector一探究竟：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/using_ref_201112262209336718.JPG" alt="" width="635" height="447" /&gt;&lt;/p&gt;
&lt;p&gt;编译器发现我要return一个被引用的对象，而且这个对象会被改变，于是编译器很聪明的创建了一个临时变量CS$1$0000，把Ds交给这个变量，最后return的也不是Ds了（因为Ds已经被using消灭了）。&lt;/p&gt;
&lt;p&gt;我瞬间觉得自己弱爆了，智商输给了编译器！&lt;/p&gt;
&lt;p&gt;不过由此看来，在这种场景下写using，是多此一举的。仅仅是为了通过代码分析，让编译器帮你擦屁股。&lt;/p&gt;</description><pubDate>Mon, 26 Dec 2011 22:15:42 GMT</pubDate></item><item><title>Web.Config中保存特殊字符</title><link>http://www.wyjexplorer.cn/Blog/View/B4190467CAC685DC.html</link><description>&lt;p&gt;最近遇到个问题，需要在web.config里保存一些特殊字符。比如&amp;ldquo;&amp;amp;&amp;rdquo;。但web.config，包括其他config都是XML格式的，不可以直接保存&amp;amp;，"&amp;amp;"在XML中是转义字符的标志，所以保存这个字符，需要经过转义。下面是常用字符的转义表。大家自己看一下～&lt;/p&gt;
&lt;table style="width: 251px; height: 112px;" border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;字符&lt;/td&gt;
&lt;td&gt;转义&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;&lt;/td&gt;
&lt;td&gt;&amp;amp;lt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;&amp;amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;amp;&lt;/td&gt;
&lt;td&gt;&amp;amp;amp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: 10pt;"&gt;&amp;amp;apos;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description><pubDate>Sun, 25 Dec 2011 18:09:10 GMT</pubDate></item><item><title>去掉Android手机通知区下载图标的办法</title><link>http://www.wyjexplorer.cn/Blog/View/1C8F4A5684784AB3.html</link><description>&lt;p&gt;最近HTC手机上的Twitter更新了，但由于众所周知的原因，国内无法更新。于是就导致手机一开机，系统通知栏上就一直有下载Twitter的图标，到电子市场里取消下载也没用。&lt;/p&gt;
&lt;p&gt;今天早晨我的HTC G14接到了系统更新，说明是更新Twitter的，结果安装完毕后，Twitter的下载图标还在，MLGBD。&lt;/p&gt;
&lt;p&gt;经过仔细研究，我发现一个办法，可以停止下载进程，去掉那个碍眼的图标：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;打开设置-&amp;gt;应用程序-&amp;gt;管理应用程序-&amp;gt;所有应用程序&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后找到&amp;ldquo;&lt;span style="color: #ff0000;"&gt;下载管理器&lt;/span&gt;&amp;rdquo;，进去点击&amp;ldquo;&lt;span style="color: #ff0000;"&gt;强制停止&lt;/span&gt;&amp;rdquo;和&amp;ldquo;&lt;span style="color: #ff0000;"&gt;清除数据&lt;/span&gt;&amp;rdquo;。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OK，图标木了。&lt;/p&gt;
&lt;p&gt;顺便说一下，如果你实在要更新Twitter，可以在手机上设置个VPN就好了。但大家请别在我的网站或Email里问我怎么弄国外代理，我不想惹麻烦，你们懂的。大家可以求助Google～&lt;/p&gt;</description><pubDate>Sun, 25 Dec 2011 16:13:16 GMT</pubDate></item><item><title>PDF文档设置不允许打印和复制的方法</title><link>http://www.wyjexplorer.cn/Blog/View/E622D634B8DEB352.html</link><description>&lt;p&gt;最近开始搞毕业设计了，其实很重要的一点就是版权保护，这点很多同学都想到了，于是把Word、PPT都存为PDF发布，但却忽视了一点：Office发布的PDF文件默认没有安全限制，是可以随意复制内容和打印的。所以我们需要略作调整，不允许别人打印和复制我们的文档。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;除了Office，我们还需要安装Adobe Acrobat&lt;/strong&gt;，我用的是9.3。大家可以自己下一个～装完以后就可以按如下的步骤操作了～&lt;/p&gt;
&lt;p&gt;首先，还是按常规方法在Office中存一份PDF出来。我以我的PPT为例：&lt;/p&gt;
&lt;p&gt;1. 另存为&amp;hellip;&amp;hellip;PDF&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/1_201112171340341562.JPG" alt="" width="724" height="547" /&gt;&lt;/p&gt;
&lt;p&gt;2.这时，如果用Adobe Reader或Foxit Reader打开这份PDF，是可以复制和打印的，如图：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2_201112171341575781.JPG" alt="" width="577" height="580" /&gt;&lt;/p&gt;
&lt;p&gt;3. 我们用Adobe Acrobat打开这份PDF，选择安全&amp;mdash;&amp;mdash;使用口令加密&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/3_201112171344507031.JPG" alt="" width="577" height="258" /&gt;&lt;/p&gt;
&lt;p&gt;4.这时会弹出一个警告，问你是否要更改文档的安全设置，选择[是]。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/4_201112171345218281.JPG" alt="" width="620" height="213" /&gt;&lt;/p&gt;
&lt;p&gt;5. 在弹出的&amp;ldquo;口令安全性-设置&amp;rdquo;对话框中选择&amp;ldquo;加密所有文档内容&amp;rdquo;，&amp;ldquo;限制文档编辑和打印&amp;rdquo;，设置一个密码，然后将&amp;ldquo;允许打印&amp;rdquo;和&amp;ldquo;允许更改&amp;rdquo;设为&amp;ldquo;无&amp;rdquo;，不要勾选&amp;ldquo;启用复制文本、图像和其他内容&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/5_201112171346034531.JPG" alt="" width="628" height="653" /&gt;&lt;/p&gt;
&lt;p&gt;6. 这时又会弹出一个对话框，确认一下密码。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/6_201112171348276875.JPG" alt="" width="591" height="289" /&gt;&lt;/p&gt;
&lt;p&gt;7. 然后你会看到一个警告，意思是要你保存以后安全设置才能生效，&lt;strong&gt;所以切记一定要保存一次！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/7_201112171350170312.JPG" alt="" width="522" height="185" /&gt;&lt;/p&gt;
&lt;p&gt;8. 现在再次打开PDF文件，你就会发现无法打印和复制了～&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/8_201112171350595468.JPG" alt="" width="659" height="749" /&gt;&lt;/p&gt;</description><pubDate>Sat, 17 Dec 2011 13:51:48 GMT</pubDate></item><item><title>高效程序猿之（三）VS2010快捷键</title><link>http://www.wyjexplorer.cn/Blog/View/01D2D7FCAFB16DE6.html</link><description>&lt;p&gt;上一讲介绍了几款插件，碉堡了。今天我们来回顾一下VS2010的快捷键。下面是最常用的快捷键，大家自己看一下：&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;&lt;strong&gt;按键&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+K,C&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;注释选中的代码&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+K,U&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;取消注释&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+K,F&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;整理代码&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+U&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;全部小写&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+Shift+U&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;全部大写&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+H&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;查找与替换&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+Shift+B&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;编译&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+J&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;智能提示&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+R,R&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;重命名&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+R,E&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;封装字段&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;F12&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;转到定义&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;F4&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;属性窗口&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;F9&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;设置断点&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Ctrl+Shift+F9&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;删除所有断点&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;F10&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;逐过程调试&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;F11&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;逐语句调试&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;Shift+F12&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="319"&gt;
&lt;p&gt;查找所有引用&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description><pubDate>Mon, 12 Dec 2011 20:01:03 GMT</pubDate></item><item><title>GridView不使用数据源控件做分页</title><link>http://www.wyjexplorer.cn/Blog/View/3273D920D50E5F57.html</link><description>&lt;p&gt;ASP.NET中的GridView如果绑定数据源控件（比如SqlDataSource），那么分页只要设置AllowPaging属性为true，并且设置PageSize就可以自动实现分页。但很多时候，我们需要手工给GridView绑定数据，这时候再设置AllowPaging的话，它绝对不会理你。所以我们需要手工给它编写分页事件：&lt;/p&gt;
&lt;p&gt;其实很简单，大家自己看一下就明白了：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;private void FetchData()
{
    DataTable dt = optLeaveword.GetList(0, GeekStudio.ORM.DAL.Leaveword.OrderBy.IdDesc);
    gvLeaveword.DataSource = dt;
    gvLeaveword.DataBind();
}

protected void gvLeaveword_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gvLeaveword.PageIndex = e.NewPageIndex;
}

protected void gvLeaveword_PageIndexChanged(object sender, EventArgs e)
{
    FetchData();
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;要点是：&lt;/p&gt;
&lt;p&gt;1. 分页处理事件为PageIndexChanging&lt;/p&gt;
&lt;p&gt;2. 分页完成后不要忘了再次绑定数据（这个例子中绑定数据的方法为FetchData()）&lt;/p&gt;</description><pubDate>Sun, 11 Dec 2011 14:06:06 GMT</pubDate></item><item><title>高效程序猿之（二）VS2010优秀插件</title><link>http://www.wyjexplorer.cn/Blog/View/6DDA1F1676598739.html</link><description>&lt;p&gt;上一讲介绍了VS2010的模板代码生成。今天我们来看一下VS2010的插件功能。优秀的插件可以显著提高程序猿的生成效率。这个是2010版的新功能，用户可以通过安装插件来拓展Visual Studio的功能。&lt;/p&gt;
&lt;p&gt;在VS2010的菜单上，你可以找到Extension Manager的按钮，点击以后会弹出浏览和安装插件的对话框。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2.vsaddon0_201112100744340937.PNG" alt="" width="269" height="52" /&gt;&lt;/p&gt;
&lt;p&gt;我们可以去在线的库中寻找插件。在线安装完成后需要重启VS才能生效。如果安装的是本地插件，则要关闭VS后再安装，不然也是要重启的。&lt;/p&gt;
&lt;p&gt;下面介绍几个我常用的插件。&lt;/p&gt;
&lt;p&gt;1. Indent Guides&lt;/p&gt;
&lt;p&gt;这款插件的作用是给代码块增加对齐线，以标识匹配的花括号，让程序猿很容易的找到对应的语句块。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2.vsaddon1_201112100745145156.PNG" alt="" width="197" height="200" /&gt;&lt;/p&gt;
&lt;p&gt;2. PowerCommands for Visual Studio 2010&lt;/p&gt;
&lt;p&gt;这是微软官方的插件，它可以给你的右键菜单增加很多实用的功能。比如对整个Project整理using、复制引用、打开文件位置等等。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2.vsaddon2_201112100745385468.PNG" alt="" width="373" height="289" /&gt;&lt;/p&gt;
&lt;p&gt;3. Productivity Power Tools&lt;/p&gt;
&lt;p&gt;这个同样是微软官方的插件，看名字就知道它是提高生产效率的好助手。它优化了添加引用的对话框。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2.vsaddon3_201112100746219687.PNG" alt="" width="801" height="462" /&gt;&lt;/p&gt;
&lt;p&gt;另外，它对标签的显示方式也做了优化。用不同颜色显示不同层次的文件，你也可以将标签锁定在左侧。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2.vsaddon4_201112100746593750.PNG" alt="" width="507" height="77" /&gt;&lt;/p&gt;
&lt;p&gt;大家可以去设置界面中发现更多强大的功能：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2.vsaddon5_201112100747203906.PNG" alt="" width="757" height="444" /&gt;&lt;/p&gt;
&lt;p&gt;4. VS10x Code Map v2&lt;/p&gt;
&lt;p&gt;这款插件可以用可视化的方式来显示当前代码的结构。只要在窗格中点击即可导航到目标代码，并且能够用不同的颜色在代码中标记不同的方法，非常实用。不过很可惜的是，这个插件不是免费的，只有30天的试用时间。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/2.vsaddon6_201112100747483906.PNG" alt="" width="225" height="437" /&gt;&lt;/p&gt;
&lt;p&gt;这些插件的另外一些功能大家可以自己看一下。相信对提高生成效率会非常有帮助的。&lt;/p&gt;
&lt;p&gt;最后还有一个非常强大的代码自动完成插件：AutoCode&lt;/p&gt;
&lt;p&gt;网站是：&lt;a href="http://www.devprojects.net/"&gt;http://www.devprojects.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上一讲说的ToString()方法，它可以通过tostr代码片段来自动完成。首页就有demo演示。&lt;/p&gt;
&lt;p&gt;但我感觉安装这个插件后，VS启动会很慢，而且免费版会弹东西，所以不用了。&lt;/p&gt;
&lt;p&gt;PS: 如果你给VS设置了自定义的背景色，可能会和插件自带的颜色不协调。在这里可以更改：&lt;/p&gt;
&lt;p&gt;工具-选项-字体和颜色，右边的列表里会有带（Extension）字样的条目，就是插件的颜色配置。可以自己改一下～&lt;/p&gt;</description><pubDate>Sat, 10 Dec 2011 07:48:18 GMT</pubDate></item><item><title>高效程序猿之（一）VS2010快速生成代码模板</title><link>http://www.wyjexplorer.cn/Blog/View/DE40D7CD3C40B744.html</link><description>&lt;p&gt;一只程序猿的生产效率很重要。生成效率高了，老板喜欢你，妹子崇拜你，你也可以给自己节省很多时间。&lt;/p&gt;
&lt;p&gt;加班的一般都是新手程序猿，除了对语言和技术不熟悉，工具也是很影响生成效率的因素。我们知道，猿和其他动物最大的区别在于，猿会使用工具。所以这一系列我将介绍一下如何用好手头的工具来帮助我们提高效率。&lt;/p&gt;
&lt;p&gt;今天我们来看看如何在Visual Studio 2010中用内置的模板快速生成代码片段。&lt;/p&gt;
&lt;p&gt;代码模板就是预先定义好的一个代码片段。VS中，我们只要输入模板的名称，然后连按两下TAB，VS就可以给我们把代码片段补充完整。&lt;/p&gt;
&lt;p&gt;下面列出的这些都是VS2010的预置代码片段&lt;/p&gt;
&lt;p&gt;流程控制语句估计大家都知道，这是最常用的&amp;ldquo;两下tab&amp;rdquo;：&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;关键词&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;&lt;strong&gt;生成&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;for&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;for(int i = 0; i &amp;lt; length; i++){}&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;foreach&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;foreach (var item in collection) {}&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;do&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;do&amp;hellip; while loop&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;while&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;while (true)&amp;nbsp; {}&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;if (true)&amp;nbsp; { }&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;try&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;try&amp;hellip;.catch&amp;hellip;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;其实除了这些，VS还可以帮我们做很多事情：&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;关键词&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;&lt;strong&gt;生成&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;class&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;class MyClass{}&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;ctor&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;根据当前的类名生成空构造函数&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;cw&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;Console.WriteLine()&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;Exception&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;自定义异常类模板&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;indexer&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;索引器模板&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;mbox&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;MessageBox.Show()&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;prop&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;自动属性 get;set;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;propfull&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;传统属性（私有字段、封装get;set）&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="111"&gt;
&lt;p&gt;&lt;strong&gt;propg&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="527"&gt;
&lt;p&gt;自动属性 get; private set;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;但可惜是，VS2010似乎没有内置ToString()的模板。Model类中重写ToString()方法是很常用的，如果要实现快速输入，可能只有通过安装插件实现了。这在下一篇中将会介绍～&lt;/p&gt;</description><pubDate>Thu, 08 Dec 2011 17:25:28 GMT</pubDate></item><item><title>LINQ to List泛型的几种简单查询</title><link>http://www.wyjexplorer.cn/Blog/View/2B708CF247F12838.html</link><description>&lt;p&gt;最近比较喜欢LINQ，真是碉堡了。下面写了个例子演示一下LINQ对List&amp;lt;T&amp;gt;的操作，包括排序、where条件、选部分数据等查询。最近偷懒，不写注释了，大家自己看一下就明白了～&lt;/p&gt;
&lt;p&gt;测试用的BLL和Model&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public class TestBLL
{
    public List&amp;lt;TestModel&amp;gt; GetList()
    {
        return new List&amp;lt;TestModel&amp;gt;()
        {
            new TestModel(){ Id=1, Name="RYWE", Content="IOJADJ", Posttime=DateTime.Now.AddHours(1) },
            new TestModel(){ Id=2, Name="JGFA", Content="CAFYRE", Posttime=DateTime.Now.AddHours(0) },
            new TestModel(){ Id=4, Name="PIOU", Content="OVXZLA", Posttime=DateTime.Now.AddHours(5) },
            new TestModel(){ Id=5, Name="OUIH", Content="AIPJLM", Posttime=DateTime.Now.AddHours(3) },
            new TestModel(){ Id=7, Name="ZCXI", Content="KUQOPA", Posttime=DateTime.Now.AddHours(7) }
        };
    }
}

public class TestModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Content { get; set; }
    public DateTime Posttime { get; set; }

    public TestModel()
    {
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(String.Format("{0}={1}, ", "Id", this.Id));
        sb.Append(String.Format("{0}={1}, ", "Name", this.Name));
        sb.Append(String.Format("{0}={1}, ", "Content", this.Content));
        sb.Append(String.Format("{0}={1}", "Posttime", this.Posttime));
        return sb.ToString();
    }
}&lt;/pre&gt;
&lt;p&gt;测试代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;static void Main(string[] args)
{

    TestBLL bll = new TestBLL();
    List&amp;lt;TestModel&amp;gt; mList = bll.GetList();

    var query = from m in mList
                select m;

    var query1 = from m in mList
                 where m.Id &amp;gt; 2
                 select m;

    var query2 = from m in mList
                 where m.Id &amp;gt; 2
                 orderby m.Id descending 
                 select m;

    var query3 = from m in mList
                 orderby m.Posttime descending
                 select m;

    var query4 = (from m in mList 
                 select m).Take(3);

    var query5 = from m in mList
                 orderby m.Name ascending
                 select m;

    PrintList("from m in mList select m", query);
    PrintList("from m in mList where m.Id &amp;gt; 2 select m", query1);
    PrintList("from m in mList select m", query2);
    PrintList("from m in mList orderby m.Posttime descending select m", query3);
    PrintList("(from m in mList where select m).Take(3)", query4);
    PrintList("from m in mList orderby m.Name ascending select m", query5);

    Console.ReadKey();

}

private static void PrintList(string expression, IEnumerable&amp;lt;TestModel&amp;gt; query)
{
    Console.WriteLine("Query expression: " + expression);
    Console.WriteLine("__________________________________________________________________");
    foreach (var item in query)
    {
        Console.WriteLine(item.ToString());
    }
    Console.WriteLine("\n");
}&lt;/pre&gt;
&lt;p&gt;有图有真相：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/LINQList_201112080913596562.PNG" alt="" width="592" height="597" /&gt;&lt;/p&gt;</description><pubDate>Thu, 08 Dec 2011 09:15:19 GMT</pubDate></item><item><title>LINQ如何做SELECT TOP操作</title><link>http://www.wyjexplorer.cn/Blog/View/AEEA1865D7942E89.html</link><description>&lt;p&gt;我们知道，LINQ和SQL语句不是一回事，虽然他们看上去很相似。LINQ里没有"TOP"这个关键字，然而我们有时候需要选择一定数量的对象，肿么办呢？&lt;/p&gt;
&lt;p&gt;最2的办法是：先把对象全部选出，再写个循环，把不要的结果一个个剔除。这种方法显然不是我们想要的。&lt;/p&gt;
&lt;p&gt;刚开始我是这样写的：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;int i = 3
var query = from m in mList where --i &amp;gt;= 0 select m&lt;/pre&gt;
&lt;p&gt;我用一个变量来限制输出的条件，来模拟&amp;ldquo;TOP&amp;rdquo;的效果。但这样写不科学，这是一种代码的&amp;ldquo;坏味道&amp;rdquo;。为了完成操作A，而引入一个不太相关A流程的辅助操作B。如果代码比较复杂，又没写注释，就容易混淆逻辑。&lt;/p&gt;
&lt;p&gt;后来经过高手指点发现这样写就可以：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;var query = (from m in mList select m).Take(3);&lt;/pre&gt;
&lt;p&gt;碉堡了！&lt;/p&gt;</description><pubDate>Wed, 07 Dec 2011 17:03:06 GMT</pubDate></item><item><title>TinyMCE syntaxhl插入代码后换行的修改</title><link>http://www.wyjexplorer.cn/Blog/View/DD275FD918FD02F9.html</link><description>&lt;p&gt;上次搞了个整合insert code的TinyMCE编辑器，非常好用。但有一个缺点：每次插入代码后，光标都会停留在pre标记里面，打回车出不来，必须编辑HTML，在pre后面加个换行，然后才能回到可视化界面里继续编辑博客。如果博客里要插入的代码片段很多，就会非常不爽。所以今天给它做了个小修改。&lt;/p&gt;
&lt;p&gt;打开plugins\syntaxhl\js\dialog.js&lt;/p&gt;
&lt;p&gt;定位到41行，找到&amp;lt;/pre&amp;gt;标记。这是预格式化标签的结尾标记。所以只要在它后面插入一个段落标记，即可让光标跳出我们插入的代码片段。&lt;br /&gt;插件的作者在41行后加了个bug注释，所以不敢贸然写在&amp;lt;/pre&amp;gt;的后面，所以我们换一行，把&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;拼接上。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/tinymceinsertcodemod_201112011710546093.PNG" alt="" width="616" height="136" /&gt;&lt;/p&gt;
&lt;p&gt;现在我们插入代码后，光标就不会卡在pre里面了～OH YEAH!&lt;/p&gt;
&lt;p&gt;有图有真相：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/tinymceinsertcodemod1_201112011711510156.PNG" alt="" width="317" height="317" /&gt;&lt;/p&gt;</description><pubDate>Thu, 01 Dec 2011 17:12:37 GMT</pubDate></item><item><title>C#数据结构之顺序栈</title><link>http://www.wyjexplorer.cn/Blog/View/92A574BA39DB48A2.html</link><description>&lt;p&gt;继续发很久以前的那个系列。。。今天是顺序栈。。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/0_201111271740488281.PNG" alt="" width="326" height="401" /&gt;&lt;/p&gt;
&lt;p&gt;接口如下：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public interface IStack&amp;lt;T&amp;gt;
{
    void Clear();
    void Push(T item);
    T Pop();
    T GetTop();
}&lt;/pre&gt;
&lt;p&gt;SqStack类：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public class SqStack&amp;lt;T&amp;gt; : IStack&amp;lt;T&amp;gt;
{
    private int _Maxsize;
    private T[] _Data;
    private int _Top;

    public T this[int index]
    {
        get
        {
            return _Data[index];
        }
        set
        {
            _Data[index] = value;
        }
    }

    //容量属性
    public int Maxsize
    {
        get
        {
            return _Maxsize;
        }
        set
        {
            _Maxsize = value;
        }
    }
    //栈顶属性
    public int Top
    {
        get
        {
            return _Top;
        }
    }

    //求栈的长度
    public int Length
    {
        get
        {
            return _Top + 1;
        }
    }

    //判断顺序栈是否为空
    public bool IsEmpty
    {
        get
        {
            if (_Top == -1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    //判断顺序栈是否为满
    public bool IsFull
    {
        get
        {
            if (_Top == _Maxsize - 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    //构造器
    public SqStack(int size)
    {
        _Data = new T[size];
        _Maxsize = size;
        _Top = -1;
    }

    //清空顺序栈
    public void Clear()
    {
        _Top = -1;
    }

    //入栈
    public void Push(T item)
    {
        if (IsFull)
        {
            Console.WriteLine("Stack is full");
            return;
        }
        _Data[++_Top] = item;
    }

    //出栈
    public T Pop()
    {
        T tmp = default(T);
        if (IsEmpty) 
        {
            Console.WriteLine("Stack is empty");
            return tmp;
        }
        tmp = _Data[_Top];
        --_Top;
        return tmp;
    }

    //获取栈顶数据元素
    public T GetTop()
    {
        if (IsEmpty)
        {
            Console.WriteLine("Stack is empty!");
            return default(T);
        }
        return _Data[_Top];
    }

}&lt;/pre&gt;
&lt;p&gt;测试代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;private static void SqStackTest()
{
    SqStack&amp;lt;string&amp;gt; stk = new SqStack&amp;lt;string&amp;gt;(4);
    string[] s = "A,B,C,D".Split(',');
    foreach (var item in s)
    {
        stk.Push(item);
    }

    Console.WriteLine("SqStack Created:\n---------------------------------");
    PrintSqStack(stk);
    Console.WriteLine();

    Console.WriteLine("Pop Stack:\n---------------------------------");
    PopStack(stk);

    Console.ReadKey();
}

private static void PopStack(SqStack&amp;lt;string&amp;gt; stk)
{

    int fixedLength = stk.Length;
    for (int i = 0; i &amp;lt; fixedLength; i++)
    {
        Console.WriteLine("#{0} - {1} Poped", fixedLength - i, stk.GetTop());
        System.Threading.Thread.Sleep(300);
        stk.Pop();
    }
    Console.WriteLine("The Stack is Empty now.");
}

/// &amp;lt;summary&amp;gt;
/// 打印顺序栈
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name="stk"&amp;gt;顺序栈&amp;lt;/param&amp;gt;
private static void PrintSqStack(SqStack&amp;lt;string&amp;gt; stk)
{
    int length = stk.Length;
    for (int i = 0; i &amp;lt; length; i++)
    {
        Console.WriteLine("| {0} |", stk[length - i - 1]);
    }
    Console.WriteLine("|___|");
}&lt;/pre&gt;
&lt;p&gt;有图有真相：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/sqstack_201111271743280468.PNG" alt="" width="335" height="292" /&gt;&lt;/p&gt;</description><pubDate>Sun, 27 Nov 2011 17:44:07 GMT</pubDate></item><item><title>LINQ to XML CRUD，并且封装为DAL方法</title><link>http://www.wyjexplorer.cn/Blog/View/EC3073A1BDFB9D90.html</link><description>&lt;p&gt;LINQ非常牛逼，操作数据库和集合对象非常方便，已经得到了非常广泛的应用。好处我不多说了。今天来给大家看看LINQ对XML的增删改查操作，并且封装为DAL类，方便在多层结构的应用程序中使用。以我网站的友情链接模块为例：&lt;/p&gt;
&lt;p&gt;XML文件的结构如下：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&lt;!--?xml version="1.0" encoding="utf-8"?--&gt;
&lt;friendlinkdata&gt;
  &lt;friendlink&gt;
    &lt;id&gt;1&lt;/id&gt;
    &lt;title&gt;XNA Develop&lt;/title&gt;
    &lt;url&gt;http://www.xnadevelop.com/&lt;/url&gt;
    &lt;orderid&gt;1&lt;/orderid&gt;
  &lt;/friendlink&gt;
  &lt;friendlink&gt;
    &lt;id&gt;2&lt;/id&gt;
    &lt;title&gt;BlogNT 开源.NET博客&lt;/title&gt;
    &lt;url&gt;http://www.blognt.com/&lt;/url&gt;
    &lt;orderid&gt;2&lt;/orderid&gt;
  &lt;/friendlink&gt;
&lt;/friendlinkdata&gt;&lt;/pre&gt;
&lt;p&gt; 和以往写ORM一样，我们首先要把对数据的描述抽象为model：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public sealed class FriendLink
{
    private int _id;
    private string _title;
    private string _url;
    private int _orderId;

    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    public string Title
    {
        get { return _title; }
        set { _title = value; }
    }

    public string Url
    {
        get { return _url; }
        set { _url = value; }
    }

    public int OrderId
    {
        get { return _orderId; }
        set { _orderId = value; }
    }
}&lt;/pre&gt;
&lt;p&gt;接下来我们就可以用LINQ 写DAL了。&lt;/p&gt;
&lt;p&gt;注意先要using这些命名空间：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;using System.Linq;
using System.Xml;
using System.Xml.Linq;&lt;/pre&gt;
&lt;p&gt;下面代码中的_xmlPath局部变量是你XML文件的虚拟路径。&lt;/p&gt;
&lt;p&gt;Add（新增一条记录）：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public bool Add(GeekStudio.ORM.Model.FriendLink model)
{
    try
    {
        int id = GetNextId();
        string path = HttpContext.Current.Server.MapPath(_xmlPath);

        XDocument xDoc = XDocument.Load(path);
        xDoc.Element(rootName).Add(
            new XElement("FriendLink", new XElement("Id", id),
                                       new XElement("Title", model.Title),
                                       new XElement("Url", model.Url),
                                       new XElement("OrderId", model.OrderId)
                        ));
        xDoc.Save(path);
        return true;
    }
    catch
    {
        return false;
    }
}&lt;/pre&gt;
&lt;p&gt;GetModel（查询：根据Id获取一条记录（一个Model））&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public GeekStudio.ORM.Model.FriendLink GetModel(int Id)
{
    string path = HttpContext.Current.Server.MapPath(_xmlPath);
    XDocument xDoc = XDocument.Load(path);
    var q = from fdlink in xDoc.Descendants("FriendLink")
            where fdlink.Element("Id").Value == Id.ToString()
            select new ORM.Model.FriendLink()
            {
                Id = Convert.ToInt32(fdlink.Element("Id").Value),
                Title = fdlink.Element("Title").Value,
                Url = fdlink.Element("Url").Value,
                OrderId = Convert.ToInt32(fdlink.Element("OrderId").Value)
            };
    return q.ToList()[0];
}&lt;/pre&gt;
&lt;p&gt;如果要返回一个Model List集合，只要把写成return q.ToList()就可以了。&lt;/p&gt;
&lt;p&gt;Delete（删除一条记录）&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public bool Delete(int Id)
{
    try
    {
        string path = HttpContext.Current.Server.MapPath(_xmlPath);
        XDocument xDoc = XDocument.Load(path);
        (from fdlink in xDoc.Descendants("FriendLink")
         where fdlink.Element("Id").Value == Id.ToString()
         select fdlink).Remove();
        xDoc.Save(path);
        return true;
    }
    catch
    {
        return false;
    }
}&lt;/pre&gt;
&lt;p&gt;Update（更新一条记录）&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public bool Update(GeekStudio.ORM.Model.FriendLink model)
{
    try
    {
        string path = HttpContext.Current.Server.MapPath(_xmlPath);

        XDocument xDoc = XDocument.Load(path);
        var q = from fdlink in xDoc.Descendants("FriendLink")
                where fdlink.Element("Id").Value == model.Id.ToString()
                select fdlink;
        foreach (XElement xe in q)
        {
            xe.SetElementValue("Title", model.Title);
            xe.SetElementValue("Url", model.Url);
            xe.SetElementValue("OrderId", model.OrderId);
        }
        xDoc.Save(path);
        return true;
    }
    catch
    {
        return false;
    }
}&lt;/pre&gt;
&lt;p&gt;至此，我们已经写好了CRUD的4个方法。大家可以根据自己需要做调整。&lt;/p&gt;
&lt;p&gt;附：生成下一个Id的方法（寻找最大的Id然后+1）&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;private static int GetNextId()
{
    string path = HttpContext.Current.Server.MapPath(_xmlPath);
    try
    {
        XDocument xDoc = XDocument.Load(path);
        var q = (from fdlink in xDoc.Descendants("FriendLink")
                 select fdlink.Element("Id").Value).Max();
        int i = int.Parse(q);
        return i + 1;
    }
    catch
    {
        return 0;
    }
}&lt;/pre&gt;
&lt;p&gt;提示：这个方法是有bug的。文末公布bug。&lt;/p&gt;
&lt;p&gt;不过XML做数据库还是无法和传统的关系型数据库做比较，毕竟思想不一样。比如这个方法。我们知道，通过最大ID+1生成的新Id是可笑的。我们的本意是Id为IDENTITY列。但如果让数据库做，这个Id就不会是最大Id+1了。比如你有一坨记录，Id为1，2，3，4。你把4删了，再增加一条记录，数据库绝对不会把新记录的Id写成4。而是从5开始的。&lt;/p&gt;
&lt;p&gt;另外，XML也有很多硬伤，无法和数据库相比。本文只是演示如何用LINQ对XML进行增删改查操作，并不是建议大家用XML做数据库。至于用什么来存数据，这是一个“适合和不适合”的命题，而不是一个“对与错”的命题～。&lt;/p&gt;
&lt;p&gt;刚才提到的bug其实是这样的：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;select Convert.ToInt32(fdlink.Element("Id").Value)).Max();&lt;/pre&gt;
&lt;p&gt;恍然大悟吧？:D&lt;/p&gt;</description><pubDate>Sun, 27 Nov 2011 10:31:02 GMT</pubDate></item><item><title>几种常用的代码重构手法</title><link>http://www.wyjexplorer.cn/Blog/View/EA5D67D16874A2A3.html</link><description>&lt;p&gt;最近看了Martin Fowler的著作《Refactoring: Improving the Design of Existing Code》收获颇大。书上的例子都是Java写的，其实我们同样可以运用在其他语言中，现在做.NET开发的话，用的最多的就是Visual Studio，它自带的重构功能可以很方便的整理代码。&lt;/p&gt;
&lt;p&gt;重构的好处不多叙述了，大家都明白。书上论述的非常详细，我挑选几种最常用的重构方法，并用C#语言做示例，帮助大家了解必要的重构手法。另外，我也会附上一些自己平时在编程中常用的重构片段，但未必是100%正确或最好的。&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.Extract Method &lt;/strong&gt;&lt;strong&gt;（提取函数）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;样例代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public void PrintOwing(double amount)
{
	PrintBanner();
	// print details
	Console.WriteLine("name:" + _name);
	Console.WriteLine("amount:" + _amount);
}&lt;/pre&gt;
&lt;p&gt;重构为：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;public void PrintOwing(double amount)
{
	PrintBanner();
	PrintDetails(amount);
}

public void PrintDetails(double amount)
{
	// print details
	Console.WriteLine("name:" + _name);
	Console.WriteLine("amount:" + _amount);
}&lt;/pre&gt;
&lt;p&gt;思想：让每个函数只做一件事，抽取能够被组织在一起的代码，并单独抽取为一个函数。如果函数的粒度小，被复用的机会就更大。&lt;/p&gt;
&lt;p&gt;我常看到初学ASP.NET的同学喜欢把所有的代码全部写在Page_Load事件中。我们暂且不论分层架构，光看页面本身，如果所有的代码都放在一个函数中，那么可重用性就几乎为0。&lt;/p&gt;
&lt;p&gt;打个比方，你的页面上有个GridView，你希望打开网页的时候给它绑定数据，于是你讲这段代码放在了Page_Load中，当然，Page_Load还会做除此以外的很多处理。然而，在你相应页面的其他事件的时候（比如点击Button、处理用户输入等），仍然需要重新绑定GridView的数据。这时候你就非常希望不要重写一遍数据绑定的逻辑（如果重写一个逻辑很多次，那以后要改的话就得改很多处）。于是，我们就应该把数据绑定逻辑提取到一个单独的函数中。比如叫BindData()，然后分别在Page_Load事件，和其他你需要再次绑定数据的事件中调用BindData()。&lt;/p&gt;
&lt;p&gt;PS: 有时候需要重新绑定数据，单独写GridView1.DataBind();是不行的。&lt;/p&gt;
&lt;p&gt;Visual Studio中做这样的重构很简单：选中你要提取的代码片段，然后点右键-&amp;gt;重构-&amp;gt;提取方法，键入一个新方法名称即可。VS会自动处理该片段与已有函数的调用关系。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/refact_201111151700238437.PNG" alt="" width="699" height="432" /&gt;&lt;/p&gt;
&lt;p&gt;关于函数的命名，我建议大家用动宾短语，阅读的时候会感觉比较自然。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;&lt;strong&gt;Inline Temp&lt;/strong&gt;&lt;strong&gt;（内联临时变量）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;样例代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;double basePrice = anOrder.BasePrice();
return (basePrice &amp;gt; 1000);&lt;/pre&gt;
&lt;p&gt;重构为：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;return (anOrder.BasePrice() &amp;gt; 1000);&lt;/pre&gt;
&lt;p&gt;注意：重构前要保证这个临时变量只被赋值一次，所以当遇到for等循环语句时，要注意被内联的变量的值是否会在循环中被改变。有时在执行for之前定义固定的临时变量是必要的。尤其是当临时变量取自某对象的属性，而这个对象将在for循环中被更改。&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. &lt;/strong&gt;&lt;strong&gt;Replace Temp with Query&lt;/strong&gt;&lt;strong&gt;（以查询取代临时变量）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;样例代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;double basePrice = _quantity * _itemPrice;
if(basePrice &amp;gt; 1000)
{
	return basePrice * 0.95;
}
else
{
	return basePrice * 0.98;
}&lt;/pre&gt;
&lt;p&gt;重构为：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;if(BasePrice() &amp;gt; 1000)
{
	return BasePrice() * 0.95;
}
else
{
	return BasePrice() * 0.98;
}
...
double BasePrice()
{
	return _quantity * _itemPrice;
}&lt;/pre&gt;
&lt;p&gt;其实对于这个重构，我还是有些疑惑的。我们发现，BasePrice()会被计算多次，但书上说不用担心性能问题，不过我对此还是保持怀疑。毕竟有些计算开销是很大的，并且执行多次可能产生额外的影响，所以我建议大家使用Replace Temp with Query手法的时候要谨慎，如果给一个临时变量复制的操作开销很大，尤其是需要和数据库交互，我不建议采用该手法重构。&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. &lt;/strong&gt;&lt;strong&gt;Replace Nested Conditional with Guard Clauses &lt;/strong&gt;&lt;strong&gt;（以卫语句嵌套条件表达式）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;样例代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;double GetPayAmount()
{
	double result;
	if(_isDead) result = deadAmount();
	else
	{
		if(_isSeparated)
		{
			result = separatedAmount();
		}
		else
		{
			if(_isRetired)
			{
				result = retiredAmount();
			}
			else
			{
				result = normalPayAmount();
			}
		}
	}
	return result;
}&lt;/pre&gt;
&lt;p&gt;重构为&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;double GetPayAmount()
{
	if(_isDead)
	{
		return deadAmount();
	}
	if(_isSeparated)
	{
		return separatedAmount();
	}
	if(_isRetired)
	{
		return retiredAmount();
	}
	return normalPayAmount();
}&lt;/pre&gt;
&lt;p&gt;这个重构手法也是我用的很多的，在初学编程的时候，很多人都会写出很多if&amp;hellip;else嵌套的代码，其实很多时候，else并不是必须的。关于if&amp;hellip;else&amp;hellip;如何取决，关键看你对各分支的重视程度。&lt;/p&gt;
&lt;p&gt;摘录书上的原话：&lt;/p&gt;
&lt;p&gt;&amp;ldquo;根据我的经验，条件表达式通常有两种表现形式。第一种形式是：所有分支都属于正常行为。第二种形式则是：条件表达式提供的答案中只有一种是正常行为，其他都不是常见的情况。这两类表达式有不同的用途，这一点应该通过代码表现出来。如果两条分支都是正常行为，就应该用形如if&amp;hellip;else&amp;hellip;的条件表达式；如果某个条件及其罕见，就应该单独检查该条件，并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为卫语句&amp;rdquo;&lt;/p&gt;
&lt;p&gt;插一句题外话，我平时写程序，遇到不正常情况需要提示，我通常会在if里throw一个exception，这些if是并行的，不是嵌套的，最后在catch里捕获消息并弹窗提示，我不知道这种做法是否好，求高手指点: )&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. &lt;/strong&gt;&lt;strong&gt;Introduce Explaining Variable&amp;nbsp; &lt;/strong&gt;&lt;strong&gt;（引入解释性变量）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;样例代码：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;if((platform.ToUpper().IndexOf("MAC") &amp;gt; -1) &amp;amp;&amp;amp; (browser.ToUpper().IndexOf("IE") &amp;gt; -1) &amp;amp;&amp;amp; wasInitialized() &amp;amp;&amp;amp; resize &amp;gt; 0)
{
	// do something
}&lt;/pre&gt;
&lt;p&gt;重构为：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;bool isMacOs = platform.ToUpper().IndexOf("MAC") &amp;gt; -1;
bool isIE = browser.ToUpper().IndexOf("IE") &amp;gt; -1;
bool wasResized = resize &amp;gt; 0;

if(isMacOs &amp;amp;&amp;amp; isIE &amp;amp;&amp;amp; wasInitialized() &amp;amp;&amp;amp; wasResized)
{
	// do something
}&lt;/pre&gt;
&lt;p&gt;这种重构手法的目的显而易见，不多叙述了。&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. 我自己常用的代码重构片段&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. 关于if和return&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;// 原始片段
int row = DbHelperSql.ExecuteSql(sql);
if(row) &amp;gt; 1
{
	return true;
}
else
{
	return false;
}

// 这样写可以省略一对括号
int row = DbHelperSql.ExecuteSql(sql);
if(row) &amp;gt; 1
{
	return true;
}
return false;

// 逻辑是这样，直接return一个表达式
int row = DbHelperSql.ExecuteSql(sql);
return (row &amp;gt; 1);

// 应用"Replace Temp with Query"手法
return DbHelperSql.ExecuteSql(sql) &amp;gt; 1;&lt;/pre&gt;
&lt;p&gt;2. 三目表达式&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;// 如果碰到非bool类型的返回值可以这样
return Function() == 1 ? "Hehe" : "haha";&lt;/pre&gt;
&lt;p&gt;&amp;ldquo;Replace Temp with Query&amp;rdquo;中的例子也可以写成三目表达式：&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;return BasePrice() &amp;gt; 1000 ? BasePrice() * 0.95 : BasePrice() * 0.98;&lt;/pre&gt;</description><pubDate>Tue, 15 Nov 2011 17:09:10 GMT</pubDate></item><item><title>作为程序员，我们理应自豪(转)</title><link>http://www.wyjexplorer.cn/Blog/View/581F02D941D85A3B.html</link><description>&lt;p&gt;我们每个人都对自己的未来有所思量，因为我们每个人都怀揣着高远的梦想，我们每天都在打理着我们的生活，日复一日，年复一年。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;有人说，人生最重要的不是努力，不是奋斗，而是抉择。那么我想说，我们选择程序员无悔这一生。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;span style="font-family: mceinline;"&gt;&lt;strong&gt;&lt;span style="font-family: mceinline;"&gt;&lt;span style="font-family: 宋体;"&gt;　　对待工作--认真负责：&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;　　　　试问哪个程序员不把自己变得非常有思想，非常有深度，让自己的大脑始终保持着兴奋状态？&lt;/p&gt;
&lt;p&gt;　　　　试问哪个程序员没有孤身在寂寥的深夜挑灯敲代码调试程序？&lt;/p&gt;
&lt;p&gt;　　　　试问哪个程序员不像妓女一样把顾客奉为圣明，随时随地都要满足用户的各种变态需求？&lt;/p&gt;
&lt;p&gt;　　　　······&lt;/p&gt;
&lt;p&gt;　　　　所以作为程序员的我们，我们应该很自豪，因为我们热爱我们的工作，我们对待我们的工作很认真，很用心，很负责任。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;为了我们的工作，我们必须要学会和同事沟通；学会和领导下级沟通；学会如何缓解压力；学会如何去让自己始终保持活力；学会健康的爱护我们自己，爱护我们的身体。&lt;/p&gt;
&lt;p&gt;　　　　我们知道如果我们不抓住生命的光彩，那么我们就要平庸下去。所以我们没有浪费时间的理由，我们&lt;strong&gt;始终向一切一切的懒惰和借口说“没时间”。&lt;/strong&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们知道我们有时候工作不顺心，不顺意，但是我们知道&lt;strong&gt;生活本来就像一把无情刻刀，改变我们的模样&lt;/strong&gt;，我们更加知道&lt;strong&gt;如果我们不能在逆流的江海中乘风破浪，我们只能会被甩下来望江兴叹。&lt;/strong&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;所以我们爱这份职业，爱这份能让我们为之奋斗的职业。我们应该为这样一份职业而感到自豪。&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;对待学习--积极努力：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;如果说，学历代表过去，财力代表现在，学习代表将来的话，那么我们程序的将来会风光无限，会灯火辉煌。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们知道当今计算机行业的发展如此迅速，所以我们不会忘记学习，忘记那些应该属于我们的灿烂将来。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;对于程序员这个职业来说，我们不仅要会写代码，我们还要会通过每天的学习来学会思考，学会谋定而后动。我们知道我们不能依赖工具，不能做工具的奴隶，我们要通过学习要拥有一种思维，一种精神，一种观念，为了自由软件而奋斗而努力，去满足客户所有需求。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;所以对待学习，我们知道这是必须的，这是我们赖以生存的法宝，使我们对待工作热情的增强剂，这也是我们对抗压力的必杀技···&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;作为程序员我们应该很自豪，因为我们每天学习着，充实着自己。&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;对待生活--生活何以卓越，生活何以平庸，我们程序员有属于自己对待生活的态度：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们程序员对待生活，只能说是珍惜热爱。因为我们大部分时间都嫁给了代码，所以我们在其余的上面就会显得时间很紧张。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;不过这样也依然阻止不了我们程序员对待生活的热爱和珍惜。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;每到周末陪老婆孩子逛逛公园，散散步，欣赏一下夕阳西下的一家人的开心快乐。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;每到长假回家看看，孝敬孝敬父母，帮助他们做一些家务等。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们程序员还会在闲暇的时候写一些关于计算机方面或管理方面的书籍，也有些程序员做一些教育视频等，这些都为教育事业增加一些光彩绚烂。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;其实还有种种，在这里不赘言。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;生活何以卓越，生活又何以平庸。我们程序员有属于我们自己对待生活的态度。大家有目共睹。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我想说，我们应该为了我们每天过着程序员的生活而自豪，而兴奋。&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;对待技术--将骨子里的傲气进行到底：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们程序员对于技术来说，真的是一丝不苟。我们在团队中会对一些技术发生争吵，而且争吵的热烈程度可以和集市的吆喝叫卖同日而语。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;大家对技术的钟爱程度已经不能用喜欢这样的词根来形容了。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;在这里引用别人的一句话“每个程序员骨子里头都有一股傲气，如果你不能技压群雄，他们就不会听你指挥。一个技术水平较差的人被任命为程序经理真是个悲剧，就象一个略有权势的太监，表面上有人对他点头哈腰，背后却被人鄙视。”&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我相信这种骨子里的傲气会引领我们程序员对技术苛求，一丝不苟。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们应该为了我们这种骨子里的傲气而自豪。&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;对待思想--培养一种软件灵魂&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;谈完对待技术，我们不得不提思想。如果技术和思想比较，我们程序员还是更加注重思想。我们都知道我们程序员是要拥有一种软件思维，一种软件的灵魂。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;如果我们每天都在做着纯粹的代码工人，不去思考，不去升华一些东西，那么我们就真的是一个奴隶了。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;不过还好，在我遇到和认识的程序员中，大家都有很深的思想。做事从来都是大局观和细节并茂。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们程序员如果有思想，就会使用电锯，而不会去拉锯的。不解释，你懂得。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;如果我们那么的有思想，我们再不自豪，那就没有天理了吧？&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;对待交流--没你不行：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;对于我们程序员来说，没有交流那是不行的。因为我们是团队，从来不是单打独斗。残酷的历史经常告诉我们要学会交流，不能闭关锁国。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;对待交流我们必须要学会如何和上级交流，如何和下属交流，如何和客户交流等等。在这个方面中，那个环节短路了也不行。所以我们的任务不仅仅是要枯燥的敲打代码。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们要明白上级表达的希望和要求，明白上级给自己的暗示和劝告。我们也要明白下属反应的愿望和请求。更加要明白用户的各种需求，顾客是上帝。这些就不多解释，大家都能理解。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们要学会交流，所以我们不单单是要敲打代码的工人，从这点我们就不应该不为自己鼓掌。我们应该自豪。&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;对待成功和失败--没有失败和成功，有的只是挑战&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们程序员，一生会有很多次成功，无论是大成功还是小成功。但是我们知道这不是每个人的功劳，相反我们会认为这是团队的力量，我们总会把成功归功于团队，因为我们知道团队的力量，团队才是成功的最核心的因素。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;我们程序员，也都经历过失败，我们程序员如果遇到失败的事情，总会第一个就会想到自己哪里有不足，努力的从自己身上找原因，我们一直坚信烧不死的鸟才是凤凰，只有敢于接受失败的挑战，并且能够奋然去找到失败原因去战胜它，我们才能有脱胎换骨的进步&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;所以我们程序员从来就不把成功当作成功，不把失败当作失败，处之泰然，放平心态，迎接的都是下一个挑战。&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;所以我们没有理由不自豪。&lt;strong&gt;因为我们的生活没有失败和成功，有的只是挑战。&lt;/strong&gt;&lt;/p&gt;
&lt;p style="padding-left: 60px;"&gt;虽然，&lt;strong&gt;岁月惘然如梭，我们在拼搏的旅途中，没有多少风景值得我们驻足停留，但是我们有理由要自豪，理所应当自豪起来&lt;/strong&gt;。&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;我们自豪，因为我们是程序员&lt;/span&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;原文：http://www.cnblogs.com/yanhuahuo/archive/2011/09/30/2196810.html&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;笔者CSDN博客同步更新：&lt;a href="http://blog.csdn.net/lfsf802/article/details/6153401"&gt;http://blog.csdn.net/lfsf802/article/details/6153401&lt;/a&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;笔者声明：本人的原创笔记或文章版权归作者所有，凡转载者请著名出处和博客连接地址。&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt; &lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;a href="/Blog/View/F13582B555ECBF0F.html"&gt;另推荐一篇《&lt;span id="LblTitle"&gt;为什么编程是独一无二的职业&lt;/span&gt;》&lt;/a&gt;&lt;/p&gt;</description><pubDate>Tue, 15 Nov 2011 09:21:09 GMT</pubDate></item><item><title>富文本编辑器TinyMCE3.4.7整合代码高亮插件版下载</title><link>http://www.wyjexplorer.cn/Blog/View/773EA5847D6E0C89.html</link><description>&lt;p&gt;今天准备给网站换编辑器，百度的UEditor虽然不错，但bug还是有点多。还是老牌的TinyMCE好。&lt;/p&gt;
&lt;p&gt;很多人在找“插入代码”的功能，网上有很多教程和插件，肯把整合版拿出来给别人下载的却很少（现有的下载也都是老版本的TinyMCE）。&lt;/p&gt;
&lt;p&gt;我根据国外一个论坛上的方法，下载了syntaxhl插件并成功整合到了最新版的TinyMCE上。并且调整了默认主题的css，默认字体大小12px，pre标签也会显示一个外框方便区别其他文本。&lt;/p&gt;
&lt;p&gt;有图有真相：&lt;/p&gt;
&lt;p&gt;&lt;img style="float: none;" title="201111131105100156" src="/Uploads/201111131105100156.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="float: none;" title="201111131105107187" src="/Uploads/201111131105107187.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;整合过程没什么技术含量，任何人照着syntaxhl的README做，都可以成功。我分享出来给大家提供方便，以后大家不用再自己去找插件整合了。&lt;/p&gt;</description><pubDate>Sun, 13 Nov 2011 11:09:22 GMT</pubDate></item><item><title>UEditor1.1.7开发版ASP.NET图片上传代码</title><link>http://www.wyjexplorer.cn/Blog/View/AB3813D2AAC59BEB.html</link><description>&lt;p&gt;以前在UEditor群里经常看到人家问图片上传怎么搞，其实很简单，UEditor已经自带了一个例子了，任何一个合格的程序员都可以写成别的语言。问ASP.NET的人居多，估计都是学生，看不懂php的代码，当然也没办法自己写.NET版了。&lt;/p&gt;&lt;p&gt;今天我尝试了下最新的1.1.7开发版，它的图片上传功能已经和1.1.6不一样了，现在用的是Flash多图片上传，当然，后台还是要有服务器端程序支持的。截至目前，网上还没有针对1.1.7图片上传的文献，我只能自己写了一个，目前测试下来没什么问题，所以把代码发上来分享给大家。&lt;/p&gt;&lt;p&gt;首先，打开VisualStudio，在ueditor\server\upload\net下建立一个空的ASP.NET页面，叫做up.aspx，然后把它的前台代码删光，只留一句：&lt;/p&gt;&lt;pre class="brush: html;toolbar:false;"&gt;&lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="up.aspx.cs" Inherits="ueditor_server_upload_net_up" %&gt;&lt;/pre&gt;&lt;p&gt;这是为了保证上传成功后Response.Write()出来的东西不会受到无用代码的影响。（以前手工做AJAX的时候就是这么干的，还记得么？）&lt;/p&gt;&lt;p&gt;然后，核心代码是Up.aspx.cs：我懒，代码写的比较丑陋，反正也只有自己看，无所谓了，高手莫笑。&lt;/p&gt;&lt;p&gt;这里上传路径是网站根目录下的Uploads文件夹。UEditor文件夹和他平行，也在网站根目录下。&lt;/p&gt;&lt;pre class="brush: c#;toolbar:false;"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using WYJ.Web.Utils;
 
public partial class ueditor_server_upload_net_up : System.Web.UI.Page
{
 
    string uploadPath = "Uploads";   //保存路径
    string fileType = ".jpg,.jpeg,.gif,.png,.bmp";   //文件允许格式
    int fileSize = 2048;    //文件大小限制，单位KB
    string state = "SUCCESS";
 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            HttpPostedFile oFile = Request.Files[0];
            string fileExtension = System.IO.Path.GetExtension(oFile.FileName).ToLower();
            if (fileType.ToLower().IndexOf(fileExtension) &gt; -1)//检测是否为允许的上传文件类型
            {
                if (this.fileSize * 1024 &gt;= oFile.ContentLength)
                {
                    try
                    {
                        string DirectoryPath;
                        // 取消下面注释按文件夹归档储存
                        //DirectoryPath = uploadPath + DateTime.Now.ToString("yyyy-MM");
                        DirectoryPath = uploadPath;
                        string sFileName = DateTime.Now.ToString("yyyyMMddHHmmssffff");  //文件名称
                        string FullPath = "~/" + DirectoryPath + "/" + sFileName + fileExtension;//最终文件路径
                        if (!Directory.Exists(Server.MapPath("~/" + DirectoryPath)))
                            Directory.CreateDirectory(Server.MapPath("~/" + DirectoryPath));
                        oFile.SaveAs(Server.MapPath(FullPath));
                        //Response.Write("&lt;script type=‘text/javascript‘&gt;parent.reloadImg(‘" + Page.ResolveUrl(FullPath) + "‘);" + "location.href=‘upload.aspx?url=" + Page.ResolveUrl(FullPath) + "‘;&lt;/script&gt;");
 
                        string retPath = "/" + DirectoryPath + "/" + sFileName + fileExtension;
 
                        Response.Write("{‘url‘:‘" + retPath + "‘,‘title‘:‘" + sFileName + "‘,‘state‘:‘" + state + "‘}");
 
                    }
                    catch (Exception ex)
                    {
 
                        MessageBox.ShowAndRedirect(this, "上传文件失败。" + ex.Message, "upload.aspx");
                    }
                }
                else
                {
                    MessageBox.ShowAndRedirect(this, "上传文件大小超过限制。", "upload.aspx");
                }
            }
            else
            {
                MessageBox.ShowAndRedirect(this, "上传文件扩展名是不允许的扩展名。", "upload.aspx");
            }
        }
    }
 
    public string Filter(string Url)
    {
        Url = Url.Replace("&amp;", "&amp;amp;");
        Url = Url.Replace("‘", "&amp;qpos;");
        Url = Url.Replace("\"", "&amp;quot;");
        Url = Url.Replace("&lt;", "&amp;lt;");
        Url = Url.Replace("&gt;", "&amp;gt;");
        return Url;
    }
}&lt;/pre&gt;&lt;p&gt;补充一点：我偷懒了，没用Filter函数。但已经给大家写好了。留个小题给大家，大家可以对照着UEditor给的其他实例，把这个函数加到正确的位置上。&lt;/p&gt;&lt;p&gt;然后，在ueditor\dialogs\image\image.html中，修改上传处理页面的地址为我们的up.aspx。大约是155行左右。&lt;/p&gt;&lt;pre class="brush: html;toolbar:false;"&gt;url:"../../server/upload/net/up.aspx"&lt;/pre&gt;&lt;p&gt;&lt;img src="/Uploads/201111121721421093.png" style="float:none;" title="201111121721421093" /&gt;&lt;/p&gt;&lt;p&gt;最后，如上图所示，有个很坑爹的地方一定要改掉：在ueditor\dialogs\image下的image.html中，有个insertBatch()函数，大概在256行左右。记得把它原来自带的修正地址数据改成如图所示的样子。不然你的url之前总会多“。。/server/upload”这样的字符串，显然不是我们的真实路径。&lt;/p&gt;&lt;p&gt;OK，大功告成。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description><pubDate>Sat, 12 Nov 2011 17:26:40 GMT</pubDate></item><item><title>兼容IE和Firefox的复制地址栏函数</title><link>http://www.wyjexplorer.cn/Blog/View/6AF9781BFC346FA4.html</link><description>&lt;p&gt;网上找到的，经测试有效。IE9，Firefox8下没问题。&lt;/p&gt;
&lt;pre class="brush: jscript;fontsize: 100; first-line: 1; "&gt;&lt;script type="text javascript"=""&gt;
/*
*Ie &amp;&amp; Firefox CopyToClipBoard
*
*/
function copyToClipBoard() {
    var txt = window.location.toString();
        //txt += document.title;
    if(window.clipboardData) {
        window.clipboardData.clearData();   
        window.clipboardData.setData("Text",txt);
    }else if(navigator.userAgent.indexOf("Opera") != -1) {   
        window.location = txt;   
    } else if (window.netscape) {   
        try {   
            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");   
        } catch (e) {   
            alert("被浏览器拒绝！\n请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'");   
        }   
        var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);   
        if (!clip)   
            return;   
        var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);   
        if (!trans)   
            return;   
        trans.addDataFlavor('text/unicode');   
        var str = new Object();   
        var len = new Object();   
        var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);   
        var copytext = txt;   
        str.data = copytext;   
        trans.setTransferData("text/unicode",str,copytext.length*2);   
        var clipid = Components.interfaces.nsIClipboard;   
        if (!clip)   
            return false;   
        clip.setData(trans,null,clipid.kGlobalClipboard);
    }
    alert("复制成功，请粘贴到你的QQ/MSN上推荐给你的好友！");
}
&lt;/script&gt;&lt;/pre&gt;</description><pubDate>Sat, 12 Nov 2011 09:58:21 GMT</pubDate></item><item><title>Silverlight多文件上传组件</title><link>http://www.wyjexplorer.cn/Blog/View/FA73A063E65FE95C.html</link><description>&lt;p&gt;发现个开源的SL多文件（大文件）上传项目，试了试，确实不错。但进度条显示不是很准确，不知道是不是因为VS直接启动的问题，可能放IIS上就好了。&lt;/p&gt;&lt;p&gt;地址是：http://slfileupload.codeplex.com/&lt;/p&gt;&lt;p&gt;截图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201111032132375781.jpg" height="354" width="460" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Project Description&lt;/strong&gt;&lt;br /&gt;The Silverlight Multi File Uploader is a 
free Silverlight 4 application. It can be used to upload multiple files 
simultaneously to your website. Includes a JavaScript interface and also
 supports PHP.&lt;br /&gt;&lt;br /&gt;The LITE version is fully customizable and can be controlled using JavaScript.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NuGet&lt;/strong&gt;&lt;br /&gt;Also available as NuGet package:&lt;br /&gt;PM&gt; Install-Package mpost.slmfu.examples&lt;br /&gt;&lt;a href="http://www.nuget.org/List/Packages/mpost.slmfu" class="externalLink"&gt;http://www.nuget.org/List/Packages/mpost.slmfu&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.nuget.org/List/Packages/mpost.slmfu.examples" class="externalLink"&gt;http://www.nuget.org/List/Packages/mpost.slmfu.examples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Donate&lt;/strong&gt;&lt;br /&gt;Silverlight Multi File Uploader is a free open source project that is developed in my personal time. &lt;br /&gt;You can support this project by donating via PayPal.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=146020" class="externalLink"&gt;Donate by PayPal&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=2009662" class="externalLink"&gt;Donate EUR 10 by PayPal&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=213140" class="externalLink"&gt;Donate $15 by PayPal&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=213144" class="externalLink"&gt;Donate $50 by PayPal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Silverlight Multi File Uploader is STABLE and ready for production environments.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;br /&gt;- Select multiple files to upload &lt;br /&gt;- Upload multiple files at the same time (asynchonous)&lt;br /&gt;- Cancel a single upload, or clear the full list&lt;br /&gt;- Shows the overall progress&lt;br /&gt;- Error notification when upload failed&lt;br /&gt;- Drag and drop files to the control&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;For developers / webmasters:&lt;/strong&gt;&lt;br /&gt;- Configure file extension filter (for example, only .jpg files) &lt;br /&gt;- Configure maximum file size &lt;br /&gt;- Configure the number of simultaneous uploads &lt;br /&gt;- Input for custom parameters &lt;br /&gt;- Basic webservice included &lt;br /&gt;- Change the default color by setting a single parameter&lt;br /&gt;- Text in resource file for easy localization&lt;br /&gt;- &lt;strong&gt;JavaScript events and properties for integration in your website&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;</description><pubDate>Thu, 03 Nov 2011 21:32:43 GMT</pubDate></item><item><title>《巫妖王的陨落》片尾：巫妖王之死高清英文版下载</title><link>http://www.wyjexplorer.cn/Blog/View/47587CA4654C0437.html</link><description>&lt;p&gt;中文版蛋疼，不解释，英文版找了哥很久，终于找到了，是个原版的！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a target="_self" href="http://filesmelt.com/downloader/WOW_FotLK_1024.avi"&gt;http://filesmelt.com/downloader/WOW_FotLK_1024.avi&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;记得一定要用迅雷下。直接复制地址到迅雷里就可以。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="width: 710px; height: 399px;" src="http://www.wyjexplorer.cn/Uploads/201110301504586562.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="width: 710px; height: 399px;" src="http://www.wyjexplorer.cn/Uploads/201110301506100937.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="width: 710px; height: 399px;" src="http://www.wyjexplorer.cn/Uploads/201110301506491718.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;全部台词：&lt;/p&gt;&lt;p&gt;&lt;span id="postcontent10" class="postcontent ubbcode"&gt;Father！&lt;br /&gt;父亲！&lt;br /&gt;&lt;br /&gt;Is it over？&lt;br /&gt;一切都结束了吗？&lt;br /&gt;&lt;br /&gt;And lone last, no king rules forever， my son.&lt;br /&gt;从来，就没有国王能永远统治他的一切，我的儿子&lt;br /&gt;&lt;br /&gt;I see……only darkness before me……&lt;br /&gt;我的前方，只能看到一片黑暗&lt;br /&gt;&lt;br /&gt;without its master's command, the ? Scourge will come even greater threaten to the world&lt;br /&gt;没有了巫妖王，亡灵天灾将会成为对这个世界更为巨大的威胁&lt;br /&gt;&lt;br /&gt;Control must be maintained, there must always being on lich king.&lt;br /&gt;亡灵天灾的控制必须被维持，巫妖王必须继续存在下去。&lt;br /&gt;The ? of such a ? It must be mine! For there is no other……(渣水平听不了啊)&lt;br /&gt;这件事情该我来做了，没有其他任何人……&lt;br /&gt;&lt;br /&gt;Tirion! You own great destiney in your hands, brother. But it's not your own……&lt;br /&gt;提里奥！你手中的掌握着重大的命运，我的兄弟，但那不是属于你的&lt;br /&gt;&lt;br /&gt;Bowaer!&lt;br /&gt;伯瓦尔！&lt;br /&gt;&lt;br /&gt;The dragon's flame seal my fate, the world of living can no longer convert me.&lt;br /&gt;巨龙的烈焰决定了我的命运，生者的世界将不再属于我&lt;br /&gt;&lt;br /&gt;Place the crown on my head, Tirion,forever more, I will be the ? of the dead.&lt;br /&gt;把皇冠给我戴上，提里奥，我将成为亡灵的王……&lt;br /&gt;&lt;br /&gt;No, friend, I can not do it!&lt;br /&gt;不，我的朋友！我做不到！&lt;br /&gt;Tirion, you and these brave heroes have your own destiney to fulfill&lt;br /&gt;提里奥，你和这些勇敢的英雄有着属于你们的命运去完成&lt;br /&gt;this last end of service, is mine&lt;br /&gt;这最后的任务，是我的&lt;br /&gt;you will not be forgotten, brother……&lt;br /&gt;你永远不会被忘记，我的兄弟&lt;br /&gt;&lt;br /&gt;I must be forgotten! Tirion, if the world ? ? ? your fear, they must never know what was done here today&lt;br /&gt;我必须被忘记！提里奥，如果(没听清啊囧)的恐惧，他们不能知道今天这里发生了什么！&lt;br /&gt;Tell them only that the lich king is dead, and Bowaer Fordragon died with him.&lt;br /&gt;告诉他们！巫妖王被击败了！伯瓦尔 弗塔根和他同归于尽了!&lt;br /&gt;&lt;br /&gt;Now go!leave this place and never return……&lt;br /&gt;现在!离开这个地方!并且永远不要再回来!&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description><pubDate>Sun, 30 Oct 2011 15:07:20 GMT</pubDate></item><item><title>解决Global.asax中Session_Start不执行的问题</title><link>http://www.wyjexplorer.cn/Blog/View/7D14A4FF8B2476BE.html</link><description>&lt;p&gt;不少人用Global.asax做网站计数器，我也是，但自从上次调试URL重写和Session冲突的问题之后（参见&lt;a target="_blank" href="http://www.wyjexplorer.cn/Blog/View/940F30CB6321E341.html"&gt;这篇文章&lt;/a&gt;），突然发现计数器不动了。研究一番发现，是web.config中的设置导致Session_Start不执行。&lt;/p&gt;&lt;p&gt;原先是这样写的：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;&lt;remove name="Session" /&gt;
&lt;add name="HtmlSession" type="System.Web.SessionState.SessionStateModule"/&gt;&lt;/pre&gt;&lt;p&gt;其实只要把HtmlSession改成Session就可以修复这个问题：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;&lt;remove name="Session" /&gt;
&lt;add name="Session" type="System.Web.SessionState.SessionStateModule"/&gt;&lt;/pre&gt;&lt;p&gt;这样既可以解决URL重写和Session冲突的问题，又不会引起Global.asax中Session_Start不执行～&lt;/p&gt;&lt;p&gt;目前还没有发现额外的问题～&lt;br /&gt;&lt;/p&gt;</description><pubDate>Sat, 29 Oct 2011 12:39:26 GMT</pubDate></item><item><title>Expression Studio 4 MSDN中文原版+激活码</title><link>http://www.wyjexplorer.cn/Blog/View/9CF7BF61D4E90F91.html</link><description>&lt;p&gt;最新在研究Silverlight，也顺便想把Dreamweaver换掉（这东西越来越卡了，还经常崩溃），于是想到了MS的Expression Studio。现在最新版本是4.0了。我找了个能用的，能激活的给大家：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;PS:大家不要再去下什么破解补丁、dll了，小心有木马。其实只要从微软官网下载个试用版然后用下面给出的序列号激活就行了。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;下载地址：&lt;/strong&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=04438F30-CC6D-4E10-80A3-3B3DCE129E88&amp;displaylang=zh-cn"&gt;&lt;strong&gt;http://www.microsoft.com/downloads/details.aspx?familyid=04438F30-CC6D-4E10-80A3-3B3DCE129E88&amp;displaylang=zh-cn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;激活码：6WDDQ-K7D4F-GQGF4-2VYBJ-8K6MB （亲测可用）&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;有图有真相：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110252006467187.jpg" height="484" width="449" /&gt;&lt;br /&gt;&lt;/p&gt;</description><pubDate>Tue, 25 Oct 2011 20:10:36 GMT</pubDate></item><item><title>ASP.NET 产生随机密码</title><link>http://www.wyjexplorer.cn/Blog/View/9C17F7B9CBEB6DF4.html</link><description>&lt;p&gt;产生8位随机密码的函数，BlogEngine源码里的。&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;public static string RandomPassword()
{
    var chars = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
    var password = string.Empty;
    var random = new Random();
    for (var i = 0; i &lt; 8; i++)
    {
        var x = random.Next(1, chars.Length);
        if (!password.Contains(chars.GetValue(x).ToString()))
        {
            password += chars.GetValue(x);
        }
        else
        {
            i--;
        }
    }
    return password;
}&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;</description><pubDate>Tue, 25 Oct 2011 17:31:05 GMT</pubDate></item><item><title>ASP.NET List泛型分页代码</title><link>http://www.wyjexplorer.cn/Blog/View/0C00A6D7DCDDA337.html</link><description>&lt;p&gt;&lt;strong&gt;2011.11.13修正：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 改正页数计算方法，以前的计算公式遇到整除就会多一页&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 重发关键代码，以前因为编辑器的原因，部分代码会被过滤&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 新增“转到[]页”功能&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们以前做ASP.NET网站，通常是把DataSet绑定到显示控件上，再用各种手段进行分页，比如PagedDataSource。然而，如果你是从业务层取数据，通常是一个List，这个时候就不能用以往的方法分页了。&lt;/p&gt;
&lt;p&gt;一种办法是用ObjectDataSource，绑定GridView、ListView就可以分页，但如果遇到DataList或Repeater，就得自己写分页了。下面是我昨天写的List泛型分页Demo，有图有真相：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/201110220921240625.jpg" alt="" width="584" height="322" /&gt;&lt;/p&gt;
&lt;p&gt;下面发代码：&lt;/p&gt;
&lt;p&gt;List泛型分页通用类：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/201110220923485781.jpg" alt="" width="189" height="322" /&gt;&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;/// &lt;summary&gt;
/// 泛型分页类
/// &lt;/summary&gt;
/// &lt;typeparam name="T"&gt;类型&lt;/typeparam&gt;
public class ListPager&lt;T&gt; : List&lt;T&gt;
{
    private int _CurrentIndex;
    private int _PageSize;
    private int _TotalItem;
    private int _PageCount;

    /// &lt;summary&gt;
    /// 当前页码
    /// &lt;/summary&gt;
    public int CurrentIndex
    {
        get { return _CurrentIndex; }
        set { _CurrentIndex = value; }
    }

    /// &lt;summary&gt;
    /// 每页大小
    /// &lt;/summary&gt;
    public int PageSize
    {
        get { return _PageSize; }
        set { _PageSize = value; }
    }

    /// &lt;summary&gt;
    /// 记录总数
    /// &lt;/summary&gt;
    public int TotalItem
    {
        get { return _TotalItem; }
        set { _TotalItem = value; }
    }

    /// &lt;summary&gt;
    /// 页面总数
    /// &lt;/summary&gt;
    public int PageCount
    {
        get { return _PageCount; }
        set { _PageCount = value; }
    }

    /// &lt;summary&gt;
    /// 构造函数
    /// &lt;/summary&gt;
    /// &lt;param name="list"&gt;要分页的List泛型&lt;/param&gt;
    /// &lt;param name="index"&gt;起始页码&lt;/param&gt;
    /// &lt;param name="pageSize"&gt;分页大小&lt;/param&gt;
    public ListPager(List&lt;T&gt; list, int index, int pageSize)
    {
        this._CurrentIndex = index;
        this._PageSize = pageSize;

        int startIndex = (this._CurrentIndex - 1) * PageSize;
        for (int i = startIndex; i &lt; startIndex + this._PageSize &amp;&amp; i &lt; list.Count; i++)
        {
            this.Add(list[i]);
        }

        this._TotalItem = list.Count;
        //this._PageCount = (this._TotalItem / PageSize) + 1;
        this.PageCount = (this._TotalItem + this.PageSize - 1) / this._PageSize;
    }
}&lt;/pre&gt;
&lt;p&gt;测试用Model和模拟的Bll：&lt;/p&gt;
&lt;pre class="brush:c#" style="overflow-x: auto;"&gt;public partial class NewsModel
{
    int _Id;
    string _Title;
    string _Content;
    DateTime _Posttime;

    public int Id
    {
        get { return _Id; }
        set { _Id = value; }
    }

    public string Title
    {
        get { return _Title; }
        set { _Title = value; }
    }

    public string Content
    {
        get { return _Content; }
        set { _Content = value; }
    }

    public DateTime Posttime
    {
        get { return _Posttime; }
        set { _Posttime = value; }
    }
}&lt;/pre&gt;
&lt;pre class="brush:c#" style="overflow-x: auto;"&gt;public class NewsBll
{
    public List&lt;NewsModel&gt; GetModels()
    {
        List&lt;NewsModel&gt; list = new List()
        {
            new NewsModel(){ Id = 1, Content = "abcdef", Posttime = DateTime.Now, Title = "abc" },
            new NewsModel(){ Id = 2, Content = "zxcvbn", Posttime = DateTime.Now, Title = "def" },
            new NewsModel(){ Id = 3, Content = "qwerty", Posttime = DateTime.Now, Title = "ghi" },
            new NewsModel(){ Id = 4, Content = "pijpas", Posttime = DateTime.Now, Title = "jkl" },
            new NewsModel(){ Id = 5, Content = "geegwg", Posttime = DateTime.Now, Title = "mno" },
            new NewsModel(){ Id = 6, Content = "jiojio", Posttime = DateTime.Now, Title = "pqr" },
            new NewsModel(){ Id = 7, Content = "zpppaf", Posttime = DateTime.Now, Title = "stu" },
            new NewsModel(){ Id = 8, Content = "1pijqs", Posttime = DateTime.Now, Title = "vwx" },
            new NewsModel(){ Id = 9, Content = "1pijqs", Posttime = DateTime.Now, Title = "vwx" },
            new NewsModel(){ Id = 10, Content = "twetwte", Posttime = DateTime.Now, Title = "yza" },
            new NewsModel(){ Id = 11, Content = "qewqrzxf", Posttime = DateTime.Now, Title = "bcd" }
        };
        return list;
    }
}&lt;/pre&gt;
&lt;p&gt;ASP.NET页面代码（部分）：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&lt;h2&gt;
    ASP.NET泛型分页&lt;/h2&gt;
&lt;div&gt;
    &lt;h3&gt;
        Repeater控件分页Demo&lt;/h3&gt;
    &lt;ul&gt;
        &lt;asp:repeater id="rptnews" runat="server"&gt;
            &lt;itemtemplate&gt;
                &lt;li&gt;
                    &lt;%# ((Model.NewsModel)Container.DataItem).Id %&gt;,
                    &lt;%# ((Model.NewsModel)Container.DataItem).Title %&gt;,
                    &lt;%# ((Model.NewsModel)Container.DataItem).Content %&gt;,
                    &lt;%# ((Model.NewsModel)Container.DataItem).Posttime %&gt;&lt;/li&gt;
            &lt;/itemtemplate&gt;
        
    &lt;/asp:repeater id="rptnews" runat="server"&gt;&lt;/ul&gt;
    &lt;div&gt;
        &lt;asp:label id="lblpageinfo" runat="server" text="pagesize"&gt;
        &lt;asp:button id="btnfirstpage" runat="server" text="首页" onclick="btnfirstpage_click" &gt;
        &lt;asp:button id="btnprevious" runat="server" text="上一页" onclick="btnprevious_click" &gt;
        &lt;asp:label id="lblcurrentpage" runat="server" text="current"&gt;
        /
        &lt;asp:label id="lbltotalpage" runat="server" text="total"&gt;
        页
        &lt;asp:button id="btnnext" runat="server" text="下一页" onclick="btnnext_click" &gt;
        &lt;asp:button id="btnlastpage" runat="server" text="尾页" onclick="btnlastpage_click" &gt;
    &lt;/asp:button id="btnlastpage" runat="server" text="尾页" onclick="btnlastpage_click" &gt;&lt;/asp:button id="btnnext" runat="server" text="下一页" onclick="btnnext_click" &gt;&lt;/asp:label id="lbltotalpage" runat="server" text="total"&gt;&lt;/asp:label id="lblcurrentpage" runat="server" text="current"&gt;&lt;/asp:button id="btnprevious" runat="server" text="上一页" onclick="btnprevious_click" &gt;&lt;/asp:button id="btnfirstpage" runat="server" text="首页" onclick="btnfirstpage_click" &gt;&lt;/asp:label id="lblpageinfo" runat="server" text="pagesize"&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;ASP.NET后台代码：&lt;/p&gt;
&lt;pre class="brush:c#" style="overflow-x: auto;"&gt;using System;
using System.Collections.Generic;
using System.Web.UI;
using Common;

namespace Web
{
    public partial class _Default : System.Web.UI.Page
    {
        private static ListPager&lt;NewsModel&gt; lp = null;
        private static int currentIndex = 1;
        private static int pageSize = 5;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                BindRepeater(1, pageSize);
            }
        }

        private void BindRepeater(int index, int pageSize)
        {
            BLLDemo.NewsBll optNews = new BLLDemo.NewsBll();
            List&lt;NewsModel&gt; list = optNews.GetModels();

            lp = new ListPager&lt;NewsModel&gt;(list, index, pageSize);

            RptNews.DataSource = lp;
            RptNews.DataBind();

            BindPagerControls();
        }

        private void BindPagerControls()
        {
            // 判断上一页，下一页按钮是否启用.
            btnPrevious.Enabled = currentIndex != 1;
            btnNext.Enabled = currentIndex != lp.PageCount;

            lblCurrentPage.Text = lp.CurrentIndex.ToString();
            lblTotalPage.Text = lp.PageCount.ToString();
            lblPageInfo.Text = String.Format("共{0}条记录，每页显示{1}条", lp.TotalItem, lp.PageSize);
        }

        protected void btnPrevious_Click(object sender, EventArgs e)
        {
            --currentIndex;
            BindRepeater(currentIndex, pageSize);
            BindPagerControls();
        }

        protected void btnNext_Click(object sender, EventArgs e)
        {
            ++currentIndex;
            BindRepeater(currentIndex, pageSize);
            BindPagerControls();
        }

        protected void btnFirstPage_Click(object sender, EventArgs e)
        {
            currentIndex = 1; //修正为1，第一次发的时候写成0了，2B了～
            BindRepeater(currentIndex, pageSize);
        }

        protected void btnLastPage_Click(object sender, EventArgs e)
        {
            currentIndex = lp.PageCount;
            BindRepeater(currentIndex, pageSize);
        }
    }
}&lt;/pre&gt;
&lt;p&gt;转到[]页功能：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/zhuandao_201111131943377343.PNG" alt="" width="560" height="46" /&gt;&lt;/p&gt;
&lt;p&gt;ASPX代码：&lt;/p&gt;
&lt;pre class="brush: xml;fontsize: 100; first-line: 1; "&gt;&lt;asp:TextBox ID="txtGotoPage" runat="server" CssClass="textbox" Width="30px"&gt;&lt;/asp:TextBox&gt;
&lt;asp:Button ID="btnGotoPage" runat="server" Text="转到" CssClass="aspbtn" 
    onclick="btnGotoPage_Click" /&gt;&lt;/pre&gt;
&lt;p&gt;C#代码：（WYJ.Web.Utils为我的工具类，可以换成你自己的）&lt;/p&gt;
&lt;pre class="brush: csharp;fontsize: 100; first-line: 1; "&gt;protected void btnGotoPage_Click(object sender, EventArgs e)
{
    int pageIndex = 1;
    try
    {
        pageIndex = Convert.ToInt32(txtGotoPage.Text.Trim());
        if (pageIndex &lt; 1 || pageIndex &gt; lp.PageCount)
        {
            throw new Exception("页码范围不正确！");
        }
        else
        {
            currentIndex = pageIndex;
            ReadData(currentIndex, pageSize);
        }
    }
    catch (InvalidCastException)
    {
        WYJ.Web.Utils.MessageBox.Show(this, "页码必须是数字。");
    }
    catch (Exception ex)
    {
        WYJ.Web.Utils.MessageBox.Show(this, "错误：" + ex.Message);
    }
}&lt;/pre&gt;</description><pubDate>Sat, 22 Oct 2011 09:28:23 GMT</pubDate></item><item><title>C#数据结构之单链表LinkList</title><link>http://www.wyjexplorer.cn/Blog/View/44138569FF96F13E.html</link><description>&lt;p&gt;继续发数据结构系列～今天是单链表。&lt;/p&gt;&lt;p&gt;类图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110210708576250.jpg" height="461" width="395" /&gt;&lt;/p&gt;&lt;p&gt;接口的代码不重复发了。在前一篇&lt;a target="_self" href="http://www.wyjexplorer.cn/Blog/View/EA1AF82BACA12173.html"&gt;《C#数据结构之顺序表SqList》&lt;/a&gt;里有。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;节点类Node&lt;T&gt;：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;public class Node&lt;T&gt;
{
    private T _Data;
    private Node&lt;T&gt; _Next;

    public T Data
    {
        get { return _Data; }
        set { _Data = value; }
    }
    
    public Node&lt;T&gt; Next
    {
        get { return _Next; }
        set { _Next = value; }
    }

    public Node(T val, Node&lt;T&gt; p)
    {
        _Data = val;
        _Next = p;
    }

    public Node(Node&lt;T&gt; p)
    {
        _Next = p;
    }

    public Node(T val)
    {
        _Data = val;
        _Next = null;
    }

    public Node()
    {
        _Data = default(T);
        _Next = null;
    }
}&lt;/pre&gt;&lt;p&gt;单链表类LinkList&lt;T&gt;：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;public class LinkList&lt;T&gt; : IListDs&lt;T&gt;
{
    private Node&lt;T&gt; _Head;

    public Node&lt;T&gt; Head
    {
        get
        {
            return _Head;
        }
        set
        {
            _Head = value;
        }
    }

    public int Length
    {
        get
        {
            Node&lt;T&gt; p = _Head;
            int len = 0;
            while (p != null)
            {
                ++len;
                p = p.Next;
            }
            return len;
        }
    }

    public bool IsEmpty
    {
        get
        {
            if (_Head == null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    public LinkList()
    {
        _Head = null;
    }

    public void Clear()
    {
        _Head = null;
    }

    public void Append(T item)
    {
        Node&lt;T&gt; q = new Node&lt;T&gt;(item);
        Node&lt;T&gt; p = new Node&lt;T&gt;();
        if (_Head == null)
        {
            _Head = q;
            return;
        }
        p = _Head;
        while (p.Next != null)
        {
            p = p.Next;
        }
        p.Next = q;
    }

    public void Insert(T item, int i)
    {
        if (IsEmpty || i &lt; 1)
        {
            // List is empty or Position is error
            return;
        }
        if (i == 1)
        {
            Node&lt;T&gt; q = new Node&lt;T&gt;(item);
            q.Next = _Head;
            _Head = q;
            return;
        }
        Node&lt;T&gt; p = _Head;
        Node&lt;T&gt; r = new Node&lt;T&gt;();
        int j = 1;
        while (p.Next != null &amp;&amp; j &lt; i)
        {
            r = p;
            p = p.Next;
            ++j;
        }
        if (j == i)
        {
            Node&lt;T&gt; q = new Node&lt;T&gt;(item);
            q.Next = p;
            r.Next = q;
        }
    }

    public void InsertPost(T item, int i)
    {
        if (IsEmpty || i &lt; 1)
        {
            //List is empty or Position is error!
            return;
        }
        if (i == 1)
        {
            Node&lt;T&gt; q = new Node&lt;T&gt;(item);
            q.Next = _Head.Next;
            _Head.Next = q;
            return;
        }
        Node&lt;T&gt; p = _Head;
        int j = 1;
        while (p != null &amp;&amp; j &lt; i)
        {
            p = p.Next;
            ++j;
        }
        if (j == i)
        {
            Node&lt;T&gt; q = new Node&lt;T&gt;(item);
            q.Next = p.Next;
            p.Next = q;
        }
    }
    
    public T Delete(int i)
    {
        if (IsEmpty || i &lt; 0)
        {
            //Link is empty or Position is error!
            return default(T);
        }

        Node&lt;T&gt; q = new Node&lt;T&gt;();
        if (i == 1)
        {
            q = _Head;
            _Head = _Head.Next;
            return q.Data;
        }
        Node&lt;T&gt; p = _Head;
        int j = 1;
        while (p.Next != null &amp;&amp; j &lt; i)
        {
            ++j;
            q = p;
            p = p.Next;
        }
        if (j == i)
        {
            q.Next = p.Next;
            return p.Data;
        }
        else
        {
            //The ith node is not exist!
            return default(T);
        }
    }

    public T GetElement(int i)
    {
        // 转换为物理序位
        --i;

        if (IsEmpty)
        {
            //List is empty!
            return default(T);
        }
        Node&lt;T&gt; p = new Node&lt;T&gt;();
        p = _Head;
        int j = 0;
        while (p.Next != null &amp;&amp; j &lt; i)
        {
            ++j;
            p = p.Next;
        }
        if (j == i)
        {
            return p.Data;
        }
        else
        {
            //The ith node is not exist
            return default(T);
        }
    }

    public int Locate(T value)
    {
        if (IsEmpty)
        {
            //List is Empty!
            return -1;
        }
        Node&lt;T&gt; p = new Node&lt;T&gt;();
        p = _Head;
        int i = 1;
        while (!p.Data.Equals(value) &amp;&amp; p.Next != null)
        {
            p = p.Next;
            ++i;
        }
        return i;
    }
}&lt;/pre&gt;&lt;p&gt;测试代码：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;private static void LinkListTest()
{
    Console.WriteLine("LinkList Created:\n---------------------------------");
    LinkList&lt;string&gt; lkList = CreateLListHead(new string[] { "a", "b", "c", "d" });
    PrintLinkList(lkList);
    Console.WriteLine("\n");

    Console.WriteLine("Post Insert \"world\" into index 2:\n---------------------------------");
    lkList.InsertPost("world", 2);
    PrintLinkList(lkList);
    Console.WriteLine("\n");

    Console.WriteLine("Insert \"hello\" into index 2:\n---------------------------------");
    lkList.InsertPost("hello", 2);
    PrintLinkList(lkList);
    Console.WriteLine("\n");

    Console.WriteLine("Append \"e\":\n---------------------------------");
    lkList.Append("e");
    PrintLinkList(lkList);
    Console.WriteLine("\n");

    Console.WriteLine("Delete item on index 5:\n---------------------------------");
    lkList.Delete(5);
    PrintLinkList(lkList);
    Console.WriteLine("\n");

    Console.WriteLine("Locate item \"hello\":\n---------------------------------");
    Console.WriteLine("#{0}", lkList.Locate("hello"));
    Console.WriteLine();

    Console.WriteLine("Clear LinkList:\n---------------------------------");
    lkList.Clear();
    PrintLinkList(lkList);
    Console.WriteLine("\n");

    Console.ReadKey();
}

public static LinkList&lt;string&gt; CreateLListHead(string[] strs)
{
    LinkList&lt;string&gt; L = new LinkList&lt;string&gt;();
    foreach (var item in strs)
    {
        Node&lt;string&gt; p = new Node&lt;string&gt;(item);
        p.Next = L.Head;
        L.Head = p;
    }
    return L;
}&lt;/pre&gt;&lt;p&gt;有图有真相：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110210714173125.jpg" height="479" width="477" /&gt;&lt;br /&gt;&lt;/p&gt;</description><pubDate>Fri, 21 Oct 2011 07:15:40 GMT</pubDate></item><item><title>C#数据结构之顺序表SqList</title><link>http://www.wyjexplorer.cn/Blog/View/EA1AF82BACA12173.html</link><description>&lt;p&gt;最近在公司On Bench比较蛋疼，正好手头有本《C#数据结构》，拿来复习一下数据结构。以前大学里都是用C语言写的，C#从来没试过，毕竟C#本身就带有很多数据结构的Class可以直接拿来用。出于实验性目的，我还是看着书用C#写了几个demo。书上有些错误我也一并修正了。接下来发的代码都是经过测试可以正常运行的～&lt;/p&gt;&lt;p&gt;DAY1.顺序表&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110202051027812.jpg" height="458" width="321" /&gt;&lt;/p&gt;&lt;p&gt;最近博客系统有点BUG，代码中如果有三条杠注释就会排版混乱，所以抱歉这次不能带注释了。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;IListDs&lt;T&gt;接口：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;public interface IListDs&lt;T&gt;
{
    void Clear();
    void Append(T item);
    void Insert(T item, int i);
    T Delete(int i);
    T GetElement(int i);
    int Locate(T value);
}&lt;/pre&gt;&lt;p&gt;SqList&lt;T&gt;顺序表类：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;public class SqList&lt;T&gt; : IListDs&lt;T&gt;
{
    private int _MaxSize;
    private T[] _Data;
    private int _Last;

    public int MaxSize { get; set; }

    public T[] Data { get; set; }

    public int Last { get; set; }

    public T this[int index]
    {
        get
        {
            return _Data[index];
        }
        set
        {
            _Data[index] = value;
        }
    }

    public int Length
    {
        get { return this._Last + 1; }
    }

    public bool IsEmpty
    {
        get
        {
            if (this._Last == -1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    public bool IsFull
    {
        get
        {
            if (this._Last == this._MaxSize - 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    public SqList(int size)
    {
        this._Data = new T[size];
        this._MaxSize = size;
        this._Last = -1;
    }

    public void Clear()
    {
        this._Last = -1;
    }

    public void Append(T item)
    {
        if (IsFull)
        {
            // need error message?
            return;
        }
        this._Data[++this._Last] = item;
    }

    public void Insert(T item, int index)
    {
        if (IsFull)
        {
            // need error message?
            return;
        }
        if (index &lt; 1 || index &gt; this._Last + 2)
        {
            // position error
            return;
        }
        if (index == this._Last + 2)
        {
            this._Data[this._Last + 1] = item;
        }
        else
        {
            // 将插入位置后面的元素逐个向后移1位
            for (int j = index; j &lt;= this._Last + 1; j++)
            {
                this._Data[j] = this._Data[j - 1];
            }
            this._Data[index - 1] = item;
        }
        ++this._Last;
    }

    public T Delete(int index)
    {
        T temp = default(T);
        if (IsEmpty)
        {
            // need error message?
            return temp;
        }
        if (index &lt; 1 || index &gt; this._Last + 1)
        {
            // position error
            return temp;
        }
        if (index == this._Last + 1)
        {
            temp = this._Data[this._Last--];
        }
        else
        {
            // 将删除位后的元素逐个往前移1位
            temp = this._Data[index - 1];
            for (int j = index; j &lt;= this._Last; j++)
            {
                this._Data[j - 1] = this._Data[j];
            }
        }
        --this._Last;
        return temp;
    }

    public T GetElement(int index)
    {
        if (IsEmpty || index &lt; 1 || index &gt; this._Last + 1)
        {
            // empty or wrong position
            return default(T);
        }
        return this._Data[index - 1];
    }

    public int Locate(T value)
    {
        if (IsEmpty)
        {
            return -1;
        }

        int i = 0;
        for (i = 0; i &lt; this._Last; i++)
        {
            if (value.Equals(this._Data[i]))
            {
                break;
            }
        }

        if (i &gt; this._Last)
        {
            return -1;
        }

        // 返回逻辑序位（物理序位+1）
        return i + 1;
    }
}&lt;/pre&gt;&lt;p&gt;测试代码：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;private static void SqListTest()
{
    // 因为要插入元素，所以先得开辟够多的存储单元
    SqList&lt;string&gt; sq = new SqList&lt;string&gt;(10);
    sq.Append("Hello");
    sq.Append("World");
    sq.Append("ABC");
    Console.WriteLine("SeqList Created:\n---------------------------------");
    PrintSqList(sq);
    Console.WriteLine();

    Console.WriteLine("Insert \"123\" into index 3\n---------------------------------");
    // 在逻辑序位3处插入"123"，"!"后移。
    sq.Insert("123", 3);
    PrintSqList(sq);
    Console.WriteLine();

    Console.WriteLine("Delete Element on index 3\n---------------------------------");
    sq.Delete(3);
    PrintSqList(sq);
    Console.WriteLine();

    Console.WriteLine("Locate Element \"World\"\n---------------------------------");
    int index = sq.Locate("World");
    Console.WriteLine("Position: {0}", index);
    Console.WriteLine();

    Console.WriteLine("Get Element on index 1\n---------------------------------");
    Console.WriteLine("#1: {0}", sq.GetElement(1));
    Console.WriteLine();
    Console.ReadKey();
}

private static void PrintSqList(SqList&lt;string&gt; sq)
{
    for (int i = 0; i &lt; sq.Length; i++)
    {
        Console.Write("[{0}]", sq[i]);
        System.Threading.Thread.Sleep(300);
    }
    Console.WriteLine();
}&lt;/pre&gt;&lt;p&gt;有图有真相：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110202054302187.jpg" height="359" width="473" /&gt;&lt;br /&gt;&lt;/p&gt;</description><pubDate>Thu, 20 Oct 2011 20:54:38 GMT</pubDate></item><item><title>ASP.NET中URL重写和Session冲突的问题</title><link>http://www.wyjexplorer.cn/Blog/View/940F30CB6321E341.html</link><description>&lt;p&gt;今天在改博客系统的一个Bug的时候，程序里用了Session，结果一跑就报错：只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 
时，才能使用会话状态。还请确保在应用程序配置的 
&lt;configuration&gt;\&lt;system.web&gt;\&lt;httpModules&gt; 节中包括 
System.Web.SessionStateMod 或自定义会话状态模块。然而用VS自带的Web Server调试一点问题都没有。唯独在IIS下跑的时候老报错，错误语句就是那行用了Session的程序。唯一的区别就是VS下调试时，URL没有重写。于是我回到IIS上，用完整的URL试了下，果然木有问题。&lt;/p&gt;&lt;p&gt;我所使用的是URLRewriter.dll，似乎是当年微软提供的，经过一番查找，似乎有很多人和我有同样的问题，不管他们用的是不是URLRewriter.dll。&lt;/p&gt;&lt;p&gt;奇怪的是，并不是每个版本的IIS都会丢Session。我本机和网站服务器用的是IIS7，而且是集成模式的，比较奇葩，有很多config都要另外去写，这次也不例外，还是通过web.config解决问题：&lt;/p&gt;&lt;p&gt;在&lt;system.webServer&gt;\&lt;modules&gt;\下，添加：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:xml" _syntax="xml"&gt;&lt;remove name="Session" /&gt;
&lt;add name="HtmlSession" type="System.Web.SessionState.SessionStateModule"/&gt;&lt;/pre&gt;&lt;p&gt;丢Session的问题就解决了～&lt;br /&gt;&lt;/p&gt;</description><pubDate>Tue, 18 Oct 2011 22:13:22 GMT</pubDate></item><item><title>ASP.NET用控件连接Access2010数据库报错的解决方法</title><link>http://www.wyjexplorer.cn/Blog/View/C19AD93C0CC6E5D0.html</link><description>&lt;p&gt;今天想把网站的数据库换成2010（.accdb）格式的，但不知道主机服务商是否支持。于是想做个页面先测试一下。为了图方便，我用Access2010建立好测试用的数据库后，在VS里用拖DataSource控件的方法建了一个测试页面。VS里一切正常，可以识别数据库的内容。但网页一运行就报错：OleDbException (0x80004005): 不可识别的数据库格式。但通过编程的方式来指定provider就行。&lt;/p&gt;&lt;p&gt;经过一番研究发现，Access 2007或2010已经不能用AccessDataSource控件来连接了。必须使用SqlDataSource，但有些地方要做些改动：&lt;/p&gt;&lt;p&gt;1. 拖个SqlDataSource进来，然后选择配置数据源：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110172117259843.jpg" height="360" width="593" /&gt;&lt;/p&gt;&lt;p&gt;2.点击[新建连接]后，选择你的accdb数据库，数据源应该会自动适配为OLE DB。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110172117446250.jpg" height="460" width="399" /&gt;&lt;/p&gt;&lt;p&gt;3.选择高级，将Provider属性修改为Microsoft.ACE.OLEDB.12.0&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110172118386562.jpg" height="456" width="361" /&gt;&lt;/p&gt;&lt;p&gt;别忘了回头测试一下连接。&lt;/p&gt;&lt;p&gt;好了，现在就和以前一样可以绑定GridView等数据显示控件了。有图有真相：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110172120015625.jpg" height="209" width="341" /&gt;&lt;br /&gt;&lt;/p&gt;</description><pubDate>Mon, 17 Oct 2011 21:20:46 GMT</pubDate></item><item><title>数组删除重复元素，List&lt;T&gt;实现</title><link>http://www.wyjexplorer.cn/Blog/View/FABA6C80CE1E99F1.html</link><description>&lt;p&gt;这是个很老很无趣的话题，常见于C语言的作业题。其实严格意义上来说，用List泛型属于作弊了～，但过程非常简单，没有技术含量，主要是让大家看看C#的优雅。&lt;/p&gt;&lt;p&gt;我们知道，以前在C语言中要删除数组里的重复元素非常麻烦，要有两个游标（这意味着至少2层for嵌套），还要关心元素移位的问题。现在，如果把数组这样可以看作集合的东西放到集合类型里，比如List&lt;T&gt;泛型，事情就会容易的多：&lt;/p&gt;&lt;pre style="OVERFLOW-X: auto" class="brush:c#" _syntax="c#"&gt;static void Main(string[] args)
{
    List&lt;string&gt; strs = new List&lt;string&gt;() { "a", "b", "c", "c", "d", "c", "a", "e", "f", "b", "g", "h" };

    // 不能用foreach，因为迭代器是只读的
    for (int i = 0; i &lt; strs.Count; i++)
    {
        // 如果第一次出现的位置不等于最后一次出现的位置，则说明该元素不止出现一次
        if (strs.IndexOf(strs[i]) != strs.LastIndexOf(strs[i]))
        {
            strs.RemoveAt(strs.LastIndexOf(strs[i]));
        }
    }

    foreach (var item in strs)
    {
        Console.Write(item + " ");
    }
}&lt;/pre&gt;&lt;p&gt;有图有真相：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110171714097343.png" width="418" height="194" /&gt;&lt;/p&gt;</description><pubDate>Mon, 17 Oct 2011 17:14:33 GMT</pubDate></item><item><title>C#仿魔兽世界密保卡OOP重构版</title><link>http://www.wyjexplorer.cn/Blog/View/C4C574D3821F8AC4.html</link><description>&lt;p&gt;昨天下午我把《&lt;a target="_self" href="../Blog/Blog/View/A04E0FD918F45EE5.html"&gt;C#仿魔兽世界密保卡简单实现&lt;/a&gt;》
中的代码用面向对象的方法重构了一遍，引入了2个类：MatrixCard和Cell。MatrixCard描述的是密保卡，构造函数中会随机生成一个二
维矩阵，所以每次new一个MatrixCard对象，就已经生成了一张密保卡。Cell是单元格的意思，将行号、列号、列名做了封装。
MatrixCard类中保留了之前的大部分静态方法，以便灵活调用。&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110151456508750.jpg" height="506" width="539" /&gt;&lt;/p&gt;&lt;p&gt;由于本人水平有限，这次的设计并不是非常完美，并且也有一些遗憾。比如现在只能通过Cell[i]的方式来访问单元格，而不可以像Cell["A0"]这样写。有空的时候哥去研究一下重载索引器，争取把它实现。下面发代码：&lt;/p&gt;&lt;p&gt;MatrixCard类：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;using System;
using System.Collections.Generic;

namespace GeekStudio.Common
{
    /// &lt;summary&gt;
    /// 矩阵卡类
    /// &lt;/summary&gt;
    public class MatrixCard
    {
        private int _cardId;
        private int _randomStart;
        private int _randomEnd;
        private List&lt;Cell&gt; _cell;
 
        /// &lt;summary&gt;
        /// 卡号
        /// &lt;/summary&gt;
        public int CardId
        {
            get { return _cardId; }
            set { _cardId = value; }
        }

        /// &lt;summary&gt;
        /// 下界
        /// &lt;/summary&gt;
        public int RandomStart
        {
            get { return _randomStart; }
            set { _randomStart = value; }
        }

        /// &lt;summary&gt;
        /// 上界
        /// &lt;/summary&gt;
        public int RandomEnd
        {
            get { return _randomEnd; }
            set { _randomEnd = value; }
        }

        /// &lt;summary&gt;
        /// 单元格集合
        /// &lt;/summary&gt;
        public List&lt;Cell&gt; Cell
        {
            get { return _cell; }
            set { _cell = value; }
        }

        /// &lt;summary&gt;
        /// 保存到数据库
        /// &lt;/summary&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public bool Save()
        {
            string str = this.ToString();
            if (!String.IsNullOrEmpty(str))
            {
                try
                {
                    /* SAVE INTO DB */
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            return false;
        }

        /// &lt;summary&gt;
        /// 验证用户输入
        /// &lt;/summary&gt;
        /// &lt;param name="cellsToValidate"&gt;用户输入的Cell集合&lt;/param&gt;
        /// &lt;returns&gt;是否成功&lt;/returns&gt;
        public bool Validate(List&lt;Cell&gt; cellsToValidate)
        {
            if (cellsToValidate.Count &lt; 3)
            {
                return false;
            }

            int col1 = cellsToValidate[0].ColIndex;
            int row1 = cellsToValidate[0].RowIndex;

            int col2 = cellsToValidate[1].ColIndex;
            int row2 = cellsToValidate[1].RowIndex;

            int col3 = cellsToValidate[2].ColIndex;
            int row3 = cellsToValidate[2].RowIndex;

            int cellIndex1 = row1 * 5 + col1;
            int cellIndex2 = row2 * 5 + col2;
            int cellIndex3 = row3 * 5 + col3;

            bool OK1 = this.Cell[cellIndex1].Value == cellsToValidate[0].Value;
            bool OK2 = this.Cell[cellIndex2].Value == cellsToValidate[1].Value;
            bool OK3 = this.Cell[cellIndex3].Value == cellsToValidate[2].Value;

            if (OK1 &amp;&amp; OK2 &amp;&amp; OK3)
            {
                return true;
            }
            return false;
        }

        /// &lt;summary&gt;
        /// 随机选择单元格让用户验证
        /// &lt;/summary&gt;
        /// &lt;param name="howMany"&gt;单元格个数&lt;/param&gt;
        /// &lt;param name="colUpper"&gt;上界&lt;/param&gt;
        /// &lt;param name="rowUpper"&gt;下界&lt;/param&gt;
        /// &lt;returns&gt;Cell集合&lt;/returns&gt;
        public List&lt;Cell&gt; PickUpRandomCells(int howMany, int colUpper, int rowUpper)
        {
            Random r = new Random();
            List&lt;Cell&gt; cells = new List&lt;Cell&gt;();
            for (int i = 0; i &lt; howMany; i++)
            {
                int randomCol = r.Next(0, colUpper);
                int randomRow = r.Next(0, rowUpper);
                Cell c = new Cell(randomRow, randomCol);
                cells.Add(c);
            }
            return cells;
        }

        /// &lt;summary&gt;
        /// 重写ToString方法，将Cell集合输出为矩阵字符串
        /// &lt;/summary&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public override string ToString()
        {
            // 我希望MatrixCard.ToString()能输出 卡号、矩阵字符串，
            // 而MatrixCard.Cell.ToString()只输出矩阵字符串。
            // 如何实现？

            int[,] arr = ConvertCellListToMatrixArray(this.Cell);
            return ConvertMatrixArrayToString(arr);
        }

        /// &lt;summary&gt;
        /// 由字符串给Cell集合赋值
        /// &lt;/summary&gt;
        /// &lt;param name="strMatrix"&gt;矩阵字符串&lt;/param&gt;
        /// &lt;returns&gt;是否成功&lt;/returns&gt;
        public bool Fill(string strMatrix)
        {
            try
            {
                int[,] temparr = ConvertStringToMatrixArray(strMatrix);
                Fill(temparr);
                return true;
            }
            catch (Exception)
            {
                return false;
            }   
        }

        /// &lt;summary&gt;
        /// 由数组给Cell集合赋值
        /// &lt;/summary&gt;
        /// &lt;param name="array"&gt;矩阵数组&lt;/param&gt;
        /// &lt;returns&gt;是否成功&lt;/returns&gt;
        public bool Fill(int[,] array)
        {
            try
            {
                List&lt;Cell&gt; cells = ConvertMatrixArrayToCellList(array);
                this.Cell = cells;
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// &lt;summary&gt;
        /// 构造函数，随机生成一张5x5矩阵卡，数值范围[0,100)
        /// &lt;/summary&gt;
        public MatrixCard()
        {
            int[,] arr = GenerateRandomMatrix(5, 5, 0, 100);
            Fill(arr);
        }

        /// &lt;summary&gt;
        /// 构造函数，由字符串生成矩阵卡
        /// &lt;/summary&gt;
        /// &lt;param name="strMatrix"&gt;矩阵字符串&lt;/param&gt;
        public MatrixCard(string strMatrix)
        {
            Fill(strMatrix);
        }

        // -------------------------------静态方法--------------------------------
        #region Static Methods
        // ----------------------------死不要脸的分割线----------------------------

        /// &lt;summary&gt;
        /// 将矩阵数组转换为Cell集合(以便在MatrixCard对象中操作)
        /// &lt;/summary&gt;
        /// &lt;param name="array"&gt;矩阵数组&lt;/param&gt;
        /// &lt;returns&gt;Cell集合&lt;/returns&gt;
        public static List&lt;Cell&gt; ConvertMatrixArrayToCellList(int[,] array)
        {
            List&lt;Cell&gt; cells = new List&lt;Cell&gt;();
            int[] lineArr = new int[25];
            int k = 0;
            for (int i = 0; i &lt; 5; i++)
            {
                for (int j = 0; j &lt; 5; j++)
                {
                    lineArr[k] = array[i, j];
                    Cell c = new Cell(i, j);
                    c.Value = lineArr[k];
                    cells.Add(c);
                    k++;
                }
            }
            return cells;
        }

        /// &lt;summary&gt;
        /// 将Cell集合转换为矩阵数组
        /// &lt;/summary&gt;
        /// &lt;param name="cells"&gt;Cell集合&lt;/param&gt;
        /// &lt;returns&gt;矩阵数组&lt;/returns&gt;
        public static int[,] ConvertCellListToMatrixArray(List&lt;Cell&gt; cells)
        {
            int[,] arr = new int[5, 5];
            int k = 0;
            for (int i = 0; i &lt; 5; i++)
            {
                for (int j = 0; j &lt; 5; j++)
                {
                    arr[i, j] = cells[k].Value;
                    k++;
                }
            }
            return arr;
        }

        /// &lt;summary&gt;
        /// 生成随机矩阵
        /// &lt;/summary&gt;
        /// &lt;param name="rows"&gt;行数&lt;/param&gt;
        /// &lt;param name="cols"&gt;列数&lt;/param&gt;
        /// &lt;param name="randomStart"&gt;下界&lt;/param&gt;
        /// &lt;param name="randomEnd"&gt;上界&lt;/param&gt;
        /// &lt;returns&gt;矩阵数组&lt;/returns&gt;
        public static int[,] GenerateRandomMatrix(int rows, int cols, int randomStart, int randomEnd)
        {
            Random r = new Random();
            int[,] arr = new int[5, 5];
            // control rows
            for (int i = 0; i &lt; rows; i++)
            {
                // control cols
                for (int j = 0; j &lt; cols; j++)
                {
                    arr[i, j] = r.Next(randomStart, randomEnd);
                }
            }
            return arr;
        }

        /// &lt;summary&gt;
        /// 由矩阵字符串生成矩阵数组
        /// &lt;/summary&gt;
        /// &lt;param name="matrixStr"&gt;矩阵字符串&lt;/param&gt;
        /// &lt;returns&gt;矩阵数组&lt;/returns&gt;
        public static int[,] ConvertStringToMatrixArray(string matrixStr)
        {
            int[,] arr = new int[5, 5];
            int[] tempArr = new int[25];
            int k = 0;
            string[] tempArrStr = matrixStr.Split(',');
            for (int i = 0; i &lt; tempArr.Length; i++)
            {
                tempArr[i] = Convert.ToInt32(tempArrStr[i]);
            }
            for (int i = 0; i &lt; 5; i++)
            {
                for (int j = 0; j &lt; 5; j++)
                {
                    arr[i, j] = tempArr[k];
                    k++;
                }
            }
            return arr;
        }

        /// &lt;summary&gt;
        /// 将矩阵数组保存为矩阵字符串
        /// &lt;/summary&gt;
        /// &lt;param name="arr"&gt;矩阵数组&lt;/param&gt;
        /// &lt;returns&gt;矩阵字符串&lt;/returns&gt;
        public static string ConvertMatrixArrayToString(int[,] arr)
        {
            string matrixStr = String.Empty;
            int[] lineArr = new int[25];
            int k = 0;
            for (int i = 0; i &lt; 5; i++)
            {
                for (int j = 0; j &lt; 5; j++)
                {
                    lineArr[k] = arr[i, j];
                    k++;
                }
            }
            for (int i = 0; i &lt; lineArr.Length; i++)
            {
                matrixStr += lineArr[i];
                if (i &lt; 24)
                {
                    matrixStr += ",";
                }
            }
            return matrixStr;
        }

        /// &lt;summary&gt;
        /// 验证用户输入
        /// &lt;/summary&gt;
        /// &lt;param name="arr"&gt;矩阵数组&lt;/param&gt;
        /// &lt;param name="colIndex1"&gt;列号1&lt;/param&gt;
        /// &lt;param name="rowIndex1"&gt;行号1&lt;/param&gt;
        /// &lt;param name="colIndex2"&gt;列号2&lt;/param&gt;
        /// &lt;param name="rowIndex2"&gt;行号2&lt;/param&gt;
        /// &lt;param name="colIndex3"&gt;列号3&lt;/param&gt;
        /// &lt;param name="rowIndex3"&gt;行号3&lt;/param&gt;
        /// &lt;param name="userInput"&gt;用户输入的字符串&lt;/param&gt;
        /// &lt;returns&gt;是否成功&lt;/returns&gt;
        public static bool Validate(int[,] arr, int colIndex1, int rowIndex1, int colIndex2, int rowIndex2, int colIndex3, int rowIndex3, string userInput)
        {
            try
            {
                string[] inputArr = userInput.Split(',');

                bool OK0 = arr[rowIndex1, colIndex1] == Convert.ToInt32(inputArr[0]);
                bool OK1 = arr[rowIndex2, colIndex2] == Convert.ToInt32(inputArr[1]);
                bool OK2 = arr[rowIndex3, colIndex3] == Convert.ToInt32(inputArr[2]);

                if (OK0 &amp;&amp; OK1 &amp;&amp; OK2)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                Console.WriteLine("Oh, Shit!");
            }
            return false;
        }

        #endregion
    }
}
&lt;/pre&gt;&lt;p&gt;Cell类：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;namespace GeekStudio.Common
{
    /// &lt;summary&gt;
    /// 单元格类
    /// &lt;/summary&gt;
    public class Cell
    {
        private int _rowIndex;
        private int _colIndex;
        private ColCodeEnum _colCode;
        private int _value;

        /// &lt;summary&gt;
        /// 行号
        /// &lt;/summary&gt;
        public int RowIndex
        {
            get { return _rowIndex; }
            set { _rowIndex = value; }
        }
        
        /// &lt;summary&gt;
        /// 列号
        /// &lt;/summary&gt;
        public int ColIndex
        {
            get { return _colIndex; }
            set { _colIndex = value; }
        }

        /// &lt;summary&gt;
        /// 列名
        /// &lt;/summary&gt;
        public ColCodeEnum ColCode
        {
            get { return _colCode; }
            set { _colCode = value; }
        }
        
        /// &lt;summary&gt;
        /// 值
        /// &lt;/summary&gt;
        public int Value
        {
            get { return _value; }
            set { _value = value; }
        }

        /// &lt;summary&gt;
        /// 列名枚举
        /// &lt;/summary&gt;
        public enum ColCodeEnum
        {
            A = 0,
            B = 1,
            C = 2,
            D = 3,
            E = 4
        };

        public Cell()
        {
            this._value = 0;
        }

        public Cell(int rowIndex, int colIndex)
        {
            this._rowIndex = rowIndex;
            this._colIndex = colIndex;
            this._colCode = GetColCode(colIndex);
            this._value = 0;
        }

        public Cell(int rowIndex, ColCodeEnum colCode)
        {
            this._rowIndex = rowIndex;
            this._colIndex = GetColIndex(colCode);
            this._colCode = colCode;
            this._value = 0;
        }

        /// &lt;summary&gt;
        /// 根据列名获取列号
        /// &lt;/summary&gt;
        /// &lt;param name="colCode"&gt;列名&lt;/param&gt;
        /// &lt;returns&gt;列号&lt;/returns&gt;
        public static int GetColIndex(ColCodeEnum colCode)
        {
            return (int)colCode;
        }

        /// &lt;summary&gt;
        /// 根据列号获取列名
        /// &lt;/summary&gt;
        /// &lt;param name="colIndex"&gt;列号&lt;/param&gt;
        /// &lt;returns&gt;列名&lt;/returns&gt;
        public static ColCodeEnum GetColCode(int colIndex)
        {
            ColCodeEnum colCode = ColCodeEnum.A;
            switch (colIndex)
            {
                case 0:
                    colCode = ColCodeEnum.A;
                    break;
                case 1:
                    colCode = ColCodeEnum.B;
                    break;
                case 2:
                    colCode = ColCodeEnum.C;
                    break;
                case 3:
                    colCode = ColCodeEnum.D;
                    break;
                case 4:
                    colCode = ColCodeEnum.E;
                    break;
                default:
                    break;
            }
            return colCode;
        }
    }
}
&lt;/pre&gt;&lt;p&gt;ASP.NET调用：&lt;/p&gt;&lt;pre style="overflow-x: auto;" class="brush:c#" _syntax="c#"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using GeekStudio.Common;
using System.Text;

public partial class MatrixCardTest : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            MatrixCard mc = new MatrixCard();
            StringBuilder sb = PrintMatrixToHtmlTable(mc);
            ltrMatrixCard.Text = sb.ToString();
            Session["mc"] = mc;

            // 随机选择3个单元格给用户验证
            List&lt;Cell&gt; cellsToValidate = mc.PickUpRandomCells(3, 5, 5);
            lblCellText = String.Format("{0}{1}", cellsToValidate[0].ColCode, cellsToValidate[0].RowIndex);
            lblCellText = String.Format("{0}{1}", cellsToValidate[1].ColCode, cellsToValidate[1].RowIndex);
            lblCellText = String.Format("{0}{1}", cellsToValidate[2].ColCode, cellsToValidate[2].RowIndex);

            Session["cellsToValidate"] = cellsToValidate;
        }
    }

    private static StringBuilder PrintMatrixToHtmlTable(MatrixCard mc)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("&lt;table style=\"width: 400px;\"&gt;");
        sb.Append("&lt;tr&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;/tr&gt;");
        int i = 0;
        for (int k = 0; k &lt; 5; k++)
        {
            sb.Append("&lt;tr&gt;");
            sb.Append(String.Format("&lt;td&gt;{0}&lt;/td&gt;", k));
            for (int l = 0; l &lt; 5; l++)
            {
                sb.Append(String.Format("&lt;td&gt;{0}&lt;/td&gt;", mc.Cell[i].Value));
                i++;
            }
            sb.Append("&lt;/tr&gt;");
        }
        sb.Append("&lt;/table&gt;");
        return sb;
    }

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        MatrixCard mc = null;
        if (Session["mc"] !=  null)
        {
            mc = (MatrixCard)Session["mc"];
        }
        List&lt;Cell&gt; cellsToValidate = null;
        if (Session["cellsToValidate"] !=  null)
        {
            cellsToValidate = (List&lt;Cell&gt;)Session["cellsToValidate"];
        }

        cellsToValidate[0].Value = Convert.ToInt32(txtCellText.Trim());
        cellsToValidate[1].Value = Convert.ToInt32(txtCellText.Trim());
        cellsToValidate[2].Value = Convert.ToInt32(txtCellText.Trim());

        bool OK = mc.Validate(cellsToValidate);

        if (OK)
        {
            lblStatus.Text = "Your input were correct!";
        }
        else
        {
            lblStatus.Text = "Sorry, your input were wrong!";
        }
    }
}&lt;/pre&gt;&lt;p&gt;有图有真相：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110151458132656.jpg" height="397" width="362" /&gt;&lt;br /&gt;&lt;/p&gt;</description><pubDate>Sat, 15 Oct 2011 14:58:18 GMT</pubDate></item><item><title>C#仿魔兽世界密保卡简单实现</title><link>http://www.wyjexplorer.cn/Blog/View/A04E0FD918F45EE5.html</link><description>&lt;p&gt;昨天拿C#写了个简单的密保卡程序（Console的，偷懒了一下 哈哈），实现了随机生成5x5矩阵卡、转换为字符串、从字符串读取矩阵卡以及简单验证的功能。不过我写的比较草率，代码结构不是很好，也没有体现OOP的思想，这几天有空会重构一下。&lt;/p&gt;&lt;p&gt;先把代码发出来：&lt;/p&gt;&lt;pre style="OVERFLOW-X: auto" class="brush: csharp"&gt;public class MatrixCardManager 
    { 
        public static int[,] ReadMatrixCardFromString(string matrixStr) 
        { 
            int[,] arr1 = new int[5, 5]; 
            int[] tempArr = new int[25]; 
            int k = 0; 
            string[] tempArrStr = matrixStr.Split(','); 
            for (int i = 0; i &lt; tempArr.Length; i++) 
            { 
                tempArr[i] = Convert.ToInt32(tempArrStr[i]); 
            } 
            for (int i = 0; i &lt; 5; i++) 
            { 
                for (int j = 0; j &lt; 5; j++) 
                { 
                    arr1[i, j] = tempArr[k]; 
                    k++; 
                } 
            } 
            return arr1; 
        } 
 
        public static string SaveMatrixIntoString(int[,] arr) 
        { 
            string matrixStr = String.Empty; 
            int[] lineArr = new int[25]; 
            int k = 0; 
            for (int i = 0; i &lt; 5; i++) 
            { 
                for (int j = 0; j &lt; 5; j++) 
                { 
                    lineArr[k] = arr[i, j]; 
                    k++; 
                } 
            } 
            for (int i = 0; i &lt; lineArr.Length; i++) 
            { 
                matrixStr += lineArr[i]; 
                if (i &lt; 24) 
                { 
                    matrixStr += ","; 
                } 
            } 
            return matrixStr; 
        } 
 
        public static void PrintMatrix(int[,] arr) 
        { 
            Console.WriteLine("  | A\tB\tC\tD\tE"); 
            Console.WriteLine("-------------------------------------------"); 
            for (int k = 0; k &lt; 5; k++) 
            { 
                Console.Write(k + " | "); 
                for (int l = 0; l &lt; 5; l++) 
                { 
                    Console.Write(arr[k, l] + "\t"); 
                } 
                Console.WriteLine(); 
            } 
        } 
 
        public static int[,] GenerateRandomMatrix() 
        { 
            Random r = new Random(); 
            int[,] arr = new int[5, 5]; 
            for (int i = 0; i &lt; 5; i++) 
            { 
                for (int j = 0; j &lt; 5; j++) 
                { 
                    arr[i, j] = r.Next(0, 100); 
                } 
            } 
            return arr; 
        } 
 
        public static char GetColCode(int colIndex) 
        { 
            char colCode = '-'; 
            switch (colIndex) 
            { 
                case 0: 
                    colCode = 'A'; 
                    break; 
                case 1: 
                    colCode = 'B'; 
                    break; 
                case 2: 
                    colCode = 'C'; 
                    break; 
                case 3: 
                    colCode = 'D'; 
                    break; 
                case 4: 
                    colCode = 'E'; 
                    break; 
                default: 
                    break; 
            } 
            return colCode; 
        } 
 
        public static bool Validate(int[,] arr, int colIndex1, int rowIndex1, int colIndex2, int rowIndex2, int colIndex3, int rowIndex3, string userInput, bool validFlag) 
        { 
            try 
            { 
                string[] inputArr = userInput.Split(','); 
 
                bool OK0 = arr[rowIndex1, colIndex1] == Convert.ToInt32(inputArr[0]); 
                bool OK1 = arr[rowIndex2, colIndex2] == Convert.ToInt32(inputArr[1]); 
                bool OK2 = arr[rowIndex3, colIndex3] == Convert.ToInt32(inputArr[2]); 
 
                if (OK0 &amp;&amp; OK1 &amp;&amp; OK2) 
                { 
                    validFlag = true; 
                } 
                else 
                { 
                    validFlag = false; 
                } 
            } 
            catch (Exception) 
            { 
                Console.WriteLine("Oh, Shit!"); 
            } 
            return validFlag; 
        } 
    }&lt;/pre&gt;&lt;p&gt;调用：&lt;/p&gt;&lt;pre style="OVERFLOW-X: auto" class="brush: csharp"&gt;static void Main(string[] args) 
        { 
            Console.WriteLine("Generate and Print Matrix Card:\n"); 
            int[,] arr = MatrixCardManager.GenerateRandomMatrix(); 
            MatrixCardManager.PrintMatrix(arr); 
            Console.WriteLine("\n"); 
 
            Console.WriteLine("Save Matrix Card into string for storage:\n"); 
            string matrixStr = MatrixCardManager.SaveMatrixIntoString(arr); 
            Console.WriteLine(matrixStr); 
            Console.WriteLine("\n"); 
 
            Console.WriteLine("Read Matrix Card from string:\n"); 
            int[,] arr1 = MatrixCardManager.ReadMatrixCardFromString(matrixStr); 
            MatrixCardManager.PrintMatrix(arr1); 
            Console.WriteLine("\n"); 
 
            Console.WriteLine("Matrix Card Validation:\n"); 
            Random r = new Random(); 
 
            int colIndex1 = r.Next(0, 4); 
            int rowIndex1 = r.Next(0, 4); 
            char colCode1 = MatrixCardManager.GetColCode(colIndex1); 
 
            int colIndex2 = r.Next(0, 4); 
            int rowIndex2 = r.Next(0, 4); 
            char colCode2 = MatrixCardManager.GetColCode(colIndex2); 
 
            int colIndex3 = r.Next(0, 4); 
            int rowIndex3 = r.Next(0, 4); 
            char colCode3 = MatrixCardManager.GetColCode(colIndex3); 
 
            Console.WriteLine("Please Input Card Number At {0}{1},{2}{3},{4}{5}:\n", colCode1, rowIndex1, colCode2, rowIndex2, colCode3, rowIndex3); 
 
            string userInput = Console.ReadLine(); 
 
            bool validFlag = false; 
            validFlag = MatrixCardManager.Validate(arr, colIndex1, rowIndex1, colIndex2, rowIndex2, colIndex3, rowIndex3, userInput, validFlag); 
            if (validFlag) 
            { 
                Console.WriteLine("All input are correct!"); 
            } 
            else 
            { 
                Console.WriteLine("Sorry, your input were wrong!"); 
            } 
            Console.ReadKey(); 
        }&lt;/pre&gt;&lt;p&gt;效果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.wyjexplorer.cn/Uploads/201110140922396406.png" height="451" width="630" /&gt;&lt;/p&gt;</description><pubDate>Fri, 14 Oct 2011 09:23:39 GMT</pubDate></item><item><title>微软BUILD大会使用的PPT模板下载</title><link>http://www.wyjexplorer.cn/Blog/View/207A506D806E62A3.html</link><description>&lt;p&gt;相信很多人都喜欢BUILD大会的PPT模板，很符合Windows8的2D Metro风格。但我在网上找了很久都没有哪个地方提供官方的下载。&lt;/p&gt;&lt;p&gt;于是只能从Channel9上面下载了一份BUILD的PPT，然后把模板提取出来。今天发上来给大家下载～&lt;/p&gt;&lt;p&gt;有图有真相：&lt;/p&gt;&lt;p&gt;&lt;img style="width: 714px; height: 485px;" src="http://www.wyjexplorer.cn/Uploads/201110011956105781.jpg" /&gt;&lt;/p&gt;&lt;p&gt;注意，应用模板的时候首页可能是蓝色的那个。没关系，点右键，在“版式”里面会有很多选择～&lt;br /&gt;&lt;/p&gt;</description><pubDate>Sat, 01 Oct 2011 19:57:36 GMT</pubDate></item><item><title>可以打开魔兽世界大灾变MPQ的最新版MPQEditor</title><link>http://www.wyjexplorer.cn/Blog/View/B227E8AA094B2670.html</link><description>&lt;p&gt;以前提取游戏音乐的时候一直用的是MPQ Editor 2.0，一直到WLK的版本都是能用的。最近想用同样的方法提取几首CTM的音乐时，打开文件一直失败，提示错误代码50。无奈，去网上找了MPQMaster（据说是暴雪自家的）也不行。&lt;/p&gt;&lt;p&gt;后来在MPQ Editor2.0的关于对话框里找到了官方网站，下载了最新的3.2.2，试了下，可以打开国服《魔兽世界：大地的裂变》4.1版的MPQ文件了。不过现在还是只有英文版。&lt;/p&gt;&lt;p&gt;下载地址：&lt;a href="http://www.zezula.net/download/mpqediten32.zip"&gt;MPQ Editor&lt;/a&gt;v 3.2.2.654 (32-bit, english, 493 KB)&lt;/p&gt;&lt;p&gt;如果你的系统是64位，就下载这个：&lt;a href="http://www.zezula.net/download/mpqediten64.zip"&gt;MPQ Editor&lt;/a&gt;v 3.2.2.654 (64-bit, english, 523 KB)&lt;/p&gt;&lt;p&gt;有图有真相：&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201109172139153008.jpg" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201109172139232617.jpg" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;第一次打开会让你调整设置，记得选上“Open MPQs in read-only mode”，即只读打开，以免误操作修改了游戏文件导致无法验证版本。&lt;br /&gt;&lt;/p&gt;</description><pubDate>Sat, 17 Sep 2011 21:41:32 GMT</pubDate></item><item><title>字符串MD5,SHA1,AES,DES计算器</title><link>http://www.wyjexplorer.cn/Blog/View/131277DBA084C901.html</link><description>&lt;p&gt;再补发一个以前的东西：&lt;/p&gt;
&lt;p&gt;程序猿经常需要计算字符串的HASH值，比如MD5、SHA1，以及AES,DES等加密。无奈网上没有找到喜欢的版本，很多都是计算文件的，没有针对字符串的计算器，要不就是在线的（以后我的网站也会推出这个在线应用），总之是没有让我满意的本地应用程序。所以只好自己拿C#写了一个很简单的字符串HASH计算器，能够满足一般的计算需要。注意：此软件需要安装.NET Framework 2.0。&lt;/p&gt;
&lt;p&gt;有图有真相：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/20110104171739408.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;2012.2.5 已根据网友反馈修正了MD5计算的BUG&lt;/p&gt;</description><pubDate>Sat, 10 Sep 2011 20:10:38 GMT</pubDate></item><item><title>用Web.Config保存设置导致网站不定时重启的问题</title><link>http://www.wyjexplorer.cn/Blog/View/C7C64BACA9426252.html</link><description>&lt;p&gt;前几天写了篇&lt;a href="/Blog/View/11D99ADD33678D4B.html"&gt;ASP.NET读写Web.Config&lt;/a&gt;，之后我确实用了文中的方法，重写了我网站的配置模块。结果上线之后，却发现网站时不时地重启，非常诡异。&lt;/p&gt;&lt;p&gt;研究之后，我发现只要是对Web.Config做修改，就会使IIS重启网站，它不是立即重启的，似乎和GC一样有个阀值。然而我的设置必须保存在Web.Config中，这可肿么办？经过一番Google，终于找到了解决方案，现在似乎已经修复网站重启的问题了。&lt;/p&gt;&lt;p&gt;方法是，把Web.Config的appSettings节点里的配置信息写到另一个文件中，然后设置appSetting节点的configSource属性，指向那个config文件即可。&lt;/p&gt;&lt;p&gt;具体写法如下（摘自原作者博客）：&lt;/p&gt;&lt;p&gt;Web.config中appSettings节有个属性：&lt;strong&gt;configSource&lt;/strong&gt;，这个属性可以指定一个存储appSettings的外部文件路径（只支持相对路径），而这个外部文件的修改是不会引起页面的重新编译的，同时它的改动也能立即被ASP.NET运行库检测到。可谓一举两得。
&lt;/p&gt;&lt;p&gt;Web.config中的appSettings的配置：&lt;span style="color: #0000ff;"&gt;&lt;br&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;div class="cnblogs_code"&gt;&lt;img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top"&gt;&lt;span style="color: #0000ff;"&gt;&lt;?&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;xml version="1.0" encoding="utf-8"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;?&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br&gt;
&lt;img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br&gt;
&lt;img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;appSettings &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;configSource&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Settings\WebAppSettings.config"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br&gt;
&lt;img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
外部文件Settings\WebAppSettings.config的内容：&lt;/p&gt;
&lt;div class="cnblogs_code"&gt;&lt;img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top"&gt;&lt;span style="color: #0000ff;"&gt;&lt;?&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;xml version="1.0" encoding="utf-8"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;?&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br&gt;
&lt;img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;appSettings&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br&gt;
&lt;img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;add &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;key&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="SMTPServerAddress"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="0.0.0.0"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br&gt;
&lt;img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;appSettings&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&gt;&lt;/span&gt;&lt;/div&gt;


</description><pubDate>Sun, 04 Sep 2011 22:40:06 GMT</pubDate></item><item><title>开机启动项管理器（附C#源代码）</title><link>http://www.wyjexplorer.cn/Blog/View/ACC9D6389EE5310F.html</link><description>&lt;p&gt;再发一个以前的东西。&lt;br&gt;&lt;/p&gt;&lt;p&gt;很简单的一个可以管理开机启动项的小程序,作为C#的一个Winform编程范例送给大家。包含了对注册表的读取及修改操作，适合新手入门。&lt;/p&gt;&lt;p&gt;*.需要.NET Framework 2.0才能运行。&lt;/p&gt;
&lt;img src="/uploads/20110125175251487.png"&gt;</description><pubDate>Sun, 04 Sep 2011 15:06:03 GMT</pubDate></item><item><title>文件日期修改器</title><link>http://www.wyjexplorer.cn/Blog/View/4BE6D6060B84E8EA.html</link><description>&lt;p&gt;前不久玩C#练手的时候写的一个很猥琐的小程序。可以修改文件的创建时间、修改时间，以及访问时间。绝对是杀人灭口，伪造证据，必备良药。本程序非常小儿科，没有什么技术含量。当作学习C#的Demo来发。源代码可以在这里下载：&lt;/p&gt;
&lt;p&gt;&lt;a href="/BlogAttachment/FilePropertyModifier_Source.rar" target="_blank"&gt;传送门：源代码&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/201109031932013836.png" alt="" /&gt;&lt;/p&gt;</description><pubDate>Sat, 03 Sep 2011 19:37:06 GMT</pubDate></item><item><title>硬盘整数分区计算器C#版(含源代码)</title><link>http://www.wyjexplorer.cn/Blog/View/961258C6BD3FB142.html</link><description>&lt;p&gt;还是重发以前的东西&lt;/p&gt;
&lt;p&gt;刚才在MC上看到篇文章，上面有一个差不多的计算器，不知道是什么语言写的，还不肯公开源码，连个公式都不给，太小气了～～只能我自己写了。正好最近学习C#就拿来练练手～&lt;/p&gt;
&lt;p&gt;一般我们分区，都拿GBx1024或GBx1000，结果在资源管理器或磁盘管理中，经常看到19.98G这样的数值，非常不美观。用这个软件计 算后，分出来的区保证能以整数显示！计算公式来源于网络，这只是一个C#练手作品～～&lt;/p&gt;
&lt;p&gt;*本软件基于.NET编写，请先安装.NET Framework2.0！&lt;/p&gt;</description><pubDate>Sat, 03 Sep 2011 19:29:28 GMT</pubDate></item><item><title>硬件仿真软件DSCH2汪宇杰汉化版</title><link>http://www.wyjexplorer.cn/Blog/View/1229D1AE6A833795.html</link><description>&lt;p&gt;重发以前的东西。&lt;/p&gt;&lt;p&gt;这个是上硬件设计课的时候用的软件，原版是英文的，非常不爽。于是自己简单汉化了一下。效果如下，有图有真相。&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100520163434480.png"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100520163458625.png"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100520163510215.png"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100520163523764.png"&gt;&lt;/p&gt;&lt;p&gt;PS: 原先本站使用的uushare空间马上就要关闭了，12月以后所有以往作品的链接都将失效。最近正在迁移数据到DBank，不稳定的时候还请大家谅解。如果实在需要下载我的东西，可以直接向我发Email索取。&lt;/p&gt;</description><pubDate>Sat, 03 Sep 2011 19:24:11 GMT</pubDate></item><item><title>ASP.NET读写Web.Config</title><link>http://www.wyjexplorer.cn/Blog/View/11D99ADD33678D4B.html</link><description>&lt;p&gt;先说下，我写的很多技术类文章都是面向初学者的，为了便于他们理解，我会写的尽量详细，包括很多最基础的操作步骤，并且有些说法可能不太严谨，高手请勿追究。如果写的太专业，不仅没人看我的博客，我还会被喷装B。请高手们原谅。&lt;br&gt;&lt;/p&gt;&lt;p&gt;以前我做网站设置模块的时候，总喜欢把设置都写在一个xml文件里，然后用程序去读写这个xml文件。虽然.NET对XML的支持很好（现在有Linq To XML了），并且我也使用了一个XML工具类，但总体来说，自己手动读写一个xml文件，还是有点蛋疼的。一不小心就容易出错。&lt;/p&gt;&lt;p&gt;今天我突然想到，我们曾经无数次在Web.Config里读取过连接字符串，那么为何不把网站的设置信息也保存在Web.Config中呢？只要使用System.Configuration下的ConfigurationManager类就可以操作Web.Config了，微软都给我们封装好了！&lt;/p&gt;&lt;p&gt;为了验证这一点的可行性，我写了一个非常简单的Test Demo：&lt;/p&gt;&lt;p&gt;首先，在Web.Config的appSettings节点下，创建一个TestNode，并让它的初值为10。写法是：&lt;add key="TestNode" value="10"/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201109012023416888.png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;然后，创建我们的Test.aspx页面，拖一个label，一个TextBox，2个Button：&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201109012024158619.png"&gt;&lt;/p&gt;&lt;p&gt;后台代码这样写，注意保存config的写法。另外，不要忘记using System.Configuration：&lt;/p&gt;

&lt;pre class="brush: c-sharp"&gt;using System;
using System.Configuration;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = ConfigurationManager.AppSettings["TestNode"].ToString();
    }
    
    // 9月4日修正：正确的保存方法
    protected void Button2_Click(object sender, EventArgs e)
    {
        Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(System.Web.HttpContext.Current.Request.ApplicationPath);
        AppSettingsSection appSection = (AppSettingsSection)config.GetSection("appSettings");
        appSection.Settings["TestNode"].Value = TextBox1.Text;
        config.Save();
    }
}
&lt;/pre&gt;

&lt;p&gt;然后运行测试一下，发现我们既可以Get，又可以Set那个TestNode的Value。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201109012030498827.png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201109012030564265.png"&gt;&lt;/p&gt;&lt;p&gt;注意，&lt;font color="#FF0000"&gt;&lt;b&gt;如果SET里直接写 ConfigurationManager.AppSettings["TestNode"] = "值"; 是错误的&lt;/b&gt;&lt;/font&gt;，虽然网页上可以看到结果，但其实这种修改并没有写入config文件。正确的写法已经在上面的代码中修正。&lt;br&gt;&lt;/p&gt;</description><pubDate>Fri, 02 Sep 2011 21:39:44 GMT</pubDate></item><item><title>每个程序员都必须遵守的编程原则</title><link>http://www.wyjexplorer.cn/Blog/View/147B0144EA1F3BFC.html</link><description>&lt;P&gt;新闻来源:PHP100&lt;/P&gt;
&lt;P&gt;好的编程原则跟好的系统设计原则和技术实施原则有着密切的联系。下面的这些编程原则在过去的这些年里让我成为了一名优秀的程序员，我相信，这些原则对任何一个开发人员来说，都能让他的编程能力大幅度的提高，能让他开发出可维护性更强、缺陷更少的程序。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;我不要自我重复&lt;/STRONG&gt; — 这也许是在编程开发这最最基本的一个信条，就是要告诉你不要出现重复的代码。我们很多的编程结构之所以存在，就是为了帮助我们消除重复(例如，循环语句， 函数，类，等等)。一旦程序里开始有重复现象的出现(例如很长的表达式、一大堆的语句，但都是为了表达相同的概念)，你就需要对代码进行一次新的提炼，抽象。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;http://en.wikipedia.org/wiki/Don%27t_repeat_yourself&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;提炼原则&lt;/STRONG&gt; — 跟“不要自我重复原则”相关，这一原则是说“程序中任何一段具有功能性的代码在源代码文件中应该唯一的存在。”&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Abstraction_principle_(programming)"&gt;http://en.wikipedia.org/wiki/Abstraction_principle_(programming)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;保持简单&lt;/STRONG&gt; — 简单化(避免复杂)永远都应该是你的头等目标。简单的程序让你写起来容易，产生的bug更少，更容易维护修改。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/KISS_principle"&gt;http://en.wikipedia.org/wiki/KISS_principle&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;不要开发你目前用不到的功能&lt;/STRONG&gt; — 除非你真正需要用到它，否则不要轻易加上那些乱七八糟用不到的功能。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/YAGNI"&gt;http://en.wikipedia.org/wiki/YAGNI&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;用最简单的方法让程序跑起来&lt;/STRONG&gt; — 在开发时有个非常好的问题你需要问问自己，“怎样才能最简单的让程序跑起来?”这能帮助我们在设计时让程序保持简单。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html"&gt;http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;不要让我动脑子&lt;/STRONG&gt; — 这实际上是Steve Krug 关于web界面操作的一本书的书名，但也适用于编程。主旨是，程序代码应该让人们花最小的努力就能读懂和理解。如果一段程序对于阅读者来说需要花费太多的努力才能理解，那它很可能需要进一步简化。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.sensible.com/dmmt.html"&gt;http://www.sensible.com/dmmt.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;开放/封闭原则&lt;/STRONG&gt; — 程序里的实体项(类，模块，函数等)应该对扩展行为开放，对修改行为关闭。换句话说，不要写允许别人修改的类，应该写能让人们扩展的类。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Open_Closed_Principle"&gt;http://en.wikipedia.org/wiki/Open_Closed_Principle&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;为维护者写程序&lt;/STRONG&gt; — 任何值得你编写的程序在将来都是值得你去维护的，也许由你维护，也许由他人。在将来，当你不得不维护这些程序时，你对这些代码的记忆会基本上跟一个陌生人 一样，所以，你最好还是当成一直在给别人写程序。一个有助于你记住这个原则的办法是“写程序时时刻记着，这个将来要维护你写的程序的人是一个有严重暴力倾 向，并且知道你住在哪里的精神变态者”。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://c2.com/cgi/wiki?CodeForTheMaintainer"&gt;http://c2.com/cgi/wiki?CodeForTheMaintainer&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;最少意外原则&lt;/STRONG&gt; — 最少意外原则通常是使用在用户界面设计上，但这个原则同样适用于编写程序。程序代码应尽可能的不要让阅读者感到意外。也就是说应该遵循编码规范和常见习惯，按照公认的习惯方式进行组织和命名，不符常规的编程动作应该尽可能的避免。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Principle_of_least_astonishment"&gt;http://en.wikipedia.org/wiki/Principle_of_least_astonishment&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;单一职责原则&lt;/STRONG&gt; — 一个代码组件(例如类或函数)应该只执行单一的预设的任务。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;http://en.wikipedia.org/wiki/Single_responsibility_principle&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;最小化耦合关系&lt;/STRONG&gt; — 一个代码片段(代码块，函数，类等)应该最小化它对其它代码的依赖。这个目标通过尽可能少的使用共享变量来实现。“低耦合是一个计算机系统结构合理、设计优秀的标志，把它与高聚合特征联合起来，会对可读性和可维护性等重要目标的实现具有重要的意义。”&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Coupling_(computer_programming)"&gt;http://en.wikipedia.org/wiki/Coupling_(computer_programming)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;最大化内聚性&lt;/STRONG&gt; — 具有相似功能的代码应该放在同一个代码组件里。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Cohesion_(computer_science)"&gt;http://en.wikipedia.org/wiki/Cohesion_(computer_science)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;隐藏实现细节&lt;/STRONG&gt; — 隐藏实现细节能最小化你在修改程序组件时产生的对那些使用这个组件的其它程序模块的影响。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Information_Hiding"&gt;http://en.wikipedia.org/wiki/Information_Hiding&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;笛米特法则(Law of Demeter)&lt;/STRONG&gt; — 程序组件应该只跟它的直系亲属有关系(例如继承类，内包含的对象，通过参数入口传入的对象等。)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Law_of_Demeter"&gt;http://en.wikipedia.org/wiki/Law_of_Demeter&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;避免过早优化&lt;/STRONG&gt; — 只有当你的程序没有其它问题，只是比你预期的要慢时，你才能去考虑优化工作。只有当其它工作都做完后，你才能考虑优化问题，而且你只应该依据经验做法来优 化。“对于小幅度的性能改进都不该考虑，要优化就应该是97%的性能提升：过早优化是一切罪恶的根源”—Donald Knuth。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Program_optimization"&gt;http://en.wikipedia.org/wiki/Program_optimization&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;代码复用&lt;/STRONG&gt; — 这不是非常核心的原则，但它跟其它原则一样非常有价值。代码复用能提高程序的可靠性，节省你的开发时间。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/Code_reuse"&gt;http://en.wikipedia.org/wiki/Code_reuse&lt;/A&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;职责分离&lt;/STRONG&gt; — 不同领域的功能应该由完全不同的代码模块来管理，尽量减少这样的模块之间的重叠。&lt;A href="http://en.wikipedia.org/wiki/Separation_of_concerns"&gt;http://en.wikipedia.org/wiki/Separation_of_concerns&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;拥抱变化&lt;/STRONG&gt; — 这是Kent Beck的一本书的副标题，它也是极限编程和敏捷开发方法的基本信条之一。很多的其它原则都基于此观念：面对变化，欢迎变化。事实上，一些经典的软件工程 原则，例如最小化耦合，就是为了让程序更容易面对变化。不论你是否采用了极限编程方法，这个原则对你的程序开发都有重要意义。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.amazon.com/gp/product/0321278658"&gt;http://www.amazon.com/gp/product/0321278658&lt;/A&gt;&lt;/P&gt;</description><pubDate>Wed, 31 Aug 2011 17:29:20 GMT</pubDate></item><item><title>ASP.NET GridView超链接列取值</title><link>http://www.wyjexplorer.cn/Blog/View/A921AFF473E3FC17.html</link><description>&lt;p&gt;场景：开发一个简单的Web文件管理功能，第一列是指向文件的超链接，最后一列放一个删除按钮。现在要求按删除按钮后，删除对应的文件。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201108302159044279.png" /&gt;&lt;/p&gt;&lt;p&gt;思路：获取当前行的第一列的值，然后调用File.Delete()方法。&lt;/p&gt;&lt;p&gt;按照以往的写法，我们会在GridView的SelectedIndexChanged事件中，先找到当前行：&lt;/p&gt;&lt;p&gt;int i = GridView1.SelectedIndex;&lt;/p&gt;&lt;p&gt;然后通过 GridView1.Rows[i].Cells[0].Text来访问当前行第一列的数据。&lt;/p&gt;&lt;p&gt;但是，如果不幸遇到超链接列，这种写法取出的缺是空串。我研究了好久，最后发现，HyperLink Field在GridView中要当作Web Control来处理。所以必须先转换为HyperLink，然后才能访问其Text属性。写法如下：&lt;/p&gt;&lt;p&gt;((HyperLink)GridView1.Rows[i].Cells[0].Controls[0]).Text&lt;/p&gt;&lt;p&gt;这样就可以成功取到超链接列的值了～&lt;/p&gt;</description><pubDate>Tue, 30 Aug 2011 22:06:06 GMT</pubDate></item><item><title>Access数据库保留关键字</title><link>http://www.wyjexplorer.cn/Blog/View/6674AED4F0F1A160.html</link><description>&lt;p&gt;最近正在对网站的数据库做重构，遇到了一些问题非常蛋疼，很多情况下，我的程序写的没问题，但就是报异常，结果罪魁祸首往往是因为表中的字段用了Access数据库的保留字段。下面我找了些Access的关键字分享给大家，以后建数据库的时候要避免使用这些关键字，如果实在要用，就得在程序里用[]转义一下。比如[All]&lt;/p&gt;
&lt;table style="width: 722px;" border="1" cellspacing="1" cellpadding="1" align=""&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ADD,ALL,Alphanumeric,ALTER,AND,ANY,&lt;br /&gt;Application,&lt;br /&gt;AS,ASC,Assistant,AT,AUTOINCREMENT,Avg&lt;/td&gt;
&lt;td&gt;BETWEEN,BINARY,BIT,BOOLEAN,BY,BYTE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CHAR, CHARACTER,COLUMN,CompactDatabase,&lt;br /&gt;CONSTRAINT,&lt;br /&gt;Container,Count,COUNTER,CREATE&lt;br /&gt;,CreateDatabase,CreateField,CreateGroup&lt;br /&gt;,CreateIndex,CreateObject,CreateProperty&lt;br /&gt;,CreateRelation,CreateTableDef,CreateUser&lt;br /&gt;,CreateWorkspace,CURRENCY,CurrentUser&lt;/td&gt;
&lt;td&gt;DATABASE,DATE,DATETIME,DELETE,DESC,&lt;br /&gt;Description&lt;br /&gt;,DISALLOW,DISTINCT,DISTINCTROW,Document&lt;br /&gt;,DOUBLE,DROP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Echo,Else,End,Eqv,Error,EXISTS,Exit&lt;/td&gt;
&lt;td&gt;FALSE,Field, Fields,FillCache,FLOAT,&lt;br /&gt; FLOAT4, FLOAT8,FOREIGN,Form, Forms,&lt;br /&gt;FROM,Full,FUNCTION&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GENERAL,GetObject,GetOption,&lt;br /&gt;GotoPage,GROUP,GROUP BY,GUID&lt;/td&gt;
&lt;td&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle,IEEEDOUBLE, IEEESINGLE,If&lt;br /&gt;,IGNORE,Imp,IN,INDEX,Index, Indexes&lt;br /&gt;,INNER,INSERT,InsertText&lt;br /&gt;,INT, INTEGER, INTEGER1, INTEGER2, INTEGER4&lt;br /&gt;,INTO,IS&lt;/td&gt;
&lt;td&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;KEY&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;LastModified,LEFT,Level,Like,LOGICAL,&lt;br /&gt; LOGICAL1,LONG, LONGBINARY, LONGTEXT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Macro,Match,Max, Min, Mod&lt;br /&gt;,MEMO,Module,MONEY,Move&lt;/td&gt;
&lt;td&gt;NAME,NewPassword,NO,Not,Note,NULL&lt;br /&gt;,NUMBER, NUMERIC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object,OLEOBJECT,OFF,ON,OpenRecordset&lt;br /&gt;,OPTION,OR,ORDER,Orientation,Outer&lt;br /&gt;,OWNERACCESS&lt;/td&gt;
&lt;td&gt;Parameter,PARAMETERS,Partial,Password,&lt;br /&gt;PERCENT,PIVOT,PRIMARY,PROCEDURE,Property&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queries,Query,Quit&lt;/td&gt;
&lt;td&gt;REAL,Recalc,Recordset,REFERENCES,Refresh&lt;br /&gt;,RefreshLink,RegisterDatabase,Relation&lt;br /&gt;,Repaint,RepairDatabase,Report,Reports&lt;br /&gt;,Requery,RIGHT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCREEN,SECTION,SELECT,SET,SetFocus&lt;br /&gt;,SetOption,SHORT,SINGLE,Size&lt;br /&gt;,SMALLINT,SOME,SQL,StDev, StDevP&lt;br /&gt;,STRING,Sum&lt;/td&gt;
&lt;td&gt;TABLE,TableDef, TableDefs,TableID&lt;br /&gt;,TEXT,TIME, TIMESTAMP,TOP&lt;br /&gt;,TRANSFORM,TRUE,Type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UNION,UNIQUE,UPDATE,USER&lt;/td&gt;
&lt;td&gt;VALUE,VALUES,Var, VarP,VARBINARY, VARCHAR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WHERE,WITH,Workspace&lt;/td&gt;
&lt;td&gt;WHERE,WITH,Workspace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;Xor&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Year,YES,YESNO&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description><pubDate>Thu, 25 Aug 2011 21:22:01 GMT</pubDate></item><item><title>C#窗口任意位置拖动</title><link>http://www.wyjexplorer.cn/Blog/View/3E8F85B842B7FECC.html</link><description>&lt;p&gt;网上找来的一段代码，测试有效。注意要添加System.Runtime.InteropServices的引用&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();
        
        [DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_MOVE = 0xF010;
        public const int HTCAPTION = 0x0002;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
    }
}
&lt;/pre&gt;</description><pubDate>Sat, 20 Aug 2011 15:58:51 GMT</pubDate></item><item><title>《魔兽世界》卡Ctrl键的问题</title><link>http://www.wyjexplorer.cn/Blog/View/70DF7607D86FD5B9.html</link><description>&lt;p&gt;我的魔兽世界经常卡CTRL，特别是聊天的时候，打完中文，如果没有切换输入法，就会卡CTRL。这个烂情况困扰我很久了。可是在别人电脑上好像没有这个问题。观察下来，他们的输入法和我不一样。我用的是谷歌拼音，今天升级到了2.5版，但卡CTRL的问题依然存在。网上也有不少人和我有一样的遭遇。下面是一个比较简单的解决办法：&lt;/p&gt;&lt;p&gt;打开谷歌拼音设置界面（输入法状态条-&gt;菜单-&gt;属性设置）。然后在“按键”选项卡里，将“Ctrl键快速定位”设置为关闭。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201108201352056867.jpg" /&gt;&lt;/p&gt;&lt;p&gt;这样卡Ctrl的情况就会好很多。另外，卡Alt的键的问题仍然没有结论。具体发生在打开背包、拍卖行的时候用中文和别人聊天，退出后就会卡Alt。&lt;/p&gt;&lt;p&gt;谷歌拼音3.0版似乎解决了卡键问题。但引来了一个更严重的问题：魔兽世界中输入中文的时候，根本没有选词框。&lt;/p&gt;&lt;p&gt;所以，如果你经常打魔兽世界，最好还是别用谷歌拼音，不然打副本的时候，发句话，然后卡键了就尴尬了～&lt;/p&gt;</description><pubDate>Sat, 20 Aug 2011 13:58:51 GMT</pubDate></item><item><title>C#的lambda运算符例子</title><link>http://www.wyjexplorer.cn/Blog/View/5129B4487CA876AE.html</link><description>&lt;P&gt;找偶数元素，用lambda表达式来做：&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;using System;
using System.Collections.Generic;

namespace ConsoleApplication4
{
    class Program
    {       
        static void Main(string[] args)
        {
            List&lt;INT&gt; list = new List&lt;INT&gt;();
            list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });

            //lambda
            List&lt;INT&gt; lambdaEvenNumbers = list.FindAll(i =&gt; (i % 2) == 0);
            foreach (int item in lambdaEvenNumbers)
            {
                Console.Write("{0} ", item);
            }
            
        }
    }
}
&lt;/PRE&gt;
&lt;P&gt;&lt;IMG src="/Uploads/201108101702456436.png"&gt;&lt;/P&gt;</description><pubDate>Wed, 10 Aug 2011 17:04:11 GMT</pubDate></item><item><title>IIS7启用Windows身份验证的办法</title><link>http://www.wyjexplorer.cn/Blog/View/49FCAE0C685276B5.html</link><description>&lt;P&gt;最近因为工作需要，在PC上用IIS建了个简单的文件服务器（启用目录浏览），但这样的服务需要安全验证，我不能让每个人都可以访问我的文件。我记得以前在IIS5、IIS6里，是可以设置身份验证方式的，只要去掉匿名访问，打开网站的时候就需要输入IIS服务器上的用户名和密码。&lt;/P&gt;
&lt;P&gt;然而换了Windows7之后，我没有注意过这个功能，直到今天才发现，Win7里的IIS7.5，默认是不带Windows身份验证的。如果把匿名身份验证关闭的话，访问网站会直接失败，而不是弹出登录框。&lt;/P&gt;
&lt;P&gt;经过一番研究，终于发现了开启Windows身份验证的办法：控制面板-&gt;程序和功能-&gt;打开和关闭Windows功能-&gt;Internet信息服务-&gt;万维网服务-&gt;安全性，选择Windows身份验证。&lt;/P&gt;
&lt;P&gt;&lt;IMG src="/Uploads/201108090756067801.png"&gt;&lt;/P&gt;
&lt;P&gt;然后，回到你的IIS控制台。选择要进行身份验证的网站。在身份验证中，将Windows身份验证启用，其他全部禁用。&lt;/P&gt;
&lt;P&gt;&lt;IMG src="/Uploads/201108090757363406.png"&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="/Uploads/201108090758012517.png"&gt;&lt;/P&gt;
&lt;P&gt;大功告成：&lt;/P&gt;
&lt;P&gt;&lt;IMG src="/Uploads/201108090758524063.png"&gt;&lt;/P&gt;</description><pubDate>Tue, 09 Aug 2011 07:59:22 GMT</pubDate></item><item><title>C#委托与匿名方法演示</title><link>http://www.wyjexplorer.cn/Blog/View/650F537F2BF5F180.html</link><description>&lt;P&gt;委托与匿名方法演示,摘自《C#4.0捷径教程》.我写了很多注释便于大家理解。&lt;/P&gt;
&lt;P&gt;注：Infosys的电脑运行demo时不能显示中文，所以程序里用了拼音党，抱歉~&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;using System;

namespace ConsoleApplication4
{
    public delegate int ProcStrategy(int x);

    /// &lt;SUMMARY&gt;
    /// 处理整数的类
    /// &lt;/SUMMARY&gt;
    public class Processor
    {
        //一个名为strategy的字段，类型是ProcStrategy委托
        private ProcStrategy strategy;

        internal ProcStrategy Strategy
        {
            set { strategy = value; }
        }

        public int[] Process(int[] array)
        {
            int[] result = new int[array.Length];
            for (int i = 0; i &lt; array.Length; ++i)
            {
                //这里用到了字段strategy，这是个ProcStrategy委托，接受一个int参数。
                result[i] = strategy(array[i]);
            }
            return result;
        }

    }
  
    class Program
    {
        #region 不使用匿名方法，需要这些代码的支持。即定义委托的函数体

        private static int MultipyBy2(int x)
        {
            return x * 2;
        }

        private static int MultipyBy4(int x)
        {
            return x * 4;
        }

        #endregion

        /// &lt;SUMMARY&gt;
        /// 在控制台输出数组
        /// &lt;/SUMMARY&gt;
        /// &lt;PARAM name="array"&gt;数组对象&lt;/PARAM&gt;
        private static void PrintArray(int[] array)
        {
            for (int i = 0; i &lt; array.Length; ++i)
            {
                Console.Write("{0}", array[i]);
                if (i != array.Length - 1)
                {
                    Console.Write(", ");
                }
            }
            Console.Write("\n");
        }

        static void Main(string[] args)
        {
            int[] integers = new int[] { 1, 2, 3, 4 };

            Console.WriteLine("Bu shi yong ni ming fang fa:");
           
            //1.创建一个Processor对象
            Processor proc = new Processor();
            
            //2.设置它的Strategy属性为一个指向本类中MultipyBy2方法的委托
            proc.Strategy = new ProcStrategy(Program.MultipyBy2);
            
            //3.调用本类中的PrintArray方法，输出proc对象处理后数组的结果。
            //  这时候Process方法会按照MultipyBy2处理
            //  因为刚才proc的Strategy属性指向了MultipyBy2方法
            PrintArray(proc.Process(integers));

            //同样，输出MultipyBy4的结果
            proc.Strategy = new ProcStrategy(Program.MultipyBy4);
            PrintArray(proc.Process(integers));

            Console.WriteLine("Shi yong ni ming fang fa:");

            //匿名方法(不需要“region 不使用匿名方法”中的代码)
            Processor proc1 = new Processor();

            //匿名方法允许在初始化委托的地方定义委托函数体，而不需要像之前那样，在Program中定义函数体
            //我们可以灵活的定义逻辑，不必再写MultipyByN这样的方法了。匿名方法会赋值给Processor.Strategy属性
            proc1.Strategy = delegate(int x) { return x * 2; };
            PrintArray(proc1.Process(integers));
            proc1.Strategy = delegate(int x) { return x * 4; };
            PrintArray(proc1.Process(integers));
            proc1.Strategy = delegate(int x) { return 0; };
            PrintArray(proc1.Process(integers));
        }
    }
}
&lt;/PRE&gt;
&lt;P&gt;&lt;IMG src="/Uploads/201108081702374357.png"&gt;&lt;/P&gt;</description><pubDate>Mon, 08 Aug 2011 17:02:50 GMT</pubDate></item><item><title>ASP.NET Repeater控件绑定List&lt;T&gt;泛型的写法</title><link>http://www.wyjexplorer.cn/Blog/View/9B2E0E47CED0AC8A.html</link><description>&lt;p&gt;我们在开发分成架构的Web应用程序时，常常把数据库中的记录放到一个List&lt;Model&gt;中，做到了良好的封装。调用业务逻辑的程序猿也无需知道库表结构就可以直接使用“Model.属性”来访问各个字段的数据了。但在做显示的时候，初学者可能会碰到一些问题。以往大家在显示控件（如Repeater）上绑定的都是DataSet，ASPX页面里写的是“&lt;%# Eval("字段名")%&gt;”。那如何绑定一个List&lt;T&gt;泛型呢？&lt;/p&gt;&lt;p&gt;其实，Repeater控件是支持绑定到业务对象的，并且我们也不再用Eval表达式了。看一个例子：&lt;/p&gt;
&lt;p&gt;后台代码：&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;GeekStudio.BLL.Blog optBlog = new GeekStudio.BLL.Blog();
Repeater1.DataSource = optBlog.GetModelList();
Repeater1.DataBind();
&lt;/pre&gt;
&lt;p&gt;其中，GetModelList()返回的是一个List&lt;GeekStudio.ORM.Model.Blog&gt;。我们可以按照以往绑定DataSet的相同写法，将List&lt;t&gt;绑定到Repeater控件上。&lt;/t&gt;&lt;/p&gt;
&lt;p&gt;再来看看前台代码：&lt;/p&gt;
&lt;pre class="brush: xml"&gt;&lt;ul&gt;
    &lt;asp:repeater id="Repeater1" runat="server"&gt;
        &lt;itemtemplate&gt;
            &lt;li&gt;&lt;%#((GeekStudio.ORM.Model.Blog)Container.DataItem).Title%&gt;&lt;/li&gt;
        &lt;/itemtemplate&gt;
    &lt;/asp:repeater&gt;
&lt;/ul&gt;
&lt;/pre&gt;
&lt;p&gt;就这样，很简单，就把GeekStudio.ORM.Model.Blog的Title显示在了网页上&lt;/p&gt;
&lt;p&gt;总结一下：&lt;/p&gt;&lt;p&gt;要在Repeater上绑定List&lt;t&gt;泛型，后台代码里只要指定&lt;b&gt;Repeater控件.DataSource = List&lt;你的类型&gt;&lt;/b&gt;。前台代码里&lt;font color="#FF0000"&gt;先强制转换类型&lt;/font&gt;，然后就可以访问各属性了，不需要写Eval：&lt;b&gt;&lt;%#((&lt;font color="#FF0000"&gt;你的类型&lt;/font&gt;)Container.DataItem).你的类型的属性%&gt;&lt;/b&gt;。这样写的优点非常明显：我们确实无需知道库表结构了，可以直接调用Model类型.属性，不容易写错代码，也增加了可维护性。而且，据说此方法的效率要高于传统的采用Eval绑定方法。&lt;/t&gt;&lt;/p&gt;</description><pubDate>Sat, 06 Aug 2011 17:31:39 GMT</pubDate></item><item><title>C#3.0中LINQ表达式的简单演示</title><link>http://www.wyjexplorer.cn/Blog/View/08EC79BD167705D5.html</link><description>&lt;p&gt;用LINQ获取数组中大于5的元素并输出的DEMO。可以对比看一下传统方法。&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Looking for elements larger than 5 in an array{ 1, 15, 2, 8, 7, 9 }.");
            Console.WriteLine("\nTraditional Approach:");
            TraditionalApproach();
            Console.WriteLine("\n\nLINQ Approach:");
            LinqApproach();
            Console.WriteLine("\n");
        }

        /// &lt;summary&gt;
        /// 传统做法
        /// &lt;/summary&gt;
        protected static void TraditionalApproach()
        {
            int[] arr = { 1, 15, 2, 8, 7, 9 };

            //用FOR循环遍历数组
            for (int i = 0; i &lt; arr.Length; i++)
            {
                //如果当前元素大于5就输出
                if (arr[i] &gt; 5)
                {
                    Console.Write(arr[i] + " ");
                }
            }
        }

        /// &lt;summary&gt;
        /// 使用LINQ表达式查找符合条件的元素
        /// &lt;/summary&gt;
        protected static void LinqApproach()
        {
            int[] arr = { 1, 15, 2, 8, 7, 9 };
     
            // 将查询结果保存在result中
            // 也可用var关键字替代IEnumerable&lt;int&gt;
            IEnumerable&lt;int&gt; result = from i in arr where i &gt; 5 select i;

            // 也可用var关键字替代int
            foreach (int item in result)
            {
                Console.Write(item + " ");
            }
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;程序运行结果：&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201108041802331343.png"&gt;&lt;/p&gt;&lt;p&gt;监视结果：&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/201108041802433994.png"&gt;&lt;/p&gt;</description><pubDate>Thu, 04 Aug 2011 18:02:50 GMT</pubDate></item><item><title>C#获取进程、查找并结束进程</title><link>http://www.wyjexplorer.cn/Blog/View/38B07E367CF9FE67.html</link><description>&lt;P&gt;最近看到一个考试系统，有个功能是用来监视进程的。一旦发现如Communicator.exe这样的违禁软件就立即杀死进程并上报给服务器。我稍微研究了一下，这个功能实现起来其实很简单。就是使用ManagementObjectSearcher获取进程列表，然后放在一个Collection里，之后就可以按照自己的逻辑去做了。&lt;/P&gt;
&lt;P&gt;下面是一个例子：获取进程列表、创建“违禁”进程名单、查找并杀死进程。注意先要在项目里添加System.Management的引用。&lt;/P&gt;&lt;PRE class="brush: csharp"&gt;using System;
using System.Management;

namespace ConsoleApplication3
{
    
    class Program
    {
        static void Main(string[] args)
        {
            // Show Process List
            Console.WriteLine("===========Process List===========");
            ManagementObjectCollection objects = new ManagementObjectSearcher("SELECT * FROM Win32_Process").Get();
            foreach (ManagementObject item in objects)
            {
                Console.WriteLine((item["Name"].ToString()));
            }

            // Create Ban List
            Console.WriteLine("===========Ban List===========");
            string lst = "Communicator.exe,POWERPNT.exe,notepad.exe";
            string[] bannedProc = lst.Split(‘,‘);
            foreach (string s in bannedProc)
            {
                Console.WriteLine(s);
            }

            // Search and Destroy
            Console.WriteLine("===========Search and Destroy===========");
            Console.WriteLine("Searching for banned process...");
            int count = 0;
            foreach (string item in bannedProc)
            {
                if (DetectProcess(item))
                {
                    count++;
                    Console.WriteLine("Process [{0}] Detected!", item);
                    Console.WriteLine("[{0}] was killed {1}.", item, KillProcess(item) ? "Successfully" : "Unsucessfully");
                }
            }
            Console.WriteLine("Done, {0} banned process found", count);
        }

        protected static bool DetectProcess(string pProcessName)
        {
            ManagementObjectCollection objects = new ManagementObjectSearcher("SELECT * FROM Win32_Process").Get();
            foreach (ManagementObject item in objects)
            {
                string str = item["Name"].ToString();
                if (str.Trim().ToUpper() == pProcessName.Trim().ToUpper())
                {
                    return true;
                }
            }
            return false;
        }

        public static bool KillProcess(string pProcessName)
        {
            ManagementObjectCollection objects = new ManagementObjectSearcher("SELECT * FROM Win32_Process").Get();
            foreach (ManagementObject item in objects)
            {
                string str = item["Name"].ToString();
                if (str.Trim().ToUpper() == pProcessName.Trim().ToUpper())
                {
                    string[] args = new string[] { "0" };
                    item.InvokeMethod("Terminate", args);
                    return true;
                }
            }
            return false;
        }
    }
}
&lt;/PRE&gt;
&lt;P&gt;效果如下：&lt;/P&gt;
&lt;P&gt;&lt;IMG src="/Uploads/201108031720422844.png"&gt;&lt;/P&gt;</description><pubDate>Wed, 03 Aug 2011 17:21:24 GMT</pubDate></item><item><title>ASP.NET中GridView的多选、删除</title><link>http://www.wyjexplorer.cn/Blog/View/F79D9EA81C99518C.html</link><description>&lt;p&gt;我们在开发网站的时候，有个很常见的功能，就是要让GridView能够选择多项，然后一起删除。效果类似下面这张图，这是我网站后台管理页面中的一个GridView。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201107262033494043.png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;其实制作这个效果不难，思路是：增加一个checkbox列，这个列的数据绑定到表的主键（比如Id），前台的代码可以在VS的可视化设计器中完成，你要做的仅仅只是增加一个CheckBox列。&lt;/p&gt;&lt;p&gt;前台代码如下：&lt;/p&gt;
&lt;pre class="brush: html;"&gt;&lt;asp:gridview id="GridView2" runat="server" autogeneratecolumns="False" datakeynames="ID" datasourceid="AccessDataSource2" allowpaging="True" allowsorting="True" cellpadding="4" enablemodelvalidation="True" forecolor="#333333"&gt;
                    &lt;alternatingrowstyle backcolor="White" forecolor="#284775"&gt;
                    &lt;columns&gt;
                        &lt;asp:templatefield headertext="选择"&gt;
                            &lt;itemtemplate&gt;
                                &lt;asp:checkbox id="CheckBox1" runat="server"&gt;
                            &lt;/asp:checkbox&gt;&lt;/itemtemplate&gt;
                            &lt;edititemtemplate&gt;
                                &lt;asp:checkbox id="CheckBox1" runat="server"&gt;
                            &lt;/asp:checkbox&gt;&lt;/edititemtemplate&gt;
                            &lt;itemstyle horizontalalign="Center"&gt;
                        &lt;/itemstyle&gt;&lt;/asp:templatefield&gt;
                        &lt;asp:boundfield datafield="ID" headertext="ID"&gt;
                    &lt;asp:boundfield datafield="fdname" headertext="链接名称" sortexpression="fdname"&gt;
                        &lt;headerstyle height="24px"&gt;
                        &lt;itemstyle height="22px"&gt;
                    &lt;/itemstyle&gt;&lt;/headerstyle&gt;&lt;/asp:boundfield&gt;
                        &lt;asp:boundfield datafield="fdurl" headertext="链接地址" sortexpression="fdurl"&gt;
                        &lt;asp:boundfield datafield="orderId" headertext="排序ID" sortexpression="orderId"&gt;
                        &lt;asp:commandfield headertext="编辑" showeditbutton="True"&gt;
                        &lt;asp:templatefield headertext="删除" showheader="False"&gt;
                            &lt;itemtemplate&gt;
                                &lt;asp:linkbutton id="LinkButton1" runat="server" causesvalidation="False" commandname="Delete" text="删除" onclientclick="return confirm(‘真的要删除吗?‘)"&gt;&lt;/asp:linkbutton&gt;
                            &lt;/itemtemplate&gt;
                        &lt;/asp:templatefield&gt;
                    &lt;/asp:commandfield&gt;&lt;/asp:boundfield&gt;&lt;/asp:boundfield&gt;&lt;/asp:boundfield&gt;&lt;/columns&gt;
                    &lt;editrowstyle backcolor="#999999"&gt;
                    &lt;footerstyle backcolor="#5D7B9D" font-bold="True" forecolor="White"&gt;
                    &lt;headerstyle backcolor="#5D7B9D" font-bold="True" forecolor="White"&gt;
                    &lt;pagerstyle backcolor="#284775" forecolor="White" horizontalalign="Center"&gt;
                    &lt;rowstyle backcolor="#F7F6F3" forecolor="#333333"&gt;
                    &lt;selectedrowstyle backcolor="#E2DED6" font-bold="True" forecolor="#333333"&gt;
                &lt;/selectedrowstyle&gt;&lt;/rowstyle&gt;&lt;/pagerstyle&gt;&lt;/headerstyle&gt;&lt;/footerstyle&gt;&lt;/editrowstyle&gt;&lt;/alternatingrowstyle&gt;&lt;/asp:gridview&gt;

&lt;/pre&gt;
&lt;p&gt;后台代码如下：&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;protected void Button2_Click(object sender, EventArgs e)
{
    //获取要更改的项目
    ArrayList checkedList = new ArrayList();
    for (int i = 0; i &lt; this.GridView2.Rows.Count; i++)
    {
        string ID = this.GridView2.Rows[i].Cells[1].Text;
        CheckBox cb = this.GridView2.Rows[i].FindControl("CheckBox1") as CheckBox;
        if (checkedList.Contains(ID) &amp;&amp; !cb.Checked)
        {
            checkedList.Remove(ID);
        }
        if (!checkedList.Contains(ID) &amp;&amp; cb.Checked)
        {
            checkedList.Add(ID);
        }
    }

    //逐条更改

    int count = 0;

    for (int i = 0; i &lt; checkedList.Count; i++)
    {
        string SQL = "DELETE * FROM Fdlinks where ID=" + checkedList[i].ToString();
        int OK = OleDbHelper.ExecNQ(SQL);
        if (OK == 1)
        {
            count++;
        }

    }

    Label2.Text = count + "条记录被更改";
    GridView2.DataSourceID = AccessDataSource2.ID;
    GridView2.DataBind();
}
&lt;/pre&gt;
</description><pubDate>Tue, 26 Jul 2011 20:21:14 GMT</pubDate></item><item><title>为什么编程是独一无二的职业</title><link>http://www.wyjexplorer.cn/Blog/View/F13582B555ECBF0F.html</link><description>导读：本文翻译自Nalaka Gamage的《&lt;a href="http://www.nalakainfo.com/2011/05/why-programming-is-unique-profession.html" target="_blank"&gt;Why is programming unique profession&lt;/a&gt;》的演讲稿。
&lt;p&gt;&lt;strong&gt;1. 简介&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; 有些人说编程很难，有些人认为很容易。&lt;/li&gt;&lt;li&gt; 编程不仅依赖你的能力，而且还取决你工作的态度。&lt;/li&gt;&lt;li&gt; 编程的确很难，但比起那些需要伪装、欺骗和表演来生活的恶棍或者小丑来说，真的一点也不难。&lt;/li&gt;&lt;li&gt; 作为一个程序员，知道你在做什么，会让生活变得更加有趣和快乐。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;&lt;strong&gt;2. 与不会说话的机器为伍&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; 计算机是不会说话的机器。&lt;/li&gt;&lt;li&gt; 除非你向它发送精确的指令，否则计算机是不会懂（你的意思）的。&lt;/li&gt;&lt;li&gt; 和哑巴一起工作，明显是困难的。&lt;/li&gt;&lt;li&gt; 因此，程序员必须很聪明。
&lt;ul&gt;&lt;li&gt;阿呆与阿瓜永远不会是一对好组合。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;&lt;strong&gt;3. 计算机是专横的（一个不可避免的恶魔）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; 不会说话的计算机明显也是专横的。&lt;/li&gt;&lt;li&gt; 计算机语言之所以如此的专横，其中的一个好的理由就是让程序变得更精确而且没有歧义。
&lt;ul&gt;&lt;li&gt;精确性是人们喜欢使用软件而不是由人来完成一件事情的最主要理由之一。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;&lt;strong&gt;4. 人不能欺骗程序&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;编写什么代码就得到什么运行结果。&lt;/li&gt;&lt;li&gt;没有所谓的隐藏设计或者隐藏代码bug。&lt;/li&gt;&lt;li&gt;Bug总是会显现的。
&lt;ul&gt;&lt;li&gt;因为当软件运行的时候，它已经不再处于你的控制之下了。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;编写正确的代码是唯一的选择。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;&lt;strong&gt;5. 没有地方可以祷告&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;不可能通过祈祷让代码工作。&lt;/li&gt;&lt;li&gt;如果你想要完成软件，只要设计一个方案然后编码实现。&lt;/li&gt;&lt;li&gt;在代码面前你与天才程序员的机会是平等的，这是很酷的一件事情。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;&lt;strong&gt;6. 没有地方调情&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;一些人通过调戏其他人以完成工作。&lt;/li&gt;&lt;li&gt;计算机不是一个可爱的人。&lt;/li&gt;&lt;li&gt;在编程时仅仅调情是没有任何优势的。&lt;/li&gt;&lt;li&gt;编程适合真正（实干）的人。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;&lt;strong&gt;7. 程序员都是解决问题的人&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;有很多看上去很像专业人士的人，他们其实是问题的制造者。
&lt;ul&gt;&lt;li&gt;大多的律师为了他们的生计给别人找不必要的问题。&lt;/li&gt;&lt;li&gt;大多的销售为了他们的生计向别人推销不需要的东西。&lt;/li&gt;&lt;li&gt;一些很懒的或者不胜任工作的人，努力地成为管理别人工作的管理者。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;但是，编程是在真正解决现实世界中的问题。&lt;/li&gt;&lt;li&gt;只有真正有才能的人才能成为程序员。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;&lt;strong&gt;8. 逻辑思考真的很重要&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;八卦适合漂亮的女人。&lt;/li&gt;&lt;li&gt;占星术/迷信适合哑巴。&lt;/li&gt;&lt;li&gt;科学适合老古董。&lt;/li&gt;&lt;li&gt;编程适合逻辑思考者。&lt;/li&gt;&lt;li&gt;编程适合善于分析的人。&lt;/li&gt;&lt;li&gt;逻辑思考和分析也会让你变得聪慧 —— 一个对你人生的奖励。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;&lt;strong&gt;9. 聪明人，编程以及职业&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;如果你是聪明人，并且很擅长你所做的工作。
&lt;ul&gt;&lt;li&gt;你不需要向别人乞讨才能生存。&lt;/li&gt;&lt;li&gt;你不需要通过调情才能生存。&lt;/li&gt;&lt;li&gt;你会获得均等的机会。&lt;/li&gt;&lt;li&gt;你会获得自主。&lt;/li&gt;&lt;li&gt;你会获得自由（除非你是计算机的奴隶）&lt;/li&gt;&lt;li&gt;你会变得聪慧。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;&lt;strong&gt;10. 编程适合不做作的人&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;“世上有两类人：一类人完成工作，另一类接受荣誉。努力成为第一类，那里竞争会少一点。”英吉拉·甘地&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;　　Nalaka Gamage分享过不少好东西，比如《&lt;a href="http://www.jobbole.com/entry.php/938" target="_blank"&gt;程序员最常见的技术性误区&lt;/a&gt;》。&lt;br&gt;　　_&lt;/p&gt;
&lt;p&gt;&lt;br&gt;　　译文出处：&lt;a href="http://www.jobbole.com/" target="_blank"&gt;伯乐&lt;/a&gt;在线- &lt;a href="http://www.jobbole.com/blog.php" target="_blank"&gt;职场&lt;/a&gt;&lt;a href="http://www.jobbole.com/blog.php/287" target="_blank"&gt;博客&lt;/a&gt; - &lt;a href="http://www.jobbole.com/blog.php/287" target="_blank"&gt;程序员&lt;/a&gt;&lt;br&gt;　　译文链接：&lt;a href="http://www.jobbole.com/entry.php/1128" target="_blank"&gt;http://www.jobbole.com/entry.php/1128&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;　　原文：&lt;a rel="nofollow" href="http://www.nalakainfo.com/2011/05/why-programming-is-unique-profession.html" target="_blank"&gt;Nalaka Gamage&lt;/a&gt;　　　翻译：敏捷&lt;a href="http://www.jobbole.com/blog.php/413" target="_blank"&gt;翻译&lt;/a&gt; - &lt;strong&gt;&lt;a href="http://www.jobbole.com/member.php/3001-%E5%94%90%E5%B0%A4%E5%8D%8E" target="_blank"&gt;&lt;strong&gt;&lt;strong&gt;唐尤华&lt;/strong&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;　　如需转载，但请注明原文/译文出处、译文超链接和译者等信息，否则视为侵权，谢谢合作！&lt;/p&gt;&lt;font style="font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;&lt;font style="font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;&lt;font style="font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;&lt;font style="font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;</description><pubDate>Sat, 23 Jul 2011 09:06:01 GMT</pubDate></item><item><title>让网站RSS源被浏览器自动识别的方法</title><link>http://www.wyjexplorer.cn/Blog/View/1DEF04325D774BD0.html</link><description>&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;最近本人在修改我的个人网站，其中一个目标就是要让IE/Firefox等支持RSS订阅的浏览器能自动找到我的RSS源（即让RSS按钮亮起）。查阅微软的资料后，发现方法很简单，只要一行代码就可以完成。&lt;/p&gt;
&lt;p&gt;比如你的RSS源是：http://www.wyjexplorer.cn/RSS&lt;/p&gt;
&lt;p&gt;那你只要在页面的&lt;head&gt;&lt;/head&gt;节点中加入：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;link rel="alternate" type="application/rss+xml" title="源标题" href="/RSS"&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后打开IE/Firefox再次访问这个页面。RSS按钮就会自动亮起！！！&lt;/p&gt;&lt;/div&gt;</description><pubDate>Sun, 10 Jul 2011 18:58:22 GMT</pubDate></item><item><title>教你从网站的“在线试听”中提取MP3音乐</title><link>http://www.wyjexplorer.cn/Blog/View/60E21E07C6487224.html</link><description>&lt;p&gt;&lt;font color="#FF0000"&gt;&lt;b&gt;首先说一下，本文仅仅讨论技术，不是赞成盗版音乐。请勿将提取的MP3到处传播，一切后果自负，与我无关！&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;现在有很多网站提供在线的音乐试听，但如果你想下载，恐怕就得付费，或者安装他们所谓的客户端。非常不爽。今天教大家一个办法，可以……你懂的～&lt;/p&gt;&lt;p&gt;我分析了一下现在的在线试听网页，几乎都是用flash播放器放的，目的就是让你不能下载到mp3的源文件。呵呵，不过这点难不倒我。&lt;/p&gt;&lt;p&gt;我们转换一下思路，既然隐藏了真实的mp3地址，或者网站将MP3转换为了flash格式，但音质几乎没有损耗，我们何不把flash文件下载回来，从中提取mp3呢？我当时就想到了火狐+NetVideoHunter+KMPlayer～，操作方法如下：&lt;/p&gt;&lt;p&gt;首先，&lt;b&gt;你需要一个火狐浏览器，并且去官方的拓展网站下载一个NetVideoHunter插件&lt;/b&gt;，它可以下载几乎任何在线播放的flv、fla格式的视频（土豆、优库都不在话下），安装完成之后，火狐的状态栏右下角会多一个图标。&lt;/p&gt;&lt;p&gt;然后打开在线试听网站的页面，比如我这次搞的是网易在线试听“咖啡因乐团 时光”：&lt;/p&gt;&lt;p&gt;&lt;b&gt;1.当音乐开始播放时，点击NetVideoHunter的图标，可以找到一个5.68M的flv文件，根据经验，这一定是正在播放的《时光》歌曲的flv文件。将它下载下来～&lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201106171136042335.png"&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2.用KMPlayer播放器打开这个flv文件，默认开始播放，点击停止。然后按Alt+A，打开音频捕捉对话框，注意选择“&lt;font color="#FF0000"&gt;当开始播放时自动捕获&lt;/font&gt;”&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201106171138241774.png"&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3.点击KMPlayer的播放按钮，然后软件就开始自动捕获MP3文件了～:D&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201106171139185491.png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;4.最终成果：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201106171139327838.png"&gt;&lt;br&gt;&lt;/p&gt;</description><pubDate>Fri, 17 Jun 2011 11:41:12 GMT</pubDate></item><item><title>.NET中使用StringBuilder高效率拼接字符串</title><link>http://www.wyjexplorer.cn/Blog/View/12F5E7ECCFCB8D28.html</link><description>&lt;p&gt;刚才在微软WebCast中看到一个值得学习的技巧，非常实用～&lt;/p&gt;&lt;p&gt;一般，对于字符串的拼接，我们习惯使用 + 运算符，比如：&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;
string a = "abc";
string b = "def";
string c = a + b;
&lt;/pre&gt;
&lt;p&gt;然而，这种方法其实是有潜在性能问题的，只有两三个string进行“+”拼接时还看不出来，如果遇到成千上万的string需要拼接，就会感觉到明显的效率问题。（这其实是因为在.NET中，string是不可变的引用类型，一个string是既定的。这就意味着，我们执行拼接操作，或者给string重新赋值的时候，底层是不改变原有的string的，而是另外分配一个新的内存空间用来操作。（具体可参考《C#与.NET3.5高级程序设计》一书中对于string的描述）。）&lt;/p&gt;
&lt;p&gt;大家不妨试试这个demo（分别将i改成5000，和50000）：&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;
static void Main(string[] args)
{
    //记录开始时间
    DateTime start = DateTime.Now;
    string a = "s";
    //用传统的“+”方式拼接50000次
    for (int i = 0; i &lt; 50000; i++)
    {
        a += i;
    }
    //输出所用时间
    Console.WriteLine(DateTime.Now - start);
    Console.ReadKey();
}
&lt;/pre&gt;
&lt;p&gt;当i = 50000时，程序的运行结果：&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201106111814539114.png"&gt;&lt;/p&gt;

&lt;p&gt;在我的机器上，耗时为5.6363224秒。&lt;/p&gt;&lt;p&gt;为了解决这个性能问题，我们可以使用StringBuilder，将这个demo改一下：&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;
static void Main(string[] args)
{
    //记录开始时间
    DateTime start = DateTime.Now;
    StringBuilder sb = new StringBuilder("s");
    //用StringBuilder拼接500000次
    for (int i = 0; i &lt; 500000; i++)
    {
        sb.Append(i);
    }
    string a = sb.ToString();
    //输出所用时间
    Console.WriteLine(DateTime.Now - start);
    Console.ReadKey();
}
&lt;/pre&gt;
&lt;p&gt;这次，i改为了500000，是刚才的10倍，然而效率却高的多（0.1200069秒）：&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201106111815598936.png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;所以，大家以后遇到大量字符串拼接的时候，可以利用StringBuilder来避免性能问题～&lt;/p&gt;&lt;font style="font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;</description><pubDate>Sat, 11 Jun 2011 18:16:33 GMT</pubDate></item><item><title>Infosys面试经历</title><link>http://www.wyjexplorer.cn/Blog/View/81ABFB0AA1F27E30.html</link><description>&lt;p&gt;今天上午本人参加了Infosys公司的实习生面试。写一下过程帮助大家了解一下情况～&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201106041540321408.jpg"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;在这个面试之前，Infosys公司之前来我们学校做过一次宣讲会，是一个印度人讲的，说实话听不太懂，呵呵，当天就做了笔试，笔试一般是英语阅读理解题，还有一半是英文智力题，不难，就是考察一些逻辑思维和几何什么的。&lt;/p&gt;&lt;p&gt;经过了笔试Infosys就会通知你去公司面试，在浦东软件园。很远就可以看见Infosys的大楼，到了之后先是签到，前台小姐会发给你一个Visitor的胸卡，然后就可以进去候场了。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201106041540449114.jpg"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;候场的时候，会填写一张表单，包括你的个人信息、工作经历（如果有）、还有你希望应聘的职位（对于我们这次，都应该写软件开发实训），不过我下手比较快，ASP.NET程序员已经写上去了- -!&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201106041540522922.jpg"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;表格收上去以后就开始按照收的顺序逐个面试了。面试官有中国人也有印度人，如果只有中国人的话，可以讲中文，但如果有印度人在就一定要讲英文。至于面你的是中国人还是印度人，就要看RP了。&lt;/p&gt;&lt;p&gt;每个人的面试问题都是不一样的，不过基本可以归纳为：自我介绍、专业课知识、项目经历（如果有）。面我的是一个印度人，不过一开场没有让我自我介绍（可能是因为简历上有），直接开始问我技术问题（全英文的，回答也是全英文的）。但是印度人的口音我不太习惯，他说的很多话我都要听2、3便才知道在讲什么。&lt;/p&gt;&lt;p&gt;他主要问了我以前的项目经历。&lt;/p&gt;&lt;p&gt;&lt;b&gt;我摘录一部分对话（当然，现场是全英文环境）：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;font color="#006400"&gt;面试官：谈谈你的项目经历，主要用什么技术做的？&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#006400"&gt;我：我主要是做ASP.NET网站项目，高考以后我自学了.NET及HTML,CSS技术并且开始做我的个人网站……（以及我后来是如何参与杉达的CMS项目组，如何接受训练、如何多次进行代码重构的，最后谈到了三层架构）&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;font color="#006400"&gt;面试官：那么三层架构包括什么？每一层的作用？多层架构的设计有什么好处？&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#006400"&gt;我：比如你去银行取款，如果是一层架构的，就好比你去银行的金库直接拿钱。金库好比数据库…… 如果是多层的，那前台接待处，你填的单子就还比是表现层，负责获取用户数据……（给他列举了银行的例子，当年Simon Chang老师也是这样教我们的，我一直很崇拜张老师，能把枯燥的知识用如此生动的比喻讲清楚）&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;font color="#006400"&gt;面试官：你的项目里用到了哪种数据库？&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#006400"&gt;我：任意数据库都可以，因为是多层架构，数据库的改动只需修改DAL……（一大堆理由）&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;后来还问了些OOP的基本常识：&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;font color="#006400"&gt;面试官：大学里最感兴趣的课是什么？&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#006400"&gt;我：C++。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;font color="#006400"&gt;面试官：C++是不是面向对象的编程语言？其他OOP语言有哪些？&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#006400"&gt;……（省略）&lt;/font&gt;&lt;/p&gt;&lt;p&gt;后来他还问了面向对象的程序设计语言是怎样的？继承机制、多态、接口……？我都很顺利的一一作答了。这些问题确实比较基础，没什么难度。&lt;/p&gt;&lt;p&gt;除了这些专业问题，面试官还会扯些别的话题，比如他看到我是预备党员，他就会问些我在政治上的想法等等，还有平时喜欢看什么书？中国的考试制度是怎么样的？……&lt;/p&gt;&lt;p&gt;其实我准备了很多东西，结果都没有问道。比如C++及底层开发的知识，也没有问值类型、引用类型的区别之类的问题，数据类型、装箱、拆箱也没有问。总之感觉就是面试还是比较活的，问的问题很大一部分是根据你简历上写的来的（也是要确保你简历的真实性）。而且一个问题往往是接着上一个问题的进一步发展，也就是说，&lt;font color="#FF0000"&gt;如果是书呆子去面试，是没用的，人家一问就知道你是不是真正理解、是不是有过项目经历，还是只背了书上的东西，只知道表面。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;其他同学的面试题似乎也不难，最多就是要写算法，比如给你一个无序的数组，要你用冒泡排序；给一张表，写个SELECT语句什么的，其实就是在考察你专业课知识的掌握程度。&lt;/p&gt;&lt;p&gt;第一轮面试结束以后，部分人还要去第二轮面试（就是HR面试），HR会问你一些工作上可能碰到的问题，你如何去应对等等。你也可以和HR交流，包括工资、工作地点、工作时间以及你自己对岗位的想法。&lt;/p&gt;&lt;p&gt;总而言之，我感觉Infosys的面试还是一般性的，不会很变态。如果你对自己的专业知识及英文水平有信心，应该是没有什么问题的。:D&lt;/p&gt;&lt;font style="font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;</description><pubDate>Sat, 04 Jun 2011 15:32:27 GMT</pubDate></item><item><title>JavaEE生成简单验证码</title><link>http://www.wyjexplorer.cn/Blog/View/4D3088EBEFE5AD41.html</link><description>&lt;p&gt;这些代码源自J2EE课上的作业。觉得比较有代表性，对初学者有用，所以放上来了。每一次的作业答案，我会发布在我在博客园的博客上（http://www.cnblogs.com/wyjexplorer/）,这里就不重复发布了。大家可以参考。当然，这些都是我个人的参考答案，不一定是最好的～&lt;/p&gt;
&lt;p&gt;验证码生成及保存Session，生成的是4位英文+数字，已去除易混字符&lt;/p&gt;
&lt;pre class="brush: java;"&gt;
import java.io.IOException;
import java.io.PrintWriter;
import java.awt.*;
import java.util.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//*=======================
// Validate Code Example
// f08023123 wyjexplorer
// Last Update: 20110509
//*=======================

/* This servlet Generates Validate Code */
public class ValidateCode extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("image/jpeg");
		BufferedImage img = new BufferedImage(50, 25,
				BufferedImage.TYPE_INT_RGB);
		Graphics g = img.createGraphics();
		g.setColor(Color.DARK_GRAY);
		g.fillRect(0, 0, 140, 25);

		// Generate a random code
		// String validateCode = CreateRandomCode(4);
		String[] chars = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
				"B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N",
				"P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
		String validateCode = CreateRandomCode(4, chars);

		// Save this code To Session
		HttpSession session = request.getSession();
		session.setAttribute("validateCode", validateCode);

		// Create Image
		g.setColor(Color.WHITE);
		g.setFont(new Font("Tahoma", Font.PLAIN, 16));
		g.drawString(validateCode, 5, 20);
		//for (int i = 0; i &lt; validateCode.length(); i++) {
			// ** problem with i * 11.5, the parameter must be integer.
			
		//}
		// GC
		g.dispose();

		// Set cache mode to no-cache so as to force the browser to always
		// reload
		// a new validate code image
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);

		JPEGCodec.createJPEGEncoder(response.getOutputStream()).encode(img);
	}

	// Create an n-char[0-9] string.
	private String CreateRandomCode(int n) {
		String code = "";
		Random rnd = new Random();
		for (int i = 0; i &lt; n; i++) {
			int num = rnd.nextInt(10);
			code += num;
		}
		return code;
	}

	private String CreateRandomCode(int n, String[] charset) {
		String code = "";
		Random rnd = new Random();
		for (int i = 0; i &lt; n; i++) {
			String ch = charset[rnd.nextInt(charset.length)];
			code += ch;
		}
		return code;
	}

}
&lt;/pre&gt;
&lt;p&gt;验证码使用：&lt;/p&gt;
&lt;pre class="brush: java"&gt;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//*=======================
// Validate Code Example
// f08023123 wyjexplorer
// Last Update: 20110509
//*=======================

/* This servlet demostrates the useage of
 * the validate code generated by ValidateCode.java 
 */
public class Process extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		
		//Read Validate Code From Session
		String sessionCode = (String) request.getSession().getAttribute(
				"validateCode");
		
		//Get User Input Code
		String userInputCode = request.getParameter("vdc");
		
		if (userInputCode == null || "".equals(userInputCode)) {
			request.getRequestDispatcher("Error.jsp?errType=0").forward(request, response);
		} else {
			if (sessionCode.equals(userInputCode)) {
				request.getRequestDispatcher("main.jsp").forward(request, response);
			} else {
				request.getRequestDispatcher("Error.jsp?errType=1").forward(request, response);
			}
		}
	}

}
&lt;/pre&gt;
</description><pubDate>Thu, 12 May 2011 18:19:21 GMT</pubDate></item><item><title>今天写代码的时候发现微软坑爹彩蛋一枚！.NET程序猿伤不起啊～</title><link>http://www.wyjexplorer.cn/Blog/View/7A6C7FEAFDFAC42C.html</link><description>&lt;p&gt;刚才调个程序，因为细节问题没成功。习惯性地把鼠标移到方法名称上，看看.NET Framework的注释。结果惊现了这一幕：&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201105081804178964.jpg"&gt;&lt;/p&gt;&lt;p&gt;File.Delete()方法的注释中，赫然写着：&lt;b&gt;如果指定的文件不存在，则不引发异常。&lt;/b&gt;&lt;/p&gt;&lt;p&gt;我的大脑当场就短路了，并且萨钢狗眼也又一次被刺瞎了，第一次看见这么坑爹的注释。这还不是一般的错别字或者其他语言毛病，这可是个双重否定。。。微软连失误也能这么有水平～佩服！&lt;/p&gt;&lt;p&gt;今天34度，非常坑爹，微软的这个小幽默给我乏味的Coding带来了一丝乐趣。哈哈～:D&lt;/p&gt;</description><pubDate>Sun, 08 May 2011 18:11:27 GMT</pubDate></item><item><title>教你如何备份火狐浏览器(Firefox)的插件及设置</title><link>http://www.wyjexplorer.cn/Blog/View/4555F1FEF0B2236E.html</link><description>&lt;p&gt;使用火狐的用户经常会安装自己喜欢的插件，并随心所欲更换界面、更改设置。这也是火狐的特色之一，可以打造最适合自己的浏览器。&lt;/p&gt;
&lt;p&gt;然而，现在很多人不止拥有一台计算机。如果要再别的电脑上再安装一遍插件，并逐个调整设置，是非常麻烦的事。可惜火狐本身并没有提供插件备份的功能。最新版的火狐4也只是同步个人设置和书签而已。&lt;/p&gt;
&lt;p&gt;下面我就教大家如何备份一切东西的办法（包括插件、个人设置、书签）&lt;/p&gt;
&lt;p&gt;首先，在火狐的地址栏中输入about:support，会打开如下界面。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/201105062008331507.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;点击“打开所在文件夹”按钮，会弹出一个资源管理器，并且定位到你当前的Profile文件夹。&lt;/p&gt;
&lt;p&gt;这个路径在Windows7中一般为：C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\随机字符串.default（XP等其他系统可能略有不同）&lt;/p&gt;
&lt;p&gt;向上两层，定位到C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/201105062011372698.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;"Profiles"文件夹和"profiles.ini"文件就是我们要备份的内容。将他们复制到目标计算机的相应位置，就完成了两台计算机之间的同步。你的一切东西，包括插件、设置等，都不用重新安装了！&lt;/p&gt;
&lt;p&gt;怎么样，帅呆了吧～&lt;/p&gt;
&lt;p&gt;另外，这种办法同样可以用于制作绿色版的火狐，拷在U盘里随身携带～制作方法可以自己Google~&lt;/p&gt;</description><pubDate>Fri, 06 May 2011 20:23:38 GMT</pubDate></item><item><title>不敢承认错误，是懦夫的表现！</title><link>http://www.wyjexplorer.cn/Blog/View/CDB83497638F0105.html</link><description>&lt;div id="blogContent" class="text-article"&gt;

&lt;p&gt;为了避免某些障碍导致发帖失败，本文中部分词句进行了处理，但我相信大家都懂的。&lt;/p&gt;&lt;p&gt;今天早上打开电脑，习惯性地先去cnBeta看新闻，结果赫然看到从网被黒克公鸡，大量用户信息泄露的新闻。&lt;span style="color: rgb(255,0,0);"&gt;这些个，人信，息几乎囊括了你在从网上的一切资料。一旦外泄，后果不堪设想。&lt;/span&gt;我第一时间想把这篇报道转到从上，让同学们注意不要打开战内信，以免变成受害者。&lt;strong&gt;结果刚点发布，就提示我文章含有**信息不能发布&lt;/strong&gt;。瞬间刺瞎了我的萨钢狗眼。无奈，只能用短信通知了～还好，可能是因为从网来不及，或者没有这个资金和渠道去搞定通信业界，短信还是发送成功了。&lt;/p&gt;&lt;p&gt;不让发文字，这个我已经见怪不怪了。于是我便用截图的形式，成功的把日志发了出来。第一时间就广为流传。我没有直接分享cnBeta的网页，是因为我早就料到，&lt;strong&gt;这篇新闻的地址，已经被加入从网的黑名单了&lt;/strong&gt;。其后证明的确如此。&lt;/p&gt;&lt;p&gt;过了几个小时，我的萨钢狗眼再一次被刺瞎：&lt;strong&gt;在没有收到任何管理猿通知的情况下，我的日志消失了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我感到很生气，也感到很无奈。我发贴，只是想提醒周围的同学不要中招，并没有其他意思。而从网，大概是觉得羞耻，使用了如此卑贱的手段，删除了我的日志。如果非要按规定说话，我的日志并没有违反国家有关法律吧？这一切都是从网单方面的行为。&lt;/p&gt;&lt;p&gt;    &lt;strong&gt;后来，我再次发了篇日志、开了个相册，也都被悄无声息地删除了。而刚刚，据我所知，cnBeta的那条新闻，也已经悄无声息地删除了……&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我认为，从网的这种做法，是对用户极其不负责的。&lt;span style="color: rgb(255,0,0);"&gt;用户选择了从网，作为他们的社交网络，从网有保护用户隐，私的责任和义务，这是天经地义的。当你们绞尽脑汁诱使用户走入你们精心策划的收费陷阱时，你们是如此的重视，收费环节毫无差错（我就不爆那些见不得人的内幕了）。&lt;strong&gt;而当你们的服务出现问题时，却一个劲地回避，不仅没有道歉、没有赔偿，还要封用户的口？！&lt;/strong&gt;你们还心安理得地继续捞钱？！作为国内最有影响力的SNS网站，你们就是这样带头的？！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;我也知道，删我贴的管理猿，也是接到上级的命令，不得不去执行。但我想问问你，你的内心是否还有底线？你是否还有作为一个人，仅存的道德感和良知？你是成人了，应该有自己的是非观和判断标准。&lt;span style="color: rgb(255,0,0);"&gt;你为了保住你的饭碗，低下头，做着邪恶势力的帮凶。这钱，你赚的心安理得？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;借用陈哥的话：人，不可以无耻到你这样的地步。&lt;/p&gt;&lt;p&gt;犯错不可怕，可怕的是不敢面对自己的错误，不敢去弥补别人的损失。这是懦夫的行为！可恨，可耻！&lt;span style="color: rgb(255,0,0);"&gt;&lt;strong&gt;回避不仅解决不了问题，反而会让受害者更加愤怒！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;如
果我发的东西，确实是有悖D和国家的，那你可以删，我不会怪你。但这次，请你摸着自己低贱的良心说说，我哪里不对？也许你已经没有良心了，只能摸着自己的
鸡鸡说话。也许你没有鸡鸡，只能摸着咪咪说话。但如果你做的亏心事多了，恐怕你的下一代不会有鸡鸡，也不会有咪咪了，甚至连菊花，都没了……我对此表示惋
惜。&lt;/p&gt;&lt;p&gt;一个企业的成功，不是看你能骗多少钱，而是看你能为用户创造多少价值，让用户体验多少便利。为什么我们喜欢国外的产品和服务？再贵也愿
意花钱买？因为外国人做产品，不仅仅是为了赚钱！iPhone如此，Facebook如此，魔兽世界也是如此。那些自认为爱国的人们骂我们崇洋媚外，是
的，我们崇拜的，是外国人认真负责的态度，是专心致志的精神。&lt;/p&gt;&lt;p&gt;道理我不多说，大家都是大人，都明白。&lt;span style="color: rgb(255,0,0);"&gt;我们作为普通用户，我们不像你们那么有钱，有权，有背景，可以搞定cnBeta，可以随意清理对自己不利的言论。我们的爸爸不是李刚，我们做什么，也无济于事，我今天写这篇文章，也会成为你们茶余饭后的笑料。&lt;strong&gt;作为屁民，连自己的权益，都不能去维护，也不敢去维护，这是多么讽刺？！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;曾几何时，当你们还是那个单纯的“校内网”的时候，是用户养活了你们。用户数量的扩大证明你们很出色，于是，你们就不知道天高地厚了，从网的名字在恶心中反映出了你们的野心（当年你们改名的时候，我写的关于从的日志也遭遇了你们的毒手）。可是你们知道吗？&lt;strong&gt;你们今天的一切，都是用户赐予的。你们以为自己有庞大的用户群，就可以为所欲为？你们以为丢失几个用户不痛不痒？不要忘了，正因为有如此多的人相信你们，你们就更应该对用户负责！&lt;/strong&gt;而你们如今的自大铸就了不可磨灭的罪恶！这罪恶的双手你们该如何洗清？要不要买瓶妇炎洁让你洗洗？！&lt;/p&gt;&lt;p&gt;唉，为什么，在中国，开头再美好的东西，也禁不住金钱的诱惑呢？百度如此，腾讯如此，360也是如此……&lt;/p&gt;&lt;p&gt;我
只想请你们能够正确处理这件事，不要让本来就不可饶恕的错误变本加厉。如果你能正确面对自己的错误，敢于出来向大家道歉，或许，还可以挽回一部分用户的信
任。如果你们没有这个觉悟，还是一个劲地回避、一个劲地靠删东西来镇，压我们，那我表示失望和惋惜。只能用中国人处理事情的老方法来对付你：我谴责你，我
强烈谴责你！&lt;/p&gt;&lt;p&gt;以上文字纯属电脑中毒后自动发出，与本人无关，某些人请勿害怕，请勿心虚。&lt;/p&gt;&lt;p&gt;最后。贴上免疫BUFF：&lt;/p&gt;&lt;p&gt;毛主席万岁！！！&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104301946321473.png"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104301951174719.png"&gt;&lt;/p&gt;&lt;p&gt;[2011年5月3日更新]&lt;/p&gt;&lt;p&gt;1.朋友博客的相关文章：http://huashengwang1989.wordpress.com/2011/04/30/renren-xss/&lt;/p&gt;&lt;p&gt;2.新闻：索尼就黑客袭击事件向用户道歉(http://www.cnbeta.com/articles/141570.htm)&lt;/p&gt;&lt;p&gt;&lt;span class="replycontent"&gt;面对同样的事件，同样的用户信息泄露。这就是索尼公司，和从网的区别！中国人从本质上就已经输给国外了！！！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="replycontent"&gt;为了避免索尼新闻莫名其妙消失，特地截图保存：&lt;img src="/Uploads/201105030831004484.png"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="replycontent"&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;font style="font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;&lt;font style="font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;&lt;font style="font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;</description><pubDate>Sat, 30 Apr 2011 15:57:15 GMT</pubDate></item><item><title>人人网分享接口</title><link>http://www.wyjexplorer.cn/Blog/View/FE90E0CCA9963D1C.html</link><description>&lt;p&gt;现在很多网站都有分享到人人、开心的功能。其实很简单。只要使用人人网提供的接口就可以了。&lt;/p&gt;&lt;p&gt;人人网有3种分享接口。我介绍最简单的一种。&lt;/p&gt;&lt;p&gt;首先去http://widget.renren.com/?widget=freeshare定制一个你喜欢的按钮样式。注意“链接设置”选择当前页面。&lt;/p&gt;&lt;p&gt;然后下面的文本框中会给出你代码。只要把这段代码插入你的网页就可以了，例如我网站的日志页面：&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104240937182364.png"&gt;&lt;/p&gt;&lt;p&gt;然后再访问这张网页，就可以看到你定制的那个分享按钮了。如果你当前是登录在人人网上的，点击分享就可以直接把你当前浏览的网页分享到你的人人主页上。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104240940263752.jpg"&gt;&lt;/p&gt;&lt;p&gt;如果没登录也不要紧，它会先让你登录的。&lt;/p&gt;&lt;p&gt;但是要注意。如果你的网站是采用AJAX技术、或是URL经过处理的，那就不一定能分享成功了。因为这个接口读取的，是当前网页的地址，即你浏览器地址栏里的地址。AJAX等技术，往往是地址不变，只变网页内容，这样的话读取出来的就是错误的地址。你的分享的和你看到的不是同一个页面～&lt;/p&gt;&lt;p&gt;所以，这个接口目前只适合固定地址的网页～&lt;br&gt;&lt;/p&gt;</description><pubDate>Sun, 24 Apr 2011 09:44:08 GMT</pubDate></item><item><title>WOW，记忆中的那些欢笑与泪水（完结篇）</title><link>http://www.wyjexplorer.cn/Blog/View/B58F1435C68A891E.html</link><description>&lt;p&gt;那会儿，我的GS还不够进ICC。没人组我，只好找找10人的声望队。一天早上，一只叫“右半边的羽翼”的牧师在喊声望队来T，我就顶着我那只小脆
熊过去了。和我们一起刷声望的其他人，很多也是因为副本没人组，无奈才过来，所以大家都没有经验，只能开YY打。时不时有人踩到陷阱、ADD到小怪……。
就这样，为了拿到MT的戒指，我一路辛苦地承受着。&lt;/p&gt;&lt;p&gt;她的DK号叫做随波心动，不太说话，一开始我以为他也是宅男。后来听了YY的声音才发现她其实是只妹子，人也不错，她比我大，是姐姐级别的。我和她刷了好长一段时间的声望团，终于拿到崇拜声望的戒指了……&lt;/p&gt;&lt;p&gt;ICC
开了以后，每天可以排随机副本，赚2个冰牌子。如果有T或者奶天赋的话，副本可以秒排。所以我经常带着小J去打随机。渐渐地，我养成了一种习惯，每次上
WOW第一件事，就是看看好友列表里小J是不是在线，然后组她一起去打日常。这是除了公会活动以外，唯一能和她在一起的办法。&lt;/p&gt;&lt;p&gt;打这些副本也
不在于什么体验，都是为了牌子，基本上十几分钟就碾压完了一个本。不过对我来说，能和她在一起，就算是每天短短的十几分钟，就算只是为了牌子而打个副本，
也已经满足了。就算大部分时间，和她走在一起的人不是我；就算好友栏里，他们的地点总是一样；就算他们是一起上线，一起下线；就算YY的某处加密频道里总
是有两个人……&lt;/p&gt;&lt;p&gt;她想要刷白鸡坐骑。我听说她曾经同时开出凤凰和白鸡，但都被别人R走了。那天她带我来到奎尔丹纳斯岛，这是个美丽的地方，我
虽然没有体验过70年代这里的热闹，但不难想象破碎残阳下昔日的辉煌。刷白鸡要英雄难度的魔导师平台。我作为一个TBC后，连普通难度的任务都没做过，也
进不了英雄本。无奈只好日后再刷。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231059091241.png" /&gt;&lt;/p&gt;&lt;p&gt;为了能陪小J一起去，我进了普通难度的导师平台做任务。这就不得不再说说我的红手了。第一次去，虽然没完成任务，但开出了凤凰宝宝！最想要的宠物直接到手～成就和宠物一起跳～&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231059435700.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231100042356.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;我的红手确实给了我不少惊喜。当年第一次刷STSM直接摸出了瑞文戴尔的死亡战马。刷宝库，直接出了大象，96点ROLL到。唉，只可惜啊，机械路
霸这个东西是开不出来的。要载着妹子去兜地图，还是路霸比较拉风，毕竟是金钱的象征。这年头，Roll品不算什么，大象只是狗屎运，有钱永远是王道，就算
现实中没钱，游戏里也得有钱，有了钱，才有门，才可以让现实中的人千里把B送（鸡舞团玩家发来贺电）。&lt;/p&gt;&lt;p&gt;话题说回来。后来魔导师平台的任务在XB的帮助下终于完成了。之后我们经常去帮小J刷这个副本。但大概是因为人品值不够，总是不出白鸡。我陪她去的最后一次又出了个凤凰宝宝，还算没有白来……&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231100392616.png" height="360" width="720" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231101369316.png" /&gt;&lt;/p&gt;&lt;p&gt;再来说说活动。死神公会不开TOC活动以后，就只有开荒25ICC一个活动了，这也是杯具的开始。我们的小公会总是很难准时组满人，每次活动也就等
于便当前4，没开BUFF前，一直都是前4，还不如外面的野团。渐渐地大家都失去了信心。后来活动就越来越难组人了，好几次都只能记一个集合分和结束分然
后解散。&lt;/p&gt;&lt;p&gt;要说原因，大家心里都清楚，但有些问题始终改不掉。我依旧是没资格去评论人家，我不是WOW老玩家，我也不是公会老成员。我说的话不是被无视，就是被鄙视，要么是被当笑话……&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231101588141.png" /&gt;&lt;/p&gt;&lt;p&gt;好几次我都想退会，甚至转服回去。我同学也一直劝我不要在这个没希望的公会呆下去了。但只有我自己知道，我为什么还没放弃濒临灭绝的希望……&lt;/p&gt;&lt;p&gt;其实，每个MT都有一个想要保护的人。我知道这句话放在我身上有些讽刺，现实生活中我什么也不是，我什么也做不了，我可笑，我没资格，我没经验，我不成熟，
我甚至没有一张能说会道的嘴，也不懂得如何去照顾别人。我只想，在虚拟的世界里，能够找回一些已经被现实所遗弃的东西。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231106144367.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;诺森德的冰雪不曾让我感到寒冷，冰冠堡垒的亡灵也未曾让我恐惧。唯有来自内心深处的声音才让我真正心寒。本想玩个游戏而已，没想到却深陷其中。这大概就是CCAV所说的沉迷吧。是的，我沉迷了，沉迷的不是装备、不是等级、不是G……&lt;/p&gt;&lt;p&gt;我有时候真恨我自己为什么那么忙、事情那么多，不像别人那样总是有时间打WOW，不仅有时间玩自己的号，还有时间帮别人上号，可以帮别人打G团、做任务、跑
成就。别人可以整天开着YY，和各种妹子聊天，忙得不可开交，过着看似颓废的生活，而得到的却要比我实际的多。而我所忙的那些事情，或许可以给我带来名誉
和荣耀，但光环的背后，又有什么呢？&lt;/p&gt;&lt;p&gt;后来，公会活动改时间了，我也没办法再参加活动了，这次，我终于可以安心离开了。离开，这个本不属于我的地方。再次回到，没有她的地方。我本不属于这里。&lt;/p&gt;&lt;p&gt;传送到月光林地，我见到了我的德鲁伊训练师，这次我不是来学习法术的，他已经教给了我所有德鲁伊法术。我更想和他谈谈人生，但他什么也没说，总是静静地站在这里，作为游戏中的NPC，他能做的也就那么多了。留下的问题，只能让我自己来冥想。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231102414653.jpg" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;永夜港依旧是那样的宁静，艾露恩的月光下，有一种远古的智慧，让人沉思生命的意义。我们的人生就像向日葵那样，永远向着太阳，直到夜晚才低下头，那时候才
是真正的自己吧。望着月神湖上泛起的点点星光，我意识到，我不该帮这个世界有太多瓜葛，也许这就是自然选择的结果，也许真的像那次聚会上人家讥讽我的一
样：德德啊，今天来的这些人都和你无关。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231103082733.png" /&gt;&lt;/p&gt;&lt;p&gt;我追求着的，忙碌着的，突然变的那样虚无。什么装备、GS都只是伪装，什么成就、坐骑都只是虚荣。为什么这个世界是那样不公平？我们劝自己想开点，也只不过是弱者在假装让自己坚强。外表越坚强，内心越脆弱。逃避吧。我只想回归属于自己的翡翠梦境中，原始而纯净……&lt;/p&gt;&lt;p&gt;晚上，来到奥格瑞玛，还是在这个地方，给这里值得交往的那些朋友写最后一封信，包括小J，但我知道收到信件的往往不是她本人，有时真够讽刺的。在这浮华的年代，还有多少人会去写信呢？&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231103274934.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231103527901.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;我想起了几天前在幽暗城碰到的一个血精灵小姑娘，她正专心冲着商业技能，我免费带她刷了几把血色，然后给了她学技能和买坐骑的钱，这对我来说不算什么，无非就是每天收入的零头，然而对于一个小号已经是很多了。转服前一天的晚上，我收到了她的信，只有短短的一句话，却让我心头感到无比温暖。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231104166196.png" /&gt;&lt;/p&gt;&lt;p&gt;唉，现在还有多少人，愿意帮助一个不认识的人呢？你们说我无聊也好，说我烧点卡也好，说我神经病也好，我只是想帮助一下刚玩WOW的小号，因为我体
会过当年练级的时候的艰辛。我不像你们，我不是妹子，没人会包养我，我不是人民币玩家，不花钱就没人肯带。大号们都忙着打G团、开YY调戏妹子，谁高兴去
为一个不认识的小号花时间呢？当你们使劲掐算着DPS，无情地踢掉团队里和你并肩作战的队友，分着他们的钱时，我觉得你们已经和奴隶没什么两样了！你们为
了点钱，在YY里那兴奋的叫声，真让人感觉恶心！在这个认GS不认人的时代，你们所谓的快乐，大概只有金钱和装备了！还有那些拜金女，只要有肯包养，就是
好男人吧？在现实中你们做不到的，在这里都让你们实现了，冷笑。难道你们想让这个世界，也在你们手中变得和真实世界一样冷酷，一样让人厌恶吗？&lt;/p&gt;&lt;p&gt;城里依旧人来人往，灯火下一个个忙碌的身影，依然对周围不屑一顾。我来到银行门口，还是那个邮箱旁。记忆的片段又一次浮现在我眼前。那两个，为了友情，曾经站在这里跳舞的身影……&lt;/p&gt;&lt;p&gt;正好，随波也在奥格瑞玛。我把她喊来。然后，送给她最后的礼物，就像芒果一刀当年对我做的那样……&lt;/p&gt;&lt;p&gt;她
给了我一颗赤玉石。我将它和那11条美味风蛇一起，永远存在银行里。以后再苦，再穷，我也不会卖掉这两样东西。它们是无价的。昨天看了《我叫MT》第4季
的第4集，呆贼的那块白字盾牌，一个朋友的纪念。我想，许多年后，当这颗赤玉石变的不值钱的时候，我依然会保留，这一份纪念。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231105208207.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104231104592522.png" /&gt;&lt;/p&gt;&lt;p&gt;“珍贵的东西，就是让你舍不得丢的东西”……&lt;/p&gt;&lt;p&gt;能够在这不幸的时代认识一些值得交往的朋友，也是我的幸运吧。&lt;/p&gt;&lt;p&gt;然后，下线，办理转服。按下转服按钮的瞬间，不知道是感到解脱的快乐，还是感到不舍的叹息。&lt;/p&gt;&lt;p&gt;（完）&lt;/p&gt;</description><pubDate>Sat, 23 Apr 2011 11:07:18 GMT</pubDate></item><item><title>WOW，记忆中的那些欢笑与泪水（下）</title><link>http://www.wyjexplorer.cn/Blog/View/436FF1E3EAC18305.html</link><description>&lt;p&gt;还是接上篇。&lt;/p&gt;&lt;p&gt;我GS有4000之后，大带我去打了次TOC。也就是当年老大每天晚上都要打的那个本，其实看都已经看腻了。我不太喜欢这个FB，但为了提升装备，必须去打。当时那个团已经基本是无需求了，所以只要我能用的东西都是我的了，所以我4000进的本，4300出的本。第一次打
这个还蛮开心的。不过毕竟是第一次打，做的水事也不少。开打之前大帮我说，千万不要被冰吼撞死。后来我的确没有被冰吼撞死，因为在冰吼出来前，我就已经死了……&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104072133003958.jpg" /&gt;&lt;/p&gt;&lt;p&gt;其实80之后，我也没在大的服务器玩多长时间。那时候我也不满足活动的条件，练呆也没什么意思。正巧那会儿，我的一个小学同学（美女哦）找我修电脑，闲聊中我了解到她和她的服还有她的公会都不错，而且公会缺德（缺少德鲁伊职业），于是，为了一个错误的决定，我转服了 …&lt;/p&gt;&lt;p&gt;刚转过去的时候挺鸡冻的，第一次和认识的小姑娘一起WOW，我曾经充满希望与愿景……&lt;/p&gt;&lt;p&gt;曾
经天真的以为可以有人一起陪我奔向还未走完的地图，一起去看风景，一起去感受一些装备和等级以外的事情，后来才知道，这些我认为的美好与有爱，在别人眼中
都是闲着蛋疼，我也不知道，为什么大家眼中的游戏，只有G、装备和GS？一个个活生生的人，在他们眼中，只剩下一堆数字而已。剧情、任务、朋友、团队对他
们来说可能毫无意义，唯一能勾起他们兴趣的，就是你是不是个女玩家。唉，不知道是什么让WOW变的那么无情……&lt;/p&gt;&lt;p&gt;最后，我还是孤独一人完成了探索者成就。终归，还是寂寞到底了。也算是一种体验吧。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104072134097235.png" /&gt;&lt;/p&gt;&lt;p&gt;新公会远远不如以前的以太空间大，而且我加入的时候，已经不是他们的鼎盛时期了，一开始就有点失望。当时每个礼拜的活动是TOC+黑龙，因为时间问题我也只能打一个TOC。&lt;/p&gt;&lt;p&gt;第一次在那个服碰到Justwee（美女同学，小J）是在达拉然，晶格森林上空的魔法城市。她是个亡灵女盗贼，其实我并不怎么喜欢亡灵这个种族和盗贼这个职业，后来我听说美女都控亡灵和母牛，看来是真的……&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104072134509389.jpg" /&gt;&lt;/p&gt;&lt;p&gt;会长叫芄寶香槟（简称XB），是只血精灵女猎人，和小J关系不错。一开始我以为他是个女生，我想小J能有这样的好姐妹一定很开心。但现实是惨烈的，往往血精灵妹子号的背后都是饥渴男。我喜欢在WOW里亲血精灵妹子，现在想起来真有点疙瘩，不知亲了多少个男人了……&lt;/p&gt;&lt;p&gt;我
的MT装备不太好，主要靠的是鸟德。当年鸟德也就4000多的GS，每次跟公会团活动，DPS排名永远在13、14，出去打G团都不一定分的到G，所以我
很早就准备放弃鸟德了。有一天XB和小J组我去刷个YXSL，给我黑一把抽髓长枪。这把MT武器在以太的时候见过一次，被丁同学R走了，之后就再也没见
过。没想到这次去刷竟然出了！拿到武器之后，终于可以做个5人小副本的T了，当时那个鸡冻啊！后来这把武器陪伴了我很长时间……&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104072135273820.png" /&gt;&lt;/p&gt;&lt;p&gt;T装是挺难搞的，有时候不得不花G来买，我的G可都是辛辛苦苦赚来的纯手工G，花出去的时候心都在流血。真羡慕有些人，不仅G来的容易，装备提升也很快，其他东西，比如任务啊、成就啊，也做的非常快，最后我发现，他并不是一个人在战斗……&lt;/p&gt;&lt;p&gt;而MT就没有这样的好事，只能自己在外面过苦日子每天起早摸黑，跑地图日常赚G，为的就是能买下AH里几件天价T装，早点满足进本的资格，能有一个属于自己的位置。&lt;/p&gt;&lt;p&gt;其实，黑G、黑装备，以前只是听闻。不过在提瑞斯法的日子里，我就遭遇过不下三、四次。黑的，还都是我的T装，我苦不堪言啊。题服人多，黑人也多，这也是为什么题服AG门口的尸体经常连成线。有幸的时候，还能看见认识的人哦～～～而且也不是一个人在战斗哦～～旁边还有他爸、他妈、他全家。我真搞不懂，这些人
平时用着黑来的G、骑着黑来的坐骑、用着黑来的装备，心里是什么滋味……&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104072136203739.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;第一次被黑装备，是25黑龙MM，掉了个MT的披风。两只小德R的都比一只DK高，可是，就在众目睽睽之下，团长把披风X给了DK。DK马上退团炉石，临走还说了句：我说是我的就是我的……&lt;/p&gt;&lt;p&gt;之后这件披风我又连续被黑了两次……&lt;/p&gt;&lt;p&gt;世界很黑暗，WOW也一样……&lt;/p&gt;&lt;p&gt;我
的MT就是在这样的环境下，坚强地成长起来的。在5人副本练习T手法的时候，不知T死过多少人，承受过多少委屈，为的就是能有一天去T 
10人、25人副本。所以每当有人骂我水，我都很怨恨。他们眼里从来就看不到别人的努力，只会仗着自己老玩家、公会老成员的身份，来对新人指手画脚。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104072136598052.jpg" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;我第一次T的10人本也是黑龙MM。那天是和妖哥一起去的，我负责拉小龙。第一次T大副本我很紧张，之前也没有T小龙的经验，结果我站错位置，还漏拉了两只小龙，直接拍死了一只SM，然后灭了……到现在我都觉得对不起那只SM……不过他的牺牲让我学会了怎么T小龙……&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104072138369536.jpg" /&gt;&lt;/p&gt;&lt;p&gt;不久之后，ICC开了，于是大家又有新的追求了。刚开的那天，我和曼舞，还有石头的ZS一起去玩新三本。大家都是第一次打，谁都没经验，灭得非常惨烈，那
时候DBM插件也没更新，我们只能自己摸索。记得灵魂熔炉老一P2的时候，我和曼舞都被转死了；噬魂者拉红线的时候，DPS也直接把T打死了；之后打矿坑
也是惨痛的回忆，有的被炸死，有的被追死；最惨烈的是映像大厅，倒了不知道几次T了。好不容易打到逃脱LK追捕的时候，曼舞的老板来勒……这个早晨真惨烈……&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104072139423431.jpg" /&gt;&lt;/p&gt;&lt;p&gt;--------------------&lt;/p&gt;&lt;p&gt;本想这篇就写完的，但WOW是一个永远也写不完的故事。下篇继续～&lt;/p&gt;</description><pubDate>Thu, 07 Apr 2011 21:40:39 GMT</pubDate></item><item><title>让WOW不再和谐聊天内容的办法（非愚人节玩笑）</title><link>http://www.wyjexplorer.cn/Blog/View/3B2CCE633BFD7095.html</link><description>&lt;p&gt;先声明本日志内容是真实有效的，不是愚人节行为～～～&lt;/p&gt;&lt;p&gt;WOW的聊天和谐的蛮厉害的，像什么网易啊、X交、X奸什么都打不出了。最KB的是。我T，你奶。发过去是：我T，#@!%!@#。。。&lt;/p&gt;&lt;p&gt;其实呢，是有办法不让它过滤的。很久以前一直以为WOW的聊天内容过滤是在Server端的，结果发现，是在WOW客户端本身过滤的。所以客户端只要设置一下就可以了，估计很少有人注意过这个选项：&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201104012248044321.png" /&gt;&lt;/p&gt;&lt;p&gt;界面设置&gt;&gt;社交，不勾选[语言过滤器]，再勾选[禁用垃圾信息过滤]，就可以了～～～&lt;/p&gt;&lt;p&gt;不过要双方都这样设置，才可以互相不过滤。&lt;/p&gt;&lt;p&gt;祝大家游戏愉快。&lt;/p&gt;</description><pubDate>Fri, 01 Apr 2011 22:48:54 GMT</pubDate></item><item><title>WOW，记忆中的那些欢笑与泪水（中）</title><link>http://www.wyjexplorer.cn/Blog/View/282D4345E8A2D9A0.html</link><description>&lt;p&gt;接着上篇讲起。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;好不容易68级了，大告诉我可以去北极做任务了（在那之前不久开了WLK）。于是我从奥格瑞玛做飞艇来到了北风苔原。结果又是一段惨痛的回忆啊……&lt;/p&gt;&lt;p&gt;刚到北极的时候，我发现自己不能灰了！郁闷。听大说要77级才可以学寒冷飞行，而且貌似要5000G（暴雪太黑了）。于是我只能掏出当年第一次刷STSM就出的瑞文戴尔战马来用（我的坐骑运是相当的好）。&lt;/p&gt;&lt;p&gt;北极的怪物好厉害的，而且低等级过去动不动就引到3、4只，然后我就去了。任务奖励倒是挺丰厚的，经验、钱、武器至少都对得起我一次次躺地板的辛苦。&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201103272113251629.jpg" height="451" width="723" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;很早就听说60级就可以带YY了，我看看自己都已经68了，觉得刷个YY应该不在话下。正好有个朋友的小号要带，于是我就去了。然后又是一段惨烈的回忆……&lt;/p&gt;&lt;p&gt;因为我不知道YY的内部结构，所以拉怪的路线有点问题。试了几次之后，终于发现了一波流的拉法。忽然想起以前Ruby Chou带YY的时候，我们铁门外的小号是可以摸到尸体的。然后我就做了一件现在想起来都搞笑的事情：我把怪拉到城楼上面以后，直接跳了下来，在铁门那边准备杀了，我以为怪也会跟下来，没想到狼崽子们齐刷刷地脱离了……&lt;/p&gt;&lt;p&gt;那时候带YY其实也够呛的，变个熊，血不够，还得开着狂暴回复打。我发现现在不适合带YY。于是继续回去乖乖的升级。后来才知道，人家60级带YY，那是装备好，而且有附魔。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我练级是比较慢的，毕竟那时候花在WOW上的时间很少。后来也觉得练级实在是WOW里最无聊的事情之一，但毕竟要练到80。听说刷副本会很快，于是75级以后我经常去做祖达克的任务，顺便可以刷个古达克。&lt;/p&gt;&lt;p&gt;其实刷GDK也不是那么容易的，经常倒T，那时候我是喵德DPS，应急的时候可以变个熊扛一下。渐渐的我发现自己是那么有MT天赋的，也为后来的MT之路奠定了基础……&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;曾经GDK有那么一个貌似是73级的精英任务我一直没做。任务建议3人组队。当年我已经78了，应该是可以单刷了，于是我就去了。结果又是一段惨痛的回忆……&lt;/p&gt;&lt;p&gt;那是一天早上，部落很少，联盟更少。我很放心的跑到了任务点，开始搞那只10w血的精英怪。这怪也太暴力了，我把保命技能都交完了，和他一起红血，然后拼人品。终于，在我200多血的时候，把他干掉了！但是，但是！！！迎面撞见3个联盟，最前面的是一个人类圣骑士妹子，结果那个女骑士一个锤子直接把我送了回去！！！&lt;/p&gt;&lt;p&gt;这是传说中的，乘人之危啊！就算是小姑娘我也不能放过了。复活之后，我把那只骑士的姐妹都送了回去，小姑娘慌了，骑马就跑。我穷追不舍，从祖达克一路追到龙骨荒野，把她也送了回去。干脆利落！报仇雪恨啊～～～&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;要说在北极碰到联盟，那是很正常，毕竟大家的任务都在一起。不过有些联盟小号也太变态了，装备很暴力，一定是有大号扶持，或者就是TBC过来的。&lt;/p&gt;&lt;p&gt;比如有一次，在灰熊丘陵做任务的时候，本地防务里有个盗贼说自己被一只很无耻的联盟骑士杀了，要大家小心。我表示淡定，野外打架很正常。结果！我也碰到了- -!。又是一只人类圣骑士小姑娘。这年头的小姑娘都那么生猛么- -! &lt;/p&gt;&lt;p&gt;复活之后我组了那个盗贼一起做任务，这样比较有安全感。我们一直保持在可视距离以内，保证随时可以互相帮忙。做了几个任务之后，似乎没有再看到那只小姑娘，我们就放松了警惕，分头做自己的任务。然后，忽然，GRID上看到那只DZ的血狂掉，然后名字变灰了- -!。看来，他又惨遭毒手了。可怜的DZ在小地图上给我发位置信号，我果断变喵潜行，开了个人形追踪去找那只小姑娘报仇。&lt;/p&gt;&lt;p&gt;经过不懈的努力，终于被我找到她了！上去一个突袭，一顿1234 2234 3234，眼看就快把她做掉了。结果她无敌+圣疗，然后很淡定的对着我一顿1234 2234，我又去了……&lt;/p&gt;&lt;p&gt;就在我和DZ狂骂那只骑士的时候。本地防务里又传来骂声，又一只盗贼惨遭毒手了……&lt;/p&gt;&lt;p&gt;然后我们三个开始满地图找她。终于在一间很猥琐的地下室里找到她了，一起潜行过去围住她一边晕一边切，让她无敌炉石都开不出来，终于把那只骑士做掉了！太不容易了！&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;后来，经过几个礼拜的努力，终于练到80了，跳成就的一刹那无比感动啊！刚80那会儿，还有一些小不习惯。杀怪、做任务不再有经验了。原先每次下线总要找旅馆，为了屯双倍经验。现在再也不用纠结经验的问题勒。随地下线～&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;80以后第一件要做的事情当然是去PTSL。那时候我有个曾经加死过很多人的奶德天赋，为了能速度SL，只好每次都去充当奶妈。一般情况下，碰到女人就得灭了……&lt;/p&gt;&lt;p&gt;后来感觉我的奶德实在是太对不起群众了，于是洗成了鸟天赋。至少用鸟打的DPS比喵要高多了。&lt;/p&gt;&lt;p&gt;其实PTSL搞装备有点小慢，所以偶尔有时候，大会组我去搞一次YXSL。现在想想，人家看到2800GS的进了YXSL，打的还没T高，是多么的无语……&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其实我一直有个做MT的梦想。在我的小熊有2.4w血的时候，我去T了一次YXSL，非常的辛苦，好几次都差点被加死了。不过我下定决心要做一只强力的MT，再苦再累也得一点点来了～。其实那时候，大他们早就已经80很久了，装备也够打TOC之类的活动了，但我的GS太低没有资格进本，所以平时特别的无聊……&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;要说WOW里最惊喜的事情，是那天和“追风叶”重逢（上篇中提到过的带过我ZUL的小德）。&lt;/p&gt;&lt;p&gt;那时候没有开3.3.5，平时除了SL就是日常了，每天可以搞2个凯旋牌子。当年也没有随机组队系统，打日常只能自己喊人。&lt;/p&gt;&lt;p&gt;某天的日常是乌颠，我习惯性地在综合频道看有没有人开组。突然，一个熟悉的名字出现在了频道上。竟然是追风叶！这是真的么？！他竟然回来了？！&lt;/p&gt;&lt;p&gt;因为暑假之后就没见过他上线，我以为他AFK了，已经从好友列表里删除了。没想到，这一天的晚上竟然惊现了追风叶～&lt;/p&gt;&lt;p&gt;于是我第一时间组了他。&lt;/p&gt;&lt;p&gt;“我是得得吉啊！当年你带过我ZUL的！”&lt;/p&gt;&lt;p&gt;“哦，哈哈！这么长时间了，只有你记得我。”&lt;/p&gt;&lt;p&gt;……&lt;/p&gt;&lt;p&gt;“只有你记得我”&lt;/p&gt;&lt;p&gt;……&lt;/p&gt;&lt;p&gt;看到这句话的时候，我和他都沉默了……&lt;/p&gt;&lt;p&gt;是啊，WOW里遇见了那么多人，有几个是记得住的呢？当年一起带刷的其他人，或许只是快餐号，付钱享受服务，纯粹的交易关系。很多人退组的时候也不会说声谢谢或88。也许真的只有我，会把对我有恩的人当朋友，给旁边的小号套BUFF、就算没拉好，也不会骂人、进组和退组，都会和人打招呼，虽然很少有人睬我……&lt;/p&gt;&lt;p&gt;我去副本门口见到了他，他已经把当年的野德天赋洗掉了，而且当时装备也不太好。当年是他带我，而如今却是我带他。突然想起他在ZUL的风范，那只令我羡慕和崇拜的MT，如今再次重逢，却已不见当年的辉煌了。&lt;/p&gt;&lt;p&gt;“还是喜欢你当队长的感觉”我说，然后把A给了他，就像当年在ZUL那样……&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201103272115154047.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我们每个人都是从小号成长起来的，当年穿着破烂，可怜巴巴地蹲在副本门口等带刷，如今已经一身紫装了，却有多少人能够记得当年带过我们的大号呢？也许有时候，一句话，比多少G都有价值。因为有些东西，是G买不到的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;（未完待续……）&lt;/p&gt;</description><pubDate>Sun, 27 Mar 2011 21:16:41 GMT</pubDate></item><item><title>WOW，记忆中的那些欢笑与泪水（上）</title><link>http://www.wyjexplorer.cn/Blog/View/30F19306D4C6373B.html</link><description>&lt;p&gt;我玩的游戏很少，也很少玩游戏。第一个玩的真正意义上的游戏是CS，但上了大学以后很少有人陪我玩了。对于《魔兽世界》，高中时就已听说，但没有亲手玩过。于是，去年的这个时候，一时兴起，问Ruby Chou拷了个WOW客户端（已经是TBC时代了），注册了我的第一个WOW账号，开始了我的艾泽拉斯之旅。&lt;br /&gt;&lt;img src="/Uploads/201103261049011834.jpg" /&gt;&lt;br /&gt;对于WOW，最早还是有点抵触心理的。毕竟我国CCAV等新闻媒体，在污蔑和诋毁国外先进文化上，还是做的比较到位的。像什么铜须门、玩WOW自杀、他杀、杀他、抢劫、QJ、吸毒、放火之类的，一直有所耳闻。对此也比较谨慎。&lt;br /&gt;&lt;img src="/Uploads/201103261049115270.jpg" /&gt;&lt;br /&gt;然而，凡事都得自己体会过才知道。刚开始玩WOW不久，就被艾泽拉斯这样一个神奇的世界吸引了。我其实是剧情控，也是边玩WOW边了解剧情的。确实如大家所说的那样，WOW的剧情绝对是史诗级别的。从没想过，一个网络游戏，能够有这般文化底蕴。&lt;br /&gt;&lt;br /&gt;我的第一个角色，是个血精灵圣骑士。同学说那是当年的最强职业，不容易死，后来知道原来是有无敌+炉石- -!。刚开始练不久，Chou就寄给我4个16格包包（当年要5G一个），哈哈一个新手就有如此待遇。当年看看自己那几硬币，心想什么时候才能赚到1G啊。后来到了大约14级的时候，终于实现了1G的梦想。&lt;br /&gt;&lt;br /&gt;第一次下副本，是在21级的时候。那天在银松森林做任务，碰到了一只牛头人战士，组我去打怒焰峡谷（8级的本，现在想想好像没什么意义）。那时候我是水人一个，天赋乱点、输出乱按，进本之后各种Add、被烫死、被+死的。也是那时候，第一次知道什么是T，什么是奶，什么是DPS。&lt;br /&gt;&lt;br /&gt;打着副本很辛苦，总是走走停停的。但我第一次感到，和大家在一起的快乐，第一次有如此的团队精神。这种快乐和友谊，是我在现实生活中从没体验过的。现实带给我的，只有痛苦、冷漠和虚伪！&lt;br /&gt;&lt;br /&gt;然而，因为种种原因，那个QS号最终在45级的时候废掉了。那时正好屯满100G，后来全部寄给了Chou。（不久后他很杯具的被盗号了，包括我的100G在内都没了- -!）。&lt;br /&gt;&lt;img src="/Uploads/201103261049408120.png" /&gt;&lt;br /&gt;&lt;br /&gt;然后到了老大（下面简称“大”）的服（一区•基尔罗格）开了只牛头人德鲁伊，也就是我现在的号。第二次练级就要顺手多了，每天半快餐半任务的升级。其实牛头人的出生地，莫高雷大草原，是我最喜欢的地方之一。初期任务的时候感觉心情很舒畅。&lt;br /&gt;&lt;img src="/Uploads/201103261052561374.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;记得暑假里第一次去ZUL升级，带我的是一只名叫“追风叶”的小德，每天下午他总是准时出现。还记得有一次他把自己刷死了，然后灭团了，呵呵。&lt;br /&gt;&lt;br /&gt;很久以前，我听大说，联盟死掉之后，对着尸体用/love表情会有成就。那时候在带ZUL的联盟也挺多的，有次追风叶刚进本，后面的联盟法师对着我们小号一个冰环+暴风雪，全部归西了。之后我们等复活。追风叶出来把那个法师还有他的骑士小号都送了回去，我立马复活，第一时间/love，果断跳成就～&lt;br /&gt;&lt;img src="/Uploads/201103261049575050.jpg" /&gt;&lt;br /&gt;&lt;img src="/Uploads/201103261050088928.jpg" /&gt;&lt;br /&gt;ZUL毕业以后，很少看到追风叶上线了，大概是AFK了。之后随着等级的提升，我也结实了很多新的朋友。比如字母贼、DIY等，都是很有意思的朋友，在一起很快乐。&lt;br /&gt;&lt;br /&gt;第一次英雄救美是在WOW里的。50多级的时候，有一天早上在菲拉斯做任务，正好路过一个猩猩洞，看见一只血精灵小姑娘正在被猩猩群殴，果断冲锋上去帮她把怪杀了。然后和那只牧师妹子聊了起来，也是第一次和小姑娘聊的那么起劲。然后她带我到冬泉谷做任务。那天的冬泉谷飘着皑皑的雪花，淡紫色的世界是那么安静。我杀怪，她加血，一起把冬泉谷的任务做完了。那天真的很快乐。现实中没有的快乐。&lt;br /&gt;&lt;br /&gt;后来牧师妹子说她想带朋友YY去，我劝她别去，可是小姑娘就是任性啊。后来陪她一起去了YY。结果她一个区的怪都没拉完就躺了……&lt;br /&gt;&lt;br /&gt;再后面也发现她很少上线了，原来她只有初三了，要准备中考。不过初中小妹妹玩魔兽世界是有点早。&lt;br /&gt;&lt;img src="/Uploads/201103261050339265.png" /&gt;&lt;br /&gt;&lt;br /&gt;记得在STSM的时候，身旁的另一个小号看见我没有公会，就直接邀请我了。于是我便第一次有了公会。但因为是小号，所以没怎么和工会的人一起玩过。&lt;br /&gt;&lt;br /&gt;60多级的时候，我去外域的赞加沼泽做任务。这是一片迷人的蓝色世界，在这样的环境下做任务感觉心情很舒畅。可是，突然一只联盟DK从天而降，把我送了回去- -! 复活后我继续我的任务，结果又被同一个人送了回去- -! 再复活，好不容易做完了任务，去交的时候，又碰到了这个联盟- -! 之后很杯具的发现，交任务的NPC也已经被他做了- -! &lt;br /&gt;&lt;br /&gt;后来，每次到赞加沼泽都有点心理阴影……&lt;br /&gt;&lt;img src="/Uploads/201103261051098553.jpg" height="303" width="675" /&gt;&lt;br /&gt;&lt;br /&gt;有一天晚上，在纳格兰做任务，组了几个人一起做任务。突然发现地上有一只联盟！我们5个从天而降，把他送了回去。心里窃喜，第一次亲手杀联盟的感觉真爽。然后我们边任务边守他。我变猫潜行，开了个人形追踪找他，其他人在天上守，他逃也逃不掉。可怜的小联盟，被我们杀了3次。&lt;br /&gt;&lt;br /&gt;后来，每次去纳格兰都有些高兴……&lt;br /&gt;&lt;br /&gt;后来万圣节的第一天，我突然发现幽暗城门口出现了一只巨型南瓜。在观赏南瓜的同时遇到了&lt;以太空间&gt;公会的字母贼，也就是大的那个公会，我表示我很想加入一个强力公会，他便同意了。万圣节那会儿我已经快满级了，猫德+奶德天赋，于是大他们带我去打了无头骑士。这是我第一次做节日任务。&lt;br /&gt;&lt;br /&gt;有一天去AH买了3组亚麻布，出售者叫做“芒果一刀”，然后乍一看，身旁的一个亡灵盗贼正是芒果本人。于是就聊了起来，慢慢的也成为了好朋友。他给我的印象特别深刻，因为他是一个特别重友情的人。当时他好像是50多级，练级过程中有些精英任务打不过，我有空的时候也一直帮他做，他心存感激，但是小号也不能为我做些什么事。其实我无所谓要不要什么回报，我在魔兽世界里帮助过很多人。一般，听到别人一句“谢谢你”，我也就很高兴了。&lt;br /&gt;&lt;br /&gt;后来有一天，他突然叫我去奥格瑞玛，说有东西要给我。我很好奇，来到奥格瑞玛银行门口，他交易给我了3条“美味风蛇”，我不知道这有什么用。&lt;br /&gt;&lt;br /&gt;“吃它”&lt;br /&gt;&lt;br /&gt;于是，我们一起变身了！他开始跳舞，我也跟着他手舞足蹈……&lt;br /&gt;&lt;br /&gt;不知为何，在那一刻，我忘却了奥格瑞玛的喧嚣，忽略了身边的熙熙攘攘的人群，我听不到任何嘈杂，只有眼前简简单单，最纯真的友情。&lt;br /&gt;&lt;br /&gt;后来，越来越少看到他上线了。过了段时间，他又邮寄给我了9条美味风蛇，收到这些东西，依然是在奥格瑞玛的银行门口，然而人却不在了……&lt;br /&gt;&lt;br /&gt;至今，11条美味风蛇依然在我的银行里保留着。&lt;br /&gt;&lt;br /&gt;（未完待续）&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;!--以太空间--&gt;</description><pubDate>Sat, 26 Mar 2011 10:53:43 GMT</pubDate></item><item><title>飞越雷霆崖</title><link>http://www.wyjexplorer.cn/Blog/View/6FA0257D68C32A53.html</link><description>&lt;p&gt;《魔兽世界》里有很多让我们赞叹的美景，作为一个有探索者成就的玩家，我走遍了世界的每一个角落，有无数让我留恋的场景，其中莫高雷大草原上的雷霆崖是我最喜欢的地方……&lt;/p&gt;&lt;p&gt;白天：&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201103181846405787.jpg" height="418" width="722" /&gt;&lt;/p&gt;&lt;p&gt;夜晚：&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201103181847405941.jpg" height="451" width="722" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201103181849412709.jpg" height="424" width="722" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201103181850341469.jpg" height="451" width="722" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201103181851017734.jpg" height="451" width="722" /&gt;&lt;/p&gt;&lt;p&gt;特别有感觉&lt;/p&gt;&lt;p&gt;&lt;img src="/Uploads/201103181854227328.jpg" height="451" width="722" /&gt;&lt;/p&gt;&lt;p&gt;雷霆崖的月下，忘记了白昼的喧嚣，宁静的月光倒映着我一个人的孤独。&lt;img src="/Uploads/201103181855418054.jpg" height="451" width="722" /&gt;&lt;br /&gt;&lt;/p&gt;</description><pubDate>Fri, 18 Mar 2011 18:57:40 GMT</pubDate></item><item><title>从XP中提取的录音机程序，适合Windows7</title><link>http://www.wyjexplorer.cn/Blog/View/BE7F67D363B5DD69.html</link><description>&lt;p&gt;&lt;img src="/Uploads/201102271731212750.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;这个是Windows7自带的录音机。竟然只有一个录音可以点。不可以编辑声音。很多同学，包括我，还是喜欢原来XP中的录音机。&lt;/p&gt;
&lt;p&gt;我尝试从虚拟机中提取了XP的录音机程序，在Win7上竟然也可以使用。不敢独享，赶紧发上来给需要的同学下载～:D&lt;/p&gt;
&lt;p&gt;效果如下图，和XP中的一模一样（废话，复制出来的肯定一模一样）：&lt;/p&gt;
&lt;p&gt;&lt;img src="/Uploads/201102271731352056.png" alt="" /&gt;&lt;span style="color: #f1f1f1; font-size: 0px;"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/span&gt;&lt;span style="font-size: 0px; color: #f1f1f1;"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/span&gt;&lt;/p&gt;</description><pubDate>Thu, 03 Feb 2011 19:27:05 GMT</pubDate></item><item><title>VeryCD被XX了怎么办？教大家10秒钟找到下载地址！</title><link>http://www.wyjexplorer.cn/Blog/View/DCDD6DF26CE4124A.html</link><description>废话不多，否则我也要被和谐了。直接切入正题：&lt;p&gt;先来看看现在VeryCD的惨状：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20110126193142539.png" height="143" width="218" /&gt;&lt;/p&gt;&lt;p&gt;其实很方便。只要打开Google或者百度。找你要的东西。搜索结果是VeryCD网站的，就是我们要扣下载地址的了。&lt;p&gt;我以Google为例：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20110126193208546.png" height="167" width="619" /&gt; &lt;/p&gt;&lt;p&gt;然后点击“网页快照”（百度也有类似的功能）。&lt;p&gt;这里顺便说下。因为我国的什么什么，Google的网页快照系统整个都被什么什么了。如果要看Google的网页快照，必须番茄。百度不存在这个问题。&lt;/p&gt;&lt;p&gt;下一步大家都会了吧：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20110126193230737.png" height="326" width="509" /&gt;&lt;/p&gt;&lt;p&gt;可以在链接上点右键吧地址复制出来。然后粘贴到迅雷或者电驴就行了～～：&lt;p&gt;下面是社交网络720p高清的下载地址：&lt;/p&gt;&lt;p&gt;ed2k://|file|%5B%E7%A4%BE%E4%BA%A4%E7%BD%91%E7%BB%9C%5D.The.Social.Network.720p.BluRay.x264-METiS.mkv|7044051070|4787c1adb3cb26d390616576d2b598bb|h=zdf34xte3qhdu5ezhrolo4z7mxnzo43i|/&lt;/p&gt;&lt;p&gt;提醒：搜索引擎的缓存会随着时间推移而更新，很快这种方法就要失效了。所以大家要下东西的请务必抓紧时间了～&lt;/p&gt;&lt;p&gt;祝大家新年快乐！&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</description><pubDate>Wed, 26 Jan 2011 19:33:23 GMT</pubDate></item><item><title>和谐世界的那点苦乐趣</title><link>http://www.wyjexplorer.cn/Blog/View/C3F44BA623C5E800.html</link><description>&lt;p&gt;我国是和谐之国，我国的WOW也是如此，总能在和谐中带给我们乐趣。感谢国家～&lt;br /&gt;&lt;/p&gt;&lt;p&gt;相比那个目田之林、目田之手的事情大家都已经知道了。最近又发现一个给力的。&lt;/p&gt;&lt;p&gt;话说那天从AH收了一封邮件，一看，信件名字被和谐过了：&lt;/p&gt;&lt;p&gt; &lt;img alt="" src="/uploads/20110119172352552.png" height="80" width="392" /&gt;&lt;/p&gt;&lt;p&gt;我纳闷了，这是咩啊？&lt;/p&gt;&lt;p&gt;鼠标移上去一看，呵呵，笑而不语：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20110119172522131.png" height="468" width="338" /&gt; &lt;/p&gt;&lt;p&gt;后来去带XS的时候，发现血色，魔法师。也惨遭了同样的和谐。。。&lt;/p&gt;&lt;p&gt;也许国服WOW给我们这样的惊喜时，也只是会心一笑。然而这一笑，蕴含了多少无奈，多少沉重，我们无力改变……&lt;br /&gt;&lt;/p&gt;&lt;p&gt;当每一个汉语词汇都开始沦陷，当!@#$%^成为一种必要的手段…… &lt;br /&gt;&lt;/p&gt;&lt;p&gt;我只能简单的说：你懂的。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";;;font-size:0px;color:#F1F1F1"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 19 Jan 2011 17:31:45 GMT</pubDate></item><item><title>线性代数求一个排列的逆序数，C#程序及源码。</title><link>http://www.wyjexplorer.cn/Blog/View/E4BD65E7FDC79DB0.html</link><description>下礼拜就考了。
&lt;p&gt;一怒之下写了个这个，造福一下人类。以后线带作业不高兴自己算可以用这个程序来做。&lt;/p&gt;
&lt;p&gt;代码没什么含金量，就是偷懒用的，顺便造福一下.NET的初学者。我写的时候也偷懒了。没做界面，所以说DOS界面的。能用就行了。界面什么的都是浮云。&lt;/p&gt;
&lt;p&gt;使用方法：输入要求逆序数的排列，然后按回车就好了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20101224214532138.jpg" height="115" width="338" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.uudisc.com/user/wyjexplorer/file/3777958" target="_blank"&gt;&lt;strong&gt;点击此处下载程序（求排列的逆序数.exe）&lt;/strong&gt;&lt;/a&gt;
&lt;p&gt;源代码如下：&lt;/p&gt;
&lt;p&gt;
&lt;pre class="brush: c-sharp"&gt;
using System;
using System.Collections.Generic;
using System.Text;
namespace FuckMath
{
    class Program
    {
        static void Main(string[] args)
        {
            string inputStr = Console.ReadLine();
            int[] a = new int[inputStr.Length];
            for (int i = 0; i &lt; inputStr.Length; i++)
            {
                a[i] = Convert.ToInt32(inputStr.Substring(i, 1));
            }
            int count = 0;
            for (int j = 0; j &lt; a.Length; j++)
            {
                for (int k = 0; k &lt; a.Length; k++)
                {
                    if (j &gt; k &amp;&amp; a[j] &lt; a[k])
                    {
                        count++;
                    }
                }
            }
            Console.WriteLine(count);
            Console.ReadLine();
        }
    }
}
&lt;/pre&gt;
&lt;/p&gt;
</description><pubDate>Fri, 24 Dec 2010 21:47:15 GMT</pubDate></item><item><title>偷了世界的程序员</title><link>http://www.wyjexplorer.cn/Blog/View/24C833C1250D9059.html</link><description>&lt;p&gt;&lt;em&gt;这是我第一次在自己的网站上转载别人的文章。因为这篇东西实在是太精彩了，以至于在我国可能无法评论。所以请大家原谅我关闭本文评论。我相信有一天，我国不再需要“关闭评论”这个功能。&lt;/em&gt;&lt;/p&gt;&lt;p&gt;转载自：http://www.cnbeta.com/articles/129870.htm （可能稍候就看不到了）&lt;br&gt;&lt;/p&gt;&lt;p&gt;下面请看正文。&lt;/p&gt;&lt;p&gt;本文译自美国时代（time.com）的《&lt;a target="_blank" href="http://www.time.com/time/specials/packages/printout/0,29239,2032304_2032746_2032903,00.html"&gt;The Men Who Stole the World&lt;/a&gt;》，原作者：Lev Grossman。相当有传奇色彩，读起来很爽，翻译过来。译得不好，还请大家指正。本中的四个程序员可能并不是那么声名显赫，而且也很不老实，或许算不上成功，不过他们的确改变了世界。&lt;strong&gt;而本文有分析了互联网上P2P的那些事，相当的有参考价值&lt;/strong&gt;。 		&lt;/p&gt;&lt;p&gt;十年前，有四个年轻人改变了这个世界的运作方式。他们并没有使用法律或是武器或是金钱，而是使用软件来改变世界。他们当时有着激 进和极具破坏性的想  法，并把这些想法付诸于代码，在Internet上以免费自由方式发布。这四个人，没有一个完成了大学学业，却奠定了今天我们习惯的数字媒体环境的基础。  然后，因为各种原因，他们也迅速地消失在公众视野中。&lt;/p&gt; &lt;p&gt;1999年，美国东北大学的一个叫Shawn Fanning的一年级新生开发Napster，从此，成为了P2P文件共享和不需要大型机构或零售商就可以获得音乐的先锋和范例。《时代周刊》和《财富》把他放上了封面。那时，他在19岁。&lt;/p&gt; &lt;p&gt;就在同一年，一个挪威的只有十几岁的年轻人 Jon Lech Johansen，他和另两个今天都不为人知的程序员，写下了一个程序解密了商业的DVD，而他成为了全球盛名的“ DVD Jon.”，那年，他只有15岁。&lt;/p&gt; &lt;p&gt;而在1997年，Justin   Frankel，一个亚利桑那州塞多纳的18岁的黑客，开发了一个免费的MP3播放器——WinAmp，其成为了Windows操作系统上装机必备的软  件，并造就了主流数字音乐的革命。在他发布的第18个月内，1500万人下载了这个软件。而三年后，Frankel 开发了   Gnutella，一个P2P的文件共享协议，没有中心结点，不像 Napster，其不可能被关闭。目前有上百万人还在使用它。&lt;/p&gt; &lt;p&gt;2001年，Bram Cohen, 当年 26 岁，开发了一个P2P的文件传输共享协议—— BitTorrent，其以全新一流的架构全面优化了网络上大文件的共享和传输效率。 BitTorrent 也变成了整个Internet上发布大数据和文件的一个标准。&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;在   2000年代的上半段，《时代》采访了这四个程序员。那个时候，看起来他们要以数字化动乱把整个复杂的传统多媒体娱乐平台给拆除，而让对电影，音乐和电视  的收费则成了不可能。那些艺术家也将无法从他们作品得到报酬，整个娱乐业包括时代华纳也将被炸为平地。而盗版业则借机袭击了美国公司。&lt;/p&gt; &lt;p&gt;“毕竟”，我们在2003年报道到：“在整个信息经济中，不可能所有的信息都是免费的”。如果毁灭正在来临，那么， Fanning, Johansen, Frankel 和 Cohen 将是那“&lt;a target="_blank" href="http://zh.wikipedia.org/zh-cn/%E5%90%AF%E7%A4%BA%E5%BD%95%E4%B8%AD%E7%9A%84%E5%9B%9B%E9%AA%91%E5%A3%AB"&gt;四骑士&lt;/a&gt;”（译注：启示录中的四骑士传统上被解释为瘟疫、战争、饥荒和死亡）。&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;没有毁灭&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;&lt;strong&gt; &lt;/strong&gt;毁灭并没有发生。但是整个娱乐业因此而改变，而这些改变的复杂性和逐渐演进超出了我们的期望。这些发生的故  事，海盗王们的事，对于今天数字化世界正在发生的事情有非常高的参考和教育价值。Fanning, Johansen, Frankel 和 Cohen   现在都硅谷运作着自己的小的，合法的软件公司。他们现在没有在做和盗版有干系的事情——当然，如果他们真的没有。&lt;/p&gt; &lt;p&gt;Fanning，四个人中唯一一个没有回复我们的采访请求的人，他较早地退出了毁灭传统唱片业的事业。在2001年，Napster因为不堪众多关  于其协助并煽动版权侵权的法律诉论的重压，而不得不关闭。2002年，Fanning 创办了新的服务 Snocap ——   他尝试把文件共享合法化，在和相关的唱片公司合作下，Snocap 赋予消费者对其下载作品给于创作者报酬的权利。&lt;/p&gt; &lt;p&gt;但是，到那个时候，免费自由的文件共享程序像病毒一样的增涨，而用户则热衷于更换他们的音乐硬盘。他们仅在2001年8月一个月内就交换了30亿个  文件。而要从这些文件交易中收到钱是根本不可能的。是的，要和免费竞争是很难的一件事。 Fanning 创造了一个连他自己都搞不定的怪物。&lt;/p&gt; &lt;p&gt;所以，他停止继续尝试下去。 Fanning 的下一个项目是给游戏玩家的社交网络叫   Rupture，最终，他在2008年时以1500万美金把其卖给了电子艺技Electronic Arts   ——这是他的第一次发薪日。他现在又于2008年11月开了一个公司 Path， 其主要提供给iPhone手机进行照片分享的服务。&lt;/p&gt; &lt;p&gt;而Napster呢？今天他还在。这个商标在破产拍卖时被卖了，然后再被卖了，但其再也没有被 重建。现在其被  Best Buy 运营，其是   iTunes 的竞争者，其口号是—— “More than just a music store.” （不仅仅只是音乐商店）&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;没有盗版的人&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;作为 Gnutella 的作者， Justin Frankel 是 Fanning 合法的继任者。不像   Fanning，他很早就收获了他的第一桶金。在1999年，当WinAmp大放光芒的时候，AOL买了WinAmp和他的公司——Nullsoft，价  格应该在1亿美金左右。这让 Frankel 在20岁的时候就非常富有。当然，他也成了AOL的员工。&lt;/p&gt; &lt;p&gt;但这并不是很匹配，在Nullsoft, Frankel的做法是把软件开发到极致，然后免费发布出去。而在   AOL，软件的商业销售威胁并压倒了软件本身。“我致力于的产品，就像这样，我们不愿意金钱的掺入，我们正和其它公司做这笔交易，所以，产品也只能是这样  的结果”，他回忆到，“没有人真正地去关心用户的体验是怎么样的”。&lt;/p&gt; &lt;p&gt;与此同时，Frankel 用他的业余时间开发 Gnutella   。这是一个很有才的软件，不像Napster，其是真正的分布式，没有中心服务器，这样，也没有那个“关闭按钮”让那些律师按。在2000年3月的时  候，Gnutella上线，其发了一个贴子：“看见没？AOL也能给你一些好的东西！”，但是就算是这样，也没有换来AOL对其忠爱，而一大堆互联网公司  在那时试图并入大的媒体公司，在Napster被诉讼的中期，2004年，他离开了AOL。&lt;/p&gt; &lt;p&gt;然后，他开始干了些有趣的事：他离开了他的成功地，他不用 Gnutella，也没有花一毛钱，就算是10年以后也是这样。 LimeWire   —— 最流行的 Gnutella 客户端 —— 号称有   5千万用户。“当我开发它的时候，我最初主要是想用其在验证一下是否可行。所以我也不想从其中获益”，他说，“所以，甚至我和它一点关系也没有也说得通，  其就是一个概念”。&lt;/p&gt; &lt;p&gt;Frankel 他最近从旧金山搬到了纽约城，现在全心打理自己的公司 Cockos (别问为什么叫这名)，这是一个关于音频产品套件，叫   Reaper。他坚持不懈地改进着它，并且他和他的用户保持着很近的关系，其用户数大约是几万人。“当前的策略我们并不想发展用户数量”，他说，“我们只   是在享受目前的过程，并在做正确的事情”。他并不同意他是这个世界上最危险的geek，而滚石在2004年时对他则是这么认为的。“我不觉得盗版是很危险  的”，他说，“根本上来说，大众的商业模式总是依赖于对所有事情的强控制——尤其是那些有瑕疵的模式。而作为一个软件开发者来说，会有一定程度的盗  版”， Gnutella   对他来说已是远古的事情了。“数字化盗版：它毁了唱片业了吗？没有。唱片业适应了吗？当然，很多人会说得更好。你应该更关注质量，以及更小一些乐队，等等  这类的事”。&lt;/p&gt; &lt;p&gt;“至于音乐流行和排行这么大的市场，这算什么？” 他边说边笑道， “我希望就是这样。”&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;四眼怪兽&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;在这四骑士中，只有 Bram Cohen他现在还在致力于其10年前的那个项目。他是 BitTorrent的创始人和首席科学家，而一个令人敬佩的旧金山的公司希望能把Cohen的这个令人瞠目的高效的内容分布式技术变成商业化应用。&lt;/p&gt; &lt;p&gt;这是一个奇特的公司：其合法的业务建立在一种仍然可能被用来进行大规模版权侵权的技术上。即使像   BitTorrent这样被8千万用户安装了的东西，其看上去还是像刚刚开始创业一样。 在BitTorrent上有相对较小的一部分是完全合法的 ——   最近的一个研究表明完全合法的部分占11%。而在这11%中，有更少的一部分产生了BitTorrent的收入。&lt;/p&gt; &lt;p&gt;就像 Fanning 的 Snocap 一样，Cohen   试图把其BitTorrent从大量的盗版领域转移到合法的领域，这样才能挣到钱。2007年是BT发展最震动的一年，BitTorrent成为了20世  纪福克斯、派拉蒙、华纳兄弟 和 米高梅 影业公司的合作伙伴，和他们一起共同形成了 Torrent Entertainment   Network，主要提供电影，电视，电子游戏的购买和零售。&lt;/p&gt; &lt;p&gt;就像 Fanning一样， Cohen 明了要摆脱盗版并不像看上去的那么容易。“所有的和它有关的事都是灾难”，他说到。Torrent   Entertainment Network 于2008年底关闭。回想起来，你能明白这为什么不行。   BitTorrent在用户友好上做得还不够，并且，在其底层也不够有效率。它可以很快地像病毒一样地移动大量的数据。然后，当你要在上面算钱的时候，你   不得不把速度给降下来，然后跟踪并控制其下载流，还和使用一些很扯淡的诸如“数字版权管理（DRM）”之流的技术，其大量地限制了用户那些是可以干的，哪  些是要买的。&lt;/p&gt; &lt;p&gt;“我从这次失败中学到了很多很多的教训”， Cohen   悔恨地说。他现在的策略是只和那些只需要他的BT中的“快速”和“病毒式分布”的人合作。“与其去和那些内容提供商合作，为他们加上特权，以扩展我们的渠  道，我们还不如直接获取那更大的渠道，那里的人更喜欢更为开放的方式”。&lt;/p&gt; &lt;p&gt;迄今，对些感兴趣的独立电影制片商叫 &lt;em&gt;Four Eyed Monsters&lt;/em&gt; （四眼怪兽）和 一个叫 &lt;em&gt;Pioneer One &lt;/em&gt;（&lt;a target="_blank" href="http://movie.douban.com/subject/4901534/"&gt;先驱者一号&lt;/a&gt;）的电视剧集的创作团队。说起来有点沮丧：Cohen正坐在一个消防水带上，一个程序员所梦想的成功的技术却失控了，而大的玩家又不想来玩。&lt;/p&gt; &lt;p&gt;以他的编码天份，Cohen可以很容易的进入一家大型的公司。但那并不是他的风格。“我的确需要一定的自由度”，他说。他现在正在开发一个全新的事  情——一个P2P的实时数据流的系统，而不是分散的文件。这个项止将可能有巨大的潜力，尤其在新闻、体育等事的互联网上的现场直播。当然，他还在维护着   BitTorrent，但他没有花太多的时间在上面。他说：“当我开发它的时候我就知道没错”。&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;简单之道&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;那么，在去年，盗版导致了什么？在美国，每个人都认为盗版对内容制造者的影响并没有那么坏。一份去年四月份美国审计署的报告，非常牵强地把盗版和滞销给联系在一起，但其结果尚无定论。&lt;/p&gt; &lt;p&gt;打击盗版在今天扁平化的世界上并不那么成功。无政府主义的世界观加上那些无与伦比的代码，不可能在那些合法的津津计较的商业界里传播。好的代码应该  给用户有不同的选择，用户使用他们也并不一定是对行业有益的。而你真正需要的是向那些合法商业界挑战，挑战他们那些限制用户做用户想做的事的那种独裁  性。（译注：这让我想到了腾讯360还有敏感词）&lt;/p&gt; &lt;p&gt;另外一个重要的原因是唱片业的灾难是不会发生的。Steve Jobs 在 2003年4月28日，那段时间是互联网文件共享井喷的时候，Apple揭开了iTunes Music Store的面纱。在那个时候，我们都觉得iTunes不可能成功，就像&lt;a target="_blank" href="http://en.wikipedia.org/wiki/SNOCAP"&gt;Snocap&lt;/a&gt;以及他和它类似的项目都以失败告终。这是因为，你怎么可以可能和免费竞争呢？&lt;/p&gt; &lt;p&gt;但是iTunes   确实成功了。Apple无情地强调着简单和有魅力的用户接口，以及有乔布斯对唱片业的那强有力的谈判，造就了一个最新型的专业的服务，其可以让你放心地下  载并传输音乐。的确是做到了，尽管其是收费的，而且我们的购买需要和DRM（数字版权管理）扯上关系并限制我们。&lt;/p&gt; &lt;p&gt;于是，我们看到了可以和免费竞争的东西——简单（译注：个人以为可能还需要加上一点时尚）。Napster, Gnutella 和   BitTorrent   从来没有在用户友好度上到达像Apple那样的境界。从来没有人在网上检查并整理那些文件内容，所以，当那些众多的文件被共享时，我们可以看到，很多文件  加杂时广告，色情，木马，病毒以及其它一些垃圾。当乔布斯为我们提供了那条简单之路，我们接受了。很明显，自由太过头——至少数字媒体是这样的。&lt;/p&gt; &lt;p&gt;这是一个让那些年轻的海盗王们认真学习的教训。就像 Fanning, Frankel 和 Cohen一样， 其实，Jon Lech   Johansen   并不能算得上是一个真正的海盗。他没有因为想把好莱坞搞破产而去帮助破解DVD，他这样做是因为他想在他的电脑上看电影。他的电脑安装的是Linux操作  系统，而1999年，在Linux上根本没有可以用来播放DVD的程序，所以，他和他的伙伴们决定自己写一个，所以，他们不得不先把DVD给解密了。&lt;/p&gt; &lt;p&gt;当美国电影协会（ Motion Picture Association of America）发现了DVD被破解的这个事，其向挪威政府控告   Johansen，并拘留了他。 他在奥斯陆(挪威的首都)受审两次，不过两次都被宣告无罪。因为他解密的DVD是他付费购买的。&lt;/p&gt; &lt;p&gt;但Johansen真正的明白消费者对其购买的数字媒体的权利，这就好像一本书一样——我们可以不断的使用这本书，或是把这本书借出去，这是我们的  权利。2005年， Johansen 去了加利福尼亚，在那里，他逆向工程了   FairPlay，这是苹果公司的用来保护其多媒体文件的DRM类软件（译注：这是苹果公司用来加密iPod的工具）。之后，他注意到了苹果公司产品的用   户体验是多么的迷人，所以，他在想，应该把这些东西带给全世界给那些更为无序的非苹果的产品。“我们看到这世上有很多很多的产品，但其并没有像他们那样良  好地运作”，Johansen说，那时他26岁的程序员。“所以，我们应该开发一个系统，其可以让这些设备的整合起来并给消费者他一个相当不错的用户体  验”。&lt;/p&gt; &lt;p&gt;所谓的 “我们”，就是 Johansen 自己的公司—— doubleTwist，这个公司于2007年创建。 doubleTwist 软件是免费的，是一种像&lt;a target="_blank" href="http://zh.wikipedia.org/zh-cn/%E7%BE%85%E5%A1%9E%E5%A1%94%E7%9F%B3%E7%A2%91"&gt;罗塞塔石&lt;/a&gt;一样的为数字多媒体软件文件开发的软件——它是可以翻译，和谐并组织大约500种不同设备的文件，把他们放在一起并提供一个相当漂亮的接口。其6月份， doubleTwist 摧出 Android App，当时就有超过50万的用户下载了（译注：大家可以&lt;a target="_blank" href="http://www.google.com/search?q=doubleTwist+android+app"&gt;Google一下&lt;/a&gt;，  好评如潮）。去年， doubleTwist 开始了他的政变打出了这样的广告：“The Cure for iPhone Envy. Your   iTunes library on any device. In   seconds.”（嫉妒iPhone的对策。你的iTunes库可以在任何设备上，只需几秒钟。）其它这个条幅挂在了苹果在旧金山的旗舰店的外墙上。&lt;/p&gt; &lt;p&gt;Johansen   拒绝承认他和盗版有关系。“至于我被所指责的，真的和我没有什么关系”，他说。“我支持公平使用，意思是你的确是需要合法地获得内容，但你应该有权利使用  任何一款设备或是应用程序来查看那些内容”。 Johansen   像所有的海盗王一样，他总是能写好的代码，而这些好的代码给了人民使用的权力。这才是盗版灾难不会发生的真正原因。&lt;strong&gt;盗版永远不希望所有的音乐和电影或是其它的东西成为免费的，他们想要的“free”其实是&lt;/strong&gt;&lt;strong style="color: red;"&gt;&lt;strong&gt;自由&lt;/strong&gt;&lt;/strong&gt;&lt;strong&gt;！&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;————————————正文结束————————————&lt;/p&gt; &lt;p&gt;最后一句话是点睛之笔，作者对这个世界的认识真是相当的透彻。所以，加粗了。我个人理解本文带给我如下的启示：&lt;/p&gt; &lt;ol&gt;&lt;li&gt;年轻就应该豁得出去，就应该有天不怕地不怕的想法，并付诸于行动。&lt;/li&gt;&lt;li&gt;互联网上的盗版永远不会停止，与其说是盗版，其后面则是自由和无政府主义。&lt;/li&gt;&lt;li&gt;自由过度并不是那些利益集团所希望的，并可能会让你惹上麻烦，不过这世界总是因此而改变。&lt;/li&gt;&lt;li&gt;版权限制和免费并不是最好的，而最根本的是尊重用户的自由权以及不断地化繁为简以改善用户的体验。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;另，题外话，最近一段时间都在招人，有一天，一个同事和我说，“现在的这些程序员怎么回事啊？我问他们：‘你心目中的最牛的程序员是谁？’，居然回  答不出来，有人说是Bill Gates，还有人说是马云，气死我了……”。我想想也真是可笑，难道，Dijkstra，Linus，Ken   Thompson，Dennis Ritchie，Richard Steven，Bjarne Stroustrup……   这些人不认识吗？就知道有钱人，哎，这个时代真是个文化缺失的年代！。&lt;/p&gt; &lt;p&gt;&lt;span style="color: red;"&gt;其实细想一下，不单单是&lt;/span&gt;&lt;strong&gt;&lt;span style="color: red;"&gt;我国&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: red;"&gt;的&lt;strong&gt;计算机文化&lt;/strong&gt;都是那些&lt;strong&gt;肤浅的大公司的文化&lt;/strong&gt;，&lt;strong&gt;我们整个国家的公司，社会和人都是很肤浅的。&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;最后还是送给大家那句话——&lt;strong&gt;真正让我们成为&lt;/strong&gt;&lt;strong style="color: red;"&gt;局域网&lt;/strong&gt;&lt;strong&gt;的不是那个墙，而是&lt;/strong&gt;&lt;strong style="color: red;"&gt;我们自己的肤浅&lt;/strong&gt;&lt;span style="color: red;"&gt;。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;（全文完）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description><pubDate>Thu, 18 Nov 2010 08:14:05 GMT</pubDate></item><item><title>SQL Server 2008 R2 Express带SSMS下载及安装</title><link>http://www.wyjexplorer.cn/Blog/View/C68B0D95AE174029.html</link><description>&lt;p&gt;今天装SQL，搞了好久没装上。把SP0 SP1 SP2都试过了，没有SSMS都能装，真TM奇怪。以前就行的，唉。SQL安装程序果然是微软最失败的产品。&lt;/p&gt;
&lt;p&gt;后来我想到了&lt;strong&gt;Web安装平台&lt;/strong&gt;，这个东西能&lt;strong&gt;自动下载安装SQL Server&lt;/strong&gt;。其实主要是要SSMS，否则用个毛。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web安装平台：&lt;a href="http://www.microsoft.com/web/downloads/platform.aspx" target="_blank"&gt;http://www.microsoft.com/web/downloads/platform.aspx&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;安装后选择Web平台&gt;数据库，然后把后面3个选上。&lt;strong&gt;一定要选Management Studio&lt;/strong&gt; 不然没界面。&lt;img alt="" src="/uploads/20101018220116229.png" border="0" height="271" width="620"&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;接下来安装就行了。建议选&lt;strong&gt;Windows身份验证&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从Web安装平台里得到的SQL Server 2008 R2 Express Management Studio的地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://download.microsoft.com/download/F/F/0/FF05066C-51F9-4562-914D-D3BFE718A91D/SQLManagementStudio_x86_CHS.exe" target="_blank"&gt;http://download.microsoft.com/download/F/F/0/FF05066C-51F9-4562-914D-D3BFE718A91D/SQLManagementStudio_x86_CHS.exe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;应该是把SQL和SSMS一起装了的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;单独SQL Server 2008 R2的地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://download.microsoft.com/download/3/E/F/3EF1598E-F113-43D8-80C6-8BF07BFC8CC8/SQLEXPR32_x86_CHS.exe" target="_blank"&gt;http://download.microsoft.com/download/3/E/F/3EF1598E-F113-43D8-80C6-8BF07BFC8CC8/SQLEXPR32_x86_CHS.exe&lt;/a&gt; &lt;/p&gt;&lt;font style="font-size: 0px; color: #f1f1f1;"&gt;本文转自汪宇杰个人网站http://wyjexplorer.cn&lt;/font&gt;</description><pubDate>Mon, 18 Oct 2010 22:02:11 GMT</pubDate></item><item><title>浅谈SQL注入攻击与防范</title><link>http://www.wyjexplorer.cn/Blog/View/633391CC13C5D310.html</link><description>前置知识：数据库、SQL语句、Web编程(ASP、ASP.NET)
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
前言：这次要谈到问题，其实不是什么新鲜的内容了，早在许多年前，就在各种黑客杂志和网站上提及过。这次我重新谈起这个问题，一方面是为了完成作业，另一方面我会结合目前的前沿技术来谈谈在SQL注入方面的新进展和防范。希望大家能以技术学习为目的，不要利用SQL注入漏洞进行非法攻击。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;一、SQL注入漏洞是如何产生的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
我们知道，一个动态网站，往往是要和数据库紧密交互的，即按条件从数据库中取出数据在网页上送显，或按用户的操作去改变数据库中的内容。最普遍的应该是新闻系统。我们经常在地址栏看形如这样的URL：http://某网站/ReadNews.asp?id=32，这个URL的作用是把ID=32传给 ReadNews.asp，ReadNews接受到这个id后，就会到数据库中找到id为32的新闻，取出这条记录并将它显示在网页上。然而，这样真的安全吗？&lt;/p&gt;
&lt;p&gt;
我们知道，一般，新闻表的ID，是一个int型的主键，注意，我强调的是int型。所以，这个参数应该严格限制为 int，而ASP/ASP.NET中，甚至其他编程语言中，QueryString一定是string型，如果程序中不加处理，就意味着，黑客可以构造特殊的参数来达到获取和修改额外信息的目的。&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;即：SQL注入的原理，就是从客户端提交特殊的代码，从而收集程序及服务器的信息，从而获取你想到得到的资料。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;二、SQL注入的一般步骤&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
    &lt;strong&gt;1. 探查SQL注入地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
找一个带QureyString的地址，例如http://www.某某.com/shownews.asp?id=32，在这个地址后加一个单引号’。看看发生了什么：&lt;/p&gt;
&lt;p&gt;
-------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;
Microsoft JET Database Engine 错误 ‘80040e14‘&lt;/p&gt;
&lt;p&gt;
字符串的语法错误 在查询表达式 ‘ID=32‘‘ 中。&lt;/p&gt;
&lt;p&gt;
/ shownews.asp，行8&lt;/p&gt;
&lt;p&gt;
-------------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;
JET Database表示网站使用的是Access数据库，并且，程序没有限制QueryString中的字符串。&lt;/p&gt;
&lt;p&gt;
其实，最终执行的SQL语句是类似这样的：SELECT * FROM News where ID=32’，后面多了个引号，当然就报错了。&lt;/p&gt;
&lt;p&gt;
当然，有些网站不会返回错误或者程序员已经屏蔽了单引号，所以我们必须换一种更精确的测试方法：&lt;/p&gt;
&lt;p&gt;
试着访问这3个URL：&lt;/p&gt;
&lt;p&gt;
①     http://www.某某.com/shownews.asp?id=32   &amp; nbsp;       正常显示&lt;/p&gt;
&lt;p&gt;
②     http://www.某某.com/shownews.asp?id=32 and 1=1    正常显示&lt;/p&gt;
&lt;p&gt;
③     http://www.某某.com/shownews.asp?id=32 and 1=2    报错&lt;/p&gt;
&lt;p&gt;
我们来看看程序都执行了什么：&lt;/p&gt;
&lt;p&gt;
1.    SELECT * FROM News where id=32;                   id=32为真&lt;/p&gt;
&lt;p&gt;
2.    SELECT * FROM News where id=32 and 1=1;            id=32为真，1=1永真&lt;/p&gt;
&lt;p&gt;
3.    SELECT * FROM News where id=32 and 1=2; 1=2         id=32为真，1=2永假，真and假=假。&lt;/p&gt;
&lt;p&gt;
这样我们就能知道这个url是否存在注入漏洞了。这个例子中，是存在漏洞的。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;strong&gt;2. 开始攻击！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
    进一步改造URL：http://www.某某.com/shownews.asp?id=32 and 0&lt;&gt;(select count(*) from admin)&lt;/p&gt;
&lt;p&gt;
如果系统存在admin表，那我们就得到了网站的管理员密码了。&lt;/p&gt;
&lt;p&gt;
    当然，在攻击一个网站时，我们不知道它的表结构。于是只能用字典枚举法来猜测。这也就是一些SQL注入攻击器的原理，猜解一些惯用的名字。比如user、admin之类的。&lt;/p&gt;
&lt;p&gt;
    再邪恶点，我们可以远程执行cmd指令：http://www.某某.com/shownews.asp?id=32&amp; amp;#8217;; declare @a sysname set @a=’xp_’+’cmdshell’ exec ‘命令语句’---&amp;aid=9&lt;/p&gt;
&lt;p&gt;
    这样你就可以用cmd命令去控制服务器，修改管理员密码、创建用户等，甚至格式化他的硬盘。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;strong&gt;3. 不知道用户名密码，利用SQL注入，登录系统&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
这个真是太邪恶了，用户名：’or’’=’  密码：’or’’=’。猜猜系统做了啥？&lt;/p&gt;
&lt;p&gt;
SELECT * FROM Users Where Username=’’or’’=’’ and Password=’’or’’=’’&lt;/p&gt;
&lt;p&gt;
于是，系统返回了Users中所有的记录……&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
其实SQL攻击还有很多种，我不一一介绍了，太邪恶了。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;三、防范&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
    对于我们开发者来说，最重要的不是黑别人，而是防止被黑。我本人在这方面稍有经验，下面介绍一下防御的思路以及具体代码：&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;1.    在程序中进行过滤&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
首先，针对SQL注入漏洞产生的原因，我们首先想到的，应该是严格限制用户提交的字符串。也就是URL之后的QueryString，当然，也包括Form、Cookie等。因此，我们需要在接受这些用户传值的页面对参数进行过滤。&lt;/p&gt;
&lt;p&gt;
    考虑到ASP已穷途末路，下面所有的例子都以ASP.NET(C#)为例：&lt;/p&gt;
&lt;p&gt;
    ReadNews.aspx.cs：&lt;/p&gt;
&lt;p&gt;
public void ShowNews()&lt;/p&gt;
&lt;p&gt;
{&lt;/p&gt;
&lt;p&gt;
    int newsId = Convert.ToInt32(Request.QueryString[“id”]);&lt;/p&gt;
&lt;p&gt;
    //……&lt;/p&gt;
&lt;p&gt;
}&lt;/p&gt;
&lt;p&gt;
我们声明了一个int型的newsId，因此，它只能接受整数类型的参数。一旦URL中，ID=的后面不是整数，就会报错。当然，这种错误是可以捕获的，有必要的话，你可以try…catch一下，或者让.NET自己的代码监视器来完成。&lt;/p&gt;
&lt;p&gt;
但是，我们接受的参数，不一定只有一个，或者必须是string，怎么办呢？这时候我们需要构造一个复杂的函数，用于过滤非法字符（主要是单引号和分号）。我建议大家把它写在公共类中，调用方便，一劳永逸。&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;public static string StringFilter(string str)
{
    if (!string.IsNullOrEmpty(str))
    {
        str = str.Trim().Replace("‘", "");
        str = str.Trim().Replace(";", "");
        return str;
    }
    else
    {
        return "";
    }
}
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;2.    使用存储过程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
在.NET下最好的办法是使用存储过程！当然，只有SQL Server可以这么做。&lt;/p&gt;
&lt;p&gt;
存储过程让用户对数据库的操作只能以特定的存储过程实现，不是单纯的Execute一条SQL语句，因此很好的防范了黑客构造奇奇怪怪的SQL语句进行注入攻击。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;3.    对用户密码进行加密&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
如果黑客攻破了外层防御，那么数据库中加密的内容将是最后一道防线。用户表中密码字段储存的数据，应当采用不可逆加密算法进行加密。比如MD5算法。当然，一次MD5的结果不是最安全，有很多网站有在线查询MD5的服务。我推荐的做法是，以MD5为基本加密方式，在字符串中再做处理，比如这样：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20101001085315679.png" height="448" width="677"&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
上面这种算法挺简单，但已经是非常强的加密了。黑客几乎无法通过枚举、反查来找出密码。&lt;/p&gt;
&lt;p&gt;
存入数据库时，采用以上算法进行加密。用户登录时，用以上算法对用户输入的密码加密，然后和数据库中的加密结果对比，如果一致则登录成功。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;四、总结&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
1. 使用SQL Server、Access的系统都可能存在SQL注入漏洞，尤其是ASP+Access的程序，因为ASP是一种不严格的语言。&lt;/p&gt;
&lt;p&gt;
2. 牢牢记住，在执行SQL语句之前，对参数做必要的检查，每个带参数的函数，都必须对参数合法性进行验证！&lt;/p&gt;
&lt;p&gt;
3. 如果你采用ASP.NET+SQL Server开发系统，那么使用存储过程是最好的选择。&lt;/p&gt;
&lt;p&gt;
4. 对敏感信息加密保存，选择正确的加密方式（可逆/不可逆）&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;五、写在最后&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
    感谢读到这里的读者，希望本文对你们有帮助。本人水平有限，如果你有什么更好的建议，欢迎和我交流。我的邮箱：wyjexplorer@wyjexplorer.cn 另外，到现在为止，我网站的访问量已经达到了68662，感谢所有支持我的朋友们。最近我又开通了博客园上的编程博客，欢迎大家来访问：http://blog.wyjexplorer.cn&lt;/p&gt;</description><pubDate>Fri, 01 Oct 2010 08:53:57 GMT</pubDate></item><item><title>GridView生成序号</title><link>http://www.wyjexplorer.cn/Blog/View/F023720A4919C1BC.html</link><description>&lt;p&gt;一个经常碰到的情况：GridView需要添加一个序号列，并且从1开始自动编号。而数据库中的ID往往是不连续的（会有记录被删除的情况），我们无法绑定现有字段作为编号。因此我们需要手动给GridView编号。&lt;/p&gt;
&lt;p&gt;思路：在GridView每一行，既Row，被生成的时候，在序号单元格中输出该行的ID+1（第一行是从0开始编的，因此要+1）
&lt;/p&gt;
&lt;p&gt;实现：&lt;/p&gt;
&lt;p&gt;首先，在ASPX页面中，需要手动给GridView添加一个BoundField。示例代码如下：
&lt;/p&gt;
&lt;pre class="brush: html;"&gt;
&lt;asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" EnableModelValidation="True"
   &gt;
    &lt;Columns&gt;
        &lt;asp:BoundField HeaderText="序号"&gt;
            &lt;HeaderStyle Height="24px" /&gt;
            &lt;ItemStyle Font-Size="14px" Height="24px" /&gt;
        &lt;/asp:BoundField&gt;
        &lt;asp:BoundField DataField="Sn" HeaderText="卡号" /&gt;
        &lt;asp:BoundField HeaderText="货物规格" /&gt;
        &lt;asp:BoundField HeaderText="数量" /&gt;
        &lt;asp:BoundField DataField="GhsId" HeaderText="供货商ID" /&gt;
        &lt;asp:BoundField DataField="Shr" HeaderText="收货人姓名" /&gt;
        &lt;asp:BoundField DataField="ShrContact" HeaderText="收货人电话" /&gt;
        &lt;asp:BoundField DataField="ShAddress" HeaderText="送货地址" /&gt;
        &lt;asp:BoundField HeaderText="物流单号" /&gt;
        &lt;asp:BoundField DataField="Bz" HeaderText="备注" /&gt;
    &lt;/Columns&gt;
    &lt;RowStyle BorderColor="Black" BorderStyle="Solid" BorderWidth="1px" /&gt;
&lt;/asp:GridView&gt;
&lt;/pre&gt;
&lt;p&gt;后台代码这样写：&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;
//Gridview自动生成序号
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowIndex &gt; -1)
    {
        e.Row.Cells[0].Text = Convert.ToString(e.Row.RowIndex + 1);
    }
}
&lt;/pre&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100926122144438.png" height="224" width="268" /&gt;
&lt;/p&gt;
</description><pubDate>Sun, 26 Sep 2010 12:23:00 GMT</pubDate></item><item><title>关于U盘启动、量产的初步研究</title><link>http://www.wyjexplorer.cn/Blog/View/A38F84E4F4AB61F6.html</link><description>&lt;p&gt;自从2009年10月，我停止制作《WinXP汪宇杰DIY版》后，就几乎没有再弄过PE啊、U盘、光盘启动之类的事情。装机、启动等技术虽然有趣，但却是不是什么有钱途的技术。最多给亲朋好友装机比较方便。让你成为“电脑高手”。&lt;/p&gt;
&lt;p&gt;不过最近随着Windows7的升温，不得不又研究一下装机方面的事了，我可不想以后给人装Win7都要像传统安装一样麻烦。&lt;/p&gt;
&lt;p&gt;我们传统上都是用光盘来装电脑，我们有原版Windows，Ghost版，以及WinPE等可以引导启动的维护盘，非常方便。但光盘始终有一定的缺点：1.容易损坏 2.有些电脑读不出 3.上网本之类的没光驱 4.速度慢。所以便有了U盘启动安装系统的说法。&lt;/p&gt;
&lt;p&gt;这次我的研究目标是：制作一个带WinPE启动、能安装XP、Windows7的U盘。并且尽量采用NTFS文件系统以便储存数据，一盘多用。&lt;/p&gt;
&lt;p&gt;实验对象有3个U盘：联想4G、金士顿4G、PNY 16G（主控芯片UT165）&lt;/p&gt;
&lt;p&gt;昨 天俺搞了一天了。目前的结果是：3个U盘，如果不分区，不量产，用FAT32格式单纯做启动都没问题，目前联想的和金士顿的已经可以用作WinPE启动 了，里面也放了GHOSTXP，可以装机。PNY的，因为有16G，而且是我平时主要使用的U盘，因此我打算分2个区，一个5G FAT32用于WinPE和GHOSTXP、GhostWin7，另一个10G NTFS用作平时存放数据（也可双启动，做Windows7 Setup安装）。目前PNY的研究还未成功，我仍需努力。&lt;/p&gt;
&lt;p&gt;阅读本文需要有电脑装机维护的基础知识，建议不熟悉的朋友先去Google查阅U盘启动的介绍。另外，截图太麻烦，请原谅我木有发图片。&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;下面分享一下普通的U盘启动制作方法：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;一、WinPE的安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这次我测试了3种PE，分别是《深山红叶WinPE V32》、《TangoPE 2010》、《完美者U盘维护系统》。最成功的是深山红叶的PE（老品牌，值得信赖！）&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;a. 《深山红叶WinPE V32》的安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;    方法一：&lt;/p&gt;
&lt;p&gt;    1.刻录一张深山红叶PE的CD，并以此启动电脑。启动的时候插上我们要处理的U盘，不然进PE后认不出。&lt;/p&gt;
&lt;p&gt;    2.启动之后，点击[开始][程序][系统工具][安装]，选择“将PE安装到U盘或移动硬盘”。之后会弹出一个向导。按向导的要求做，很快便完成了。需要注意的是：格式化的时候一定要选择FAT32格式，不然不能做引导处理！&lt;/p&gt;
&lt;p&gt;    方法二：&lt;/p&gt;
&lt;p&gt;    1.在Windows下，插上U盘，然后用UltraISO（9.2以上版本）打开深山红叶的ISO。&lt;/p&gt;
&lt;p&gt;    2.选择[启动][写入硬盘映像]，在"硬盘驱动器"中选择你的U盘，写入方式选择USB-HDD+（兼容性比USB-HDD好）。然后点击[写入]。&lt;/p&gt;
&lt;p&gt;    *说明：大于512M的U盘，只能做USB-HDD处理。&lt;/p&gt;
&lt;p&gt;最 后，你便有了一个可以启动深山红叶PE工具箱的U盘。启动电脑的时候，在BIOS设置中选择USB-HDD启动，或手动选择（F12-BOOTMENU， 有的电脑是F8）U盘启动。就可以了！技嘉主板的用户注意，必须选择 +HARD DISK下的USB-HDD才可以启动。&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;b. 《TangoPE 2010》的安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个很简单，在下载TangoPE的页面里，会有个U盘安装工具。双击“tpeinst.cmd”就可以按照向导安装了。要注意的是：U盘同样需要格式化为FAT32格式！&lt;/p&gt;
&lt;p&gt;*tangoPE的地址：&lt;a href="http://bbs.wuyou.com/viewthread.php?tid=160583" target="_blank"&gt;http://bbs.wuyou.com/viewthread.php?tid=160583&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;c.《完美者U盘维护系统》的安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个是最麻烦的，可以参照这个：&lt;a href="http://home.435200.com/space.php?uid=2&amp;do=blog&amp;id=4174" target="_blank"&gt;http://home.435200.com/space.php?uid=2&amp;do=blog&amp;id=4174&lt;/a&gt; 另外，也可以用UltraISO安装。&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;总结：&lt;/strong&gt;UltraISO使用最方便，成功率最高，可以将PE、Windows安装光盘等ISO镜像，烧录到U盘上，并自动对U盘做引导处理。对于深山红叶，建议还是用方法一来安装（兼容性高）。&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;二、制作Windows7的安装U盘&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最简单的办法：下载微软自家的Windows7-USB-DVD-tool，一个很小的工具，947K。一路next到底绝对搞定。&lt;/p&gt;
&lt;p&gt;下载地址：&lt;a href="http://download.cnet.com/Windows-7-USB-DVD-Download-Tool/3000-18513_4-10972600.html" target="_blank"&gt;http://download.cnet.com/Windows-7-USB-DVD-Download-Tool/3000-18513_4-10972600.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;关于USB-FDD, USB-ZIP, USB-HDD的说明&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;简单理解：FDD就是把U盘模拟成软盘，ZIP就是模拟成大容量软盘，HDD就是模拟成硬盘。&lt;/p&gt;
&lt;p&gt;FDD和ZIP启动后，驱动器指向是A:\，而HDD启动后，是C:\&lt;/p&gt;
&lt;p&gt;大于512MB的U盘只能做成HDD，所以现在的U盘几乎只能用HDD模式，当然，现在的电脑也支持这种启动方式。&lt;/p&gt;
&lt;p&gt;另外，UltraISO里有个USB-HDD+，这个是对USB-HDD的改良，兼容性有所提高。如果你用UltraISO或bootice做启动，建议选USB-HDD+&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;至于量产...........&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;量产还未成功，同志仍需努力&lt;/strong&gt;&lt;/p&gt;</description><pubDate>Thu, 02 Sep 2010 17:04:15 GMT</pubDate></item><item><title>学校太潮湿了，今天才发现电脑主机都生锈了！</title><link>http://www.wyjexplorer.cn/Blog/View/DFB8CF168FBB26CD.html</link><description>&lt;p&gt;马上要开学了，今天打算清理一下电脑主机。于是。。按照正常顺序，我打开机箱面板，依次清理了CPU散热器、主板、内存条等配件。忽然发现主板背面貌似有点脏。于是准备拆开后面板进行清理，谁知可拍的事情发生了……&lt;/p&gt;
&lt;p&gt;卸下后面板的两个螺丝后，面板却始终拿不下来。。使多大劲都都没用。。。&lt;/p&gt;
&lt;p&gt;于是我只好用螺丝刀协助，翘开了后面板。结果。。恐怖的一幕出现在我面前！！&lt;/p&gt;
&lt;p&gt;面板与机箱的咬合处，锈迹斑斑！！！怪不得卡住不动了！&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100819171501905.jpg" alt="" width="702" height="526" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100819171536213.jpg" alt="" width="700" height="931" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100819171624183.jpg" alt="" width="706" height="529" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100819171715262.jpg" alt="" width="703" height="526" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100819171801455.jpg" alt="" width="698" height="523" /&gt;&lt;/p&gt;
&lt;p&gt;哈哈，还好。奔腾的心没有生锈～～&lt;/p&gt;
&lt;p&gt;唉，连不锈钢机箱都生锈了，我太感谢杉达了，本来就湿，我们寝室住一楼，更湿！记得放假我把电脑拿回来的那天，正好是杉达水世界，机箱里都能滴水出来的。我也没在意，原以为蒸发了就好了。结果今天才发现后果很暴力。。。。&lt;/p&gt;
&lt;p&gt;再次提醒大家，在SD一定要做好除湿工作！不然后果很严重的！每年放假上来都有很多人会扔掉已经发霉长毛的席子和枕头。这次我可不想扔电脑。。。放假的时候我已经在橱里放了3个除湿剂了，估计开学过去都已经吸满水了。。。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;电脑一定记得经常清理灰尘，在SD更是如此！不然一潮湿，灰尘凝结之后，很容易引起部件短路，损坏机器！&lt;/strong&gt;&lt;/p&gt;</description><pubDate>Thu, 19 Aug 2010 17:19:07 GMT</pubDate></item><item><title>免费的谷歌日语输入法！再也不用纠结软键盘了！</title><link>http://www.wyjexplorer.cn/Blog/View/D79EFDDDCE149724.html</link><description>&lt;p&gt;&lt;strong&gt;Google 日本語入力は、変換の煩わしさを感じさせない思いどおりの日本語入力を提供します!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.google.com/intl/ja/ime/"&gt;http://www.google.com/intl/ja/ime/&lt;/a&gt; 先到这里下一个谷歌日语输入法： &lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100809210404770.jpg" alt="" width="690" height="385" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100809210502304.jpg" alt="" width="461" height="395" /&gt; &lt;/p&gt;
&lt;p&gt;那个勾的意思是：允许发送你的用户信息给谷歌（帮助他们完善输入法）&lt;/p&gt;
&lt;p&gt;然后选同意，下载安装。一会儿就装好了～&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100809210541683.jpg" alt="" width="400" height="160" /&gt; &lt;/p&gt;
&lt;p&gt;之后在你的任务栏语言带上就可以选日语了&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100809210617935.jpg" alt="" width="324" height="234" /&gt; &lt;/p&gt;
&lt;p&gt;打开记事本，切换到日语输入法。然后点那个大A，在菜单中选择第一项 Hiragana。&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100809210649990.jpg" alt="" width="193" height="57" /&gt; &lt;/p&gt;
&lt;p&gt;之后那个大A图标会变成一个あ，现在就可以输入了！平假名和片假名切换点那个KANA。&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100809210752208.jpg" alt="" width="280" height="172" /&gt;&lt;/p&gt;
&lt;p&gt;选好字按回车就可以输入进去，虚线表示待输入的。这是 a 回车 i 的结果。&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100809210816557.jpg" alt="" width="260" height="242" /&gt; &lt;/p&gt;
&lt;p&gt;它是有联想功能的。和拼音词组一样的意思～&lt;/p&gt;
&lt;p&gt;Tab键快速选择第一项～&lt;/p&gt;
&lt;p&gt;哈哈。接下来各位就自己发挥了～俺日语烂，木有发言权～&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;感谢谷歌！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description><pubDate>Mon, 09 Aug 2010 21:09:43 GMT</pubDate></item><item><title>今天用芒果画了个MT的头。。。</title><link>http://www.wyjexplorer.cn/Blog/View/A08A5C57EBC6ABEB.html</link><description>&lt;p&gt;&lt;img alt="" src="/uploads/20100809172505491.jpg" height="540" width="721" /&gt;&lt;/p&gt;&lt;p&gt;这芒果的颜色、形状都和MT的头一样。哈哈！除了耳朵没办法做～
&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20100809172618516.jpg" height="542" width="724" /&gt;&lt;/p&gt;&lt;p&gt;MT就是又呆又猥琐。。。&lt;/p&gt;</description><pubDate>Mon, 09 Aug 2010 17:28:01 GMT</pubDate></item><item><title>武汉比赛记</title><link>http://www.wyjexplorer.cn/Blog/View/FD6E1D2FD54E6FB8.html</link><description>&lt;p&gt;    7月20日，我和王菁、李炎君两位同学以及指导老师张丹珏代表杉达学院，去武汉华中师范大学参加了为期四天的第三届中国大学生计算机应用能力大赛（决赛），这是继上海市大学生计算机应用能力竞赛获得二等奖后，我们参加的又一次比赛，这次是全国性的。学校方面对我们给予了厚望。&lt;/p&gt;&lt;p&gt;    其实20日之前的那段时间，我一直忙于一个商业项目，实在没有时间抽空准备比赛。不知道别的选手那段时间都在干嘛，我听说有的学校甚至为了这个比赛搞补课的。据我了解，以及后来的种种迹象表明，我们的心态其实是最放松的。呵呵。能进决赛，我个人并不感到意外，然而这对于杉达来说，确实是值得骄傲的荣誉。一个经常被人瞧不起的“二本最差”的学校，第一次参赛，就能够和同济、财大等知名院校一绝高下，说明我们并不差的。&lt;/p&gt;&lt;p&gt;    20日一早，我们队乘坐“和谐号”前往武汉。和谐号的最高时速据我观察应该是250km/h。上海的其他参赛队也几乎都是乘坐同一班列车和我们一起走的。于是我们就以二百五的速度彪了6个小时到达了武汉。为什么那么快呢？其实一般的列车并不快，因为不和谐。然而一旦要和谐什么东西，那速度一定相当快，比70码还要快！故曰：和谐号列车——特快！&lt;/p&gt;&lt;p&gt;    本以为武汉会很热，结果到了才发现比上海凉快多了。也许是洪水的调节作用吧，武汉水位很高。地球最近一直不正常，所以我们要赶在2012之前拿个奖回去，谁知道有没有下次了。也许2012年的比赛就是在船上举行的吧～&lt;/p&gt;&lt;p&gt;    我们队的待遇比较好，可以住宾馆，多亏了张丹珏老师的申请。20号当天是没有什么事情的，于是，我们准备比赛答辩，张老师去抽签。我们很幸运的抽到了21号比赛。这样我们就可以策划后面几天的游程了（既然到了武汉总得玩玩再走吧，谁知道2012之前还会再来么）。晚上我们在宾馆餐厅就餐，结果，唉。武汉的饭菜，只有饭，是不辣的。其他东西，简直是在往辣椒里加菜，连黄瓜，也是红色的。而且没有糖……&lt;/p&gt;&lt;p&gt;    21号上午，我们和别的队伍一起参加了基础能力测试。这些题目简直太侮辱人类的智商了，8分钟全部做完！旁边有些“名校”的人还在很纠结地对着我的屏幕看伐看伐，看我这个“二本最差”的人。下午就轮到我们答辩了。后场室内外，别的参赛队，都显得很紧张，掏出笔记本电脑反复斟酌，实在是认真。我们几个则有说有笑，因为我们胸有成竹，而且，让别人更紧张。有了上海的经验，我们也没什么好慌的。&lt;/p&gt;&lt;p&gt;    答辩比我预想的要好多了，超常发挥，我详细地回答了评委专家的每一个问题。这边有个小插曲。有个评委问了我们的学校：“你填的上海彬达学院，到底是一个学校，还是学校里的学院？”（她把“杉达”读成了“彬达”），我们3个集体石化。的确，我们的学校名气太小了，专家们也是第一次见到。&lt;/p&gt;&lt;p&gt;    随后我们便出发游武汉了。日程表上写着22日下午3点有个优秀作品复议的。不过我们自我感觉没那么良好，觉得肯定不会是“优秀作品”，所以也没在意，把22号一天的游程都安排了。可22号那天下午正当我们快到湖北省博物馆的时候，张老师电话响了。还真的是“优秀作品”，要回去复议。这时候已经2点多了，于是我们打了辆出租彪回了华中师大。话说武汉的出租起步费只要6元，是上海的一半，但车况路况都很差，这种车在上海不允许上路的。到了比赛场地，一看，这“优秀作品”还不少。于是一个个队伍只能慢慢候场。最后，因为时间关系，很多队伍都取消复议了，包括我们。呵呵，白被“骗”回来一次。&lt;/p&gt;&lt;p&gt;    23号上午，是颁奖大会和闭幕式。其实这时候心里还是有点紧张的。对于我来说，是第一次参加全国性的比赛，当然希望拿个好点的奖回去。我们确实是二本最低分数的院校。但我们来了，就是代表了学校，代表了上海，尽可能要为杉达和上海争气，不要让别人瞧不起，就像来自上海的其他参赛队一样，我们杉达也绝对不要拖人家的后腿。评委开始报获奖结果了，每报一个奖项我们4个都捏一把汗。先是入围奖，报完，没有我们。然后是优胜奖，没有我们。这时候我们已经很开心了，因为肯定进三等奖之前了。当时我心里是准备三等奖的（毕竟上海才二等奖，全国高手更多，我这人比较悲观和低调）。谁知，三等奖报完，还是没有我们！谢天谢地啊！终于，在二等奖的时候，评委清楚响亮地报出了“上海杉达学院”！哈哈！那一刻我们真的很开心。“上海杉达学院”，这个原本让我不好意思开口和别人说的名字，此时此刻，被评委响亮地报了出来。这次它不再让我感到羞愧，而让我感到无比光荣。可能评委和其他学校的参赛队也是第一次听到杉达的名字。上台领奖的时候是我这几天来最激动的时刻。一等奖报完之后，我们发现，上海的参赛队基本都是二等奖。同济有一个一等奖。和我们杉达并列二等奖的不乏财大、商学院等学校。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    24号一早，我们乘坐和谐号返回了上海。载誉归来，父母也为我感到很光荣。&lt;/p&gt;&lt;p&gt;    通过这次比赛，我更加明白了，人的价值，不是靠多么响亮的名校来体现的。再差，也只是别人在说。只要自己不放弃自己，就不差。很多人，包括我，都是高分掉进杉达的，我们本来并不差，但如果破罐破摔，自暴自弃，就会出现“断网门”之类的恶性事件，非常有损学校的荣誉，当然要被人说三道四了。上次断网门之后我看了看网友的评论，几乎都说我们是没希望的人、素质最差的人。我认为没必要和他们争论了，我们已经证明了自己的价值。 &lt;/p&gt;&lt;p&gt;   最后一段是必须的，不然不和谐：我要感谢国家，感谢派对，感谢杉达，给我了这次机会……&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   &lt;img alt="" src="/uploads/20100731165545509.jpg" height="526" width="688" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;p align="center"&gt;   照片：我们在比赛大楼下（左：李炎君 中：汪宇杰 右：王菁） &lt;br /&gt;&lt;/p&gt;</description><pubDate>Fri, 30 Jul 2010 13:48:23 GMT</pubDate></item><item><title>gouride.com！狗日的.COM</title><link>http://www.wyjexplorer.cn/Blog/View/345C708D24A57B90.html</link><description>&lt;p&gt;前几天腾讯被计算机世界骂了“狗日的”，一时cnbeta上“狗日的”成了热门词汇。哈哈～&lt;/p&gt;
&lt;p&gt;不过今天要说的，和腾讯关系倒是不大。也是在cnbeta上刚看到的，&lt;a href="http://gouride.com"&gt;http://gouride.com&lt;/a&gt;。 打开一看竟然是中华人民共和国工业和信息化部的网站！顿时笑而不语。&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;确实，*朝的局域网确实是个悲剧，网民们不知积压了多少的愤怒，却没多少人敢说实话。于是只能通过注册域名等途径隐晦地发泄自己的不满。www.baidu.com.sb、gouride.com这样的域名，在茶余饭后，在悲剧的*朝，常常逗我们一笑，然后这一笑，不知蕴含了多少怨恨与无奈……&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100728154946261.jpg" height="379" width="662" /&gt; &lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20100728161100448.jpg" height="83" width="416" /&gt; &lt;/p&gt;</description><pubDate>Wed, 28 Jul 2010 16:03:42 GMT</pubDate></item><item><title>Win7下利用IIS自建网站全攻略！包括ASP和ASP.NET动态网站！高手勿入</title><link>http://www.wyjexplorer.cn/Blog/View/F06CA17530CCC60B.html</link><description>&lt;strong&gt;首先说明，本文是入门水平，不会介绍IIS中的高级技巧，旨在引领不明白网站建设的童鞋入门，所以高手们可以绕路，不要浪 费青葱。。万一看了，请笑而不语，多多包涵。&lt;/strong&gt;
&lt;p&gt; &lt;strong&gt;读者需要了解网站开发（网页制作）和一些计算机网 络的基本知识。本文不会介绍如何去编写网站以及网络的设置。只介绍如何用IIS架设一个现有的网站。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;自己建网站一直是很 多人的梦想。大家一定都多多少少学过网页制作。可做出来的网页，如何在internet上给朋友们看呢？如果你对服务器、网络等不了解，或没G购买虚拟主 机，没关系，你可以用自己的电脑DIY一个“服务器”出来！（当然，个人电脑做服务器是有很大局限性的，这个后面会讲）&lt;/p&gt;
&lt;p&gt;其实早在Win98 里，就可以自己建web服务器了。那个时候的组件叫做PWS，2000以后叫做IIS了。并且一直延续到今天。微软在个人版的系统中也预留了阉割版的 IIS，以便网站开发人员自己做测试。&lt;/p&gt;
&lt;p&gt;在XP时代，个人版操作系统中的IIS只允许10个并发连接，而且只允许建一个网站。&lt;strong&gt;而 在Win7里面，这个限制木有啦！！！啊哈哈哈哈！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下面我就带大家看看怎么在Win7上捣鼓一个Web服务器出来。&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;一、安装IIS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先呢，你得有张Win7的盘。Ultimate和Professional都 有这个组件。真实的光盘或者虚拟光驱加载ISO都可以。当然，要注意，你的盘必须和你机器上的win7版本是一致的。32位的就要用32位的盘。（图：加 载Win7 32位旗舰版虚拟光驱）&lt;/p&gt;
&lt;p&gt;【10:59修正】感谢&lt;a href="http://www.renren.com/profile.do?id=246760984&amp;ref=newsfeed" target="_blank"&gt;徐骏&lt;/a&gt;同学。Win7装IIS可以不要光盘。呵呵。&lt;/p&gt;
&lt;p&gt; &lt;img alt="" src="/uploads/20100718170559496.jpg" height="252" width="310" /&gt;&lt;/p&gt;
&lt;p&gt;然后呢。打开控制面板。在程序和功能里。选择“打开或关闭Windows功能”： &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718170632600.jpg" height="349" width="305" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718170651404.jpg" height="253" width="427" /&gt; &lt;/p&gt;
&lt;p&gt;之后呢，选择Internet信息服务 &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718170715577.jpg" height="440" width="436" /&gt; &lt;/p&gt;
&lt;p&gt;然后[确定]，等Win7慢慢装。几分钟就好了。 &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718170739112.jpg" height="196" width="374" /&gt; &lt;/p&gt;
&lt;p&gt;装好以后。在控制面板，管理工具里，会多出一个Internet信息服务IIS管理器。就是它了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718170803386.jpg" height="274" width="491" /&gt; &lt;/p&gt;
&lt;p&gt;当然，更快的启动方法是用Win7那NB的开始菜单直接搜索IIS。一秒就到了： &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718170828432.jpg" height="621" width="442" /&gt; &lt;/p&gt;
&lt;p&gt;打开之后，应该是这个样子： &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718170941841.jpg" height="447" width="700" /&gt; &lt;/p&gt;
&lt;p&gt;Win7中，IIS的版本是7.5。很好很强大，是目前最NB的IIS。威死它里是7.0的。XP是5.1的。当然，WindowsServer里 的IIS就要专业多了。毕竟是服务器的。咱们现在用的这个是玩具版。&lt;/p&gt;
&lt;p&gt;IIS的安装，到这里为止就结束了。大家明白了吗？恩？不明白- -! 自己Google去。&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;二、IIS的设置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;到这一步，你得先准备一个网站。至于网 站怎么编写，这个就不是本文介绍的内容了。当然，如果你要开论坛什么的，网上是有现成的免费的论坛程序下载的。ASP，ASP.NET都可以。我建议大家 用.NET的，为什么呢？[省略N千字.NET介绍，总之.NET很NB，微软技术天下无敌]。&lt;/p&gt;
&lt;p&gt;现在呢。我机器上已经有一个我用.NET写 好的网站了（E:\WebProject\GeekStudio）。我们看看怎么让它在IIS里跑起来。&lt;/p&gt;
&lt;p&gt;首先，在IIS面板左侧的那个什么 栏里，展开[网站]，选中Default Web Site。这是IIS内建的一个默认网站。我们就拿它开刀。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171028693.jpg" height="72" width="176" /&gt; &lt;/p&gt;
&lt;p&gt;然后在右边的那个什么栏里，点[高级设置]，然后在物理路径中，选择[...]，这时候可以浏览文件夹了，选中你网站的位置，然后确定。 &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171126193.jpg" height="552" width="515" /&gt; &lt;/p&gt;
&lt;p&gt;随后，点击[浏览 *:80]，IIS就会打开你的浏览器，马上就可以看到网站了！ &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171154773.jpg" height="207" width="202" /&gt; &lt;/p&gt;
&lt;p&gt;注意，现在的地址是http://localhost。表示本机。这个地址用IP也行。这就是 *:80的意思。表示任意IP的80端口。80也就是www服务端口。 &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171217186.jpg" height="424" width="559" /&gt; &lt;/p&gt;
&lt;p&gt;网站能运行之后。你就可以让你的朋友们欣赏了。所以，你需要知道自己的IP。我相信这个大多数人都会。什么？你不知道- -!。那俺只好再介绍一下：&lt;/p&gt;
&lt;p&gt;开始，运行 cmd。如果木有运行。可以直接按Windows + R。如果不知道什么叫Windows键。。。这个。。。咳咳。。&lt;/p&gt;
&lt;p&gt;CMD之后，输入ipconfig，回车。就可以看见自己的IPV4地址 了。如果你像我一样用的是路由器上网，则在路由器里可以看到internet IP，注意不是局域网192.168.*.*的那个。而是类似114.86.10.210这种公网IP。并且你需要给路由器做端口映射。这些属于网络技 术，本文也不做介绍了，可以自己Google去。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171252323.jpg" height="518" width="565" /&gt; &lt;/p&gt;
&lt;p&gt;如果你是ADSL直接连接internet的，就方便多了。ipconfig之后就可以直接看到你的IP地址。把这个地址发给你的朋友。他们在浏览 器里输入http://你的IP后，就可以看到网站了。&lt;/p&gt;
&lt;p&gt;万一木有看到，只要关掉Windows防火墙就可以了。&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;三、 ASP/ASP.NET等动态网站的设置方式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其实，多数网站还是动态为主。博客、论坛、新闻系统。都是动态的。这就需要 给IIS加装必要的运行环境了。&lt;/p&gt;
回到安装IIS的地方，在万维网服务，应用程序开发功能中。选择ASP和ASP.NET。 
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171329203.jpg" height="431" width="432" /&gt; &lt;/p&gt;
&lt;p&gt;如果你要运行的网站是ASP的： &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171405141.jpg" height="302" width="442" /&gt; &lt;/p&gt;
&lt;p&gt;然后在ASP选项中启用父路径和“将错误发送到浏览器”（不然没法调试） &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171432257.jpg" height="345" width="588" /&gt; &lt;/p&gt;
&lt;p&gt;如果你的网站是.NET的，并且机器上安装了Visual Studio： &lt;/p&gt;
&lt;p&gt;开始&gt;所有程序&gt;Microsoft Visual Studio 2008&gt;Visual Studio Tools&gt;Visual Studio 2008命令提示，然后键入aspnet_regiis -i，等待ASP.NET安装完毕，再次打开IIS主页，就会发现已经有ASP.NET的配置选项了&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171502674.gif" height="548" width="722" /&gt; &lt;/p&gt;
&lt;p&gt;ASP.NET的具体可以参见我以前写的一篇文章：&lt;a href="../readjour.aspx?id=59" target="_blank"&gt;http://www.wyjexplorer.cn/readjour.aspx?id=59&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关 于ASP.NET的设置有很多，但需要有.NET编程的知识。所以本文也不介绍了。我相信，会.NET的人都会。。。。本文只是教大家部署现有的网站。呵 呵。&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;四、进一步设置IIS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;细心的同学可能会注意到IIS里的这两个东东：&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171542989.jpg" height="167" width="170" /&gt; &lt;/p&gt;
&lt;p&gt;这两个选项其实还是非常实用的。先来说说默认文档的作用。&lt;/p&gt;
&lt;p&gt;其实默认文档就是一组列表，按优先级遍历网站目录，一旦匹配就把解析对应的 页面发送给客户端。在浏览器中的表现就是：http://www.xxx.com/。而不是http://www.xxx.com /default.aspx。如果没有默认文档，则浏览网站时必须输入完整路径。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171616242.jpg" height="347" width="281" /&gt; &lt;/p&gt;
&lt;p&gt;这幅图是IIS中默认的默认文档设置。在解析网站的时候，IIS会俺这个列表，依次寻找default.htm, default.asp, index.htm, index.html, iisstart.htm, default.aspx, index.php。我的网站目录下，只有一个default.aspx。于是IIS找到这里，就停止寻找，并把这个页面解析给浏览器。于是我们便只要 http://localhost就可以看到 default.aspx，无需输入完整路径，当然，输入也是可以的。如果你的网站同时存在index.htm和default.aspx，则按优先级， 送出的肯定是index.htm。这就是默认文档的作用。&lt;/p&gt;
&lt;p&gt;另一个是目录浏览，这个事关安全性，一定要小心设置：&lt;/p&gt;
默认情况下， 目录浏览是不启用的，这也是最安全的。当然，如果你想启用，也可以： 
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171645150.jpg" height="217" width="208" /&gt; &lt;/p&gt;
&lt;p&gt;目录浏览的意思是，当没有遍历到默认文档列表中的页面时，是否要给客户端返回一个目录列表。如果不启用，就会收到下面的错误： &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171733352.jpg" height="335" width="449" /&gt; &lt;/p&gt;
&lt;p&gt;如果启用，就是这样的效果：&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100718171812255.jpg" height="431" width="466" /&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
因为scripts目录不包含{default.htm, default.asp, index.htm, index.html, iisstart.htm, default.aspx, index.php}集中的一个或多个。所以IIS没办法选择默认情况下到底发哪个给客户端，除非客户端指定一个URL。于是，IIS就按目录浏览的设置 来进行工作了。开的话，就把整个文件夹的内容列表发给浏览器。
&lt;p&gt; &lt;strong&gt;五、Q &amp; A&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;等待提问。。。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description><pubDate>Sun, 18 Jul 2010 17:19:01 GMT</pubDate></item><item><title>《我叫MT》原创手工艺品：鸡蛋壳自制银磷胸甲神棍德o(∩_∩)o</title><link>http://www.wyjexplorer.cn/Blog/View/7B469235DEDEE566.html</link><description>&lt;p&gt;今天拿个鸡蛋壳自制了一个《我叫MT》中的奸商小德。o(∩_∩)o。&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100714133419211.jpg" alt="" border="0" height="468" width="625" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20100714133954945.png" height="351" width="501" /&gt; &lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100714133419402.jpg" alt="" border="0" height="466" width="623" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100714133419445.jpg" alt="" border="0" height="465" width="622" /&gt; &lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100714133419584.jpg" alt="" border="0" height="468" width="625" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20100714133728120.jpg" height="446" width="600" /&gt; &lt;/p&gt;&lt;p&gt;像吧？～&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100714133419587.jpg" alt="" border="0" height="452" width="604" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100714133419887.jpg" alt="" border="0" height="454" width="602" /&gt; &lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20100714133846317.jpg" height="434" width="600" /&gt; &lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100714133419973.jpg" alt="" border="0" height="452" width="603" /&gt; &lt;/p&gt;</description><pubDate>Wed, 14 Jul 2010 13:41:15 GMT</pubDate></item><item><title>Win7软破解，让32位系统用上4G内存。不可能的事实，求鉴定！</title><link>http://www.wyjexplorer.cn/Blog/View/8B6685A6E4616071.html</link><description>今天看到个软件据说可以破解32位系统的内存限制。我个人认为，是不可能的。因为32位系统从原理上讲，寻址能力就有限，最多能用到大概 3.25，3.5个G吧。&lt;p&gt;我的电脑配备了4G内存，用的是32位Windows7。于是准备试试。&lt;/p&gt;&lt;p&gt;这个软件叫 ReadyFor4GB，到处有下载。直接上截图：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20100709203435433.png" height="288" width="462" /&gt;&lt;/p&gt;&lt;p&gt;破解前，4G内存可用3.5G。&lt;/p&gt;&lt;p&gt;&lt;p&gt;软件是中文版的。点击应用按钮，就可以一键破解。之后用软件包中附带的AddBootMenu.cmd来添加启动菜单。记住都要以管理员身份运行。&lt;/p&gt;破解后重启电脑，会看到2个启动菜单。选那个with 128G支持的。 &lt;/p&gt;&lt;p&gt; &lt;img alt="" src="/uploads/20100709203551802.png" height="214" width="542" /&gt;&lt;/p&gt;&lt;p&gt;破解后，内存显示4.00G &lt;/p&gt;&lt;p&gt;&lt;img alt="" src="/uploads/20100709203642929.png" height="146" width="257" /&gt; &lt;/p&gt;目前用下来没有什么不稳定，但桌面右下角出现了水印* *!&lt;p&gt;关于本破解的原理，我实在是想不通。32位系统应该真的只能用到3.5G 呀，这个软件是如何突破理论的？难道真的有些真理于逻辑之外？太KB了～～&lt;/p&gt;</description><pubDate>Fri, 09 Jul 2010 20:37:48 GMT</pubDate></item><item><title>【七七事变，勿忘国耻】强烈谴责腾讯的忘本行为！！！</title><link>http://www.wyjexplorer.cn/Blog/View/25DB1E653D9B8318.html</link><description>&lt;p&gt;刚才逛cnbeta见有人说今天QQ不能把签名改成“七七事变，勿忘国耻！”。我试了试，还真的被吞掉这条签名了。回想起3月份Google事件，腾讯也曾经因为签名，关过一部分人的QQ号，如今又来了。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;要说Google事件，那是满纸屏蔽词，你要封就封吧。可今天是七七事变纪念日，这个完全没有错的日子，你为什么不让说呢？！&lt;/p&gt;&lt;p&gt;由于我和大部分被激怒的群众一样，有可能是不明真相的围观群众， 不知道是否会牵扯出屏蔽词，为了防止喝茶及跨省，本日志内容还是少写为好。但这沉默绝不代表妥协。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;下面是我在网易论坛看到的帖子： &lt;/p&gt;&lt;p&gt;“今天是七七事变的日子。 &lt;/p&gt;每一位中国人，都会记住这一天。 &lt;br /&gt;我们的先辈流汗流血，换来的今天美好生活，我们要牢记。 &lt;br /&gt;但是我今天 看见一件非常气愤的事情， &lt;br /&gt;    &lt;strong&gt;腾讯旗下QQ签名档不可以改为“七七事变，勿忘国耻”。 &lt;/strong&gt;    &lt;br /&gt;我 真的气炸了，太气愤了！~ &lt;br /&gt;是什么给他的权利忘记了生他养他的国家， &lt;br /&gt;是什么让他忘记了一个中国人牢记的日子, &lt;br /&gt;我深深的谴责腾 讯这种行为， &lt;br /&gt;腾讯出来道歉 &lt;br /&gt;     &lt;br /&gt;希望大家转载谴责他”</description><pubDate>Wed, 07 Jul 2010 14:31:41 GMT</pubDate></item><item><title>杉达水上乐园</title><link>http://www.wyjexplorer.cn/Blog/View/6C93965D4AE02305.html</link><description>&lt;p&gt;    我不敢把标题写成某某门，不然有人会神经过敏。&lt;/p&gt;
&lt;p&gt;    本文纯属个人日记，绝无任何针对和批判校方的意思，谢绝喝茶。&lt;/p&gt;
&lt;p&gt;    今天是本学期最后一天了，下了一天的雨，考完马克思我走出考场，MLGBD，只见5、6号楼中间的马路上已经都是泥水了。N多人只好在门口等着积水退去。我- -!，我想从4号楼出去吧～可是走到4号楼底下大厅，情况更加糟糕。偏偏还有辆校车停在了正中间，把最浅的地方霸占了……MLGBD！这时候已经有几个男生实在木有办法直接淌水过去了- -!。我看了看，还是算了。我想，1号楼应该可以走吧。于是赶往1号楼出口，一路上只见到泥水啊～～还没走到1号楼出口，就看见门口已经有好多人了，好吧，这里一定也出不去了。我来到出口，看了看，实在木办法了，再不回寝室时间就来不及了- -!。于是我豁出去了，把裤脚管一撩直接淌着泥水往前走。我靠这个水深的啊，已经到小腿了，没走几步裤子就全湿了- -! 而且，撑伞和没撑是一样的……经过艰难跋涉终于TM到寝室了。惨烈啊！话说寝室门口的水还有点温，因为都是车停在那里- -!&lt;/p&gt;
&lt;p&gt;    那么这次的积水是为什么说浑浊的泥水，而不是雨水呢？这还得感谢施工方啊，你们[省略N处不恰当内容]&lt;/p&gt;
&lt;p&gt;
下面看图：
&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100629171451493.jpg" height="514" width="686" /&gt; &lt;/p&gt;
&lt;p&gt; &lt;img src="/uploads/20100629171824862.jpg" alt="" border="0" height="508" width="679" /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt; &lt;img src="/uploads/20100629171825236.jpg" alt="" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100629171825339.jpg" alt="" border="0" height="486" width="650" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100629171825373.jpg" alt="" border="0" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100629171825482.jpg" alt="" border="0" height="800" width="600" /&gt; &lt;/p&gt;
&lt;p&gt; &lt;img src="/uploads/20100629171825521.jpg" alt="" border="0" height="479" width="639" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100629171825660.jpg" alt="" border="0" height="800" width="600" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100629171825676.jpg" alt="" border="0" height="450" width="600" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100629171825734.jpg" alt="" border="0" height="466" width="623" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/20100629172230852.jpg" height="467" width="624" /&gt; &lt;/p&gt;
&lt;p&gt;不知怎么。我想起一句话：水可载舟，亦可覆舟。也许，茶水可以淹没一些不和谐的声音，得到表面上的宁静，但这宁静绝不是永远的。当洪水来临时，如果只是封堵，那么这股洪水所积蓄的能量会越来越多，总有一刻会决堤。很可惜，当权者永远只知道封堵而不是疏导。 &lt;/p&gt;
</description><pubDate>Tue, 29 Jun 2010 17:24:08 GMT</pubDate></item><item><title>教你删除系统中的百度工具栏及浏览器搜索栏！</title><link>http://www.wyjexplorer.cn/Blog/View/992B6B4755D7A5BE.html</link><description>&lt;p&gt;百度是一个人尽皆知的没有道德的流氓企业！&lt;strong&gt;它的流氓软件百度工具栏危害极大！很早就被360等工具视作了清理对象。&lt;/strong&gt;但 这孙子仍然死性不改，继续危害着大家的电脑。百度工具栏通过和其他软件捆绑安装，很容易就装到了用户的电脑中（有些软件就算你不勾选，也会装进去），从而 扩大市场占有率，通过不正当手段竞争，太下贱了！流氓dis！相比之下Google就不会使用这样下贱的流氓手段，一直是最尊重用户利益的。唉，可惜没办法啊，在天朝受尽了CCAV的欺负！&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;一、删除百度工具栏的方法：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.在控制面板-添加删除程序中，按正常uninstall方法卸载百度工具栏。（其实这时候还没有卸干净）&lt;/p&gt;
&lt;p&gt;2.下载Windows清理助手（www.arswp.com），建议&lt;a href="http://download.arswp.com/arswp3/x86/arswp3_x86.zip" target="_blank"&gt;下载绿色版&lt;/a&gt;。启动Windows清理助手并扫描系统。扫描结果中选中三方插件，百度工具栏。执行清理。很方便就 能清理掉这个流氓软件。&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100622111844963.jpg" alt="" border="0" height="356" width="485" /&gt; &lt;/p&gt;&lt;p&gt;&lt;p&gt;3.别忘了重启电脑～&lt;/p&gt;&lt;p&gt;    &lt;strong&gt;二、删除浏览器搜索栏中的百度搜索&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;    &lt;strong&gt;以Internet  Explorer 8.0为例：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;    &lt;strong&gt;1.在搜索框下拉菜单中选择“管理搜索程序”&lt;/strong&gt;      &lt;br /&gt;     &lt;img alt="" src="/uploads/20100622111928591.png" height="275" width="313" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    &lt;strong&gt;2.将你喜欢的搜索引擎比如Google设为默认值&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;    &lt;img alt="" src="/uploads/20100622111944933.png" height="426" width="577" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    &lt;strong&gt;3.选中百度相关项，立即删除！！！&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;    &lt;img alt="" src="/uploads/20100622112005665.png" height="426" width="581" /&gt;&lt;br /&gt;      &lt;br /&gt;&lt;/p&gt;&lt;p&gt;最后，还是要提醒大家，平时装软件的时候一定要小心。尤其是国产软件，很喜欢捆绑一些乱七八糟的插件和木马。&lt;/p&gt;&lt;p&gt;【消灭百度，人人有责】继续去cnbeta给所有百度的新闻打双-5&lt;/p&gt; &lt;/p&gt;</description><pubDate>Tue, 22 Jun 2010 11:20:55 GMT</pubDate></item><item><title>Visual Studio类关系图中更改字体的办法</title><link>http://www.wyjexplorer.cn/Blog/View/DD834C5664B620A2.html</link><description>&lt;p&gt;今天装了个VS2010的中文版。结果打开以前项目的类关系图一看，发现中文字体囧了：&lt;/p&gt;
&lt;p&gt;&lt;img border="0" alt="" src="/uploads/20100601160204725.jpg" width="300" height="122" /&gt;&lt;/p&gt;
&lt;p&gt;我是Windows7的系统，并且已经打开了ClearType。可是在VS类关系图中，中文字体硬是没有ClearType的效果。于是想改类关系图的字体，结果发现VS设计器中貌似没有这样的选项。琢磨一番后发现了。原来要手动编辑CD文件才行：&lt;/p&gt;
&lt;p&gt;&lt;img border="0" alt="" src="/uploads/20100601160326222.jpg" width="342" height="150" /&gt;&lt;/p&gt;
&lt;p&gt;1.在CD图上点右键，打开方式里选择XML文本编辑器。&lt;/p&gt;
&lt;p&gt;&lt;img border="0" alt="" src="/uploads/20100601160411909.png" width="272" height="66" /&gt;&lt;/p&gt;
&lt;p&gt;2.最下方找到Font标签，在Name属性中更改字体&lt;/p&gt;
&lt;p&gt;&lt;img border="0" alt="" src="/uploads/20100601160520426.jpg" width="300" height="42" /&gt;&lt;/p&gt;
&lt;p&gt;3.这是宋体的效果&lt;/p&gt;
&lt;p&gt;&lt;img border="0" alt="" src="/uploads/20100601160502944.jpg" width="308" height="114" /&gt;&lt;/p&gt;
&lt;p&gt;4.这是Verdana的效果～&lt;/p&gt;
&lt;p&gt;看来，在VS类关系图中，只有支持ClearType的英文字体才会有ClearType效果。中文字体只能是毛边。遇到微软雅黑这样的字体，如果没有ClearType，就会异常难看。还是换掉比较好～&lt;/p&gt;
&lt;p&gt;文章写得比较仓促～不过大家应该都能明白。明天考离散数学了，大家祝我逢考必过啊！&lt;/p&gt;</description><pubDate>Tue, 01 Jun 2010 16:08:34 GMT</pubDate></item><item><title>关于Google的SSL加密搜索</title><link>http://www.wyjexplorer.cn/Blog/View/2BB97F15673B03E6.html</link><description>&lt;p&gt;    "&lt;strong&gt;Google今天在博客宣布已经将Google.com列入SSL加密访问产品的范围，SSL可以帮助用户访问互联网服务时传递的数据不 被窃取，包括保护密码和输入登录信息等。&lt;/strong&gt;几年前，Google将部分网络服务用SSL加密，例如Gmail和Docs，今年他们采取了 一个步骤让GMail用户默认使用SSL，今天，Google的最基础服务--搜索也将支持SSL，您只需要在地址前加https，看到浏览器地址栏的锁 标记后，就可以加密传输您的搜索关键词，避免被截获，虽然搜索过程由于SSL加密会变慢，但不会影响搜索结果。" &lt;br /&gt;&lt;/p&gt;&lt;p&gt;    简单的说，就是可以避免搜索结果页含敏感内容被重置（就是国内经常出现的“该页无法显示”）。不明真相的同学请自己探索，实在不方便在网上说。&lt;/p&gt;&lt;p&gt;     SSL加密搜索的地址是：&lt;a href="https://www.google.com"&gt;https://www.google.com&lt;/a&gt; ，注意，是https，http后面有s，表示SSL协议。但在国内，访问这个地址容易被重定向到香港谷歌。有人说点击Google.com in English就可以，这个我没试过，至少今天我能访问SSL谷歌。&lt;/p&gt;&lt;p&gt;    关于如何在浏览器中设置Google的SSL搜索，请参见这篇文章：&lt;a href="http://www.cnbeta.com/articles/111839.htm"&gt;http://www.cnbeta.com/articles/111839.htm &lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    万一这篇文章打不开也不要惊奇，cnbeta上关于谷歌SSL的有些文章已经被蒸发了，我表示什么都不知道，什么都没看到，很傻很天真。你们懂的～。实在要看的同学可以看我的校内日志。或者找我当面交流。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    最后还是要告诫大家：国内的网络环境比较特殊，为了您和家人的生命财产安全，请不要在网上进行不和谐的活动，不然[此处省略]。&lt;/p&gt;</description><pubDate>Sun, 23 May 2010 14:11:11 GMT</pubDate></item><item><title>百度VS谷歌，谁黄谁暴力？看图便知！</title><link>http://www.wyjexplorer.cn/Blog/View/6B29D29AE684804D.html</link><description>&lt;p&gt;CCAV一天到晚欺负谷歌，说人家很黄很暴力。结果把人家逼走了。今天无意中看CB新闻发现了件趣事，正好来看看到底谁最黄最暴力：&lt;/p&gt;
&lt;p&gt;和谐社会，请网友们谨慎评论 ～ 你们懂的，不解释。&lt;/p&gt;
&lt;p&gt;&lt;img border="0" alt="" src="/uploads/20100521214330763.jpg" width="550" height="405" /&gt;&lt;/p&gt;
&lt;p&gt;这是百度的搜索提示。截至发稿。百度已将其删除。哈哈原来百度也看CB&lt;/p&gt;
&lt;p&gt;&lt;img border="0" alt="" src="/uploads/20100521214356126.png" width="569" height="462" /&gt;&lt;/p&gt;</description><pubDate>Fri, 21 May 2010 21:42:28 GMT</pubDate></item><item><title>关于.SB域名......</title><link>http://www.wyjexplorer.cn/Blog/View/C8E198671B8A8B32.html</link><description>&lt;p&gt;昨天得知谷歌注册了一个www.baidu.com.sb域名，甚爽。真希望哪天CCTV也能有此待遇～。&lt;/p&gt;
&lt;p&gt;不过话说回来了，这个.SB域名，绝对不是骂人的。世界上也有很多SB网站（其实Google自己就有一个google.com.sb）。谷歌这次真的是一举两得啊，即非正面讽刺了百度，又抢注了这个域名，百度要是想拿回来多数是要花钱了～&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;以下是SB的资料：&lt;/strong&gt; &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt; .sb域名是所罗门群岛国家顶级域名。南太平洋岛国。包括瓜达尔卡纳尔岛、马莱塔岛、圣克里斯托瓦尔岛、舒瓦瑟尔岛、圣 伊莎贝尔岛、佛罗里达岛、伦内尔岛、拉塞尔岛、肖特兰群岛、圣克鲁斯岛和新乔治亚群岛以及小岛和环礁。&lt;/p&gt;
&lt;p&gt;面积：28,370平方千米。人 口：480,000(2001)。&lt;/p&gt;
&lt;p&gt;首都：霍尼亚拉。人口以美拉尼西亚人为主。&lt;/p&gt;
&lt;p&gt;语言：英语(官方语言)、皮钦语(一种混杂英 语)，另有60多种美拉尼西亚土语。&lt;/p&gt;
&lt;p&gt;宗教：基督教(多为新教)。&lt;/p&gt;
&lt;p&gt;货币：所罗门群岛元。该群岛包括7个大火山岛群，形成两串平 行的岛链，并集中于东南部。大部分岛屿林木茂密，地势崎岖不平，河流不长，但水流湍急。气候炎热。经济以农业、渔业和木材业为基础。旅游业已发展起来，以 乘客轮游览和参观第二次世界大战战场为主。该国为君主立宪政体，一院制。国家元首为英国君主，由总督作为代表。政府首脑为总理。所罗门群岛很可能在公元前 2000年就开始有人居住，大概是讲澳斯特罗尼西亚语的民族。1568年西班牙人来到此地。荷兰人、法国人和英国人也先后探险至此。1893～1900年 为英国保护地，后成为英属所罗门群岛。1942年，日本人入侵，其后3年在所罗门群岛上的战事是太平洋战区中最为激烈的，尤以瓜达尔卡纳尔为甚。1975 年保护地被允许自治。1978年获得完全独立。(另一个称作所罗门群岛的岛群，包括布干维尔岛，为巴布亚新几内亚的一部分。)&lt;/p&gt;&lt;p&gt; &lt;/p&gt;</description><pubDate>Sun, 09 May 2010 13:51:08 GMT</pubDate></item><item><title>Office 2010 简体中文正式版截图欣赏</title><link>http://www.wyjexplorer.cn/Blog/View/E6DED48D7D13BBD4.html</link><description>&lt;p&gt;其实我很早就在用2010了，从Beta1用到现在，感觉进步很大。昨天MSDN发布了正式版，setup的版本号是4755，安装好其实是 4760。这个版本和远景之前泄露的是一样的。令我想起了当时Windows7泄露的时候，我从7月19日就开始用了，也比MSDN和微软正式发售要早很多，当时就有不少人喷我是骗子不可能用正式版，呵呵，我不解释了，事实就是最好的证据。这次Office也一样～&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;好 了废话不多赶紧上截图：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我用的是Microsoft Office Professional Plus 2010 x86(32位) 简体中文正式VOL版。用KMS方法成功激活（似乎要每180天激活一次。至少现在没什么好办法解决。）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. 下载完的ISO和KMS激活工具  &lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100423195344622.png" alt="" width="508" height="416" border="0" /&gt;&lt;br /&gt; 2.  setup版本号&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100423195547545.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;3. 新的图标&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100423195615258.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;4.新的界面&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100423195642118.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;5.版本信息&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100423195703932.png" alt="" width="587" height="441" /&gt; &lt;/p&gt;
&lt;p&gt;6.激活工具&lt;/p&gt;
&lt;p&gt;&lt;img src="/uploads/20100423195719673.png" alt="" width="258" height="294" /&gt; &lt;/p&gt;</description><pubDate>Fri, 23 Apr 2010 19:57:32 GMT</pubDate></item><item><title>页面变灰与中国式浏览器大战不得不说的故事</title><link>http://www.wyjexplorer.cn/Blog/View/C4573ADC1AA7A8A1.html</link><description>&lt;p&gt;   今天又是全国哀悼，和2年前的汶川一样。大多数网站都把页面调成了灰色以表哀悼。&lt;/p&gt;&lt;p&gt;   不过细心的朋友可能发现了，一些网站的页面灰色效果，只有IE浏览器有效。火狐、Chrome等用户看上去还是一片彩色。（如下图，左边火狐，右边IE）。这是什么道理呢？&lt;img src="/uploads/20100421152303650.png" alt="" border="0" height="450" width="673" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;   先让我们看看如何实现IE下页面变灰吧。（这里需要一点网页制作知识）&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   其实，拿CSS来控制，一行代码就能完成。用的是IE的filter滤镜。通过给页面所有元素加上灰色滤镜，IE在渲染的时候就会自动把图片、文字等一切页面元素变灰。代码如下：&lt;br /&gt;&lt;/p&gt;&lt;p align="center"&gt;   *{filter: gray;}&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   其中*表示所有html元素。如果有一定CSS经验你会知道用*选择器是非常不建议的，但这里为了保证能够渲染到所有的元素，必须使用*，不然有些背景图会漏过（就像我的网站，如果给body加滤镜，背景仍然会是彩色）。当然，如果你的网页比较简单，能够用body选择器就尽量别用*。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   属性中的filter是IE特有的滤镜，相关的属性可以查阅文档。既然是IE特有的，那别的浏览器当然无法渲染。那又是什么原因导致了IE独享这个CSS规则呢？&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   在很久以前，各大浏览器为了抢夺标准，纷纷设立了自己的小标准，比如微软公司就为IE设立了一系列的滤镜以及页面过度效果，火狐则支持阴影效果（shadow）。但这些私有的小标准不被W3C承认（他们不是Web标准的），所以就导致了各浏览器都有自己的“特长”。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   在现在尤为热门Web标准为指导思想的网页设计中，使用这些不规范的标准是不可取的。也就是说，今天哀悼日许多网站把网站变灰的方法，是不建议使用的。因为这种方法不能考虑到所有的用户。比较妥善的做法，应该是更改CSS配色来达到变灰的目的，当然与一行filter代码比起来，工作量比较大。但是这样可以兼容所有的浏览器。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   但在中国，采用滤镜的方法，还是能够保证大部分人的观看效果的。而在国外，尤其是欧美地区，由于浏览器大战的效应，起码有一半的人无法看到filter:gray的效果。那为什么中国式“浏览器大战”不影响滤镜效果呢？&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   分析中国的网络环境，不难看出，大部分人仍然在使用IE浏览器，或是IE内核的浏览器，其中又有很大一部分人在使用老掉牙的IE6版本。所谓IE内核的浏览器，就是指页面渲染引擎仍然是IE，只是换了个壳而已的浏览器。比如傲游、360安全浏览器等，这些浏览器整天拼个你死我活，标榜自己有多NB，抢着用户市场，却只是IE之上的一个浮华的UI而已！其渲染效率与JS效率从本质上说根本没有改变，这些浏览器只比IE多几个功能而已（比如分页、手势等）。这就像造汽车，同样的发动机，换个车壳而已，根本没什么好NB的，因为最关键的核心部分并不是你自己设计的。国内的浏览器大战，真是让人哭笑不得。所以，既然这些浏览器都是IE内核，自然支持filter了。当然，IE该差的，他们也都差了。跑个Acid3测试就全露出狐狸尾巴了～&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   不过我很高兴看到有许多网站已经开始通过更改CSS配色的方法来实现页面变灰的效果了。虽然只为了今天短短的一天，但说明中国的设计师已经开始考虑非IE用户了。也说明真正的浏览器大战已经开始渐渐作用于中国了。很高兴看到这一天。希望中国也能自己开发浏览器内核，而不要整天给IE“换装”，来制作换汤不换药的所谓的浏览器了！只有创新，才是真正的自主开发，才不会被人鄙视。在这个功利的社会下，指望中国在软件方面有所创新和成就，实在是比较困难，不过我仍然希望我能看到这一天。虽然平时经常说中国这个不行那个不行，但这都是无奈的抱怨。其实我们打心眼里，就不希望我们比任何一个国家，任何一个民族差！&lt;/p&gt;&lt;br /&gt;</description><pubDate>Wed, 21 Apr 2010 15:24:21 GMT</pubDate></item><item><title>VS2010各版下载与激活KEY(新增中文版地址)</title><link>http://www.wyjexplorer.cn/Blog/View/7580294F13147E6E.html</link><description>&lt;p&gt;今天终于成功激活了VS2010 Ultimate 正式版～哈哈&lt;img alt="" src="/uploads/20100414170245416.png" height="362" width="534" /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt; 以下下载全部为英文版：&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;span style="color: red;"&gt;6月1日新增：Visual Studio 2010 x86 中文旗舰版：&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4ae6228933dde49d9bfa4c3467c831c2|&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6月19日新增：Visual Studio 2010 Express中文版：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://download.microsoft.com/download/5/C/1/5C156922-CA10-49D8-B7E7-9BF092C3B6EB/VS2010ExpressCHS.iso"&gt;http://download.microsoft.com/download/5/C/1/5C156922-CA10-49D8-B7E7-9BF092C3B6EB/VS2010ExpressCHS.iso&lt;/a&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Visual Studio 2010 Professional：&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5414e4c0-c1f8-473e-8e9d-a1a7be786141&amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=5414e4c0-c1f8-473e-8e9d-a1a7be786141&amp;displaylang=en&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="color: #0000ff;"&gt;Visual Studio 2010 Ultimate(我们一般用这个，后面有KEY) ：&lt;/strong&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06a32b1c-80e9-41df-ba0c-79d56cb823f7&amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=06a32b1c-80e9-41df-ba0c-79d56cb823f7&amp;displaylang=en&lt;/a&gt;&lt;img alt="" src="/uploads/20100414170338980.png" height="481" width="719" /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Visual Studio 2010 Express (Visual Baisc / Visual C++ / Visual C# / Web Developer各组件Express版，可单独下载也可一起下载，适合学生和编程爱好者) &lt;a href="http://www.microsoft.com/express/Downloads/#2010-All"&gt;http://www.microsoft.com/express/Downloads/#2010-All &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VS2010 Ultimate KEY：YCFHQ9DWCYDKV88T2TMHG7BHP&lt;/strong&gt; （本人亲测可用）&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;激活方法：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先下载安装VS2010 Ultimate 试用版（也就是评估版），用KEY激活后即为正式版。控制面板 - 程序和功能（添加删除程序）- Visual Studio 2010 - 更改/删除 - 在页面最下方填写激活码，然后点击Activate，会显示一个激活成功界面。OK，现在打开VS2010就已经没有时间限制了，就是个正式版了～&lt;br /&gt;
&lt;/p&gt;</description><pubDate>Wed, 14 Apr 2010 15:58:42 GMT</pubDate></item><item><title>VS2010正式评估版及.NET Framework4.0下载！</title><link>http://www.wyjexplorer.cn/Blog/View/EAEB2E4FFADB61C8.html</link><description>&lt;p&gt;终于等来了！MSDN昨天晚上就放出下载了～废话不多直接给下载地址。本人亲测可用！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;下载:&lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&amp;displaylang=en"&gt;Microsoft  .NET Framework 4 （根据某规定，应该写成：微软点网络框架第四版）&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/visualstudio/zh-cn/download"&gt;http://www.microsoft.com/visualstudio/zh-cn/download&lt;/a&gt; &lt;/strong&gt; &lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;终极版地址：&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06a32b1c-80e9-41df-ba0c-79d56cb823f7&amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=06a32b1c-80e9-41df-ba0c-79d56cb823f7&amp;displaylang=en&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;感谢cnBeta～ 感谢MSDN～ (远处传来声音：应该先感谢国家，你个XX！)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;哦不，根据最新规定，应该这样：&lt;/p&gt;&lt;p&gt;感谢中国测试版，感谢微软开发者网络。。。。话说VS2010发布会还好没有请CCTV来啊，不然得累煞CCTV的播报员了～满纸的外来词啊～。哈哈，VS2010有了，接下来咱们就等“视窗第七版服务包一”了～～&lt;br /&gt;&lt;/p&gt;</description><pubDate>Tue, 13 Apr 2010 08:25:59 GMT</pubDate></item><item><title>收到微软公司快件～感谢Lucky7！</title><link>http://www.wyjexplorer.cn/Blog/View/F859689468796443.html</link><description>&lt;p style="text-indent: 21.2pt;"&gt;首先声明我不是微软的枪手。。。&lt;/p&gt;
&lt;p style="text-indent: 21.2pt;"&gt;今天下午，我收到了来自微软中国有限公司的快件。寄来的是Windows7入门教程的光盘。我很激动，也很感动。&lt;/p&gt;
&lt;p style="text-indent: 21.2pt;"&gt;要说来历的话，是前段时间给同学装机器，我给他装了个Windows7，结果同学说刚用Win7很不习惯，还是喜欢XP。可其实，XP无论从安装部署还是功能和易用性上，都不如Win7。大概是中国用户XP用惯了，确实一下子难以适应Win7吧。我还有个同学在美国，购买了正版的Win7旗舰版，竟然也说后悔，想用XP。好吧，大概是微软在帮助用户过度的方面做的还不周到。&lt;/p&gt;
&lt;p style="text-indent: 21.2pt;"&gt;于是我就考虑能不能有一个帮助XP用户过度到Win7的简明易懂的入门教程呢？怀着试试看的心情，我在校内网上给Lucky7留了言。没想到很快便得到了小7的回复，并说要寄光盘给我，我很感动！Lucky7每天都要处理数以百计的邮件和留言，我作为一个个人，是如此的渺小，但小7却能够如此重视我，一位Windows用户的反馈，我真的很感谢。&lt;/p&gt;
&lt;p style="text-indent: 21.2pt;"&gt;我想，微软公司的成功，很大一部分是来源于对用户反馈的倾听。正如Windows7广告中所说的，A billion Ideas = 7，这样一个成功的产品，不仅仅是微软员工的成果，更是全世界用户共同的想法铸成的。为用户而打造的产品，当然很受用户的欢迎。相比之下，中国有些整天打着“用户至上”口号的公司，却一直在用流氓条款来恶心用户，只想着钱，而不为用户提供周到的服务，真是恶心至极啊！而微软懂得尊重每一位用户的想法。&lt;/p&gt;
&lt;p style="text-indent: 21.2pt;"&gt;好啦。下面发图～&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div align="center"&gt;&lt;img src="/uploads/20100326162833581.jpg" alt="" border="0" height="460" width="614" /&gt;&lt;/div&gt; &lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div align="center"&gt;&lt;img src="/uploads/20100326162834989.jpg" alt="" border="0" height="460" width="615" /&gt;&lt;/div&gt; &lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div align="center"&gt;&lt;img src="/uploads/20100326162833940.jpg" alt="" border="0" height="466" width="623" /&gt;&lt;/div&gt; &lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div align="center"&gt;&lt;img src="/uploads/20100326162834307.jpg" alt="" border="0" height="461" width="616" /&gt;&lt;/div&gt; &lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div align="center"&gt;&lt;img src="/uploads/20100326162834443.jpg" alt="" border="0" height="469" width="627" /&gt;&lt;/div&gt; &lt;p&gt; &lt;/p&gt;</description><pubDate>Fri, 26 Mar 2010 16:30:51 GMT</pubDate></item><item><title>C#输出九九乘法表</title><link>http://www.wyjexplorer.cn/Blog/View/7752EF234EB22087.html</link><description>&lt;p&gt;仅供参考&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _99table
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 1; i &lt; 10; i++)
            {
                for (int j = 1; j &lt;= i; j++)
                {
                    Console.Write("{0}×{1}={2} ", j, i, (j * i));
                    if (j * i &lt; 10)
                    {
                        Console.Write(" ");
                    }
                    if (i == j)
                    {
                        Console.Write(Environment.NewLine);
                    }
                }
            }
            Console.ReadLine();
        }
    }
}
&lt;/pre&gt;</description><pubDate>Wed, 17 Mar 2010 09:48:15 GMT</pubDate></item><item><title>麦田上的Firefox怪圈～</title><link>http://www.wyjexplorer.cn/Blog/View/DC9352755C80BECE.html</link><description>&lt;p&gt;用GoogleEarth的朋友们可以试试，输入Firefox，会找到一处印有火狐浏览器logo的麦田怪圈～&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100313125420974.jpg" alt="" border="0" height="575" width="608" /&gt; &lt;/p&gt;&lt;p&gt;北纬45°07′25.58″，西经123°06′49.33″&lt;/p&gt;&lt;p&gt;外国人真是又无聊又有创意啊~~ &lt;br /&gt;&lt;/p&gt;&lt;p&gt;今天校内网上发现一小猫相册，和这个logo有异曲同工之处～&lt;/p&gt;&lt;p&gt;&lt;img src="/uploads/20100313125547235.jpg" alt="" border="0" height="500" width="500" /&gt; &lt;/p&gt;&lt;p&gt;以后难道会有FireCat - -! &lt;br /&gt;&lt;/p&gt;</description><pubDate>Sat, 13 Mar 2010 12:56:17 GMT</pubDate></item><item><title>xfocus的离去引发的思考</title><link>http://www.wyjexplorer.cn/Blog/View/C9BE4ACF233BFFE7.html</link><description>&lt;p&gt;   最近发现xfocus（安全焦点）不能访问了。无论是www.xfocus.net还是www.xfocus.org，都打不开了。顿时，不知从何而来的失落感涌上心头，感觉就像失去了一位挚友。更多的是叹息吧。&lt;/p&gt;&lt;p&gt;   确实，在这个物欲横流的世界里，像xfocus这样，能够以真正的技术追求为目的，而不是以金钱和名誉来满足贪婪之心的组织，已经不多了。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   大概很多同学不知道xfocus是什么。它是一个探讨网络安全技术的组织，但不同于别的黑客网站，确切的说，不论是从技术上，还是精神上，都是至高无上的，真不想把它和别的黑客网站放在一起，我怕玷污了xfocus。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   简而言之，国内那些自称黑客的，和他们的圈子内，就只有浮躁，虚荣，做作！只会向钱看。没几个能静的下心来的！中国人最大的缺点就是浮躁。有些人，整天怨天尤人，什么都学不进，碰到一点挫折就要放弃，搞任何东西都是三分钟热度！如果心中充满杂念，就不会静下心来钻研。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   印象最深的，是xfocus的页面。简洁的不能再简洁了，就像这个组织一样，以最真实，最平凡的态度面对一切，没有任何修饰与伪装，只有最真实的亲切。这种亲切感能你卸下伪装，能让你能抛开杂念，能让你超凡脱俗。还记得当年初入xfocus，感觉一瞬间洗净了嘈杂与喧闹，疲惫的心灵能够有个恬静的港湾。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   人，也是一样，无需用各种手段来伪装自己。过多的点缀只能突出虚伪的一面，与其包装自己，算尽心机，还不如诚以待人。&lt;/p&gt;&lt;p&gt;
   也许你看不懂xfocus上的文摘，用不来它的软件，但你能感觉到，造访xfocus，就像在和一个高尚的人谈话。&lt;/p&gt;&lt;p&gt;   可惜，这位高尚的人走了……大概是因为这个社会已经脑残了吧……&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   “&lt;strong&gt;为什么中国的黑客几近于无，有的只是浮躁、虚荣、作做……？或许是缺乏环境。Free与Open的环境&lt;/strong&gt;”。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   太多的无奈，太多的辛酸。它留给我们的是思考，超越计算机技术的思考。是对人生态度的思考，对社会的思考。它教我们的，是为人处事的哲学。它想告诉我们，在这个浮华的社会里，什么才是最本质的，什么才是应该把握的，什么才是衡量价值的标准。但可惜，每个人都在赶路，迷茫地先前走，很少有人能静心思考。最难研究的，其实，是我们自己……&lt;br /&gt;&lt;/p&gt;&lt;p&gt;附：xfocus – 关于我们 （从google缓存中找到的）&lt;/p&gt;

一、这个鬼地方&lt;br /&gt;
&lt;br /&gt;
1、定位&lt;br /&gt;
全方位、非商业而且有自己独特风格的黑客及安全站点。&lt;br /&gt;
&lt;br /&gt;
2、目的&lt;br /&gt;
a、整理和发掘网络安全、黑客方面技术文献及工具、代码。&lt;br /&gt;
b、发布我们——包括任何一个对安全有想法的朋友——的想法和发现，为大家提供发布文章及安全、黑客相关工具的园地。&lt;br /&gt;
c、结识更多有共同志向的朋友，共同研究、讨论网络安全的方方面面。&lt;br /&gt;
&lt;br /&gt;
3、历史&lt;br /&gt;
1999年8月，个人主页安全焦点由xundi发起建立。&lt;br /&gt;
以这个站点为中心，几个对网络安全有一定兴趣的朋友便聚到了一起。聊天、学习，并且把&lt;br /&gt;
自己的心得体会告诉大家。&lt;br /&gt;
2000年1月1日，站点改版。风格简单得不能再简单，实用——这是大家都欣赏的。&lt;br /&gt;
2001年1月1日，站点改版，加入了漏洞利用程序的搜索引擎，整个主页由perl驱动。&lt;br /&gt;
2001年3月17日，站点改版，由php+mysql驱动。加入论坛、CVS项目、IRC、知识问答等，并把漏洞利用程序搜索引擎替换为在功能定义上更为完善的漏洞数据库。这次改版从形式到内容，都将是一个比较大的飞跃，站点有了很强的可扩展性。与国内同类网站相比，我们希望有更好的文档和工具分类，更深入的归纳整理，更强大的检索功能，成为文档和工具中心可能是我们的发展方向之一。在这些方面应该说我们做了一些不错的工作；而且我们希望在CVS项目上能够带起一个学习、研究系统、网络的风气，更希望这能促进国内的网络安全事业朝更健康的方向发展。&lt;br /&gt;
&lt;br /&gt;
4、结构&lt;br /&gt;
a、安全及黑客文献&lt;br /&gt;
提供安全及黑客相关的文档资料，包括原文，译著和自创文章，数量尽可能多，覆盖面尽可能广。&lt;br /&gt;
现分为以下几类:&lt;br /&gt;
黑客教学: 比如samsa的黑客教学文章，invisable evil的黑客教学等一些入门读物。&lt;br /&gt;
漏洞测试: 比如wuftp260，rpcstatd，bind这类漏洞的分析及exploit的使用。&lt;br /&gt;
安全配置: 在这可以放上诸如linuxsos-1.1.pdf之类的文章&lt;br /&gt;
专题文章: 与安全相关的技术性专题文章，比如buffer overflow，format bug，lkm之类的文章&lt;br /&gt;
编程技术: 与安全相关的编程技术文献，比如rpc,tcp/ip编程方面的资料&lt;br /&gt;
火墙技术: 与防火墙应用相关的文档&lt;br /&gt;
入侵检测: 被黑后的补课学习 :)&lt;br /&gt;
工具介绍: 各种安全及黑客工具的使用介绍&lt;br /&gt;
破解专题: Crack！破解与黑客从来就是密不可分的&lt;br /&gt;
b、安全及黑客工具&lt;br /&gt;
提供安全及黑客方面的工具，与安全文档一样，分成了以下几类:&lt;br /&gt;
扫描器(scanner):如nessus，nmap，sscan，satan等等&lt;br /&gt;
拒绝服务工具(DoS):如synk4，targa，tfn等等&lt;br /&gt;
嗅探器(sniffer):如sniffit，sunsniff等&lt;br /&gt;
木马(trojan):比如冰河 :)&lt;br /&gt;
口令破解器(password cracker):如John&lt;br /&gt;
后门程序(backdoor):如cd00r.c&lt;br /&gt;
防火墙(firewall):如天网，its&lt;br /&gt;
入侵检测(ids):如portsentry，watch.c等&lt;br /&gt;
完整性检测:如tripwire&lt;br /&gt;
网络工具:如putty等功能强大的辅助性工具&lt;br /&gt;
加密解密:如PGP等加解密算法的工具&lt;br /&gt;
c、漏洞引擎&lt;br /&gt;
对漏洞的种类和形成原因进行分析之后，搜集整理形成的一个数据库，从整体思想上来说，应该比国内同类引擎更加先进，只是数据资料还需要不断地增补录入，才能满足分类、研究的目的。感兴趣的同志可以参见站内文章《计算机网络系统安全漏洞分类研究》，欢迎就此进行探讨。&lt;br /&gt;
d、自由项目&lt;br /&gt;
希望能够有一些Free的project，我们自身的技术水平得到提高，并去掉一些浮燥的想法和行为，更踏实的做事。&lt;br /&gt;
e、安全论坛&lt;br /&gt;
论坛家家都有，但做得如何，就需要各显神通了，我们会尽力做的更好。&lt;br /&gt;
&lt;br /&gt;
二、这帮兄弟们&lt;br /&gt;
alert7	生活和技术都挺扎实的家伙。	公钥&lt;br /&gt;
benjurry	自强不息,厚德载物	公钥&lt;br /&gt;
blackhole	诚实可靠小郎君！	公钥&lt;br /&gt;
casper	相当前卫，不拘小节。	公钥&lt;br /&gt;
eyas	好好学习，天天向上。	公钥&lt;br /&gt;
flashsky	半夜风来叶如火,一塘鹤去心似水	公钥&lt;br /&gt;
funnywei	其实我是一个演员……	公钥&lt;br /&gt;
glacier	乍看是个人渣，细看还不如乍看。	公钥&lt;br /&gt;
killer	文学青年	公钥&lt;br /&gt;
quack	体力劳动者。	公钥&lt;br /&gt;
san	神呐，救救我吧……	公钥&lt;br /&gt;
stardust	生活简单，脑袋也简单。	公钥&lt;br /&gt;
tombkeeper	妇科圣手	公钥&lt;br /&gt;
watercloud	一无是处，杂而无章。	公钥&lt;br /&gt;
wollf	Wollf Omen Look Lovely Forever	公钥&lt;br /&gt;
xundi	老实，诚实......	公钥&lt;br /&gt;
&lt;br /&gt;
一群普普通通的家伙，来自五湖四海，不在同一公司。喜欢自由自在，生活简单，爱玩电脑，偶尔做事会出格;-)有很多梦想，有很多希望……——我们不敢自称黑客，但我们会尽力做到自由与开放。&lt;br /&gt;
&lt;br /&gt;
三、以后会怎样&lt;br /&gt;
网络诡异。&lt;br /&gt;
或许没人能真正明白网络的力量。短短十几年，网络给整个世界带来了巨大的变化，远在地球两端的人通过网络可以仿佛近如咫尺。网络给无数人带来了商机，但发展的过程中，可能是由于商业化，使网络最初诞生时的信息沟通传递高度自由的想法变得奢侈起来了，真正的黑客也在这时应运而生。&lt;br /&gt;
黑客是平凡得不能再平凡的人，但他们崇尚自由。&lt;br /&gt;
为什么中国的黑客几近于无，有的只是浮躁、虚荣、作做……？&lt;br /&gt;
或许是缺乏环境。Free与Open的环境。&lt;br /&gt;
我们力量有限，但网络无限，www.xfocus.org只希望能提供这样一个环境，对自己、对大家都有帮助。&lt;br /&gt;
&lt;br /&gt;
四、一起来玩吧&lt;br /&gt;
我们想保持队伍的纯洁性。&lt;br /&gt;
我们想扩大组织的影响力。&lt;br /&gt;
对于想加入xfocus的安全爱好者来说，我们要求两个字：舍得！&lt;br /&gt;
要能舍弃一些——钱、精力、经验、技术……都要free&lt;br /&gt;
才能有得——自豪的感觉、进步、朋友……&lt;br /&gt;
欢迎加入，xfocus的未来在大家手中。&lt;br /&gt;
&lt;br /&gt;
五、还有什么吗&lt;br /&gt;
少说多做。&lt;br /&gt;
&lt;br /&gt;
六、曾经对XFOCUS做出贡献的人员(乱序)&lt;br /&gt;
ISNO，LZP，Refdom</description><pubDate>Mon, 08 Mar 2010 15:13:38 GMT</pubDate></item><item><title>开学第一周之杯具跟踪器</title><link>http://www.wyjexplorer.cn/Blog/View/5E0A1E705BC35B80.html</link><description>&lt;p&gt;    开学第一周，几乎天天在下雨……最讨厌这种湿冷的天气了。现在外边仍然下着雨，而根据以往规律和经验，下雨天我最容易杯具……&lt;/p&gt;
&lt;p&gt;    主要说说杯具。&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;    在百忙之中，杯具却没有闲着。昨天给手机充个点，结果，只听到啪的一声，寝室里所有的台灯啊，电脑啊全灭了- -!。好吧，只好去保修，结果门口的师傅要我们自己来弄闸刀。杯具的是，那个电源适配箱吧，它是锁着的。我们只好等到5点多，终于有师傅来开锁了……&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;    还是昨天，防下雨，带了把伞去上课，结果下了课伞没了……这可是把好伞啊……
&lt;/p&gt;
&lt;p&gt;    再说说最神奇的杯具：我买了本正版的《C#与.NET3.5高级程序设计》，很厚的一本，138块。可没想到，这本书里，我竟然发现了两个疑似跟踪器- -! Holy shit～ you must be kidding me....&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;    事情是介样的：某口译课，无聊中，掏出这本C#圣经开始研读，结果发现有一页貌似手感不太对呀。一看，在靠近装订处贴了一片条形码。瞬间我的大脑throw new Exception(“这里怎么会有条形码”)。再仔细一看，这条形码也不太对呀，貌似有点厚度。透过前一页，隐约看见疑似感应线圈- -!我靠，难道是007的高级装备跟踪器？还是个超薄型的- -!我立即小心翼翼地把这个条形码拨了下来，靠，还真是个线圈！中间还有一块矩形的疑似芯片- -!一只没搞明白这东西是干嘛的，目前仍然觉得它疑似跟踪器- -!杯具的是，没翻多少页，又惊现一个一模一样的……shit happens~ 难道我要上mop求鉴定了？～&lt;/p&gt;&lt;p&gt;   &lt;img src="/uploads/20100313160657502.jpg" alt="" border="0" height="466" width="623" /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;    关于转系的事情么，因为刚刚转系，比较忙，而且本日志是我网站公开发表的，有些事情还没有着落，现在不适合说太多，以后会写日志的，哈哈。&lt;br /&gt;
 &lt;/p&gt;</description><pubDate>Fri, 05 Mar 2010 20:03:25 GMT</pubDate></item><item><title>输出小于n的素数，每行10个(C#)</title><link>http://www.wyjexplorer.cn/Blog/View/85BE123D074469A2.html</link><description>&lt;p&gt;仅供参考～&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;using System;
namespace Homework
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("请输入n:");
            int n = Convert.ToInt32(Console.ReadLine());
            int k = 0;
            for (int m = 2; m &lt; n; m++)
            {
                if (isPrime(m))
                {
                    Console.Write(m + ",");
                    k += 1;
                    if (k % 10 == 0)
                    {
                        Console.Write("\r\n");
                    }
                }
            }
            Console.ReadLine();
        }
        //判断某个数是否为素数
        static bool isPrime(int num)
        {
            for (int i = 2; i &lt; num / 2 + 1 ; i++)
            {
                if (num % i == 0)
                {
                    return false;
                }
            }
            return true;
        }
    }
}
&lt;/pre&gt;</description><pubDate>Wed, 03 Mar 2010 22:05:55 GMT</pubDate></item><item><title>找数组最值算法(C#)</title><link>http://www.wyjexplorer.cn/Blog/View/8776777DA2C82585.html</link><description>&lt;p&gt;经典例子，今天拿C#做一下～ &lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;
using System;
namespace Ex1_100303
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] n = { 2, 5, 6, 4, 3, 10, 8, 21, 7 };
            int maxOfn = FindMax(n);
            Console.WriteLine("n中的最大元素是:" + maxOfn);
            Console.ReadLine();
        }
        //寻找数组最大元素的函数～
        static int FindMax(int[] myArray)
        {
            //假设第一项是最大的
            int max = myArray[0];
            //逐项比较，找出最大项
            for (int i = 0; i &lt; myArray.Length; i++)
            {
                if (myArray[i] &gt; max)
                {
                    max = myArray[i];
                }
            }
            return max;
        }
        //寻找数组最小元素的函数
        static int FindMin(int[] myArray)
        { 
            //算法与FindMax类似，省略～o(n_n)o
            return 0;
        }
    }
}
&lt;/pre&gt;
</description><pubDate>Wed, 03 Mar 2010 10:40:40 GMT</pubDate></item><item><title>VS中格式化代码的技巧</title><link>http://www.wyjexplorer.cn/Blog/View/383772AF1149BD25.html</link><description>&lt;div&gt;
&lt;p&gt;   在VS中编程的时候，经常需要整理代码(有时候VS不会自动缩进)。尤其是做Web开发的，在设计器的代码视图中，VS几乎没有自动格式化的功能，不像Dreamweaver有一个格式化代码的按钮。&lt;/p&gt;
&lt;p&gt;   但其实，VS是可以自动整理代码的。方法是：选中一段你希望整理的代码片段，&lt;strong&gt;按Ctrl+K，再按Ctrl+F&lt;/strong&gt;，设计器的源视图和程序代码视图都适用～&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;</description><pubDate>Sat, 27 Feb 2010 14:11:00 GMT</pubDate></item><item><title>回了次“新母校”～</title><link>http://www.wyjexplorer.cn/Blog/View/6EA96E053AA009F7.html</link><description>&lt;p&gt;    趁着大学还没开学，今天我和几个高中同学一起回去看老师，浦南和沪东合并之后，也就有了我们的“新母校”——交大附中浦东实验高中。毕业已经一年半了，时间飞逝啊。一眨眼的功夫～&lt;/p&gt;
&lt;p&gt;    首先说说新学校吧，这是毕业后，我第一次去新母校。校门口那块石牌上挂着也许是全国最长的名字——上海交通大学附属中学浦东实验高级中学。白色的石碑，金色的字，崭新崭新的。曾经这里是沪东中学，我高一时每天放学坐车回家都会经过的～没想到现在成了自己的“新母校”。我们的老浦南，也有这样的一块石牌，黑底金字，浦南中学，比较陈旧，无论从牌子还是名字上都没有现在这块那样高级，但却非常值得回味。现在高二、高三的孩子们都木有看见过，虽然你们也是浦南的- -!。&lt;/p&gt;
&lt;p&gt;    学校里边的环境是相当的好，氛围也很和谐。池塘、绿化、小亭子、像模像样的教学楼、还有宽敞的过道，这些都是我们以前木有的。当然，还有操场。我们的老浦南和后来的振华临时校区，都是木有操场的- -!现在母校终于有操场了，这是多么美好的事情呀～！教学楼的走廊过道非常整洁，两头是老师办公室，中间是教室。教室的班级牌号、门窗、墙面都比我们以前好的多，现在每个年级都分了9个班，每个班人都比较少，看上去很舒服。老师的办公室也比以前大多了，而且安装了隔离板，这才叫Office嘛～，总之新母校的硬件环境绝对是一流的！学弟学妹们可要好好珍惜呀，一定要认真读书～不要浪费了这三年，高中也就一眨眼的功夫。现在的高三，就是我高三时的高一，你们和我们一样也是高三时候搬的学校，但是你们是往好的搬……，所以绝对要把握这一年啊！&lt;/p&gt;
&lt;p&gt;    还有呢，就是我们的学弟学妹们了～。看到你们整整齐齐地坐在教室里上课、课间自由地在走廊上休息谈笑，还有你们穿着校服的样子，那份纯真美好的感觉。现在高二高三还是浦南中学的校服，以后就木有了，要成为绝世收藏了。（PS:话说高一的校服也太难看了吧o(&gt;.&lt;)o）。看到学弟学妹们，我就想起了那时候的我们。真怀念那时候的生活。再次感叹时光飞逝～进了大学之后事情忙了，还要处理各种复杂繁琐的人际关系，没有高中那样简单的生活了。&lt;/p&gt;
&lt;p&gt;    我们先去看了高三班主任王荣胜老师，他现在还在带高三，哈哈，加生物的都要信“胜哥”呀～，我们聊了聊大学生活，哈哈毕业一年半了，大家都过的不错呀。然后我们看了金爱文老师、张晓静老师，都是带我们高三的哈哈，可惜没有碰到梁洁老师- -!。还有分班前教我们的崔丽娟老师、班主任孙芬老师，以及其他曾经教过我们的老师。见了老师，感觉有很多要说，但很多的言语最终还是化为简单的微笑。不过还是有一些老师我们没有碰到，在这里问声好～～&lt;/p&gt;
&lt;p&gt;    总之，现在一切条件都是那么好，真可惜我们没能有此机会享受。但学校不是享受的地
