If I submit a command that takes a long time to run,
eg
(1) http://localhost:8000/simple/compute?session=(session)&code=factor(2^1000
-1)
then the immediately returned JSON will have status equals computing.
I have modified my Java program, so that after (1) is submitted,
I keep querying SAGE with
http://localhost:8000/simple/status?session=(session)&cell=(cellId)
until the returned status is done.
Is there a better way to wait for (or be notified of) the completion
of a command ?
Shing
On Jul 20, 12:17 pm, Shing <[EMAIL PROTECTED]> wrote:
> Thanks for the sample code! I have managed to convert it to Java and
> successfully
> execute factor(2006) in sage from Java.
>
> Shing
>
> public class SageSession {
>
> public String getSession(String hostname, String port, String
> password) {
>
> String session = null;
> String httpStr = "http://" + hostname + ":" + port
> + "/simple/login?username=admin&password=" +
> password;
> try {
>
> URL url = new URL(httpStr);
> HttpURLConnection connection = (HttpURLConnection) url
> .openConnection();
> InputStream is = connection.getInputStream();
> BufferedReader br = new BufferedReader(new
> InputStreamReader(is));
> String line;
> while ((line = br.readLine()) != null) {
> //System.out.println("OUT> " + line);
> if (line.indexOf("session") > 0) {
> StringTokenizer tokenizer = new
> StringTokenizer(line,
> "\": ");
> tokenizer.nextElement();
> session = (String)
> tokenizer.nextElement();
> break;
> }
> }
> br.close();
> is.close();
> connection.disconnect();
> }
>
> catch (MalformedURLException e) {
> e.printStackTrace();
> } catch (IOException e) {
> e.printStackTrace();
> }
>
> return session;
> }
>
> /**
> * Execute expression in sage and return the result as a String.
> */
> public String sage(String hostname, String port, String session,
> String expression) {
>
> StringBuffer result = new StringBuffer();
> try {
> String httpStr = "http://" + hostname + ":" + port +
> "/simple/
> compute?session="
> + session + "&code=" +
> URLEncoder.encode(expression,"UTF-8");
> URL url = new URL(httpStr);
> HttpURLConnection connection = (HttpURLConnection) url
> .openConnection();
> InputStream is = connection.getInputStream();
> BufferedReader br = new BufferedReader(new
> InputStreamReader(is));
> String line;
> while ((line = br.readLine()) != null) {
> //System.out.println("OUT> " + line);
> result.append(line +"\n");
>
> }
> br.close();
> is.close();
> connection.disconnect();
> }
>
> catch (MalformedURLException e) {
> e.printStackTrace( );
> } catch (IOException e) {
> e.printStackTrace();
> }
>
> return result.toString();
> }
>
> public static void main(String[] str) throws Exception {
> String host = "localhost";
> String port = "8000";
> String password = "xxx";
>
> SageSession connection = new SageSession();
> String session = connection.getSession(host, port, password);
> System.out.println("session =" + session);
> String expression ="factor(2^12 -1)";
> String result = connection.sage(host, port, session,
> expression);
> System.out.println("expression =" + result );
>
> }
>
> }
>
> On Jul 19, 8:34 pm, "Mike Hansen" <[EMAIL PROTECTED]> wrote:
>
> > Hi Shing,
>
> > You can actually make HTTP calls to the Sage notebook using Robert
> > Bradshaw's simple API. For example, the following is a (condensed)
> > Python script which authenticates with a running Sage notebook.
>
> > import urllib, re
> > def get_url(url):
> > h = urllib.urlopen(url); data = h.read(); h.close(); return data
> > session = None
> > def sage(expression, host="localhost", passwd = "passwd", port = 8000):
> > global session
> > if session is None:
> > login_page =
> > get_url('http://%s:%s/simple/login?username=admin&password=%s' %
> > (host, port, passwd))
> > session = re.match(r'.*"session": "([^"]*)"', login_page,
> > re.DOTALL).groups()[0] #extract the sessionid from the result
> > expression = urllib.quote(expression)
> > res = get_url('http://%s:%s/simple/compute?session=%s&code=%s' %
> > (host, port, session, expression))
> > return res
> > def test_equality(expr1, expr2):
> > res = sage("bool( %s == %s)"%(expr1, expr2))
> > dictionary, res = res.split("___S_A_G_E___")
> > res = res.strip()
> > return True if res == "True" else False
>
> > The function 'sage' takes in a Sage expression and returns the result
> > as a string. You can look at sage/server/simple/twist.py for more
> > examples of how this is used. Doing the same thing from Java wouldn't
> > be difficult.
>
> > --Mike
>
> > On Sat, Jul 19, 2008 at 2:24 PM, Shing <[EMAIL PROTECTED]> wrote:
>
> > > I have upgraded to 3.0.5. Now the time taken to run the factor script
> > > is down to 2s (with 3.0.3 it was 12s)
> > > I am trying to call Sage from a Java web application. So far the only
> > > way I know is to do it indirectly by running
> > > a sage script from Java. Is there a more directly way of calling Sage
> > > from Java ?
> > > The factor script is just a test. In general, my sage script would do
> > > different computation.
>
> > > Thanks!
> > > Shing
>
> > > On Jul 19, 1:45 pm, "William Stein" <[EMAIL PROTECTED]> wrote:
> > >> On Sat, Jul 19, 2008 at 1:53 PM, Shing <[EMAIL PROTECTED]> wrote:
>
> > >> > Hi,
> > >> > I have tried the standalone Python/Script at
> > >> >http://www.sagemath.org/doc/html/tut/node55.html
>
> > >> > to factorize a number.
>
> > >> > #!/usr/bin/env sage
>
> > >> > import sys
> > >> > from sage.all import *
>
> > >> > if len(sys.argv) != 2:
> > >> > print "Usage: %s <n>"%sys.argv[0]
> > >> > print "Outputs the prime factorization of n."
> > >> > sys.exit(1)
>
> > >> > print factor(sage_eval(sys.argv[1]))
>
> > >> > The script takes about 12s to factories 2006. But in the notebook,
> > >> > it takes less than 1 second.
> > >> > I would like to use a standalone script from command line to do some
> > >> > computation. Is there a way to speed it up ?
>
> > >> > I am using Sage 3.0.3 on a Athlon 3200 64bit PC, running OpenSuse 11.
>
> > >> > Thanks in advance for any assistance!
>
> > >> The Sage startup time in sage-3.0.5 is better than in 3.0.3, so you might
> > >> want to try upgrading. Are you *just* factoring integers are do you
> > >> plan
> > >> to do much more? This is fast:
>
> > >> teragon-2:~ was$ time echo "factor(2006)" | sage -gp
> > >> GP/PARI CALCULATOR Version 2.3.3 (released)
> > >> i386 running darwin (ix86/GMP-4.2.1 kernel) 32-bit version
> > >> compiled: May 4 2008, gcc-4.0.1 (Apple Inc. build 5465)
> > >> (readline v5.2 enabled, extended help available)
>
> > >> Copyright (C) 2000-2006 The PARI Group
>
> > >> PARI/GP is free software, covered by the GNU General Public License, and
> > >> comes WITHOUT ANY WARRANTY WHATSOEVER.
>
> > >> Type ? for help, \q to quit.
> > >> Type ?12 for how to get moral (and possibly technical) support.
>
> > >> parisize = 4000000, primelimit = 500000
> > >> %1 =
> > >> [2 1]
>
> > >> [17 1]
>
> > >> [59 1]
>
> > >> Goodbye!
>
> > >> real 0m0.388s
> > >> user 0m0.033s
> > >> sys 0m0.051s
>
> > >> -- William
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---