Publié le 25 Septembre 2018

Lorsqu'on veut démarrer un serveur pour tester une partie de son application (par exemple pour simuler une resource avec laquelle notre application interagit) il est préférable de démarrer le serveur sur un port aléatoire (entre 1024 et 65535).

Ceci permet par exemple de pouvoir lancer plusieurs tests simultanément sans risque de tomber sur un port déjà alloué.

La solution qui vient à l'esprit est d'utiliser java.util.Random:

Random rand = new java.util.Random();
int port = rand.nextInt(65536 - 1024) + 1024;

Le problème s'est qu'on est pas à l'abri de tomber sur un port déjà utilisé. Pour ceci il faut demander au système d'exploitation de nous donner un port non attribué. C'est faisable lorsqu'on crée la socket:

// crée un serveur sur un port non utilisé
ServerSocket server = new ServerSocket(0);

Super! On a créé un serveur sur un port non utilisé. Mais maintenant comment se connecter à ce serveur dont on ne connait pas le port? Il suffit de le demander au serveur avec:

int port = server.getLocalPort();

Voir les commentaires

Rédigé par Bliz

Publié dans #Java

Repost0

Publié le 18 Septembre 2018

Docker-compose permet facilement de monter des volumes à l'intérieur d'un conteneur docker.

Cela se fait simplement en définissant une liste de volume à monter depuis votre fichier docker-compose:

volumes:
  - ~/.aws:/etc/aws
  - data:/opt/application/data

Cela suffit à monter les répertoires suivants:

- ${HOME}/.aws sur l'hôte dans le repertoire /etc/aws du conteneur
- data sur l'hôte dans le repertoire /opt/application/data du conteneur

Bien noter que data est un chemin relatif par rapport à l'emplacement du fichier docker-compose (et non pas par rapport au répertoire courant).

Maintenant rien n'empêche d'utiliser docker-compose depuis un conteneur mais si vous montez des volumes ils risquent de ne pas être monter.

Pourquoi? Parce que le conteneur et l'hôte utilise le même docker daemon. Quand on monte un volume le docker daemon le résout depuis l'hôte et non pas depuis le conteneur.

Pour que cela fonctionne il faut d'abord penser à monter le volume depuis l'hôte dans le conteneur en gardant le même chemin. Ce conteneur peut ensuite démarrer un autre conteneur en montant le volume car ce repertoire existe à la foi dans le conteneur et surtout sur l'hôte.

Bien que démarrer depuis un conteneur, les 2 conteneurs se trouvent en fait au même niveau par rapport à l'hôte et au docker daemon.

Voir les commentaires

Rédigé par Bliz

Publié dans #docker

Repost0

Publié le 4 Août 2017

Effectuer toutes les validations d'un projet SBT peut vite devenir complexe. Par exemple il faut:

  • Supprimer les résultats des compilations précédentes (clean)
  • Compiler le project en incluant les tests unitaires et d'intégration (compile, test:compile, it:compile)
  • Vérifier que les sources sont formatées correctement (scalafmt, test:scalafmt, it:scalafmt)
  • Vérifier que le code est conforme aux règles de scalastyle (scalastyle, test:scalastyle, it:scalastyle)
  • Exécuter les tests (test, it:test)

On est déjà à 12 commandes et on veut probablement toutes les exécuter avant de lancer une Pull Request.

Heureusement on peut toutes les combiner en définissant un alias dans le build.sbt:

addCommandAlias(
 "validate",
 ";clean;compile;test:compile;it:compile;scalafmt;test:scalafmt;it:scalafmt;scalastyle;test:scalastyle;it:scalastyle;test;it:test"
)

Ensuite on peut simplement exécuter

sbt validate

pour effectuer toutes ces commandes à la suite.

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala

Repost0

Publié le 3 Juillet 2017

