<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>深蓝色的空间</title>
    <description></description>
    <link>http://ggggqqqqihc.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>彻底进入Linux了</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/201539" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/201539</a>&nbsp;
          发表时间: 2008年06月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Windows上的病毒、流氓软件实在是太多，终于让我无法忍受。上个星期下了狠心，把一些重要数据做了个备份，彻底把Windows从硬盘上请出去了。<br /><br />换操作系统之前做了很多的比较。Linux的发行版本太多，选择一个是感觉挺麻烦的。我开始打算用Gentoo，我感觉Gentoo Linux很适合作为程序开发环境，编译器、函数库在系统安装好后就几乎应有尽有了，因为Gentoo就是基于源代码的发行生皮，从源代码编译生成的整个操作系统。不过后来考虑到自己目前对Linux还不是很熟（Gentoo确实是给Linux专家人士用的），所以最后安装的是Ubuntu Linux。正好手头上有一张从荷兰来的Ubuntu光盘。<br /><br />安装过程很顺利。用Live CD启动，运行安装程序，第一步就是选择语言。我当然是选择简体中文了，这样在安装后会自动把中文字体、输入法什么的配置好。接下来一个关键的步骤的给硬盘分区。我的硬盘是80G的，分了10G给sda1，作为根目录；交换分区为1G，正好是我的内存的两倍；剩下的全给了/home。安装完以后似乎感觉根目录分小了一些，不过估计也足够用了，我并不需要安装太多的软件。<br /><br />我安装的是7.10版，安装完后提醒我升级到8.04版。要联网下载600多MB的软件包，所以暂时还不打算升级。<br /><br />Ubuntu用的是Debian的软件包管理方式，安装软件很方便。只要sudo apt-get install [软件包名]就行了。Ubuntu果然是一个使用方便，很人性化的Linux发行版。<br /><br />接下来要做的就是配置好PHP和Java的开发环境，再寻找一个好用的编辑器和IDE。虽然说Linux下有Vim和Emacs，不过我觉得很不容易上手。希望能找到一个类似于UltraEdit或者是Notepad++一类的编辑器。
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/201539#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Jun 2008 18:57:45 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/201539</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/201539</guid>
      </item>
      <item>
        <title>想不到这段代码居然是错的</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/173919" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/173919</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
public class Test{
        private static long i=1;
        public static void main(String[] args){
                switch (i){
                        case 1:
                                System.out.println("1");
                                break;
                }
        }
}
</pre><br /><br />居然无法通过编译，理由是switch后面需要的是int类型的数据，变量i为long，所以编译通不过。<br /><br />这个问题是前天在书店里的一本面试题集里看到的，说实在的，里面的一些题目我很不喜欢。
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/173919#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Mar 2008 22:50:57 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/173919</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/173919</guid>
      </item>
      <item>
        <title>Online Judge测试部分的代码</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/169345" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/169345</a>&nbsp;
          发表时间: 2008年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Online Judge是一个根据程序的输入输出测试程序正确性的Web程序，一般用于ACM/ICPC的训练。这是我做的测试部分的源代码，主要是限定程序的运行时间和占用的空间，以及程序的输入输出重定向。限时做得很粗糙，仅仅使用了WaitForSingleObject，不能得到真正的CPU时间。<br /><br />用法：test &lt;progname> &lt;input> &lt;output> &lt;time> &lt;memory><br />&lt;progname> 要测试的程序名<br />&lt;input> 输入数据<br />&lt;output> 程序输出<br />&lt;time> 时间限制（单位：ms）<br />&lt;memory> 存储空间限制（单位：KB）<br />返回值：正确结束返回0；超时——1，超出存储限制——2。<br /><pre name="code" class="c">
