lhylj2's profile仓储室PhotosBlogLists Tools Help

Blog


    December 10

    行使否决权,我拒绝了一个程序员

      他的简历,是我们从一厚沓子中千挑万选出来的,密密麻麻的项目经验,使人不会怀疑他的开发能力,通过后来的面谈也印证了这点。
      问题就在于他的职业目标是系统架构师,而我们更想找一个技术出身的项目经理。
      我们没放弃,打算从他身上发掘出一些带项目的素质,促使我们对他的职业目标重新规划。他后来也愿意接受新的规划,而我们还在寻找着。
      他之前带过几个项目,交谈中明显感觉到,他对组织内人员管理风格偏软、能力还是有些欠缺,我们担心他对项目能否控制得住,也就是因为这点,我们最终放弃了。
      他热爱技术,假如我们在一起工作一定会有好多共同语言。我也是偏向技术的,不盲目崇拜,主张技术要实用。
      祝愿他早日找到合适的工作。

      说一下我对写简历的想法。
      简历就是敲门砖,投简历的目的就是要争取面试的机会。
      行业基本功一定要扎实,在这个前提下,简历上一定要有亮点,让人过目不忘,对你有特别的印象。
      要是玉树临风或者闭月羞花就印张照片、要是个子高就写明身高n米、要是党员就把政治面貌加黑加粗、要是英语过了六级八级就往前放,总之就是要在显眼的地方,用特别的手段把自己的跟其它的竞争者区分开,赢在起跑线。
      再就是去小公司面试,一定要展现自己可塑的一面,除非对自己的职业目标很明确。

    July 07

    AJAX基础教程[转]

    AJAX基础教程 http://www.cnblogs.com/eme/archive/2006/04/13/374260.html
      这篇文章将带您浏览整个AJAX的基本概貌,并展示两个简单的例子让您轻松上路.

      什么是 AJAX?
      AJAX (异步 JavaScript 和 XML) 是个新产生的术语,专为描述JavaScript的两项强大性能.这两项性能在多年来一直被网络开发者所忽略,直到最近Gmail, Google suggest和google Maps的横空出世才使人们开始意识到其重要性.

      这两项被忽视的性能是:
      无需重新装载整个页面便能向服务器发送请求.
      对XML文档的解析和处理.

    步骤 1 – "请!" --- 如何发送一个HTTP请求

      为了用JavaScript向服务器发送一个HTTP请求, 需要一个具备这种功能的类实例. 这样的类首先由Internet Explorer以ActiveX对象引入, 被称为XMLHTTP. 后来Mozilla, Safari 和其他浏览器纷纷仿效, 提供了XMLHttpRequest类,它支持微软的ActiveX对象所提供的方法和属性.

      因此, 为了创建一个跨浏览器的这样的类实例(对象), 可以应用如下代码:

    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    http_request = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
    http_request = new ActiveXObject("Microsoft.XMLHTTP");
    }

      (上例对代码做了一定简化,这是为了解释如何创建XMLHTTP类实例. 实际的代码实例可参阅本篇步骤3.)

      如果服务器的响应没有XML mime-type header,某些Mozilla浏览器可能无法正常工作. 为了解决这个问题, 如果服务器响应的header不是text/xml,可以调用其它方法修改该header.

    http_request = new XMLHttpRequest();
    http_request.overrideMimeType('text/xml');

      接下来要决定当收到服务器的响应后,需要做什么.这需要告诉HTTP请求对象用哪一个JavaScript函数处理这个响应.可以将对象的onreadystatechange属性设置为要使用的JavaScript的函数名,如下所示:

    http_request.onreadystatechange = nameOfTheFunction;

      注意:在函数名后没有括号,也无需传递参数.另外还有一种方法,可以在扉页(fly)中定义函数及其对响应要采取的行为,如下所示:

    http_request.onreadystatechange = function(){
    // do the thing
    };

      在定义了如何处理响应后,就要发送请求了.可以调用HTTP请求类的open()和send()方法, 如下所示:

    http_request.open('GET', 'http://www.example.org/some.file', true);
    http_request.send(null);

      open()的第一个参数是HTTP请求方式 – GET, POST, HEAD 或任何服务器所支持的您想调用的方式. 按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求.有关HTTP请求方法的详细信息可参考http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C specs
      第二个参数是请求页面的URL.由于自身安全特性的限制,该页面不能为第三方域名的页面.同时一定要保证在所有的页面中都使用准确的域名,否则调用 open()会得到"permission denied"的错误提示.一个常见的错误是访问站点时使用domain.tld,而当请求页面时,却使用www.domain.tld.
      第三个参数设置请求是否为异步模式.如果是TRUE, JavaScript函数将继续执行,而不等待服务器响应.这就是"AJAX"中的"A".
      如果第一个参数是"POST",send()方法的参数可以是任何想送给服务器的数据. 这时数据要以字符串的形式送给服务器,如下所示:

    name=value&anothername=othervalue&so=on


    步骤 2 – "收到!" --- 处理服务器的响应

      当发送请求时,要提供指定处理响应的JavaScript函数名.

    http_request.onreadystatechange = nameOfTheFunction;

      我们来看看这个函数的功能是什么.首先函数会检查请求的状态.如果状态值是4,就意味着一个完整的服务器响应已经收到了,您将可以处理该响应.

    if (http_request.readyState == 4) {
    // everything is good, the response is received
    } else {
    // still not ready
    }

      readyState的取值如下:
      0 (未初始化)
      1 (正在装载)
      2 (装载完毕)
      3 (交互中)
      4 (完成)

      接着,函数会检查HTTP服务器响应的状态值. 完整的状态取值可参见 W3C site. 我们着重看值为200 OK的响应.

    if (http_request.status == 200) {
    // perfect!
    } else {
    // there was a problem with the request,
    // for example the response may be a 404 (Not Found)
    // or 500 (Internal Server Error) response codes
    }

      在检查完请求的状态值和响应的HTTP状态值后, 您就可以处理从服务器得到的数据了.有两种方式可以得到这些数据:

    http_request.responseText – 以文本字符串的方式返回服务器的响应
    http_request.responseXML – 以XMLDocument对象方式返回响应.处理XMLDocument对象可以用JavaScript DOM函数


    步骤 3 – "万事俱备!" - 简单实例

      我们现在将整个过程完整地做一次,发送一个简单的HTTP请求. 我们用JavaScript请求一个HTML文件, test.html, 文件的文本内容为"I'm a test.".然后我们"alert()"test.html文件的内容.

    <script type="text/javascript" language="javascript">
    var http_request = false;
    function makeRequest(url) {

    http_request = false;

    if (window.XMLHttpRequest) { // Mozilla, Safari,...
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
    http_request.overrideMimeType('text/xml');
    }
    } else if (window.ActiveXObject) { // IE
    try {
    http_request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try {
    http_request = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {}
    }
    }

    if (!http_request) {
    alert('Giving up :( Cannot create an XMLHTTP instance');
    return false;
    }
    http_request.onreadystatechange = alertContents;
    http_request.open('GET', url, true);
    http_request.send(null);

    }

    function alertContents() {

    if (http_request.readyState == 4) {
    if (http_request.status == 200) {
    alert(http_request.responseText);
    } else {
    alert('There was a problem with the request.');
    }
    }

    }
    </script>
    <span
    style="cursor: pointer; text-decoration: underline"
    onclick="makeRequest('test.html')">
    Make a request
    </span>


      本例中:
      用户点击浏览器上的"请求"链接;
      接着函数makeRequest()将被调用.其参数 – HTML文件test.html在同一目录下;
      这样就发起了一个请求.onreadystatechange的执行结果会被传送给alertContents();
      alertContents()将检查服务器的响应是否成功地收到,如果是,就会"alert()"test.html文件的内容.

    步骤 4 – "X-文档" --- 处理XML响应

      在前面的例子中,当服务器对HTTP请求的响应被收到后,我们会调用请求对象的reponseText属性.该属性包含了test.html文件的内容.现在我们来试试responseXML属性.

      首先,我们新建一个有效的XML文件,后面我们将使用这个文件.该文件(test.xml)源代码如下所示:

    <?xml version="1.0" ?>
    <root>
    I'm a test.
    </root>

      在该脚本中,我们只需修改请求部分:

    ...
    onclick="makeRequest('test.xml')">
    ...

      接着,在alertContents()中,我们将alert()的代码alert(http_request.responseText);换成:

      var xmldoc = http_request.responseXML;
      var root_node = xmldoc.getElementsByTagName('root').item(0);
      alert(root_node.firstChild.data);


      这里,我们使用了responseXML提供的XMLDocument对象并用DOM方法获取存于XML文件中的内容.

    July 05

    小璐熙四个半月

        四个多月过去,璐熙已经13斤了。
        最爱咋吧她妈妈那口奶,胃口不大,一次就吃一点,能吃些蛋黄、米粉类的辅食。
        吃饭要上桌子,典型的馋猫儿。
        最爱喝酸的果汁,尤其是樱桃汁,喂得慢了就哭闹。能报着桃子舔半天,其实基本上吃不着多少。
        可以一晚上不起夜。隔一天玩个大的。
        从来不早起,晚上睡得晚(跟他爹的作息时间有点像),白天还有好几觉。
        喜欢侧身睡觉,像个小大人似的。尤其爱扒着睡觉,她姥姥正要给她改这个毛病。
        翻身翻得特别利索,放到床上时要时刻盯住了。
        小腿特别有劲,踹人可疼了。
        会自娱自乐,没人陪着照样自己玩,每天都挺开心,见到人就笑,能跟大人哦啊的“对话”。
        胆儿特别小,动静稍大点儿就把她吓一跳。
        不喜欢玩具娃娃,一见面就开掐。
        喜欢出去玩,见到汽车眼睛就发直。
     

    系统启动不久,无法连接到网络的解决办法

    现象:系统启动一段时间后无法连接到网络;事件查看器报告适配器 xxx: 适配器链接处于关闭状态,来源:E100B;天网防火墙报
      接收到 xxx.xx.xx.xxx 的 UDP 数据包,
      本机端口: xxxx,
      对方端口: xxxxx
      该包被拦截。
    我在网上找了几圈,遇见过相同问题的,没有写解决办法。
    我的解决办法是:在天网中添加两条ip规则,允许其连接,不清楚会不会有其它风险。
                           规则一:                    规则二:
                   名称:链接网络TCP(随便取) 连接网络UDP
           数据包方向:接收                         接收
           对方IP地址:任何地址                    任何地址
      数据包协议类型:TCP                         UDP
              本地端口:从1025到65535           从1025到65535
    当满足上面条件时:通行                         通行
     

    Hessian的HelloWord

        在一个集成项目接口的实现里用到了Hessian,类似以前用过的Burlap,整理了一下:
    Hessian,Burlap是Caucho提供的两种基于Http的轻量级远程服务。
        Hessian像RMI那样,使用二进制消息来建立客户端和服务端之间的交流。与其他二进制远程技术(想RMI)不同的是,它可以移植到其他非Java的语言。
        Burlap是一种基于Xml的远程技术,这使得他可以移植到任何可以解析XML的语言中。比起Hessian,它的可读性更强。和其他基于Xml的远程技术(如SOAP和XML-RPC)不同,它的消息结构尽可能简单,不需要额外的外部定义语言(如WSDL或IDL).
        按照文档中的步骤编写HelloWord例子,一个接口、一个实现、一个Client再配置一下web.xml就OK。需要注意的是实现接口时不要继承HessianServlet,否则会报错。
        自己机器的环境:jdk1.5、Tomcat5.5
    //BasicAPI.java
    package app.demo;
    public interface BasicAPI {
     public String hello();
     public User getUser();
    }
    //BasicService.java
    package app.demo;
    public class BasicService implements BasicAPI {
     private String _greeting = "Hello, world";
     public void setGreeting(String greeting) {
      _greeting = greeting;
     }
     public String hello() {
      return _greeting;
     }
    //BasicClient.java
    package app.demo;
    import com.caucho.hessian.client.HessianProxyFactory;
    public class BasicClient {
     public static void main(String[] args) throws Exception {
      String url = "http://192.168.0.89:8083/hessianweb/hello";//配置为自己机器的ip端口和应用名
      HessianProxyFactory factory = new HessianProxyFactory();
      BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url);
      System.out.println("Hello: " + basic.getUser().getPassword());
     }
    }
     public User getUser(){
      return new User("jerry","HelloWord");
     }
    }
    //User.java
    package app.demo;
    public class User implements java.io.Serializable {
     String userName = "snoopy";
     String password = "showme";
     public User(String user, String pwd) {
      this.userName = user;
      this.password = pwd;
     }
     public String getUserName() {
      return userName;
     }
     public String getPassword() {
      return password;
     }
    }
    //web.xml
    <web-app>
     <servlet>
      <servlet-name>hello</servlet-name>
      <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
      <init-param>
                <param-name>home-class</param-name>
                <param-value>app.demo.BasicService</param-value>
            </init-param>
      <init-param>
                <param-name>home-api</param-name>
                <param-value>app.demo.BasicAPI</param-value>
            </init-param>
     </servlet>
     <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/hello</url-pattern>
     </servlet-mapping>
    </web-app>
    April 26

    连接Oracle RAC 遇到的问题

    Oracle版本:10.2.0.1.0 (RAC)
    驱动版本:10.1.0.5、10.2.0.1、10.2.0.3
    现象:时而可以取到连接,时而取不到,报错 Connection refused ... ERR=1153 ... VSNNUM=169869568 ...
    原因:oracle驱动不匹配,导致不能保证每次都能取到连接
    解决办法:换成 9.2.0.4 的jdbc驱动来连接10.2.0.1.0 RAC
    April 15

    代码:Java通过FTP传文件

     public static void main(String[] args) throws Exception{
      String hostName = "221.186.184.68";
      int prot = 21;
      String userName = "administrator";
      String password = "111111";
      String remoteDir = "/";
      
      FTPClient ftpClient = new FTPClient();
      ftpClient.connect(hostName,prot);
      System.out.println("连接到ftp服务器:" + hostName + " 成功..开始登录");
      ftpClient.login(userName, password);
      System.out.println(ftpClient.isConnected());
      
      ftpClient.changeWorkingDirectory("/");
      FTPFile[] remoteFiles = ftpClient.listFiles();
      System.out.println("目录" + remoteDir + "下的文件:");
      if(remoteFiles != null) {
       for(int i=0;i<remoteFiles.length;i++){
        String name = remoteFiles[i].getName();
        name = new String(name.getBytes("ISO8859_1"),"GBK");
        long length = remoteFiles[i].getSize();
        String readableLength = FileUtils.byteCountToDisplaySize(length);
        System.out.println(name + ":\t\t" + readableLength);
       }
      }//if
      ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//无此句,传输非txt文件会变大
      File file1 = new File("c:/sql.txt");
      ftpClient.storeFile(file1.getName(), new FileInputStream(file1));
      ftpClient.logout();
     }
    April 05

    CVSNT "No such file or directory" 的解决方法

    现象:架设好的外网CVSNT服务器,可以检出可共享,无法提交。
    原因:CVS用户权限不足,无法写入 C:\WINNT\TEMP 目录。
    解决方法:对 C:\WINNT\TEMP 目录给CVS用户授权为“完全控制”。
    March 22

    闺女周末就满月啦

    生日:2007年2月24日 正月初七 午时
    大名:李璐熙
    名字含义:美玉光灿、大路平坦
    英文名:Lucy.Lee
    起名人:郭怀仁
    小名:金猪
    起名人:她舅舅
    May 11

    停用MyEclipse改换WTP

        Crack的软件在公司遭到正式封杀,Crack的MyEclipse也不能用了。前一阵子见到同事用WTP,功能和易用性不逊色于MyEclipse,马上就投入到WTP的怀抱,过程如下:
        1.下载集成了WTPEclipse ,此Eclipse版本是3.1.2,WTP的日期是20060428。。
        2.Eclipse 的插件信息中可以看到J2EE Standard Tools、Web Standard Tools等插件。新建 Web-》Dynamic Web Project,要是想保持MyEclipse的风格,就更改 WebContent 为 WebRoot并设置缺省输出文件夹为 WebRoot/WEB-INF/classes。
        3.新建并配置一个Server,WTP能自动找到Tomcat(可能是环境变量配置了CATALINA_HOME),将需要的project加入Server。
        跟MyEclipse不同,WTP不向webapps目录发布而是向插件里的某个目录发布。并且只能通过localhost访问无法通过ip访问。最爱用她的Debug。
    April 15

    动态添加附件

    <table>
       <tbody id="tbOneFile">
        <tr>
      <td height="39">电子附件:</td>
      <td><input type=file name='file0' size=30 ">
      </td>
      <td><!--input type=button name='rmAttach' size=2 value="移除附件" onclick="javascript:delAttach()"-->
      </td>
        </tr>
       </tbody>
       <tbody>
        <tr>
          <td height="39"></td>
          <td>
           <div onclick="javascript:addAttach()">增加附件</div>
           <div id="tbHref">
            <div id="tbAttachHref" name="tbAttachHref" onclick="javascript:delAttach()" style="visibility:hidden">移除附件</div>
      </div>
          </td>
          <td colspan="2">&nbsp;</td>
        </tr>
       </tbody>
    </table>
    <script>
    //增加
    function addAttach(afterRowIndex){
      var allFiles= document.all("tbOneFile").rows;
      var firstSelected;
     
      if(afterRowIndex==null){
        firstSelected=allFiles.length-2;
      } else {
       firstSelected = -2;
      }
     
      var newRow = document.all("tbOneFile").rows[0].cloneNode(true);
      var refRow = allFiles[firstSelected+1];
      refRow.parentElement.insertBefore(newRow,null );
      //说明:在refRow代表的现有子节点的前面插入newRow节点。如果refChild为null,则把新节点插到资节点列表的末尾。
     
      if(firstSelected==-1){//出来两个附件的时候出“移除附件”
       tbParent = document.getElementById("tbHref");
     document.getElementById("tbAttachHref").style.visibility = "visible";
      }
    }
    //删除
    function delAttach(afterRowIndex){
     var allFiles= document.all("tbOneFile").rows;
     var firstSelected;
     
      if(afterRowIndex==null){
        firstSelected=allFiles.length-2;
      }else
       firstSelected = afterRowIndex;
     
      //var newRow = document.all("tbOneFile").rows[0].cloneNode(true);
      var refRow = allFiles[firstSelected+1];
      refRow.parentElement.removeChild(refRow);
     
      if(firstSelected==0){//只剩一个附件的时候不出“移除附件”
       tbParent = document.getElementById("tbHref");
     document.getElementById("tbAttachHref").style.visibility = "hidden";
      }
    }
    </script>
    April 14

    oracle text

    部分关于Oracle Text 的相关资料。测试Oracle版本9.2.0.1 字符集 GBK UTF-8 都能通过
        Oracle Text是Oracle9i采用的新名称,在Oracle8/8i中它被称作Oracle interMedia Text,在Oracle8以前它的名称是Oracle ConText Cartridge。
     
    create table DOCS(ID NUMBER not null, TEXT VARCHAR2(80));
    alter table DOCS add primary key (ID);
    create index docs_text on docs(text) indextype is ctxsys.context;
    --此时如果监听没配置好,创建索引会失败。
    select * from dr$docs_text$i
     
    这些索引表都会占用用户表空间:DR$DOCS_TEXT$I DR$DOCS_TEXT$K DR$DOCS_TEXT$N DR$DOCS_TEXT$R
    1.文本存储在数据库中,可以是 CLOB,BLOB,BFILE,VARCHAR2,CHAR 类型的文本数据。
    2.文本列语言是数据库建立时默认的字符集。
    3.使用数据库默认的终止目录stoplist,stoplist记录存在于文本列中但不对其索引的词。
    4.允许模糊查询。
     
    begin
    ctx_ddl.create_preference('my_lexer','chinexe_vgram_lexer');--支持GBK UTF8,效率底chinese_lexer 效率高但是仅支持utf8
    end;
     
    --drop index docs_text;--强制删除索引:drop index docs_text force;
    create index docs_text on docs(text) indextype is ctxsys.context parameters('lexer my_lexer');
    --使用愚蠢 lexer 的源表和维持索引表的控件对比,注意表空间大小的设置和磁盘分配
    --   6 M    80 M
    --  80 M   900 M
    -- 230 M  2880 M
    --1344 M 15232 M
     
    --可以使用 stoplist stopwords 排除:的 地 得 是 等。。
    --性能 扩大 DEFAULT_INDEX_MEMORY MAX_INDEX_MEMORY
    --(注意:在少量内存中索引大量文档会导致出现碎片索引的情况。)
    select * from ctx_parameters
     
    索引失败会记录在系统表中:
    CTX_USER_INDEX_ERRORS
    CTXSYS.CTX_INDEX_ERRORS
    select * from ctx_user_index_errors--可以清除表内记录
     
    重建索引:用新的词法分析器替换现有的:
    alter index docs_text rebuild parameters('replace lexer my_lexer');
    删除自定义参数:my_lexer
    begin
     ctx_ddl.drop_preference('my_lexer');
    end;
     
    源表数据变动后,并不能马上反映到dr$docs_text$i表,用下列看已经发生的变动
    select * from ctx_user_pending
     
    同步(sync):将新的term保存到I表
    优化(optimize):清除I表的垃圾,主要是源表已经删除的数据从I表删除
    可以使用Oracle提供的ctx_ddl包同步和优化索引,对于CTXCAT类型的索引来说,
    进行DML时,oracle自动维护索引
     
    手工更新索引:
    alter index docs_text rebuild parameters('sync');
    Oracle9i提供了新的专门用于更新索引的包:ctx_ddl.sync_index(...)
    例如使用2M内存同步索引 docs_text
    begin
     ctx_ddl.sync_index('docs_text','2M');--执行者如果是 CTXSYS 用户,索引名可以为null,这样默认优化全部的 CONTEXT 索引,如同那个不稳定的 CTXSRV 服务
    end;
     
    计算主题符合度
    select id,score(1), text from docs where contains(text,'幅度撒',1)>0 order by score(1) desc;
     
    可以优化索引(CTX_DDL.OPTIMIZE_INDEX),使用FULL或者FAST参数参数降低索引碎片,提高索引效率
    当文本从表中delete时索引term并没有马上删除,这就占据了控件导致查询的额外开销,需要进行垃圾处理。注:更新删除后垃圾处理很有必要。
    begin
     ctx_ddl.optimize_index('docs_text','full');--参数fast仅会使行紧凑,旧数据不从索引中删除
    end;
     
    对经常查询的单词进行专门优化--提高热词的查询效率。
    begin
     ctx_ddl.optimize_index('docs_text','token',token=>'公文');
    end;
     
    使用job定时同步和优化(job跟表在用一个用户下面)--暂时还没调通,等仔细看看job再回来解决它 :)
    --sync
    variable jobno number;
    begin
    dbms_job.submit(:jobno,'ctx_ddl.sync_index(''docs_text'');',sysdate,'sysdate+(1/24/4)');
    --每隔15分钟同步一次
    commit;
    end;
     
    --optimizer
    variable jobno number;
    begin
    dbms_job.submit(:jobno,'ctx_ddl.optimize_index(''myindex'',''full'');',sysdate,'sysdate+1');
    --每隔一天做一次全面优化
    commit;
    end;
     
    SQL> create or replace procedure hsp_sync_index as
      2  begin
      3  ctx_ddl.sync_index('id_cont_msg');
      4  end;
      5  /
    Procedure created.
    Elapsed: 00:00:00.08
    SQL> VARIABLE jobno number; 
    SQL> BEGIN
       2 DBMS_JOB.SUBMIT(:jobno,'hsp_sync_index();', 
       3 SYSDATE, 'SYSDATE + (1/24/4)'); 
       4 commit; 
       5 END; 
       6 /
    PL/SQL procedure successfully completed.
    Elapsed: 00:00:00.27
    SQL> create or replace procedure hsp_optimize_index as
      2  begin
      3  ctx_ddl.optimize_index('id_cont_msg','FULL');
      4  end;
      5  /
    SQL> VARIABLE jobno number; 
    SQL> BEGIN
       2 DBMS_JOB.SUBMIT(:jobno,'hsp_optimize_index();', 
       3 SYSDATE, 'SYSDATE + 1'); 
       4 commit;
       5 END;
       6 /
    Procedure created.
    Elapsed: 00:00:00.03
    PL/SQL procedure successfully completed.
    Elapsed: 00:00:00.02