02/09/2013 écrit par Cyril GRANDJEAN

OCA_JavaSE7Programmer_clr

Après avoir révisé pendant l’été, j’ai passé l’examen 1Z0-803 – Java SE 7 Programmer I que j’ai réussit avec un pourcentage de 85 % (77 % est requis pour réussir la certification Oracle Certified Associate, Java SE 7 Programmer).

Vous pourrez trouver le programme de l’examen sur ce lien.

La prochaine étape est de réussir l’examen 1Z0-804 – Java SE 7 Programmer II dans le but de devenir certifié Oracle Certified Professional, Java SE 7 Programmer.

03/08/2013 écrit par Cyril GRANDJEAN

Quand vous développez une version de votre application web, vous aurez souvent besoin de créer une procédure de test qui testera toutes les fonctionnalités de votre application web. Ensuite, vous allez exécuter tous ces tests fonctionnels manuellement dans le but de vérifier qu’aucune régression n’est apparue. Les tests fonctionnels manuels sont long, ennuyeux et peuvent être sujet à des erreurs humaines.

Vous pouvez éviter tous ces désavantages en automatisant vos tests fonctionnels en utilisant la librairie Selenium. En utilisant la librairie Selenium avec Java, vous serez capable d’automatiser vos actions du navigateur web and vous serez capable de vérifier que ces actions ont le comportement souhaité.

Nous prendrons exemple de ce programme PHP basique:

<?php
session_start();

//Nous ajoutons l'élément à l'intérieur d'un tableau en session
if(isset($_POST['elementToAdd']))
{
	//Si le tableau est déjà crée
	if(is_array($_SESSION['array']))
	{
		//Limite de 10 éléments
		if(sizeof($_SESSION['array']) < 10)
		{
			//Nous ajoutons notre élément
			array_push($_SESSION['array'],$_POST['elementToAdd']);
		}
	}
	else
	{
		//Nous créons un nouveau tableau
		$_SESSION['array'] = array($_POST['elementToAdd']);
	}
}
//Nous supprimons un élément du tableau en session
else if(isset($_POST['elementToDelete']))
{
	unset($_SESSION['array'][array_search($_POST['elementToDelete'], $_SESSION['array'])]);
}
?>
<html>
<head>
</head>
<body>
	<?php
	//Nous affichons le tableau HTML si il y a des éléments en session
	if(isset($_SESSION['array']) && is_array($_SESSION['array']) && sizeof($_SESSION['array']) > 0)
	{
	?>
		<table>
			<?php
			//Nous affichons nos éléments en session
			foreach ($_SESSION['array'] as $value)
			{
			?>
				<tr class="aRow">
					<td class="rowValue">
						<?php echo $value ?>
					</td>
					<td>
						<form method="post">
							<input type="hidden" name="elementToDelete" value="<?php echo $value ?>" />
							<input type="submit" class="deleteButton" value="Supprimer l'élément" />
						</form>
					</td>
				</tr>
			<?php
			}
			?>
		</table>
	<?php
	}	
	?>
	
	<form method="post">
		<input name="elementToAdd" type="text" />
		<input id="submitButton" type="submit" value="Ajouter l'élément" />
	</form>
</body>
</html>

Vous pouvez cliquer ici pour voir le résultat de ce script PHP ici .

A l’intérieur de ce script PHP, nous avons un formulaire que nous utiliserons pour ajouter un élément à l’intérieur d’une session PHP limitée à 10 éléments uniquement. Quand un élément est ajouté au tableau, nous pouvons le supprimer en cliquant sur le bouton supprimer.

Nous allons ensuite créer la procédure de tests fonctionnels suivante que nous allons automatiser avec Selenium:

  • Nous ajoutons un élément à l’intérieur du tableau et nous vérifions qu’il est bien ajouté.
  • Nous supprimons l’élément du tableau et nous vérifions que l’élément est bien supprimé.
  • Nous testons la limite de 10 éléments
public class SeleniumClass {

    /**
     * Driver du navigateur web
     */
    private WebDriver driver;

    /**
     * Code à exécuter avant chaque test JUnit
     */
    @Before
    public void setUp() {

        //Nous créons notre driver Firefox
        driver = new FirefoxDriver();

        //Nous l'initialisons avec une valeur maximale de 5 secondes
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    }

    /**
     * Test JUnit de nos tests fonctionnels
     */
    @Test
    public void testElementPage()
    {
        //Nous chargeons notre page web
        driver.get("http://www.cyril-grandjean.fr/fr/selenium.php");

        //Nous trouvons le champ texte avec le nom elementToAdd que nous remplissons avec la valeur element to add
        driver.findElement(By.name("elementToAdd")).sendKeys("element to add");

        //Nous cliquons sur le boutton avec l'id submitButton
        driver.findElement(By.id("submitButton")).click();

        //Nous vérifions qu'un élément avec la classe rowValue a été ajouté
        assert driver.findElements(By.className("rowValue")).size() == 1;

        //Nous vérifions la valeur de l'élément dans le tableau HTML
        assert driver.findElement(By.className("rowValue")).getText().equals("element to add");

        //Nous vérifions le champ hidden du formulaire pour supprimer un élément en vérifiant l'attribut value
        assert driver.findElement(By.name("elementToDelete")).getAttribute("value").equals("element to add");

        //Nous supprimons l'élément en cliquant sur le boutton supprimer
        driver.findElement(By.className("deleteButton")).click();

        //Nous vérifions que l'élément a bien été supprimé
        assert driver.findElements(By.className("rowValue")).size() == 0;

        //Nous essayons d'ajouter 11 éléments
        for(int counterElementAdded = 0; counterElementAdded < 11; counterElementAdded++)
        {
             //Nous trouvons le champ texte avec le nom elementToAdd que nous remplissons avec la valeur element to add
            driver.findElement(By.name("elementToAdd")).sendKeys("element to add");

             //Nous cliquons sur le boutton avec l'id submitButton
            driver.findElement(By.id("submitButton")).click();
        }

        //Nous vérifions qu'il y a toujours 10 éléments
        assert driver.findElements(By.className("rowValue")).size() == 10;

        //Nous supprimons les éléments en cliquant sur les boutons supprimer
        while (driver.findElements(By.className("deleteButton")).size() == 0)
        {
            //Nous supprimons l'élément en cliquant sur le boutton supprimer
            driver.findElements(By.className("deleteButton")).get(0).click();
        }

        //Nous vérifions que les éléments ont bien été supprimés
        assert driver.findElements(By.className("rowValue")).size() == 0;
    }