#include &lt;windows.h>
#include &lt;psapi.h>
#include &lt;stdio.h>
#include &lt;string.h>
#include &lt;stdlib.h>
int main(int argc, char **argv){
	char *app_name=argv[1];
	char *input_file=argv[2];
	char *output_file=argv[3];
	char *time_str=argv[4];
	char *mem_str=argv[5];
	int time_limit=atoi(time_str);
	DWORD mem_limit=atoi(mem_str);
	mem_limit&lt;&lt;=10;
	
	SECURITY_ATTRIBUTES sa;
	sa.nLength=sizeof(SECURITY_ATTRIBUTES);
	sa.lpSecurityDescriptor=NULL;
	sa.bInheritHandle=TRUE;
	
	HANDLE hInput=CreateFile(input_file,GENERIC_READ,0,&sa,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);
	HANDLE hOutput=CreateFile(output_file,GENERIC_WRITE,0,&sa,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);
	
	STARTUPINFO si={sizeof(si)};
	GetStartupInfo(&si);
	
	si.dwFlags=STARTF_USESTDHANDLES;
	si.hStdInput=hInput;
	si.hStdOutput=hOutput;
	
	PROCESS_INFORMATION pi;
	ZeroMemory(&pi,sizeof(pi));
	char *szCommandLine;
	szCommandLine=(char *)calloc(sizeof(char),(strlen(app_name)+1));
	strcpy(szCommandLine,app_name);
	
	CreateProcess(NULL,szCommandLine,NULL,NULL,TRUE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi);
	DWORD status=WaitForSingleObject(pi.hProcess,time_limit);
	PROCESS_MEMORY_COUNTERS memInfo;
	GetProcessMemoryInfo(pi.hProcess,&memInfo,sizeof(memInfo));
	int ret;
	if (status!=WAIT_OBJECT_0){
		ret=1;
		TerminateProcess(pi.hProcess,0);
	}else{
		if (memInfo.PeakWorkingSetSize>mem_limit){
			ret=2;
		}else{
			ret=0;
		}
	}
	CloseHandle(pi.hThread);
	CloseHandle(pi.hProcess);
	CloseHandle(hInput);
	CloseHandle(hOutput);
	return ret;
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/169345#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 08 Mar 2008 14:08:43 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/169345</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/169345</guid>
      </item>
      <item>
        <title>GCC不能正确继承模板类</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/166542" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/166542</a>&nbsp;
          发表时间: 2008年03月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          GCC编译器似乎不能理解继承自模板类里的数据成员。我还以为是代码的问题，郁闷了半天后，居然在Borland C++ 5.5下编译通过了。节省篇幅，我抽出主要部分。<br /><pre name="code" class="c++">
template&lt;class T>
class A{
	protected:
		T id;
};
template&lt;class T>
class B: public A&lt;T>{
	public:
		void setid(T i){
			id=i;
		}
		void test1(){
			cout&lt;&lt;"B::test1() ID: "&lt;&lt;id&lt;&lt;endl;
		}
};
</pre><br />B类的id本应该是从A类里继承来的，但用GCC编译会提示说变量id未定义。试着用Borland的编译器就很痛快地过了。我使用的是MinGW的GCC 3.4，但我在Unix-Center的机器上使用Unix和Linux版本的GCC 4.0编译仍然通不过，但Solaris上的Sun Studio的C++编译器则没问题。<br />难道就这么幸运地碰上GCC的Bug了？
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/166542#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 01 Mar 2008 20:25:28 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/166542</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/166542</guid>
      </item>
      <item>
        <title>Scheme的Lambda与Ruby的Block</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162955" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162955</a>&nbsp;
          发表时间: 2008年02月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          SICP中有一个简单而经典的例子：构造一个通用的求和函数<br /><img src="http://www.forkosh.dreamhost.com/mathtex.cgi?\sum_{x=m}^{n}f(x)" /><br />这里的m, n和函数f都不是预先定好的。在Scheme语言中，利用<br /><img src="http://www.forkosh.dreamhost.com/mathtex.cgi?\sum_{x=m}^{n}f(x)=f(m)+\sum_{x=m+1}^{n}f(x)" /><br />可以定义出一个这样的sum函数：<br /><pre name="code" class="scheme">
(define (sum m n func)
  (if (> m n)
      0
      (+ (func m)(sum (+ m 1) n func))))
</pre><br />要计算1+2+...+100，先定义一个函数(define (f x)(x))，然后代入到sum中：(sum 1 100 f)。当然如果每换一个通项公式都要定义一个函数的话，程序中就会充斥着大量一次性的小函数。采用Scheme的“匿名函数”（在Scheme中称为Lambda函数）可以解决这个问题。对于1+2+...+100，只要写出(sum 1 100 (lambda (x) x))即可。<br />同样的，如果计算<br /><img src="http://www.forkosh.dreamhost.com/mathtex.cgi?\sum_{x=1}^{100}\frac{1}{x}" /><br />只需(sum 1 100 (lambda (x)(/ 1 x)))。<br />说到Ruby，起初感觉Block和Lambda函数有些相似的地方，但又不能完全对应。一个简单的例子：<br /><pre name="code" class="ruby">
def threeTimes
  yield
  yield
  yield
end
threeTimes { puts "Hello" }
</pre><br />将显示三个“Hello”。代码中定义了一个名字为threeTimes的函数。在执行threeTimes这个Block时，会找到与它同名的函数threeTimes，并将函数中的yield替换成Block中的代码。这很像在Scheme语言中的替换机制。这些都不算什么，真正有趣的是带参数的yield。<br />如果用Ruby写那个通用的求和函数，我想可以这样写：<br /><pre name="code" class="ruby">
def sum(m,n)
	s=0
	for i in m..n
		s+=yield(i)
	end
	return s
end
</pre><br />在这段代码中，yield扮演了那个通项函数。接下来的关键是用什么样的Block去“替换”yield。<br /><pre name="code" class="ruby">
puts sum(1,100){|x|x} # 1+2+...+100
puts sum(1,10){|n|n*n} # 1^2+2^2+...+10^2
puts sum(1,100){|n|1/n} # 1/1+1/2+...+1/100
</pre><br />这些Block实际上扮演了“匿名函数”的角色，和Scheme的Lambda函数是极其相似的。对比一下Scheme的写法：<br /><pre name="code" class="scheme">
(sum 1 100 (lambda (x)(x)))
(sum 1 10 (lambda (n)(* n n)))
(sum 1 100 (lambda (n)(/ 1 n)))
</pre><br />个人感觉，Ruby的Block没有Scheme的Lambda函数灵活。在Scheme中，可以很容易将多个Lambda匿名函数传递给另一个函数，在Ruby中又如何做到呢？
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162955#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 18 Feb 2008 13:22:57 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162955</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162955</guid>
      </item>
      <item>
        <title>用Ruby把那个O(1)栈做了一下</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162874" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162874</a>&nbsp;
          发表时间: 2008年02月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>刚才没什么事，决定试试用新学的Ruby把那个<a href="../../blog/162681">O(1)栈的问题</a>做了一下。写着是挺快，一口气就下来了，只是代码里带着明显的C++气味。唉，习惯不是一两天就能改的。</p><p>代码和C++的差不多长。主要还是不习惯Ruby的思维，再加上那个C++代码中用了很多STL的东西，已经相当精简了。</p><pre name="code" class="ruby">class Stack
	class Pair
		def initialize(first, second)
			@first=first
			@second=second
		end
		attr_reader :first, :second
	end
	def initialize
		@stack=Array.new
		@minimum=nil
	end
	def push(e)
		if @stack.empty? then
			@minimum=e
		end
		@stack.push(Pair.new(e,@minimum))
		if e&lt;@minimum then
			@minimum=e
		end
		return self
	end
	def pop
		node=@stack.pop
		@minimum=node.second
		if @stack.empty? then
			@minimum=nil
		end
		return self
	end
	def min
		return @minimum
	end
end</pre><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162874#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 17 Feb 2008 23:48:32 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162874</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162874</guid>
      </item>
      <item>
        <title>想做一个类似于白板的软件</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162871" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162871</a>&nbsp;
          发表时间: 2008年02月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我经常在网上用IM软件和别人讨论问题，有时非常需要用图形来交流。我不知道有没有一种类似于白板的软件，我在这边画图，他那边就能看到，而且我们能一起修改这个图形，就像是两个人在用一块白板一样。至少我是没找到合适的。<br />要是找不到的话只好自己做了。能做出能和GTalk互通的软件最好。查资料得知GTalk是采用的XMPP协议，Java有个程序库叫Smackr的实现了对XMPP的封装，估计有用。关键是图形数据的传输，大家觉得最好用什么方法？我感觉用SVG格式可能会比较简单，这样就都是使用XML了，而且Java里也有现成的SVG类库，batik。<br />在Java图形编程这一块本人知之甚少，主要应该考虑哪些问题？虽然可能有很多东西还不懂，但我估计能很快学会的。边做边学吧。欢迎大家给点提示，谢谢。
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162871#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 17 Feb 2008 23:03:49 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162871</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162871</guid>
      </item>
      <item>
        <title>Google面试题（六）之解答</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162681" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162681</a>&nbsp;
          发表时间: 2008年02月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">题目：对现在的Stack（栈）数据结构进行改进，加一个min()功能，使之能在常数，即O(1)，时间内给出栈中的最小值。可对push()和pop()函数进行修改，但要求其时间复杂度都只能是O(1)。</div> <br />题目是在<a href="http://akalius.javaeye.com/blog/162156" target="_blank">http://akalius.javaeye.com/blog/162156</a>看到的，提供了两种方法。不幸的是第一种方法是错误的，第二种方法也不完全正确。都没有考虑到连续压入、弹出和有相同元素的情况。我用的方法是基于第一种的，即在push操作前先将要压入的数值和当前栈中的最小值“打包”成一个结点再压入，如果栈为空，则和自身一起打包。这样在弹出一个元素后，栈中的最小元素可直接由弹出的结点获得。<br />其实这个算法写起来很简单，我顺便复习了一下C++的模板方面的东西。C++平时用得不多，模板这玩意儿更不常用，以至于发现手生多了。<br /><pre name="code" class="c++">
#include &lt;vector>
#include &lt;utility>
using namespace std;

template&lt;class T>
class Stack{
	vector&lt;pair&lt;T,T> > stack;
	T minimum;
public:
	vector&lt;pair&lt;T,T> >& push(T e);
	vector&lt;pair&lt;T,T> >& pop();
	T min();
};
template&lt;class T>
vector&lt;pair&lt;T,T> >& Stack&lt;T>::push(T e){
	if (stack.empty()){
		minimum=e;
	}
	pair&lt;T,T> node(e,minimum);
	stack.push_back(node);
	if (e&lt;minimum){
		minimum=e;
	}
}
template&lt;class T>
vector&lt;pair&lt;T,T> >& Stack&lt;T>::pop(){
	pair&lt;T,T> node=stack.back();
	minimum=node.second;
	stack.pop_back();
}
template&lt;class T>
T Stack&lt;T>::min(){
	return minimum;
}
</pre><br />手生多了，这么点儿东西写了有20分钟。我测试了几组数据，应该没什么问题。<br /><br />补充：为了练习Ruby，又写了一个Ruby版的，在<a href="http://ggggqqqqihc.javaeye.com/blog/162874" target="_blank">http://ggggqqqqihc.javaeye.com/blog/162874</a>。
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162681#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Feb 2008 21:07:32 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162681</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162681</guid>
      </item>
      <item>
        <title>三门问题</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162652" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162652</a>&nbsp;
          发表时间: 2008年02月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>三门问题又叫蒙提霍尔问题。说的是在一个电视游戏中，参赛者面对三扇一模一样的关闭着的门，其中一扇门后面是汽车，另外两扇后面是山羊。参赛者选择了一扇门，但并没有打开；这时主持人开启了另外一扇门，后面是山羊。主持人问参赛者要不要换另外一扇关着的门。问题是：换另一扇门是否会增加参赛者赢得汽车的概率？<br /><strong>注解（引自Wikipedia）：</strong></p><blockquote><p>Mueser和Granberg透过在主持人的行为身上加上明确的限制条件，提出了对这个问题的一种不含糊的陈述：</p><ul><li>参赛者在三扇门中挑选一扇。他并不知道内里有甚么。</li><li>主持人知道每扇门后面有什么。</li><li>主持人必须开启剩下的其中一扇门，并且必须提供换门的机会。</li><li>主持人永远都会挑一扇有山羊的门。 <ul><li>如果参赛者挑了一扇有山羊的门，主持人必须挑另一扇有山羊的门。</li><li>如果参赛者挑了一扇有汽车的门，主持人随机在另外两扇门中挑一扇有山羊的门。</li></ul></li><li>参赛者会被问是否保持他的原来选择，还是转而选择剩下的那一道门。 </li></ul></blockquote>大多数人都会认为不会增加赢的概率，理由是在剩下的两扇门后，肯定是一只山羊一辆汽车，无论选择哪个赢得汽车的概率都是1/2。<br />事实上这个答案是错的，正确结果是选择另一扇门会使记得汽车的概率增大一倍，尽管这十分违反直觉。<br />以下的解答引自Wikipedia：<br /><blockquote><p>问题的答案是可以：当参赛者转向另一扇门而不是继续维持原先的选择时，赢得汽车的机会将会加倍。</p><p>有三种可能的情况，全部都有相等的可能性(1/3)：</p><ul><li>参赛者挑山羊一号，主持人挑山羊二号。转换将赢得汽车。</li><li>参赛者挑山羊二号，主持人挑山羊一号。转换将赢得汽车。</li><li>参赛者挑汽车，主持人挑两头山羊的任何一头。转换将失败。</li></ul><p>在头两种情况，参赛者可以透过转换选择而赢得汽车。第三种情况是唯一一种参赛者透过保持原来选择而赢的情况。因为三种情况中有两种是透过转换选择而赢的，所以透过转换选择而赢的概率是2/3。</p><p>如果没有最初选择，或者如果主持人随便打开一扇门，又或者如果主持人只会在参赛者作出某些选择时才会问是否转换选择的话，问题都将会变得不一样。例如，如果主持人先从两只山羊中剔除其中一只，然后才叫参赛者作出选择的话，选中的机会将会是1/2。</p><p>另
一种解答是假设你永远都会转换选择，这时赢的唯一可能性就是选一扇没有车的门，因为主持人其后必定会开启另外一扇有山羊的门，消除了转换选择后选到另外一
只羊的可能性。因为门的总数是三扇，有山羊的门的总数是两扇，所以转换选择而赢得汽车的概率是2/3，与初次选择时选中有山羊的门的概率一样。 </p></blockquote>
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162652#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Feb 2008 16:43:36 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162652</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162652</guid>
      </item>
      <item>
        <title>几个免费的Scheme（Lisp）解释器</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162643" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162643</a>&nbsp;
          发表时间: 2008年02月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Lisp是一个古老的函数式编程语言，Scheme则起源于MIT的一种Lisp方言。当前编程语言的一些特性，如尾递归、匿名函数、动态改变代码的功能等等，不少是受到了Lisp的启发。这里介绍几个能在Windows下使用的免费Scheme语言或Lisp语言的环境。<br /><a href="http://www.plt-scheme.org/software/drscheme/" target="_blank">DrScheme</a>。这个是我一直在用的Scheme解释器，界面设计得既漂亮又方便。调试、括号匹配功能我也相当喜欢。而且带有大量的文档资料，如果英文够好，基本上就可以学会Scheme了。</p><p><img src="http://www.plt-scheme.org/screenshots/languages.jpg" height="600" align="middle" alt="" width="800" /><a href="http://www.gnu.org/software/mit-scheme/" target="_blank">MIT-Scheme</a>。这个是MIT为SICP（计算机程序的构造与解释）课程开发的Scheme环境。SICP是一本相当有名的教材，对计算原理讲得非常深入。书中采用Scheme作为编程语言。MIT-Scheme基本上就是一个精简的Emacs编辑器加上Scheme语言解释器，所以对Emacs不熟悉的人用起来比较困难。</p><p><a href="http://clisp.cons.org/" target="_blank">GNU CLisp</a>。这是一个Common Lisp的解释器，不带IDE。Common Lisp也是Lisp语系的一大方言，很多人认为Common Lisp才是Lisp的&ldquo;正统&rdquo;。</p><p><a href="http://common-lisp.net/project/lispbox/" target="_blank">Lisp in a Box</a>。实际上是将Emacs编辑器和Common Lisp的解释器SLIME集成在一起，构成了一个IDE，省去了手工配置Emacs的麻烦。和MIT-Scheme一样，建议先熟悉Emacs。</p><p>关于Scheme，g9大牛写过一篇极好的介绍：<a href="http://blog.csdn.net/g9yuayon/archive/2007/07/03/1676688.aspx" target="_blank">与Scheme共舞</a>，极力推荐阅读。</p>
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162643#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Feb 2008 15:00:57 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162643</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162643</guid>
      </item>
      <item>
        <title>知道什么是采集了，我恨采集</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162567" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162567</a>&nbsp;
          发表时间: 2008年02月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看了一些关于建网站的论坛，里面常常见到“采集”这个词，今天终于明白了。郁闷……<br />所谓的“采集”原来就是在自己的服务器上运行一个类似于搜索引挚爬虫的程序，设置好关键字，放出去让它在网上爬，把找到的内容统统下载到自己的服务器上，再发布到自己的网站。说白了这不和抄袭一样吗？说抄袭还轻了，手工复制粘贴虽然也常常侵权，但起码还算有所劳动。采集是自动化作业，几个小时就能抄下几十万的文章。<br />刚才在写一段C++程序时，忘了有关于Deque容器的一点东西，于是在Google里用“C++ deque”在中文网页里找。大家有兴趣可以试试，看看有多少个“深入研究C++中的STL Deque 容器”，或者干脆就用“深入研究C++中的STL Deque 容器”作关键字搜，这样效果更明显一些。这么多一样的东西，估计全是托“采集”的福。<br />中国在版权保护方面薄弱呀，这要是在某些国家可是要构成犯罪的。前些天在CSDN上听说一个留学美国的中国学生因贩卖盗版软件而被抓起来了。据说在美国做网站的，只要在你的网页里出现了未经授权的内容，并且有人举报，你就要因此付出代价，大家不是听说过Youtube惹来的官司吗？人家管得严呀。怪不得当我搜索英文资料时，很少会发现重复的内容，原来是人家管得严呀。<br />反观中文网页，一篇文章到处出现，到处被采集。看似内容挺多，其实全是冗余，信息量很少，可供压缩的余地很大，浪费了存储资源，浪费了CPU运算资源（采集软件要长时间运行），最可恨的是，浪费了用户的时间（大量被采集的东西很可能不是用户想找的，他只能慢慢地在大量相同的东西之间找到那些不同的）。<br />为什么采集这么流行？因为很多人想快速地建一个网站，获取很多的流量，在上面放很多的广告，赚很多的钱。于是有了很多的“垃圾站”，很多的Google Adsense账号被停用。有人抱怨Google Adsense规定得太严，对作弊打击得太狠。我看是太轻了。Adsense规定不得在网站中放置未经授权的内容，如果Google真的在这点上较真儿，不知道有多少站长能幸免于难。<br />当然不能否认的是，采集也有它的好处。当你的服务器数据丢失时，你可以通过搜索引挚做“数据恢复”，只要你的网站上的东西被采集过。<br />一个有意思的现象是，有绞尽脑汁采集的，也有想方设法防采集的，而且这两种人大多是某个网站的管理者。这纯粹成了技术上的较量了。<br />网站盈利非但无可厚非，还是一种值得鼓励的行为。但既想赚钱又不想劳动创造价值的人就可耻了。个人网站或者Blog如果保证所有的东西都是合法的，那么利用广告赚钱是几乎不可能的。我当初弄了个Adsense只是因为对它的关键字匹配感兴趣，放在页面上当图片用，自动更换。玩玩而已，现在一年多过去了，账上也才$1多一点。<br />所以，总而言之，做人要厚道。
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162567#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Feb 2008 23:27:46 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162567</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162567</guid>
      </item>
      <item>
        <title>Ruby的面向对象特性</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162542" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162542</a>&nbsp;
          发表时间: 2008年02月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Ruby声称自己是完全面向对象的语言，不像Java那样；当年Java也声称自己是完全面向对象的……总之，这样标榜自己显得不厚道。但Ruby在面向对象方面的确更加彻底，例如像1924这样的字面量都被认为是对象。<br />Ruby声称遵循“最小惊讶原则”，但实事上还是给我带来了不少的惊讶。在Ruby中，类（Class）的用法是相当灵活的。一个类的定义甚至是可以在程序运行时改变的，比如已经定义好一个MyClass类：<br /><pre name="code" class="ruby">
class MyClass
  # code...
end
</pre><br />如果事后需要在MyClass中添加一个方法，那么不必直接修改类的定义部分，只要在需要的地方写出来即可：<br /><pre name="code" class="ruby">
class MyClass
  def newMethod
    # code...
  end
end
</pre><br />于是类MyClass就有了新的方法。<br />在类的继承方面，Ruby和Java比较相似，同是单继承的。Ruby在封装上似乎比Java更严，默认的实例变量在外面是不能被直接访问的，要访问就必须实现相应的方法，且方法名和变量名相同。<br /><pre name="code" class="ruby">
class MyClass
	def initialize(name,value)
		@name=name
		@value=value
	end
	def name
		@name
	end
	def value
		@value
	end
end
</pre><br />Ruby提供了另一种方便的写法。上面的代码等同于：<br /><pre name="code" class="ruby">
class MyClass
	def initialize(name,value)
		@name=name
		@value=value
	end
	attr_reader :name, :value
end
</pre><br />类似地可以定义set（更改器）方法。<br /><pre name="code" class="ruby">
class MyClass
	def value=(newValue)
		@value=newValue
	end
end
</pre><br />这样，@value的值可以通过表达式的形式obj.value=new_value来改变。当然也存在方便的等价写法：<br /><pre name="code" class="ruby">
class MyClass
	attr_writer :value
end
</pre><br />至于访问权限相关的关键字public, private, protected的意义和Java相同，也就没什么可说的了。<br />一个重要的话题是Ruby中的变量名实际上是对象的引用，这点也和Java相同。下面的代码可以验证这一点<br /><pre name="code" class="ruby">
c1=MyClass.new('c1',1)
c2=c1
puts c1.to_s
puts c2.to_s
c1.value=2
puts c2.to_s
</pre><br />c2=c1的作用只是相当于给c1引用的对象起了一个别名。要避免这种情况，可以使用dup方法。<br /><pre name="code" class="ruby">
c1=MyClass.new('c1',1)
c2=c1.dup
puts c1.to_s
puts c2.to_s
c1.value=2
puts c2.to_s
</pre><br />dup的特性值得仔细想一下。在类MyClass里有两个变量@name和@value，它们分别引用了两个对象。第一行执行后，c1引用了一个MyClass的实例；接下来，通过dup方法，c2引用了一个c1对象的副本，但实际上不仅c1中的所有成员都被复制了一份，而且连成员所引用的对象也被复制了一份，只有这样，才能看到c2的value值仍为1的结果。也就是说，Ruby的dup方法实现的是深拷贝。<br /><br />以上只是我本人对Ruby的学习总结，如有错误，欢迎指出。
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162542#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Feb 2008 18:15:56 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162542</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162542</guid>
      </item>
      <item>
        <title>开始鼓捣Ruby</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162368" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162368</a>&nbsp;
          发表时间: 2008年02月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>观望Ruby也有几个月了吧，几个小时前我终于按捺不住，把Ruby安上了。里面带了个fxri，一个集成了Ruby解释器和文档的交互环境，感觉挺不错的。可以随时查阅文档，对于初学来说是个很好的设计。安装包还捆绑了SciTE编辑器，这个编辑器可是牛得很啊。很多人认为功能最强的编辑器是Emacs，但Emacs相当难用，而SciTE则把可定制性和易用性二者融合得很好。SciTE用好了是相当方便的，至于如何高效地使用SciTE，估计能写一本书了。</p><p>最让人兴奋的是Ruby带的帮助文档居然是Programming Ruby的CHM电子版。一口气把Ruby.new一章看完了，对Ruby也有了初步的认识。因为以前写过一些PHP代码，Ruby又和PHP一样在Web领域里竞争，所以一边看一边和PHP对比起来。本来我觉得PHP的代码也可以写得很简单，但和Ruby相比可真是无地自容啊。Ruby的写法更自由，比如可以把条件语句放在后面。当然这些我认为不过是语法糖而已，意义不大。让我眼前一亮的是Ruby的变量命名规则。小写字母和下划线开头的是局部变量，$开头的是全局变量，@开头的是实例变量，@@开头的是类变量，而类名、模块名和常量则以大写字母开头。通过限定命名规则，一来是增加了代码的可读性，二来减少了关键字，我认为更大的好处是使自动重构更加容易进行了。而PHP在这方面做得就差多了。PHP在变量的作用域方面比较让人迷惑，什么global，引用参数之类的，有时理解不透的话写出来的代码很容易出错，而错误还很难看出来。而Ruby，一看名字就知道它的作用域，是什么东西。</p><p>Ruby的Block比较令人困惑。感觉有些像Scheme里的Lambda函数的形式，但又不能完全对应上，似乎没有Lambda函数强大。目前还没有弄明白，估计以后多看看代码，多写写应该就能慢慢熟悉了。</p><p>在面向对象方面，Ruby似乎有些过火了。连循环结构都用面向对象的方式实现。比如遍历数组</p><pre name="code" class="ruby">[1,3,'hello'].each do |elem|
  puts elem
end</pre><p>C语言里的for(i=m;i&lt;=n;i++){...}在Ruby里竟然成了m.upto(n){|i|...}，代码是少了不少，可总觉得看不习惯。</p><p>Ruby的这些丰富的特性倒不是什么障碍，反而让我觉得它更加有趣了。以后一定要多多了解Ruby，起码要达到使用Ruby开发的效率要比我用PHP高才行。 </p>
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162368#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Feb 2008 02:33:36 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162368</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162368</guid>
      </item>
      <item>
        <title>匪夷所思的编程语言——Whitespace</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162291" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162291</a>&nbsp;
          发表时间: 2008年02月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如果说Brainf-u-c-k语言只是难用的话，这个Whitespace可就很令人匪夷所思了。Whitespace只认三个空白字符：空格、Tab和换行，其他一切字符都当作注释来处理。以下翻译自Wikipedia。<br /><div class="quote_title">引用</div><div class="quote_div">Whitespace是由Durham大学的Wdwin Brady和Chris Morris发明的，于2003年4月1日发布（和愚人节有关？）。和大多数语言通常忽略空白字符不同，Whitespace解释器忽略一切非空白字符。空格、Tab和换行是仅有的语法元素。这就带来了一个有趣的事实：一个Whitespace程序可以完美地嵌入进一个文章之中。<br />Whitespace是一种命令式堆栈型语言，程序运行在一个有一个栈（Stack）和一个堆（Heap）的虚拟机之上。编程者可以将任意大小的整数压入栈中（目前还没有实现对浮点数的操作）。堆常用作存储变量和数据结构的固定存储空间，用户可以直接访问。<br />Whitespace被戏称为&ldquo;写秘密程序的语言&rdquo;，因为重要的代码即使打印在纸上也无法被发现。<br />Whitespace已经被证明是图灵完备的。证明可以在主页的邮件列表中找到，其晦涩程度之大，目前还没有人对证明作出评论。下面是Hello World程序（红色表示空格，绿色表示Tab）：<br /><pre><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">				</span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">     </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">			</span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">			</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">			</span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">				</span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">			</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">			</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">		</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">				</span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">     </span>
empty-line
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
empty-line
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">			</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
empty-line
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">     </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
<span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span>
empty-line
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">  </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span>
empty-line
<span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">   </span><span style="background: #ccffcc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">	</span><span style="background: #ffcccc none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
empty-line
empty-line/EOF</pre>&nbsp;</div> <br />当然，和Brainf-u-c-k一样，这种语言没什么实际用途，我估计也只能用来教授一下计算理论而已。<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162291#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Feb 2008 17:40:48 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162291</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162291</guid>
      </item>
      <item>
        <title>“说是就是”的数学证明</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162133" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162133</a>&nbsp;
          发表时间: 2008年02月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          证明存在这样的无理数a,b，使得<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?a^b" />为有理数。<br />几年前在一本书上看到过一个证明，印象特别深刻。<br />众所周知，<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?\sqrt{2}" />是无理数。如果<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?\sqrt{2}^{\sqrt{2}}" />是有理数，则令<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?a=\sqrt{2},b=\sqrt{2}" />，于是命题得证；如果<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?\sqrt{2}^{\sqrt{2}}" />不是有理数，则令<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?a=\sqrt{2}^{\sqrt{2}},b=\sqrt{2}" />，于是<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?a^b=(\sqrt{2}^{\sqrt{2}})^{\sqrt{2}}=\sqrt{2}^{2}=2" />，2是有理数，命题得证。<br />评注：说是就是，不是也是。
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162133#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Feb 2008 22:10:39 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162133</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162133</guid>
      </item>
      <item>
        <title>最难的编程语言</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/162122" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/162122</a>&nbsp;
          发表时间: 2008年02月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我说的这种语言相当难，比机器语言都要难。Brainf-u-c-k，名字有点恶心……恶心到连JavaEye都逼着我在中间加上了连字符……<br />我刚才仅仅用它写了个"Hello World"，已经有些恶心了。<br />Brainf-u-c-k构造了一台假想的图灵机：一个长长的纸带（连续存储空间）和一个可以在上面移动的读写头(指针)。Brainf-u-c-k的代码仅仅由八种字符组成。<br /><ul><li>>: 将指针移到下一个单元；</li><li>&lt;: 将指针移到上一个单元；</li><li>+: 当前单元的值自增一；</li><li>-: 当前单元的值自减一；</li><li>,: 输入一个字节,存入当前单元；</li><li>.: 输出当前单元的内容；</li><li>[: 如果当前单元的内容为0,则跳转到与之匹配的]处执行；</li><li>]: 如果当前单元的内容不为0,则跳转到与匹配的[处执行。</li></ul><br />初始时，指针指向0位置，所有的存储单元的内容为0。<a href="http://www.muppetlabs.com/~breadbox/bf/" target="_blank">http://www.muppetlabs.com/~breadbox/bf/</a>是一份语言的说明，还可以得到解释器的源代码<a href="http://esoteric.sange.fi/brainfuck/impl/interp/" target="_blank">http://esoteric.sange.fi/brainfuck/impl/interp/</a>。<br />即使是用二进制写程序，起码CPU还有上百条指令，肯定比BF的八个指令容易多了。
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/162122#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Feb 2008 21:17:06 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/162122</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/162122</guid>
      </item>
      <item>
        <title>在网页中插入数学公式的办法</title>
        <author>ggggqqqqihc</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ggggqqqqihc.javaeye.com">ggggqqqqihc</a>&nbsp;
          链接：<a href="http://ggggqqqqihc.javaeye.com/blog/161957" style="color:red;">http://ggggqqqqihc.javaeye.com/blog/161957</a>&nbsp;
          发表时间: 2008年02月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>效果：<br /><img src="http://www.forkosh.dreamhost.com/mathtex.cgi?x_{1,2}=\frac{-b\pm\sqrt{b^2-4ac}}{2a}" alt="" /><br />上面的公式是在BBCode下用[img]http://www.forkosh.dreamhost.com/mathtex.cgi?x_{1,2}=\frac{-b\pm\sqrt{b^2-4ac}}{2a}[/img]插入的。实际上就是一个图片，只不过这个图片是在forkosh的服务器上动态生成的。&ldquo;?&rdquo;后的内容是用LaTeX文本描述的数学公式。LaTeX是一个排版工具，特别擅长排版含有很多数学公式的文章。<a href="http://bbs.ctex.org" target="_blank">CTeX论坛</a>是国内最大的LaTeX交流地。</p><p>说着说着到了LaTeX，有点跑题。能看到公式的根本原因在于forkosh提供了公共的mathTeX服务。forkosh还提供了另一个程序，叫mimeTeX，地址是http://www.forkosh.dreamhost.com/mimetex.cgi，用法和上面的一样，只需把LaTeX文本加在&ldquo;?&rdquo;后就行了。</p><p>我试了一下，这两个程序生成的图片不太一样。比如用mimeTeX生成上面的求根公式：</p><p><img src="http://www.forkosh.dreamhost.com/mimetex.cgi?x_{1,2}=\frac{-b\pm\sqrt{b^2-4ac}}{2a}" alt="" /></p><p>我觉得还是用mathTeX的效果要好。</p><p>因为forkosh的厚道，这样我们就可以在MathML没有普及开来的时候在网页上使用数学语言来交流了。</p><p>完整的mathTeX和mimeTeX的说明在forkosh.com上：<a href="http://www.forkosh.com/mathtex.html" target="_blank">mathTeX</a>，<a href="http://www.forkosh.com/mimetex.html">mimeTeX</a>。</p>
          <br/>
          <span style="color:red;">
            <a href="http://ggggqqqqihc.javaeye.com/blog/161957#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 12 Feb 2008 17:44:14 +0800</pubDate>
        <link>http://ggggqqqqihc.javaeye.com/blog/161957</link>
        <guid>http://ggggqqqqihc.javaeye.com/blog/161957</guid>
      </item>
  </channel>
</rss>