lundi 27 juillet 2009

JetBrains Meta Programming System

JetBrains a annoncé la disponibilité de JetBrains MPS , un environement de développment dédié aux DSLs. Cet environement est la réponse, d'aprés cet article, aux besoins, mais également à ladifficulté de développer des DSLs.
Pour rappel, un DSL: Domain Specific Language, est un langage qui doit permettre d'implémenter les régles inhérentes à un domaine précis, comme la finance. Par exemple: un langage mathématique ne doit permettre que d'exprimer des opérations mathématiques.
D'aprés JetBrains, le fait que ce type de langage nesoit pas plus développer est dû à:
  • il n'y a aucun environement qui permet leur développement,
  • les langages étant basés sur des grammaires, combinés plusieurs DSL peut provoquer des ambiguités.
Avec MPS, JetBrains propose de resouvre ces problémes en ce basant, non plus sur des éditeurs traitant du texte, mais sur une représentation arborescente du langage, ce qui écarte tout risque d'ambiguité, puisqu'il n'y a plus de grammaire. D'aprés le site officiel, la faible courbe d'apprentissage et la rapidité de développement que permet l'outil, devrait imposer les DSLs comme une solution viable.

vendredi 24 juillet 2009

Google Plugin For Eclipse

Google fournit un plugin Eclipse pour la création d'applications web basées sur Google Web Toolkit et permettant de déployer les applications sur Google App Engine. Petit tour d'horizon de ce plugin bien pratique.

Installation

Pour installer le plugin, deux URLs sont disponibles suivant la version d'Eclipse:
  • Version 3.3: http://dl.google.com/eclipse/plugin/3.3
  • Version 3.4: http://dl.google.com/eclipse/plugin/3.4
Le plugin install la version 1.6.4 de GWT et la version 1.2.1 du kit Google App Engine par défaut.

Création d'un projet

La création se fait via le wizard en passant par le menu: File > New Project > Web Application Project ou en utilisant le bouton

Le wizard permet d'inclure/exclure GWT et/ou Google App Engine dans le projet. Il inclut par défaut les dernières versions des frameworks. Via les liens Configure SDKs... , il est possible de choisir une autre version du SDK installée sur la station.

GWT

MyTestProject
src/
com/
mytestproject/
MyTestProject.gwt.xml
client/
GreetingService.java
GreetingServiceAsync.java
MyTestProject.java
server/
GreetingServiceImpl.java
war/
MyTestProject.css
MyTestProject.html
WEB-INF/
web.xml
classes/
lib/
...GWT JARs...
Le plugin génère une application de base avec un service RPC de base. L'application permet d'envoyer une message via le service. Et celui-ci renvoi ce message avec des informations sur le serveur.
Pour le service, l'interface, les implémentations coté client et coté serveurs sont générés.

Google App Engine

MyTestProject
src/
log4j.properties
META-INF/
jdoconfig.xml
com/
mytestproject/
MyTestProjectServlet.java
war/
index.html
WEB-INF/
appengine-web.xml
web.xml
logging.properties
classes/
lib/
...App Engine JARs...
L'application générée donne accès à la technologie de persistance DataNucleus utilisée par GAE. Pour la partie présentation, puisque l'application est censé être une appli web, une servlet a été généré.
Le fichier appengine-web.xml permet de configurer le déploiement de l'application. Le fichier jdoconfig.xml contient la configuration du framework DataNucleus.

GWT et GAE

MyTestProject
src/
log4j.properties
META-INF/
jdoconfig.xml
com/
mytestproject/
MyTestProject.gwt.xml
client/
GreetingService.java
GreetingServiceAsync.java
MyTestProject.java
server/
GreetingServiceImpl.java
war/
MyTestProject.css
MyTestProject.html
WEB-INF/
appengine-web.xml
web.xml
logging.properties
classes/
lib/
...App Engine JARs...
...GWT JARs...
L'application offre des fonctionnalités similaires aux deux types de projet précédents.

Exécuter l'application en hosting mode

L'exécution de l'application en hosting mode, mode qui permet d'utiliser le debuger, il suffit de faire click droit sur le projet puis: Run As... > Web Application.
La console, qui permet de monitorer l'activité serveur, s'ouvre:

Puis le hosted browser, un navigateur intégré:

Remarque: il est prévu pour la version 2 de GWT, que le hosted browser soit remplacé par le navigateur par défaut du système hôte.

Déployer l'application Google App Engine

Le déploiement d'une application GAE se fait simplement en clickant sur l'icône pour ouvrir la boite de dialogue:
Il faut posséder un compte GAE pour pouvoir déployer une application, et donc posséder un compte utilisateur Google. Le plugin doit d'abord être configuré avec l'identifiant de l'application GAE: Properties > Google > App Engine > Application ID. Aprés avoir clické sur le bouton Deploy, le plugin compile et package l'application, qui est ensuite envoyée sur la plate forme.
L'application est alors utilisable.

Conclusion

Malgrés la possibilité d'intégrer les outils de GWT tel junitCreator comme outil externe d'Eclipse, je regrette l'abscence de ces outils du plugin. La volonté de Google était apparement de fournir le plus rapidement possible un outil permettant de developper des applications GWT. Du coup, le nice to have a été mis de coté. Ce sera, je l'espére, pour la prochaine version. La raison de cette abscence peut aussi être expliqué par les bugs (dans la version 1.6.4 du SDK) produits par ces scripts.

dimanche 5 juillet 2009

Google Chrome for Linux

Google décline toutes responsabilités des dégats pouvant être causés par un crache de Chrome, qui est actuellement disponible pour les développeurs dans sa version Linux. Si mes versions de développement étaient aussi stable, je n'aurai jamais d'appréhension les veilles de mise en production.
Cela fait trois semaines que je ne me sers que de ce navigateur, et, pas de crache, encore mieux que ça, tous mes sites habituelles s'affichent parfaitement, que ce soit ma messagerie Microsoft Exchange ou les applications de Google tel GMail, il n'y a pas le moindre défaut ou fragment de JavaScript mal interprété. Et en plus, c'est vraiment rapide.
La seule chose que j'ai pû constaté est que les fichiers WSDL ne sont pas affichés, j'en déduis que c'est le cas pour tous les formats XML. Mais ce n'est qu'une version de dev.

mercredi 24 juin 2009

Google wave

Google a annoncé, lors du Google I/O, Google wave, une plateforme collaborative. Basée sur le protocol Open wave, l'application permet de partager des documents et de communiquer en direct avec ses contacts.
La plateforme est basée sur la notion de wave: un ensemble de conversation et de documents, basé sur le partage, les participants peuvent intervenir dans une conversation n'importe quand.
    Les technologies clés sont:
  • le control des accès conccurrents, un document peut être éditer par plusieurs personnes en même temps,
  • des outils de corrections automatiques des documents,
  • une API permettant d'étendre la plateforme vers d'autres médias.
La démonstration la plus bleufante lors de la présentation de Google wave, a été la messagerie instantanée, vraiment instantanée. Inutile d'attendre que le correspondant est appuyé sur le retour chariot, le message apparaît au fur et à mesure que celui-ci est tapé.

mercredi 17 juin 2009

Adobe Acrobat.com

Adobe vient de sortir une suite bureautique en ligne: Adobe Acrobat.com.
Celle-ci est entiérement basée sur le format de fichier PDF. Les formats de fichiers textes (txt, RTF, PS), Microsoft Office, Open Office, StarOffice, WordPerfect et les fichiers images (BMP, GIF, JPEG, TIFF, PNG) sont supportés pour la conversion vers le PDF.
Le compte de base permet de convertir seulement cinq fichiers, mais il existe un compte payant, dit premium, qui donne la possibilité de convertir autant de fichier que l'utilisateur le veut. La plateforme propose Adobe Buzzworld, actuellement en version beta, un traitement de texte en ligne, et Adobe ConnectNow, un outil collaboratif.

Buzzworld permet, outre les fonctionnalités d'édition d'un traitement de texte classique, de partager les documents avec d'autres utilisateurs en se basant sur des rôles prédéfinis. Trois rôles sont disponibles: coauthor, reviewer et reader. Le rôle coauthor donne les droits en édition, alors que le rôle reviewer ne peut qu'éditer des commentaires. L'outil garde également une trace des modifications apportées aux documents à travers la gestion des versions.