    /**
     * Code à exécuter après chaque test JUnit
     */
    @After
    public void tearDown() {

        //Nous quittons le driver
        driver.quit();
    }
}

Avec ces tests JUnit Selenium, nous avons été capable d’automatiquement tester toutes les fonctionnalités de notre script PHP.

Vous pouvez trouver plus d’information à propos de Selenium au lien suivant : http://docs.seleniumhq.org

Résumé

Ces dernières années, la quantité de données a augmenté d’une manière significative. Bases de données et plus généralement les sources de données sont maintenant installées sur des serveurs, ordinateurs de bureau mais aussi sur les périphériques mobiles. Les technologies de sources de données distribuées ont donc été développées pour lier ces données en utilisant des technologies de communication.

Dans cette thèse, un toolkit Java pour créer des applications de bases de données distribuées est développé  en utilisant les mécanismes d’abstraction Java. Avant le développement de ce toolkit, quelques technologies middleware sont donc étudiées afin d’établir les communications entre les entrepôts de données. A la fin du projet, le toolkit est implémenté à l’intérieur d’un scenario concret, qui est, une application client pour gérer plusieurs bibliothèques qui ont chacunes leur propre base de données.

Le toolkit a été crée modulaire avec 2 couches. La première couche est la couche middleware composée des modules SQLSpaces et Jgroups qui sont les technologies middleware qui ont été retenues après les expérimentations. La deuxième couche est la couche d’accès aux données composée des modules MySQL et RDF data stores. La transparence de transfert entre les data stores RDF et la base de données MySQL a été implémentée. Les données sont transférées entre entrepôts de données en utilisant des objets de commandes qui représentent des commandes envoyées à un ou plusieurs entrepôts de données.

ddbstoolkit

Intéraction des différents modules du toolkit

Vous trouverez ci-dessous le rapport de cette thèse en anglais.

Lire la suite de l’article

08/07/2011 écrit par Cyril GRANDJEAN

Voici un petit tutoriel pour tous ceux qui souhaiteraient installer Apache Tomcat sur un QNAP.

Tout d’abord, téléchargez Java ainsi qu’Apache Tomcat et copiez le sur votre NAS.

Voici les chemins d’installation de Java et d’Apache Tomcat que j’ai utilisé :

  • Java : /share/Qweb/java6
  • Tomcat : /share/Qweb/tomcat6

J’ai ensuite crée le fichier tomcat.sh à la racine de tomcat6.

#!/bin/sh
#Tomcat  auto-démarrage
#Auteur : Cyril GRANDJEAN
#Description : Auto-démarrage de tomcat
#Nom du processus : tomcat
#PID  : /var/run/tomcat.pid
RETVAL=0
QPKG_NAME="tomcat6"
_exit()
{
   /bin/echo -e "Error: $*"
   /bin/echo
   exit 1
}

JRE_HOME="/share/Qweb/java6"
CATALINA_HOME="/share/Qweb/tomcat6"

case $1 in
  start)
    sh /share/Qweb/tomcat6/bin/startup.sh
    ;;
  stop)
    sh /share/Qweb/tomcat6/bin/shutdown.sh
    ;;
  restart)
    sh /share/Qweb/tomcat6/bin/shutdown.sh
    sh /share/Qweb/tomcat6/bin/startup.sh
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac
exit $RETVAL

Ensuite, pour pouvoir l’utiliser comme un package sur l’interface du QNAP, j’ai rentré les commandes suivantes :

echo "[tomcat6]" >> /etc/config/qpkg.conf
echo "Name = Tomcat6" >> /etc/config/qpkg.conf
echo "Version = 6.0" >> /etc/config/qpkg.conf
echo "Enable = TRUE" >> /etc/config/qpkg.conf
echo "Shell = /share/Qweb/tomcat6/tomcat.sh" >> /etc/config/qpkg.conf

Vous pouvez maintenant utiliser Apache Tomcat sur votre QNAP.

23/03/2011 écrit par Cyril GRANDJEAN

Lors de mon stage chez Distrame de Juillet 2010 à Septembre 2011, j’ai participé à l’élaboration de la solution Efficacenergie.  Cette solution directement installée sur le réseau intranet du client permet la mesure de consommation énergétique d’un bâtiment que ce soit de la mesure de consommation d’eau, de gaz, d’électricité ou de la mesure de température,… Efficacenergie est compatible avec les capteurs sans fils des marques LEM et Coronis.

La solution est installée sur un NAS fonctionnant sur une distribution Linux. Notre serveur NAS va jouer le rôle de collecteur de données provenant des capteurs sans fils.  Grâce à un serveur d’application Apache Tomcat et d’une base de données mySQL, le client peut visualiser ses consommations via une interface web ergonomique développée à partir de la librairie javascript Ext-JS. Vous pourrez trouver sur mon portfolio une liste de fonctionnalités disponibles avec Efficacenergie.

Voici une petite vidéo de présentation de la solution :