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
Un petit blog principalement sur l'univers du développement pour partager aussi bien des astuces pratiques utiles au quotidien mais également réfléchir sur les évolutions et perspectives de l'informatique.
jeudi 26 décembre 2013
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 :
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 :
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
<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
vendredi 29 novembre 2013
Déployer votre application sur le web gratuitement avec OpenShift
Si vous avez une application Grails et que vous voulez la déployer sur le coud gratuitement, vous pouvez le faire avec OpenShift :
https://www.openshift.com/blogs/day-6-rapid-web-development-on-the-jvm-with-grails
https://www.openshift.com/blogs/day-6-rapid-web-development-on-the-jvm-with-grails
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.
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.
lundi 25 novembre 2013
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
http://blog.eisele.net/2013/09/java-mission-control-52-is-finally-here.html
vendredi 15 novembre 2013
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
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 :
mardi 12 novembre 2013
lundi 11 novembre 2013
Grails et Spring Security
Un bon article pour mettre en place Grails avec Spring security :
spring-security-core-plugin-la-securite-avec-grails/
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 :
- Le serveur compresse les données (code HTML, CSS, JavaScript...)
- Les fichiers transitent par le réseau via HTTP
- 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.phpGrails 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
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
jeudi 7 novembre 2013
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/
Un super cadeau !
Plus d'infos sur http://java.developpez.com/evenements/devoxx2014/quizz/
mercredi 25 septembre 2013
vendredi 20 septembre 2013
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 :
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:
Solution
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.UserLa 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 :
Voir aussi :
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
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 ?
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 :
Theclean
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/
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 {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 :
String name
String tel
String addr
}
statics constraints = {Cette méthode vous permet aussi de définir la validation, les contraintes pour vos formulaires ...
name()
addr()
tel()
}
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 ?
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 :
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 :
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 {La première fois, c'est un peu frustrant ...
def scaffold = true
}
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-appEnsuite, 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-19943154Lien utiles :
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
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 ;
Exemple :
Cette astuce vient de http://stackoverflow.com/questions/10955899/how-to-change-grails-localhost-port
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 !
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/
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/
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/
jeudi 2 mai 2013
Java EE 7 Approved !
Si vous voulez voir les nouvelles JSR de Java ee 7, c'est ici : http://java.dzone.com/articles/java-ee-7-approved
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/
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 !
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 :
1) Installation
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.
d'utiliser Eclipse.
Facilité de développement grace au framework Play.
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 à conditiond'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
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.
emerge dev-ruby/rubygems
ruby -e 'puts "Welcome to Ruby"
gem install rhc
git clone ssh://XXX/~/git/monapp.git/
Ensuite j'ai suivi les étapes du lien ICI
git add deployments/cookies.war*
git push
- tail -f jbossas-7/logs/server.log
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.
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.wargit 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
vi ./project/plugins.sbt
Il faut modifier le fichier en ajoutant la dernière version de play (2.1.0) :
Ensuite vous pouvez redémarrer play run
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.
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;Main.java
/**
* Interface with just one abstract method.
*/
public interface ICode {
String generate(int codeNumber);
}
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));
}
}
La JSR nous dit que dans certains cas, on peut définir plusieurs méthodes qui représente une seule méthode :Un peu plus dur ...
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 ...
Inscription à :
Articles (Atom)