• 最近在看一本叫《开发自己的搜索引擎》的书,会不断写一下看这本书的心得。

    这本书是基于Lucene2.0与Heritrix来描述的,可惜我的书中没有光盘,因此需要上网找上面提到的Lucene。

    Luncene可以在下面地址下载:http://labs.xiaonei.com/apache-mirror/lucene/java/

    截止到今天,Lucene的版本是2.9.0,那么如果你不需要源代码,只需要下载lucene-2.9.0.zip即可。

    另外,书中还提到一个中文分词包:je-analysis,这个可以在CSDN网站上面下载,不需要积分(但是需要注册),如果需要可以发邮件和我要。zlk0825@gmail.com

    简单介绍一下,Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用 程式接口,能够做全文索引和搜寻,在Java开发环境里Lucene是一个成熟的免费开放源代码工具;就其本身而论,Lucene是现在并且是这几年,最 受欢迎的免费java资讯检索程式库。人们经常提到资讯检索程式库,就像是搜寻引擎,但是不应该将资讯检索程式库与网搜索引擎相混淆。

    Lucene最初是由Doug Cutting所撰写的,他是一位资深的全文索引及检索专家,曾经是V-Twin搜索引擎的主要开发者,后来在Excite担任高级系统架构设计师,目前 从事于一些INTERNET底层架构的研究。他贡献出Lucene的目标是为各种中小型应用程式加入全文检索功能。(出自

  • 下午在读《C#高级编程(第6版)》时,第28章P837有一个例子,代码如下:
            static void t4()
            {
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.Schemas.Add(null, "books.xsd");
                settings.XsdValidate = true;
            }

    但是在输入完settings之后,无论如何都找不到XsdValidate属性,即使查MSDN也没有。后来看MSDN中的例子,最终结论如下:

    《C#高级编程(第6版)》例子错误,XmlReaderSettings 无XsdValidate 属性。这一句代码可以用settings.ValidationType = ValidationType.Schema;来替换。完整代码如下(取自MSDN):

    using System;
    using System.Xml;
    using System.Xml.Schema;
    using System.IO;

    public class Sample {

      public static void Main() {

        // Create the XmlSchemaSet class.
        XmlSchemaSet sc = new XmlSchemaSet();

        // Add the schema to the collection.
        sc.Add("urn:bookstore-schema", "books.xsd");

        // Set the validation settings.
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.Schema;
        settings.Schemas = sc;
        settings.ValidationEventHandler += new ValidationEventHandler (ValidationCallBack);

        // Create the XmlReader object.
        XmlReader reader = XmlReader.Create("booksSchemaFail.xml", settings);

        // Parse the file.
        while (reader.Read());

      }

      // Display any validation errors.
      private static void ValidationCallBack(object sender, ValidationEventArgs e) {
        Console.WriteLine("Validation Error: {0}", e.Message);
      }
    }

    最后补充一句:原来《C#高级编程》中的例子原封不动抄袭微软的MSDN,无语。

     

  • 关于以下三点:纳秒,引用,变长参数。如题,因为不明白,自己试了一下,纯粹写着玩的,凑日志。
    Point是一个类,有两个共有整型成员x,y。
    public class Main extends Thread { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub System.out.println(System.currentTimeMillis()); System.out.println(System.nanoTime()); sleep(1); System.out.println(System.nanoTime()); System.out.println(System.currentTimeMillis()); Point p1 = new Point(); p1.x = p1.y = 4; Point p2 = p1; p2.x = 5; System.out.println(p1.x + " " + p1.x); System.out.println(p2 == p1); add(1); add(1,2); add(1,2,3); } static public int add(int ... list) { int sum = 0; for(int item : list) sum += item; System.out.println(sum); return sum; } }

    输出结果:

    1246350403546
    4069355968146
    4069357979575
    1246350403546
    5  5
    true
    1
    3
    6


    注释:
    1.System.currentTimeMillis(),取当前时间毫秒值,这个毫秒是自1970年1月1日0时开始算起的毫秒数。System.nanoTime()则是取纳秒了,不过看样子这个数字不是从1970年开始计算了,那仅仅把它当作调试时的一个参考吧。在我的代码中,用sleep函数停留了1纳秒,输出结果正常。

    2.Point那几句代码让我真的明白了“引用”的概念。

    3.变长参数,以前不知道的,用“...”等同于使用数组。

     

  • 保留字和关键字的区别

    日期:2009年06月25日 | 分类:敲代码 | Tags:关键字 保留字

    做编译原理实验时碰到这个问题。以前也没思考过,总觉得是一样的(现在也觉得是一样的)。但是实验报告要写这两个名词的区别,于是Google之,众说纷纭,有的还很荒谬。那就根据我综合他人意见以及自己的实验,写一下。

    下面的例子都是以Java为例。

    关键字与保留字都不可以作为变量名。此外,关键字有实际意义的,比如int说明了下面要声明的变量是整型变量,public说明访问控制是对外可见的等等。但是保留字则不同,保留字可能到目前语言版本(如JDK1.6)为止还没有意义,但可能以后有意义。比如const在Java中没有任何意义(Java常量使用final声明),但还是作为保留字了。

    Java中只有两个保留字:const,goto。

    有的地方上说保留字可以作为变量名。这句话是错误的。我在Eclipse中用一段代码截图显示了这个问题,如图。

     

    注:下面是微软建模语言M语言规范中一句话:

    The following keywords are reserved for future use:
    checkpoint identifier nest override new virtual partial

    这说明,保留字是为了留作日后使用,但现在也许没有功能 .

    有不对的希望指正。

     

  • JLex下载及安装

    日期:2009年06月15日 | 分类:敲代码 | Tags:JLex 编译原理 Oberon-0

    编译原理实验(Oberon-0逆向工程工具ROSE)系列之一---JLex下载及安装

    分两部分,一个是这一系列日志的动机,二是正文,JLex的下载与安装。

    动机篇:

    编译原理还剩一个实验,据说不用展示了,作为大作业最后交上。鉴于没时间考完试再做,于是这几天慢慢一点点搞定掉。考虑到里面的一些东西是很通用的,所以打算把我做的过程记录一下,希望以后有人可以借鉴。

    本实验大意是为Oberon-0语言设计并实现一个编译器。具体要求由于实验指导书电子版不支持复制粘贴,所以不复制过来了。

    “(一)”的正文:

    首先,这个实验开发语言为Java,那在本文中默认已经正确安装JDK。另外,本人的全部操作基于MyEclipse(当然,Eclipse也一样),因此不会出现任何类似cmd命令窗口那样的DOS界面。

    步骤一:下载JLex。完成此操作大约需要10秒左右。下载地址:http://www.cs.princeton.edu/~appel/modern/java/JLex/ 。下载的地方如下图红色方框。注意该文件为一Java源文件(即后缀为.java),因此直接在链接上右单击另存为即可。

     

    步骤二:在Eclipse(MyEclipse亦同,下文不再累述)中新建Java工程。将刚才下载的Main.java复制到工程目录。注意,由于Main类在JLex包中(package JLex),因此需要先新建JLex文件夹,然后将Main.java放在JLex文件夹下。

    步骤三:在Eclipse左侧工程目录中右单击,刷新,此时可以看到Main.java已经在工程文件下。如图。

    由于JLex的main函数(即程序执行入口)默认是用命令行方式执行的,因此在网上其它参考资料都是在命令行执行:java JLex.Main filename.java,而在Eclipse中调试是无法加入参数的。于是在这里我们用一个折衷的方法,如下:

    步骤四:定位到Main.java的3834行(汗,这么长),修改代码,注释掉几句,添加几句,如下图:

     

     

    这么修改的唯一原因就是显式地指定了参数。其中,“sample.lex”是在下载JLex的网站下载的,还是刚才下载JLex的那个链接,有个“Sample Input”,在那里下载。下载后放在工程目录下即可。

    关于.lex文件中的格式,下一篇日志会说。

    步骤五:运行该程序,如图:

     

    同时,在工程目录下可以看到一个名为“sample.lex.java”的文件,这个就是我们的目标文件。至于它的作用,会在下面的日志中说明。

    至此JLex的“安装”已经解释完毕。实验其他部分待续。