jeudi 26 décembre 2013

Problème avec le déploiement de ROOT.war dans Tomcat sur le cloud Openshift

J'ai rencontré un problème lorsque j'ai voulu déployer mon fichier ROOT.war dans Tomcat sur le cloud OpenShift.Il ne prenait pas en compte mon fichier mais seulement le ROOT.war d'Openshift.
En fait, lorsque on exécute git push, il exécute automatiquement la commande mvn qui génère le ROOT.war d'OpenShift.

Pour résoudre ce problème, il faut :
- Effacer src/ directory
- Effacer pom.xml

lundi 23 décembre 2013

Bitbucket vs Github


Bitbucket est un concurrent de GitHub qui mérite d'être connu. En effet, il est possible de créer des repositories privés (autant que l'on veut) ayant pour seul limite le nombre d'utilisateur. C'est très pratique si vous souhaitez vous faire quelques projets perso.
Voici ci-dessous un article très bien fait qui compare GitHub et Bitbucket : http://hypedrivendev.wordpress.com/2013/11/29/bitbucket-vs-github/




jeudi 19 décembre 2013

Bootstrap ajout de la classe active class to li

Dans l'exemple ci-dessous, nous avons un menu classique Bootstrap. Il faut noter qu'aucune class active n'est présente :
    <div class="navbar navbar-default span12" role="navigation">
            <...>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a href="/fjLearning/"><g:message code="menu.home" /></a></li>
                    <li><a href="/fjLearning/page/training"><g:message code="menu.training" /></a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown"><g:message code="menu.about" /> <b class="caret"></b></a>
                        <ul class="dropdown-menu">
                            <li><a href="/fjLearning/page/about"><g:message code="menu.about.perso" /></a></li>
                            <li class="divider"></li>
                            <li class="dropdown-header"><g:message code="menu.about.site" /></li>
                            <li><a href="/fjLearning/page/under"><g:message code="menu.underTheHood" /></a></li>
                            <li><a href="#">FAQ</a></li>
                        </ul>
                    </li>
                </ul>
            </div>
    </div>

Pour que cela fonctionne, j'ai juste ajouté dans chaque page :
<body>
<script>
    $(document).ready(function() {
        $('a[href="' + this.location.pathname + '"]').parent().addClass('active');
    });
</script>
...

A présent, lorsque je clique sur un des éléments de mon menu, il est automatiquement sélectionné.
Si vous voulez voir un exemple pratique, vous pouvez voir mon projet Grails sur GitHub : https://github.com/drieu/fjLearning

Voici les deux fichiers utiles :
https://github.com/drieu/fjLearning/blob/master/grails-app/views/layouts/_menu.gsp
https://github.com/drieu/fjLearning/blob/master/grails-app/views/page/training.gsp

dimanche 15 décembre 2013

Bootstrap : span ne fonctionne pas

J'ai essayé de faire fonctionner une simple row avec Bootsrap mais sans succès :

<div class="row" style="border: 1px solid green">
        <div class="span2" style="border: 1px solid red">Foo!</div>
        <div class="span2" style="border: 1px solid red">Bar!</div>
        <div class="span2" style="border: 1px solid red">Baz!</div>
        <div class="span2" style="border: 1px solid red">Foo!</div>
        <div class="span2" style="border: 1px solid red">Bar!</div>
        <div class="span2" style="border: 1px solid red">Baz!</div>
</div>

En faite, j'utilise Bootstrap 3.x qui contient des balises différentes de Bootstrap 2.x.Par exemple, span-* a été remplacé par col-md-*.
Donc pour l'exemple ci-dessus, la solution est  :

<div class="row" style="border: 1px solid green">        <div class="col-md-2" style="border: 1px solid red">Foo!</div>        <div class="col-md-2" style="border: 1px solid red">Bar!</div>        <div class="col-md-2" style="border: 1px solid red">Baz!</div>        <div class="col-md-2" style="border: 1px solid red">Foo!</div>        <div class="col-md-2" style="border: 1px solid red">Bar!</div>        <div class="col-md-2" style="border: 1px solid red">Baz!</div></div>

Pour plus de détails :
http://getbootstrap.com/getting-started/#migration
http://stackoverflow.com/questions/18527466/twitter-bootstrap-span-columns-not-displaying-correctly/18527554#18527554

jeudi 12 décembre 2013

Ajout de bouton de réseaux sociaux avec Grails