ConnectNow offre la palette compléte des outils collaboratifs:

  • Le partage d'écran: tous les utilisateurs connectés avec vous peuvent voir votre écran; trés utile pour les démonstrations,
  • Un whiteboard: à associer au partage d'écran,
  • Un outil de visio/audio conférence,
  • Un outil de chat,
  • Prise de contôle du desktop d'un des participants au meeting (avec un système de permission),
  • Une URL est fournit en lieu et place d'une salle de conférence.
Voici donc un nouveau concurrent pour la plateforme Google Docs.

Google Fusion Tables

Tout droit sortie du Labs de Google, Fusion Tables. Cette nouvelle application permet de créer des tables à la façon d'un tableur. Il est possible d'importer des données à partir de spreadsheet existantes ou de fichiers CSV. Pour l'export, seul le format CSV est disponible. La taille d'une table est limitée à 100Mo, et l'ensemble des tables d'un utilisateur ne peut dépasser 250Mo. Jusque là, rien d'exceptionnel.
Une fonctionnalité permet de générer des graphes ou des maps à partir des tables, toujours rien d'exceptionel, cependant, le graph ou la map peut être intégré dans une application web ou un blog, et il sera mis à jour dés que les données le seront.
Qui dit application web, dit forcément partage de l'information, en lecture biensûr, mais aussi en écriture dans le cas présent. Il est donc possible de partager des informations pour permettre le travail colaboratif. Les informations peuvent être filtrés pour seules certaines colonnes ou cellules ne soient visibles ou modifiables. Pour permet la colaboration, des fonctionalités de fusion (tient, ça me dit quelque chose) ont été ajoutés. Il est également possible d'annoter les données.

mercredi 10 juin 2009

Effective Java, Second Edition par Joshua Bloch

En décembre 2008, Joshua Bloch a participé au deuxiéme keynotes de Devoxx. Il en a profité, en se basant sur ce livre, pour nous mettre les méninges en ébulition.
C'est donc avec curiosité que je me suis plongé dans cet ouvrage. Je pensais n'y trouver qu'une discussion sur la bonne pratique du langage Java, un peu comme c'était le cas lors de Devoxx. En réalité, le discours est plus accès sur le design et la résolution de problémes de conceptions.
Le livre est organisé par thématiques qui couvrent des sujets aussi "anodin" que l'utilisation des constructeurs, jusqu'à des sujets plus pointus comme la concurrence. Chaque thématique est abordé suivant des problémes, items, auxquels le développeur est continuellement confronté. Pour chaque item, une ou plusieurs solutions sont exposées, et les avantages/inconvénients y sont discutés.
Effective Java pourrait être rebatiser: pour un meilleur développement.

samedi 9 mai 2009

Introduction à Spring ROO

Introduction

Lors du premier keynotes de SpringOne Europe, Ben Alex a fait une démonstration d'un outil permettant de démarrer from scratch un nouveau projet: ROO. C'est un outil de génération de code basé sur les produits Spring, Maven et AspectJ.
Nous allons créer une application web permettant de gérer une liste d'employés.

Premier contact

ROO n'étant qu'en version alpha 2, il n'est pas directement disponible à partir de la page de download de Spring. le bundle est disponible à l'adresse suivante: http://dist.springframework.org/milestone/ROO/spring-roo-1.0.0.A1.zip

ROO se présente sous la forme d'un shell:

La commande hint du shell permet d'obtenir de l'aide par rapport à l'état d'avancement du projet. Par exemple, si aucun projet ROO n'ext contenu dans le répertoire courant, la commande de création de projet est proposé:

La touche TAB peut également fournir une aide. Lorsque c'est possible, elle complète la commande à votre place, ou, elle propose une liste des champs possibles.

Remarque:
La commande exit permet de sortir du shell.

Création du projet

ROO ne crée pas le répertoire racine du projet, il faut donc le faire à la main:
mkdir spring_roo
cd spring_roo


