tag:blogger.com,1999:blog-8895798307859510622024-03-13T17:36:09.480-07:00blog2dev : Blog de dev'sInstallation et utilisation rapide des nouveaux outils et frameworks de développements en Java, Javascript, NoSQL, Test de performance et QualitéBlog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comBlogger62125tag:blogger.com,1999:blog-889579830785951062.post-49129036919105016582015-07-24T00:50:00.003-07:002016-06-27T06:15:55.084-07:00MacOS Terminal shortcuts<div style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; letter-spacing: -0.02em; line-height: 1.4; margin: 20px 0px 10px; text-rendering: optimizeLegibility;">
From <a href="http://www.techrepublic.com/article/20-terminal-shortcuts-developers-need-to-know/?utm_content=buffer806aa&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer" target="_blank">http://www.techrepublic.com/article/20-terminal-shortcuts-developers-need-to-know</a></div>
<div style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; letter-spacing: -0.02em; line-height: 1.4; margin: 20px 0px 10px; text-rendering: optimizeLegibility;">
<span style="color: #778596; font-size: 21px; letter-spacing: -0.419999986886978px; line-height: 31.5px;"><br></span>
<span style="color: #778596; font-size: 21px; letter-spacing: -0.419999986886978px; line-height: 31.5px;">20 shortcuts to help you get work done in Terminal on your Mac.</span></div>
<h2 style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 21px; letter-spacing: -0.02em; line-height: 1.4; margin: 20px 0px 10px; text-rendering: optimizeLegibility;">
Option/Alt + Left or Right</h2>
<div style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24.7999992370605px; margin-bottom: 20px;">
This shortcut allows you to move the cursor between separate words in a command line. Use Option and the left arrow to move back and use Option with the right arrow to move forward down the line.</div>
<h2 style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 21px; letter-spacing: -0.02em; line-height: 1.4; margin: 20px 0px 10px; text-rendering: optimizeLegibility;">
Control + W</h2>
<div style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24.7999992370605px; margin-bottom: 20px;">
Using this keyboard combination will delete the word immediately before, or to the left of, the cursor.<br>
</div><a href="http://blog2dev.blogspot.com/2015/07/macos-terminal-shortcuts.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-28534627880123032112015-06-09T03:56:00.001-07:002015-07-22T02:43:03.564-07:00Sonar - Analyse d'un projet Javascript<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitUyBRrgm04uU0pbgj00N83tkp1GsJeZIcArK-vSYCG7UUWaQJlRgcxpbI27tR7FcbeyiLMAHyjFYpL_DeSM4xU-HB0j_4EHonAXCpbcnh-mVC4b6iufYjNg6D5ok5QDgisOq2Lfj4zbIQ/s1600/sonar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitUyBRrgm04uU0pbgj00N83tkp1GsJeZIcArK-vSYCG7UUWaQJlRgcxpbI27tR7FcbeyiLMAHyjFYpL_DeSM4xU-HB0j_4EHonAXCpbcnh-mVC4b6iufYjNg6D5ok5QDgisOq2Lfj4zbIQ/s1600/sonar.png"></a></div>
Nous allons effectuer l'analyse de code sur Sonar d'un projet Javascript avec l'outil de build Grunt.
<br>
<br>
Nous utiliseront les images officielles <a href="https://registry.hub.docker.com/u/library/mysql/" target="_blank">MySQL</a> et <a href="https://registry.hub.docker.com/u/library/sonarqube/" target="_blank">Sonar</a> de <a href="https://www.docker.com/" target="_blank">Docker</a>.
<br>
<br>
Pour info, voici la documentation de Sonar :<br>
<br>
<ul>
<li><a href="http://docs.sonarqube.org/display/SONAR/Documentation" target="_blank">Documentation</a></li>
<li><a href="http://docs.sonarqube.org/display/SONAR/Metric+definitions" target="_blank">Définitions des métriques (complexité, design, etc.)</a></li>
</ul>
<h2>
MySQL & Sonar</h2>
Lancer les commandes suivantes sur le serveur pour démarrer les conteneurs Docker :
<br>
<h3>
MySQL</h3>
<pre>docker run --name <b>sonarmysql</b> -e MYSQL_ROOT_PASSWORD=admin -e MYSQL_DATABASE=sonar -e MYSQL_USER=sonar -e MYSQL_PASSWORD=sonar -p 3306:3306 -d <b>mysql</b>:latest
</pre>
<h3>
Sonar</h3>
<pre>docker run --name <b>sonarqube</b> -p 9000:9000 -p 9092:9092 -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL="jdbc:mysql://sonarmysql:3306/sonar?useUnicode=true&characterEncoding=utf8" --link sonarmysql:sonarmysql -d <b>sonarqube</b>:latest
</pre>
<h3>
Interface Web de Sonar</h3>
URL :
<br>
<ul>
<li><code>http://<b>[URL du serveur Docker]</b>:9000</code></li>
<ul>
<li>avec <code>[URL du serveur Docker]</code> : URL ou Adresse IP de la machine sur laquelle les commandes docker ont été lancées</li></ul></ul><a href="http://blog2dev.blogspot.com/2015/06/sonar-analyse-projet-javascript.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-21492316714385402302015-06-03T01:44:00.001-07:002015-06-03T01:52:51.342-07:00Maven & Yeoman<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9XJeNHftCwc6XW9zI48AaMnhQBiR8AVxM-e3D7BtzYt1qsu2on2x209W3paX5skjh99Kq4v-sLcSWGZMgIKPUVp9MLJgQWSPcQCxAvD2aZZANZ1j-9fFaMxHmX-hQWxmNs8mjwCq15iQS/s1600/maven-yeoman-logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9XJeNHftCwc6XW9zI48AaMnhQBiR8AVxM-e3D7BtzYt1qsu2on2x209W3paX5skjh99Kq4v-sLcSWGZMgIKPUVp9MLJgQWSPcQCxAvD2aZZANZ1j-9fFaMxHmX-hQWxmNs8mjwCq15iQS/s320/maven-yeoman-logo.png" width="320"></a></div>
<br>
Nous allons voir comment mixer un projet Java Maven classique avec un projet frontal Yeoman à l'aide du plugin <a href="https://github.com/trecloux/yeoman-maven-plugin" target="_blank">yeoman-maven-plugin</a> de <a href="https://github.com/trecloux" target="_blank">Thomas Recloux</a>, qui est aussi utilisé dans <a href="https://jhipster.github.io/" target="_blank">JHipster</a>.<br>
<br>
Le frontal Web écrit en Javascript va utiliser les services REST du back écrit en Java. Le tout dans un seul et même projet et packagé au sein d'un même Jar ou War.<br>
<h2>
Arborescence du projet</h2>
<pre>pom.xml => Fichier Maven
src => Source du projet
main
java
resources
webapp
test
java
resources
yo => Projet Yeoman
package.json
Gruntfile.js
bower.json
app/
</pre>
Le répertoire "yo" contient les sources du projet Yeoman qui ne sont pas inclus directement dans les sources du projet. Ceci permet de conserver un projet Yeoman indépendamment du reste du projet qui lui respecte la structure d'un projet Maven.<br>
<h2>
Maven</h2>
La construction du projet "Yeoman" s'effectuera à l'aide de la commande "grunt build" lancée par Maven via le plugin <a href="https://github.com/trecloux/yeoman-maven-plugin" target="_blank">yeoman-maven-plugin</a>.
<br>
<br>
Ce build nécessite l'appel aux outils "npm", "bower" et "grunt".
<br>
<br>
Ainsi le plugin va lancer les commandes suivantes par défaut :
<br>
<ul>
<li><code>npm install</code></li>
<li><code>bower install --no-color</code></li>
<li><code>grunt test --no-color</code></li>
<li><code>grunt build --no-color</code></li>
</ul>
<script src="https://gist.github.com/ludo1026/039702147c556223f699.js"></script>
Ainsi, Maven lance npm, bower puis grunt lors de chaque build de l'application.<br>
<a href="http://blog2dev.blogspot.com/2015/06/maven-yeoman.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-23586769700689073292015-05-07T07:02:00.001-07:002015-05-13T05:28:08.750-07:00OAuth 2.0 - Principes et Fonctionnement<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG5CmD69DfY3vGGycQv-3BPqEGJw0dVFtx79h-l1y48421ATAnhhZglvtZWR4n8Z5HcScQSNy71DxdacfjhOiEzElpzUn8wPxRiZGfGJWF44k-ZxBoSGuhVgrOF3Huv2s-aNdZvj114OVA/s1600/oauth-2-sm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG5CmD69DfY3vGGycQv-3BPqEGJw0dVFtx79h-l1y48421ATAnhhZglvtZWR4n8Z5HcScQSNy71DxdacfjhOiEzElpzUn8wPxRiZGfGJWF44k-ZxBoSGuhVgrOF3Huv2s-aNdZvj114OVA/s1600/oauth-2-sm.png"></a></div>
<br>
<a href="http://oauth.net/2/" target="_blank">OAuth 2.0</a> permet de gérer l'authentification et les droits d'accès aux informations d'un utilisateur via un serveur d'autorisation.<br>
<br>
Plus complexe qu'une authentification simple, OAuth 2.0 permet d'effectuer du Single Sing-On entre services et entre serveurs distants.<br>
<br>
Pour bien comprendre OAuth 2.0 il faut connaître les rôles et les types de jeton suivants :<br>
<h2>
Rôles</h2>
<div>
<ul>
<li><b>Resource Owner</b> : Le propriétaire / détenteur des ressources</li>
<ul>
<li>Par exemple: l'utilisateur qui a déposé ses photos sur le serveur de ressources</li>
</ul>
</ul>
<ul>
<li><b>Resource Server</b> : Le serveur de ressources qui contient les ressources protégées appartenant au Ressource Owner</li>
<ul>
<li>Par exemple: le serveur de ressources qui contient les photos d'un utilisateur que l'on peut récupérer via des requêtes HTTP REST</li>
</ul>
</ul>
<ul><ul>
</ul>
</ul>
<ul>
<li><b>Client Application</b> : l'application cliente qui demande les ressources au serveur de ressources</li>
<ul>
<li>Par exemple: Une application Android qui souhaite récupérer les photos de l'utilisateur qui sont stockées sur le serveur de ressources</li>
</ul>
</ul>
<ul>
<li><b>Authorization Server</b> : Le serveur d'autorisation délivre le jeton d'accès (Access Token) aux ressources protégées à l'application cliente dans le cas où le Resource Owner valide cet accès</li>
<ul>
<li>Par exemple: l'application Android récupère un jeton d'accès pour récupérer les images d'un utilisateur depuis le serveur de ressources</li>
</ul>
</ul>
</div>
<h2>
Jetons (Token)</h2>
Le jeton est une chaîne de caractères aléatoire généré par le serveur d'autorisation.
<br>
<br>
Il existe deux types de jeton :
<br>
<ul>
<li><b>Access Token</b> : le jeton d'accès permet au client d'accéder à une partie des ressources protégées du serveur de ressources</li>
<li><b>Refresh Token</b> : le jeton de renouvellement permet le renouvellement du jeton d'accès lorsque celui-ci arrive à expiration</li></ul><a href="http://blog2dev.blogspot.com/2015/05/oauth-20-principes-et-fonctionnement.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-58201294949602941862015-03-23T12:34:00.000-07:002015-04-07T05:34:35.131-07:00Docker Compose - Gérer plusieurs conteneurs en une commande<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSkld-Kx8pEVFwu100hx3adp2T8CyCuRcqymhORb5SiHPBZjOJPP8T05JarhKeXHFwZxfKqwSi_vizmSEasp9aaVX2uJeUDqzBjQTp4BCeeouj7vjc48c9oj8yx20rDts9Rc-L02lqqg8v/s1600/docker.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSkld-Kx8pEVFwu100hx3adp2T8CyCuRcqymhORb5SiHPBZjOJPP8T05JarhKeXHFwZxfKqwSi_vizmSEasp9aaVX2uJeUDqzBjQTp4BCeeouj7vjc48c9oj8yx20rDts9Rc-L02lqqg8v/s1600/docker.png" height="165" width="200"></a></div>
<br>
<div style="text-align: left;">
<i><b><a href="https://docs.docker.com/compose/">Docker Compose</a></b> est l'intégration de <a href="http://www.fig.sh/">Fig</a> dans <a href="https://www.docker.com/" target="_blank">Docker</a>.</i></div>
<br></div>
<div>
L'objectif est de gérer en une commande <code>docker compose</code> le build, le démarrage et l'arrêt de plusieurs images et conteneurs.<br>
<br>
Il s'agit de remplacer l'usage des commandes <code>docker build</code> et <code>docker run</code> par un fichier YAML <code>docker-compose.yml</code> qui décrit les images à construire, les paramètres de démarrage des conteneurs ainsi que les liens entre ces conteneurs.<br>
<br></div>
<div>
Pour cela, le fichier <code>docker-compose.yml</code> décrit :</div>
<div>
<ul>
<li>si le conteneur est issu d'une image existante ou s'il est nécessaire d'en construire une nouvelle à partir d'un fichier <code>Dockerfile</code></li>
<li>les arguments qui étaient spécifiées lors du démarrage du conteneur via la commande <code>docker run</code> :</li>
<ul>
<li>mapping des ports entre la machine hôte et le conteneur</li>
<li>le montage des volumes entre la machine hôte et le conteneur</li>
<li>les liens entre les conteneurs</li>
</ul>
</ul>
</div>
<div>
La commande <code>docker-compose up</code> effectue ainsi la création des images et le démarrage des différents conteneurs d'après ce qui est décrit dans le fichier <code>docker-compose.yml</code></div>
<div>
<h2>
Installation</h2></div><a href="http://blog2dev.blogspot.com/2015/03/docker-compose-gerer-plusieurs.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-55742555940744372842015-03-13T11:14:00.004-07:002015-03-24T05:46:15.997-07:00Netflix Hystrix Dashboard - Monitoring du cloud<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifAq_Bx0cFj13LMbV_h6nzuxWe-tCYKMK2hmSo30L-wMKfIm1eCBF8DOyxF_XiyIh85Si5rsKLCQLeVOl3hovR6tlMGoN4lZT4hf1P5un6U6V1p_xRFnTGBIiQH7mPFNlTIClNc7cmjQQR/s1600/hystrix-logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifAq_Bx0cFj13LMbV_h6nzuxWe-tCYKMK2hmSo30L-wMKfIm1eCBF8DOyxF_XiyIh85Si5rsKLCQLeVOl3hovR6tlMGoN4lZT4hf1P5un6U6V1p_xRFnTGBIiQH7mPFNlTIClNc7cmjQQR/s1600/hystrix-logo.png" height="168" width="200"></a></div>
<br>
<a href="https://github.com/Netflix/Hystrix/wiki" target="_blank">Netflix Hystrix</a> permet d'effectuer du <b>monitoring</b> et de la <b>gestion d'erreurs</b> sur les services et les applications dans le Cloud. Il dispose d'un tableau de bord qui présente les graphes et les métriques sur l'état des services dans le cloud.<br>
<br>
<a href="https://github.com/Netflix/Turbine/wiki" target="_blank">Netflix Turbine</a> sert à aggréger dans le temps les données envoyées par les clients Hystrix et transmet ces données au serveur Hystrix pour afficher le dashboard.<br>
<br>
Nous allons voir dans cet article la mise en place du dashboard Hystrix pour voir les métriques sur les accès aux services Rest d'une application basée sur <a href="http://projects.spring.io/spring-boot/" target="_blank">Spring Boot</a> à l'aide de <a href="http://cloud.spring.io/spring-cloud-netflix/" target="_blank">Spring Cloud Netflix</a>.<br>
<h2>
Création du serveur Hystrix</h2>
Nous créons un nouveau projet Spring Boot:<br>
<ul>
<li>Aller sur le site Spring Initializr:</li>
<ul>
<li><a href="http://start.spring.io/" target="_blank">http://start.spring.io/</a></li>
<li>Renseigner les informations du projet avec comme nom "spring-hystrix-server" par exemple</li>
<li>Ne pas sélectionner de dépendances</li>
<li>Cliquer sur "Generate project" pour télécharger le projet basé sur Spring Boot</li>
<li>Dézipper le projet</li>
</ul>
<li>Dans le fichier pom.xml, remplacer le parent et ajouter les dépendances suivantes :</li>
<script src="https://gist.github.com/lchaboud/e54ab6c1f04e725d942d.js"></script>
<li>Dans la classe principale <code>Application.java</code>, ajouter l'annotation <code>@EnableHystrixDashboard</code></li>
</ul>
<ul>
<li>Créer le fichier <code>application.yml</code> dans le répertoire <code>src/main/resources</code>:
<script src="https://gist.github.com/lchaboud/28c7646d1be5ab302bbc.js"></script>
</li>
<li>Démarrer le serveur:</li>
<pre>mvn spring-boot:run</pre>
</ul>
<ul>
<li>URL du dashboard Hystrix:</li>
<ul>
<li><a href="http://localhost:8889/hystrix" target="_blank">http://localhost:8889/hystrix</a></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxgwPWs-kU-DaCNEBwZtd2OVRhLKf5dfAqVbtQt5w3hyphenhyphen1vjdHmF0HiQ1jRxUUakp9PctH-TbgdOEF-aqvPwQdPqrSN_s2eUe6hPYl8zZRsy8nDIVupG2TeJ7k5rt6wCtjtGu7AAtzZcrkb/s1600/hystrix.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxgwPWs-kU-DaCNEBwZtd2OVRhLKf5dfAqVbtQt5w3hyphenhyphen1vjdHmF0HiQ1jRxUUakp9PctH-TbgdOEF-aqvPwQdPqrSN_s2eUe6hPYl8zZRsy8nDIVupG2TeJ7k5rt6wCtjtGu7AAtzZcrkb/s1600/hystrix.png" height="400" width="640"></a></div>
</ul>
Hystrix Dashboard demande l'URL d'un flux Hystrix pour en afficher les statistiques.<br>
<div>
<br>
<div>
<div>
Il n'y a pas encore de statistiques à afficher: nous allons configurer les applications pour qu'elles envoient des métriques au serveur Turbine et Hystrix.</div>
<h2>
Application cliente: activation de Hystrix</h2></div></div><a href="http://blog2dev.blogspot.com/2015/03/spring-cloud-netflix-hystrix-dashboard.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-78617973982358538052015-03-13T04:27:00.000-07:002015-03-13T09:11:23.644-07:00Spring Cloud Config Server - Serveur de configuration des applications<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjibzSngkwATBEdL1DwqH90ccJmvztAUa597iDfuK12m6A4sVC7Ex6q0rFeulrxCM4X7sjQGKiiEHU5Gz7WPm3tTJZXQNguxKcOXrB8iuTenX7Z0QbBK_xv46AfEj5s1Cge4mNwNpaNgW7z/s1600/spring-cloud.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjibzSngkwATBEdL1DwqH90ccJmvztAUa597iDfuK12m6A4sVC7Ex6q0rFeulrxCM4X7sjQGKiiEHU5Gz7WPm3tTJZXQNguxKcOXrB8iuTenX7Z0QbBK_xv46AfEj5s1Cge4mNwNpaNgW7z/s1600/spring-cloud.png" height="160" width="200"></a></div>
<br>
Le serveur <b><a href="http://cloud.spring.io/spring-cloud-config/" target="_blank">Spring Cloud Config Server</a></b> permet de <b>centraliser la configuration des applications des différents environnements</b>.<br>
<br>
Il peut être utilisé pour n'importe quelle application écrit dans n'importe quelle langage, ce n'est donc pas spécifique aux applications Spring. Cependant, son utilisation est facilitée pour les applications basées sur Spring Boot.<br>
<br>
Il est capable de gérer les configurations des environnements de développement, d'intégration, de test jusqu'à la production.<br>
<br>
Par défaut, il recherche les fichiers de configuration dans un répertoire situé sur un référentiel de source <b>Git</b>. Mais ceci peut être modifié pour rechercher les fichiers de configuration sur plusieurs référentiels Git. Il peut également rechercher les fichiers de configuration dans le classpath du serveur ou dans un répertoire sur le système de fichiers local au serveur de configuration.<br>
<br>
En cas de modification d'un fichier sur le repository Git, cette modification sera prise en compte à la prochaine requête sur le serveur de configuration sans avoir besoin de redémarrer le serveur de configuration.<br>
<br>
Les mots de passe et autres données sensibles peuvent être <b>encryptées</b> afin d'éviter de stocker les mots de passe en clair dans les fichiers de configuration sur le serveur de configuration.<br>
<br>
Nous aurons à ajouter un fichier <code>bootstrap.yml</code> dans l'application cliente afin qu'elle recherche la configuration sur le serveur de configuration.<br>
<br>
Documentation : <a href="http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html">http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html</a><br>
<a href="http://blog2dev.blogspot.com/2015/03/spring-cloud-config-server-serveur-de.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-27538357166347460272015-03-12T07:40:00.001-07:002015-03-12T07:44:36.405-07:00The Go Programming Language - Créer un serveur HTTP léger<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhtW2UpyAEz-bIAD83iHPA9AVzDVzp8vppkni_m_Hj-5OvMBzr5sVLs4McEY7AMCgjuuuTQh3Tg9hlZFLTZyLoNNpY0t6LFXpdhwsDZXdwHBm0uMBhJVgGujELXZNR4BpXTQs_twP52tKq/s1600/photo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhtW2UpyAEz-bIAD83iHPA9AVzDVzp8vppkni_m_Hj-5OvMBzr5sVLs4McEY7AMCgjuuuTQh3Tg9hlZFLTZyLoNNpY0t6LFXpdhwsDZXdwHBm0uMBhJVgGujELXZNR4BpXTQs_twP52tKq/s1600/photo.jpg" height="199" width="200"></a></div>
<br>
<a href="https://golang.org/" target="_blank">The Go Programming Language</a> est un langage open source développé par Google qui est compilé en langage machine natif tout en ayant la gestion d'un garbage collector, des concurrences et dispose de librairies faciles d'utilisation.<br>
<br>
Certaines librairies permettent par exemple de faire des opérations sur le filesystem, de créer un serveur HTTP léger, de créer de services Rest.<br>
<h2>
Installation</h2>
<div>
<ul>
<li>Aller sur la page de téléchargement de Go :</li>
<ul>
<li><a href="https://golang.org/dl/" target="_blank">https://golang.org/dl/</a></li>
</ul>
<li>Télécharger et installer Go</li>
</ul>
<h2>
Premier pas</h2>
</div>
<div>
<ul>
<li>Créer le fichier "hello.go"</li>
<script src="https://gist.github.com/lchaboud/cfd0f62761a1cd42db8e.js"></script>
<li>Compiler le programme :</li>
<pre>go build hello.go</pre>
=> Le programme est compilé en un exécutable nommé "hello"<br>
<li>Exécuter le programme compilé:</li>
<pre>$ ./hello
<span style="color: #666666;">Hello, world.</span>
</pre>
</ul>
<div>
</div>
</div>
<div>
<br>
<h2>
Petit serveur HTTP</h2>
<h3>
Serveur HTTP avec une page statique simple</h3>
<div>
Nous utilisons la librairie <code>net/http</code> pour avoir accès aux fonctionnalités HTTP.<br>
<br>
<br>
</div></div><a href="http://blog2dev.blogspot.com/2015/03/the-go-programming-language-creer-un.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-68825132624525924162015-03-11T10:07:00.003-07:002015-05-28T02:53:28.788-07:00Netflix Eureka - Registre des services<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis_g4548xxOPt5ksCL9Luy6ilmPMCFFSwH6fG-WDB5EPlObNot5mzl-iP5eeXql_K6JLM1l_s3eon9-gg-9lFjZcxTwBiFzKEDyGofH4y10krmm2Ps5_NDrxatPzcRVSquZsNF23q1sHQo/s1600/spring-cloud.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis_g4548xxOPt5ksCL9Luy6ilmPMCFFSwH6fG-WDB5EPlObNot5mzl-iP5eeXql_K6JLM1l_s3eon9-gg-9lFjZcxTwBiFzKEDyGofH4y10krmm2Ps5_NDrxatPzcRVSquZsNF23q1sHQo/s1600/spring-cloud.png" width="200"></a></div>
<br>
<b><a href="http://projects.spring.io/spring-cloud/" target="_blank">Spring Cloud</a></b> a pour objectif de fournir les serveurs et libraires prêts à l'emploi pour permettre les mécanismes suivants dans un cloud de serveurs :<br>
<ul>
<li>Configuration distribuée et versionnée</li>
<li>Enregistrement et de découverte de services</li>
<li>Routing</li>
<li>Appels entre services</li>
<li>Load balancing</li>
<li>Coupe circuits</li>
<li>Vérouillage global</li>
<li>Election d'un leader</li>
<li>Etat d'un cluster</li>
<li>Distribution de messages entre services</li>
</ul>
<div>
<b><a href="http://projects.spring.io/spring-cloud/" target="_blank">Spring Cloud</a></b> se décompose en plusieurs modules:<br>
<ul>
<li><b><a href="http://cloud.spring.io/spring-cloud-netflix/" target="_blank">Spring Cloud Netflix</a></b> :</li>
<ul>
<li>Serveurs et librairies open source créés et utilisés par <b>Netflix </b>sur son propre cloud :</li>
<ul>
<li><b>Eureka</b>: Registre et découverte des services</li>
<li><b>Hystrix</b>: Monitoring et Reprise des erreurs en cas d'échec</li>
<li><b>Ribbon</b>: Load-balancer côté client</li>
<li><b>Feign</b>: Déclaration de services REST côté client</li>
<li><b>Zuul</b>: Proxy pour le routage et le filtrage</li>
</ul>
<li>Documentation :</li>
<ul>
<li><a href="http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html" target="_blank">http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html</a></li>
</ul>
</ul>
</ul>
<div>
<ul>
<li><b><a href="http://cloud.spring.io/spring-cloud-connectors/" target="_blank">Spring Cloud Connectors</a>:</b></li>
<ul>
<li>Simplification de l'accès aux services du Cloud depuis les applications</li>
<li>Support de Cloud Foundry et de Heroku</li>
<li>Permet le support d'un cloud personnalisé</li>
</ul>
</ul>
<ul>
<li><b><a href="http://cloud.spring.io/spring-cloud-config/" target="_blank">Spring Cloud Config</a></b>:</li>
<ul>
<li>Externalisation de la configuration dans un environnement distribué</li>
<li>Le serveur <b>Spring Cloud Config Server</b> centralise la configuration des applications sur les différents environnement</li>
</ul>
</ul>
<ul>
<li><b><a href="http://cloud.spring.io/spring-cloud-bus/" target="_blank">Spring Cloud Bus</a></b>:</li>
<ul>
<li>Serveur <b>RabbitMQ</b> : bus de messages basés sur le protocol <b>AMQP </b>pour la communication point-to-point et publish-subscribe</li>
</ul>
</ul>
<ul>
<li><b><a href="http://cloud.spring.io/spring-cloud-security/" target="_blank">Spring Cloud Security</a></b>:</li>
<ul>
<li><b>Single Sign On</b> basé sur <b>OAuth2</b></li>
</ul>
</ul>
<div>
</div>
</div>
<br>
Pour faciliter la mise en place des serveurs et applications du cloud, il est préférable d'utiliser <b><a href="http://projects.spring.io/spring-boot/" target="_blank">Spring Boot</a></b> car il s'intègre très facilement à Spring Cloud via une simple dépendance Maven:
<br>
<pre> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
</pre>
<br>
Spring Boot permet la mise en place rapide de serveurs et de services car il s'appuie sur le concept suivant :</div>
<div>
<ul>
<li>Convention over configuration : nous n'avons plus besoin de tout configurer, Spring Boot utilise la configuration standard. Il est alors possible de surcharger la configuration par défaut via un fichier de configuration YAML</li></ul></div><a href="http://blog2dev.blogspot.com/2015/03/netflix-eureka-registre-des-services.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-91655148675904078262015-03-05T08:35:00.000-08:002017-03-31T09:56:29.540-07:00RabbitMQ - Serveur AMQP<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4fHsefB9gATb7Q0PoDWmxtFW3l7yMwyVvPv2Hwouv9IdFOT3czJPwPpRqcmDXhJg6j4Ge836ulAYZvk__Gh0kdfFAFIzb1QRufb6DeQY7VpOkQT5GcIDJezewir8kamNeWQmRMlzZhRx0/s1600/rabbitmq.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4fHsefB9gATb7Q0PoDWmxtFW3l7yMwyVvPv2Hwouv9IdFOT3czJPwPpRqcmDXhJg6j4Ge836ulAYZvk__Gh0kdfFAFIzb1QRufb6DeQY7VpOkQT5GcIDJezewir8kamNeWQmRMlzZhRx0/s1600/rabbitmq.png" height="67" width="320"></a></div>
<br>
<a href="http://www.rabbitmq.com/" target="_blank"><b>RabbitMQ</b> </a>est un serveur Open Source produit par <a href="http://pivotal.io/" target="_blank">Pivotal</a> qui permet de gérer des files de messages (Message Broker) pour l'échange d'informations entre des applications différentes sur des plate-formes différentes.<br>
<br>
Il s'appuie sur le protocole <a href="http://www.amqp.org/" target="_blank"><b>AMQP</b></a> qui veut dire <b>Advanced Message Queuing Protocol</b>.<br>
<br>
<b><a href="http://www.amqp.org/" target="_blank">AMQP</a></b> est un <b>protocole ouvert</b> pour les systèmes orientés messages (MOM : Message-Oriented Middleware).<br>
<br>
=> <a href="https://www.rabbitmq.com/tutorials/amqp-concepts.html" target="_blank">Voir la documentation de RabbitMQ sur les concepts AMQP</a><br>
<ul><ul>
</ul>
</ul>
<h2>
Installation de RabbitMQ - via l'installeur Windows</h2>
<b>RabbitMQ </b>nécessite <b>Erlang </b>pour fonctionner.<br>
<br>
Pour installer <b>Erlang </b>:<br>
<ul>
<li>Aller sur la page suivante pour télécharger <b>Erlang </b>: </li>
<ul>
<li><a href="http://www.erlang.org/download.html">http://www.erlang.org/download.html</a></li>
</ul>
<li>Sur Windows:</li>
<ul>
<li>Télécharger l’installeur via le lien <b>OTP 17.4 Windows 64-bit Binary File</b></li>
<li>Lancer et terminer l’installation</li>
</ul>
</ul>
Pour installer <b>RabbitMQ </b>:<br>
<ul>
<li>Aller sur la page suivante pour télécharger <b>RabbitMQ </b>:</li>
<ul>
<li><a href="http://www.rabbitmq.com/download.html">http://www.rabbitmq.com/download.html</a></li>
</ul>
<li>Sur Windows: </li>
<ul>
<li>Télécharger l’installeur <b>rabbitmq-server.exe</b></li>
<li>Lancer et terminer l’installation</li></ul></ul><a href="http://blog2dev.blogspot.com/2015/03/rabbitmq-serveur-amqp.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-12838149064032797822015-03-04T06:39:00.000-08:002015-03-05T02:55:40.502-08:00Dropwizard<div class="separator" style="clear: both; text-align: center;">
<a href="http://dropwizard.io/"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR88FqtWcHBzyvlzFHqwVqAzV8TihyfXWosGUC7d2eQJLuMvmk8xlmy4yFE93gk2agH4KKPjCxyPFdNRdjstthk9QDcLmoYzTiPZKXN5t2hsMnJFz1d6npBBJ_Mw3vW4GTpnqjEODBcL8J/s1600/dropwizard-hat.png" height="200" width="121"><span id="goog_1829726901"></span><span id="goog_1829726902"></span></a></div>
<br>
<a href="http://dropwizard.io/" target="_blank">Dropwizard</a> est un framework Java qui est orienté Hautes Performances, Web Services REST et qui produit une application prête à être mise en production en intégrant des services utiles aux "Ops".<br>
<br>
Dropwizard est adapté pour la mise en place de micro-services.<br>
<br>
En effet, une application produite avec Dropwizard est <b>autonome </b>et <b>autoportée </b>:<br>
<ul>
<li>elle embarque un serveur <a href="http://eclipse.org/jetty/" target="_blank">Jetty</a> pour exposer des services RESTful via <a href="https://jersey.java.net/" target="_blank">Jersey</a> (norme JAX-RS)</li>
<li>elle peut utiliser une base mémoire comme <a href="http://www.h2database.com/" target="_blank">H2</a></li>
</ul>
Cette application est packagée sous la forme d'un <b>JAR</b> et ne nécessite que la présence du JDK de Java pour fonctionner.<br>
<br>
L'application se lance via la commande <code>java -jar</code> avec en paramètre la localisation du fichier YAML de configuration.<br>
<pre>java -jar application.jar server config.yml</pre>
Les paramètres de configuration qui sont spécifiques à l'environnement cible peuvent être surchargés via la commande <code>java -jar</code> afin de ne pas avoir à modifier à chaque fois le fichier de configuration.<br>
<br>
Il est également possible de fournir des services pour l'arrêt et le redémarrage de certains services de l'application (<code>interface Managed</code>) ainsi que pour le changement de fichiers statiques à la volée (<code>Assets</code>).<br>
<br>
La présence de <b>métriques </b>via <a href="https://dropwizard.github.io/metrics/3.1.0/" target="_blank">Metrics</a> permet de fournir des informations aux "Ops" (opérations) :<br>
<ul>
<li>état de la JVM</li>
<li>état des composants critiques de l'application : </li>
<ul>
<li>temps de réponses de requêtes, état du pool de connexions JDBC (nombre de connexions actives, en attente), etc.</li>
</ul>
</ul>
<div>
Les métriques fournies par <a href="https://dropwizard.github.io/metrics/3.1.0/" target="_blank">Metrics</a> peuvent s'interfacer avec des outils de reporting comme <a href="http://ganglia.github.io/" target="_blank">Ganglia</a> et <a href="http://graphite.wikidot.com/" target="_blank">Graphite</a> afin d'avoir un tableau de bord pour les "Ops".</div>
<a href="http://blog2dev.blogspot.com/2015/03/dropwizard.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-79677245944769792412015-02-19T09:02:00.000-08:002015-02-19T09:02:01.061-08:00HTTPS avec Spring Boot<h2>
Générer la clé SSL</h2>
<div>
<p>
Nous allons générer un keystore contenant une clé pour l'application Spring Boot.</p>
<p>
Pour cela, nous nous servons du programme "<b style="background-color: white; color: #5b5a5a; font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 18.2000007629395px;">keytool</b>" installé par défaut dans Java dans le répertoire <b>bin</b> du JDK ou du JRE.</div>
<div>
<ul>
<li>Lancer la commande suivante à la racine du projet Spring Boot :</li>
</ul>
</div>
<pre>keytool -genkey -alias [nom de la clé] -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
</pre>
, en remplaçant <code>[nom de la clé]</code> par le nom de l'application
<div>
<ul>
<li>Saisir et confirmer le mot de passe de la clé</li>
<li>Saisir le nom de l'application à la 3è question</li>
<li>Répondre aux autres questions sans obligatoirement mettre de valeur</li>
<li>Répondre à la dernière question par "yes"</li>
</ul>
Le fichier <code>keystore.p12</code> a été généré à la racine du projet.
Nous pouvons vérifier le contenu de ce keystore :
<br />
<pre>keytool -list -v -keystore keystore.p12 -storetype pkcs12
</pre>
Cette commande affiche les informations de la clé.
</div>
<h2>
Configurer Spring Boot</h2>
<div>
<p>
Nous indiquons à SpringBoot que nous utilisons le protocol HTTPS à l'aide de la clé que nous avons généré.
<br/><br/>
<ul>
<li>Dans le fichier <code>src/main/resources/application.yml</code>, ajouter les lignes suivantes :</li>
</ul>
<pre>
server:
port: 9000
ssl.key-store: keystore.p12
ssl.key-store-password: [mot de passe]
ssl.keyStoreType: PKCS12
ssl.keyAlias: [nom de l'alias]
</pre>
, avec :
<ul>
<li>9000 : le port HTTPS de Tomcat</li>
<li>keystore.p12 : le fichier de la clé que nous avons générée</li>
<li>[mot de passe] : le mot de passe saisi lors de la création de la clé</li>
<li>[nom de l'alias] : le nom de la clé que nous avons défini lors de sa création</li>
</ul>
</p>
</div>
<h2>
Lancer l'application</h2>
<div>
<ul>
<li>Relancer l'application basée sur Spring Boot, via la commande : <pre>mvn spring-boot:run</pre></li>
<ul>
<li>Si l'exception <code>Caused by: javax.crypto.BadPaddingException: Given final block not properly padded</code> apparaît, cela veut dire que le mot de passe saisi dans le fichier <code>application.yml</code> ne correspond pas à celui de la clé</li>
</ul>
<li>Accéder à la page d'accueil de l'application en utilisant le protocole HTTPS, c'est à dire en utilisant <pre>https://localhost:9000/[application]</pre> au lieu de <pre>http://localhost:8080/[application]</pre></li>
</ul>
</div>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-38295926939042167832015-01-08T23:02:00.003-08:002015-01-08T23:36:56.657-08:00Javascript : Scope des variables<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMI2JdRkgrqz38EM78-ryM1N9Bq98HaAspbCz3Jtgh6fWxGKLKZA2tKHoON-a7KD13ivBceoABmydu6lh7eFgKDVj7ob9o1j0gre9flG84RVHBND5BlWEUz4hoAHh2vXXpF_iNC_TEGijn/s1600/js_logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMI2JdRkgrqz38EM78-ryM1N9Bq98HaAspbCz3Jtgh6fWxGKLKZA2tKHoON-a7KD13ivBceoABmydu6lh7eFgKDVj7ob9o1j0gre9flG84RVHBND5BlWEUz4hoAHh2vXXpF_iNC_TEGijn/s1600/js_logo.png" height="200" width="200"></a></div>
<br>
En Javascript, il est important de maîtriser le scope des variables pour éviter les effets de bord et maîtriser l'utilisation de <b>closures</b>.<br>
<div>
<br>
Voici un rapide résumé des règles du <b>scope des variables globales</b> :<br>
<ul>
<li>une variable est une variable globale si elle déclarée pour la première fois sans utiliser le mot clé <code>var</code>, que l'on soit ou non dans le code d'une fonction</li>
<li>une variable globale est accessible et modifiable de partout </li>
</ul>
</div>
<div>
Voici un rapide résumé des règles du <b>scope des variables d'une fonction</b> :<br>
<div>
<ul>
<li>une variable est dans le scope d'une fonction si cette variable a été déclarée via le mot clé <code>var</code></li>
<li>le paramètre d'une fonction est dans le scope des variables de cette fonction : il s'agit du même comportement que pour une variable définie via le mot clé <code>var</code></li>
<li>une variable dans le scope d'une fonction est accessible et modifiable depuis le code de cette fonction ainsi que depuis les fonctions enfants de cette fonction</li>
<li>une variable du scope d'une fonction parent peut être masquée dans une fonction enfant par une variable de même nom dans le scope de cette fonction enfant</li>
</ul>
</div>
<br></div>
<div>
<b>Règle de survie en Javascript : </b>
<br>
<blockquote>
<b>
Le comportement des variables globales est dangereux et provoque des effets de bord très difficiles à corriger, c'est pourquoi il faut toujours utiliser le mot clé <code>var</code> pour déclarer une variable.</b></blockquote>
</div><a href="http://blog2dev.blogspot.com/2015/01/javascript-scope-des-variables.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-75695882635998947202014-11-05T08:34:00.000-08:002014-11-05T09:34:37.103-08:00Git - Utilisation en local pour voir les bases de GitNous allons voir dans comment utiliser Git en local.<br>
<br>
Sur Windows, il est conseillé d'installer Git et d'utiliser Git Bash qui est un shell disposant des commandes Git. Il gère l'auto-complétion au niveau des commandes Git et des noms de branches et de fichiers. L'installation de Git contient également le programme <code>gitk</code> qui permet d'avoir une visualisation de son dépôt.
<br>
<h2>
Création d'un projet vide</h2>
Nous créons un répertoire vide pour notre projet. Dans notre exmple, nous créons le répertoire <code>project</code> dans <code>c:/git</code>.
<br>
<pre>$ mkdir project
$ cd project</pre>
<h2>
Création d'un dépôt local - git init</h2>
Nous créons un dépôt en local.
<br>
<pre>$ git init
Initialized empty Git repository in c:/git/project/.git/</pre>
L'invité de commandes indique maintenant que nous sommes sur la branche master du projet via le nom entre parenthèses :
<br>
<pre>/c/git/project (master)</pre>
<h4>
</h4><a href="http://blog2dev.blogspot.com/2014/11/git-utilisation-en-local-pour-voir-les.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-82681231220500505662014-07-02T08:27:00.000-07:002015-03-24T06:43:45.113-07:00Docker - Réseau et Partage de fichiers - Conteneur avec serveur OpenSSH<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1W1-MmuvfGqEyb6I7YTmyxXbz2w6kY9CT2vPsKlDr7CcnouTGSG_4xNP9Qm3aqYzcbMBWVa9dG1yuz8sXhBv8cKPX5GXwmeyRl-iTeOLZwHDuklXbHi5D2uT01_Hir02m2mIGr2cNYnFh/s1600/docker.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1W1-MmuvfGqEyb6I7YTmyxXbz2w6kY9CT2vPsKlDr7CcnouTGSG_4xNP9Qm3aqYzcbMBWVa9dG1yuz8sXhBv8cKPX5GXwmeyRl-iTeOLZwHDuklXbHi5D2uT01_Hir02m2mIGr2cNYnFh/s1600/docker.png" height="165" width="200"></a></div>
<div>
Nous allons voir comment paramétrer les <b>connexions réseaux</b> et les <b>partages de fichiers</b> entre les conteneurs Docker, la machine virtuelle Linux et la machine physique Windows.<br>
<br>
Nous prenons comme exemple un conteneur disposant d'un serveur SSH pour pouvoir s'y connecter depuis la machine virtuelle et depuis Windows. Nous créerons également un répertoire partagé entre Windows et la machine virtuelle et aussi avec le conteneur, ce qui permet de modifier les fichiers du répertoire du conteneur depuis le répertoire de Windows.<br>
</div><a href="http://blog2dev.blogspot.com/2014/07/docker-reseau-et-partage-de-fichiers.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-42629338672826387422014-07-02T08:26:00.000-07:002015-03-24T06:43:57.751-07:00Docker - Réseau et Partage de fichiers - Commandes Docker<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAElN4PHwTuWGdBHGgTpKHrbPzi6Zzyi_ZMjAcVxlc_jfk-TAPSCfyuJFEd5Ru1hACC4UOnJA3E0bZnylzdIqlH6zTJGJtaJRdFhbkrrR-R2_2zOaOY1C0UtMACur_tCiCOSX4jkBfWea1/s1600/docker-min.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAElN4PHwTuWGdBHGgTpKHrbPzi6Zzyi_ZMjAcVxlc_jfk-TAPSCfyuJFEd5Ru1hACC4UOnJA3E0bZnylzdIqlH6zTJGJtaJRdFhbkrrR-R2_2zOaOY1C0UtMACur_tCiCOSX4jkBfWea1/s1600/docker-min.png"></a></div>
<br>
Nous allons voir comment paramétrer les ports réseaux et le partage de fichiers entre les conteneurs Docker et la machine hôte.<br>
<h2>
Pré-requis</h2>
<div>
Il faut avoir lu l'article suivant avant de lire celui-ci : <a href="http://blog2dev.blogspot.fr/2014/06/docker-mise-en-pratique.html" target="_blank">Docker - Premiers pas</a></div>
<h2>
Partage de fichiers</h2>
<div>
Le montage de volumes disques permet à un conteneur d'utiliser le contenu d'un répertoire de la machine hôte : le conteneur a ainsi des fichiers lors de son premier démarrage et ces fichiers sont stockés sur la machine hôte donc ils ne seront pas effacés lors de l'arrêt du conteneur.<br>
</div><a href="http://blog2dev.blogspot.com/2014/07/docker-reseau-et-partage-de-fichiers_2.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-86762966679368566332014-07-01T02:24:00.000-07:002014-07-01T02:25:07.140-07:00Apache + Tomcat + AJP - Installation et Configuration<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGsDNjMk6KcA2kGN9IisUqhqQDAJOlLfjNOQ3GjOdM31ccq7dA3GyyiufYhfMoPNTEZt501stg1sa2ShJU7McCiLWArY6zXkEQrZ5nRaDO49zZQl7fDI3iFiimma912j4hxuGcIfe2G-b2/s1600/apache.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGsDNjMk6KcA2kGN9IisUqhqQDAJOlLfjNOQ3GjOdM31ccq7dA3GyyiufYhfMoPNTEZt501stg1sa2ShJU7McCiLWArY6zXkEQrZ5nRaDO49zZQl7fDI3iFiimma912j4hxuGcIfe2G-b2/s1600/apache.gif" height="56" width="200"></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Cet article présente une installation et la configuration de Apache et Tomcat avec le module apache AJP pour la communication entre Apache et Tomcat.<br>
<h2>
Installation</h2>
<h3>
Apache</h3>
<ul>
<li>Télécharger Apache pour Windows :</li>
<ul>
<li><a href="http://apache.mirrors.multidist.eu//httpd/binaries/win32/" target="_blank">http://apache.mirrors.multidist.eu//httpd/binaries/win32/</a></li>
<li>Choisir par exemple :</li>
<ul>
<li><pre><a href="http://apache.mirrors.multidist.eu//httpd/binaries/win32/httpd-2.2.25-win32-x86-openssl-0.9.8y.msi">httpd-2.2.25-win32-x86-openssl-0.9.8y.msi</a></pre>
</li>
</ul>
</ul>
<li>Lancer le programme d'installation</li>
<li>Choisir comme répertoire d'installation d'Apache :</li>
<ul>
<li><code>C:\Apps\Apache2.2</code></li></ul></ul><a href="http://blog2dev.blogspot.com/2014/07/apache-tomcat-ajp-installation-et.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-85751022540020436472014-06-18T09:57:00.000-07:002014-06-20T01:35:29.831-07:00Démarrer rapidement une nouvelle base MongoDB<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6Bjb2yT-AH0YyO6aB-TOJ3Ahh-rTeTKBr3-fJQ1iXEioUemvXnRfJqEdte4MKXbX_F6iOS95Vgw24oDNUCgj4CoAIVAZpNuoHJ9tvkcIHARjnl3B0XUQc1djeQ3o6-1r3GmY84DhVzFU1/s1600/mongodb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6Bjb2yT-AH0YyO6aB-TOJ3Ahh-rTeTKBr3-fJQ1iXEioUemvXnRfJqEdte4MKXbX_F6iOS95Vgw24oDNUCgj4CoAIVAZpNuoHJ9tvkcIHARjnl3B0XUQc1djeQ3o6-1r3GmY84DhVzFU1/s1600/mongodb.png" /></a></div>
Voici un moyen pour créer et démarrer une nouvelle base MongoDB qui sera stockée dans le répertoire <code>data</code> du répertoire courant.<br />
<br />
Pour cela, nous créons le fichier <code>mongodb.bat</code> :<br />
<pre>@echo off
if not exist data mkdir data
%MONGODB_HOME%\mongodb\bin\mongod.exe --dbpath .\data</pre>
<br />
Il faut également déclarer les variables d'environnement :<br />
<ul>
<li><code>MONGODB_HOME</code> : répertoire d'installation de MongoDB</li>
<li><code>PATH</code> : y ajouter :</li>
<ul>
<pre>;%MONGODB_HOME%\bin</pre>
</ul>
</ul>
Ce fichier <code>mongodb.bat</code> va créer le répertoire <code>data</code> dans le répertoire courant s'il n'existe pas et MongoDB va se lancer en créant la nouvelle base dans ce répertoire <code>data</code>.Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-84026344531247354272014-06-12T08:05:00.002-07:002014-06-18T03:24:35.706-07:00Gradle<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm3Ky8JK27bBArPxQ44XX44ba719UyGX5bN56pKXpwt0_tmDjboAdPrTMhdK1AGfm-F6gQCoBHldjbLPo0m_6R279s-Xm9g2WM4m-dLk7oS9N_PXDKldhPc39n-_md-UYagKqRHO55Ngkf/s1600/gradle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm3Ky8JK27bBArPxQ44XX44ba719UyGX5bN56pKXpwt0_tmDjboAdPrTMhdK1AGfm-F6gQCoBHldjbLPo0m_6R279s-Xm9g2WM4m-dLk7oS9N_PXDKldhPc39n-_md-UYagKqRHO55Ngkf/s1600/gradle.png"></a></div>
<div>
Gradle permet d'automatiser la construction, le test, la publication, le déploiement d'applications.<br>
<br>
Gradle a la gestion des dépendances et les conventions de Maven avec en plus la flexibilité de Ant.<br>
<br>
Les fichiers de builds sont écrits via le langage Groovy DSL qui est un Domain Specific Language basé sur Groovy. Le langage Groovy a été choisi car Java ne suffisait pas pour décrire un fichier de build de projet et Groovy est un langage qui est plus proche syntaxiquement de Java que d'autres langages comme Python ou Ruby.<br>
<br>
Gradle supporte les types de projets suivants : Java, Groovy, OSGI, Web, Scala et Android.<br>
<br>
Il supporte nativement les projets multi-modules.<br>
</div><a href="http://blog2dev.blogspot.com/2014/06/gradle.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-70585879953058085412014-06-11T00:54:00.001-07:002015-03-05T14:36:44.714-08:00Groovy - Différences avec Java<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii8mlWcatQ7lS7LI-jpv203_c0HM5BlQICTkZ1fw3syaj1vOnLFH00ltVTdxymvs0JBzmdkewse9PfYxThZ_oAmw9mhBZRdjiAbl4ZdBjbKKEgQVrjkH4UY3m-1pEGdBr5vlTc8ThiecpG/s1600/groovy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii8mlWcatQ7lS7LI-jpv203_c0HM5BlQICTkZ1fw3syaj1vOnLFH00ltVTdxymvs0JBzmdkewse9PfYxThZ_oAmw9mhBZRdjiAbl4ZdBjbKKEgQVrjkH4UY3m-1pEGdBr5vlTc8ThiecpG/s1600/groovy.png"></a></div>
<br>
<a href="http://groovy.codehaus.org/" target="_blank">Groovy</a> est un langage qui tourne sur la JVM de Java.
<br>
<br>
Sa syntaxe se rapproche de Java et cet article liste les différences principales avec Java sans entrer dans les détails des nouvelles fonctionnalités offertes par Groovy. L'objectif est de comprendre du code Groovy quand on connait déjà la syntaxe Java.<br>
<br>
<br>
Pour développer, il est nécessaire d'installer le SDK de Groovy.<br>
<br>
Ce SDK n'est pas nécessaire pour utiliser Gradle qui est un outil de build de projets.
<br>
<h2>
Installation de Groovy</h2>
<div>
<ul>
<li>Télécharger le fichier ZIP contenant le SDK de Groovy :</li>
<ul>
<li><a href="http://groovy.codehaus.org/Download?nc" target="_blank">http://groovy.codehaus.org/Download?nc</a></li>
</ul>
<li>Décompresser le fichier ZIP pour créer le répertoire d'installation de Groovy</li>
<li>Ajouter la variable d'environnement :</li>
<ul>
<li><code>GROOVY_HOME</code> : le répertoire d'installation de Groovy</li>
</ul>
<li>Ajouter la variable d'environnement au <code>PATH</code> :</li>
<ul>
<li><code>PATH</code> : ajouter à la fin :</li>
<pre>;GROOVY_HOME\bin
</pre>
</ul>
</ul>
</div>
<h2>
Langage Groovy : Différences avec Java</h2>
<div>
Ce chapitre présente les différences majeurs avec le langage Java pour ne pas être perdu :</div>
<h3>
</h3><a href="http://blog2dev.blogspot.com/2014/06/groovy-differences-avec-java.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-90875918814740859402014-06-06T05:25:00.001-07:002014-06-12T05:54:31.464-07:00Docker - Premiers pas<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNzHS-ISUw_3bekfcHczM706m4HZLK71MPFQpPciG15MU5gcQC1BtoZMAmCohqK9sELijn0WsHOVL0tknF268cH3D-TA5BIkCOMfTejLUxy4Fn0Nk888QrZt6_hl1R6wC1bLchyKFfPfOM/s1600/docker.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNzHS-ISUw_3bekfcHczM706m4HZLK71MPFQpPciG15MU5gcQC1BtoZMAmCohqK9sELijn0WsHOVL0tknF268cH3D-TA5BIkCOMfTejLUxy4Fn0Nk888QrZt6_hl1R6wC1bLchyKFfPfOM/s1600/docker.png" height="165" width="200"></a></div>
<br>
<h2>
Sommaire</h2>
<div>
<ul>
<li>Cycle de vie des images et des conteneurs</li>
<li>Dockerfile</li>
<li>Créer un fichier Dockerfile</li>
<li>Créer une image</li>
<li>Démarrer un conteneur</li>
<li>Accéder au Shell du conteneur démarré</li>
<li>Surcharger la commande lancée au démarrage du conteneur</li>
<li>Supprimer un conteneur et son image</li>
<li>Commandes groupées</li>
<li>Modifier et recréer une image et démarrer son conteneur</li>
<li>Démarrer le conteneur en tâche de fond</li></ul></div><a href="http://blog2dev.blogspot.com/2014/06/docker-mise-en-pratique.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-89167558078973538012014-06-06T00:42:00.001-07:002014-07-01T07:26:06.949-07:00Docker - Installation rapide avec Vagrant et VirtualBox sur Windows<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5vLgpnk7zs1u2NwXdaG3CA8b9eadDFcE4MYibpwY1erPW79pPzFhyphenhyphen4wbZ6YUTqZHe9-wed65tC5UOgatwTahsJWWsOUI6tzETaZQnjdenDpL8VItInEvBKizKN_wu7mS6Eyi2BmC49yAr/s1600/docker.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5vLgpnk7zs1u2NwXdaG3CA8b9eadDFcE4MYibpwY1erPW79pPzFhyphenhyphen4wbZ6YUTqZHe9-wed65tC5UOgatwTahsJWWsOUI6tzETaZQnjdenDpL8VItInEvBKizKN_wu7mS6Eyi2BmC49yAr/s1600/docker.png" height="165" width="200"></a></div>
<br>
<h2>
Installation</h2>
<div>
Sous Windows, nous installons VirtualBox et Vagrant pour disposer rapidement d'une machine virtuelle Linux.<br>
</div><a href="http://blog2dev.blogspot.com/2014/06/docker-installation-rapide-avec-vagrant.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-26519357400142041582014-06-04T09:34:00.003-07:002017-02-03T03:01:29.999-08:00Docker - Présentation<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.docker.io/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8NgJQ0kUf3Fetchk40LjQoKx9syGQSuQGrkHZsEFSFMklIB0TgDCQoDBv4VnM9ybBLV3rH_K_9T0TRwz8NDSHkw1r_TnUgz3lB28WfJsXbakLM0DIZCO1OR8Ias-eIZsuoHiMdm-Gw7Jx/s1600/docker.png" width="200"></a></div>
<h2>
Présentation de Docker</h2>
<a href="https://www.docker.io/" target="_blank">Docker</a> permet de <b>simuler l'exécution de plusieurs machines Linux</b> sur une même machine Linux <b>sans avoir besoin d'utiliser de machines virtuelles</b>.<br>
<br>
Cependant, contrairement aux machines virtuelles, Docker ne simule pas de ressources matérielles ni de systèmes d'exploitation différents de ceux de la machine hôte.<br>
<div>
<br></div>
Dans Docker, un <b>conteneur </b>définit un contexte d'exécution des processus qui est différent de celui de la machine Linux hôte.<br>
<br>
Un conteneur est un <b>environnement virtuel d'exécution de processus</b> sur Linux.<br>
<br>
Un conteneur <b>dispose de ses propres ressources systèmes</b> :<br>
<ul>
<li>système de fichiers</li>
<li>interfaçage réseau</li>
<li>liste de processus en cours d'exécution</li>
<li>nom de la machine</li>
<li>CPU</li>
<li>mémoire</li>
<li>etc.</li>
</ul>
Nous avons un <b>principe d'isolation des ressources systèmes au niveau du conteneur </b>:<br>
<ul>
<li>les processus d'un conteneur :</li>
<ul>
<li>n'ont accès qu'aux ressources systèmes de ce conteneur</li>
<li>n'ont pas accès aux ressources systèmes de la machine hôte</li>
<li>n'ont pas accès aux ressources systèmes des autres conteneurs</li>
</ul>
</ul>
<div>
<b>Docker permet ainsi de simuler un environnement Linux différent au niveau de chaque conteneur.</b></div>
<div>
<br></div>
<b>Cependant, Docker partage certaines ressources systèmes entre le conteneur et la machine hôte</b><br>
, avec par exemple :<br>
<ul>
<li>la machine hôte voit les processus lancés dans les conteneurs</li>
<li>la configuration réseau d'un conteneur se base par défaut sur la configuration réseau de la machine hôte</li>
</ul>
<div>
Nous avons donc des ressources partagées entre les conteneurs et la machine hôte.<br>
</div><a href="http://blog2dev.blogspot.com/2014/06/docker-presentation.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-70671513528010681542014-05-13T05:56:00.000-07:002014-05-13T06:00:52.723-07:00Android - Interface utilisateur<div class="separator" style="clear: both; text-align: left;">
<i>Article précédent : <a href="http://blog2dev.blogspot.fr/2014/05/android-structure-dun-projet-et.html" target="_blank">Android - Structure d'un projet et Ressources</a></i></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqB9e3M8RHGbEkJe1uQfFXrsyAuq-M9VWCM7CxjT3x0vPX3M9lc1STA9GJ-IXmkLe4Q8Bh8hn3YK-erWhzbjmIJfCSIILX9dtHvIkwIqKvt_TbL9UUQWl9nj57IgOnA32QeLNoqidgOq3C/s1600/happy-android.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqB9e3M8RHGbEkJe1uQfFXrsyAuq-M9VWCM7CxjT3x0vPX3M9lc1STA9GJ-IXmkLe4Q8Bh8hn3YK-erWhzbjmIJfCSIILX9dtHvIkwIqKvt_TbL9UUQWl9nj57IgOnA32QeLNoqidgOq3C/s320/happy-android.png"></a></div>
<div>
Dans Android, il existe deux grandes familles d'éléments composant l'interface graphique :
<br>
<ul>
<li>les <b><a href="http://developer.android.com/reference/android/widget/package-summary.html" target="_blank">widgets</a> </b>qui sont éléments visuels qui interagissent avec l'utilisateur : bouton, champ texte, calendrier, vidéo, etc.</li>
<li>les <b><a href="http://developer.android.com/reference/android/view/ViewGroup.html" target="_blank">conteneurs (container)</a> </b>qui ne sont pas visibles de l'utilisateur et qui peuvent contenir un ou plusieurs composants visuels ou conteneurs. Ils servent à agencer les éléments les uns par rapport aux autres.</li>
</ul>
<div>
</div>
<h2>
Définir une interface utilisateur</h2>
Les interfaces utilisateurs peuvent définis soit en Java, soit en XML.<br>
<br>
Les IDE Eclipse, IntellijIDEA, etc. disposent d'éditeurs graphiques pour les fichiers XML afin de définir visuellement la composition de l'écran ainsi que l'agencement et les propriétés des éléments.<br>
<br>
Les fichiers XML des interfaces utilisateurs sont situés dans le répertoire du projet : <br>
<pre>res/layout</pre>
<br>
</div><a href="http://blog2dev.blogspot.com/2014/05/android-interface-utilisateur.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.comtag:blogger.com,1999:blog-889579830785951062.post-25555649325506139082014-05-13T05:15:00.001-07:002014-05-13T05:51:11.839-07:00Android - Structure d'un projet et Ressources<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqB9e3M8RHGbEkJe1uQfFXrsyAuq-M9VWCM7CxjT3x0vPX3M9lc1STA9GJ-IXmkLe4Q8Bh8hn3YK-erWhzbjmIJfCSIILX9dtHvIkwIqKvt_TbL9UUQWl9nj57IgOnA32QeLNoqidgOq3C/s1600/happy-android.png"></div>
<h2>
Structure d'un projet</h2>
Un projet Android est structuré de la manière suivante :<br>
<ul>
<li><code>AndroidManifest.xml</code> : fichier principal à la racine du projet qui définit les informations et les composants de l'application</li>
<li><code>src</code> : répertoire contenant le code source Java</li>
<li><code>res</code> : répertoire des ressources statiques</li>
<li><code>gen</code> : répertoire et fichiers générés automatiquement par l'IDE (dont la classe <code>R</code>)</li>
</ul>
<h2>
AndroidManifest.xml</h2>
<div>
Ce fichier est le fichier principal de l'application qui définit les informations suivantes :<br>
<ul>
<li>nom du package Java de base des classes de l'application</li>
<li>les composants de l'application : activités, services, etc.</li>
<li>les permissions requises par l'application pour accéder aux éléments du système</li>
<li>les permissions d'accès à l'application par les autres applications</li>
<li>indique la version minimale de l'API Android qui est requise par l'application</li>
<li>les librairies requises par l'application</li></ul></div><a href="http://blog2dev.blogspot.com/2014/05/android-structure-dun-projet-et.html#more">Lire la suite de l'article »</a>Blog2devhttp://www.blogger.com/profile/16234789102225231511noreply@blogger.com