Voici un moyen simple et sans problème de performance pour ajouter un bouton Tweeter à votre application :
            <a target="_blank" title="Twitter" href="https://twitter.com/share?url=<g:createLink action="${params.action}" absolute="true"/>&text=<g:message code="training.title" /> sur <g:createLink action="${params.action}" absolute="true"/>" class="tweet-button" rel="nofollow" onclick="javascript:window.open(this.href, '', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=400,width=700');return false;"><img src="/fjLearning/images/twitter_icon.png" width="32" height="32"/></a>


L'avantage de cette méthode, c'est que vous ne rencontrez pas de problème de temps de chargement pour vos pages à cause des javascripts.
Autre remarque, nous utilisons <g:createLink action="${params.action}" absolute="true"/> pour générer le lien complet vers votre page.La variable params.action permet de récupérer l'action en cours.

Si vous cherchez d'autres exemples de boutons pour des réseaux sociaux (Facebook, Google+ ...), vous pouvez voir ce lien : http://korben.info/bouton-partage-twitter-facebook-sans-tracking.html

vendredi 6 décembre 2013

Grails : URL complet d'une gsp



Si vous avez besoin de l'url complète pour accèder à votre page, vous pouvez utiliser la balise createLink :
<g:createLink action="${params.action}" absolute="true"/>
Voici un exemple d'URL généré : http://localhost:8080/fjLearning/training

Il faut noter aussi que la variable params.action permet de récupérer l'action en cours. Dans notre cas, l'action training.

Plus d'informations sur la balise createLink : http://grails.org/doc/latest/ref/Tags/createLink.html

mercredi 27 novembre 2013

Error No default container found with grails

J'ai trouvé la solution à ce problème sur StackOverFlow : http://bit.ly/1a5otJX

Grails internationalization testing

J'ai rencontré quelques problèmes pour tester l'internationalization avec Grails.
J'ai essayé de changer la requête en ajoutant par exemple ?lang=us comme indiqué dans la documentation de Grails mais sans succès.

J'ai trouvé une solution très simple. Il suffit de changer la langue dans votre navigateur. Cela changera l'attribut "Accept Language" dans la requête HTTP envoyé.
Par exemple dans Firefox, il suffit d'aller dans Outils -> Option -> Contenu et dans langue puis de mettre le langage que vous voulez tester en premier.

Ensuite, vous avez seulement à recharger la page. Si vous utiliser un addons tel que HttpFox, vous pourrez voir la valeur "Accept Language" de la requête http.

mercredi 20 novembre 2013

Coding Dojo

Voici un autre lien pour apprendre écrire et tester du code directement le navigateur : http://bit.ly/1dpne8b

lundi 18 novembre 2013

JMC dans Java 7u40

Un nouvel outils pour gérer la mémoire, les performances et trouver les fuites mémoires est disponibles dans Java 7u40 :

http://blog.eisele.net/2013/09/java-mission-control-52-is-finally-here.html

mercredi 13 novembre 2013

codeacademy : un bon moyen d'apprendre html,css,php,javascript ou jquery







Si vous cherchez à apprendre des technos comme html,css,php,javascript or jquery vous devriez regarder Codeacademy

http://www.codecademy.com/assets/codecademy_logo_smallest-0323fdd409fc100a1991db8aa706f57e.png

Ce site web vous aide à apprendre ces technos à l'aide de plusieurs cours et des exercices en ligne.Par exemple, sur la même page, vous avez le cours, l'exercice et une preview. Le site est bien fait et le nombre de cours est important. Petit point négatif, les premiers exercices sont un peu trop simple à mon goût ...


Exemple :

samedi 9 novembre 2013

Grails : activer la compression GZip





Si vous voulez améliorer les performances de votre site web, vous pouvez activer la compression GZip.


La compression GZip : qu'est ce que c'est ?


Le principe est simple : on compresse les données avant de les transmettre par le réseau :
  1. Le serveur compresse les données (code HTML, CSS, JavaScript...)
  2. Les fichiers transitent par le réseau via HTTP
  3. Le navigateur décompresse à la volée les données avant de les interpréter

Ces techniques sont prévues dans HTTP/1.1

Est-ce que cela améliore vraiment les performances ?

Vous pouvez le vérifier sur cette page : http://stevesouders.com/hpws/rule-gzip.php



Grails et GZip

Pour activer la compression GZip, c'est très simple.
Il vous suffit d'installer le plugin ui-performance :