La commande suivante permet de créer le contenu du projet sous la forme d'un projet Maven:
create project -topLevelPackage net.techwatch.spring.roo

Remarque: Pour transformer le projet en projet Eclipse, il suffit d'exécuter la commande Maven:
mvn eclipse:eclipse

Il est également possible d'ajouter les logs par:
configure logging -level DEBUG

Avant la création des entités du model de données, il faut intégrer le support de JPA à notre application:
install jpa -database HYPERSONIC_IN_MEMORY -provider HIBERNATE

et créer les classes du domaine:
new persistent class jpa -name ~.domain.Employee
add field string -fieldName firstName -notNull
add field string -fieldName lastName -notNull
add field date jpa -fieldName birthDate -type java.util.Date

new persistent class jpa -name ~.domain.EmployeeList
add field string -fieldName name -notNull
add field string -fieldName comment -sizeMax 254
add field date jpa -fieldName date -type java.util.Date
add field set jpa -element Employee -fieldName employee


La création d'un élément persistent se fait par la commande:
new persistent class jpa -name

Remarque: Le caractère ~ fait référence au package root de l'application.

Le type du champ fait partie de la commande, par contre, les contraintes sont considérées comme des options. L'utilisation d'un type date nécessite de spécifier l'implémentation à utiliser: java.util.Date ou java.sql.Date.
L'utilisation de l'option -sizeMax est une utilisation de l'implémentation de la JSR 303 (Bean validation). A l'exécution, ROO utilise ses annotations pour vérifier les contraintes.

Remarque: il est possible d'ajouter un champ dans n'importe quelle entité en utilisant l'option -class de la ligne de commande.

Exemple de code généré pour l'entité Employee:
@Entity
@RooEntity
@RooJavaBean
@RooToString
public class EmployeeList {

@NotNull
private String name;

@Size(max = 254)
private String comment;

@Temporal(TemporalType.TIMESTAMP)
private Date createDate;

@OneToMany(cascade = CascadeType.ALL)
private Set employee = new HashSet();
}


L'annotation RooToString ajoute une définition de la méthode toString. L'annotation RooJavaBean se charge d'implémenter les méthodes d'accès et RooEntity permet d'implémenter, entre autre, la validation des contraintes.

Pour compléter l'application, il faut maintenant implémenter le modéle MVC d'une application web. ROO permet d'implémenter cette architecture en se basant sur Spring WebFlow et Spring MVC. Des composants Ajax, basés sur le framework Dojo, sont également intégrés aux pages JSP.

new controller automatic -name ~.web.EmployeeListController
new controller automatic -name ~.web.EmployeeController -formBackingObject ~.domain.Employee


L'utilisation du paramétre automatic permet de générer la totalité de la logique des controlleurs, sinon, son développement est à la charge du développeur.
ROO, lors de la création des controlleurs, ajoute l'option -formBackingObject avec une référence sur la dernière entité utilisé. Cette option permet de faire le lien avec l'entité JPA pour le stockage des données du formulaire.

Exemple de code pour un controlleur:
@RooWebScaffold(automaticallyMaintainView = true, formBackingObject = Employee.class)
@RequestMapping("/employee/**")
@Controller
public class EmployeeController {
}


L'annotation RooWebScaffold permet de faire le mapping entre l'entité et la vue (un peu à la façon dont Grails fonctionne). RequestMapping permet d'établir la concordance entre les URLs et les controlleurs.

Remarque: l'application utilise des URL Rest.

Il ne reste plus qu'à exécuter l'application:

mercredi 29 avril 2009

SpringOne Europe 2009: ou comment sauver Java

Nous sommes sauvés

Premier key notes, rencontre avec Rob Johnson, le père de Spring. Comme entrée en matière, il a choisit de parler de ce qui nous inquiète tous: le rachat de Sun par Oracle. Rob souligne l'attitude de suiveur qu'à toujours eu Sun dans le développement de la plate forme, et que, Java est devenu open source, qu'il n'y a donc pas à s'en faire: les innovations vont continuer comme avant, apporté par d'autres sociétés/communautés. Et puis, il ne faut pas s'en faire, SpringSource est là...
A ce demander s'il na pas raison, vu le nombre de développeurs participant à des JSR de JEE 6.
Ensuite, il continue en parlant de la difficulté qu'ont les développeurs de démarrer un projet rapidement, de mettre en place les environements adéquats et conclut en présentant Spring Tool Suite et ROO, en comparant cette offre à celle de la plate forme .NET. Un peu prétentieux non...

