James Ward aborde le sujet des performances du RIA. Auteur d’un outil de benchmark en Flex : Census, il reviens sur Bubblemark un autre système de mesure. Intéressant.
Archive for the ‘RIA-RDA-RWA’ Category
360 Flex Conference Bilan
Je confirme que cette technologie est très intéressante et aboutie. Je ne suis pas d’accord quand on me dit que Adobe a réussit à faire ce que Sun n’a pas su faire avec Java coté client. En effet avec l’Applet tout cela était déjà possible depuis longtemps. Apple avait d’ailleurs fait ce choix avec WebObjects Java Client avec une bibliothèque Swing personnalisé à la NeXT.
360 Flex Conference Day 3
Session 1 : Mihai Corlan (Adobe) : Developing data intensive Flex applications in Flex Builder 3
Présentation d’une application CRUD en Flex. On constate la souplesse concernant le binding avec la metadata [Databinding] et la balise <mx:Binding> c’est simple et efficace.
Présentation de l’objet AdvancedDataGrid qui permet de grouper dans un table, de changer l’ordre des colonnes par drag’n drop, de trier sur plusieurs colonnes.
Présentation de LiveCycle Data Services avec SQLAssembler : même démo que dans la session de Koen : le SQLAssembler n’est selon moi pas a conseiller sauf peut être pour des maquettes mais il permet ici de présenter comment fonctionne la notion d’Assembler coté serveur. Deux navigateurs sont lancés appelant la même application Flex, les modifications faites dans l’un sont automatiquement répercutées dans l’autre. LCDS est vraiment indispensable pour gérer la notification des modifications sur tous les clients et correspond tout à fait aux besoin d’une application d’informatique de gestion. C’est vraiment le modèle idéal. Dommage que cette partie soit encore payante, encore qu’il y a une version express mais j’ai pas encore compris si elle est free ou pas, en tout cas c’est téléchargeable.
A noter que LCDS utilise la balise <mx:DataService> a laquelle on associe toujours une ArrayCollection. C’est avec cette ArrayCollection que LCDS est en mesure de notifier les ajout, suppression et modification.
Session 2 : Borre Wessel : Cairngorm deep drive
Présentation du framework Cairngorm et de ses design pattern, c’est principalement un modèle MVC en Actionscript :
- ModelLocator : pour charger tous ses modèles on peut l’interpréter comme un objet Session
- FrontController : pour intercepter et gérer les Commands et Events
- Delegates : associé aux services et permet de les surcharger
- Responder : pour intercepter les réponses des appels de services (succès et erreur)
- ServiceLocator : locator de ses services permet aussi de gérer la sécurité (setCredentials)
L’importance de l’utilisation des modules (mx:Module) pour décomposer son application, permettre la réutilisation, réduire la taille.
Paul Williams a écrit plusieurs articles sur les presentation patterns à lire.
Un point sur les test unitaires: FunFX, HP (Mercury) QuickTest Pro, test difficile pas d’outils vraiment pratique.
Je pose la question de l’IoC et du dependency injection que l’on utilise en Java pour faciliter les tests unitaires, apparemment c’est pas viable avec Flex, il y aurait un projet de mocking. Le problème c’est qu’il faut simuler des événements. Bon il a pas été très clair dans la réponse, il est revenu vers moi après la présentation pour affiner sa réponse mais on a pas pu finir l’avion m’attendait. Ce sujet reste à creuser, j’ai aussi entendu parler de FlexUnit.
A propos de PureMVC c’est l’équivalent avec des design pattern complémentaires.
Bref j’avais l’impression d’être retourné à mes cours de l’université quand on apprenait l’objet et l’utilisation de InterfaceBuilder en Objective C. Tout ça me parait évident et je ne conçois pas de réaliser une application Flex ou autre sans des design pattern.
Allez retour à Paris, j’en ai quand même bien profité et je vous recommande une adresse : Al Mercante a deux pas du Duomo, le Tiramisu est extraordinaire !!!
360 Flex Conference Day 2
Deuxième journée, ça reste très intéressant et techniquement de bon niveau
360 Flex Conference Day 1
Première journée du 360Flex à Milan, plein de bonnes sessions et une bonne ambiance.
360 Flex
Je serais le 7, 8 et 9 avril prochain à Milan pour la conférence Flex. La version américaine à déjà eu lieu à Atlanta en février. Je ne m’attends pas à avoir de grandes annonces, c’est une conférence plutôt technique et c’est pour ça que j’y vais. Des speakers en majorité italien mais pas seulement, des sessions intéressantes comme celles de Marco Casario sur Flex et Ajax. N’hésitez pas à me demander d’être vos yeux et vos oreilles si vous ne pouvez pas y aller, je vous ferais de toute façon un compte rendu au jour le jour. Vous trouverez le programme ici et si vous êtes tenté de venir sachez que ya une promo.
Google Streets
Le nouveau service de Google permet d’etendre les capacités de GoogleMaps pour visualiser les rues en 360°. Le principe est simple : prendre des photos 360 tous les 100m et les relier entre elles dans une petite appli en Flash. Je trouve cela vraiment bien, on a l’impression d’y être. Seul problème c’est le droit à l’image, en effet des personnes sont visibles sur ces photos et n’ont parfois pas envie d’y être. Il faudrait mettre plus de moyen et faire vider chaque rue pour la prise de photos
, il reste encore beaucoup de boulot. Bref je vous invite à jeter un coup d’oeil, ça vaut le détour : direction http://maps.google.com et cliquez sur Street View.
Interaction entre desktop et web
Dans une application Eclipse RCP le composant Browser permet de mixer web et desktop. Les avantages de cette technique sont nombreux, notamment quand il s’agit de réutiliser un existant Web pour l’encapsuler dans une application desktop. L’interêt est de ne plus être dépendant d’un navigateur mais d’être son propre navigateur. Cependant pour que cela fonctonne il faut faire communiquer web et desktop. Lorsqu’il s’agit d’envoyer des données à l’application Web cela reste simple en modifiant l’URL (setURL()) ou en executant du Javascript (execute()). Mais lorsqu’il s’agit de récupérer des données depuis le web c’est plus fastidieux. Je vous propose ici 6 techniques :
1. via la barre de statut: c’est le code que l’on trouve sur les snippets SWT (Snippet160)
2. via la barre d’adresse: comme le propose Peter Nehrer
3. en requetant directement le DOM : depuis la 3.3 il est possible d’utiliser Mozilla et l’API XPCOM fournie la possibilité d’accèder au DOM de la page HTML. Ci-dessous un petit exemple reprenant le Snippet267 mais en requetant en XPath pour récupérer le titre d’un champ. Les possibilités sont multiples à l’image de l’utilisation qu’en fait ATF (faudrait que j’y consacre un article complet pour explorer toutes les possibilités qu’offre XPCOM).
static Browser browser;
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(2, true));
shell.setText("Use Mozilla's Design Mode");
try {
browser = new Browser(shell, SWT.MOZILLA);
} catch (SWTError e) {
System.out.println("Could not instantiate Browser: " + e.getMessage());
return;
}
browser.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 2, 1));
Button searchButton = new Button(shell, SWT.PUSH);
searchButton.setText("Search");
searchButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
search();
}
});
browser.setUrl("http://www.google.com");
shell.setSize(400, 400);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
public static boolean search() {
nsIWebBrowser webBrowser = (nsIWebBrowser) browser.getWebBrowser();
if (webBrowser == null) {
System.out.println("Could not get the nsIWebBrowser from the Browser widget");
return false;
}
nsIDOMWindow window = webBrowser.getContentDOMWindow();
nsIDOMDocument document = window.getDocument();
nsIDOMXPathEvaluator xpath = (nsIDOMXPathEvaluator) document.queryInterface(nsIDOMXPathEvaluator.NS_IDOMXPATHEVALUATOR_IID);
nsIDOMXPathNSResolver res = xpath.createNSResolver(document);
nsISupports obj = xpath.evaluate("//input[@name='q']/@title",
document,
res,
nsIDOMXPathResult.STRING_TYPE,
null);
nsIDOMXPathResult result = (nsIDOMXPathResult) obj.queryInterface(nsIDOMXPathResult.NS_IDOMXPATHRESULT_IID);
System.out.println(result.getStringValue());
return true;
}
4. via un socket : en executant une XMLHTTPRequest via la méthode execute() qui fait appel à un socket ouvert pour l'occasion et permet de récupérer un contenu.
private String getDataFromBrowser() {
String javascript = "try {";
javascript += "xhr_object = new ActiveXObject(\"Microsoft.XMLHTTP\"); ";
javascript += "xhr_object.open(\"POST\", \"http://localhost:9091\", false);";
javascript += "xhr_object.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");";
javascript += "xhr_param = generateXML();"; // appel d'une fonction retournant un contenu
javascript += "xhr_object.send(xhr_param);";
javascript += "} catch (ex) { alert(\"Failed to save document\"); }";
String xml = null;
XMLPicker e = new XMLPicker();
Thread t = new Thread(e);
t.start();
// Attend que le thread démarre.
try {
Thread.sleep(10);
} catch (InterruptedException eee) {
}
// Demande au browser un contenu.
boolean ok = browser.execute(javascript);
int wait = 0;
while (xml == null && wait < 10)
try {
Thread.sleep(10);
wait++;
xml = e.getXML();
} catch (InterruptedException eeee) {
}
System.out.println(xml);
return xml;
}
private class XMLPicker implements Runnable {
private String xml;
public String getXML() {
return xml;
}
public void run() {
ServerSocket server = null;
try {
server = new ServerSocket(9091);
server.setSoTimeout(5000);
System.out.println("Waiting for response");
Socket socket = server.accept();
// Traitement du flux, la classe HTTPServer est disponible pour ceux que ca intéresse
xml = HttpServer.getXMLString(socket, "UTF-8");
socket.close();
} catch (IOException ee) {
System.err.println(ee);
} finally {
if (server != null) {
try {
server.close();
} catch (Exception e) {
// Ignore.
}
}
}
}
}
5. en démarrant un serveur http dans la meme JVM que Eclipse RCP : tomcat peut être embarqué et demarré depuis une application Java, c'est aussi le cas de WebObjects (Application.primeApplication()). Les objets étant issus de la même JVM leur statut est partagée par les deux application mais attention toutefois aux classloaders.
6. via terracota : ce cluster de JVM permet de synchroniser les objets de 2 JVM et de répercuter en temps réel les états des objets.
GWT- Plugin CYPAL
Bon l’info n’est pas nouvelle, Didier en parlait déjà dans onGWT en avril , mais je viens de tester le plugin Cypal Studio pour eclipse et franchement c’est un très bon outils. On y retrouve toutes les fonctionalités que l’on peut attendre de ce type de plugin (aide à la création de projet GWT, compilation, d’ajout de module, de services asynchrones…). Donc à utiliser pour travailler sur des projets GWT.
GWT-Comment référencer le body dans le code JAVA
J’ai été confronté à ce probleme. Comment récupérer un Element faisant référence au body. L’API de GWT ne fournit pas « directement » ce service et il faut donc utiliser des méthodes détournées.
On peut par exemple rajouter un id au body dans la description HTML de la page
<html>
<head>
<meta name='gwt:module' content='fr.improve.testGWT.gwt.Application'>
</head>
<body id='bodyId'>
<script language="javascript" src="gwt.js"></script>
</body>
</html>
Dans votre application java il suffit ensuite d’utiliser le code ci-dessous
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
Element body= DOM.getElementById(« bodyId »);
Une autre solution consiste à utiliser le JSNI
Il suffit d’utiliser la méthode suivante:
public static native Element getBody() /*-{
return $doc.body;
}-*/;
L’élément est ensuite récupére par l’appel suivant :
Element body = getBody();
L’intérêt est qu’il n’y a plus besoin de modifier les pages HTML de l’application
Un peu étrange que des éléments de base comme le body ne soit pas directement accessible….