grails install-plugin ui-performance

Puis de redémarrer votre navigateur.


Remarque :

  • Si vous voulez vérifiez, que la compression GZip est bien installé, vous pouvez lancer un audit sous Chrome ( Onglet audits dans les outils de développement).
  • Le plugin ui-performance ne fait pas que activer la compression GZip, il met en oeuvre les règles de Steve Souders et de l'équipe performance de Yahoo : http://stevesouders.com/hpws/rules.php  

Greyhound, the 2nd fastest land animal


vendredi 8 novembre 2013

Marseille JUG soirée Lucene/Solr


le JUG organisera avec France Labs la soirée Lucene/Solr le jeudi 28 octobre: découvrez les outils open source de Search qui ont déjà convaincu de nombreuses entreprises, et qui est proposé par la fondation Apache: Lucene / Solr.

Toutes les infos sont sur la page du JUG : http://marsjug.org/#reunions

mercredi 6 novembre 2013

Une place à gagner pour Devoxx France 2014

Developpez.com propose un quizz pour gagner une place pour Devoxx 2014.
Un super cadeau !
Plus d'infos sur http://java.developpez.com/evenements/devoxx2014/quizz/


dimanche 7 juillet 2013

Grails generate-all No domain class found for name

Problème :

J'apprend l'utilisation de la commande "generate-all" et j'ai toujours le message d'erreur suivant : "No domain class found for name User".
J'ai saisi la commande suivante :

grails generate-all User


Remarque : J'utilise la version 2.1.5 de Grails donc peut être que cela fonctionnera mieux avec une version récente.

Voici le détail de l'erreur:
| No domain class found for name User. Please try again and enter a valid domain
 class name
| Error 2013-06-30 13:51:40,907 [Thread-10] ERROR plugins.DefaultGrailsPlugin  -
 Error configuration scaffolding: Error creating bean with name 'instanceControl
lersApi': Singleton bean creation not allowed while the singletons of this facto
ry are in destruction (Do not request a bean from a BeanFactory in a destroy met
hod implementation!)
Message: Error creating bean with name 'instanceControllersApi': Singleton bean
creation not allowed while the singletons of this factory are in destruction (Do
 not request a bean from a BeanFactory in a destroy method implementation!)
   Line | Method
->> 722 | run in java.lang.Thread


Solution

grails generate-all racetrack.User
La classe de domaine User se trouve dans un répertoire "racetrack" : $GRAILS_APPdomain/racetrack/User.java


samedi 6 juillet 2013

Grails : champs date remplis automatiquement

Dans les classes mappées avec la base de données, il est possible de remplir automatiquement des champs date lors de la création ou lors d'une mise à jour. Pour cela, Grails a défini une convention dans le nom des champs date. Pour que les champs Date soient remplis automatiquement, il faut qu'il se nomme dateCreated ou lastUpdated.

Exemple :
class Person {
   Date dateCreated
   Date lastUpdated
}
 
 
Il est possible de désactiver cette fonctionnalité de la manière suivante :
 
class Person {
   Date dateCreated
   Date lastUpdated
   static mapping = {
      autoTimestamp false
   }
} 

Voir aussi :

Apprendre Grails avec un livre

Je suis en train d'apprendre Grails.
J'ai choisi  "Grails getting started". Ce livre est simple à comprendre (même en anglais) et pas ennuyeux.
Voici le lien : http://www.infoq.com/minibooks/grails-getting-started

mardi 2 juillet 2013

Grails : connaissez-vous le plugin CRaSH ?

Grails


Vous avez la possibilité d'embarquer CRaSH dans votre application Grails et cela très facilement en installant le plugin CRaSH. C'est très simple :

cd $PATH_TO_MY_GRAILS_APPLICATION
grails install-plugin crash

 
Maintenant, il ne vous reste plus qu'à vous connecter avec CRaSH.
Cela se fait en 2 étapes :
  • Récupération pour le Process PID de votre application Grails :
cd $JAVA_HOME/bin
jps
  • Lancement de CRaSH
cd $CRASH_HOME/bin
crash.sh PID

Maintenant, vous avez accès à toutes les commandes CRaSH (jdbc, jpa, thread ...) et vous pouvez faire vos propres commandes !

CRaSH : http://www.crashub.org/
Grails CRaSH plugin : https://github.com/crashub/grails
Grails : http://grails.org/



