Skip to content
Snippets Groups Projects
Commit cd3c9c6b authored by Tim Hunt's avatar Tim Hunt
Browse files

Integrate the CAS chat and healthcheck scripts into Moodle better.

parent ec7ab517
No related branches found
No related tags found
No related merge requests found
......@@ -14,23 +14,35 @@
// You should have received a copy of the GNU General Public License
// along with Stack. If not, see <http://www.gnu.org/licenses/>.
require_once(dirname(__FILE__).'/../../../../config.php');
/**
* This script lets the user send commands to the Maxima, and see the response.
* This can be useful for learning about the CAS syntax, and also for testing
* that maxima is working correctly.
*
* @copyright 2012 University of Birmingham
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(dirname(__FILE__).'/../../../config.php');
require_once($CFG->dirroot .'/course/lib.php');
require_once($CFG->libdir .'/filelib.php');
require_once(dirname(__FILE__) . '/../locallib.php');
require_once('stringutil.class.php');
require_once('options.class.php');
require_once('cas/castext.class.php');
require_once('cas/casstring.class.php');
require_once('cas/cassession.class.php');
require_once(dirname(__FILE__) . '/locallib.php');
require_once(dirname(__FILE__) . '/stack/stringutil.class.php');
require_once(dirname(__FILE__) . '/stack/options.class.php');
require_once(dirname(__FILE__) . '/stack/cas/castext.class.php');
require_once(dirname(__FILE__) . '/stack/cas/casstring.class.php');
require_once(dirname(__FILE__) . '/stack/cas/cassession.class.php');
require_login();
$context = context_system::instance();
require_capability('moodle/site:config', $context);
$PAGE->set_context($context);
$PAGE->set_url('/question/type/stack/stack/test.php');
$PAGE->set_url('/question/type/stack/caschat.php');
$title = stack_string('chattitle');
$PAGE->set_title($title);
// Enable testing of CAStext in with a background of a non-trivial session.
$a1 = array('a:x^2', 'b:(x+1)^2');
......@@ -50,28 +62,19 @@ if ($string) {
}
echo $OUTPUT->header();
?>
<h1 class="section">Test the connection to the CAS</h1>
<br />
<p>
This page enables CAS text to be evaluated directly. It is a simple script which is a useful minimal example, and a
handy way to check if the CAS is working, and to test various inputs.
</p>
<?php
echo $OUTPUT->heading($title);
echo html_writer::tag('p', stack_string('chatintro'));
if ($string) {
echo '<p>', format_text($displaytext), '</p>';
html_writer::tag('p', format_text($displaytext));
echo $errs;
}
?>
<form action="test.php" method="POST">
<!--<textarea cols="80" rows="5" name="cas">@ diff(x^5, x) @ \[ @diff(x^3, x)@ \]</textarea><br /><br /> -->
<textarea cols="80" rows="5" name="cas"><?php echo $string;?></textarea><br /><br />
<input type="submit" value="Chat" />
</form>
<?php
echo html_writer::tag('form',
html_writer::tag('p', html_writer::tag('textarea', $string,
array('cols' => 80, 'rows' => 5, 'name' => 'cas'))) .
html_writer::tag('p', html_writer::empty_tag('input',
array('type' => 'submit', 'value' => stack_string('chat')))),
array('action' => $PAGE->url, 'method' => 'post'));
echo $OUTPUT->footer();
<?php
// This file is part of Stack - http://stack.bham.ac.uk//
//
// Stack is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Stack 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Stack. If not, see <http://www.gnu.org/licenses/>.
/**
* This script helps verify that the stack is installed correctly, and that
* all the parts are working properly, including the conection to the CAS,
* graph plotting, and equation rendering.
*
* @copyright 2012 University of Birmingham
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(dirname(__FILE__).'/../../../config.php');
require_once($CFG->dirroot .'/course/lib.php');
require_once($CFG->libdir .'/filelib.php');
require_once(dirname(__FILE__) . '/locallib.php');
require_once(dirname(__FILE__) . '/stack/stringutil.class.php');
require_once(dirname(__FILE__) . '/stack/options.class.php');
require_once(dirname(__FILE__) . '/stack/cas/castext.class.php');
require_once(dirname(__FILE__) . '/stack/cas/casstring.class.php');
require_once(dirname(__FILE__) . '/stack/cas/cassession.class.php');
require_once(dirname(__FILE__) . '/stack/cas/installhelper.class.php');
require_login();
$context = context_system::instance();
require_capability('moodle/site:config', $context);
$PAGE->set_context($context);
$PAGE->set_url('/question/type/stack/healthcheck.php');
$title = stack_string('healthcheck');
$PAGE->set_title($title);
$sampletex = '\sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}.';
$samplecastext = 'The derivative of @ x^4/(1+x^4) @ is $$ \frac{d}{dx} \frac{x^4}{1+x^4} = @ diff(x^4/(1+x^4),x) @. $$';
$sampleplots = 'Two example plots below. @plot([x^4/(1+x^4),diff(x^4/(1+x^4),x)],[x,-3,3])@ @plot([sin(x),x,x^2,x^3],[x,-3,3],[y,-3,3])@';
echo $OUTPUT->header();
echo $OUTPUT->heading($title);
// LaTeX
echo $OUTPUT->heading(stack_string('healthchecklatex'), 3);
echo html_writer::tag('p', stack_string('healthchecklatexintro'));
echo html_writer::tag('dt', stack_string('texdoubledollar'));
echo html_writer::tag('dd', format_text('$$' . $sampletex . '$$'));
echo html_writer::tag('dt', stack_string('texsingledollar'));
echo html_writer::tag('dd', format_text('$' . $sampletex . '$'));
echo html_writer::tag('dt', stack_string('texdisplayedbracket'));
echo html_writer::tag('dd', format_text('\[' . $sampletex . '\]'));
echo html_writer::tag('dt', stack_string('texinlinebracket'));
echo html_writer::tag('dd', format_text('\(' . $sampletex . '\)'));
// Maxima config
echo $OUTPUT->heading(stack_string('healthcheckconfig'), 3);
echo html_writer::tag('p', stack_string('healthcheckconfigintro'));
stack_cas_configuration::verify_maximalocal_exists();
echo html_writer::tag('textarea', stack_cas_configuration::generate_maximalocal_contents(),
array('readonly' => 'readonly', 'wrap' => 'virtual'));
// Test Maxima connection
echo $OUTPUT->heading(stack_string('healthcheckconnect'), 3);
echo html_writer::tag('p', stack_string('healthcheckconnectintro'));
echo html_writer::tag('pre', s($samplecastext));
$ct = new stack_cas_text($samplecastext);
$displaytext = $ct->get_display_castext();
$errs = $ct->get_errors();
echo html_writer::tag('p', format_text($displaytext));
echo $errs;
// Test plots
echo $OUTPUT->heading(stack_string('healthcheckplots'), 3);
echo html_writer::tag('p', stack_string('healthcheckplotsintro'));
echo html_writer::tag('pre', s($sampleplots));
$ct = new stack_cas_text($sampleplots);
$displaytext = $ct->get_display_castext();
$errs = $ct->get_errors();
echo html_writer::tag('p', format_text($displaytext));
echo $errs;
echo $OUTPUT->footer();
......@@ -54,6 +54,26 @@ $string['notanswered'] = 'Not answered';
$string['true'] = 'True';
$string['ddl_empty'] = 'No choices were provided for this drop-down. Please input a set of values link a,b,c,d';
// Support scripts (CAS chat, healthcheck, etc.)
$string['chat'] = 'Send to the CAS';
$string['chat_desc'] = 'The <a href="{$a->link}">CAS chat script</a> lets you test the connection to the CAS, and try out Maxima syntax.';
$string['chatintro'] = 'This page enables CAS text to be evaluated directly. It is a simple script which is a useful minimal example, and a handy way to check if the CAS is working, and to test various inputs.';
$string['chattitle'] = 'Test the connection to the CAS';
$string['healthcheck'] = 'STACK healthcheck';
$string['healthcheck_desc'] = 'The <a href="{$a->link}">healthcheck script</a> helps you verify that all aspects of Stack are working properly.';
$string['healthcheckconfig'] = 'Maxima configuration file';
$string['healthcheckconfigintro'] = 'Trying to automatically write the Maxima configuration file.';
$string['healthcheckconnect'] = 'Trying to connect to the CAS';
$string['healthcheckconnectintro'] = 'We are trying to evaluate the following cas text:';
$string['healthchecklatex'] = 'Check LaTeX is being converted correctly';
$string['healthchecklatexintro'] = 'STACK generates LaTeX on the fly, and enables teachers to write LaTeX in questions. It assumes that LaTeX will be converted by a moodle filter. Below are samples of displayed and inline expressions in LaTeX which should be appear correctly in your browser. Problems here indicate incorrect moodle filter settings, not faults with STACK itself. Stack only uses the single and double dollar notation itself, but some question authors may be relying on the other forms.';
$string['healthcheckplots'] = 'Graph plotting';
$string['healthcheckplotsintro'] = 'There should be two different plots. If two identical plots are seen then this is an error in naming the plot files. If no errors are returned, but a plot is not displayed then one of the following may help. (i) check read permissions on the two temporary directories. (ii) change the options used by GNUPlot to create the plot. Currently there is no web interface to these options.';
$string['texdisplayedbracket'] = 'Displayed bracket';
$string['texinlinebracket'] = 'Inline bracket';
$string['texdoubledollar'] = 'Double dollar';
$string['texsingledollar'] = 'Single dollar';
// casstring.class.php
$string['stackCas_spaces'] = 'Spaces found in expression: ';
$string['stackCas_percent'] = '&#037; found in expression: ';
......
......@@ -52,3 +52,12 @@ $settings->add(new admin_setting_configcheckbox('qtype_stack/casdebugging',
get_string('settingcasdebugging', 'qtype_stack'),
get_string('settingcasdebugging_desc', 'qtype_stack'), 0));
$settings->add(new admin_setting_heading('healthcheck',
get_string('healthcheck', 'qtype_stack'),
get_string('healthcheck_desc', 'qtype_stack',
array('link' => (string) new moodle_url('/question/type/stack/healthcheck.php')))));
$settings->add(new admin_setting_heading('chat',
get_string('chattitle', 'qtype_stack'),
get_string('chat_desc', 'qtype_stack',
array('link' => (string) new moodle_url('/question/type/stack/caschat.php')))));
......@@ -281,8 +281,7 @@ class stack_cas_maxima_connector {
$ts = substr_count($strin, '[TimeStamp');
if ($ts != 1) {
$this->debuginfo .= 'receive_raw_maxima: no timestamp returned.<br />';
$errors = true;
return null;
return array();
} else {
$result = strstr($strin, '[TimeStamp'); //remove everything before the timestamp
}
......
<?php
// This file is part of Stack - http://stack.bham.ac.uk//
//
// Stack is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Stack 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Stack. If not, see <http://www.gnu.org/licenses/>.
/**
* The file provides helper code for creating the files needed to connect to the CAS.
*/
require_once(dirname(__FILE__).'/../../../../../config.php');
require_once(dirname(__FILE__) . '/../../locallib.php');
require_once(dirname(__FILE__) . '/../stringutil.class.php');
class stack_cas_configuration {
/** @var string the date when these settings were worked out. */
protected $date;
/**
* Constructor, initialises all the settings.
*/
public function __construct() {
global $CFG;
$settings = get_config('qtype_stack');
$this->date = date("F j, Y, g:i a");
$maximacodepath = new STACK_StringUtil($CFG->dirroot . '/question/type/stack/stack/maxima');
$this->maximacodepath = $maximacodepath->convertSlashPaths();
$logpath = new STACK_StringUtil($CFG->dataroot . '/stack');
$this->logpath = $logpath->convertSlashPaths();
$vnum = substr($settings->maximaversion, 2);
$this->blocksettings = array();
$this->blocksettings['MAXIMA_VERSION_NUM'] = $vnum;
$this->blocksettings['MAXIMA_VERSION'] = $settings->maximaversion;
$this->blocksettings['TMP_IMAGE_DIR'] = $CFG->dataroot . '/stack/tmp/';
$this->blocksettings['IMAGE_DIR'] = $CFG->dataroot . '/stack/plots/';
$this->blocksettings['URL_BASE'] = moodle_url::make_file_url('/question/type/stack/plot.php', '');
// These are used by the GNUplot "set terminal" command. Currently no user interface...
$this->blocksettings['PLOT_TERMINAL'] = 'png';
$this->blocksettings['PLOT_TERM_OPT'] = 'large transparent size 450,300';
if ($settings->platform == 'win') {
$this->blocksettings['DEL_CMD'] = 'del';
$this->blocksettings['GNUPLOT_CMD'] =
$this->get_plotcommand_win($vnum, $settings->maximaversion);
} else {
$this->blocksettings['DEL_CMD'] = "rm";
$this->blocksettings['GNUPLOT_CMD' ] = $settings->plotcommand;
}
}
/**
* Try to guess the gnuplot command on Windows.
* @return string the command.
*/
public function get_plotcommand_win($vnum, $maximaversion) {
if ($settings->plotcommand && $settings->plotcommand != 'gnuplot') {
return $settings->plotcommand;
}
// This does its best to find your version of Gnuplot...
if ($vnum > 25) {
return '"c:/Program Files/Maxima-' . $maximaversion . '-gcl/gnuplot/wgnuplot.exe"';
} else if ($vnum > 23) {
return '"c:/Program Files/Maxima-' . $maximaversion . '/gnuplot/wgnuplot.exe"';
} else {
return '"c:/Program Files/Maxima-' . $maximaversion . '/bin/wgnuplot.exe"';
}
}
public function get_maximalocal_contents() {
$contents = <<<END
/* ***********************************************************************/
/* This file is automatically generated at installation time. */
/* The purpose is to transfer configuration settings to Maxima. */
/* Hence, you should not edit this file. Edit your configuration. */
/* This file is regularly overwritten, so your changes will be lost. */
/* ***********************************************************************/
/* File generated on {$this->date} */
/* Add the location to Maxima's search path */
file_search_maxima:append( [sconcat("{$this->maximacodepath}/###.{mac,mc}")] , file_search_maxima)$
file_search_lisp:append( [sconcat("{$this->maximacodepath}/###.{lisp}")] , file_search_lisp)$
file_search_maxima:append( [sconcat("{$this->logpath}/###.{mac,mc}")] , file_search_maxima)$
file_search_lisp:append( [sconcat("{$this->logpath}/###.{lisp}")] , file_search_lisp)$
STACK_SETUP(ex):=block(
END;
foreach ($this->blocksettings as $name => $value) {
$contents .= <<<END
{$name}:"{$value}",
END;
}
$contents .= <<<END
true)$
/* Load the main libraries */
load("stackmaxima.mac")$
END;
return $contents;
}
/**
* Check whether the maximalocal.mac file exists, and if not, create it.
*/
public static function verify_maximalocal_exists() {
if (!is_readable(self::maximalocal_location())) {
self::create_maximalocal();
}
}
/**
* Get the full path for the maximalocal.mac file.
* @return string the full path to where the maximalocal.mac file should be stored.
*/
public static function maximalocal_location() {
global $CFG;
return $CFG->dataroot . '/stack/maximalocal.mac';
}
/**
* Create the maximalocal.mac file, overwriting it if it already exists.
*/
public static function create_maximalocal() {
make_upload_directory('stack');
make_upload_directory('stack/tmp');
make_upload_directory('stack/plots');
file_put_contents(self::maximalocal_location(),
self::generate_maximalocal_contents());
}
/**
* Generate the contents for the maximalocal configuration file.
* @return string the contets that the maximalocal.mac file should have.
*/
public static function generate_maximalocal_contents() {
$settings = new self();
return $settings->get_maximalocal_contents();
}
}
<?php
// This file is part of Stack - http://stack.bham.ac.uk//
//
// Stack is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Stack 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Stack. If not, see <http://www.gnu.org/licenses/>.
require_once(dirname(__FILE__).'/../../../../config.php');
require_once($CFG->dirroot .'/course/lib.php');
require_once($CFG->libdir .'/filelib.php');
require_once(dirname(__FILE__) . '/../locallib.php');
require_once('stringutil.class.php');
require_once('options.class.php');
require_once('cas/castext.class.php');
require_once('cas/casstring.class.php');
require_once('cas/cassession.class.php');
// TODO: translate this page....
require_login();
$context = context_system::instance();
require_capability('moodle/site:config', $context);
$PAGE->set_context($context);
$PAGE->set_url('/question/type/stack/stack/test.php');
function stack_generate_maximalocal() {
global $CFG;
//print_r($CFG);
$settings = get_config('qtype_stack');
$maxloc = "/* ***********************************************************************/\n";
$maxloc .= "/* This file is automatically generated at installation time. */\n";
$maxloc .= "/* The purpose is to transfer configuration settings to Maxima. */\n";
$maxloc .= "/* Hence, you should not edit this file. Edit your configuration. */\n";
$maxloc .= "/* This file is regularly overwritten, so your changes will be lost. */\n";
$maxloc .= "/* ***********************************************************************/\n\n";
$maxloc .= "/* File generated on ".date("F j, Y, g:i a")." */\n\n";
$dirroot = $CFG->dirroot;
$root = new STACK_StringUtil($dirroot.'\question\type\stack\stack\maxima');
$docroot = $root->convertSlashPaths();
$maxloc .= "/* Add the location to Maxima's search path */\n";
$maxloc .= "file_search_maxima:append( [sconcat(\"{$docroot}/###".'.{mac,mc}")] , file_search_maxima)$'."\n";
$maxloc .= "file_search_lisp:append( [sconcat(\"{$docroot}/###".'.{lisp}")] , file_search_lisp)$'."\n";
//add in the log directory to the search path
$dataroot = $CFG->dataroot;
$root = new STACK_StringUtil($dataroot.'/stack');
$logs = $root->convertSlashPaths();
$maxloc .= "file_search_maxima:append( [sconcat(\"{$logs}/###".'.{mac,mc}")] , file_search_maxima)$'."\n";
$maxloc .= "file_search_lisp:append( [sconcat(\"{$logs}/###".'.{lisp}")] , file_search_lisp)$'."\n";
$maxloc .="\n\nSTACK_SETUP(ex):=block(\n";
$vnum = substr($settings->maximaversion,2);
$maxloc .=" MAXIMA_VERSION_NUM:$vnum,\n";
// Create an array of Maxima settings.
// These are used by the GNUplot "set terminal" command. Currently no user interface...
$maximalocal['MAXIMA_VERSION'] = $settings->maximaversion;
$maximalocal['PLOT_TERMINAL'] = 'png'; // 'gif' is not recommended. See GNUPlot documentation.
$maximalocal['PLOT_TERM_OPT'] = 'large transparent size 450,300';
$platform = $settings->platform;
// Windows
if ('win' == $platform) {
$maximalocal['DEL_CMD'] = 'del';
if ($settings->plotcommand == 'gnuplot' or $settings->plotcommand == '') {
// This does its best to find your version of Gnuplot...
if ($vnum>25) {
$maximalocal['GNUPLOT_CMD'] = '"c:/Program Files/Maxima-'.$settings->maximaversion.'-gcl/gnuplot/wgnuplot.exe"';
} else if ($vnum>23) {
$maximalocal['GNUPLOT_CMD'] = '"c:/Program Files/Maxima-'.$settings->maximaversion.'/gnuplot/wgnuplot.exe"';
} else {
$maximalocal['GNUPLOT_CMD'] = '"c:/Program Files/Maxima-'.$settings->maximaversion.'/bin/wgnuplot.exe"';
}
} else {
$maximalocal['GNUPLOT_CMD'] = $settings->plotcommand;
}
} else {
$maximalocal['DEL_CMD'] = "rm";
$maximalocal['GNUPLOT_CMD' ] = $settings->plotcommand;
}
$maximalocal['TMP_IMAGE_DIR'] = $path = $CFG->dataroot . '/stack/';
//TODO where do we put plots properly?!
$maximalocal['IMAGE_DIR'] = $CFG->dataroot . '/stack/plots/';
$maximalocal['URL_BASE'] = moodle_url::make_file_url('/question/type/stack/plot.php', '');
// Loop over this array to format them correctly...
foreach ($maximalocal as $var => $val) {
if ('win' == $platform and 'URL_BASE' != $var ) {
$val = addslashes(str_replace( '/', '\\', $val));
}
$maxloc .=" $var:\"$val\",\n";
}
$maxloc .=" true)$\n\n";
$maxloc .= "/* Load the main libraries */\n";
$maxloc .= "load(\"stackmaxima.mac\")\$\n";
echo '<pre>'.$maxloc.'</pre>';
make_upload_directory('stack');
$fh = fopen($dataroot.'/stack/maximalocal.mac','w');
if (false === $fh) {
throw new Exception('Failed to write Maxima configuration file.');
} else {
fwrite($fh,$maxloc);
fclose($fh);
}
return true;
}
echo $OUTPUT->header();
?>
<h1>STACK healthcheck</h1>
<h2>Check LaTeX is being converted correctly</h2>
STACK generates LaTeX on the fly, and enables teachers to write LaTeX in questions.
It assumes that LaTeX will be converted by a moodle filter. Below are samples of displayed and inline expressions in LaTeX which should be
appear correctly in your browser. Problems here indicate incorrect moodle filter settings, not faults with STACK itself.
<h3>Single and double dollar math environments</h3>
<?php echo format_text('$$ \sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}.$$'); ?>
<br />
<?php echo format_text('$ \sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}.$'); ?>
<h3>Matching displayed and inline LaTeX tags.</h3>
<?php echo format_text('\[ \sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}.\]'); ?>
<br />
<?php echo format_text('\( \sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}.\)'); ?>
<br />
(These are currently not generated by STACK on the fly, but may be written by some question authors.)
<h2>Trying to automatically write the Maxima configuration file</h2>
<?php
if (stack_generate_maximalocal()) {
echo 'Success!';
}
echo '<h2>Trying to connect to the CAS</h2>';
echo '<p>We are trying to evaluate the following cas text:</p>';
$string = 'The derivative of @ x^4/(1+x^4) @ is $$ \frac{d}{dx} \frac{x^4}{1+x^4} = @ diff(x^4/(1+x^4),x) @. $$';
echo '<pre>'.$string.'</pre>';
$ct = new stack_cas_text($string);
$displaytext = $ct->get_display_castext();
$errs = $ct->get_errors();
echo '<p>', format_text($displaytext), '</p>';
echo $errs;
echo '<p>We are trying to evaluate the following cas text:</p>';
$string = 'Two example plots below. @plot([x^4/(1+x^4),diff(x^4/(1+x^4),x)],[x,-3,3])@ @plot([sin(x),x,x^2,x^3],[x,-3,3],[y,-3,3])@';
echo '<pre>'.$string.'</pre>';
$ct = new stack_cas_text($string);
$displaytext = $ct->get_display_castext();
$errs = $ct->get_errors();
echo '<p>', format_text($displaytext), '</p>';
echo $errs;
echo '<p>There should be two different plots. If two identical plots are seen then this is an error in naming the plot files. If no errors are returned, but a plot is not displayed then one of the following may help. (i) check read permissions on the two temporary directories. (ii) change the options used by GNUPlot to create the plot. Currently there is no web interface to these options.</p>';
echo $OUTPUT->footer();
.path-question-type-stack dt {
font-weight: bold;
}
.path-question-type-stack dd {
margin-left: 2em;
}
#page-question-type-stack-healthcheck textarea {
font-family: monospace;
font-size: 0.8em;
width: 100%;
height: 32em;
white-space: pre;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment