2010-05-05 03:04:10 +04:00
|
|
|
<?php
|
|
|
|
|
2015-05-29 14:30:26 +03:00
|
|
|
/*
|
|
|
|
This file is part of moses. Its use is licensed under the GNU Lesser General
|
|
|
|
Public License version 2.1 or, at your option, any later version.
|
|
|
|
*/
|
2011-06-22 01:52:13 +04:00
|
|
|
|
2010-05-05 03:04:10 +04:00
|
|
|
function setup() {
|
|
|
|
$setup = file("setup");
|
|
|
|
head("All Experimental Setups");
|
|
|
|
print "<table border=1 cellpadding=1 cellspacing=0>\n";
|
|
|
|
print "<TR><TD>ID</TD><TD>User</TD><TD>Task</TD><TD>Directory</TD></TR>\n";
|
|
|
|
$rev = array_reverse($setup);
|
|
|
|
while (list($i,$line) = each($rev)) {
|
|
|
|
$dir = explode(";",$line);
|
|
|
|
print "<TR><TD><A HREF=\"?setup=$dir[0]\">$dir[0]</A></TD><TD>$dir[1]</TD><TD>$dir[2]</TD><TD>$dir[3]</TD></TR>\n";
|
|
|
|
}
|
|
|
|
print "</TABLE>\n";
|
2015-04-03 18:47:25 +03:00
|
|
|
print "<p>To add experiment, edit the \"setup\" file.</p>";
|
2010-05-05 03:04:10 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
function overview() {
|
|
|
|
global $evalset;
|
|
|
|
global $experiment,$comment;
|
|
|
|
global $task,$user,$setup;
|
|
|
|
global $dir;
|
|
|
|
global $has_analysis;
|
2010-09-17 17:28:04 +04:00
|
|
|
$has_analysis = array();
|
2010-05-05 03:04:10 +04:00
|
|
|
|
|
|
|
head("Task: $task ($user)");
|
|
|
|
print "<a href=\"http://www.statmt.org/wiki/?n=Experiment.$setup\">Wiki Notes</a>";
|
2015-04-03 18:47:25 +03:00
|
|
|
print " | <a href=\"?\">Overview of experiments</a> | <code>$dir</code><p>";
|
2010-05-05 03:04:10 +04:00
|
|
|
reset($experiment);
|
|
|
|
|
|
|
|
print "<form action=\"\" method=get>\n";
|
|
|
|
output_state_for_form();
|
2011-06-22 01:52:13 +04:00
|
|
|
|
|
|
|
// count how many analyses there are for each test set
|
2010-05-05 03:04:10 +04:00
|
|
|
while (list($id,$info) = each($experiment)) {
|
|
|
|
reset($evalset);
|
|
|
|
while (list($set,$dummy) = each($evalset)) {
|
|
|
|
$analysis = "$dir/evaluation/$set.analysis.$id";
|
2011-06-22 01:52:13 +04:00
|
|
|
$report_info = "$dir/steps/$id/REPORTING_report.$id.INFO";
|
|
|
|
// does the analysis file exist?
|
2010-05-05 03:04:10 +04:00
|
|
|
if (file_exists($analysis)) {
|
2015-05-17 16:04:04 +03:00
|
|
|
if (!array_key_exists($set,$has_analysis)) {
|
2010-09-17 17:28:04 +04:00
|
|
|
$has_analysis[$set] = 0;
|
|
|
|
}
|
2010-05-05 03:04:10 +04:00
|
|
|
$has_analysis[$set]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reset($experiment);
|
|
|
|
|
|
|
|
print "<table border=1 cellpadding=1 cellspacing=0>
|
|
|
|
<tr><td><input type=submit name=diff value=\"compare\"></td>
|
|
|
|
<td align=center>ID</td>
|
|
|
|
<td align=center>start</td>
|
|
|
|
<td align=center>end</td>\n";
|
|
|
|
reset($evalset);
|
|
|
|
|
|
|
|
while (list($set,$dummy) = each($evalset)) {
|
2010-09-17 17:28:04 +04:00
|
|
|
if (array_key_exists($set,$has_analysis)) {
|
2010-05-05 03:04:10 +04:00
|
|
|
print "<td align=center colspan=2>";
|
|
|
|
if ($has_analysis[$set]>=2) {
|
|
|
|
print " <input type=submit name=\"analysis_diff_home\" value=\"$set\">";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
print $set;
|
|
|
|
}
|
|
|
|
print "</td>";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
print "<td align=center>$set</td>";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
print "</tr>\n";
|
|
|
|
while (list($id,$info) = each($experiment)) {
|
|
|
|
$state = return_state_for_link();
|
2010-09-17 17:28:04 +04:00
|
|
|
print "<tr id=\"row-$id\" onMouseOver=\"highlightLine($id);\" onMouseOut=\"highlightBest();\"><td><input type=checkbox name=run[] value=$id><a href=\"?$state&show=config.$id\">cfg</a>|<a href=\"?$state&show=parameter.$id\">par</a>|<a href=\"?$state&show=graph.$id.png\">img</a></td><td><span id=run-$setup-$id><a href='javascript:createCommentBox(\"$setup-$id\");'>[$setup-$id]</a>";
|
|
|
|
if (array_key_exists("$setup-$id",$comment)) {
|
2010-05-05 03:04:10 +04:00
|
|
|
print " ".$comment["$setup-$id"]->name;
|
|
|
|
}
|
|
|
|
print "</span></td><td align=center>".mytime($info->start,0)."</td><td align=center>";
|
|
|
|
|
|
|
|
if (mytime($info->end,1) == "running") {
|
|
|
|
print "<font size=-2>".$info->last_step;
|
|
|
|
if ($info->last_step == "TUNING<BR>tune") {
|
|
|
|
print "<BR>".tune_status($id);
|
|
|
|
}
|
2013-09-26 02:16:53 +04:00
|
|
|
else if ($info->last_step == "TRAINING<BR>run-giza" ||
|
|
|
|
$info->last_step == "TRAINING<BR>run-giza-inverse" ||
|
|
|
|
preg_match('/EVALUATION.+decode/',$info->last_step,$dummy) ||
|
|
|
|
$info->last_step == "TRAINING<BR>extract-phrases") {
|
|
|
|
$module_step = explode("<BR>",$info->last_step);
|
|
|
|
$step_file = "$dir/steps/$id/$module_step[0]_$module_step[1].$id";
|
|
|
|
print "<BR><span id='$module_step[0]-$module_step[1]-$id'><img src=\"spinner.gif\" width=12 height=12></span>";
|
|
|
|
?><script language="javascript" type="text/javascript">
|
|
|
|
new Ajax.Updater("<?php print "$module_step[0]-$module_step[1]-$id"; ?>", '?setStepStatus=' + encodeURIComponent("<?php print $step_file; ?>"), { method: 'get', evalScripts: true });</script>
|
|
|
|
<?php
|
|
|
|
}
|
2010-05-05 03:04:10 +04:00
|
|
|
}
|
2010-09-17 17:28:04 +04:00
|
|
|
else if (property_exists($info,"result")) {
|
2010-05-05 03:04:10 +04:00
|
|
|
print mytime($info->end,1);
|
|
|
|
|
|
|
|
print "<br><font size=-2>";
|
|
|
|
print dev_score("$dir/tuning/moses.ini.$id");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
print "<font color=red>crashed";
|
|
|
|
}
|
|
|
|
|
|
|
|
print "</td>";
|
|
|
|
|
|
|
|
output_score($id,$info);
|
|
|
|
|
|
|
|
print "</tr>\n";
|
|
|
|
}
|
|
|
|
print "</table>";
|
|
|
|
print "<script language=\"javascript\" type=\"text/javascript\">\n";
|
|
|
|
print "var currentComment = new Array();\n";
|
|
|
|
reset($experiment);
|
|
|
|
while (list($id,$info) = each($experiment)) {
|
2010-09-17 17:28:04 +04:00
|
|
|
if (array_key_exists("$setup-$id",$comment)) {
|
2010-05-05 03:04:10 +04:00
|
|
|
print "currentComment[\"$setup-$id\"] = \"".$comment["$setup-$id"]->name."\";\n";
|
|
|
|
}
|
|
|
|
}
|
2010-09-17 17:28:04 +04:00
|
|
|
reset($experiment);
|
|
|
|
$best = array();
|
|
|
|
print "var score = [];\n";
|
|
|
|
while (list($id,$info) = each($experiment)) {
|
|
|
|
reset($evalset);
|
|
|
|
print "score[$id] = [];\n";
|
|
|
|
while (list($set,$dummy) = each($evalset)) {
|
|
|
|
if (property_exists($info,"result") &&
|
|
|
|
array_key_exists($set,$info->result)) {
|
|
|
|
list($score) = sscanf($info->result[$set],"%f%s");
|
|
|
|
if ($score > 0) {
|
|
|
|
print "score[$id][\"$set\"] = $score;\n";
|
2011-06-22 01:52:13 +04:00
|
|
|
if (!array_key_exists($set,$best) || $score > $best[$set]) {
|
2010-09-17 17:28:04 +04:00
|
|
|
$best[$set] = $score;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-05-17 16:04:04 +03:00
|
|
|
else { $score = ""; }
|
2010-09-17 17:28:04 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
print "var best_score = [];\n";
|
|
|
|
reset($evalset);
|
|
|
|
while (list($set,$dummy) = each($evalset)) {
|
2012-09-27 01:57:15 +04:00
|
|
|
if ($best[$set] != "" && $best[$set]>0) {
|
|
|
|
print "best_score[\"$set\"] = ".$best[$set].";\n";
|
|
|
|
}
|
2010-09-17 17:28:04 +04:00
|
|
|
}
|
2010-05-05 03:04:10 +04:00
|
|
|
?>
|
|
|
|
|
|
|
|
// Get the HTTP Object
|
|
|
|
function getHTTPObject(){
|
|
|
|
if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
|
|
|
|
else if (window.XMLHttpRequest) return new XMLHttpRequest();
|
|
|
|
else {
|
|
|
|
alert("Your browser does not support AJAX.");
|
|
|
|
return null;
|
|
|
|
}
|
2015-05-17 16:04:04 +03:00
|
|
|
}
|
2010-05-05 03:04:10 +04:00
|
|
|
function createCommentBox( runID ) {
|
2015-05-17 16:04:04 +03:00
|
|
|
document.getElementById("run-" + runID).innerHTML = "<form onsubmit=\"return false;\"><input id=\"comment-" + runID + "\" name=\"comment-" + runID + "\" size=30><br><input type=submit onClick=\"addComment('" + runID + "');\" value=\"Add Comment\"></form>";
|
2010-05-05 03:04:10 +04:00
|
|
|
if (currentComment[runID]) {
|
|
|
|
document.getElementById("comment-" + runID).value = currentComment[runID];
|
|
|
|
}
|
|
|
|
document.getElementById("comment-" + runID).focus();
|
|
|
|
}
|
|
|
|
|
|
|
|
var httpObject = null;
|
|
|
|
|
|
|
|
function addComment( runID ) {
|
|
|
|
httpObject = null;
|
|
|
|
httpObject = getHTTPObject();
|
|
|
|
if (httpObject != null) {
|
|
|
|
httpObject.onreadystatechange = setComment;
|
|
|
|
httpObject.open("GET", "comment.php?run="+encodeURIComponent(runID)+"&text="
|
|
|
|
+encodeURIComponent(document.getElementById('comment-'+runID).value), true);
|
|
|
|
httpObject.send(null);
|
|
|
|
currentComment[runID] = document.getElementById('comment-'+runID).value;
|
|
|
|
document.getElementById("run-" + runID).innerHTML = "<a href='javascript:createCommentBox(\"" + runID + "\");'>[" + runID + "]</a> " + document.getElementById('comment-'+runID).value;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function setComment() {
|
|
|
|
if(httpObject.readyState == 4){
|
|
|
|
//alert("c:" +httpObject + httpObject.status + " " + httpObject.responseText);
|
|
|
|
httpObject = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-17 17:28:04 +04:00
|
|
|
function highlightBest() {
|
|
|
|
lowlightAll();
|
|
|
|
for (set in best_score) {
|
|
|
|
for (run in score) {
|
|
|
|
var column = "score-"+run+"-"+set;
|
|
|
|
if ($(column)) {
|
2015-05-17 16:04:04 +03:00
|
|
|
if (score[run][set] == best_score[set]) {
|
2010-09-17 17:28:04 +04:00
|
|
|
$(column).setStyle({ backgroundColor: '#a0ffa0'});
|
|
|
|
}
|
|
|
|
else if (score[run][set]+1 >= best_score[set]) {
|
|
|
|
$(column).setStyle({ backgroundColor: '#e0ffe0'});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function highlightLine( id ) {
|
|
|
|
lowlightAll();
|
|
|
|
var row = "row-"+id;
|
|
|
|
$(row).setStyle({ backgroundColor: '#f0f0f0'});
|
|
|
|
for (set in score[id]) {
|
|
|
|
for (run in score) {
|
|
|
|
var column = "score-"+run+"-"+set;
|
|
|
|
if ($(column)) {
|
|
|
|
if (run == id) {
|
|
|
|
$(column).setStyle({ backgroundColor: '#ffffff'});
|
|
|
|
}
|
|
|
|
else {
|
2015-05-17 16:04:04 +03:00
|
|
|
if (score[run][set] < score[id][set]-1) {
|
2010-09-17 17:28:04 +04:00
|
|
|
$(column).setStyle({ backgroundColor: '#ffa0a0'});
|
|
|
|
}
|
|
|
|
else if (score[run][set] < score[id][set]) {
|
|
|
|
$(column).setStyle({ backgroundColor: '#ffe0e0'});
|
|
|
|
}
|
|
|
|
else if (score[run][set] > score[id][set]+1) {
|
|
|
|
$(column).setStyle({ backgroundColor: '#a0ffa0'});
|
|
|
|
}
|
|
|
|
else if (score[run][set] > score[id][set]) {
|
|
|
|
$(column).setStyle({ backgroundColor: '#e0ffe0'});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-05-17 16:04:04 +03:00
|
|
|
}
|
2010-09-17 17:28:04 +04:00
|
|
|
}
|
|
|
|
function lowlightAll() {
|
|
|
|
for (run in score) {
|
|
|
|
var row = "row-"+run
|
|
|
|
if ($(row)) {
|
|
|
|
$(row).setStyle({ backgroundColor: 'transparent' });
|
|
|
|
}
|
|
|
|
for (set in best_score) {
|
|
|
|
var column = "score-"+run+"-"+set;
|
|
|
|
if ($(column)) {
|
|
|
|
$(column).setStyle({ backgroundColor: 'transparent' });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
highlightBest();
|
2010-05-05 03:04:10 +04:00
|
|
|
//-->
|
|
|
|
</script>
|
|
|
|
<?php
|
|
|
|
}
|
|
|
|
|
|
|
|
function mytime($timestamp,$running) {
|
|
|
|
if ($running && $timestamp + 300 > time()) {
|
|
|
|
return "running";
|
|
|
|
}
|
|
|
|
if ($timestamp + 12*3600 > time()) {
|
|
|
|
return strftime("%T",$timestamp);
|
|
|
|
}
|
|
|
|
if ($timestamp + 5*24*3600 > time()) {
|
2013-09-26 02:16:53 +04:00
|
|
|
return strftime("%a %H:%M",$timestamp);
|
2010-05-05 03:04:10 +04:00
|
|
|
}
|
2013-09-26 02:16:53 +04:00
|
|
|
if ($timestamp + 180*24*3600 > time()) {
|
|
|
|
return strftime("%d %b",$timestamp);
|
|
|
|
}
|
|
|
|
return strftime("%d %b %g",$timestamp);
|
2010-05-05 03:04:10 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
function output_score($id,$info) {
|
|
|
|
global $evalset;
|
|
|
|
global $has_analysis;
|
|
|
|
global $setup;
|
2010-09-17 17:28:04 +04:00
|
|
|
global $dir;
|
2010-05-05 03:04:10 +04:00
|
|
|
reset($evalset);
|
|
|
|
$state = return_state_for_link();
|
|
|
|
|
|
|
|
while (list($set,$dummy) = each($evalset)) {
|
2010-09-17 17:28:04 +04:00
|
|
|
if (property_exists($info,"result") &&
|
|
|
|
array_key_exists($set,$info->result)) {
|
|
|
|
$score = $info->result[$set];
|
|
|
|
}
|
|
|
|
else { $score = ""; }
|
|
|
|
print "<td align=center id=\"score-$id-$set\">";
|
2010-05-05 03:04:10 +04:00
|
|
|
|
|
|
|
// print "<table><tr><td>";
|
|
|
|
|
|
|
|
$each_score = explode(" ; ",$score);
|
|
|
|
for($i=0;$i<count($each_score);$i++) {
|
2012-09-27 01:57:15 +04:00
|
|
|
if (preg_match('/([\d\(\)\.\s]+) (BLEU[\-c]*)/',$each_score[$i],$match) ||
|
2014-04-23 16:50:08 +04:00
|
|
|
preg_match('/([\d\(\)\.\s]+) (IBM[\-c]*)/',$each_score[$i],$match) ||
|
|
|
|
preg_match('/([\d\(\)\.\s]+) (METEOR[\-c]*)/',$each_score[$i],$match)) {
|
2012-09-27 01:57:15 +04:00
|
|
|
if ($i>0) { print "<BR>"; }
|
|
|
|
$opened_a_tag = 0;
|
2015-05-17 16:04:04 +03:00
|
|
|
if ($set != "avg") {
|
2012-09-27 01:57:15 +04:00
|
|
|
if (file_exists("$dir/evaluation/$set.cleaned.$id")) {
|
2015-05-17 16:04:04 +03:00
|
|
|
print "<a href=\"?$state&show=evaluation/$set.cleaned.$id\">";
|
2012-09-27 01:57:15 +04:00
|
|
|
$opened_a_tag = 1;
|
|
|
|
}
|
|
|
|
else if (file_exists("$dir/evaluation/$set.output.$id")) {
|
2015-05-17 16:04:04 +03:00
|
|
|
print "<a href=\"?$state&show=evaluation/$set.output.$id\">";
|
2012-09-27 01:57:15 +04:00
|
|
|
$opened_a_tag = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($set == "avg" && count($each_score)>1) { print $match[2].": "; }
|
|
|
|
print $match[1];
|
|
|
|
if ($opened_a_tag) { print "</a>"; }
|
2010-05-05 03:04:10 +04:00
|
|
|
}
|
|
|
|
else {
|
2012-09-27 01:57:15 +04:00
|
|
|
print "-";
|
2010-05-05 03:04:10 +04:00
|
|
|
}
|
|
|
|
}
|
2012-09-27 01:57:15 +04:00
|
|
|
|
2010-05-05 03:04:10 +04:00
|
|
|
print "</td>";
|
2010-09-17 17:28:04 +04:00
|
|
|
if ($has_analysis && array_key_exists($set,$has_analysis)) {
|
2010-05-05 03:04:10 +04:00
|
|
|
print "<td align=center>";
|
|
|
|
global $dir;
|
2011-06-22 01:52:13 +04:00
|
|
|
$analysis = get_analysis_version($dir,$set,$id);
|
|
|
|
if ($analysis["basic"]) {
|
2010-09-17 17:28:04 +04:00
|
|
|
print "<a href=\"?analysis=show&setup=$setup&set=$set&id=$id\">Ⓐ</a> <input type=checkbox name=analysis-$id-$set value=1>";
|
2010-05-05 03:04:10 +04:00
|
|
|
}
|
|
|
|
print "</td>";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function tune_status($id) {
|
|
|
|
global $dir;
|
|
|
|
$max_iteration = 0;
|
2011-06-17 03:43:29 +04:00
|
|
|
if (! file_exists($dir."/tuning/tmp.".$id)) { return ""; }
|
2010-05-05 03:04:10 +04:00
|
|
|
$d = dir($dir."/tuning/tmp.".$id);
|
|
|
|
while (false !== ($entry = $d->read())) {
|
2015-05-17 16:04:04 +03:00
|
|
|
if (preg_match('/run(\d+).moses.ini/',$entry,$match)
|
2010-05-05 03:04:10 +04:00
|
|
|
&& $match[1] > $max_iteration) {
|
|
|
|
$max_iteration = $match[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($max_iteration <= 1) { return $max_iteration; }
|
|
|
|
return dev_score("$dir/tuning/tmp.$id/run$max_iteration.moses.ini");
|
|
|
|
}
|
|
|
|
|
|
|
|
function dev_score($moses_ini) {
|
2010-09-17 17:28:04 +04:00
|
|
|
if (! file_exists($moses_ini)) { return ""; }
|
2010-05-05 03:04:10 +04:00
|
|
|
$moses_ini = file($moses_ini);
|
2010-09-17 17:28:04 +04:00
|
|
|
$last_iter = -1;
|
|
|
|
$info = "";
|
2010-05-05 03:04:10 +04:00
|
|
|
while (list($id,$line) = each($moses_ini)) {
|
|
|
|
if (preg_match('/# BLEU ([\d\. \-\>]+)/',$line,$match)) {
|
|
|
|
$info = $match[1];
|
|
|
|
}
|
|
|
|
if (preg_match('/# We were before running iteration (\d+)/',$line,$match)) {
|
|
|
|
$last_iter = $match[1];
|
|
|
|
}
|
|
|
|
}
|
2010-09-17 17:28:04 +04:00
|
|
|
if ($last_iter>=0) { $info = "$last_iter: $info"; };
|
2010-05-05 03:04:10 +04:00
|
|
|
return $info;
|
|
|
|
}
|
|
|
|
|
|
|
|
function output_state_for_form() {
|
|
|
|
global $setup;
|
|
|
|
print "<input type=hidden name=setup value=\"$setup\">\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
function return_state_for_link() {
|
|
|
|
global $setup;
|
|
|
|
return "setup=$setup";
|
|
|
|
}
|
|
|
|
|
|
|
|
function show() {
|
|
|
|
global $dir;
|
|
|
|
$extra = "";
|
2010-09-17 17:28:04 +04:00
|
|
|
if (preg_match("/\.(\d+)/",$_GET["show"],$match)) {
|
|
|
|
$run = $match[1];
|
|
|
|
if (file_exists($dir."/steps/new") || file_exists($dir."/steps/$run")) {
|
|
|
|
$extra = "$run/";
|
|
|
|
}
|
2010-05-05 03:04:10 +04:00
|
|
|
}
|
|
|
|
|
2010-09-17 17:28:04 +04:00
|
|
|
$fullname = $dir."/steps/".$extra.$_GET["show"];
|
2015-05-17 16:04:04 +03:00
|
|
|
if (preg_match("/\//",$_GET["show"])) {
|
2010-09-17 17:28:04 +04:00
|
|
|
$fullname = $dir."/".$_GET["show"];
|
2010-05-05 03:04:10 +04:00
|
|
|
}
|
|
|
|
if (preg_match("/graph/",$fullname)) {
|
|
|
|
header("Content-type: image/png");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
header("Content-type: text/plain");
|
|
|
|
}
|
|
|
|
readfile($fullname);
|
|
|
|
exit;
|
|
|
|
}
|
2013-09-26 02:16:53 +04:00
|
|
|
|
|
|
|
function set_step_status($fileName) {
|
|
|
|
$cmd = "./progress.perl $fileName 2>/dev/null";
|
|
|
|
#print $cmd."<p>";
|
|
|
|
system($cmd);
|
|
|
|
}
|