samedi 29 juin 2013

Où sont stocker les fichiers temporaires Grails ?


Grails stocke les fichiers dans le répertoire .grails.

  • Sur Linux : $HOME/.grails
  • Surwindows : c:\Users\myUser\.grails

Vous pouvez effacer ces fichiers temporaires : grails clean
Voici la description officiel de la commande clean :

The clean command deletes all compiled resources from the application. Since Groovy is a compiled language, as with Java, this is sometimes useful to clear old instances of classes and ensure correct compilation. It's also a good idea to run this script before running tests or creating a WAR file to ensure a full compilation occurs.

La commande clean efface toutes les resources compilées de l'application. Depuis que Groovy est un langage compilé (comme Java), il est parfois utiles d'effacer les veilles instances de classes pour être sûr que la compilation soit correct.C'est aussi une bonne idée de lancer un cleab avant de lancer des tests ou avant de créer un war pour s'assurer que la compilation soit complète.

vendredi 28 juin 2013

Koans : Apprendre par les test unitaires !

Je vous ai déjà parlé de Koans pour apprendre Groovy. Mais ce que je ne savais pas, c'est qu'il existait pour d'autres langages : JavaScript, Ruby ...

Plus d'informations sur : http://technotzen.wordpress.com/2013/06/01/koan-are-the-best-way-to-learn-code/

jeudi 27 juin 2013

Comment afficher les champs dans le bon ordre lorsque l'on utilise Scaffolding dans Grails ?


Voici la définition officielle :

Scaffolding lets you auto-generate a whole application for a given domain class including:
  • The necessary views
  • Controller actions for create/read/update/delete (CRUD) operations

Scaffolding vou permet de générer une application entière pour une classe de domaine incluant :
Les vues nécessaires
Les actions du Controlleur : lecture, écriture, delete

Par exemple, si vous définissez la classe de domaine suivante :

class User {

String name
String tel
String addr

}
Vous vous attendez à avoir les champs HTML dans le même ordre. Mais ce n'est pas forcément le cas. En fait, il semble que l'ordre par défaut soit l'ordre alphabétique. Pour avoir les champs HTML avec l'ordre désirée, vous devez procéder comme ceci :

statics constraints = {
     name()
     addr()
     tel()
}
 Cette méthode vous permet aussi de définir la validation, les contraintes pour vos formulaires ...


Marseille JUG Soirée Elastic Search le 4 juillet

 



Finalement, il y aura une dernière soirée pour la saison le 4 juillet avec David Pilato qui viendra présenter Elastic Search:

Vous utilisez encore des requêtes SQL pour faire des recherches ? Vos utilisateurs vous reprochent de ne pas pouvoir chercher sur toutes les rubriques ? Votre temps de réponse moyen est supérieur à la demi-seconde avec seulement quelques millions de documents ? Il vous faut 3 jours pour produire des statistiques sur vos données ? Vous rêvez d’offrir une recherche "à la google" sur les données de votre SI ?

Ne cherchez plus ! Cette conférence est faite pour vous.
Plus de détails sur le site sur MarsJUG: http://marsjug.org/#reunions

Les inscriptions se font sur event brite: http://www.eventbrite.fr/event/7210361385

Quoi de new dans Java 8 ?

So@t Java 8



Sur blog.soat, il y a une série intéressante de 3 articles sur Java 8 :

http://blog.soat.fr/2013/06/java-8-whats-new-13-project-lambda/
http://blog.soat.fr/2013/06/java-8-whats-new-23-date-and-time/
http://blog.soat.fr/2013/06/java-8-whats-new-33-type-annotations-et-nashorn/


mercredi 26 juin 2013

Grails : pourquoi les données ne sont pas persistées ?

Par défaut avec Grails, on est en mode développement.C'est pourquoi, chaque fois que l'on redémarre notre application, on perd ses données.

Par exemple, si vous utilisez scaffold et que vous sauvegardez des données, au prochain redémarrage, vous ne retrouverez pas ce que vous avez sauvegarder :

class RegistrationController {

    def scaffold = true
}
La première fois, c'est un peu frustrant ...
Si vous voulez voir les données après un redémarrage, vous devez changer la configuration de la base de données. Si vous ne voulez pas attendre, vous pouvez lancer la commande suivante :
 grails prod run-app
 Ensuite, si vous sauvegardez des données, elles seront toujours présentes au prochain redémarrage.

AscciDoc vs Markdown