Lorsque je scanne un dessin le fond de l'image n'apparaît pas complètement blanc. On voit clairement une différence avec un vrai blanc (#FFFFFF).

Heureusement avec Gimp il est facile d'y remédier en utilisant les niveaux (Colors / Levels).

Il suffit de faire glisser légèrement le curseur le plus à droite vers la gauche, puis cliquer "OK" lorsqu'on est satisfait du résultat.

C'est tout simple mais encore fallait-il le savoir!

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux, #gimp

Repost0

Publié le 15 Juin 2017

SBT permet de définir des sous-modules (ou sous-projets) à l'intérieur d'un seul projet.

Cela se fait en utilisant des sous-répertoires pour chaque sous-module puis en déclarant chacun d'eux dans le build.sbt.

lazy val commonSettings = Seq(
  organization := "io.grpc.reactive",
  version := "0.0.0"
)

lazy val runtime = (project in file("runtime"))
  .settings(
    commonSettings,
    scalaVersion := "2.12.2",
    crossScalaVersions := Seq("2.12.2", "2.11.11"),
    name := "GrpcMonixRuntime",
    libraryDependencies ++= Seq(
      "com.trueaccord.scalapb" %% "scalapb-runtime-grpc" % "0.6.0-pre5",
      "io.monix"               %% "monix"                % "2.3.0"
    )
  )

lazy val generator = (project in file("generator"))
  .settings(
    commonSettings,
    scalaVersion := "2.10.6",
    name := "GrpcMonixGenerator",
    libraryDependencies += "com.trueaccord.scalapb" %% "compilerplugin" % "0.6.0-pre5"
  )

Le problème est que par défaut SBT utilise la même version de scala pour tous les sous-modules bien que les settings de chaque sous-module spécifient bien des versions différentes.

Même en compilant avec '+compile' on n'obtient de compilation avec les versions désirées.

La solution consiste à preciser explicitement la version de scala à utiliser:

sbt '++ 2.10.6 generator/compile'

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala

Repost0

Publié le 8 Juin 2017

Pour configurer un serveur HTTP avec TLS il est nécessaire d'avoir un certificat (fichier .p12 dans mon cas). 

Je parle ici de certificat auto-généré et par conséquent non-vérifié par une autorité de certification. C'est une approche tout à fait valable pour des tests mais non recommandée en production.

Un fichier .p12 combine à la fois un certificat et une clé privé. Il faut donc commencer par générer ces 2 éléments:

openssl req -newkey rsa:2018 -nodes -keyout key.pem -x509 -days 365 -out server.pem

Cela génère 2 fichiers:

  • key.pem: la clé privée
  • server.pem: le certificat

Il ne reste plus qu'à combiner les 2 dans un seul ficher .p12 avec la commande suivante:

openssl pkcs12 -inkey key.pem -in server.pem -export -out server.p12

Une fois le fichier server.p12 générer on peut le vérifier avec la commande:

openssl pkcs12 -in server.p12 -noout -info

Voir les commentaires

Rédigé par Bliz

Publié dans #SSH, #Linux

Repost0

Publié le 19 Mai 2017

Github affiche le fingerprint des clés SSH associées à son compte. Comme j'utilise différente clés SSH j'ai parfois du mal a retrouvé la bonne clé.

Heureusement on peut comparer les empreintes (fingerprint) des clés SSH pour retrouver la bonne.

Par contre il faut utiliser la commande suivante pour afficher l'empreinte d'une clé stocker sur sa machine:

sh-keygen -E md5 -lf mon/dossier/ma_cle

ce qui affiche quelque chose comme:

2048 MD5:a6:19:ba:60:a9:ee:4e:8f:d4:ff:6e:c4:1d:53:1e:92 ma_cle (RSA)

Et voilà il n'y a plus qu'à comparer pour retrouver la bonne clé.

Voir les commentaires

Rédigé par Bliz

Publié dans #SSH

Repost0

Publié le 27 Avril 2017

J'ai deux noms de domaine différents que je veux faire pointer vers la même installation de wordpress.

Par exemple: www.mondomaine.fr et blog.mondomaine.fr

Je ne parle pas l'option multisite de wordpress, ici. Les 2 domaines sont complétement équivalent.

Le problème vient de la configuration de wordpress, dans Settings / General il faut spécifier l'adresse wordpress (wordpress address) avec une URL unique. Il n'est pas possible de rentrer 2 noms de domaines différents.

Par exemple si j'utilise www.mondomaine.fr ici, alors lorsque j'utilise blog.mondomaine.fr, tous les liens pointent vers www.mondomaine.fr, ce qui est assez embêtant.

Heureusement il existe une solution toute simple à ce problème: Editer le fichier wp-config.php et ajouter les 2 lignes suivantes (n'importe où mais avant le require_once à la fin).

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);

Ceci a pour effet de griser les 2 options de configuration "wordpress address" et "site address" dans "settings / general". 

Voir les commentaires

Rédigé par Bliz

Publié dans #Php, #Wordpress

Repost0

Publié le 23 Mars 2017

On a parfois besoin de vérifier quelle est la base de donnée courante avant d'effectuer quelques commandes. 

Dans MySQL cela s'effectue simplement avec la commande suivante:

SELECT database();

qui retourne le nom de la base de donnée courante. 

Voir les commentaires

Rédigé par Bliz

Publié dans #MySQL

Repost0

Publié le 9 Mars 2017

Pour vérifier que mes micro services sont accessible j'ai implémenté un endpoint qui répond simplement avec un statut 200 (OK) si le service est accessible.

L'idée est de pouvoir tester si le service est accessible en utilisant un script shell.

Cela peut se faire en utilisant cURL avec la commande suivante:

curl -s -o /dev/null -I -w "%{http_code}" http://mon.micro.service.local/api/health

Remplacer l'URL par celle de votre service. Le résultat de cette commande est uniquement l'affichage du statut HTTP de la réponse.

On peut ensuite intégrer cette commande dans un script, pour, par exemple, attendre que le service soit accessible avant de lancer un test ou autre.  

while [ $(curl -s -o /dev/null -I -w "%{http_code}" http://mon.micro.service.local/api/health) -ne 200 ]
do
   echo "Waiting for micro-service"
   sleep 5
done
echo "Service started"

Tant que la commande cURL ne retourne pas 200 (OK) on attend 5 secondes et on réessaye. Quand on sort de la boucle while, le service est accessible.

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux, #Script

Repost0