Finally got blipkit started from java via jpl :)
In order to get the jpl java examples to work, LD_LIBRARY_PATH has to contain:
/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/jre/lib/i386/client/:/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/jre/lib/i386/
/usr/local/lib/pl-5.7.15/lib/jpl.jar:/home/samuel/install/swi-prolog/pl57/packages/jpl/examples/java/Test
Now firing up blipkit works, when calling Java from commandline!!! :).
Running the command:
LD_PRELOAD=/usr/local/lib/pl-5.7.15/lib/i686-linux/libjpl.so java -Djava.library.path=/usr/local/lib/pl-5.7.15/lib/i686-linux/ Test
... I get:
-G0 -A0 -T0 -g main -t halt -s /home/samuel/blipstart.pl % library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 2,060 bytes % /home/samuel/.plrc compiled 0.00 sec, 704 bytes % bio(bioprolog_util) compiled into bioprolog_util 0.01 sec, 42,180 bytes % bio(mode) compiled into mode 0.00 sec, 7,788 bytes % bio(dbmeta) compiled into dbmeta 0.04 sec, 244,516 bytes % library(option) compiled into swi_option 0.00 sec, 8,640 bytes % library(sgml) compiled into sgml 0.01 sec, 41,308 bytes % library(quintus) compiled into quintus 0.01 sec, 11,552 bytes % rewrite compiled into rewrite 0.01 sec, 17,668 bytes % library(uri) compiled into uri 0.00 sec, 5,940 bytes % library(record) compiled into record 0.01 sec, 15,332 bytes % rdf_parser compiled into rdf_parser 0.03 sec, 74,800 bytes % library(gensym) compiled into gensym 0.00 sec, 2,436 bytes % rdf_triple compiled into rdf_triple 0.00 sec, 19,132 bytes % library(rdf) compiled into rdf 0.04 sec, 153,032 bytes % library(assoc) compiled into assoc 0.00 sec, 12,104 bytes % library(sgml_write) compiled into sgml_write 0.01 sec, 51,600 bytes % library(nb_set) compiled into nb_set 0.00 sec, 3,216 bytes % rdf_cache compiled into rdf_cache 0.00 sec, 8,592 bytes % library(semweb/rdf_db) compiled into rdf_db 0.09 sec, 309,936 bytes % library(utf8) compiled into utf8 0.01 sec, 7,200 bytes % library(url) compiled into url 0.02 sec, 61,000 bytes % library(readutil) compiled into read_util 0.01 sec, 8,800 bytes % library(socket) compiled into socket 0.00 sec, 5,608 bytes % library(base64) compiled into base64 0.00 sec, 9,156 bytes % library(http/http_open) compiled into http_open 0.04 sec, 108,672 bytes % library(date) compiled into date 0.00 sec, 9,508 bytes % library(semweb/rdf_http_plugin) compiled into rdf_http_plugin 0.04 sec, 124,608 bytes % bio(io) compiled into io 0.19 sec, 737,684 bytes % bio(metadata_db) compiled into metadata_db 0.01 sec, 16,688 bytes % bio(blipkit_shell_dcg) compiled into blipkit_shell_dcg 0.00 sec, 4,600 bytes % bio(tabling) compiled into tabling 0.00 sec, 9,488 bytes % bio(blipkit) compiled into blipkit 0.23 sec, 862,060 bytes % bio(graph) compiled into graph 0.01 sec, 18,220 bytes % bio(macros_transitive) compiled into macros_transitive 0.00 sec, 3,516 bytes % bio(ontol_db) compiled into ontol_db 0.04 sec, 113,000 bytes % bio(stats_distributions) compiled into stats_distributions 0.01 sec, 25,396 bytes % bio(curation_db) compiled into curation_db 0.02 sec, 58,088 bytes % bio(textmatch) compiled into textmatch 0.00 sec, 5,296 bytes % bio(macros_lookup) compiled into macros_lookup 0.00 sec, 9,152 bytes % bio(ontol_lookup) compiled into ontol_lookup 0.00 sec, 16,924 bytes % bio(ontol_writer) compiled into ontol_writer 0.01 sec, 1,016 bytes % bio(ontol_writer_text) compiled into ontol_writer_text 0.00 sec, 20,660 bytes % library(rbtrees) compiled into rbtrees 0.01 sec, 45,648 bytes % library(thread_pool) compiled into thread_pool 0.02 sec, 66,712 bytes % library(memfile) compiled into memory_file 0.00 sec, 3,900 bytes % library(broadcast) compiled into broadcast 0.00 sec, 3,988 bytes % library(settings) compiled into settings 0.00 sec, 24,568 bytes % dcg_basics compiled into dcg_basics 0.00 sec, 11,964 bytes % library(pairs) compiled into pairs 0.00 sec, 4,380 bytes % html_write compiled into html_write 0.02 sec, 61,332 bytes % http_exception compiled into http_exception 0.00 sec, 3,716 bytes % mimetype compiled into mimetype 0.00 sec, 6,512 bytes % mimepack compiled into mime_pack 0.00 sec, 5,572 bytes % http_header compiled into http_header 0.06 sec, 193,528 bytes % http_stream compiled into http_stream 0.00 sec, 3,988 bytes % http_wrapper compiled into httpd_wrapper 0.07 sec, 211,776 bytes % library(http/thread_httpd) compiled into thread_httpd 0.10 sec, 301,516 bytes % library(http/http_session) compiled into http_session 0.00 sec, 14,852 bytes % bio(xml_writer) compiled into xml_writer 0.01 sec, 8,124 bytes % bio(serval) compiled into serval 0.12 sec, 377,788 bytes % bio(ontol_writer_obo) compiled into ontol_writer_obo 0.13 sec, 426,512 bytes % bio(blipkit_ontol) compiled into blipkit_ontol 0.23 sec, 747,860 bytes % library(oset) compiled into oset 0.00 sec, 8,264 bytes % library(ordsets) compiled into ordsets 0.01 sec, 17,120 bytes % bio(phylo_db) compiled into phylo_db 0.03 sec, 106,012 bytes % bio(blipkit_phylo) compiled into blipkit_phylo 0.03 sec, 118,896 bytes % bio(fasta_db) compiled into fasta_db 0.00 sec, 1,812 bytes % bio(gencode) compiled into gencode 0.03 sec, 87,032 bytes % bio(suffixtree) compiled into suffixtree 0.00 sec, 19,216 bytes % bio(iupac) compiled into iupac 0.01 sec, 2,764 bytes % bio(bioseq) compiled into bioseq 0.04 sec, 126,644 bytes % bio(blipkit_fasta) compiled into blipkit_fasta 0.05 sec, 137,536 bytes % bio(sb_db) compiled into sb_db 0.00 sec, 12,268 bytes % bio(blipkit_sb) compiled into blipkit_sb 0.01 sec, 29,616 bytes % library(http/http_client) compiled into http_client 0.01 sec, 17,264 bytes % bio(web_fetch) compiled into web_fetch 0.02 sec, 21,792 bytes % bio(xml_transform) compiled into xml_transform 0.01 sec, 18,572 bytes % bio(web_fetch_google) compiled into web_fetch_google 0.01 sec, 36,604 bytes % bio(web_fetch_yahoo) compiled into web_fetch_yahoo 0.00 sec, 3,140 bytes % bio(web_fetch_ncbi) compiled into web_fetch_ncbi 0.01 sec, 8,464 bytes % bio(web_search_expander) compiled into web_search_expander 0.00 sec, 11,608 bytes % bio(blipkit_web) compiled into blipkit_web 0.05 sec, 136,152 bytes % /home/samuel/blipstart.pl compiled 0.63 sec, 2,072,576 bytes test 0...% test.pl compiled 0.00 sec, 2,220 bytes passed. test 1...passed. test 2...passed. test 3...passed. test 4...passed. test 5...passed. test 6...passed. test 7...passed. test 8...passed. test 9...passed. test 10...passed. test 11...passed. test 101...00000000000000000000111111111111111111112222222222222222222233333333333333333333444444444444444444445555555555555555555566666666666666666666777777777777777777778888888888888888888899999999999999999999passed.
The content of the Test.java is (I modified it to enforce loading blipkit):
//tabstop=4 //*****************************************************************************/ // Project: jpl // // File: $Id$ // Date: $Date$ // Author: Fred Dushin <fadushin@syr.edu> // // // Description: // // // ------------------------------------------------------------------------- // Copyright (c) 1998 Fred Dushin // All rights reserved. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library Public License for more details. //*****************************************************************************/ import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Hashtable; import jpl.Query; // empirically, we need this, but I don't know why... import jpl.PrologException; import jpl.*; public class Test { public static void main( java.lang.String argv[] ) { String[] blipInitFile; blipInitFile = readFileToStringArray("/home/samuel/blipstart"); for (int i=1; i<blipInitFile.length; i++) { if (blipInitFile[i] != null) { System.out.println(blipInitFile[i]); } } JPL.setDefaultInitArgs(blipInitFile); JPL.init(); // we don't need this with the current JPL (lazy init-on-demand) run_tests(); } public static String[] readFileToStringArray(String filePath) { File file = new File(filePath); FileInputStream fis = null; BufferedInputStream bis = null; DataInputStream dis = null; List<String> stringBuffer = new ArrayList<String>(); try { fis = new FileInputStream(file); // Here BufferedInputStream is added for fast reading. bis = new BufferedInputStream(fis); dis = new DataInputStream(bis); // dis.available() returns 0 if the file does not have more lines. int i = 0; while (dis.available() != 0) { stringBuffer.add(dis.readLine()); } // dispose all the resources after using them. fis.close(); bis.close(); dis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } String[] result = stringBuffer.toArray(new String[]{}); return result; } static void run_tests() { test_0(); test_1(); test_2(); test_3(); test_4(); test_5(); test_6(); test_7(); test_8(); test_9(); test_10(); test_11(); test_101(); } static void test_0() { System.out.print( "test 0..." ); Query query = new Query("consult('test.pl')"); if ( !query.hasSolution() ){ System.out.println( "consult('test.pl') failed" ); System.exit( 1 ); } System.out.println( "passed." ); } static Term a = new Atom( "a" ); static Term b = new Atom( "b" ); static Term f_a = new Compound( "f", new Term[] {a} ); static Term pair_a_b = new Compound( "-", new Term[] {a,b} ); static void test_1() { System.out.print( "test 1..." ); Query query = new Query("p(a)"); if ( !query.hasSolution() ){ System.out.println( "p(a) failed" ); System.exit( 1 ); } System.out.println( "passed." ); } static void test_2() { System.out.print( "test 2..." ); Query query = new Query( "p", new Term[] {f_a} ); if ( !query.hasSolution() ){ System.out.println( "p(f(a)) failed" ); System.exit( 1 ); } System.out.println( "passed." ); } static void test_3() { System.out.print( "test 3..." ); Query query = new Query( "p", new Term[] {pair_a_b} ); if ( !query.hasSolution() ){ System.out.println( "p( a-b ) failed" ); System.exit( 1 ); } System.out.println( "passed." ); } static void test_4() { System.out.print( "test 4..." ); Variable X = new Variable("X"); Query query = new Query( "p", new Term[] {X} ); Term[] target = new Term[] {a,f_a,pair_a_b,new Variable("_")}; Hashtable[] solutions = query.allSolutions(); if ( solutions.length != 4 ){ System.out.println( "p(X) failed:" ); System.out.println( "\tExpected: 4 solutions" ); System.out.println( "\tGot: " + solutions.length ); System.exit( 1 ); } for ( int i = 0; i < solutions.length-1; ++i ){ Term binding = (Term)solutions[i].get( "X" ); if ( ! binding.equals( target[i] ) ){ System.out.println( "p(X) failed" ); System.out.println( "\tExpected: " + target[i]); System.out.println( "\tGot: " + binding); System.exit( 1 ); } } System.out.println( "passed." ); } static void test_5() { System.out.print( "test 5..." ); Variable X = new Variable("X"); Variable Y = new Variable("Y"); Query query = new Query( "p", new Term[] {X,Y} ); Term[] x_target = new Term[] {a,a}; Term[] y_target = new Term[] {a,b}; Hashtable[] solutions = query.allSolutions(); if ( solutions.length != 2 ){ System.out.println( "p(X, Y) failed:" ); System.out.println( "\tExpected: 2 solutions" ); System.out.println( "\tGot: " + solutions.length ); System.exit( 1 ); } for ( int i = 0; i < solutions.length; ++i ){ Object x_binding = solutions[i].get("X"); if ( ! x_binding.equals( x_target[i] ) ){ System.out.println( "p(X, Y) failed:" ); System.out.println( "\tExpected: " + x_target[i] ); System.out.println( "\tGot: " + x_binding ); System.exit( 1 ); } Object y_binding = solutions[i].get("Y"); if ( ! y_binding.equals( y_target[i] ) ){ System.out.println( "p( X, Y ) failed:" ); System.out.println( "\tExpected: " + y_target[i] ); System.out.println( "\tGot: " + y_binding ); System.exit( 1 ); } } System.out.println( "passed." ); } static void test_6() { System.out.print( "test 6..." ); Variable X = new Variable("X"); Query query = new Query( "p", new Term[] {X,X} ); Term[] x_target = new Term[] {a}; Hashtable[] solutions = query.allSolutions(); if ( solutions.length != 1 ){ System.out.println( "p(X, X) failed:" ); System.out.println( "\tExpected: 1 solution" ); System.out.println( "\tGot: " + solutions.length ); System.exit( 1 ); } for ( int i = 0; i < solutions.length; ++i ){ Object x_binding = solutions[i].get("X"); if ( ! x_binding.equals( x_target[i] ) ){ System.out.println( "p(X, X) failed:" ); System.out.println( "\tExpected: " + x_target[i] ); System.out.println( "\tGot: " + x_binding ); System.exit( 1 ); } } System.out.println( "passed." ); } static void test_7() { System.out.print( "test 7..." ); Variable X = new Variable("X"); Variable Y = new Variable("Y"); Query query = new Query( "r", new Term[] { new Compound( "f", new Term[] {X,X} ), Y } ); Hashtable[] solutions = query.allSolutions(); if ( solutions.length != 2 ){ System.out.println( "r(f(X,X), Y) failed:" ); System.out.println( "\tExpected: 2 solutions" ); System.out.println( "\tGot: " + solutions.length ); System.exit( 1 ); } Object x_binding, y_binding; x_binding = solutions[0].get("X"); y_binding = solutions[0].get("Y"); if ( x_binding != y_binding ){ System.out.println( "r(f(X,X), Y) failed:" ); System.out.println( Util.toString( solutions[0] ) ); System.out.println( "\tThe variables to which X and Y are bound in the first solution should be identical." ); System.exit( 1 ); } x_binding = solutions[1].get("X"); y_binding = solutions[1].get("Y"); if ( x_binding == y_binding ){ System.out.println( "r(f(X,X), Y) failed:" ); System.out.println( Util.toString( solutions[1] ) ); System.out.println( "\tThe variables to which X and Y are bound in the second solution should be distinct." ); System.exit( 1 ); } if ( x_binding.equals( y_binding ) ){ System.out.println( "r(f(X,X), Y) failed:" ); System.out.println( Util.toString( solutions[1] ) ); System.out.println( "\tThe variables to which X and Y are bound in the second solution should not be \"equal\"." ); System.exit( 1 ); } /* if ( ! solutions[0].get("X").equals( solutions[1].get("X") ) ){ System.out.println( "r(f(X,X), Y) failed:" ); System.out.println( Util.toString( solutions[0] ) ); System.out.println( "\tThe variable to which X is bound in the first solution (" + solutions[0].get("X") + ")\n" + "\tshould be equal to the variable to which X is bound in the second (" + solutions[1].get("X") + ")"); System.exit( 1 ); } */ System.out.println( "passed." ); } static void test_8() { System.out.print( "test 8..." ); Variable X = new Variable("X"); Query query = new Query( "r", new Term[] { new Compound( "f", new Term[] {X,X} ), X } ); Hashtable[] solutions = query.allSolutions(); if ( solutions.length != 2 ){ System.out.println( "r( f( X, X ), X ) failed:" ); System.out.println( "\tExpected: 2 solutions" ); System.out.println( "\tGot: " + solutions.length ); System.exit( 1 ); } /* if ( ! solutions[0].get("X").equals( solutions[1].get("X") ) ){ System.out.println( "r( f( X, X ), X ) failed:" ); System.out.println( Util.toString( solutions[0] ) ); System.out.println( "\tThe variable to which X is bound in the first solution\n" + "\tshould be equal to the variable to which X is bound in the second." ); System.exit( 1 ); } */ System.out.println( "passed." ); } // corresponds with Prolog List: [a-a,a-b] static Term test_9_solution = Util.termArrayToList( new Term[] { new Compound( "-", new Term[] {a,a}), new Compound( "-", new Term[] {a,b}) } ); static void test_9() { System.out.print( "test 9..." ); Variable X = new Variable("X"); Variable Y = new Variable("Y"); Variable XYs = new Variable("XYs"); Query query = new Query( "bagof", new Term[] { new Compound( "-", new Term[] {X,Y} ), new Compound( "p", new Term[] {X,Y} ), XYs } ); Hashtable[] solutions = query.allSolutions(); if ( solutions.length != 1 ){ System.out.println( "bagof(X-Y, p(X,Y), XYs) failed:" ); System.out.println( "\tExpected: 1 solution" ); System.out.println( "\tGot: " + solutions.length ); System.exit( 1 ); } Term term = (Term) solutions[0].get("XYs"); // if ( ! (term instanceof List) ){ if ( ! (term instanceof Compound && ".".equals(((Compound)term).name()) && ((Compound)term).arity()==2) ){ System.out.println( "bagof(X-Y, p(X,Y), XYs) failed:" ); System.out.println( "\tExpected: XYs to be a List" ); System.out.println( "\tGot: " + term ); System.exit( 1 ); } if ( ! term.equals( test_9_solution ) ){ System.out.println( "bagof(X-Y, p(X,Y), XYs) failed:" ); System.out.println( "\tExpected: " + test_9_solution ); System.out.println( "\tGot: " + term ); System.exit( 1 ); } System.out.println( "passed." ); } static void test_10() { System.out.print( "test 10..." ); Query query = new Query( "t" ); try { boolean b = query.hasSolution(); System.out.println( "t failed:" ); System.out.println( "\tExpected: JPLException" ); System.out.println( "\tGot: " + b ); System.exit( 1 ); } catch ( PrologException e ){ } System.out.println( "passed." ); } static void test_11() { System.out.print( "test 11..." ); Term tuple = new Compound( "t", new Term[]{ new Atom( "a" ), new Atom( "b" ), new Atom( "c" ), new Atom( "d" ), new Atom( "e" ) } ); try { Variable X = new Variable("X"); Query query = new Query( "tuple", new Term[] {X} ); java.util.Hashtable solution = query.oneSolution(); Term result = (Term) solution.get("X"); if ( result == null || ! result.equals( tuple ) ){ System.out.println( "failed:" ); System.out.println( "\tresult: " + result ); System.out.println( "\ttuple: " + tuple ); System.exit( 1 ); } Term term; term = new Atom( "a" ); if ( ((Compound)result).arg( 1 ) == null || !((Compound)result).arg( 1 ).equals( term ) ){ System.out.println( "failed:" ); System.out.println( "\t((Compound)result).arg( 1 ): " + ((Compound)result).arg( 1 ) ); System.out.println( "\tterm : " + term ); System.exit( 1 ); } term = new Atom( "b" ); if ( ((Compound)result).arg( 2 ) == null || !((Compound)result).arg( 2 ).equals( term ) ){ System.out.println( "failed:" ); System.out.println( "\t((Compound)result).arg( 2 ): " + ((Compound)result).arg( 2 ) ); System.out.println( "\tterm : " + term ); System.exit( 1 ); } term = new Atom( "e" ); if ( ((Compound)result).arg( 5 ) == null || !((Compound)result).arg( 5 ).equals( term ) ){ System.out.println( "failed:" ); System.out.println( "\t((Compound)result).arg( 5 ): " + ((Compound)result).arg( 5 ) ); System.out.println( "\tterm : " + term ); System.exit( 1 ); } // arg0(6) throws an exception, as I'd expect it to... // if ( ((Compound)result).arg( 7 ) != null ){ // System.out.println( "failed:" ); // System.out.println( "\t((Compound)result).arg( 7 ): " + ((Compound)result).arg( 7 ) ); // System.out.println( "\tshould be null" ); // System.exit( 1 ); // } } catch ( PrologException e ){ System.out.println( "failed" ); e.printStackTrace(); System.exit( 1 ); } System.out.println( "passed." ); } static void test_101() { System.out.print( "test 101..." ); Thread[] threads = new Thread[10]; for ( int i = 0; i < threads.length; ++i ){ threads[i] = new QueryThread( i ); } for ( int i = 0; i < threads.length; ++i ){ threads[i].start(); } for ( int i = 0; i < threads.length; ++i ){ try { threads[i].join(); } catch ( InterruptedException ie ){ ie.printStackTrace(); System.exit( 1 ); } } System.out.println( "passed." ); } private static class QueryThread extends Thread { private int id_ = -1; public QueryThread( int id ) { this.id_ = id; } public java.lang.String toString() { return "(QueryThread id=" + id_ + ")"; } public void run() { Query query = new Query( "p", new Term[] { new Atom("a"), new Atom("a") } ); for ( int i = 0; i < 10; ++i ){ try { query.hasSolution(); } catch ( jpl.JPLException e ){ System.out.println( "Threaded p( a, a ) threw exception: " + e); System.exit( 1 ); } System.out.print( id_ ); Thread.yield(); } for ( int i = 0; i < 10; ++i ){ // synchronized ( Query.lock() ){ try { while ( query.hasMoreSolutions() ){ Thread.yield(); query.nextSolution(); } } catch ( jpl.JPLException e ){ System.out.println( "Threaded p( a, a ) threw exception: " + e); System.exit( 1 ); } System.out.print( id_ ); // } } } } // more to come?? }
Furthermore, for startup, the two files
-L0 -G0 -A0 -T0 -g main -t halt -s /home/samuel/blipstart.pl
user:file_search_path(bio, blipkit(attic)). user:file_search_path(bio, blipkit(biblio)). user:file_search_path(bio, blipkit(bionlp)). user:file_search_path(bio, blipkit(blipcore)). user:file_search_path(bio, blipkit(curation)). user:file_search_path(bio, blipkit(genomic)). user:file_search_path(bio, blipkit(homol)). user:file_search_path(bio, blipkit(metadata)). user:file_search_path(bio, blipkit(obolog)). user:file_search_path(bio, blipkit(omim)). user:file_search_path(bio, blipkit(ontograph)). user:file_search_path(bio, blipkit(ontol)). user:file_search_path(bio, blipkit('ontol/thea')). user:file_search_path(bio, blipkit(pheno)). user:file_search_path(bio, blipkit(phylo)). user:file_search_path(bio, blipkit(rdft)). user:file_search_path(bio, blipkit(sb)). user:file_search_path(bio, blipkit(serval)). user:file_search_path(bio, blipkit(sql)). user:file_search_path(bio, blipkit(stats)). user:file_search_path(bio, blipkit(structure)). user:file_search_path(bio, blipkit(variation)). user:file_search_path(bio, blipkit(web)). user:file_search_path(bio, blipkit(xml)). :- use_module(bio(blipkit)). :- use_module(bio(blipkit_ontol)). :- use_module(bio(blipkit_phylo)). :- use_module(bio(blipkit_fasta)). :- use_module(bio(blipkit_sb)). :- use_module(bio(blipkit_web)).
Comments
Just a sidenote, that I
Just a sidenote, that I needed to store somewhere, about the dependencies for blipkit:
I also had to: ...change the
I now found a not on my disktop that I also had to change the file
/usr/bin/go2prolog
like so:-->
You saved my day
I've been searching for clues why I'm getting null when I do get on Hashtable.
I was following this official tutorial about JPL.
http://www.swi-prolog.org/packages/jpl/java_api/getting_started.html
After checking your code, I found it.
You have to declare a Variable with a string.
And, do get with the initial string.
Thank you very much.
Hidenari