Le contenu

Le contenu de la majeur partie des conférences ressemblait à un résumé de la documentation en ligne. Toutefois, certains projets ont su se mettre en valeur parmis lesquels:
  • tc server: un serveur Tomcat associé à une console digne de la console d'administration WebSphere. Elle intégre des outils de monitoring.
  • Spring Faces: Début de l'intégration de JSF 2.0. Intégre le framework JavaScript DOJO permettant d'intégrer des composants graphique avancés (Spring JavaScript). Ce framework utilise Spring MVC à la place des Manage Bean.
  • Spring RESTFul: une implémentation REST basée sur Spring WebFlow et Spring MVC.
  • Groovy: Un langage que l'on ne présente plus... La conférence sur les DSL en Groovy n'était en fait qu'un copié/collé de la conférence servant d'introduction au langage. Dommage, sachant que la facilité d'implémenter des DSL dans ce langage en est le principal intéret.

En conclusion

Une certaine déception, tout d'abord. Étant plutôt habituer aux rassemblements de geek, c'est une drôle d'impression de se retrouver dans une salle remplie de costumes cravates. L'événement était clairement orienté business et destiné à en mettre plein la vue. Il suffit pour cela de voir l'endroit dans le quel SpringOne a était organisé. Malgrés le standing de l'hotel, je ne peut que déplorer le manque de café ou de rafraichissement entre les conférences.
Le moment le plus intéressant de l'événement fut sans doute lundi soir, le repas qui été organisé permettait de discuter avec les différents intervenants et d'échanger des idées, ce qui, même lors d'événements comme Devoxx est assez rare, et particulièrement appréciable.

lundi 23 mars 2009

L'Enquête - The International

Synopsis

Sous des dehors respectables, l'International Bank of Business and Credit est une multinationale de la finance spécialisée dans le blanchiment d'argent et le financement d'opérations illégales.
Face à elle, Louis Salinger, agent d'Interpol, et Eleanor Whitman, district attorney adjoint de Manhattan, sont déterminés à mettre fin à ses activités illicites. Ils sont prêts à tout pour que la justice règle son compte à cette organisation tentaculaire et intouchable, mais pour y parvenir, ils vont eux aussi devoir agir au-delà des lois...
D'un bout du monde à l'autre, contre tous les dangers, Eleanor et Louis se lancent dans une partie à haut risque dont ils ne maîtrisent pas les règles. Une chose est certaine : ce jeu dans lequel leur redoutable ennemi contrôle tout et tout le monde ne s'arrêtera que lorsque l'un des adversaires sera à terre...

Avis

Un film peut un peu long par moment, mais qui décrit assez fidèlement le fonctionnement de certaines institutions financières. On se doute assez rapidement que le héros ne pourra rien faire contre l'IBBC, mais que l'histoire est plus un prétexte pour amener le spectateur a appréhender ce qu'il est possible de faire avec de pareilles outils financiers. Un film à voir plus pour son coté documentaire que pour l'enquête. Dommage, c'est le titre du film.

lundi 9 mars 2009

Implémentation orienté objet avec Oracle

Introduction

Le language PL/SQL met à la disposition du développeur des procédures et des fonctions ainsi que des packages pour les encapsuler. Les défauts de ce mode de programmation sont identiques à ceux rencontrés avec n'importe quel langage procédural:
  • code spaghetti
  • difficulté de maintenance
Pour palier ces différents problèmes, le paradigme objet a été introduit à travers les types.

Le projet: notifications par mail.