AscciDoc and Markdown vous permettent décrite à l'aide d'un langage simple du texte dans le but de générer par exemple des pages HTML. Ces deux langages sont les plus populaires du moment (Par exemple Markdown est utilisé par GitHub).
Si vous voulez un exemple : Markdown

Quel est le meilleur choix ?

Bonne question ... Je n'ai pas de réponse à donner mais voici un lien avec une dicussion intéressante dessus : https://github.com/awestruct/web-editor/issues/12#issuecomment-19943154



Lien utiles :


Daring Fireball
MarkDown
http://daringfireball.net/projects/markdown/ 







AsciiDoc Text based document generation http://www.methods.co.nz/asciidoc/

mardi 25 juin 2013

Initialisation d'une List en Groovy et en Java


En suivant le tutoriel de http://groovykoans.org/, on remarque que Groovy possède pleins d'astuces qui rendent le code plus concis et aussi plus simple à utiliser.

Voici une comparaison très simple entre Groovy et Java pour initialiser les éléments dans une liste :

En java :

        List<String> javaList = new ArrayList<String>();
        javaList.add("King");
        javaList.add("Queen");
        javaList.add("Prince");

En Groovy :

        def groovyList = ['King', 'Prince']






Plus d'infos sur http://groovy.codehaus.org/JN1015-Collections

Résumé des fonctionnalités Java EE7

Un bon résumé sur ce qui est dans Java EE 7 : http://blog.ippon.fr/2013/06/18/java-ee-7-plus-quun-nouveau-numero-de-version/

Tendances informatiques : Redhat EHL abandonne Mysql pour MariaDB !


Une petite news que j'ai trouvé intéressante car elle montre la tendance du moment...
Mysql est partout ! Cependant, de plus en plus, on entend que beaucoup abandonne Mysql pour MariaDB. Le dernier en date à avoir migrer est RedHat !

La première raison de ce changement est que MariaDB est vraiment Open Source. Ensuite, MariaDB aurait de meilleurs performances ...
Pour information, MariaDB est un fork de Mysql fait par un des trois co-fondateur de Mysql.

Pour plus d'information sur les fonctionnalités de MariaDB : 
https://kb.askmonty.org/en/mariadb-versus-mysql-features/

Le passage de Mysql à MariaDB de RedHat :
http://www.itwire.com/business-it-news/open-source/60292-red-hat-ditches-mysql-switches-to-mariadb

MySQLMariaDB

samedi 22 juin 2013

Comment changer le numéro de port du serveur dans votre application Grails ?

Dans votre application web, il faut editer conf/BuildConfig.groovy de la manière suivante ;

grails.server.port.http = 8090

