<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://gcdn.grapecity.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>GCDN Community（葡萄城技术社区）</title><link>http://gcdn.grapecity.com/cs/blogs/default.aspx</link><description>以微软平台和.NET技术为主的软件开发社区。</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>my tools : StaticMembers</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/10/15/my-tools-staticmembers.aspx</link><pubDate>Wed, 15 Oct 2008 14:17:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10868</guid><dc:creator>Arthas</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;foreach (ContentAlignment align in Enum.GetValues(typeof(ContentAlignment)))&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;由于工作需要， 经常要用这种方式来遍历枚举。&lt;/P&gt;
&lt;P&gt;Enum用起来还是比较方便的。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;但是呢， 又经常要遍历这些东西：&lt;/P&gt;
&lt;P&gt;Color.Red&lt;/P&gt;
&lt;P&gt;把所有Color能点出来的东西遍历一遍。 这下就麻烦了， 想不出什么办法可以遍历。&lt;/P&gt;
&lt;P&gt;于是忽然想到， Enum是如何做到遍历一个指定枚举的？&lt;/P&gt;
&lt;P&gt;reflector一下。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A title=System.UInt64 href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.UInt64"&gt;ulong&lt;/A&gt;[] &lt;B&gt;values&lt;/B&gt; = &lt;A title="HashEntry System.Enum.GetHashEntry(Type enumType);" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Enum/GetHashEntry(System.Type):System.Enum.HashEntry"&gt;GetHashEntry&lt;/A&gt;(&lt;A title="Type enumType; // Parameter"&gt;enumType&lt;/A&gt;).&lt;A title="ulong[] System.Enum+HashEntry.values;" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Enum.HashEntry/values:UInt64%5b%5d"&gt;values&lt;/A&gt;;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Enum是通过这句话来得到所有的值的。&lt;/P&gt;
&lt;P&gt;那么GetHashEntry又是如何做的呢？&lt;/P&gt;
&lt;P&gt;&lt;A title=System.Reflection.FieldInfo href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Reflection.FieldInfo"&gt;FieldInfo&lt;/A&gt;[] &lt;B&gt;fields&lt;/B&gt; = &lt;A title="Type enumType; // Parameter"&gt;enumType&lt;/A&gt;.&lt;A title="FieldInfo[] System.Type.GetFields(BindingFlags bindingAttr);" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Type/GetFields(System.Reflection.BindingFlags):System.Reflection.FieldInfo%5b%5d"&gt;GetFields&lt;/A&gt;(&lt;A title=System.Reflection.BindingFlags href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Reflection.BindingFlags"&gt;BindingFlags&lt;/A&gt;.&lt;A title="BindingFlags System.Reflection.BindingFlags.Public;" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Reflection.BindingFlags/Public"&gt;Public&lt;/A&gt; | &lt;A title=System.Reflection.BindingFlags href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Reflection.BindingFlags"&gt;BindingFlags&lt;/A&gt;.&lt;A title="BindingFlags System.Reflection.BindingFlags.Static;" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Reflection.BindingFlags/Static"&gt;Static&lt;/A&gt;);&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;核心代码又在这句话。&lt;/P&gt;
&lt;P&gt;很明显， Enum把枚举当一个普通的ValueType来进行反射， 反射出所有的field， 然后返回， OK了。&lt;/P&gt;
&lt;P&gt;好吧， 既然如此， 那我们也写一个类似的helper好了。&lt;/P&gt;
&lt;P&gt;但是涉及到一个问题：Enum里面所有的field都敢拿来返， 而我们返之前则需要判断类型。&lt;/P&gt;
&lt;P&gt;初步确定代码原型如下：&lt;/P&gt;
&lt;P&gt;public static ArrayList GetValues(Type type)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return GetValues(type, type);&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;恩， 是不是很简练呢？ &lt;/P&gt;
&lt;P&gt;哈哈， 其实这不是玩笑。 因为我这样定就是因为考虑到了Brush和Brushes这类的需要。&lt;/P&gt;
&lt;P&gt;而ArrayList是为了写着方便。 反正最后用foreach来跑， 返回值类型并不是很关键对不对？&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;另一个的代码如下：&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static ArrayList GetValues(Type type, Type expect)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (type == null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ArrayList list = new ArrayList();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (PropertyInfo property in type.GetProperties( BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Static))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object value = property.GetValue(null, null);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (value != null &amp;amp;&amp;amp; (value.GetType() == expect || IsType(value.GetType(), expect)))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return list;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;其中有一个IsType。。 额， 这个函数代码如下。 看起来笨的很， 那是因为我实在没有找到聪明的办法来模拟is这个关键字：&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static bool IsType(Type son, Type parent)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (son.BaseType != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (son == parent)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; son = son.BaseType;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;示例如下：&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (Brush brush in StaticMembers.GetValues(typeof(Brushes), typeof(Brush)))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;这样就可以使用每一个brush了。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;哪位帮我想个更好的办法来实现那个模拟is关键字的办法呢？&lt;/P&gt;
&lt;P&gt;括弧， IL写的不要。。。我怕不会调用。&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10868" width="1" height="1"&gt;</description></item><item><title>正则表达式【转】</title><link>http://gcdn.grapecity.com/cs/blogs/gw0506/archive/2008/10/15/10867.aspx</link><pubDate>Wed, 15 Oct 2008 08:48:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10867</guid><dc:creator>gw0506</dc:creator><slash:comments>0</slash:comments><description>&lt;span&gt;一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。如： &lt;br&gt;
&lt;div class="tablediv"&gt;
&lt;table cellspacing="0"&gt;
    
        &lt;tr&gt;
            &lt;th&gt;JScript&lt;/th&gt;
            &lt;th&gt;VBScript&lt;/th&gt;
            &lt;th&gt;匹配&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;/^\[ \t]*$/&lt;/td&gt;
            &lt;td&gt;"^\[ \t]*$"&lt;/td&gt;
            &lt;td&gt;匹配一个空白行。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;/\d{2}-\d{5}/&lt;/td&gt;
            &lt;td&gt;"\d{2}-\d{5}"&lt;/td&gt;
            &lt;td&gt;验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;/&amp;lt;(.*)&amp;gt;.*&amp;lt;\/\1&amp;gt;/&lt;/td&gt;
            &lt;td&gt;"&amp;lt;(.*)&amp;gt;.*&amp;lt;\/\1&amp;gt;"&lt;/td&gt;
            &lt;td&gt;匹配一个 HTML 标记。&lt;/td&gt;
        &lt;/tr&gt;
    
&lt;/table&gt;
&lt;/div&gt;
&lt;br&gt;
下表是元字符及其在正则表达式上下文中的行为的一个完整列表：&lt;br&gt;
&lt;table cellspacing="0"&gt;
    
        &lt;tr&gt;
            &lt;th&gt;字符&lt;/th&gt;
            &lt;th&gt;描述&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\&lt;/td&gt;
            &lt;td&gt;将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;^&lt;/td&gt;
            &lt;td&gt;匹配输入字符串的开始位置。如果设置了 &lt;strong&gt;RegExp&lt;/strong&gt; 对象的 &lt;strong&gt;Multiline&lt;/strong&gt; 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;$&lt;/td&gt;
            &lt;td&gt;匹配输入字符串的结束位置。如果设置了&lt;strong&gt;RegExp&lt;/strong&gt; 对象的 &lt;strong&gt;Multiline&lt;/strong&gt; 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;*&lt;/td&gt;
            &lt;td&gt;匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;+&lt;/td&gt;
            &lt;td&gt;匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;?&lt;/td&gt;
            &lt;td&gt;匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;{&lt;em&gt;n&lt;/em&gt;}&lt;/td&gt;
            &lt;td&gt;&lt;em&gt;n&lt;/em&gt; 是一个非负整数。匹配确定的 &lt;em&gt;n&lt;/em&gt; 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;{&lt;em&gt;n&lt;/em&gt;,}&lt;/td&gt;
            &lt;td&gt;&lt;em&gt;n&lt;/em&gt; 是一个非负整数。至少匹配&lt;em&gt;n&lt;/em&gt; 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;{&lt;em&gt;n&lt;/em&gt;,&lt;em&gt;m&lt;/em&gt;}&lt;/td&gt;
            &lt;td&gt;&lt;em&gt;m&lt;/em&gt; 和 &lt;em&gt;n&lt;/em&gt; 均为非负整数，其中&lt;em&gt;n&lt;/em&gt; &amp;lt;= &lt;em&gt;m&lt;/em&gt;。最少匹配 &lt;em&gt;n&lt;/em&gt; 次且最多匹配 &lt;em&gt;m&lt;/em&gt; 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;?&lt;/td&gt;
            &lt;td&gt;当该字符紧跟在任何一个其他限制符 (*, +, ?, {&lt;em&gt;n&lt;/em&gt;}, {&lt;em&gt;n&lt;/em&gt;,}, {&lt;em&gt;n&lt;/em&gt;,&lt;em&gt;m&lt;/em&gt;}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;.&lt;/td&gt;
            &lt;td&gt;匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;(&lt;em&gt;pattern&lt;/em&gt;)&lt;/td&gt;
            &lt;td&gt;匹配 &lt;em&gt;pattern&lt;/em&gt; 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 &lt;strong&gt;SubMatches&lt;/strong&gt; 集合，在JScript 中则使用 &lt;strong&gt;$0&lt;/strong&gt;…&lt;strong&gt;$9&lt;/strong&gt; 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;(?:&lt;em&gt;pattern&lt;/em&gt;)&lt;/td&gt;
            &lt;td&gt;匹配 &lt;em&gt;pattern&lt;/em&gt; 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;(?=&lt;em&gt;pattern&lt;/em&gt;)&lt;/td&gt;
            &lt;td&gt;正向预查，在任何匹配 &lt;em&gt;pattern&lt;/em&gt;
的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，'Windows
(?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1"
中的
"Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;(?!&lt;em&gt;pattern&lt;/em&gt;)&lt;/td&gt;
            &lt;td&gt;负向预查，在任何不匹配 &lt;em&gt;pattern&lt;/em&gt;
的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows
(?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000"
中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;em&gt;x&lt;/em&gt;|&lt;em&gt;y&lt;/em&gt;&lt;/td&gt;
            &lt;td&gt;匹配 &lt;em&gt;x&lt;/em&gt; 或 &lt;em&gt;y&lt;/em&gt;。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;[&lt;em&gt;xyz&lt;/em&gt;]&lt;/td&gt;
            &lt;td&gt;字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;[^&lt;em&gt;xyz&lt;/em&gt;]&lt;/td&gt;
            &lt;td&gt;负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;[&lt;em&gt;a-z&lt;/em&gt;]&lt;/td&gt;
            &lt;td&gt;字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;[^&lt;em&gt;a-z&lt;/em&gt;]&lt;/td&gt;
            &lt;td&gt;负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\b&lt;/td&gt;
            &lt;td&gt;匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\B&lt;/td&gt;
            &lt;td&gt;匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\c&lt;em&gt;x&lt;/em&gt;&lt;/td&gt;
            &lt;td&gt;匹配由 &lt;em&gt;x&lt;/em&gt; 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。&lt;em&gt;x&lt;/em&gt; 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\d&lt;/td&gt;
            &lt;td&gt;匹配一个数字字符。等价于 [0-9]。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\D&lt;/td&gt;
            &lt;td&gt;匹配一个非数字字符。等价于 [^0-9]。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\f&lt;/td&gt;
            &lt;td&gt;匹配一个换页符。等价于 \x0c 和 \cL。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\n&lt;/td&gt;
            &lt;td&gt;匹配一个换行符。等价于 \x0a 和 \cJ。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\r&lt;/td&gt;
            &lt;td&gt;匹配一个回车符。等价于 \x0d 和 \cM。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\s&lt;/td&gt;
            &lt;td&gt;匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\S&lt;/td&gt;
            &lt;td&gt;匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\t&lt;/td&gt;
            &lt;td&gt;匹配一个制表符。等价于 \x09 和 \cI。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\v&lt;/td&gt;
            &lt;td&gt;匹配一个垂直制表符。等价于 \x0b 和 \cK。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\w&lt;/td&gt;
            &lt;td&gt;匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\W&lt;/td&gt;
            &lt;td&gt;匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\x&lt;em&gt;n&lt;/em&gt;&lt;/td&gt;
            &lt;td&gt;匹配 &lt;em&gt;n&lt;/em&gt;，其中 &lt;em&gt;n&lt;/em&gt; 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp;amp; "1"。正则表达式中可以使用 ASCII 编码。.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\&lt;em&gt;num&lt;/em&gt;&lt;/td&gt;
            &lt;td&gt;匹配 &lt;em&gt;num&lt;/em&gt;，其中 &lt;em&gt;num&lt;/em&gt; 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\&lt;em&gt;n&lt;/em&gt;&lt;/td&gt;
            &lt;td&gt;标识一个八进制转义值或一个向后引用。如果 \&lt;em&gt;n&lt;/em&gt; 之前至少 &lt;em&gt;n&lt;/em&gt; 个获取的子表达式，则 &lt;em&gt;n&lt;/em&gt; 为向后引用。否则，如果 &lt;em&gt;n&lt;/em&gt; 为八进制数字 (0-7)，则 &lt;em&gt;n&lt;/em&gt; 为一个八进制转义值。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\&lt;em&gt;nm&lt;/em&gt;&lt;/td&gt;
            &lt;td&gt;标识一个八进制转义值或一个向后引用。如果 \&lt;em&gt;nm&lt;/em&gt; 之前至少有 &lt;em&gt;nm&lt;/em&gt; 个获得子表达式，则 &lt;em&gt;nm&lt;/em&gt; 为向后引用。如果 \&lt;em&gt;nm&lt;/em&gt; 之前至少有 &lt;em&gt;n&lt;/em&gt; 个获取，则 &lt;em&gt;n&lt;/em&gt; 为一个后跟文字 &lt;em&gt;m&lt;/em&gt; 的向后引用。如果前面的条件都不满足，若 &lt;em&gt;n&lt;/em&gt; 和 &lt;em&gt;m&lt;/em&gt; 均为八进制数字 (0-7)，则 \&lt;em&gt;nm&lt;/em&gt; 将匹配八进制转义值 &lt;em&gt;nm&lt;/em&gt;。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\&lt;em&gt;nml&lt;/em&gt;&lt;/td&gt;
            &lt;td&gt;如果 &lt;em&gt;n&lt;/em&gt; 为八进制数字 (0-3)，且 &lt;em&gt;m&lt;/em&gt; 和 &lt;em&gt;l&lt;/em&gt; 均为八进制数字 (0-7)，则匹配八进制转义值 &lt;em&gt;nml。&lt;/em&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;\u&lt;em&gt;n&lt;/em&gt;&lt;/td&gt;
            &lt;td&gt;匹配 &lt;em&gt;n&lt;/em&gt;，其中 &lt;em&gt;n&lt;/em&gt; 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (©)。&lt;/td&gt;
        &lt;/tr&gt;
    
&lt;/table&gt;
&lt;p&gt;&lt;br&gt;
下面看几个例子：&lt;br&gt;
"^The"：表示所有以"The"开始的字符串（"There"，"The cat"等）；&lt;br&gt;
"of despair$"：表示所以以"of despair"结尾的字符串；&lt;br&gt;
"^abc$"：表示开始和结尾都是"abc"的字符串——呵呵，只有"abc"自己了；&lt;br&gt;
"notice"：表示任何包含"notice"的字符串。&lt;br&gt;
&lt;br&gt;
'*'，'+'和'?'这三个符号，表示一个或一序列字符重复出现的次数。它们分别表示“没有或&lt;br&gt;
更多”，“一次或更多”还有“没有或一次”。下面是几个例子：&lt;/p&gt;
&lt;p&gt;"ab*"：表示一个字符串有一个a后面跟着零个或若干个b。（"a", "ab", "abbb",……）；&lt;br&gt;
"ab+"：表示一个字符串有一个a后面跟着至少一个b或者更多；&lt;br&gt;
"ab?"：表示一个字符串有一个a后面跟着零个或者一个b；&lt;br&gt;
"a?b+$"：表示在字符串的末尾有零个或一个a跟着一个或几个b。&lt;/p&gt;
&lt;p&gt;也可以使用范围，用大括号括起，用以表示重复次数的范围。&lt;/p&gt;
&lt;p&gt;"ab{2}"：表示一个字符串有一个a跟着2个b（"abb"）；&lt;br&gt;
"ab{2,}"：表示一个字符串有一个a跟着至少2个b；&lt;br&gt;
"ab{3,5}"：表示一个字符串有一个a跟着3到5个b。&lt;/p&gt;
&lt;p&gt;请注意，你必须指定范围的下限（如："{0,2}"而不是"{,2}"）。还有，你可能注意到了，'*'，'+'和&lt;br&gt;
'?'相当于"{0,}"，"{1,}"和"{0,1}"。&lt;br&gt;
还有一个'¦'，表示“或”操作：&lt;/p&gt;
&lt;p&gt;"hi¦hello"：表示一个字符串里有"hi"或者"hello"；&lt;br&gt;
"(b¦cd)ef"：表示"bef"或"cdef"；&lt;br&gt;
"(a¦b)*c"：表示一串"a""b"混合的字符串后面跟一个"c"；&lt;/p&gt;
&lt;p&gt;'.'可以替代任何字符：&lt;/p&gt;
&lt;p&gt;"a.[0-9]"：表示一个字符串有一个"a"后面跟着一个任意字符和一个数字；&lt;br&gt;
"^.{3}$"：表示有任意三个字符的字符串（长度为3个字符）；&lt;/p&gt;
&lt;p&gt;方括号表示某些字符允许在一个字符串中的某一特定位置出现：&lt;/p&gt;
&lt;p&gt;"[ab]"：表示一个字符串有一个"a"或"b"（相当于"a¦b"）；&lt;br&gt;
"[a-d]"：表示一个字符串包含小写的'a'到'd'中的一个（相当于"a¦b¦c¦d"或者"[abcd]"）；&lt;br&gt;
"^[a-zA-Z]"：表示一个以字母开头的字符串；&lt;br&gt;
"[0-9]%"：表示一个百分号前有一位的数字；&lt;br&gt;
",[a-zA-Z0-9]$"：表示一个字符串以一个逗号后面跟着一个字母或数字结束。&lt;/p&gt;
&lt;p&gt;你也可以在方括号里用'^'表示不希望出现的字符，'^'应在方括号里的第一位。（如："%[^a-zA-Z]%"表&lt;br&gt;
示两个百分号中不应该出现字母）。&lt;/p&gt;
&lt;p&gt;为了逐字表达，必须在"^.$()¦*+?{\"这些字符前加上转移字符'\'。&lt;/p&gt;
&lt;p&gt;请注意在方括号中，不需要转义字符。&lt;/p&gt;&lt;/span&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10867" width="1" height="1"&gt;</description></item><item><title>不可思议之三十 ：十面埋伏</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/10/14/10863.aspx</link><pubDate>Tue, 14 Oct 2008 15:09:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10863</guid><dc:creator>Arthas</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;如题。&lt;/P&gt;
&lt;P&gt;时刻记住： 我们处于危险之中。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;欢迎发表评论(切记:爱国、守法、自律、真实、文明)&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10863" width="1" height="1"&gt;</description></item><item><title>不可思议之二十九 ： 正门在哪里</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/10/03/10769.aspx</link><pubDate>Fri, 03 Oct 2008 05:44:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10769</guid><dc:creator>Arthas</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;今天跑公司来， 登记写的是学习。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;实际上呢， 是要在亚特定球台， 而亚特又要求必须是电话订&lt;/P&gt;
&lt;P&gt;而电话我又没记， 邮件里面有。&lt;/P&gt;
&lt;P&gt;于是我跑来看邮件来了。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;登记结束上了三楼， 忽然想到没有带工牌。&lt;/P&gt;
&lt;P&gt;于是琢磨这咋办？ 忽然想到靠东这个门是坏的， 可以直接推开&lt;/P&gt;
&lt;P&gt;于是就从这个门推。 &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;轻轻尝试了下， 因为有点卡， 我误以为是开不开的。 郁闷了一小下， 再加大力量推了一下， 门开了。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;我得意洋洋的想着， 看我思维多活跃， 这都想的到。 而且还大胆尝试， 简直。。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;然后我边想边往前走。 走到西面这个门， 我发现这个门没有锁。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;囧&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;所以有时候我们绕了半天的路， 想尽了一切的花招， 走了不少的歪门邪道， &lt;/P&gt;
&lt;P&gt;才能达成自己小小的目的。&lt;/P&gt;
&lt;P&gt;其实很可能正门就是敞开的。&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10769" width="1" height="1"&gt;</description><enclosure url="http://gcdn.grapecity.com/cs/blogs/arthas/attachment/10769.ashx" length="37352" type="image/jpeg" /><category domain="http://gcdn.grapecity.com/cs/blogs/arthas/archive/tags/_0D4EEF531D60AE8BFB7C1752_/default.aspx">不可思议系列</category></item><item><title>不可思议之二十八 ：神匠杯</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/09/27/10761.aspx</link><pubDate>Sat, 27 Sep 2008 13:18:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10761</guid><dc:creator>Arthas</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;Alex说， 作弊取得胜利也算的。&lt;/P&gt;
&lt;P&gt;包括任何形式的。&lt;/P&gt;
&lt;P&gt;于是我产生了“作弊”的冲动。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;反射的办法就不尝试了。 因为我估计这方面会被限制的超级死的。（权限必然被限制的无比麻烦）&lt;/P&gt;
&lt;P&gt;但是其他办法来拿到题目， 我估计应该还是可以做到的。&lt;/P&gt;
&lt;P&gt;毕竟咱有上传dll的权限是不？&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;只要可以传dll，只要可以调用.net的类库，不管限制的如何死。&lt;/P&gt;
&lt;P&gt;我相信有办法拿到东西。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Alex说， 如果最后0分要惩罚我。。&lt;/P&gt;
&lt;P&gt;额。。 这个。。 那我有点动摇... 要不咱先做几道避免0分然后再玩这种非正规的玩法？？？&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;p.s. 为什么非要走歪门邪道。 因为走正路， 比不过他们呀。。。&lt;/P&gt;
&lt;P&gt;例如Robert。&lt;/P&gt;
&lt;P&gt;工作经验在那摆着呢。&lt;/P&gt;
&lt;P&gt;经验IMBA。 经验是对英雄最重要的东东。。。&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10761" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/arthas/archive/tags/_0D4EEF531D60AE8BFB7C1752_/default.aspx">不可思议系列</category></item><item><title>.NET程序员学Java（12） - JSP调用BC</title><link>http://gcdn.grapecity.com/cs/blogs/williamluo/archive/2008/09/19/net-java-12-jsp-bc.aspx</link><pubDate>Fri, 19 Sep 2008 01:12:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10598</guid><dc:creator>WilliamLuo</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;JSP似乎没有ASP.NET那种Code Behind的概念，所以更像ASP。&lt;/P&gt;
&lt;P&gt;尽管如此，并不用担心业务逻辑都要跟Page放在一起。&lt;/P&gt;
&lt;P&gt;先做一个简单的业务组件BusinessObject.java：&lt;/P&gt;
&lt;P&gt;package web1;&lt;BR&gt;public class BusinessObject {&lt;BR&gt;&amp;nbsp;public static String getName()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;return "Sample Name";&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;把这个java文件保存在Project目录中的 Java Respources: src 下面。&amp;nbsp;&lt;/P&gt;
&lt;P&gt;然后，在JSP中调用它：&lt;/P&gt;
&lt;P&gt;&amp;lt;%@ page import="web1.*" %&amp;gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;lt;body&amp;gt;&lt;BR&gt;&amp;nbsp;The name is: &amp;lt;%= BusinessObject.getName() %&amp;gt;&lt;/P&gt;
&lt;P&gt;其中最上面的import很重要，要不然不知道BusinessObject是哪来的。&lt;/P&gt;
&lt;P&gt;上面的代码中，&amp;lt;%= 这种直接输出的做法，也跟ASP一模一样，很亲切。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10598" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Java/default.aspx">Java</category><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/JSP/default.aspx">JSP</category></item><item><title>.NET程序员学Java（11）-HelloJSP</title><link>http://gcdn.grapecity.com/cs/blogs/williamluo/archive/2008/09/19/net-java-11-hellojsp.aspx</link><pubDate>Fri, 19 Sep 2008 01:02:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10594</guid><dc:creator>WilliamLuo</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;听说Java擅长的还是Web。&lt;/P&gt;
&lt;P&gt;用Eclipse创建一个新的Web Project确实很简单：&lt;/P&gt;
&lt;P&gt;（1）New - Dynamic Web Project&lt;/P&gt;
&lt;P&gt;（2）在Project树形目录下找到WebContent&lt;/P&gt;
&lt;P&gt;（3）New - JSP，新生成的JSP文件内已经有好些东西了，跟一个HTML差不多，最关键是首行：&lt;/P&gt;
&lt;P&gt;&amp;lt;%@ page language="java" contentType="text/html; charset=windows-31j" pageEncoding="windows-31j"%&amp;gt;&lt;/P&gt;
&lt;P&gt;（4）在&amp;lt;Body&amp;gt;部分输入一些代码：&lt;/P&gt;
&lt;P&gt;&amp;lt;%&lt;BR&gt;&amp;nbsp; String hello="Hello JSP!";&lt;BR&gt;&amp;nbsp; out.println(hello);&lt;BR&gt;%&amp;gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;这样，第一个JSP程序就做好了。&lt;/P&gt;
&lt;P&gt;看得出来，out.println像极了ASP的Response.Write。&lt;/P&gt;
&lt;P&gt;（5）运行这个程序，选择Run on Server，略微配置一下，就能看到运行效果了。&lt;/P&gt;
&lt;P&gt;与ASP启动IE浏览器不同，Eclipse是在IDE里面用一个选项卡显示网页效果。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10594" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Java/default.aspx">Java</category><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/JSP/default.aspx">JSP</category></item><item><title>.NET程序员学Java（10）-安装Tomcat</title><link>http://gcdn.grapecity.com/cs/blogs/williamluo/archive/2008/09/18/net-java-10-tomcat.aspx</link><pubDate>Thu, 18 Sep 2008 03:31:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10582</guid><dc:creator>WilliamLuo</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;几天前就下载了Tomcat，今天终于解包，看了一下Running.txt文件中的说明。&lt;/P&gt;
&lt;P&gt;根据文件的指引，设置了一个JRE_HOME的环境变量（=“C:\Program Files\Java\jdk1.6.0_07”），然后运行\apache-tomcat-6.0.14\bin\下面的startup.bat，一个Web Server就起来了。&lt;/P&gt;
&lt;P&gt;打开IE，输入 &lt;A href="http://localhost:8080/"&gt;http://localhost:8080&lt;/A&gt; 网页就出来了。感觉比IIS还省事！&lt;/P&gt;
&lt;P&gt;首页上显示的网页，就是\apache-tomcat-6.0.14\webapps\ROOT\下面的index.html。&lt;/P&gt;
&lt;P&gt;照猫画虎，在ROOT下面建了一个 Test 子目录，创建一个 index.html 文件，然后浏览 localhost:8080/test/，出404（Not found）的错误。&lt;/P&gt;
&lt;P&gt;很快发现是大小写问题，改成 /Test/就好了。&lt;/P&gt;
&lt;P&gt;要是想让Tomcat作为Windows服务来运行，就在DOS窗口中转到bin目录下运行service install批处理命令，这样就可以在Windows管理工具里面的Services中看到Apache Tomcat了。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10582" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Java/default.aspx">Java</category><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Tomcat/default.aspx">Tomcat</category></item><item><title>.NET程序员学Java（9）-MessageBox？ </title><link>http://gcdn.grapecity.com/cs/blogs/williamluo/archive/2008/09/16/net-java-9-messagebox.aspx</link><pubDate>Tue, 16 Sep 2008 09:32:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10533</guid><dc:creator>WilliamLuo</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;提示信息或者要求用户确认时，经常需要用到Message Box。Java对应的是JOptionPane类。&lt;/P&gt;
&lt;P&gt;下面这段代码的逻辑是： 当用户关闭窗口时，问一下。&lt;/P&gt;
&lt;P&gt;public class Main {&lt;BR&gt;&amp;nbsp;@SuppressWarnings("deprecation")&lt;BR&gt;&amp;nbsp;public static void main(String[] args) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;// TODO Auto-generated method stub&lt;BR&gt;&amp;nbsp;&amp;nbsp;final JFrame frm = new Form1();&lt;BR&gt;&amp;nbsp;&amp;nbsp;//下面这句话很重要，否则即使用户说No，窗口也会关闭&lt;BR&gt;&amp;nbsp;&amp;nbsp;frm.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;frm.addWindowListener(new WinCloser(frm));&lt;BR&gt;&amp;nbsp;&amp;nbsp;frm.show();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;class WinCloser extends WindowAdapter&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;private JFrame frm;&lt;BR&gt;&amp;nbsp;public WinCloser(JFrame f)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;frm = f;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;public void windowClosing(WindowEvent e)&lt;BR&gt;&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp; // 这就是Message Box&lt;BR&gt;&amp;nbsp;&amp;nbsp;int response = JOptionPane.showConfirmDialog(null,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Are you sure to quit?",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Quit Confirmation",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JOptionPane.YES_NO_OPTION,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JOptionPane.INFORMATION_MESSAGE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (response == JOptionPane.NO_OPTION)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;frm.setVisible(false);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.exit(0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10533" width="1" height="1"&gt;</description></item><item><title>生活小事之三 ：希望在哪里</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/09/15/10466.aspx</link><pubDate>Mon, 15 Sep 2008 11:30:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10466</guid><dc:creator>Arthas</dc:creator><slash:comments>4</slash:comments><description>&lt;P&gt;懒惰的人总是有各种懒惰的借口。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;当所有借口全部用光的时候， 我终于懒散的决定把衣服都洗了。&lt;/P&gt;
&lt;P&gt;其实扔到洗衣机里面就OK了。 即使这样， 依然好多男生都不愿意去做的。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;然后我开始收拾衣服。 从各个角落拿可能已经放置了快一个月的衣服。&lt;/P&gt;
&lt;P&gt;收拾到一件休闲衬衫的时候， 我很惊讶的发现， 兜里面居然还有8块钱。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;8块啊！这可不是什么小数目。。 要知道在南窑头， 这些money 很可能拿到两碗面呢。&lt;/P&gt;
&lt;P&gt;而我在9月7日的时候提到过：&lt;/P&gt;
&lt;P&gt;“当我发现兜里只剩9毛钱的时候， 我发现今天已经是7 号了”&lt;/P&gt;
&lt;P&gt;当时说的是几毛我不太记得了。 大概就是这个意思。&lt;/P&gt;
&lt;P&gt;其实还有很绝望的后半句我一直没好意思说出来：&lt;/P&gt;
&lt;P&gt;“所以今天只要再饿一顿， 撑到明天就有饭吃了”&lt;/P&gt;
&lt;P&gt;8月8日发的第一个月工资。 我并没有成为大家所说的月光族。&lt;/P&gt;
&lt;P&gt;而是成了日光族。&amp;nbsp;或者干脆说是还款族。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;9月7号的时候我一天只吃了一顿饭。 发的月饼基本上在6号的时候消灭了。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;而再那个饥肠辘辘而又无所事事的时候我居然没有想到洗衣服！&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;============华丽的分割线============&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Remember， Arthas。 永远没有彻底绝望的时候。&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10466" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/arthas/archive/tags/_1F753B6D0F5C8B4E_/default.aspx">生活小事</category></item><item><title>不可思议之二十七 ：浏览器大战</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/09/14/10462.aspx</link><pubDate>Sun, 14 Sep 2008 03:00:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10462</guid><dc:creator>Arthas</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;似乎， 到处都是浏览器了&lt;/P&gt;
&lt;P&gt;前几天J2.NETe同学把自己的浏览器晒了下&lt;/P&gt;
&lt;P&gt;我错认了一个， 看起来是绿色的， 我就以为是Green Browser。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;结果。。今天360提示我360浏览器发布了。&lt;/P&gt;
&lt;P&gt;我就下来装了看下， 一看图标， 额， 好眼熟额， 绿绿的， &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;然后恍然大悟这小子放的是这个浏览器！&lt;/P&gt;
&lt;P&gt;然后用了一下， 第一印象很是不好， 就放弃了。&lt;/P&gt;
&lt;P&gt;原因： f6是展开地址栏，而f4是把焦点且入到地址栏里面。&lt;/P&gt;
&lt;P&gt;完全和IE是相反的。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;用惯了IE的人啊， 真的是无法忍受这个问题的。 因为我习惯打开浏览器就先按f6， 然后打， 然后敲， 然后玩。&lt;/P&gt;
&lt;P&gt;这一下子让我的节奏全部打乱了。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;兼容快捷键是个多么重要的事情。。。。。&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10462" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/arthas/archive/tags/_0D4EEF531D60AE8BFB7C1752_/default.aspx">不可思议系列</category></item><item><title>生活小事之二 ：如何在GrapeCity聚敛钱财</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/09/10/grapecity.aspx</link><pubDate>Wed, 10 Sep 2008 15:07:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10421</guid><dc:creator>Arthas</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;和同学聊天，提到了， 最近一次bug大赛， 打赌bug数量， 输了四瓶可乐。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;然后我同学说， 太差劲了。 咋输那么多？&lt;/P&gt;
&lt;P&gt;我说， 跟风的一堆， 输三瓶以上的好几个人呢。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;然后我同学说： 哎呀， 这好？ 我要是失业了就去你们公司卖可乐去。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;说者无心。 但是我却悄悄的计算起来， GrapeCity平均一天需要多少瓶可乐？&lt;/P&gt;
&lt;P&gt;首先， 我们100多的员工， 一年200+的工作日吧？估算的。　没具体统计。　暂时按这个算。&lt;/P&gt;
&lt;P&gt;也就是平均每不到两天就有一个人过生日。&lt;/P&gt;
&lt;P&gt;ＯＫ，　每个人过生日，　基本上一个项目组的可乐就不要想逃过了。这是最低数量。&lt;/P&gt;
&lt;P&gt;然后，　每日构建出问题的时候，　一个项目组的可乐又包了。&lt;/P&gt;
&lt;P&gt;再加上这类随时的打赌，　其实我觉得GrapeCity，　很明显应该做可口可乐的黄金合作伙伴啊！&lt;/P&gt;
&lt;P&gt;（插句广告， 我们曾经探讨过GrapeCity谁的权利最大。 现在得出结论：wu qiangna权利最大。 要是看你不顺眼， 天天发邮件祝你生日快乐就行了^_^）&lt;/P&gt;
&lt;P&gt;^_^&lt;/P&gt;
&lt;P&gt;&amp;nbsp;所以做为可口可乐公司， 很明显， 最适合的市场策略是在GrapeCity内部设置一个可乐的直销点， 并推出“合作伙伴价”&lt;/P&gt;
&lt;P&gt;可以长期而持久的收入， 并一举切断大家购买百事可乐的企图。&lt;/P&gt;
&lt;P&gt;真是财源滚滚来啊。。。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;p.s. 看到标题就想歪了的抓紧面壁去。。。&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10421" width="1" height="1"&gt;</description></item><item><title>转载文章之一 ：纯天然沐浴露</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/09/10/10386.aspx</link><pubDate>Tue, 09 Sep 2008 16:00:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10386</guid><dc:creator>Arthas</dc:creator><slash:comments>4</slash:comments><description>&lt;DIV class=lh3 id=veryContent style="OVERFLOW:hidden;WIDTH:100%;"&gt;
&lt;TABLE class=contentTable id=blogContentTable cellSpacing=0 cellPadding=0 class="contentTable"&gt;

&lt;TR&gt;
&lt;TD class="" style="WORD-WRAP:break-word;"&gt;
&lt;DIV id=blogContainer style="FONT-SIZE:16px;"&gt;&lt;IMG id=paperPicArea0 style="DISPLAY:none;" src="http://imgcache.qq.com/ac/b.gif"&gt; 
&lt;DIV id=paperTitleArea style="DISPLAY:none;" align=center&gt;&lt;SPAN id=paperTitle style="DISPLAY:block;FONT-WEIGHT:bolder;WORD-BREAK:break-all;"&gt;&lt;FONT face="" color=#000e04&gt;[荐]［166］纯天然沐浴露&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;IMG id=paperPicArea style="DISPLAY:none;" src="http://imgcache.qq.com/ac/b.gif"&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　我的师弟戒傲懂得不少希奇古怪的知识，有一次，戒傲无意中帮了一位来天明寺进香的施主解决了一个困绕了他很久的难题，那位施主感激之余，便常在同来进香的香客中大夸戒傲的本事，一来二去，戒傲的这项特长在常来天明寺的施主中渐渐有了名气，有些施主遇到问题，还会特意跑上山来咨询戒傲。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　这些问题听起来就很奇怪，比如，如何引导小猫养成不随地大小便的好习惯、还有如何安装无油烟灶台可以不破坏家里的财运风水等等，虽然问题奇怪，但戒傲总能找到解决问题的好方法，让施主们满意。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　前段时间，有几位施主在寺里的院子里聊天，不知道怎么聊到了沐浴液上，几位施主一起探讨自己使用的品牌，有位女施主感慨道，这些品牌虽然都很有名气，有些也号称是纯天然制作，但实际上主要成分还是一些化学物质，不知道对皮肤有没有损害。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　那次戒傲恰好从旁边路边，被施主们看到，施主们便向戒傲询问这些化妆品的化学成分是怎样的，戒傲正准备向他们介绍这些化学成分，忽然有位施主说，戒傲小法师不如自己做一瓶纯天然的沐浴液吧？戒傲本想拒绝的，但看到几位施主都很期待的样子，便不忍心拒绝了。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　那几天，戒傲很认真的在电脑里查资料，而后根据资料找来不少植物，放在院子里捶捶捣捣了几天，居然弄出一小瓶液体。戒傲很得意的向我们介绍，他做的这瓶沐浴液经过他自己的多次实验，效果非常好，而且重要的是，没有一点化学成分，就是原材料不太好弄，难以量产，戒傲把他做的沐浴液分成几份让我们试用，拿到手上都很犹豫，因为戒傲做的沐浴液颜色绿油油的，看起来怪可怕的，而且戒傲以前也经常做些实验，失败是常有的事情。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　但是戒傲一再向我们强调，这种绿色是植物最自然的颜色，他的成果完全没有副作用，戒嗔大着胆子抹了点放在手上，洗完手后，手上很舒适，还留下一点清香，果然效果不错。向师兄弟们推荐，大家都觉得效果不错。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　过了几天，戒傲又做了几小瓶沐浴液出来，等到那天参与讨论的几位施主来寺里后，一人分了一瓶，施主们开开心心拿着小瓶子回去了。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　又过了一段时间，戒嗔和戒傲去镇上，在路上见到了那天拿了沐浴液的一位施主，戒傲顺口问施主使用效果如何。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　施主回答说，用了之后有点问题，戒嗔心里有点吃惊，因为戒傲的沐浴液寺里人都用过，大家都反映挺好。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　施主说，那天回家用了一些，发现洗完头后，头发很干燥，梳头容易起静电。&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　戒傲有些尴尬，大家原本以为万无一失的沐浴液，因为一些客观原因导致洗头发的效果实验成了盲点，才导致了缺陷的产生，&lt;/FONT&gt; &lt;BR&gt;&lt;FONT style="FONT-SIZE:medium;LINE-HEIGHT:1.3em;"&gt;　　当我们不知道自己错在何处的时候，便可能自认为自身的言行很完美。&lt;/FONT&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10386" width="1" height="1"&gt;</description><enclosure url="http://gcdn.grapecity.com/cs/blogs/arthas/attachment/10386.ashx" length="27366" type="image/jpeg" /></item><item><title>.NET程序员学Java（8）-怎么得到EXE文件？</title><link>http://gcdn.grapecity.com/cs/blogs/williamluo/archive/2008/09/08/net-java-8-exe.aspx</link><pubDate>Mon, 08 Sep 2008 01:18:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10319</guid><dc:creator>WilliamLuo</dc:creator><slash:comments>8</slash:comments><description>&lt;P&gt;忽然想到一个问题： 为了跨平台，编译得到的结果，只是一些class文件，有没有类似过去Link那样的工具，在Windows下面，把class文件包成Windows下面的exe文件，拿来就能跑，不用依赖JavaVM的？&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10319" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Java/default.aspx">Java</category><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/EXE/default.aspx">EXE</category></item><item><title>生活小事之一 ：历史上最bt的通下水道方式</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/09/07/bt.aspx</link><pubDate>Sun, 07 Sep 2008 09:12:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10313</guid><dc:creator>Arthas</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;其实我本来想先说下历史上最bt的堵下水道方式。。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;级别： Urgent&lt;/P&gt;
&lt;P&gt;form ： 下水道&lt;/P&gt;
&lt;P&gt;环境： 夏日景色某房间内部（ted楼上19层隔壁）&lt;/P&gt;
&lt;P&gt;描述： 在对下水道进行不合法的输入的时候可能因为拒绝输入导致导致下水道被堵住&lt;/P&gt;
&lt;P&gt;step ：&lt;/P&gt;
&lt;P&gt;1 买一份果冻粉&lt;/P&gt;
&lt;P&gt;2 冲剩下最后一点， 然后思考如何做一份有创意的果冻。&lt;/P&gt;
&lt;P&gt;3 选择方案： 加入奶粉做成奶味果冻。&lt;/P&gt;
&lt;P&gt;4 发现不好吃。 全部倒入下水道。&lt;/P&gt;
&lt;P&gt;5 意外的发现下水道被堵了。&lt;/P&gt;
&lt;P&gt;6 如果没有重现， 请加大果冻粉的含量。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;下面是解决的过程：&lt;/P&gt;
&lt;P&gt;1 assign to Arthas cui：Arthas， please check this bug。&lt;/P&gt;
&lt;P&gt;2 assign to Cui Arthas：我认为这是个limitation。 因为可能导致的原因永远追查不完， 也就是说根本不可能彻底解决。 下水道永远是可能被堵住的， 哪怕是100只苍蝇集体自杀也可能导致下水道被堵。 不过我们可以暂时修复描述的问题。&lt;/P&gt;
&lt;P&gt;3 assign to Arthas cui：Arthas， please fix this bug。&lt;/P&gt;
&lt;P&gt;4 assign to Cui Arthas：fixed。 &amp;nbsp;该问题已经被暂时修复。 首先， 我尝试了使用“大量的水”产生大量压强的方式来压迫下水道让他强行被冲开。然而我发现大量的水只能少量的， 慢慢的流下去而没有对下水道造成任何压力。 在经过仔细的思考后， 我尝试了使用热水来融化果冻的方式。 这个方法看起来好像很傻， 但是实际上比较有效。 我在示例程序中， 从热水管取得了一盆热水并倒下去。当水慢慢流掉一半的时候， 水流忽然变快。 然后一切恢复正常了。 但是不能保证其他方式导致的此问题可以同样使用这个办法修复。&lt;/P&gt;
&lt;P&gt;5 Verify ： It is a limitation.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;问题结束。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;p.s. 顺便发现个小问题：&lt;/P&gt;
&lt;P&gt;&lt;A href="http://gcdn.grapecity.com/cs/error.htm?aspxerrorpath=/cs/blogs/post.aspx"&gt;http://gcdn.grapecity.com/cs/error.htm?aspxerrorpath=/cs/blogs/post.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;当错误到达这个界面的时候， 没有任何连接可以让你点。 你唯一的选择是使用浏览器的后退。 &lt;/P&gt;
&lt;P&gt;&amp;nbsp;然而这是不是有点。。。。霸道了？&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10313" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/arthas/archive/tags/_1F753B6D0F5C8B4E_/default.aspx">生活小事</category></item><item><title>不可思议之二十六 ：与技术无关</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/09/01/10146.aspx</link><pubDate>Mon, 01 Sep 2008 10:26:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10146</guid><dc:creator>Arthas</dc:creator><slash:comments>7</slash:comments><description>&lt;P&gt;恩， 我们分享个小漫画玩玩。。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://gcdn.grapecity.com/cs/blogs/arthas/attachment/10146.ashx"&gt;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10146" width="1" height="1"&gt;</description><enclosure url="http://gcdn.grapecity.com/cs/blogs/arthas/attachment/10146.ashx" length="259753" type="image/jpeg" /><category domain="http://gcdn.grapecity.com/cs/blogs/arthas/archive/tags/_0D4EEF531D60AE8BFB7C1752_/default.aspx">不可思议系列</category></item><item><title>不可思议之二十五 : bug离我们有多远？</title><link>http://gcdn.grapecity.com/cs/blogs/arthas/archive/2008/08/31/bug.aspx</link><pubDate>Sun, 31 Aug 2008 12:30:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10132</guid><dc:creator>Arthas</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;额。 确切的说， bug距离我们很遥远。 一般用户不到蓝屏死机不会咒骂系统有bug&lt;/P&gt;
&lt;P&gt;（弱弱的说一句， 蓝屏了还真不见得是bug。。 有可能是保护措施）&lt;/P&gt;
&lt;P&gt;然而反过来说， bug又离我们很近。 挑剔一点， 可以说， “万物皆bug”。&lt;/P&gt;
&lt;P&gt;Everything is a bug.&lt;/P&gt;
&lt;P&gt;咋听着那么像面向对象呢？&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;恩， 例如最近无聊， 开始关注自己平时用的软件， 并记录下用着不爽， 感觉， 要是自己测试的话敢报bug的点。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;发现还真不少。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;例如windows xp， 把任务栏拉成三行， 然后切换主题。&lt;/P&gt;
&lt;P&gt;每次切换都将减少一行任务栏。。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;日文以及中文的xp + sp3， 测试有效。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;而Neil更是发现了如何让鼠标粘滞不抬起。具体联系neil.pang&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;xp的另一个输入法导致的bug， 暂时不能确定为bug， 就不多说什么了。&lt;/P&gt;
&lt;P&gt;下面进入qq环节。&lt;/P&gt;
&lt;P&gt;8.0.981.400版本， 也就是qq2008正式版测试有效。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;打开一个联系人， 点“聊天记录”， 展开。 再点， 缩起。 窗口大小还原。 OK， 没有问题。&lt;/P&gt;
&lt;P&gt;聊天记录的快捷键是alt + h&lt;/P&gt;
&lt;P&gt;尝试按下， 展开。 再点， 缩起。 窗口大小不还原。 &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;这个bug貌似有点严重额。。 qq老手一般看聊天记录都是alt + h的， 而不是用鼠标。。。&lt;/P&gt;
&lt;P&gt;下面是搜狗拼音的。 一直用搜狗， 但是这个问题我强烈鄙视！ 做得一点都不专业！&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;今天搜狗拼音添加词库失败报错了。提示了个什么？&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;见图片：&lt;/P&gt;
&lt;P&gt;&lt;IMG style="WIDTH:368px;HEIGHT:158px;" height=158 src="http://gcdn.grapecity.com/cs/blogs/arthas/attachment/10132.ashx" width=368&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;所以蓝屏的时候， 微软的选择是个一个错误代码。 无论是谁， 只要能提供这个错误代码， （还是0x开头， 很好找）&lt;/P&gt;
&lt;P&gt;客服就可以立刻查阅出问题出现在什么地方。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;例如：&lt;/P&gt;
&lt;P&gt;某客服： 你好先生， 请问你遇到了什么问题？&lt;/P&gt;
&lt;P&gt;客户：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我使用贵公司的程序， 然后程序出错了。 提示了一串东西&lt;/P&gt;
&lt;P&gt;某客服：&amp;nbsp; 那具体是什么错误呢?&lt;/P&gt;
&lt;P&gt;客户：&amp;nbsp;&amp;nbsp;&amp;nbsp; 我也不知道， 蹦了个什么对话框， 说继续还是退出， 然后我就点继续了&lt;/P&gt;
&lt;P&gt;某客服： 那应该是出现了未被捕捉的异常。 请问当时具体提示的是什么异常呢？&lt;/P&gt;
&lt;P&gt;客户：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 异常是什么东东？&lt;/P&gt;
&lt;P&gt;某客服： 。。。。。。 就是上面提示了都是什么东西？你能提供些更详细的信息吗？&lt;/P&gt;
&lt;P&gt;客户：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 哦， 你说这个啊？ 恩， 都是英文。&lt;/P&gt;
&lt;P&gt;某客服：　先生，　你这样说我们无法找到问题的源头并可能无法解决问题。　你能说下出现的问题到底是什么吗？　比如给你的异常名字？　&lt;/P&gt;
&lt;P&gt;&amp;nbsp;客户：　***（脏话被过滤）， 我要是看的懂还用得着打电话问你？你不客服吗， 咋成了你问我问题了？&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;某客服： 。。。。。。（画外音， “经理。。 我申请辞职。。。。。”）&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10132" width="1" height="1"&gt;</description><enclosure url="http://gcdn.grapecity.com/cs/blogs/arthas/attachment/10132.ashx" length="12512" type="image/jpeg" /><category domain="http://gcdn.grapecity.com/cs/blogs/arthas/archive/tags/_0D4EEF531D60AE8BFB7C1752_/default.aspx">不可思议系列</category></item><item><title>不要把所有的鸡蛋放在一个篮子里 -- 谈谈最大熵模型【转】</title><link>http://gcdn.grapecity.com/cs/blogs/gw0506/archive/2008/08/28/10111.aspx</link><pubDate>Thu, 28 Aug 2008 10:05:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10111</guid><dc:creator>gw0506</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;从 Google 黑板报 -- Google 中国的博客网志 作者：joydandan&lt;br&gt;发表者：Google 研究员，吴军&lt;br&gt;&lt;br&gt;[我们在投资时常常讲不要把所有的鸡蛋放在一个篮子里，这样可以降低风险。在信息处理中，这个原理同样适用。在数学上，这个原理称为最大熵原理(the maximum entropy principle)。这是一个非常有意思的题目，但是把它讲清楚要用两个系列的篇幅。]&lt;br&gt;&lt;br&gt;前段时间，Google 中国研究院的刘骏总监谈到在网络搜索排名中，用到的信息有上百种。更普遍地讲，在自然语言处理中，我们常常知道各种各样的但是又不完全确定的信息，我们需要用一个统一的模型将这些信息综合起来。如何综合得好，是一门很大的学问。&lt;br&gt;&lt;br&gt;让我们看一个拼音转汉字的简单的例子。假如输入的拼音是"wang-xiao-bo"，利用语言模型，根据有限的上下文(比如前两个词)，我们能给出两个最常见的名字“王小波”和“王晓波”。至于要唯一确定是哪个名字就难了，即使利用较长的上下文也做不到。当然，我们知道如果通篇文章是介绍文学的，作家王小波的可能性就较大；而在讨论两岸关系时，台湾学者王晓波的可能性会较大。在上面的例子中，我们只需要综合两类不同的信息，即主题信息和上下文信息。虽然有不少凑合的办法，比如：分成成千上万种的不同的主题单独处理，或者对每种信息的作用加权平均等等，但都不能准确而圆满地解决问题，这样好比以前我们谈到的行星运动模型中的小圆套大圆打补丁的方法。在很多应用中，我们需要综合几十甚至上百种不同的信息，这种小圆套大圆的方法显然行不通。&lt;br&gt;&lt;br&gt;数学上最漂亮的办法是最大熵(maximum entropy)模型，它相当于行星运动的椭圆模型。“最大熵”这个名词听起来很深奥，但是它的原理很简单，我们每天都在用。说白了，就是要保留全部的不确定性，将风险降到最小。让我们来看一个实际例子。&lt;br&gt;&lt;br&gt;有一次，我去 AT&amp;amp;T 实验室作关于最大熵模型的报告，我带去了一个色子。我问听众“每个面朝上的概率分别是多少”，所有人都说是等概率，即各点的概率均为1/6。这种猜测当然是对的。我问听众们为什么，得到的回答是一致的：对这个“一无所知”的色子，假定它每一个朝上概率均等是最安全的做法。（你不应该主观假设它象韦小宝的色子一样灌了铅。）从投资的角度看，就是风险最小的做法。从信息论的角度讲，就是保留了最大的不确定性，也就是说让熵达到最大。接着，我又告诉听众，我的这个色子被我特殊处理过，已知四点朝上的概率是三分之一，在这种情况下，每个面朝上的概率是多少？这次，大部分人认为除去四点的概率是 1/3，其余的均是 2/15，也就是说已知的条件（四点概率为 1/3）必须满足，而对其余各点的概率因为仍然无从知道，因此只好认为它们均等。注意，在猜测这两种不同情况下的概率分布时，大家都没有添加任何主观的假设，诸如四点的反面一定是三点等等。（事实上，有的色子四点反面不是三点而是一点。）这种基于直觉的猜测之所以准确，是因为它恰好符合了最大熵原理。&lt;br&gt;&lt;br&gt;最大熵原理指出，当我们需要对一个随机事件的概率分布进行预测时，我们的预测应当满足全部已知的条件，而对未知的情况不要做任何主观假设。（不做主观假设这点很重要。）在这种情况下，概率分布最均匀，预测的风险最小。因为这时概率分布的信息熵最大，所以人们称这种模型叫“最大熵模型”。我们常说，不要把所有的鸡蛋放在一个篮子里，其实就是最大熵原理的一个朴素的说法，因为当我们遇到不确定性时，就要保留各种可能性。&lt;br&gt;&lt;br&gt;回到我们刚才谈到的拼音转汉字的例子，我们已知两种信息，第一，根据语言模型，wang-xiao-bo 可以被转换成王晓波和王小波；第二，根据主题，王小波是作家，《黄金时代》的作者等等，而王晓波是台湾研究两岸关系的学者。因此，我们就可以建立一个最大熵模型，同时满足这两种信息。现在的问题是，这样一个模型是否存在。匈牙利著名数学家、信息论最高奖香农奖得主希萨（Csiszar）证明，对任何一组不自相矛盾的信息，这个最大熵模型不仅存在，而且是唯一的。而且它们都有同一个非常简单的形式 -- 指数函数。下面公式是根据上下文（前两个词）和主题预测下一个词的最大熵模型，其中 w3 是要预测的词（王晓波或者王小波）w1 和 w2 是它的前两个字（比如说它们分别是“出版”，和“”），也就是其上下文的一个大致估计，subject 表示主题。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;我们看到，在上面的公式中，有几个参数 lambda 和 Z ，他们需要通过观测数据训练出来。&lt;br&gt;&lt;br&gt;最大熵模型在形式上是最漂亮的统计模型，而在实现上是最复杂的模型之一。我们在将下一个系列中介绍如何训练最大熵模型的诸多参数，以及最大熵模型在自然语言处理和金融方面很多有趣的应用。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最原始的最大熵模型的训练方法是一种称为通用迭代算法 GIS(generalized iterative scaling) 的迭代 算法。GIS 的原理并不复杂，大致可以概括为以下几个步骤：&lt;br&gt;1. 假定第零次迭代的初始模型为等概率的均匀分布。&lt;br&gt;2. 用第 N 次迭代的模型来估算每种信息特征在训练数据中的分布，如果超过了实际的，就把相应的模型参数变小；否则，将它们便大。&lt;br&gt;3. 重复步骤 2 直到收敛。&lt;br&gt;&lt;br&gt;GIS 最早是由 Darroch 和 Ratcliff 在七十年代提出的。但是，这两人没有能对这种算法的物理含义进行很好地解释。后来是由数学家希萨（Csiszar)解释清楚的，因此，人们在谈到这个算法时，总是同时引用 Darroch 和Ratcliff 以及希萨的两篇论文。GIS 算法每次迭代的时间都很长，需要迭代很多次才能收敛，而且不太稳定，即使在 64 位计算机上都会出现溢出。因此，在实际应用中很少有人真正使用 GIS。大家只是通过它来了解最大熵模型的算法。&lt;br&gt;&lt;br&gt;八十年代，很有天才的孪生兄弟的达拉皮垂(Della Pietra)在 IBM 对 GIS 算法进行了两方面的改进，提出了改进迭代算法 IIS（improved iterative scaling）。这使得最大熵模型的训练时间缩短了一到两个数量级。这样最大熵模型才有可能变得实用。即使如此，在当时也只有 IBM 有条件是用最大熵模型。&lt;br&gt;&lt;br&gt;由于最大熵模型在数学上十分完美，对科学家们有很大的诱惑力，因此不少研究者试图把自己的问题用一个类似最大熵的近似模型去套。谁知这一近似，最大熵模型就变得不完美了，结果可想而知，比打补丁的凑合的方法也好不了多少。于是，不少热心人又放弃了这种方法。第一个在实际信息处理应用中验证了最大熵模型的优势的，是宾夕法尼亚大学马库斯的另一个高徒原 IBM 现微软的研究员拉纳帕提(Adwait Ratnaparkhi)。拉纳帕提的聪明之处在于他没有对最大熵模型进行近似，而是找到了几个最适合用最大熵模型、而计算量相对不太大的自然语言处理问题，比如词性标注和句法分析。拉纳帕提成功地将上下文信息、词性（名词、动词和形容词等）、句子成分（主谓宾）通过最大熵模型结合起来，做出了当时世界上最好的词性标识系统和句法分析器。拉纳帕提的论文发表后让人们耳目一新。拉纳帕提的词性标注系统，至今仍然是使用单一方法最好的系统。科学家们从拉纳帕提的成就中，又看到了用最大熵模型解决复杂的文字信息处理的希望。&lt;br&gt;&lt;br&gt;但是，最大熵模型的计算量仍然是个拦路虎。我在学校时花了很长时间考虑如何简化最大熵模型的计算量。终于有一天，我对我的导师说，我发现一种数学变换，可以将大部分最大熵模型的训练时间在 IIS 的基础上减少两个数量级。我在黑板上推导了一个多小时，他没有找出我的推导中的任何破绽，接着他又回去想了两天，然后告诉我我的算法是对的。从此，我们就建造了一些很大的最大熵模型。这些模型比修修补补的凑合的方法好不少。即使在我找到了快速训练算法以后，为了训练一个包含上下文信息，主题信息和语法信息的文法模型(language model)，我并行使用了 20 台当时最快的 SUN 工作站，仍然计算了三个月。由此可见最大熵模型的复杂的一面。最大熵模型快速算法的实现很复杂，到今天为止，世界上能有效实现这些算法的人也不到一百人。有兴趣实现一个最大熵模型的读者可以阅读我的论文。&lt;br&gt;&lt;br&gt;最大熵模型，可以说是集简与繁于一体，形式简单，实现复杂。值得一提的是，在Google的很多产品中，比如机器翻译，都直接或间接地用到了最大熵模型。&lt;br&gt;&lt;br&gt;讲到这里，读者也许会问，当年最早改进最大熵模型算法的达拉皮垂兄弟这些年难道没有做任何事吗？他们在九十年代初贾里尼克离开 IBM 后，也退出了学术界，而到在金融界大显身手。他们两人和很多 IBM 语音识别的同事一同到了一家当时还不大，但现在是世界上最成功对冲基金(hedge fund)公司----文艺复兴技术公司 (Renaissance Technologies)。我们知道，决定股票涨落的因素可能有几十甚至上百种，而最大熵方法恰恰能找到一个同时满足成千上万种不同条件的模型。达拉皮垂兄弟等科学家在那里，用于最大熵模型和其他一些先进的数学工具对股票预测，获得了巨大的成功。从该基金 1988 年创立至今，它的净回报率高达平均每年 34%。也就是说，如果 1988 年你在该基金投入一块钱，今天你能得到 200 块钱。这个业绩，远远超过股神巴菲特的旗舰公司伯克夏哈撒韦（Berkshire Hathaway)。同期，伯克夏哈撒韦的总回报是 16 倍。&lt;br&gt;&lt;br&gt;值得一提的是，信息处理的很多数学手段，包括隐含马尔可夫模型、子波变换、贝叶斯网络等等，在华尔街多有直接的应用。由此可见，数学模型的作用。 &lt;br&gt;&lt;/p&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10111" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/gw0506/archive/tags/_7065665B4B4E8E7F_/default.aspx">数学之美</category></item><item><title>闪光的不一定是金子 谈谈搜索引擎作弊问题(Search Engine Anti-SPAM)【转】</title><link>http://gcdn.grapecity.com/cs/blogs/gw0506/archive/2008/08/28/search-engine-anti-spam.aspx</link><pubDate>Thu, 28 Aug 2008 09:44:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10110</guid><dc:creator>gw0506</dc:creator><slash:comments>3</slash:comments><description>作者：&lt;span class="entry-author-name"&gt;Jun Wu&lt;/span&gt;Google 研究员 吴军&lt;br&gt;&lt;br&gt;自从有了搜索引擎，就有了针对搜索引擎网页排名的作弊(SPAM)。以至于用户发现在搜索引擎中排名靠前的网页不一定就是高质量的，用句俗话说，闪光的不一定是金子。&lt;br&gt;&lt;br&gt;搜索引擎的作弊，虽然方法很多，目的只有一个，就是采用不正当手&lt;div style="direction:ltr;"&gt;段提高自己网页的排名。早期最常见的作弊方法是重复关键词。比如一个卖数码相机的网站，重复地罗列各种数码相机的品牌，如尼康、佳能和柯达等等。为了不让读者看到众多讨厌的关键词，聪明一点的作弊者常用很小的字体和与背景相同的颜色来掩盖这些关键词。其实，这种做法很容易被搜索引擎发现并纠正。&lt;br&gt;&lt;br&gt;在有了网页排名(page rank)以后，作弊者发现一个网页被引用的连接越多，排名就可能越靠前，于是就有了专门卖链接和买链接的生意。比如，有人自己创建成百上千个网站，这些网站上没有实质的内容，只有到他们的客户网站的连接。这种做法比重复关键词要高明得多，但是还是不太难被发现。因为那些所谓帮别人提高排名的网站，为了维持生意需要大量地卖链接，所以很容易露马脚。（这就如同造假钞票，当某一种假钞票的流通量相当大以后，就容易找到根源了。）再以后，又有了形形色色的作弊方式，我们就不在这里一一赘述了。&lt;br&gt;&lt;br&gt;几年前，我加入Google做的第一件事就是消除网络作弊。在Google最早发现搜索引擎作弊的是Matt Cutts，他在我加入Google前几个月开始研究这个问题，后来，辛格，马丁和我先后加入进来。我们经过几个月的努力，清除了一半的作弊者。(当然，以后抓作弊的效率就不会有这么高了。）其中一部分网站从此"痛改前非"，但是还是有很多网站换一种作弊方法继续作弊，因此，抓作弊成了一种长期的猫捉老鼠的游戏。虽然至今还没有一个一劳永逸地解决作弊问题的方法，但是，Google基本做到了对于任何已知的作弊方法，在一定时间内发现并清除它，从而总是将作弊的网站的数量控制在一个很小的比例范围。&lt;br&gt;&lt;br&gt;抓作弊的方法很像信号处理中的去噪音的办法。学过信息论和有信号处理经验的读者可能知道这么一个事实，我们如果在发动机很吵的汽车里用手机打电话，对方可能听不清；但是如果我们知道了汽车发动机的频率，我们可以加上一个和发动机噪音相反的信号，很容易地消除发动机的噪音，这样，收话人可以完全听不到汽车的噪音。事实上，现在一些高端的手机已经有了这种检测和消除噪音的功能。消除噪音的流程可以概括如下：&lt;br&gt;&lt;img src="http://googlechinablog.com/uploaded_images/math-782969.gif" alt="noise-channel" width="600"&gt;&lt;br&gt;在图中，原始的信号混入了噪音，在数学上相当于两个信号做卷积。噪音消除的过程是一个解卷积的过程。这在信号处理中并不是什么难题。因为第一，汽车发动机的频率是固定的，第二，这个频率的噪音重复出现，只要采集几秒钟的信号进行处理就能做到。从广义上讲，只要噪音不是完全随机的、并且前后有相关性，就可以检测到并且消除。（事实上，完全随机不相关的高斯白噪音是很难消除的。）&lt;br&gt;&lt;br&gt;搜索引擎的作弊者所作的事，就如同在手机信号中加入了噪音，使得搜索结果的排名完全乱了。但是，这种人为加入的噪音并不难消除，因为作弊者的方法不可能是随机的（否则就无法提高排名了）。而且，作弊者也不可能是一天换一种方法，即作弊方法是时间相关的。因此，搞搜索引擎排名算法的人，可以在搜集一段时间的作弊信息后，将作弊者抓出来，还原原有的排名。当然这个过程需要时间，就如同采集汽车发动机噪音需要时间一样，在这段时间内，作弊者可能会尝到些甜头。因此，有些人看到自己的网站经过所谓的优化（其实是作弊），排名在短期内靠前了，以为这种所谓的优化是有效的。但是，不久就会发现排名掉下去了很多。这倒不是搜索引擎以前宽容，现在严厉了，而是说明抓作弊需要一定的时间，以前只是还没有检测到这些作弊的网站而已。&lt;br&gt;&lt;br&gt;还要强调一点，Google抓作弊和恢复网站原有排名的过程完全是自动的(并没有个人的好恶），就如同手机消除噪音是自动的一样。一个网站要想长期排名靠前，就需要把内容做好，同时要和那些作弊网站划清界限。&lt;/div&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10110" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/gw0506/archive/tags/_7065665B4B4E8E7F_/default.aspx">数学之美</category></item><item><title>矩阵运算和文本处理中的分类问题【转】</title><link>http://gcdn.grapecity.com/cs/blogs/gw0506/archive/2008/08/28/10109.aspx</link><pubDate>Thu, 28 Aug 2008 09:40:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10109</guid><dc:creator>gw0506</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;其实我看完了也是一头雾水，就是知道了矩阵真的有用例。 &lt;img src="http://gcdn.grapecity.com/cs//emoticons/emotion-8.gif" alt="Indifferent" /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------------------- &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;作者：&lt;span class="entry-author-name"&gt;joydandan&lt;/span&gt;&lt;/p&gt;&lt;div class="entry-body"&gt;&lt;div&gt;&lt;div class="item-body"&gt;&lt;div&gt;&lt;div&gt;
&lt;span&gt;发表者：Google 研究员，吴军 &lt;/span&gt;
&lt;br&gt;
&lt;br&gt;我在大学学习线性代数时，实在想不出它除了告诉我们如何解线性方程外，还能有什么别的用途。关于矩阵的许多概念，比如特征值等等，更是脱离日常生
活。后来在数值分析中又学了很多矩阵的近似算法，还是看不到可以应用的地方。当时选这些课，完全是为了混学分的学位。我想，很多同学都多多少少有过类似的
经历。直到后来长期做自然语言处理的研究，我才发现数学家们提出那些矩阵的概念和算法，是有实际应用的意义的。&lt;br&gt;
&lt;br&gt;在自然语言处理中，最常见的两类的分类问题分别是，将文本按主题归类（比如将所有介绍亚运会的新闻归到体育类）和将词汇表中的字词按意思归类（比
如将各种体育运动的名称个归成一类）。这两种分类问题都可用通过矩阵运算来圆满地、同时解决。为了说明如何用矩阵这个工具类解决这两个问题的，让我们先来
来回顾一下我们在余弦定理和新闻分类中介绍的&lt;a href="http://googlechinablog.com/2006/07/12.html" target="_blank"&gt;方法&lt;/a&gt;。&lt;br&gt;
&lt;br&gt;分类的关键是计算相关性。我们首先对两个文本计算出它们的内容词，或者说实词的向量，然后求这两个向量的夹角。当这两个向量夹角为零时，新闻就相
关；当它们垂直或者说正交时，新闻则无关。当然，夹角的余弦等同于向量的内积。从理论上讲，这种算法非常好。但是计算时间特别长。通常，我们要处理的文章
的数量都很大，至少在百万篇以上，二次回标有非常长，比如说有五十万个词（包括人名地名产品名称等等）。如果想通过对一百万篇文章两篇两篇地成对比较，来
找出所有共同主题的文章，就要比较五千亿对文章。现在的计算机一秒钟最多可以比较一千对文章，完成这一百万篇文章相关性比较就需要十五年时间。注意，要真
正完成文章的分类还要反复重复上述计算。&lt;br&gt;
&lt;br&gt;在文本分类中，另一种办法是利用矩阵运算中的奇异值分解（Singular Value Decomposition，简称
SVD)。现在让我们来看看奇异值分解是怎么回事。首先，我们可以用一个大矩阵A来描述这一百万篇文章和五十万词的关联性。这个矩阵中，每一行对应一篇文
章，每一列对应一个词。&lt;br&gt;
&lt;br&gt;
&lt;img src="http://googlechinablog.com/uploaded_images/matrix-711200.jpg" alt="" style="border:1px solid grey;" border="0"&gt;
&lt;br&gt;
&lt;br&gt;在上面的图中，M=1,000,000，N=500,000。第 i 行，第 j 列的元素，是字典中第 j 个词在第 i 篇文章中出现的加权词频（比如，&lt;a href="http://googlechinablog.com/2006/06/blog-post_27.html" target="_blank"&gt;TF/IDF&lt;/a&gt;)。读者可能已经注意到了，这个矩阵非常大，有一百万乘以五十万，即五千亿个元素。&lt;br&gt;
&lt;br&gt;奇异值分解就是把上面这样一个大矩阵，分解成三个小矩阵相乘，如下图所示。比如把上面的例子中的矩阵分解成一个一百万乘以一百的矩阵X，一个一百
乘以一百的矩阵B，和一个一百乘以五十万的矩阵Y。这三个矩阵的元素总数加起来也不过1.5亿，仅仅是原来的三千分之一。相应的存储量和计算量都会小三个
数量级以上。&lt;br&gt;
&lt;br&gt;
&lt;img src="http://googlechinablog.com/uploaded_images/svd-754892.jpg" alt="" style="border:1px solid grey;" border="0"&gt;
&lt;br&gt;
&lt;br&gt;三个矩阵有非常清楚的物理含义。第一个矩阵X中的每一行表示意思相关的一类词，其中的每个非零元素表示这类词中每个词的重要性（或者说相关性），
数值越大越相关。最后一个矩阵Y中的每一列表示同一主题一类文章，其中每个元素表示这类文章中每篇文章的相关性。中间的矩阵则表示类词和文章雷之间的相关
性。因此，我们只要对关联矩阵A进行一次奇异值分解，w 我们就可以同时完成了近义词分类和文章的分类。（同时得到每类文章和每类词的相关性）。&lt;br&gt;
&lt;br&gt;现在剩下的唯一问题，就是如何用计算机进行奇异值分解。这时，线性代数中的许多概念，比如矩阵的特征值等等，以及数值分析的各种算法就统统用上
了。在很长时间内，奇异值分解都无法并行处理。（虽然 Google 早就有了MapReduce
等并行计算的工具，但是由于奇异值分解很难拆成不相关子运算，即使在 Google
内部以前也无法利用并行计算的优势来分解矩阵。）最近，Google
中国的张智威博士和几个中国的工程师及实习生已经实现了奇异值分解的并行算法，我认为这是 Google 中国对世界的一个贡献。&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10109" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/gw0506/archive/tags/_7065665B4B4E8E7F_/default.aspx">数学之美</category></item><item><title>.NET程序员学Java（7）- 对象无属性</title><link>http://gcdn.grapecity.com/cs/blogs/williamluo/archive/2008/08/28/net-java-7.aspx</link><pubDate>Thu, 28 Aug 2008 08:00:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10106</guid><dc:creator>WilliamLuo</dc:creator><slash:comments>3</slash:comments><description>&lt;P&gt;要不是Alfred提醒，我都没有注意到：Java里面没有“属性”的概念！&lt;/P&gt;
&lt;P&gt;只有JavaBeans里面，才通过setX和getX这样的命名约定，实现类似.NET的属性。&lt;/P&gt;
&lt;P&gt;也就是说，如果要让调用者可以通过 obj.X 的方式进行调用，被调用者要提供两个方法，分别命名为getX和setX。&lt;/P&gt;
&lt;P&gt;不过实质是一样的，没什么孰优孰劣的问题。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10106" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Java/default.aspx">Java</category></item><item><title>由电视剧《暗算》所想到的 — 谈谈密码学的数学原理【转】</title><link>http://gcdn.grapecity.com/cs/blogs/gw0506/archive/2008/08/28/10095.aspx</link><pubDate>Thu, 28 Aug 2008 07:11:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10095</guid><dc:creator>gw0506</dc:creator><slash:comments>0</slash:comments><description>作者：&lt;span class="entry-author-name"&gt;joydandan&lt;/span&gt;&lt;div class="entry-body"&gt;&lt;div&gt;&lt;div class="item-body"&gt;&lt;div&gt;&lt;span&gt;发表者：Google（谷歌）研究员 吴军 &lt;/span&gt;&lt;br&gt;&lt;br&gt;前一阵子看了电视剧《暗算》，蛮喜欢它的构思和里面的表演。其中有一个故事提到了密码学，故事本身不错，但是有点故弄玄虚。不过有一点是对的，就是当今的密码学是以数学为基础的。（没有看过暗算的读者可以看一下介绍，&lt;a href="http://ent.sina.com.cn/v/2005-10-17/ba866985.shtml" target="_blank"&gt;http://ent.sina.com.cn/v/2005-10-17/ba866985.shtml&lt;/a&gt;&lt;br&gt;因为我们后面要多次提到这部电视剧。）&lt;br&gt;&lt;br&gt;密码学的历史大致可以推早到两千年前，相传名将凯撒为了防止敌方截获情报，用密码传送情报。凯撒的做法很简单，就是对二十几个罗马字母建立一张对应表，比如说&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;nbsp&lt;a href="http://googlechinablog.com/uploaded_images/code-714213.jpg" target="_blank"&gt;&lt;br&gt;&lt;img src="http://googlechinablog.com/uploaded_images/code-714211.jpg" style="border:1px solid grey;" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;这
样，如果不知道密码本，即使截获一段信息也看不懂，比如收到一个的消息是 EBKTBP，那么在敌人看来是毫无意义的字，通过密码本解破出来就是
CAESAR
一词，即凯撒的名字。这种编码方法史称凯撒大帝。当然，学过信息论的人都知道，只要多截获一些情报，统计一下字母的频率，就可以解破出这种密码。柯蓝道尔
在他的“福尔摩斯探案集”中“跳舞的小人”的故事里已经介绍了这种小技巧。在很长时间里，人们试图找到一些好的编码方法使得解密者无法从密码中统计出明码
的统计信息，但是，基本上靠经验。有经验的编码者会把常用的词对应成多个密码，
使得破译者很难统计出任何规律。比如，如果将汉语中的“是”一词对应于唯一一个编码 0543，那么破译者就会发现 0543
出现的特别多。但如果将它对应成十个密码 0543，3737，2947
等等，每次随机的挑一个使用，每个密码出现的次数就不会太多，而且破译者也无从知道这些密码其实对应一个字。这里面虽然包含着朴素的概率论的原理，但是并
不科学化。另外，好的密码必须做到不能根据已知的明文和密文的对应推断出新的密文的内容。历史上有很多在这方面设计得不周到的密码的例子。在第二次世界大
战中，日本军方的密码设计就很成问题。美军破获了日本很多密码。在中途岛海战前，美军截获的日军密电经常出现 AF
这样一个地名，应该是太平洋的某个岛屿，但是美军无从知道是哪个。于是，美军就逐个发表自己控制的每个岛屿上的假新闻。当美军发出“中途岛供水系统坏了”
这条假新闻后，从截获的日军情报中又看到 AF 供水出来问题的电文，美军就断定中途岛就是
AF。事实证明判断正确，美军在那里成功地伏击了日本主力舰队。&lt;br&gt;&lt;br&gt;事实上，在第二次世界大战中，很多顶尖的科学家包括提出信息论的香农都在
为美军情报部门工作，而信息论实际上就是情报学的直接产物。香农提出信息论后，为密码学的发展带来了新气象。根据信息论，密码的最高境界是使得敌人在截获
密码后，对我方的所知没有任何增加，用信息论的专业术语讲，就是信息量没有增加。一般来讲，当密码之间分布均匀并且统计独立时，提供的信息最少。均匀分布
使得敌人无从统计，而统计独立能保证敌人即使看到一段密码和明码后，不能破译另一段密码。这也是《暗算》里传统的破译员老陈破译的一份密报后，但无法推广
的原因，而数学家黄依依预见到了这个结果，因为她知道敌人新的密码系统编出的密文是统计独立的。有了信息论后，密码的设计就有了理论基础，现在通用的公开
密钥的方法，包括《暗算》里的“光复一号”密码，就是基于这个理论。&lt;br&gt;&lt;br&gt;公开密钥的原理其实很简单，我们以给上面的单词 Caesar 加解密来说明它的原理。我们先把它变成一组数，比如它的 Ascii 代码 X=099097101115097114（每三位代表一个字母）做明码。现在我们来设计一个密码系统，对这个明码加密。&lt;br&gt;&lt;br&gt;1，找两个很大的素数（质数）P 和 Q，越大越好，比如 100 位长的, 然后计算它们的乘积 N=P×Q，M=（P-1）×（Q-1）。&lt;br&gt;&lt;br&gt;2，找一个和 M 互素的整数 E，也就是说 M 和 E 除了 1 以外没有公约数。&lt;br&gt;&lt;br&gt;3，找一个整数 D，使得 E×D 除以 M 余 1，即 E×D mod M = 1。&lt;br&gt;&lt;br&gt;现在，世界上先进的、最常用的密码系统就设计好了，其中 E 是公钥谁都可以用来加密，D 是私钥用于解密，一定要自己保存好。乘积 N 是公开的，即使敌人知道了也没关系。&lt;br&gt;&lt;br&gt;现在，我们用下面的公式对 X 加密，得到密码 Y。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;nbsp&lt;a href="http://googlechinablog.com/uploaded_images/image001-757938.gif" target="_blank"&gt;&lt;br&gt;&lt;img src="http://googlechinablog.com/uploaded_images/image001-757936.gif" style="border:1px solid grey;" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;好了，现在没有密钥 D，神仙也无法从 Y 中恢复 X。如果知道 D，根据费尔马小定理，则只要按下面的公式就可以轻而易举地从 Y 中得到 X。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;nbsp&lt;a href="http://googlechinablog.com/uploaded_images/image002-778230.gif" target="_blank"&gt;&lt;br&gt;&lt;img src="http://googlechinablog.com/uploaded_images/image002-778228.gif" style="border:1px solid grey;" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;这个过程大致可以概况如下： &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;nbsp&lt;a href="http://googlechinablog.com/uploaded_images/process-731789.jpg" target="_blank"&gt;&lt;br&gt;&lt;img src="http://googlechinablog.com/uploaded_images/process-731778.jpg" style="border:1px solid grey;" alt="" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;公开密钥的好处有：&lt;br&gt;&lt;br&gt;1.简单。&lt;br&gt;&lt;br&gt;2.
可靠。公开密钥方法保证产生的密文是统计独立而分布均匀的。也就是说，不论给出多少份明文和对应的密文，也无法根据已知的明文和密文的对应来破译下一份密
文。更重要的是 N,E 可以公开给任何人加密用，但是只有掌握密钥 D 的人才可以解密,
即使加密者自己也是无法解密的。这样，即使加密者被抓住叛变了，整套密码系统仍然是安全的。（而凯撒大帝的加密方法有一个知道密码本的人泄密，整个密码系
统就公开了。）&lt;br&gt;&lt;br&gt;3.灵活，可以产生很多的公开密钥E和私钥D的组合给不同的加密者。&lt;br&gt;&lt;br&gt;最后让我们看看破解这种密码的难度。
首先，要声明，世界上没有永远破不了的密码，关键是它能有多长时间的有效期。要破公开密钥的加密方式，至今的研究结果表明最好的办法还是对大字 N
进行因数分解，即通过 N 反过来找到 P 和 Q，这样密码就被破了。而找 P 和 Q
目前只有用计算机把所有的数字试一遍这种笨办法。这实际上是在拼计算机的速度，这也就是为什么 P 和 Q 都需要非常大。一种加密方法只有保证 50
年计算机破不了也就可以满意了。前几年破解的 RSA-158 密码是这样因数分解的&lt;br&gt;&lt;br&gt;395058745832651445264197678006144819960207764603049364541393760515793556265294&lt;br&gt;50683609727842468219535093544305870490251995655335710209799226484977949442955603 &lt;br&gt;=
3388495837466721394368393204672181522815830368604993048084925840555281177
×11658823406671259903148376558383270818131012258146392600439520994131344334162924536139&lt;br&gt;&lt;br&gt;现
在，让我们回到《暗算》中，黄依依第一次找的结果经过一系列计算发现无法归零，也就是说除不尽，我猜她可能试图将一个大数 N
做分解，没成功。第二次计算的结果是归零了，说明她找到的 N=P×Q
的分解方法。当然，这件事能不能用算盘完成，我就不知道了，但我觉得比较夸张。另外我对该电视剧还有一个搞不懂的问题就是里面提到的“光复一号”密码的误
差问题。一个密码是不能有误差的，否则就是有的密钥也无法解码了。我想可能是指在构造密码时，P 和 Q
之一没找对，其中一个（甚至两个都）不小心找成了合数，这时密码的保密性就差了很多。如果谁知道电视剧里面讲的“误差”是指什么请告诉我。另外，电视剧里
提到冯∙诺依曼，说他是现代密码学的祖宗，我想是弄错了，应该是香农。冯∙诺依曼的贡献在发明计算机和提出博弈论（game theory）。&lt;br&gt;&lt;br&gt;不管怎么样，我们今天用的所谓最可靠的加密方法的数学原理其实就这么简单，一点也不神秘，无非是找几个大素数做一些乘除和乘方运算就可以了。&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10095" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/gw0506/archive/tags/_7065665B4B4E8E7F_/default.aspx">数学之美</category></item><item><title>输入一个汉字需要敲多少个键 — 谈谈香农第一定律【转】</title><link>http://gcdn.grapecity.com/cs/blogs/gw0506/archive/2008/08/28/10085.aspx</link><pubDate>Thu, 28 Aug 2008 06:44:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10085</guid><dc:creator>gw0506</dc:creator><slash:comments>2</slash:comments><description>作者：&lt;span class="entry-author-name"&gt;joydandan&lt;/span&gt;&lt;span&gt;发表者：Google（谷歌）研究员 吴军 &lt;/span&gt;&lt;br&gt;&lt;br&gt;今天各种汉字输入法已经很成熟了，随便挑出一种主要的输入法比十几年前最好的输入法都要快、要准。现在抛开具体的输入法，从理论上分析一下，输入汉字到底能有多快。&lt;br&gt;&lt;br&gt;我
们假定常用的汉字在二级国标里面，一共有 6700 个作用的汉字。如果不考虑汉字频率的分布，用键盘上的 26
个字母对汉字编码，两个字母的组合只能对 676 个汉字编码，对 6700
个汉字编码需要用三个字母的组合，即编码长度为三。当然，聪明的读者马上发现了我们可以对常见的字用较短的编码对不常见的字用较长的编码，这样平均起来每
个汉字的编码长度可以缩短。我们假定每一个汉字的频率是&lt;br&gt;p1, p2, p3, ..., p6700&lt;br&gt;它们编码的长度是&lt;br&gt;L1, L2, L3, ..., L6700&lt;br&gt;那么，平均编码长度是&lt;br&gt;p1×L1 + p2×L2 + ... + p6700×L6700&lt;br&gt;&lt;br&gt;香
农第一定理指出：这个编码的长度的最小值是汉字的信息熵，也就是说任何输入方面不可能突破信息熵给定的极限。当然，香农第一定理是针对所有编码的，不但是
汉字输入编码的。这里需要指出的是，如果我们将输入法的字库从二级国标扩展到更大的字库
GBK，由于后面不常见的字频率较短，平均编码长度比针对国标的大不了多少。让我们回忆一下汉字的信息熵（见 &lt;a href="http://www.googlechinablog.com/2006/04/4.html" target="_blank"&gt;http://www.googlechinablog.com/2006/04/4.html&lt;/a&gt;），&lt;br&gt;H = -p1 * log p1 - ... - p6700 log p6700。&lt;br&gt;我们如果对每一个字进行统计，而且不考虑上下文相关性，大致可以估算出它的值在十比特以内，当然这取决于用什么语料库来做估计。如果我们假定输入法只能用 26 个字母输入，那么每个字母可以代表 log26=&lt;br&gt;4.7 比特的信息，也就是说，输入一个汉字平均需要敲 10/4.7= 2.1 次键。&lt;br&gt;&lt;br&gt;聪
明的读者也许一经发现，如果我们把汉字组成词，再以词为单位统计信息熵，那么，每个汉字的平均信息熵将会减少。这样，平均输入一个字可以少敲零点几次键
盘。不考虑词的上下文相关性，以词为单位统计，汉字的信息熵大约是8比特作用，也就是说，以词为单位输入一个汉字平均只需要敲 8/4.7=1.7
次键。这就是现在所有输入法都是基于词输入的内在原因。当然，如果我们再考虑上下文的相关性，对汉语建立一个基于词的统计语言模型（见&lt;a href="http://www.googlechinablog.com/2006/04/blog-post.html" target="_blank"&gt;http://www.googlechinablog.com/2006/04/blog-post.html&lt;/a&gt;），我们可以将每个汉字的信息熵降到 6 比特作用，这时，输入一个汉字只要敲 6/4.7=1.3 次键。如果一种输入方法能做到这一点，那么汉字的输入已经比英文快的多了。&lt;br&gt;&lt;br&gt;但
是，事实上没有一种输入方法接近这个效率。这里面主要有两个原因。首先，要接近信息论给的这个极限，就要对汉字的词组根据其词频进行特殊编码。事实上像王
码这类的输入方法就是这么做到，只不过它们第一没有对词组统一编码，第二没有有效的语言模型。这种编码方法理论上讲有效，实际上不实用。原因有两个，第
一，很难学；第二，从认知科学的角度上讲，人一心无二用，人们在没有稿子边想边写的情况下不太可能在回忆每个词复杂的编码的同时又不中断思维。我们过去在
研究语言识别时做过很多用户测试，发现使用各种复杂编码输入法的人在脱稿打字时的速度只有他在看稿打字时的一半到四分之一。因此，虽然每个字平均敲键次数
少，但是打键盘的速度也慢了很多，总的并不快。这也就是为什么基于拼音的简单输入法占统治地位的原因。事实上，汉语全拼的平均长度为
2.98，只要基于拼音的输入法能利用上下文彻底解决一音多字的问题，平均每个汉字输入的敲键次数应该在三次左右，每分钟输入 100
个字完全有可能达到。&lt;br&gt;&lt;br&gt;另外一个不容易达到信息论极限的输入速度的原因在于，这个理论值是根据一个很多的语言模型计算出来的。在产品中，我
们不可能占有用户太多的内存空间，因此各种输入方法提供给用户的是一个压缩的很厉害的语音模型，而有的输入方法为了减小内存占用，根本没有语言模型。拼音
输入法的好坏关键在准确而有效的语言模型。&lt;br&gt;&lt;br&gt;另一方面，由于现有输入方法离信息论给的极限还有很大的差距，汉语输入方法可提升的空间很大，会有越来越好用的输入方法不断涌现。当然，输入速度只是输入法的一项而不是唯一的衡量标准。我们也会努力把谷歌的输入法做的越来越好。&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10085" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/gw0506/archive/tags/_7065665B4B4E8E7F_/default.aspx">数学之美</category></item><item><title>.NET程序员学Java（6）- File Encoding</title><link>http://gcdn.grapecity.com/cs/blogs/williamluo/archive/2008/08/27/net-java-5-file-encoding.aspx</link><pubDate>Wed, 27 Aug 2008 06:12:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10064</guid><dc:creator>WilliamLuo</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;.NET里面的源程序文件可以保存为不同的编码格式，是在Save As对话框中点击Save with Encoding。&lt;/P&gt;
&lt;P&gt;Eclipse里面，保存之前，在Outline窗格中打开文件属性对话框，点选Resource，右边的Text file encoding中就可以选择期望的Encoding。&lt;/P&gt;
&lt;P&gt;Note:&lt;/P&gt;
&lt;P&gt;如果源程序中可能有汉字注释等内容，最好先设置一下默认的Encoding，步骤如下：&lt;/P&gt;
&lt;P&gt;（1）Window - Preferences&lt;/P&gt;
&lt;P&gt;（2）General \ Content Types&lt;/P&gt;
&lt;P&gt;（3）Text \ Java Source File&lt;/P&gt;
&lt;P&gt;（4）Default encoding： 此处输入诸如&amp;nbsp;UTF-16 这样的Encoding格式名称。&lt;/P&gt;
&lt;P&gt;这种做法的一个副作用是：原先用其他Encoding作为Default Encoding保存的源程序文件将不能正常显示，将Default Encoding改回来即可。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10064" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Java/default.aspx">Java</category><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Encoding/default.aspx">Encoding</category><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Eclipse/default.aspx">Eclipse</category></item><item><title>.NET程序员学Java（5）- Add References</title><link>http://gcdn.grapecity.com/cs/blogs/williamluo/archive/2008/08/27/net-java-5-add-references.aspx</link><pubDate>Wed, 27 Aug 2008 06:00:00 GMT</pubDate><guid isPermaLink="false">f8230e64-47be-4013-b411-61c06a58f49b:10063</guid><dc:creator>WilliamLuo</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;跟.NET的Assembly Reference和Project Reference类似，Java Project也可以添加两种参照：&lt;/P&gt;
&lt;P&gt;JAR Reference（可能不是叫这样的名字）和Project Reference。&lt;/P&gt;
&lt;P&gt;步骤：&lt;/P&gt;
&lt;P&gt;（1）打开Project properties对话框。&lt;/P&gt;
&lt;P&gt;（2）点击Java Build Path。&lt;/P&gt;
&lt;P&gt;（3）点击Add External JARs按钮。&lt;/P&gt;
&lt;P&gt;（4）找到\eclipse\plugins下面的JAR文件。&lt;/P&gt;
&lt;P&gt;（5）点击OK按钮。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;步骤（2）中，点击Project Reference的话，就是添加对其他Project的参照。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://gcdn.grapecity.com/cs/aggbug.aspx?PostID=10063" width="1" height="1"&gt;</description><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Java/default.aspx">Java</category><category domain="http://gcdn.grapecity.com/cs/blogs/williamluo/archive/tags/Reference/default.aspx">Reference</category></item></channel></rss>