Pour introduire les différents concepts de la programmation orienté objet au langage PL/SQL, nous implémentons un modèle permettant l'envoi de mail avec un contenu de type texte et/ou d'un tableau (formatage automatique des colonnes).

  • CONTENT: Une interface représentant le contenu de la notification,
  • COMPOSITECONTENT: Un contenu composé d'autres contenus (texte, tableau ou composite),
  • TEXTCONTENT: Un contenu textuel pour le corps de l'e-mail,
  • TABCONTENT: Un contenu sous forme de tableau,
  • NOTIF: Une notification par e-mail.

Déclaration d'une classe

Une classe en PL/SQL est décrite comme étant un type. Sa structuration est semblable a celle d'un package PL/SQL, c'est-à-dire qu'il y a une partie concernant la déclaration des méthodes et une seconde partie, appelé le body, qui implémente les méthodes.
Un constructeur par défaut (sans paramètres) est ajouté par le compilateur si la classe n'en définit pas.
Le type NOTIF est définit comme étant un objet en le déclarant: AS OBJECT. Nous verrons par la suite comme définir un objet comme héritant d'un autre objet.

ATTENTION: Une contrainte sur la partie déclaration, celle-ci doit contenir au moins un attribut, que ce soit par héritage ou par déclaration propre.

CREATE TYPE NOTIF AS OBJECT
(
mailhost VARCHAR2(254),
to_address CHARLIST,
from_address VARCHAR2(254),
subject VARCHAR2(254),

MEMBER PROCEDURE send
);
/

CREATE TYPE BODY NOTIF AS

MEMBER PROCEDURE send IS
...
END send;

END;
/
En PL/SQL, il n'est pas possible de définir des méthodes ou des attributs privés ou protégés. Tout ce qui est définit dans un type est accessible dés qu'un objet est été créé.
Il également possible de définir des méthodes statiques, c'est-à-dire des méthodes définis pour le type et indépendante de l'instance d'objet. Pour déclarer une méthode statique, il suffit de remplacer le mot clé MEMBER par STATIC.

Instanciation et appels de méthode

L'instanciation dans un nouvel objet ne se fait pas, contrairement à la plupart des langages orientés objets, par l'appel au mot clé new. Celui-ci n'existe pas en PL/SQL. L'initialisation d'un nouvel objet se fait par l'appel au constructeur, comme s'il s'agissait d'une méthode définit dans un package standard. Dans notre cas, il s'agit du constructeur par défaut qui a été ajouté par le compilateur.

declare
n NOTIF;
begin
n := NOTIF();
....
end;

Pour les appels de méthode, le mécanisme implémenté est le même que dans la plupart des langages objet: la notation pointé.

declare
n NOTIF;
begin
n := NOTIF();
....
n.send;
end;

L'appel d'une méthode statique ne nécessite pas la création d'une instance. Elle peut être appelée de la même façon que pour une méthode contenue dans un package: nom_type.nom_methode(arguments...)

Définition d'un constructeur

Nous allons maintenant définir un constructeur pour le type NOTIF. Celui-ci devra prendre en paramètre un objet de type CONTENT.

CREATE TYPE NOTIF AS OBJECT
(

CONSTRUCTOR FUNCTION NOTIF(c CONTENT) RETURN SELF AS RESULT

);
/

CREATE TYPE BODY NOTIF AS

CONSTRUCTOR FUNCTION NOTIF(c CONTENT) RETURN SELF AS RESULT AS
BEGIN
SELF.notif_content := c;
RETURN;
END NOTIF;

END;
/


Le constructeur définit ci-dessus se présente sous la forme d'une fonction retournant SELF comme résultat. SELF est le mot clé définissant une référence à l'objet courant. La fonction doit également être déclarée comme étant un constructeur par l'utilisation du mot clé CONSTRUCTOR. La fin de la méthode doit être indiqué par le mot clé RETURN. Mais aucun objet ne doit être renvoyé.

REMARQUE: SELF étant une référence à l'objet courant, il peut être utilisé pour lever une ambiguïté. Par exemple, lorsqu'une variable locale a le même nom qu'une variable d'instance.

Définition d'une interface

Autant le dire, les interfaces n'existent pas en PL/SQL, mais il est possible de faire quelque chose qui s'en rapproche.
Dans notre exemple, le type CONTENT représente une interface, c'est-à-dire qu'il doit seulement contenir le prototype des méthodes, ne pas être instanciable et pouvoir être hérité. Puisque nous n'avons pas besoin de définir le corps des fonctions, nous n'avons pas besoin de définir le corps du type (partie BODY).