Exemple :
grails.project.dependency.resolution = {
    // inherit Grails' default dependencies
    inherits("global") {
        // specify dependency exclusions here; for example, uncomment this to disable ehcache:
        // excludes 'ehcache'
        grails.server.port.http = 8090
    }
    log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
    checksums true // Whether to verify checksums on resolve
    legacyResolve true // whether to do a secondary resolve on plugin installation, not advised but here for backwards compatibility

Cette astuce vient de http://stackoverflow.com/questions/10955899/how-to-change-grails-localhost-port

mardi 18 juin 2013

Tutoriel sur les nouveautés d'IntelliJ IDEA 12.1, premières impressions

Je viens de publier un article sur developpez.com sur IntelliJ : http://damienrieu.developpez.com/tutoriel/java/nouveautes-intellij-12/

J'ai pris beaucoup de plaisir à faire cette article et à découvrir cet IDE.Si vous avez des commentaires, des questions, n'hésitez pas !

mardi 11 juin 2013

Marseille JUG : Soirée Groovy avec Guillaume Laforge


Guillaume Laforge, le chef de projet de Groovy, viendra présenter Groovy le mardi 18 juin.
Plus d'informations sur http://marsjug.org/#reunions

lundi 10 juin 2013

Pourquoi choisir mongoDB ?


Depuis quelques temps, le monde NoSql m'intrigue. Je suis tombé sur un billet intéressant sur MongoDB. Je vais d'ailleurs intégrer MongoDB sur un de mes projets web pour me faire une idée ...
Voici le lien http://dev.af83.com/2010/01/28/pourquoi-choisir-mongodb.html

samedi 8 juin 2013

Grails : un remplaçant de Play 1.X ?

Etant donné que Play 1.X devient obsolete, j'ai décidé de me mettre à Grails.
Grails est un framework qui me semble mature. De plus, j'ai constaté pas mal de similitude et en plus j'ai une préférence pour le langage Groovy.

Voici un tutoriel pas mal pour configurer Grails avec une base de donnée Mysql : http://learnedstuffs.wordpress.com/2012/02/21/using-mysql-as-database-in-grails/

lundi 3 juin 2013

hackegarten au Marseille JUG !


Le marseille JUG organise un hackegarten le mercredi 5 juin.
Un hackegarten vous permet de participer à un projet open source avec l'aide des commiters ou contributeurs sur ces projets. Cela permet de débuter plus facilement sur un projet.
Pour plus d'informations, vous pouvez consulter http://marsjug.org/#reunions

Blog de Keulkeul - Eclipse / OSGi / Java / NoSQL: Liens pratiques de la semaine

Blog de Keulkeul - Eclipse / OSGi / Java / NoSQL: Liens pratiques de la semaine: Vous trouverez dans ce billet une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement...

Dans ce billet, vous trouverez plusieurs liens intéressant dont un qui a attiré mon attention.
C'est un site qui vous permet d'apprendre Git de manière interactive : http://pcottle.github.io/learnGitBranching/ 

jeudi 9 mai 2013

Maven et Java 7 : Fatal error compiling: invalid target release: 1.7


 Problème

Sur un projet Maven, je suis passé de java 1.6 à java 1.7 dans mon pom.xml


[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile) on project MetricViewer: Fatal error compiling: invalid target release: 1.7 -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException



Solution

 Vous utilisez probablement encore Java 6.
 Pour le vérifier, faites :

mvn clean install --debug

  1 Apache Maven 3.0.3 (r1075438; 2011-02-28 11:31:09-0600)
  2 Maven home: /usr/share/maven
  3 Java version: 1.6.0_35, vendor: Apple Inc.
  4 Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home



J'ai trouvé cette solution sur http://stackoverflow.com/questions/14043042/compiling-java-7-code-via-maven

samedi 27 avril 2013

CRaSH 1.2.2 release

Une nouvelle version de CRaSH est disponible.

Cette version  apporte quelques améliorations. Pour plus d'informations, vous pouvez consulter le lien suivant : https://groups.google.com/forum/?fromgroups=#!topic/crash-users/p06x34J_Uy8 ou http://www.crashub.org/

Article sur IntelliJ

Bonjour,

En ce moment, je prépare un article sur IntelliJ pour developpez.com.
Il avance mais il est encore loin d'être terminé : http://damienrieu.developpez.com/article/intellij/
Si vous avez des remarques ou des critiques, n'hésitez pas !

samedi 30 mars 2013

InvokeDynamic


A Devoxx,j'ai vu une présentation vraiment intéressante de Charles Nutter sur InvokeDynamic.

Voici un article complet de Charles Nutter   :http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html

Et les slides de la présentation  :http://fr.slideshare.net/CharlesNutter/invokedynamic-in-45-minutes

J'ajoute aussi l'article d'Oracle car il apporte des définitions en plus http://docs.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html#challenges

vendredi 22 mars 2013

Tester CRaSH en ligne


Si vous ne connaissez pas CRaSH, je vous recommande de le tester !
Vous pouvez le faire en ligne : http://try.crashub.org/

Envoi d'une requête POST sur Google App Engine


Pour envoyer une requête POST sur Google App Engine, vous avez besoin d'utiliser le service Google : Url Fetch service. "The URL Fetch service uses Google's network infrastructure for efficiency and scaling purposes".

Voici un exemple très simple :

   public void send(String messageToSend, String date, String level, String servers) {

        try {
            String message = URLEncoder.encode(messageToSend, ENCODING);
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyUrl, Integer.parseInt(proxyPort)));

            URL url = new URL(urlDest);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy);
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");

            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
            writer.write("date=" + date);
            writer.write("&level=" + level);
            writer.write("&servers=" + servers);
            writer.write("&msg=" + message);
            writer.close();

            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                logger.info("OK ! message returned:" + connection.getResponseCode());
            } else {
                logger.info("KO ! message returned:" + connection.getResponseCode());
            }
        } catch (MalformedURLException e) {
            logger.error(e.getMessage());
        } catch (IOException e) {
            logger.error(e.getMessage());
        }
    }

