tag:blogger.com,1999:blog-75710725065261055562024-03-13T01:47:59.360+01:00TotalProgUn 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.Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.comBlogger219125tag:blogger.com,1999:blog-7571072506526105556.post-21286196448064157052020-12-17T17:57:00.003+01:002020-12-17T17:57:55.516+01:00 Mémoire du CNAM : enfin terminé !<p><br /></p><p>Enfin, enfin j'ai terminé le mémoire du CNAM ! </p><p>J'ai débuté le CNAM en 2014 et j'ai mis 6 ans pour passer toutes mes unités et enfin me présenter pour le mémoire. La dernière étape reste cependant très longue et pour pouvoir mettre toutes ses chances de son côté et réussir son mémoire, voici quelques conseils.</p><h2 style="text-align: left;">Le choix du maître de stage et des personnes associées au projet</h2><p>Pour ce mémoire, vous allez produire un écrit d'une centaine de pages et réalisé une présentation d'une trentaine de minutes. Pour la rédaction, vous allez devoir respecter un format précis. De plus, vous devez vous assurer que les explications soient correctes. C'est pour cela, qu'il faut des personnes disponibles pour la relecture. Cette étape est vraiment longue et pas évidente. Il est préférable d'avoir à des côtés une personne techniquement compétente pour vous aider dans vos explications aussi bien à l'écrit qu'à l'oral !</p><h2 style="text-align: left;">Le choix du sujet </h2><p>Choisir un bon sujet va faciliter la réussite du mémoire. Pour cela, le plus simple est de proposer un sujet à son maître de stage. Ainsi, il vous conseillera et vous aiguillera sur le choix et sur sa faisabilité. Pour vous donner une idée, nous avons proposé 4 sujets à mon maître de stage avant de trouver le bon.</p><p>Il faut choisir un sujet technique intéressant et faisable dans des délais raisonnable. Il faut compter 6 mois à temps plein minimum.</p><p>Une fois validé par le maître de stage, le sujet doit être envoyer au CNAM Paris pour validation en remplissant un formulaire décrivant le projet (description, délais…)</p><h2 style="text-align: left;">Réalisé son mémoire en entreprise</h2><p>J'ai débuté mon mémoire du CNAM début 2018 et il se termine le 26 novembre 2020 !</p><p>Pourquoi un temps si long ? Le projet se fait en même temps que d'autres projets qui ont des impératifs, des urgences et par conséquent impactent votre mémoire. Faire son mémoire en entreprise est donc à mon avis indispensable. Je ne pense pas que ce soit possible de faire autrement. Le projet nécessite un temps de réalisation mais également un temps de rédaction considérable. Un projet CNAM, n'est pas un simple projet technique informatique, il nécessite également des notions de gestion de projet.</p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-35323963180079670542017-08-26T09:28:00.000+02:002017-08-26T09:28:04.609+02:00NFE211 et NFE212<br />
Ce cours présente l'ingénierie des systèmes décisionnelles.Il se fait sur deux semestres.Le premier semestre aborde l'interrogation et l'extraction des données tandis que le second semestre se concentre sur la partie exploitation des données.<br />
<br />
<h3>
Semestre 1 : NFE211</h3>
<br />
Le cours est assez dense mais le fait d'avoir la FOAD vous donne tous les cours directement accessible.Par conséquent, vous pouvez avancer à votre rythme.<br />
<br />
<h4>
Examen écrit :</h4>
<br />
L'examen écrit de NFE211; à condition d'avoir bien appris le cours; n'est pas très difficile car il s'agit essentiellement de question de cours.Attention, le jour de l'examen, les documents ne sont pas autorisés (c'est compréhensible ).<br />
<br />
<h4>
Le projet</h4>
<br />
Le projet peut porter sur un outil ou sur une chaîne décisionnelle complète sur les deux semestres.<br />
Pour ma part, j'ai choisi une chaîne décisionnelle complète car cela permet d'aborder tous les points du cours et de mieux intégrer les notions.Vous devez rendre un rapport écrit et faire une présentation orale.(enregistré pour les personnes en FOAD)<br />
<br />
<h3>
Semestre 2 : NFE212</h3>
<br />
La partie 2 est plus dense que le premier semestre.Vous verrez le langage MDX, le data Mining et les systèmes expert.Les deux dernières parties sont plus orientées mathématiques.<br />
<h4>
<br />Examen écrit</h4>
L'examen écrit est un peu plus difficile qu'au premier semestre.<br />
<br />
<h4>
Le projet</h4>
Les modalités sont les mêmes que pour le premier semestre.<br />
<br />
<br />
<h3>
Conclusion </h3>
<br />
Pour obtenir l'UE, les règles sont les suivantes : <b>Notes de l'UE = (Notes examen écrit + Notes du projet )/ 2</b>.Il est facile d'obtenir une très bonne note pour le projet si on travaille bien dessus.La note du projet aide donc fortement à l'obtention de l'UE et la plus part du temps elle permet d'avoir une bonne note pour l'UE.Par contre, <b>attention</b>, il est très long de faire le projet en dehors du temps de travail.<br />
Pour ma part, j'ai beaucoup apprécié le projet et je trouve que le choix de projet d'une chaîne décisionnelle complète permet de mieux cerner le cours.<br />
<br />
<br />Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-36706624945850817122017-04-04T23:00:00.000+02:002017-04-04T23:00:09.020+02:00ENG210 Exercer le métier d'ingénieur<br />
Vous devez pour cette unité suivre des conférences mis à disposition par le responsable de l'unité ( environ 10 ). Chaque conférence dure <b>environ 3 heures</b>.Pour chaque conférence, il faut prendre des notes et faire un plan de la conférence pour pouvoir être capable d'effectuer un résumé ainsi qu'une synthèse le jour du devoir.A cela, il faut ajouter en fin de semestre 3 cours sur la partie gestion de projet.<br /><br />
<br />
<h4>
Le Devoir ( 3h ) </h4>
<br />
Il se décompose en 3 parties :<br />
<br />
<br />1.Question sur la partie de gestion de projet<br />2.Un Résumé sur les conférences suivies<br />3.Synthèse sur plusieurs conférences<br /><br /><i>Pour ma part, j'ai terminé juste dans les temps.J'ai fait la partie synthèse rapidement !</i><br /><br />
<h4>
Conseils </h4>
<ul>
<li>Bien suivre les consignes sur la forme pour le résumé (introduction, développement, conclusion, nombre de mots, mots clés) car cela enlève beaucoup de points.</li>
<li>La prise de note est autorisée donc il faut en profiter mais cela demande beaucoup de temps.</li>
<li>J'ai fait l'impasse sur une conférence très technique faute de temps.Par contre, il faut absolument avoir un plan sur les autres conférences sinon il sera très difficile de faire un résumé.</li>
</ul>
<h4>
Conclusion</h4>
<h4>
<br /></h4>
Cette unité demande vraiment beaucoup de temps.Il s'agit d'une des unités les
plus longues en terme de temps de travail.Par contre, c'est une unité
très intéressante qui apporte de la culture et utile pour toute carrière professionnelle.Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-2210558381211597412016-07-09T17:42:00.000+02:002016-07-09T17:42:11.160+02:00DSY101 : Modèles et représentations de l'organisation - conception classique<br />
Ce semestre, j'ai suivi l'unité DSY101 : Modèle et représentations de l'organisation classique.<br />
Cette unité présente les différents modèles d'organisation ainsi que les différents auteurs et concepts associés.<br />
<br />
<br />
<h3>
Chapitres du cours</h3>
<br />
Voici les différents chapitres de l'unité.<br />
<ul>
<li>Introduction et définition d'une organisation</li>
<li>Le taylorisme</li>
<li>Modèle psychosociologiques</li>
<li>L'approche managériale</li>
<li>Economie/Organisation et Société</li>
<li>La nouvelle économie</li>
<li>Web Conférence / ESS / Théorie de la contingence</li>
<li>Analyse stratégique</li>
<li>Compléments</li>
<li>Web Conférence / bilan /conseils </li>
</ul>
<br />
Chaque chapitre contient un power-point de quelques pages ( 3 ou 4 pages ) ou un article.<br />
<br />
<br />
<h3>
Examen / notation</h3>
<u>devoir à la maison :</u><br />
Il faut tout d'abord rendre un devoir à la maison qui compte pour 1/4 de la note.<br />
Attention, il faut le rendre dans les temps ( certains se sont fait avoir ...).Il s'agit d'un texte avec des questions.Il faut répondre en se basant sur le cours, son expérience personnelle et ses lectures.<br />
<br />
<u>examen :</u><br />
L'examen ressemble au devoir à la maison avec plus de questions.Il faut pouvoir ressortir le jour de l'examen les idées que l'on a extrait des textes lus ( pas de notes autorisées le jour J ! ).<br />
<br />
<h3>
Retours d'expériences</h3>
J'ai réussi cette unité mais ce ne fut pas facile.En effet, cette unité se base sur un grand travail en autonomie.C'est à nous à lire des articles et à faire les recherches en rapport du cours.<br />
Les difficultés que j'ai rencontré sont les suivantes :<br />
<ul>
<li>Les articles en relation avec le cours sur internet sont souvent payantes.</li>
<li>La bibliothèque de la ville la plus grande ne possédait pas la plus part des ouvrages cités.</li>
<li>La BO universitaire n'est pas accessible aux personnes du CNAM dans ma région.</li>
</ul>
Le fait d'avoir fait l'unité TET102 sur le management social m'a un peu aidé pour réussir cet unité.Pour conclure, ce ne fut pas une unité simple !<br />
<br />
<br />
<h3>
<br /></h3>
<h3>
<br /></h3>
<br />
<h4>
<br /></h4>
Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-40209834001679121262016-06-02T20:00:00.000+02:002016-06-02T20:00:11.358+02:00Un exemple de workflow de développement souple avec Git!Un petit article intéressant sur un exemple de workflow de développement souple avec Git : <a href="http://wodric.com/git-workflow-de-dev/">http://wodric.com/git-workflow-de-dev/</a>Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-74662176625580636092016-05-24T19:00:00.000+02:002016-05-24T19:00:41.500+02:00Devoxx 2016 : les vidéos<br />
Les vidéos de DEVOXX2016 sont disponibles gratuitement sur la chaîne Youtube : <a href="https://www.youtube.com/channel/UCsVPQfo5RZErDL41LoWvk0A">https://www.youtube.com/channel/UCsVPQfo5RZErDL41LoWvk0A</a><br />
<br />
<img alt="" height="385" id="irc_mi" src="http://www.technologies-ebusiness.com/files/2016/04/devoxx-2016-578x385.jpg" style="margin-top: 121px;" width="578" /> <br />
<br />
<br />
<br />
<br />
<br />Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-24500335982670842362016-03-12T17:29:00.000+01:002016-03-12T17:29:02.183+01:00Grails 3 : ORM Mapping Invalid: Specified config option<br />
J'avais l'erreur suivante au démarrage de mon application GRAILS 3.1.1 :<br />
<br />
<b>ERROR
org.grails.orm.hibernate.cfg.HibernateMappingBuilder - ORM Mapping
Invalid: Specified config option [name] does not exist for class
[toolprod.Machine]!</b><br />
<br />
A cause de cette erreur, il n'y avait pas de création de table<br />
<br />
Voici la classe domaine qui posait problème :<br />
<br />
<pre style="background: #f0f0f0; border: 1px dashed #cccccc; color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> class Machine {
/**
* Name of the web server.
*/
String name
/**
* IP address.
*/
String ipAddress
/**
* Application list in this machine.
*/
Set<App> apps = []
/**
* Servers list.
*/
Set<Server> servers = []
static hasMany = [apps : App, servers : Server]
static mapping = {
sort "name"
}
static constraints = {
name()
ipAddress(nullable: true)
}
</code></pre>
<br />
<br />
<br />
Pour résoudre ce problème, j'ai ajouté un attribut par défaut à name :<br />
<br />
<pre style="background: #f0f0f0; border: 1px dashed #cccccc; color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> static constraints = {
name(nullable: false)
ipAddress(nullable: true)
} </code></pre>
Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-49916748748646020062016-03-05T16:13:00.000+01:002016-03-05T16:13:09.212+01:00Netbeans changement du répertoire .gradlePour résoudre ce problème, j'ai initialisé la variable système <b>GRADLE_USER_HOME</b> avec le nouveau répertoire ( paramètre puis paneau de configuration ... ) :<br />
<i><br /></i>
<i> variable name : GRADLE_USER_HOME</i><br />
<i> value of variable : E:\repos\gradle</i><br />
<br />
Cela a ensuite fonctionné dans Netbeans ( il vous faudra probablement faire quelques refresh, ouverture/fermeture de projets ...)<br />
<br />
Hope this help ! Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-85451618644293143962015-10-03T20:26:00.001+02:002015-10-03T20:26:51.678+02:00Grails 3 : ajouter le plugin bootstrap<br />Voici un petit tutoriel pour ajouter le plugin bootstrap à un projet Grails 3.Il y a quelques différences avec Grails 2.x mais pas tant que cela.<br />
La première chose à faire est de chercher son plugin.Ils sont maintenant localisés sur <a href="https://bintray.com/" target="_blank"><b>Bintray</b></a>.<br />J'ai récupéré le plugin Bootstrap sur le lien suivant : <a href="https://bintray.com/kensiprell/gradle-plugins/bootstrap-framework/view#read">https://bintray.com/kensiprell/gradle-plugins/bootstrap-framework/view#read</a><br />
<br /><br />
<h3>
Ajout des dépendances : build.gradle</h3>
<br />
Les dépendances sont maintenant gérées dans le fichier build.gradle :<br />
<br /><i>buildscript {<br /> ext {<br /> //bootstrapFramework = [<br /> // version : "3.3.5",<br /> // cssPath : "grails-app/assets/stylesheets",<br /> // jsPath : "grails-app/assets/javascripts",<br /> // useIndividualJs : false,<br /> // useLess : false,<br /> // invalidVersionFails : false,<br /> // fontAwesome : [<br /> // install : false<br /> // version : "4.3.0",<br /> // useLess : false<br /> // invalidVersionFails : false<br /> // ]<br /> //]<br /> }<br /> repositories {<br /> jcenter()<br /> }<br /> dependencies {<br /> classpath "com.siprell.plugins:bootstrap-framework:1.0.3"<br /> }<br />}</i><br /><i><br />apply plugin: "com.siprell.plugins.bootstrap-framework"</i><br /><br />
<h3>
Utilisation dans une page GSP </h3>
<br />
Ensuite, une fois la configuration du build.gradle effectuée, il suffit de faire une GSP et d'inclure les dépendances jquery, bootstrap dans votre GSP.<br />Voici un exemple classique de navbar :<br /><br /><br /><i><html lang="en" class="no-js"><br /> <head><br /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><br /> <meta http-equiv="X-UA-Compatible" content="IE=edge"><br /> <title><g:layoutTitle default="Grails"/></title><br /> <meta name="viewport" content="width=device-width, initial-scale=1"><br /> <asset:javascript src="jquery-2.1.3.js"/><br /> <asset:javascript src="bootstrap-all.js"/><br /> <asset:stylesheet src="bootstrap-all.css"/><br /> <asset:stylesheet src="font-awesome-all.css"/><br /> <g:layoutHead/><br /> </head><br /> <body><br /> <nav class="navbar navbar-default"><br /> <div class="container-fluid"><br /> <!-- Brand and toggle get grouped for better mobile display --><br /> <div class="navbar-header"><br />
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
aria-expanded="false"><br /> <span class="sr-only">Toggle navigation</span><br /> <span class="icon-bar"></span><br /> <span class="icon-bar"></span><br /> <span class="icon-bar"></span><br /> </button><br /> <a class="navbar-brand" href="#">Brand</a><br /> </div><br /><br /> <!-- Collect the nav links, forms, and other content for toggling --><br /> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><br /> <ul class="nav navbar-nav"><br />
<li class="active"><a href="#">Link <span
class="sr-only">(current)</span></a></li><br /> <li><a href="#">Link</a></li><br /> <li class="dropdown"><br />
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">Dropdown
<span class="caret"></span></a><br /> <ul class="dropdown-menu"><br /> <li><a href="#">Action</a></li><br /> <li><a href="#">Another action</a></li><br /> <li><a href="#">Something else here</a></li><br /> <li role="separator" class="divider"></li><br /> <li><a href="#">Separated link</a></li><br /> <li role="separator" class="divider"></li><br /> <li><a href="#">One more separated link</a></li><br /> </ul><br /> </li><br /> </ul><br /> <form class="navbar-form navbar-left" role="search"><br /> <div class="form-group"><br /> <input type="text" class="form-control" placeholder="Search"><br /> </div><br /> <button type="submit" class="btn btn-default">Submit</button><br /> </form><br /> <ul class="nav navbar-nav navbar-right"><br /> <li><a href="#">Link</a></li><br /> <li class="dropdown"><br />
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">Dropdown
<span class="caret"></span></a><br /> <ul class="dropdown-menu"><br /> <li><a href="#">Action</a></li><br /> <li><a href="#">Another action</a></li><br /> <li><a href="#">Something else here</a></li><br /> <li role="separator" class="divider"></li><br /> <li><a href="#">Separated link</a></li><br /> </ul><br /> </li><br /> </ul><br /> </div><!-- /.navbar-collapse --><br /> </div><!-- /.container-fluid --><br /> </nav><br /> <g:layoutBody/><br /> </body></i><br /> <br />
<h3>
Running Gradle task</h3>
Pour télécharger et installer le plugin, j'ai exécuté les task Gradle suivante : clean et assemble.<br />
Pour cela, dans Netbeans, il faut faire clic droit sur le projet et sélectionner Task puis clean ou Assemble.Ensuite, il faut redémarrer votre application.<br /><br /><br /> <br /> <br /> <br /> Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-41292507660526248692015-10-03T15:56:00.001+02:002015-10-03T15:56:15.475+02:00Grails 3 and Netbeans 8.0.2 : warning sur la compatibilité avec Gradle 2.3J'avais un warning qui apparaissait dans Netbeans IDE 8.0.2 à propos de la compatibilité Gradle 2.3.<br />
Pour résoudre ce petit problème, j'ai juste suivi les étapes suivantes.Dans l'onglet files, j'ai fait un click droit sur mon projet.J'ai sélectionné properties et Gradle project dans les Categories.<br />Puis j'ai changé la Gradle home à un répertoire Gradle sur mon poste de travail ( Gradle 2.7 ) :<br /><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ktdeoCnQ0rw/Vg_bvQHuHiI/AAAAAAAAAlM/aFwAVq26VuI/s1600/netbeans_warning.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-ktdeoCnQ0rw/Vg_bvQHuHiI/AAAAAAAAAlM/aFwAVq26VuI/s320/netbeans_warning.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
Et le warning a disparu !Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-62943337692574539432015-09-30T13:11:00.000+02:002015-09-30T13:11:00.388+02:00windows 10Quelques trucs un peu pénible sur Windows 10 :<br />
<br />
<ul>
<li>La barre de tâche plante souvent.Du coup, pour l'utiliser, il faut redémarrer le PC</li>
<li>Avant il y avait un petit outil pas mal pour les captures écran.Maintenant, il faut faire ALT + Imp Ecran puis coller dans Gimp ou autre </li>
</ul>
Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-34117626149355049432015-09-26T13:07:00.000+02:002015-09-26T13:07:32.330+02:00Eclipse plugin : pas de menu dans l'onglet Extension<br />
En ce moment, je regarde un peu le développement de plugin Eclipse et j'ai rencontré le soucis suivant : le menu n'apparaissait pas lorsque je faisais clic droit sur une extension.<br />
<br />
J'avais aussi le warning suivant dans la vue Extensions : <i>No schema found for the “org.eclipse.ui.menus” extension point</i><br />
<br />
Pour résoudre le problème, j'ai ajouté <b>RCP Target Components</b> ( voir <a href="http://stackoverflow.com/questions/8366303/no-schema-found-for-the-org-eclipse-ui-menus-extension-point">http://stackoverflow.com/questions/8366303/no-schema-found-for-the-org-eclipse-ui-menus-extension-point</a> )<br />
<br />
<ol>
<li>Dans Eclipse, <b>Help > Install New Software...</b> </li>
<li>Initialisez l'update site: <a href="http://download.eclipse.org/eclipse/updates/4.3">http://download.eclipse.org/eclipse/updates/4.5</a> </li>
<li>Choisir"<b>Eclipse RCP Target Components</b>" pusi Next our l'installer</li>
</ol>
Maintenant le menu apparait :<br />
<br />
<a href="http://2.bp.blogspot.com/-TmSAwbGU0lY/VgZ6u7IkHQI/AAAAAAAAAk0/cyeR-BtO2LQ/s1600/eclipse_extension.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://2.bp.blogspot.com/-TmSAwbGU0lY/VgZ6u7IkHQI/AAAAAAAAAk0/cyeR-BtO2LQ/s320/eclipse_extension.png" width="320" /></a><br />
<br />
<br />
<i>Eclipse IDE for Java Developers</i><br />
<i>Version: Mars Release (4.5.0)</i><br />
<br />
<table><tbody>
<tr><td class="votecell"><br /></td><td class="votecell"><br /></td><td class="votecell"><br /></td><td class="votecell"><br /></td><td class="votecell"><br /></td><td class="votecell"><br /></td><td class="votecell"><br /></td><td class="votecell"><br /></td><td class="votecell"><br /></td><td class="votecell"><br /></td>
<td class="answercell"><br /></td></tr>
</tbody></table>
<br />
<br />Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-576602742441690602015-09-24T12:02:00.001+02:002015-09-24T12:02:12.735+02:00En Réponse au Tollé, JetBrains assouplit les Termes de Licence<a href="http://www.infoq.com/fr/news/2015/09/jetbrains-update#.VgPKEk4iGBs.blogger">En Réponse au Tollé, JetBrains assouplit les Termes de Licence</a>Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-66878617550942541442015-09-20T17:12:00.000+02:002015-09-20T17:12:56.612+02:00Grails 3 et les IDE<br />
Cela fait quelques temps que je cherche un IDE qui offre le support de Grails 3.<br />
Pour le moment, voici l'état des lieux : <br />
<ul>
<li>Eclipse : aucun support, le plugin n'est plus disponible sous STS.</li>
<li>Intellij : apparemment c'est supporté mais il faut payer la licence ...</li>
<li>Netbeans : début de support</li>
</ul>
Le point posistif, c'est que Netebans 8.0.2 reconnait les projets Grails 3.Ainsi, j'ai pu créer et importer un projet Grails 3.Vous pourrez également démarrer votre projet et il y a une coloration syntaxique pour les GSP.il faut avouer cependant que ce n'est pas encore complet mais au moins on peut commencer à se faire un peu la main dessus.<br />
<br />
<a href="https://stackoverflow.com/questions/29441503/grails-3-0-support-in-netbeans/32425071#32425071">https://stackoverflow.com/questions/29441503/grails-3-0-support-in-netbeans/32425071#32425071</a><br />
<br />
Une dernière chose, sous Eclipse, vous pouvez importer un projet Grails 3 en tant que projet Gradle comme l'indique la documentation mais ce n'est pas terrible.Je n'ai pas réussi à avoir la coloration syntaxique.A suivre donc ...Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-36461586123602659182015-09-18T14:31:00.000+02:002015-09-18T14:31:19.077+02:00Mise à jour de Grails 2.5.0 vers 2.5.1J'ai fait cette mise à jour sans problème.Il suffit juste de mettre à jour les plugins qui sont listés dans la ReleaseNote.<br /><br />Le seul petit détail qui est un peu perturbant, c'est que vous avez un warning : <b>Script 'Upgrade' not found</b>.<br />Pour résoudre ce problème, vous devez sélectionner 3 (SetGrailsVersion) dans le menu ci-dessous :<br /><br /><i>|Running pre-compiled script<br />|Script 'Upgrade' not found, did you mean:<br /> 1) MigrateDocs<br /> 2) IntegrateWith<br /> 3) SetGrailsVersion<br /> 4) InstallDependency<br /> 5) DependencyReport<br />Please make a selection or enter Q to quit: 3</i><br /><br />A noter également, j'ai résolu le problème suivant en upgradant ma version de Grails : <a href="http://stackoverflow.com/questions/32562678/grails-plugin-error-class-path-resource-cannot-be-resolved">http://stackoverflow.com/questions/32562678/grails-plugin-error-class-path-resource-cannot-be-resolved</a>Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-37650538214264140772015-09-16T17:34:00.000+02:002015-09-16T17:42:58.441+02:00 Comment importer des fichiers avec GRAILS ?Dans les sites métiers, nous avons souvent besoin d'importer des fichiers de configuration.<br />
Il y a plusieurs méthodes pour le faire.Je vais vous en présenter deux : avec un formulaire ou avec une url.Dans cet article, je n'aborderai pas la question sur les batchs car ,dans mon cas, cela ne fonctionne pas avec la version GRAILS 2.5. <br />
<br />
<br />
<br />
<h4>
Une IHM pour importer des fichiers</h4>
<br />
Si vous avez seulement quelques fichiers à importer manuellement, le plus simple est de réaliser un formulaire.<br />
<br />
<h3>
Exemple de formulaire form.gsp</h3>
<br />
Dans ce formulaire, on appelle l'action <b>init </b>du controlleur <b>admin</b>.La balise input file avec le paramêtre <b>multiple </b>va permettre d'uploader plusieurs fichiers.<br />
<br />
<br />
<i><g:uploadForm action="init" controller="admin"><br /> <form role="form"><br /> <div class="form-group"><br /> <label for="files">Choix du fichier à parser</label><br /> <input type="file" id="files" name="files[]" multiple><br /> <p class="help-block">Vous devez choisir un fichier httpd.conf</p><br /> </div><br /> <div class="form-group"><br /> <label for="machinename">Nom de la machine</label><br /> <input type="text" class="form-control" id="machinename" name="machinename" placeholder="....ac-limoges.fr" value=""><br /> </div><br /> <button type="submit" class="btn btn-info">Submit</button><br /> </form><br /></g:uploadForm></i><br />
<br />
<h3>
Controller</h3>
<br />
Le tableau files[] va contenir tous les fichiers à Importer.Attention au type de file, il s'agit de <b>org.springframework.web.multipart.MultiPartFile </b>et non de <b>java.io.File</b>.Donc par exemple, vous pouvez traiter les fichiers de la manière suivante :<br />
<br />
<i>class AdminController {<br /> <br /> def init() {<br /> if (request instanceof MultipartHttpServletRequest) {<br /> ...<br /> request.getFiles("files[]").each { file -><br /> log.info("init() file to parse:" + file.originalFilename)<br /> InputStream inputStream = file.inpustream<br /> BufferedReader = new BufferedReader(new InputStreamReader(inputStream))<br /><br /> try {<br /> String ldapUser = EMPTY<br /> String ldapPwd = EMPTY<br /> String ldapHost = EMPTY<br /> String ldapPort = EMPTY<br /><br /> while ((line = br.readLine()) != null) {<br /> ...<br /> }<br /> }<br /> }<br /> ...<br /> }<br /> }<br />...</i><br />
<br />
<h4>
Import de fichier de manière automatique</h4>
<br />
Une autre façon de faire est d'utiliser une méthode du controlleur.Cela permet d'importer des fichiers automatiquement :<br />
<br />
<i>class AdminController {<br /> def reloadData() {<br /> def path = "E:\\projet\\toolprod\\import\\"<br /><br /> log.info("reloadData() Initializing application from httpd.conf files in machine directory ...")<br /> new File(path).listFiles().findAll{<br /> if (it.isDirectory()) {<br /> log.info("reloadData() Machine name ( Directory name ) :" + it.name)<br /> String machineName = it.name<br /> log.debug("reloadData() files list:" + it.listFiles())<br /> for (File f : it.listFiles()) {<br /> ...<br /><br /> }<br /><br /> }<br />...</i><br />
<br />
<br />
Ensuite, il vous suffit d'accéder à l'url : <a href="http://localhost:8080/toolprod/admin/reloadData">http://localhost:8080/appli/admin/reloadData</a><br />
Après cela, il est facile de faire un curl et de le mettre dans une crontab.<br />
<br />
<br />Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-86984216394429998142015-09-14T10:48:00.004+02:002015-09-14T10:48:50.280+02:00Passage à Windows 10Hier je suis passé à Windows 10.La mise à jour est passée sans problème.<br />Mes premières impressions sont bonnes.Je le trouve mieux que Windows 8.1 ( Par exemple, je ne suis plus embêter avec les mouvements de la souris qui ouvre des fenêtres non désirée ).<br />A noter, petit truc pénible, il faut faire CTRL + ALT + AROBASE pour faire un @. Mais bon, on ne change pas Windows ;-)<br />Bon bien sûr cela ne vaut pas une bonne Gentoo mais Windows reste obligatoire dans beaucoup d'entreprise ...<br />De plus, il faut je pense faire un peu de ménages.Pour cela, voici un lien intéressant : http://korben.info/windows-10-est-il-un-systeme-dexploitation-diabolique.htmlDamienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-69190659200114725312015-09-11T12:41:00.000+02:002015-09-11T12:41:05.204+02:00Podcast en fançaisSur le forum de HumanCoders, je suis tombé sur une discussion intéressante : <a href="https://forum.humancoders.com/t/connaissez-vous-des-podcasts-en-francais/1752">https://forum.humancoders.com/t/connaissez-vous-des-podcasts-en-francais/1752</a><br />
<br />
J'ai appris l'existence de podcasts sur le développement que je ne connaissais pas :<br />
<ul>
<li><a class="onebox" href="https://forum.humancoders.com/clicks/track?url=http%3A%2F%2Fwww.debugroom.fr%2F&post_id=4197&topic_id=1752" rel="nofollow" target="_blank">http://www.debugroom.fr/</a></li>
<li><a class="onebox" href="http://www.thewalkingweb.fr/" rel="nofollow" target="_blank">The Walking Web </a> </li>
</ul>
Apparemment les podcast ci-dessus sont plutôt orientés développement web.Je vais tester pour voir ...<br />
Et bien entendu, il y a aussi l'incontournable <a class="onebox" href="https://lescastcodeurs.com/" rel="nofollow" target="_blank">https://lescastcodeurs.com/</a><br />
Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-77837378472809988072015-09-10T16:21:00.001+02:002015-09-11T12:41:27.795+02:00Amazon introduit un nouveau modèle de monétisation pour les Apps AndroidVoici une petite news qui interessera les développeurs d'application sous Android. <br />
<br />
<br />
<br />
Avec ce système, c'est le temps passé sur l'application qui est pris en compte !<br />
<br />
<br />
<br />
Plus d'infos sur ce lien :<br />
<br />
<br />
<br />
<a href="http://www.infoq.com/fr/news/2015/09/amazon-underground-monetization#.VfGRJ60JdM0.blogger">Amazon introduit un nouveau modèle de monétisation pour les Apps Android</a>Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-18182375689974270932015-08-30T09:06:00.003+02:002015-08-30T09:06:39.959+02:00Présentation OpenIdConnect<br />
<br />
Voici une petite vidéo qui présente OpenIdConnect, un standard qui est utilisé par Google, Microsoft ...: <a href="http://news.humancoders.com/t/api/items/12570-openidconnect-le-nouveau-standard-d-identification">http://news.humancoders.com/t/api/items/12570-openidconnect-le-nouveau-standard-d-identification</a>Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-69713312012231902532015-07-21T09:40:00.001+02:002015-07-21T09:40:25.290+02:00NFP108 : Specification et modelisation Informatique<br />
Dans le cadre des cours du CNAM, j'ai suivi l'unité NFP108 sur la spécification et modélisation informatique ( CNAM Champagne Ardennes ). Il s'agit essentiellement une unité de mathématiques.Cet article donne un aperçu de cette unité.Si vous voulez avoir une idée plus précise, vous pouvez consulter le devoir à la maison que j'ai réalisé (cf ci-dessous ).<br />
<br />
<br />
<h2>
Les différents chapitres</h2>
Chaque chapitre fait l'objet d'une ou plusieurs visioconférence ( rythme de 1 par semaine ). La
visioconférence est partagée en deux ( 1/2 heure correction des
exercices et 1/2 de cours ).<br />
<h3>
Partie 1</h3>
<br />
Chapitre01 : Problèmes et langages<br />
Chapitre02 : Automates finis<br />
Chapitre03 : Opérations sur les automates <br />
Chapitre04 : Les expressions régulières<br />
Chapitre05 : Automates et expressions régulières<br />
Chapitre06 : Application des expressions régulières<br />
Chapitre07 : exemple<br />
<br />
<h3>
Partie 2</h3>
<br />
Chapitre08 : logique des propositions<br />
Chapitre 09 : logique des prédicats<br />
Chapitre10 : démonstrations<br />
Chapitre11 : Le calcul des séquents<br />
Chapitre12 : égalité et théorie des ensembles<br />
<br />
<br />
<h2>
Les Examens</h2>
Il y a une note pour le devoir à la maison et une note pour l'examen final.<br />
<br />
<h3>
Devoir à la maison</h3>
<br />
<br />
Le devoir à la maison est à rendre une semaine avant l'examen.Il porte sur la partie 1 et compte pour 1/3 de la note si la note est supérieur au devoir.Ce devoir à la maison est accessible et il est possible d'avoir 20.De mon point de vue, avoir une bonne à ce devoir est indispensable pour réussir l'unité.<br />
<br />
Voici le devoir que j'ai réalisé : <a href="https://docs.google.com/document/d/1hJnxK5-s10RmAHdnoHialPZUwXSE9xNZFXf8uGXPZmU/edit?usp=sharing" target="_blank">Devoir_a_la_maison</a><br />
<br />
<br />
<br />
<h3>
Examens</h3>
<br />
L'examen porte sur les deux parties.Il est très long et quasiment impossible à faire en entier ( voir même la première partie ). Il n'y a pas beaucoup d'annales sur cette unité mais je pense que le format reste le même d'année en année.<br />
<u>A noter :</u><br />
<ul>
<li> la dernière séance est une vidéo sur un examen corrigé.</li>
</ul>
<br />
<h2>
Quelques conseils</h2>
<ul>
<li>Il y a beaucoup de définition à savoir par chapitre.</li>
<li>Il faut s'appliquer sur le devoir à la maison. </li>
<li>Il faut éviter de prendre de retard et bien suivre les cours chaque semaine.</li>
<li>Le jour du devoir on a le droit au cours.Cela peut aider mais vu que l'examen est très long, il ne faut pas trop compter dessus. </li>
</ul>
<ul>
</ul>
<br />
<h2>
Conclusion</h2>
C'est une unité qui peut paraître difficile au premier abord car il s'agit essentiellement d'une unité de mathématique.Cependant, si on suit les cours régulièrement, on comprend bien.Seule une petite partie est plus difficile d'accès mais pas impossible.Le format de visio rend difficile le fait de pouvoir poser des questions à cause des symboles des formules.<br />
<br />
<br />
<br />
<br />Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-8320988410324815102015-07-11T08:56:00.000+02:002015-07-11T08:56:00.513+02:00UA5A12 Examen d'admission à l'école d'ingénieur<br />
Cette unité n'est pas vraiment un examen.C'est plus une présentation de votre cursus, votre projet et de vos motivations.Il faut tout d'abord remplir un dossier écrit puis faire une présentation orale.Dans cet article, je vais vous présenter ces différents points.<br />
<br />
<br />
<h2>
Remplir un dossier </h2>
<br />
Pour chaque question, il faut écrire soit 1/2 page soit 1 page excepté pour la dernière question où il faut 5 pages.Au total, mon dossier comptait environ 15 pages. Il ne faut donc pas si prendre à la dernière minute...<br />
Le dossier est à rendre de préférence 10 jours avant la présentation.<br />
<br />
<u>Voici quelques exemples de questions :</u><br />
<i><br /></i>
<i>1.Décrivez votre emploi actuel</i><br />
<i>2.Décrivez l'évolution de votre fonction durant les années</i><br />
<i>3.Indiquez vos motivations à devenir ingénieur, votre vision du statut et du métier d'ingénieur</i><br />
<i>4.Indiquez si vous souhaitez vous orienter plutôt vers des fonctions d'ingénieur dans le domaine : Production, Maintenance,Suivi de projets,Gestion d'affaires,Essais,Marketing,Services,Recherche et développement</i><br />
<i>5.Pour évoluer à partir de vos fonctions actuelles quels vous semblent être vos points forts et les points à améliorer pour remplir des fonctions d'ingénieur</i><br />
<i>6.Précisez votre projet de formation</i><br />
<i>7.Dossier professionnelle</i><br />
<br />
<br />
<h2>
La présentation</h2>
<br />
Il faut faire une présentation de 10 à 15 mn qui se base sur le dossier écrit.Ensuite les examinateurs vous interroge et vous conseille.Cela dure environ 15 mn. Il vous donne en même temps le résultat mais il n'y a pas vraiment de surprise.<br />
<br />
<br />
<h2>
Retour d'expérience</h2>
<br />
Le dossier était un peu long à remplir.Par contre, l'oral était très enrichissant.Les examinateurs m'ont donné pleins de conseils ( choix d'UV ) et une autre vision des choses.J'ai également pu leur demander des précisions sur le mémoire et sa réalisation.<br />
<br />
<br />
Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-37714659066854516352015-07-04T05:24:00.000+02:002015-07-04T05:29:04.872+02:00TET102 : cours du CNAM sur le management social<br />
Voici un billet qui sort un peu de l'ordinaire.Dans le cadre des cours du CNAM, j'ai suivi le cours TET102 sur le management social en entreprise.L'objectif de cet article est de vous présenter ce cours pour vous aider à faire votre choix et vous donnez quelques conseils pour réussir l'examen. <br />
<br />
<h3>
</h3>
<h4>
Résumé</h4>
Durant ce cours, vous allez apprendre à connaître les différentes instances sociales ( CHSCT, Comité d'Entreprise ...) et leurs fonctionnements.Vous verrez comment le rôle du manager et comment il interagit avec celles-ci. <br />
<br />
<b>Déroulement du cours</b><br />
<br />
Ce cours est composé de 8 chapitres.A la fin de chaque chapitre, les élèves doivent effectuer des exercices par écrit et les rendre au professeur.Le professeur ouvre alors le chapitre suivant.<br />
<br />
Pour suivre ce cours, vous devez également assister à 4 cours en présentielle.Pour ma part, c'était le soir de 18h à 21h au Lycée benjamin Franklin d' Orleans. Durant ces séances, vous effectuerez des exercices pratiques en groupe ( gestion de conflits, conduite de réunion ... ) .<br />
<br />
<h4>
Les différents chapitres</h4>
<br />
Chap I L'entreprise et son organisation<br />
Chap II L'ingénieur et le management humain<br />
Chap III Les conditions du travail humain<br />
Chap IV La fonction "Ressources Humaines"<br />
Chap V Hygiène et sécurité dans le travail<br />
Chap VI Les relations de travail<br />
Chap VII Évaluation des compétences et besoin en formation<br />
Chap VIII Conduite d'équipes et résolution de conflit<br />
<br />
<u>A noter :</u><br />
<ul>
<li>Les 4 derniers chapitres sont les plus importants en terme de contenus ( 300 à 500 pages )</li>
<li>Il y a beaucoup de choses à apprendre. </li>
</ul>
<h3>
Les points forts</h3>
<ul>
<li>Ce cours présente les différentes instances sociales, leur rôle.Cela donne une bonne vision du fonctionnement social de l'entreprise.J'aurais aimé avoir ce cours avant de commencer en entreprise.</li>
<li>Les ateliers lors des point de regroupement permettent de prendre conscience du rôle de manager et apportent des conseils utiles pour son application en entreprise. </li>
</ul>
<h3>
L'examen</h3>
Voici quelques remarques : <span style="font-weight: normal;"></span><br />
<ul>
<li><span style="font-weight: normal;">Ne négligez pas le dernier chapitre.</span></li>
<li><span style="font-weight: normal;">Des notes manuscrites étaient autorisées.</span></li>
<li><span style="font-weight: normal;">Vers la fin de la session, le professeur ouvre les annales. </span></li>
</ul>
<h3>
<span style="font-weight: normal;"> </span></h3>
<span style="font-weight: normal;">En résumé, ce cours exige pas mal de travail. Il apporte des connaissances essentielles sur le fonctionnement des instances sociales en entreprises.Les regroupements en présentielles sont intéressant et vivant ( c'est important le soir après le travail ! ) . </span><br />
<br />
<h3>
</h3>
<h3>
</h3>
<h3>
</h3>
Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-11916537786432333552015-04-24T10:46:00.000+02:002015-04-24T10:46:55.643+02:00Grails et la création de pdfJe réalise actuellement une application métier et dans ce cadre, j'ai eu besoin d'afficher des rapports au format pdf. Avant la version de Grails 2.5.0, j'utilisais le plugin export et il fonctionnait très bien.Par contre, avec la version Grails 2.5.0, j'ai eu des erreurs de compilation.J'ai aussi essayé le plugin rendering mais sans succès ( cf <a href="http://stackoverflow.com/questions/29694796/null-pointer-exception-with-grails-rendering-plugin" target="_blank">http://stackoverflow.com/questions/29694796/null-pointer-exception-with-grails-rendering-plugin</a> ).<br />
Par conséquent, j'ai décidé de le faire moi même avec une librairie :<br />
<br />
<pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;">org.apache.pdfbox</code></pre>
<br />
Dans le fichier BuildConfig.groovy, j'ai ajouté la dépendance :<br />
<br />
<pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> dependency {
...
compile "org.apache.pdfbox:pdfbox:1.8.9"
...
}
</code></pre>
<br />Voici le code dans mon controlleur :<br />
<br />
<pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> class AppRetailController {
...
def renderFormPDF(){
List<App> apps = new ArrayList<>()
String title = ""
String param = params.get("serverSelect")
...
Fill the list apps
...
title= "Liste de toutes les applications sur " + param
title += " (" + apps.size() + ")"
// Create all needed for Pdf document
PDDocument document = new PDDocument();
PDPage page = new PDPage();
PDPageContentStream contentStream;
// Here I want 30 rows by page
int pageNumber = apps.size()/30 + 1
log.info("Page number :" + pageNumber)
int countApp = 0
// for each page I draw table with datas
for (int i=1; i<=pageNumber; i++) {
log.info("countApp :" + countApp)
page = new PDPage();
contentStream = new PDPageContentStream(document, page);
int max = countApp + 30
if (max > apps.size()) {
max = apps.size() - 1
}
drawTable(page, contentStream, 700, 100, apps[countApp..max], title);
countApp = countApp + 30 + 1
contentStream.close();
document.addPage(page);
}
document.save("report.pdf");
document.close();
render( file:new File("report.pdf"), fileName: "report.pdf")
}
/**
* @param page
* @param contentStream
* @param y the y-coordinate of the first row
* @param margin the padding on left and right of table
* @param content a 2d array containing the table data
* @throws IOException
*/
def drawTable(PDPage page, PDPageContentStream contentStream,
float y, float margin,
List<App> apps, String title) throws IOException {
final int rows = apps.size() + 1;
final int cols = 3;
final float rowHeight = 20f;
final float tableWidth = page.findMediaBox().getWidth()-(2*margin);
final float tableHeight = rowHeight * rows;
final float colWidth = tableWidth/(float)cols;
final float cellMargin=5f;
//draw the rows
float nexty = y ;
for (int i = 0; i <= rows; i++) {
contentStream.drawLine(margin,nexty,(float)(margin+tableWidth),nexty);
nexty-= rowHeight;
}
//draw the columns
float nextx = margin;
for (int i = 0; i <= cols; i++) {
contentStream.drawLine(nextx,y,nextx,(float)(y-tableHeight));
nextx += colWidth;
}
//now add the text
contentStream.setFont(PDType1Font.HELVETICA_BOLD,14);
contentStream.beginText();
contentStream.moveTextPositionByAmount((float)margin+cellMargin+10,(float)(y+20));
contentStream.drawString(title);
contentStream.endText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD,12);
float textx = margin+cellMargin;
float texty = y-15;
//Define colunm title
contentStream.beginText();
contentStream.moveTextPositionByAmount(textx,texty);
contentStream.drawString("Nom");
contentStream.endText();
textx += colWidth;
contentStream.beginText();
contentStream.moveTextPositionByAmount(textx,texty);
contentStream.drawString("Description");
contentStream.endText();
textx += colWidth;
contentStream.beginText();
contentStream.moveTextPositionByAmount(textx,texty);
contentStream.drawString("Chemin dans ARENA");
contentStream.endText();
textx += colWidth;
texty-=rowHeight;
textx = margin+cellMargin;
contentStream.setFont(PDType1Font.HELVETICA,11);
apps.each {
contentStream.beginText();
contentStream.moveTextPositionByAmount(textx,texty);
contentStream.drawString(it.name);
contentStream.endText();
textx += colWidth;
contentStream.beginText();
contentStream.moveTextPositionByAmount(textx,texty);
String desc = it.description
if (desc.equals("EMPTY")) {
desc = ""
}
contentStream.drawString(desc);
contentStream.endText();
textx += colWidth;
contentStream.beginText();
contentStream.moveTextPositionByAmount(textx,texty);
String path = it.arenaPath
if (path == null) {
path = ""
}
contentStream.drawString(path);
contentStream.endText();
textx += colWidth;
texty-=rowHeight;
textx = margin+cellMargin;
}
}
}
</code></pre>
<br />
<br />
En conclusion, on peut dire que ce n'est pas la meilleur solution car il faut tout faire à la main et à mon avis il vaut mieux regarder des solutions telles que le plugin rendering.Par contre, ça fait le job et lorsque vous êtes pressé par le temps, cela fonctionne. <br />
Un grand merci à ce blog pour l'utilisation de la librairie : <a href="http://fahdshariff.blogspot.fr/2010/10/creating-tables-with-pdfbox.html" target="_blank">http://fahdshariff.blogspot.fr/2010/10/creating-tables-with-pdfbox.html </a><br />
<br />
Hope this help,<br />
<br />
Voir aussi : <a href="http://grails.github.io/grails-doc/2.5.x/ref/Controllers/render.html" target="_blank">http://grails.github.io/grails-doc/2.5.x/ref/Controllers/render.html</a><br />
<br />Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0tag:blogger.com,1999:blog-7571072506526105556.post-71347474776723523792015-03-31T19:30:00.002+02:002015-03-31T19:30:43.958+02:00Upgrade de Grails 2.4.4 vers la version 2.5.0<br />
Voici un petit retour d'expérience pour ceux qui souhaiteraient mettre à jour leur version de Grails.<br />
Cette mise à jour ne m'a posé aucun problème.Il suffit de bien suivre la Release Version ( <a href="https://github.com/grails/grails-core/releases/tag/v2.5.0" target="_blank">https://github.com/grails/grails-core/releases/tag/v2.5.0</a> )<br />
<br />
Pour résumé, j'ai seulement mis à jour les plugins suivants dans le fichier <b>BuildConfig.groovy</b> :<br />
<ul>
<li>build ':tomcat:7.0.55.2'</li>
<li>compile ':cache:1.1.8'</li>
<li>compile ':scaffolding:2.1.2'</li>
<li>compile ':asset-pipeline:2.1.5'</li>
</ul>
<br />
J'ai eu une exception au démarrage de Grails car j'avais oublié de changer la valeur de <b>region.factory_class </b>dans le fichier <b>Datasource.groovy</b> ( cf Release Version ).<br />
Voici l'exception que j'ai eu :<br />
<br />
<blockquote>
2015-03-31
16:28:39,590 [localhost-startStop-1] ERROR
context.GrailsContextLoaderListener - Error initializing the
application: Error creating bean with name
'transactionManagerPostProcessor': Initialization of bean failed; nested
exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'transactionManager': Cannot resolve
reference to bean 'transactionManager_lookup' while setting constructor
argument with key [1]; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name 'transactionManager_lookup': Cannot resolve reference to
bean 'sessionFactory_lookup' while setting bean property
'sessionFactory'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name 'sessionFactory_lookup': Invocation of init method
failed; nested exception is org.hibernate.cache.CacheException:
net.sf.ehcache.CacheException: Another unnamed CacheManager already
exists in the same VM. Please provide unique names for each CacheManager
in the config or do one of following:<br />
1. Use one of the
CacheManager.create() static factory methods to reuse same CacheManager
with same name or create one if necessary<br />
2. Shutdown the earlier cacheManager before creating new one with same name.<br />
The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ]<br />
...</blockquote>
Et la solution pour résoudre ce problème :<br />
hibernate {<br />
...<br />
cache.region.factory_class = 'org.hibernate.cache.SingletonEhCacheRegionFactory' <br />
}<br />
<br />
Damienhttp://www.blogger.com/profile/06346403714788520249noreply@blogger.com0