<!--
   ***************************************************************
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   ***************************************************************
   -->

<html>


<script>
	window.onload=init;
	function init() {
		hide('q2');
		hide('q3');
		show('q1');
	}
	function hide(id) {
		//alert('hide:'+id);
		element = document.getElementById(id)
		element.style.display='none';
	}
	function show(id) {
		//alert('show:'+id);
		element = document.getElementById(id)
		element.style.display='';
	}
	function goLeft(location) {
		if(location == 'q1') {
			hide('q1');
			hide('q2');
			show('q3');
		}
		else if(location == 'q2') {
			hide('q2');
			hide('q3');
			show('q1');
		}
		else if(location == 'q3') {
			hide('q3');
			hide('q1');
			show('q2');
		}
	}
	function goRight(location) {
		if(location == 'q1') {
			hide('q3');
			hide('q1');
			show('q2');
		}
		else if(location == 'q2') {
			hide('q1');
			hide('q2');
			show('q3');
		}
		else if(location == 'q3') {
			hide('q3');
			hide('q2');
			show('q1');
		}
	}
</script>

<div id="intro">
	<h2>What is DUCC?</h2>
	
	<p>
	DUCC stands for Distributed UIMA Cluster Computing. 
	DUCC is a cluster management system providing tooling, management, 
	and scheduling facilities to automate the scale-out of applications 
	written to the UIMA framework. 
	
	<p>
	<i style="color:#009900;">
	Core UIMA
	</i>
	provides a generalized framework for applications that 
	process unstructured information such as human language, 
	but does not provide a scale-out mechanism. 
	<i style="color:#009900;">
	UIMA-AS
	</i>
	provides a scale-out mechanism to distribute UIMA pipelines 
	over a cluster of computing resources, but does not provide job or 
	cluster management of the resources. 
	<i style="color:#009900;">
	UIMA-DUCC 
	</i>
	defines a formal job 
	model that closely maps to a standard UIMA pipeline. Around this 
	job model DUCC provides cluster management services to automate the 
	scale-out of UIMA pipelines over computing clusters.
	
	<h2>What is ducc-mon?</h2>
	
	<p>
	<i style="color:#009900;">
	ducc-mon
	</i>
	stands for Distributed UIMA Cluster Computing Monitor. 
	It comprises a web server that is meant to display information about 
	the running DUCC including: users' Jobs, users' Reservations, users' 
	Services and the DUCC System itself.
	
	<h2>What is the DUCC demo?</h2>
	
	<p>
	The 
	<i style="color:#009900;">
	demo
	</i>
	comprises a DUCC installation within the apache.org domain. 
	A computing cluster has been configured and started, and a continually 
	running driver simulates users? work submissions.
	
	<p>
	Use a browser to visit 
	<a href='http://uima-ducc-vm.apache.org:42133'>http://uima-ducc-vm.apache.org:42133</a>
	which yields
	the associated web server home page. The visitor is free to navigate and 
	explore an actual DUCC working system as a view-only user.
	
	<p>
	The purpose of the web server (known as ducc-mon) is to provide information
	about the running system. It will help to answer questions such as:
</div>

<div id="q1">
	<table>
	<tr>
	<td valign="top">
		<table>
		<tr>
			<td align="center" valign="middle">
				<div>
				<a onClick="goLeft('q1');">
				<img src="images/120px-Go-previous.svg.png" />
				</a>
				</div>
				<div>
				Previous
				<br>
				Question
				</div>
			<td align="center" valign="middle">
				<table>
				<tr>
				<td>
					<table>
					<tr>
					<td>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					<td><img src="images/q1.cloud.png" />
					</table>
				<tr>
				<td>
					<table>
					<caption>1 of 3</caption>
					<tr>
					<td>
						<img src="images/ts-2.0x1.3.jpeg" />
					</table>
				</table>
			<td align="center" valign="middle">
				<div>
				<a onClick="goRight('q1');">
				<img src="images/120px-Go-next.svg.png" />
				</a>
				</div>
				<div>
				Next
				<br>
				Question
				</div>
		</table>
	<td valign="top">
		<img src="images/q1.rhs.png" />
	</table>
</div>

<div id="q2">
	<table>
	<tr>
	<td valign="top">
		<table>
		<tr>
			<td align="center" valign="middle">
				<div>
				<a onClick="goLeft('q2');">
				<img src="images/120px-Go-previous.svg.png" />
				</a>
				</div>
				<div>
				Previous
				<br>
				Question
				</div>
			<td align="center" valign="middle">
				<table>
				<tr>
				<td>
					<table>
					<tr>
					<td>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					<td><img src="images/q2.cloud.png" />
					</table>
				<tr>
				<td>
					<table>
					<caption>2 of 3</caption>
					<tr>
					<td>
						<img src="images/ts-2.0x1.3.jpeg" />
					</table>
				</table>
			<td align="center" valign="middle">
				<div>
				<a onClick="goRight('q2');">
				<img src="images/120px-Go-next.svg.png" />
				</a>
				</div>
				<div>
				Next
				<br>
				Question
				</div>
		</table>
	<td valign="top">
		<img src="images/q2.rhs.png" />
	</table>
</div>

<div id="q3">
	<table>
	<tr>
	<td valign="top">
		<table>
		<tr>
			<td align="center" valign="middle">
				<div>
				<a onClick="goLeft('q3');">
				<img src="images/120px-Go-previous.svg.png" />
				</a>
				</div>
				<div>
				Previous
				<br>
				Question
				</div>
			<td align="center" valign="middle">
				<table>
				<tr>
				<td>
					<table>
					<tr>
					<td>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					<td><img src="images/q3.cloud.png" />
					</table>
				<tr>
				<td>
					<table>
					<caption>3 of 3</caption>
					<tr>
					<td>
						<img src="images/ts-2.0x1.3.jpeg" />
					</table>
				</table>
			<td align="center" valign="middle">
				<div>
				<a onClick="goRight('q3');">
				<img src="images/120px-Go-next.svg.png" />
				</a>
				</div>
				<div>
				Next
				<br>
				Question
				</div>
		</table>
	<td valign="top">
		<img src="images/q3.rhs.png" />
	</table>
</div>
<br/>
<p style="color:cccccc;font-size:-2">This page uses icons (Go-previous.svg and Go-next.svg) licensed to public domain. To view the license please click <a href="license.info">here</a>.
<html>