CREATE TYPE CONTENT AS OBJECT
(
text VARCHAR2(4000),

MEMBER FUNCTION format RETURN LONG
) NOT FINAL NOT INSTANTIABLE;
/

La variable d'instance text a été définit pour respecter la syntaxe du langage: tout type doit avoir au moins un attribut, que ce soit par héritage ou qu'il le définisse lui même.
Par défaut, le PL/SQL n'autorise pas l'héritage d'un type. Pour l'autoriser, il faut rajouter à la fin de la déclaration du type: NOT FINAL.
Par défaut, il est autorisé d'instancier n'importe quel type. Pour empécher l'initialisation d'objets de type CONTENT, il faut ajouter à la fin de la déclaration du type: NOT INSTANCIABLE.

L'héritage et polymorphisme

Nous allons maintenant implémenter le type TEXTCONTENT chargée d'implémenter un texte simple. Ce type hérite de CONTENT:

CREATE TYPE TEXTCONTENT UNDER CONTENT
(
MEMBER PROCEDURE set_content(t VARCHAR2),

OVERRIDING MEMBER FUNCTION format RETURN LONG
);
/

CREATE TYPE BODY TEXTCONTENT AS

MEMBER PROCEDURE set_content(t VARCHAR2) IS
BEGIN
SELF.text := t;
END;

OVERRIDING MEMBER FUNCTION format RETURN LONG IS
BEGIN
RETURN SELF.text || chr(13) || chr(10);
END format;

END;
/
L'héritage est déclaré par le mot clé: UNDER. Pour hériter d'un type, le type courant doit être déclaré:
CREATE TYPE TEXTCONTENT UNDER CONTENT
au lieu de:
AS OBJECT.
Le PL/SQL ne supporte que l'héritage simple.

Pour redéfinir une méthode, celle-ci doit être déclarée avec le mot clé: OVERRIDING.
Il est possible de définir un méthode de façon à ce qu'elle ne puisse être redéfini en ajout le mot clé FINAL devant la définition d'une méthode.

Le partage d'objet

Le PL/SQL implémente le passage de paramètre par copie, c'est-à-dire, qu'à chaque fois qu'une variable est affectée à un objet, celui-ci est copié dans une nouvelle instance. Toutefois, un mécanisme nous permet d'utiliser un passage de paramètre par référence. En utilisant le mot clé REF devant le type de la variable, celle-ci peut alors partager un objet avec une autre variable.
Dans notre exemple, il faut donc ajouter "REF" devant les attributs ayant pour type, ceux du projet de notification.

Conclusion

La programmation objet permet d'organiser son code de manière à ce que celui-ci puisse être plus facilement réutilisable. Alors pourquoi ne pas s'en servir en PL/SQL.
Le modèle objet proposé par le PL/SQL est relativement simple (pas d'héritage multiple, ni d'interface), mais il permet tout de même de résoudre des problèmes complexes avec élégance.

Références

Code Source
Documentation Oracle

samedi 7 mars 2009

Everybody is kung fu fighting

Je viens d'obtenir ma ceinture orange sur le site JavaBlackBelt.
C'est un site, basé sur le principe de communauté, qui propose des tests sur différentes technologies Java et même sur d'autres langages. Le principe est simple:
il y a certains tests a passer pour pouvoir obtenir les ceintures, les couleurs correspondent au nombre de points de connaissances, c'est à dire aux points accumulés en passant les tests avec succès. Pour prétendre à passer un test, il est nécessaire d'avoir un certain nombre de points de participation. Ces points peuvent être obtenus en ajoutant des questions à des tests, ou en modifiant des questions.
Pour faciliter l'intégration des nouveaux venus, il existe un chemin à parcourir, c'est à dire un ensemble de tests prédéfinis, où il n'est pas nécessaire d'avoir des points de participations. Biensûr, il n'y a qu'une dizaine d'examens de disponibles sur ce chemin, mais cela permet d'aller jusqu'à la ceinture verte.