J'ai fait un petit projet jave ( 2 class ;-) ) qui envoi une requête POST :  https://github.com/drieu/Tools
Plus de détails sur https://developers.google.com/appengine/docs/java/urlfetch/overview

mercredi 20 mars 2013

Retour d'expérience sur la création d'une application sur Google AppEngine

Objectif :

Créer une application d'alerte sur Google App Engine et évaluer
ce qui est le plus simple et le plus rapide.Voici un petit retour d'expérience :

Test 1 : Création d'un projet avec GWT


Inconvénient


1) Installation

  •  Netbeans : Ne fonctionne pas chez moi.Problème d'installation avec le plugin ...
  • Intellij : Pas de plugin
  • Eclipse : OK et c'est facile

2) Développer son application

J'ai voulu faire une petite application rapidement mais je trouve GWT un
peu compliqué. (Voir https://github.com/drieu/gwtalert).
C'est aussi une histoire d'habitude.

Avantage

Création et déploiement sur Google App Engine facile et rapide à condition
d'utiliser Eclipse.


Test 2 : Création d'un projet Play 1.2.5 avec le plugin GAE

 

Avantage


Facilité de développement grace au framework Play.

 

Inconvénient

  • J'ai eu des difficultés de configuration avec le proxy.
  • J'ai posté la solution sur GitHub : https://github.com/drieu/PlayWithGoogleAppEngine
  • Play 1.2.5 n'est plus maintenu.A voir si le projet yalp va marcher

lundi 18 mars 2013

Monitoring des jobs Play avec CRaSH



Si vous cherchez un moyen simple de monitorer des jobs Play (1.2.5), vous pouvez utilisez
CRaSH et en ligne de commande, il vous suffit de saisir :
% dashboard | thread ls -n "jobs-thread*"
Plus d'informations sur http://www.crashub.org/

jeudi 14 mars 2013

Premier pas avec le cloud Open Shift de Red Hat

Mon objectif : Deployer une application Play 1.2.5 sur OpenShift.

Pour cela, j'ai utilisé le lien suivant : planet_jboss


Résumé des étapes :


- Création de mon application :


J'ai crée directement une application JBoss 7 sur le site.Toutes les commandes pour cloner et se connecter
en ssh sont présentes.Il y a juste à faire un copier-coller.

- Installation sur Gentoo :


emerge dev-ruby/rubygems
ruby -e 'puts "Welcome to Ruby"
gem install rhc


- Initialisation (en tant que user)

rhc setup

- On clone le repo de notre application sur redhat


git clone ssh://XXX/~/git/monapp.git/

Ensuite j'ai suivi les étapes du lien ICI

- Export du war dans monapp/deployements :

play war -o /home/toto/monapp/deployments/cookies.war
git add deployments/cookies.war*
git push

- Vérification du déploiement

- Connexion en ssh sur le le cloud de redhat
- tail -f jbossas-7/logs/server.log


Remarque :

- J'ai essayé d'utiliser le cloud en entreprise.Je n'ai pas réussi en raison de proxy et de firewall.
J'ai essayé de me connecter en ssh par le port 80 mais sans succès.
- De chez moi, je n'ai rencontré aucun soucis et rapidement j'ai pu déployer une application sur le cloud de RedHat.

samedi 9 mars 2013

JavaFx et Maven exemple



Pour apprendre JavaFx, j'ai commencé un petit projet sur GitHub.
J'utilise JavaFx 2 et Maven. Peut être cela peut vous aider à démarrer vos propre projets.

Pour plus d'info : https://github.com/drieu/MetricViewer

jeudi 7 février 2013

sbt.ResolveException: download failed: org.slf4j#slf4j-api;1.6.6

Problème

Lorsque que j'exécutais la commande play run, j'avais l'erreur suivante :

[error] (*:update) sbt.ResolveException: download failed: org.slf4j#slf4j-api;1.6.6!slf4j-api.jar
[warn] some of the dependencies were not recompiled properly, so classloader is not avaialable

Solution

vi ./project/plugins.sbt

Il faut modifier le fichier en ajoutant la dernière version de play (2.1.0) :

// Comment to get more information during initialization
logLevel := Level.Warn

// The Typesafe repository
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.1.0")

Ensuite vous pouvez redémarrer play run

samedi 26 janvier 2013

Fermeture de KnowledgeBlackBelt

Mauvaise nouvelle !
Le site KnowledgeBlackBelt va fermer le 31 janvier 2013.
Pour info, le contenu est accessible gratuitement.

play 2.1 : Create yout first projetc with IntelliJ Tips


Pour créer un projet avec Play, c'est très facile :

$ play new my-app 
$ cd my-app 
$ play idea

Par contre, j'ai eu quelques difficultés avec la manière d'importer le projet dans IntelliJ. Dans la documentation, il parle d'import de modules mais dans mon cas, cela ne fonctionner pas bien ...

Donc, contrairement à ce qui est marqué dans la documentation, une fois que j'ai crée le projet et que je l'ai initialisé pour Play, je fais juste  :  File --> Open

Cela me créer mon projet correctement :-)


