Juste une mise à jour pour fêter la nouvelle version de notre programme, avec l'ensemble des fichiers de langues ainsi que un petit plus... le nouveau splashscreen!
mercredi 11 juin 2008
[Projet] XProcessor nouvelle version
[Projet] Mise à jour
Désormais accessible sur le serveur FTP du site:
- Processor.jar
- Processor-src.jar
- XConsole.jar
- XConsole-src.jar
- QuickGUI.jar
- QuickGUI-src.jar
[Projet] XConsole pour XProcessor
Pour que notre nouvelle librairie "Processor" deviennent compatible XProcessor il faut qu'elle hérite d'un JPanel. Deux solutions: soit modifier Processor et lui créer un magnifique JPanel ou alors rajouter une couche graphique à Processor, et c'est ce que nous allons faire. Le nom de ce projet: XConsole. Son but est simple, remplacer une console Dos, normalement utilisée pour Processor, par une jolie console à base de Swing.
Création du projet sous éclipse:
Le programme est très simple et utilise la librairie Processor. On créé donc un plugin pour XProcessor de façon à avoir une vue comme celle-ci:
On remarque dans la partie centrale un JTextAera auquel on a ajouter un OutputStream, ainsi on pourra préciser simplement à Processor quel OutputStream il doit utiliser et toutes les informations s'afficheront d'elles même dans le JTextArea.
Ensuite dans le bas un simple JTextField dans lequel on saisit des commandes, mais il est un peut plus que ça, en effet pour la beauté de la chose on a ajouté la possibilité en appuyant sur les touches 'haut' et 'bas' le défilement des anciennes commandes lancées.
XConsole possède aussi une methode main pour le lancer seul.
[Projet] La librairie "Processor"
Aujourd'hui'hui nous cherchons à améliorer XProcessor en lui permettant d'ajouter des plugins évolutifs. Non plus limité à des JPanel, XProcessor pourra charger des 'Systèmes' auquels seront liés des 'Commandes'. Plus aucunes limites dans les possibilitées, XProcessor gérera ainsi à la fois des application fenetrés et des applications consoles.
Pour cela nous réutilisons un programme nommé "Processor" travaillé en cours cette année.
Le but de ce programme et de prendre en paramètre un systéme, qui peut être n'importe quoi et donc hérite d'un Objet. Par dessus on rajoute des commandes qui pourront êtres utilisées pour modifier ce système. Imaginez un système "Compteur" on pourrait avoir deux commandes:
- inc (pour décrémenter)
- dec (pour décrémenter)
De plus Processor se compose lui aussi de commandes de bases comme:
- menu (affiche la liste des commandes)
- load (charge un système contenu dans un fichier .jar)
- exit (pour quitter le Processor)
Pour commencer il faut savoir que la version actuelle de Processor est beaucoup plus evoluée que celle travaillée en cours, voici une liste des ameliorations aportées:
- Distinction entre les commandes de bases et les commandes du système chargé
- Reconnaissance automatique des commandes à moité tapées.
- Ajout des commandes:
- unload (décharge un système)
- help (affiche un commentaire sur une commande)
- history (affiche les liste des derniéres commandes tappées)
- script (lance une liste de commandes contenu dans un fichier texte)
- version (donne la numero actuel de Processor ainsi que le système chargé)
Voici la réprésentation de l'architecture du programme "Processor":
Processor contient une methode 'main' il est donc utilisable seul et n'est pas compatible XProcessor pour l'instant vue qu'il n'hérite pas d'un JPanel.
dimanche 8 juin 2008
[Divers] QuickGUI amélioration MVC + Observateur
Nous revenons rapidement sur QuickGUI qui je le rappel est une librairie externe développée pour simplifier la réalisation d'interfaces graphiques en java. Développée en interne elle est la base de XProcessor et se voit aujourd'hui enrichie de 2 nouvelles classes qui donne tout leur sens à 2 classes déjà présentes mais inutilisées jusqu'à présent, à savoir Controler, View sensées permettre de réaliser des application basées sur le pattern MVC (Model View Controler).
Les 2 nouvelles classes sont Observer et Observable, ce qui donne la nouvelle arborescence de QuickGUI:
Le package "main.support.ui.base" contient tout ce qu'il faut pour développer des application basées sur le patterns MVC.
Mais pourquoi ajouter ces 2 nouvelles classes? Sont elles vraiment utiles?
En effet réaliser un programme basé sur MVC est simple et permet un grande "fiabilité" de codage. Cela est valable tant que l'on ne dispose que d'une seule vue en lien avec un modèle. Dés que l'on possède au moins 2 vues qui sont liées au modèle cela devient plus compliqué. On considère alors l'idée que le modèle puisse être Observé et que les Vues observent le modèle. Lorsque le modèle est modifié il demande une mise à jour des vues qui l'observent pour qu'elles actualisent leur contenu. Voici un schéma de l'idée:
(Source: http://msdn.microsoft.com/en-us/library/ms978748.des_MVC_Fig03(en-us,MSDN.10).gif)
Vue du code source de la classe Observer:
package main.support.ui.base;
public interface Observer{
public void update(Observable o);
}
Vue du code source de la classe Observable:
package main.support.ui.base;
public interface Observable {
public void addObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
Mise en œuvre:
Une vue s'ajoute en tant qu'observer au modèle avec la méthode addObserver(this).
Le modèle implémente Observable et réalise un notifyObservers() quand il est modifié, après cette méthode parcourt tout les Observateur et réalise un update(). C'est tout simple! A vous de voir ce qu'il faut mettre dans la méthode update() de votre vue, un repaint() par exemple.
Actuellement XProcessor n'est pas basé sur le pattern MVC, il se peut qu'avec l'ajout de cette fonctionnalité à QuickGUI, XProcessor puisse subir une profonde modification bientôt.
mercredi 4 juin 2008
[Divers] Les news du FTP
Le FTP du projet se voit s'enrichir d'une nouvelle rubrique: "plugins" où seront stockés les futurs programmes intégrable dans XProcessor, ainsi vous pourrez télécharger ceux qui vous intéresses plus facilement. Rendez-vous en bas du blog, partie "ressources en lignes".
[Projet] Nouveau plugin: JARLauncher
Voici un nouveau programme intégrable dans XProcessor. Son but charger un fichier .jar, afficher un ensemble d'informations utiles. Par la suite vous pouvez exécuter le fichier pré chargé en spécifiant par avance des arguments d'entrées.
lundi 26 mai 2008
[Projet] Premier upload de notre projet
Il est enfin temps de rendre disponible à tout les internautes le fruit de notre travail. Pour cela nous sommes heureux de vous permettre de télécharger la 1ere version de QuickGUI ainsi que celle de XProcessor.
Voici les liens :
QuickGUI
XProcessor
Vous pouvez aussi vous rendre dans la partie "Ressources en ligne" en bas à droite du blog.
[Divers] Ajout d'une solution FTP pour notre projet
Dans le but de pouvoir facilement publier des fichiers (CV, image, doc) sur le net en lien avec notre projet, nous disposons maintenant d'un espace FTP de taille respectable à cette adresse:
http://membres.lycos.fr/introspectionja/
Nous vous invitons à vous reporter à la partie "Ressources en ligne" disponible dans le menu du blog à droite vers la bas. Les futurs articles posséderons des liens directs vers les ressources concernées par la suite :)
dimanche 4 mai 2008
[Projet] Créer un plugin pour XProcessor
Voici un petit article qui explique comment créer votre propre pulgin sous XProcessor.
Le principe est très simple, il suffit de créer une classe qui ne se trouve dans aucuns package, qui hérite d'un JPanel et dont le constructeur ne prend aucuns arguments.
Voyons cela en détail, en premier créons un projet sous eclipse, on le nommera "PluginProject" par exemple.
Une fois le projet créé en ajoute la classe qui va hériter du JPanel, attention il faut savoir que le nom de cette classe sera impérativement le nom du futur .jar ou sera sauvegarder l'ensemble du plugin.
Il ne nous reste plus qu'a compléter la classe MyPlugin pour qu'elle soit compatible avec le PluginLoader de XProcessor, voici le code correspondant:
Le code est trés detaillé, maintenant testons ce magnifique plugin dans XProcessor. Pour cela il faut crée une archive du projet PluginProject:
1) bouton droit sur le projet
2) export
3) chercher JAR File
4) entrer le nom du .jar : "MyPlugin"
5) créer le fichier en faisant finish
Et voilà on se retrouve avec notre joli plugin que l'on place dans le répertoire /plugin (on pourrai aussi le charger manuellement via le menu plugin/charger, testons le maintenant en image:
Résultat impeccable :D
lundi 28 avril 2008
[Projet] XProcessor
Il s'agit de la sur couche graphique de la classe PluginLoader. Elle utilise la librairie externe QuickGUI et est compilé en java 6.0, juste pour mettre un SplashScreen dans le manifest (possible depuis java 6.0).
XProcessor se compose d'une vue composée d'un menu, un JTree qui montre les Plugins chargés et disponible à l'utilisation, un JDesktopPane pour afficher les plugins, une console pour donner des informations qui sembles pertinentes et aussi une barre de statut.
Au début l'idée était aussi de rendre XProcessor attractif graphiquement, pour l'instant c'est plutôt sobre mais toutes les icônes ainsi que le SplashScreen sont faites "maison" (on évite ainsi les problèmes de licences) et sont réalisés avec des logiciels libres: Blender et Gimp.
Nous avons le plaisir de vous montrer une capture d'écran de la version actuelle de XProcessor.
[Projet] QuickGUI! Que du bonheur!
Dans la suite de notre projet nous pensons réaliser une interface graphique et donc utiliser SWING. Cela nous permettra de nous initier et aussi de donner un coté plus réactif à nos créations.
Parce que un programme console c'est bien beau, tout le monde se rappelle de son premier "Hello World!" mais voilà une jolie interface graphique c'est tellement mieux. Dans un cadre tout à fait à part de ce blog j'ai développé un librairie externe regroupant plusieurs fonctionnalités qui me semble importante pour une interface graphique. Nommé QuickGUI elle permet au programmeur de bénéficier des options suivantes:
1) DefaultFrame qui hérite de JFrame et qui sauvegarde l'état dans laquelle elle se trouvée au moment de la fermeture du programme, à savoir: position, taille, maximisée ou non.
2) Gestion de l'internationalisation très simple, pour l'instant seul le français, l'anglais et l'allemand sont supportés.
3) Un classe RessourcesLoader qui charge en deux temps trois mouvement des objets de types: ImageIcon, Icon, Font à partir de fichiers situés sur le disque dur ou bien dans un .jar
4) Gestion simple de l'envoie d'un mail ou de l'ouverture d'un fichier avec son programme par défaut. Ce sont des possibilités Desktop incluses depuis JAVA 6.0
5) Ajout des classe Controller et view pour réalisation de programme basés sur le modèle MVC (Model View Controler)
6) Sans oublier le plus important, le chargement automatique de log4j pour générer les logs.
[Projet] Réalisation d'un chargeur de Plugin(s)
Dans le cadre de notre projet d'introspection en java, nous voulons reprendre une idée vue en cours, à savoir réaliser un programme pouvant recevoir des extensions. L'idée est à double but:
1) Nous allons pouvoir nous entrainer avec java.lang.reflect et ainsi commencer à mettre les pieds dans l'introspection java
2) Une fois la classe permettant de charger des plugins terminé nous pourrons élaborer une interface graphique qui viendra se greffer dessus et ainsi nous posséderons une base pour nos futur projet dans ce domaine.
La classe se nommera "PluginLoader" et aura comme particularité de charger des extensions qui seront des JPanel.
Voici l'idée générale:
1) le programme contient un répertoire par défaut où se trouvent les plugins, pour faciliter on nommera ce répertoire "/plugins"
2) notre programme doit pouvoir repérer un fichier extensions dans ce répertoire, on considère qu'un fichier dit "plugin" possède une extension .jar
3) le programme regarde le nom du fichier .jar et recherche à l'intérieur de celui-ci un fichier .class du même nom. Attention le fichier .class du même nom ne doit se trouver dans aucun package, question de facilité
4) un cherche alors le constructeur par défaut du .class et on crée une nouvelle instance de l'objet
5) Comme on souhaite créer des plugins qui seront des JPanels il ne reste plus qu'a "caster" l'objet obtenu et à l'ajouter au modèle avec les autres plugins précédemment chargé.
Voici le code source correspondant :
package net.sourceforge.introspectionjava;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.jar.JarFile;
import javax.swing.JOptionPane;
import main.support.LanguageManager;
import org.apache.log4j.Logger;
public class PluginLoader {
// Allow log4j for this class
private static Logger log = Logger.getLogger(PluginLoader.class);
private LanguageManager lang; // allow this class to be internationalized
// default constructor of the class
public PluginLoader(){
this.lang=new LanguageManager("net/sourceforge/introspectionjava/lang/","PluginLoader"); // create an instance of LanguageManager
}
@SuppressWarnings("deprecation")
// method which load a plugin include in a .jar file
public Object loadFile(File f){
try{
String temp=f.getName(); // gte the name of the file
String path = temp.substring(0,temp.length()-4); // get the name without .jar extendsion
// load the .jar file into memory
URLClassLoader loader;
// will be used for compare strings
String tmp = "";
// get the content of the .jar file
Enumeration enumeration;
URL u = f.toURL();
// create a new URLClassLoader to load .jar file which is'nt in the CLASSPATH
loader = new URLClassLoader(new URL[] {u});
// load the jar file into memory
JarFile jar = new JarFile(f.getAbsolutePath());
// get all the content of the .jar
enumeration = jar.entries();
while(enumeration.hasMoreElements()){
tmp = enumeration.nextElement().toString();
// verify if the file is a .class
if(tmp.length() > 6 && tmp.substring(tmp.length()-6).compareTo(".class") == 0 && tmp.equals(path+".class")) {
tmp = tmp.substring(0,tmp.length()-6);
tmp = tmp.replaceAll("/",".");
Class tmpClass = Class.forName(tmp ,true,loader);
Class[] ctorArgs1 = new Class[]{};
Constructor constructor=tmpClass.getConstructor(ctorArgs1);
log.info("Load..."+f.getCanonicalFile()+" OK!");
return constructor.newInstance();
}
}
} catch (IOException e ){
log.error(e.getMessage(), e);
JOptionPane.showMessageDialog(null, lang.getAnInternationalizeString("$io_error")+"\n"+f.getName(), lang.getAnInternationalizeString("$error_title"),JOptionPane.OK_OPTION);
} catch (ClassNotFoundException e) {
log.error(e.getMessage(), e);
JOptionPane.showMessageDialog(null, lang.getAnInternationalizeString("$class_error")+"\n"+f.getName(), lang.getAnInternationalizeString("$error_title"),JOptionPane.OK_OPTION);
} catch (Exception e) {
log.error(e.getMessage(), e);
JOptionPane.showMessageDialog(null, lang.getAnInternationalizeString("$load_error")+"\n"+f.getName(), lang.getAnInternationalizeString("$error_title"),JOptionPane.OK_OPTION);
}
log.error("Plugin: "+f.getName()+" can't be load!");
JOptionPane.showMessageDialog(null, lang.getAnInternationalizeString("$load_error")+"\n"+f.getName(), lang.getAnInternationalizeString("$error_title"),JOptionPane.OK_OPTION);
return null;
}
}
Cette classe est déjà implantée dans un programme lié à notre projet, nommé: "XProcessor"
mercredi 13 février 2008
[Divers] Définition: introspection
Étymologiquement, le terme d'introspection vient du latin « introspectus » action de regarder à l'intérieur. En général, elle est le fait, pour une conscience, de s'observer elle-même.
En psychologie, l'introspection est une méthode d'observation et d'analyse de soi en vue d'étudier sa propre personne (psychologie introspective) et acquérir une connaissance de soi ou bien en vue de connaître l'esprit humain en général. L'introspection était la principale méthode utilisée aux débuts de la psychologie expérimentale, à la fin du XIXe siècle.
Les difficultés rencontrées par les spécialistes pour s'accorder sur les contenus de la conscience ont conduit la plupart des psychologues du XXe siècle à rejeter cette méthode.
Dans le champ de la psychologie cognitive, l'utilisation des verbalisations concommitantes (think-aloud protocol) par des chercheurs comme Newell et Simon est parfois critiquée comme un retour de l'introspection.
(source: http://fr.wikipedia.org/wiki/Introspection)