samedi 21 février 2009

De l'utilité des certifications

Personnellement, j'ai trois certifications Java:
  • Java programmer sur JDK 1.4,
  • Web component pour J2EE 1.4,
  • Business component pour J2EE 1.4.
Je me pose la question de l'utilité de les mettre à jour.
Drôle de question lorsque l'on se fi à ce que le site veut nous faire croire: passer une certification vous donnera une justification de votre niveau dans une technologie et ne peut être que bénéfique pour valoriser votre CV.

Mes certifications n'ont jamais eu la moindre influence sur mon parcours, pour preuve, juste après les avoir passées, mon patron m'a assigné à des projets Perl et C++. Et aucune chance de basculer vers des projets Java, j'ai essayé...

Et ce n'est pas plus valorisant pour postuler dans une nouvelle société. A chaque entretien, je soulignais soigneusement mes certifications pour montrer à quel point mon niveau était élevé... Mais les employeurs potentiels ne s'intéressaient qu'aux différents projets sur lesquels j'avai travaillé.

Ma démarche concernant les certification était la suivante: une certification pour appréhender une technologie. Je pense que je m'y suis pris à l'envers.La certification devrait permettre d'entériner une expérience professionnelle: un projet J2EE 5 pendant un an, puis la certification.

Sans savoir faire, la connaissance théorique apportée par la préparation d'une certification n'apporte malheureusement pas grand chose. Je me souviens d'un projet servlet/JSP sur lequel j'ai travaillé après avoir passé la certification web component. Heureusement que j'avais le livre qui m'a servit à la préparer, sinon, le projet aurait difficilement aboutit.

Une autre question: l'expérience ne serait elle pas en faire valoir suffisant? Est il réellement besoin de passer un examen pour valider des connaissances aquises pendant la réalisation de projets?

jeudi 19 février 2009

Adobe Flex 3: Training from the Source de Jeff Trapper, Michael Labriola, Matthew Boles, James Talbot

Ce livre est prétexte à la mise en place d'une application d'e-commerce, ce qui permet de faire le tour des différents aspets de Flex.
J'avais une peur concernant ce livre, c'est qu'il soit centré uniquement sur Flex Builder, l'environement de dévelopement d'Adobe. Dans les premières leçons, l'environement est utilisé de manière intensive, mais on arrive rapidement à mettre les mains dans le MXML et l'ActionScript.
Chaque chapitre est centré sur un théme, qui est expliqué en dehors du contexte de l'application d'e-commerce, avec plusieurs exemples simples. Puis, la leçon est appliquée à l'application, pas à pas. Le code disponible sur le CD permet de reprendre une leçon au début ou, suivant sa longueur, au milieu de celle-ci.
Une bonne surprise est que des rudiments de la plateforme AIR font l'objet d'un chapitre.
Seul regret, concernant la partie communication avec le serveur, aprés l'annonce tonitruante en 2007 à Javapolis, de la disponibilité de Flex 3 et de ses formidables possibilités d'intégrations avec Java, que le backend fournit soit basé sur ColdFusion. J'aurais également voulu abordé la communication avec le serveur un peu plus tôt.
Globalement un bon livre, à ranger dans les livres de référence sur le sujet.

mercredi 28 janvier 2009

Java EE 5 2e édition par Antonio Goncalves

Un bon livre d'initiation aux spécifications J2EE. Il couvre les principaux sujets auxquels on pouvait s'attendre. Le bémol vient des trois premiers chapitres qui portent sur la description de l'application sur laquelle est basé l'ouvrage et sur l'environnement de développement.
L'application est le traditionnel magasin d'animaux en ligne. L'auteur précise qu'il utilise cette application parce qu'elle fait parti d'un blue print de Sun et non par commodité. On lui pardonnera donc d'utiliser cet exemple "bateau".
Ce que j'ai également beaucoup apprécié est la description de JAXB comme étant une des pièces maitresse des web service.
Je recommande ce livre à tous ceux qui veulent avoir une overview de la spécification J2EE. Sans permettre de construire une application compléte, cet ouvrage forunit un quick start sur un grand nombre des technologies Java.