dimanche 6 janvier 2013

java 8 : Interfaces fonctionnelles


Dans cette article, nous allons aborder la notion des interfaces fonctionnelles. C'est le point d'entrée pour utiliser les nouvelles features de JAVA 8.

Definition de la JSR 335

A functional interface is an interface that has just one abstract method, and thus represents a single function contract. (In some cases, this "single" method may take the form of multiple abstract methods with override-equivalent signatures (8.4.2) inherited from superinterfaces; in this case, the inherited methods logically represent a single method.)
In addition to the usual process of creating an interface instance by declaring and instantiating a class, instances of functional interfaces can be created with lambda expressions, method references, or constructor references.
The function descriptor of a functional interface I is a method type—type parameters, formal parameter types, return types, and thrown types—that can be used to legally override the abstract method(s) of I.

Pour faire court, une interface fonctionnelle n'est rien d'autre qu'une interface avec une méthode abstraite.

Exemple simple :

Voici un exemple simple :

ICode.java

 package fr.dr.practice;

/**
 * Interface with just one abstract method.
 */
public interface ICode {
    String generate(int codeNumber);
}
Main.java

package fr.dr.practice;

/**
 * Created with IntelliJ IDEA.
 */
public class Main {

    public static String generateTmpCode(int newCode) {
        ICode code = new ICode() {
            @Override
            public String generate(int codeNumber) {
                return "MAIN_" + codeNumber + Math.random();
            }
        };
        return code.generate(newCode);
    }

    public static String generateTmpCodeWithLambda(int newCode) {
        ICode icode = codeNumber -> "MAIN_" + codeNumber + Math.random();
        return icode.generate(newCode);
    }

    public static void main(String[] args) {
        System.out.println(Main.generateTmpCode(12));
        System.out.println(Main.generateTmpCodeWithLambda(12));

    }
}

Un peu plus dur ...

La JSR nous dit que dans certains cas, on peut définir plusieurs méthodes qui représente une seule méthode :

In some cases, this "single" method may take the form of multiple abstract methods with override-equivalent signatures (8.4.2) inherited from superinterfaces; in this case, the inherited methods logically represent a single method.

Nous pouvons donc faire le cas suivant car equals() est public dans la classe Object :

public interface ICode {

    String generate(int codeNumber);
    boolean equals(Object obj);
}

Cependant, il n'est pas possible d'utiliser la méthode clone() (protected Object clone() throws CloneNotSupportedException {) car elle n'est pas public dans la classe Object :

public interface ICode {

    String generate(int codeNumber);
    Object clone();
   
}

Function descriptor 

La JSR 335 ajoute aussi le concept de Functional descriptor.
Voici un exemple de la JSR pour comprendre cette notion :



interface X { void m() throws IOException; }
interface Y { void m() throws EOFException; }
interface Z { void m() throws ClassNotFoundException; }
interface XY extends X, Y {}
interface XYZ extends X, Y, Z {}

// XY has descriptor ()->void throws EOFException
// XYZ has descriptor ()->void (throws nothing)

Conclusion

Les interfaces fonctionnelles vont permettre d'utiliser les lambda et d'autres JAVA 8 features.
 Il existe déjà des interfaces fonctionnelles dans le package java.util (e.g java.util.Comparator ). Java 8 a aussi un nouveau package : java.util.functions qui définit de nouvelles interfaces fonctionnelles. Si vous voulez des exemples dessus, vous pouvez consulter cette excellent article : http://datumedge.blogspot.fr/2012/06/java-8-lambdas.html
Cet article a été l'occasion de découvrir une petite partie de JAVA 8.Si vous voyez des erreurs ou si vous avez des commentaires, n'hésitez pas ! Dans un prochain article, on étudiera les lambdas ...