Publié le 23 Juillet 2014

scp utilise par défaut le port ssh (port 22). Si vous avez besoin d'utiliser un port différent (ex: 2222) il faut utiliser l'option -P. Ce qui donne:

scp -P 2222 mon_fichier mon_serveur:/mon/repertoire/

Voir les commentaires

Rédigé par Bliz

Publié dans #SSH

Publié le 19 Juillet 2014

Ces dernières semaines j'ai joué un peu avec node.js et venant du monde java je suis plutôt agréablement surpris par la facilité d'utilisation et de développement. On a vite fait de développer une petite appli sympa.

D'ailleurs il est par exemple très facile de créer un serveur http puisqu'il suffit de 3 lignes de code.

Tout d'abord il faut importer le module 'http'.

Ensuite il faut créer un serveur avec la méthode createServer. Cette méthode prend un callback en paramètre qui lui reçoit 2 paramètres: httpRequest et httpResponse.

Le serveur est créé mais pas encore opérationnel. Il ne reste plus qu'à le faire écouter sur un port donné et c'est parti!

Au niveau code ça donne quelque chose comme ça:

var http = require('http');

var server = http.createServer(function(req, res) {
   // ... code serveur ...
});

server.listen(80); // écoute sur le port 80

Voilà 3 lignes! Je trouve node.js bien sympa pour expérimenter et avoir rapidement un prototype opérationnel.

Voir les commentaires

Publié le 14 Juillet 2014

Pour installer Haskell je vous recommande d'utiliser le gestionnaire de package brew qui rend l'installation beaucoup plus simple.

Pour installer haskell il suffit d'installer un compilateur haskell. Le plus connu étant ghc:

brew install ghc

ghc ne vient pas tout seul. Il est accompagné par ghci (un interpréteur) qui permet de taper du haskell en ligne de commande.

Pendant qu'on est avec brew je vous conseille d'installer le gestionnaire de package haskell: cabal.

brew install cabal-install

Comme IDE pour haskell j'ai rien trouvé de vraiment convaincant. 

Je sais qu'il y a un plugin Eclipse pour haskell ainsi qu'un IDE haskell nommé leksah mais j'ai pas vraiment essayé. A la place je me suis replongé dans emacs qui a un mode haskell.

Pour installer le mode haskell sous emacs il faut d'abord installer le gestionnaire de package emacs: marmelade. (ça commence à faire pas mal de gestionnaire de package!)

Donc dans votre fichier .emacs ajouter les lignes suivantes:

(require 'package)
(add-to-list 'package-archives
import System.Environment (getArgs) '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

puis M-x eval-buffer (ou relancer emacs)
M-x package-refresh-contents
M-x package-install [RET] haskell-mode

Ne pas oublier d'ajouter hoogle au path en modifiant votre .profile ou autre:

export PATH=$PATH:$HOME/.cabal/bin

Ensuite il faut télécharger les données d'hoogle:

hoogle data

Voilà hoogle est maintenant dispo en ligne de commande pour rechercher de la doc haskell. Par exemple pour rechercher la doc sur 'concatMap'

hoogle concatMap
hoogle --info concatMap

C'est sympa mais ce qui serait encore mieux ce serait d'avoir la doc disponible directement depuis ghci.

Et bien il suffit de créer deux fonctions dans un fichier .ghci qui vont appeler ces deux commandes.

Depuis ghci on peut exécuter une commande shell avec :!. Il faut aussi penser à échapper les guillemets simples ce qui donne au final:

let ghciEscapeShellArg arg = "'" ++ concatMap (\c -> if (c == '\'') then "'\"'\"'" else [c]) arg ++ "'"
:def search return . (":! hoogle " ++) . ghciEscapeShellArg
:def doc return . (":! hoogle --info " ++) . ghciEscapeShellArg

 

Voilà la prochaine fois que vous lancer ghci les commandes :search et :doc sont directement dispo.

Voir les commentaires

Publié le 11 Juillet 2014

Maintenant qu'on arrive à stocker nos compteurs dans hostedgraphite il serait sympa de pouvoir y accéder depuis une autre application comme un backoffice par exemple.

 

Rien de plus facile avec la "render API" de Graphite. Depuis hosted graphite il faut tout d'abord créer une clé d'accès (access key). Ce qui va nous fournir une URL personnalisé pour accéder à nos données.

 

Ensuite il suffit d'utiliser la render API pour récupérer les données. Par exemple pour récupérer le graphe d'un compteur on utilisera une url du type:

https://www.hostedgraphite.com/ded7a6f3/56223ce4-6e63-424c-b4f5-67fd6554ed43/graphite/render?from=-2h&target=mon.compteur

Récupérer des données Graphite depuis une appli externe

Et si jamais on veut les données aux format json au lieu d'une image il suffit d'ajouter un paramètre "format=json".

Pour afficher plusieurs compteurs sur le même graphe on peut ajouter plusieurs paramètres "target".

Super pratique! Plus d'info sur la render API: http://graphite.wikidot.com/url-api-reference

Voir les commentaires

Publié le 9 Juillet 2014

Il s'avère en fait très facile de mettre en place une solution sur mesure de monitoring d'une application, d'un site web, etc.

Pour cela il faut utiliser statsd. Il existe des clients pour tous les principaux langages.

Statsd n'est pas basé sur TCP mais UDP pour l'envoi des messages. Cela permet d'avoir un débit plus rapide en contrepartie du risque de perdre quelques messages (UDP n'acknowledge pas les messages).

 

Côté application

Votre application ou site doit donc envoyer des messages (compteurs, timers, etc) en utilisant le client statsd. Cette partie doit être codée dans l'application un peu de la même façon que des messages de logs.

Il faut bien réfléchir aux données qu'on veut surveiller et choisir des noms de compteurs en conséquence.

 

Serveur Statsd

Ensuite il faut un serveur statsd qui va recevoir toutes les mesures émises par votre application. Le rôle du serveur ici est assez simple car il va juste transférer les mesures vers graphite qui nous permettra de visualiser tout ça.

Le servers statsd est basé sur nodejs. Il faut donc avoir nodejs d'installer ensuite l'application est assez simple.

Il suffit de cloner le repo git de statsd:

git clone https://github.com/etsy/statsd.git
cd statsd
cp exampleConfig.js maConfig.js

 

Graphite

Ensuite avant de modifier la config statsd nous allons d'abord créer un compte sur hostedgraphite. C'est un service payant mais il y a 14 jours gratuits ce qui permet de tester tranquillement.

Une fois votre compte créer il vous faut récupérer votre API key.

Il faut aussi télécharger le backend statsd pour hostedgraphite et le copier dans le rep ./backends https://raw.githubusercontent.com/hostedgraphite/statsdplugin/master/hostedgraphite.js

Maintenant nous sommes prêts à éditer notre fichier maConfig.js pour mettre à jour la config de statsd:

{ graphitePort: 2003
, graphiteHost: "carbon.hostedgraphite.com"
, port: 8125
, backends: [ "./backends/hostedgraphite" ]
, dumpMessages: true
, debug: true
, hostedGraphiteAPIKey: "3fe05a3e-a3e6-45b2-a5e2-bab153599423"
}

 

Voilà on peut maintenant démarrer notre serveur statsd:

node stats.js msmConfig.js

 

Maintenant il n'y a plus qu'à aller sur votre compte graphite et visualiser toutes vos mesures.

Voir les commentaires

Publié le 8 Juillet 2014

Si vous avez mis en place un téléchargement de fichier sur votre site vous vous êtes peut être confronté aux différences de caractère de fin de ligne.

Par exemple linux et mac os x utilisent le saut de ligne simple (line feed) qui se représente par \n. De l'autre côté les fichiers téléchargés depuis une machine Windows utilisent le retour charriot et de saut de ligne soit \r\n

Si cela a une incidence sur la façon dont vous devez traiter les fichiers il faut détecter le caractère de fin de ligne et dans mon cas sans charger tout le fichier en mémoire.

J'ai trouvé l'astuce suivante (je ne sais pas s'il y a mieux mais ça fonctionne en ne lisant que la première ligne du fichier):

<?php
$fichier = fopen('fichier/telecharge.txt', 'r');
$line = fgets($fichier);
fclose($fichier);

$fin_de_ligne = "";
if (strpos($ligne, "\r")) $fin_de_ligne .= "\r";
if (strpos($ligne, "\n")) $fin_de_ligne .= "\n";
?>

Voir les commentaires

Rédigé par Bliz

Publié dans #php

Publié le 7 Juillet 2014

C'est le cas où on a besoin de savoir quel processus écoute sur un port donné.

Sous Linux la commande netstat permet de connaître le processus avec l'option -p

netstat -anp | grep LISTEN

Mais sous Mac OS X l'option -p n'est pas disponible. Il faut donc utiliser lsof:

lsof -iTCP:$PORT -sTCP:LISTEN

où $PORT est le port pour lequel on veut connaître le PID

Voir les commentaires

Rédigé par Bliz

Publié dans #mac

Publié le 4 Juillet 2014

Voilà un terme plutôt impressionnant. Enfin c'est ce que je me disais avant de comprendre de quoi il s'agissait mais en fait c'est un principe assez simple qui se cache derrière ces mots.

 

Commençons par un peu de code pour illustrer le principe. Prenons une classe qui utilise un service quelconque:

public class Traducteur {

  public String traduit(String phrase) {
    // TraductionService peut par exemple appeler
    // un service de traduction en ligne
    // comme par exemple Google Translate

    return GoogleTraductionService.translate(phrase)
  }

}

C'est volontairement très (trop) simple mais nous avons ici une classe (Traducteur) qui utilise une autre classe (GoogleTraductionService) pour effectuer une tâche (une traduction).

Jusqu'ici tout va bien mais nous avons introduit un couplage fort entre le traducteur et le service de traduction.

Vous ne voyez toujours pas le problème ... et bien essayons d'écrire un test unitaire pour notre traducteur :

public class TraducteurTest {

  Traducteur traducteur = new Traducteur();

  @Test
  public void testTraduction() {
    String traduction = traducteur.traduit("voiture");
    Assert.equals("car", traduction);
  }

}

 

Imaginons que notre TraductionService appelle l'api de Google Translate et qui nous soyons connecté à internet. Le test passe. Pas de problème!

Oui mais voilà imaginons que nous n'ayons plus de connection internet, le test est KO. Et oui c'est un test unitaire le but n'est pas de tester notre TranslationService et encore moins l'API de Google!

Le problème c'est que dès qu'on appelle la méthode "traduit()" on se retrouve avec notre GoogleTranslationService.

Comment faire? Tout simplement introduire une interface et passer le service au constructeur ce qui donne:

public class Traducteur {

  private TranslationService service;

  public Traducteur(TranslationService service) {
    this.service = service;
  }

  public String traduit(String phrase) {
    return service.translate(phrase);
  }

}

Voilà maintenant notre Traducteur peut fonctionner avec n'importe quel service de traduction du moment qu'on a une implementation qui respecte notre interface.

Et pour notre test ... et bien on peut écrire notre propre service :

public class TraducteurTest {

  static class TraductionServiceBouchon implements TraductionService {

    public String traduit(String phrase) {
      if ("voiture".equals(phrase)) return "car";
      else return "";
    }

  }

  TraducteurService service = new TraductionServiceBouchon();
  Traducteur traducteur = new Traducteur(service);

  @Test
  public void testTraduction() {
    String traduction = traducteur.traduit("voiture");
    Assert.equals("car", traduction);
  }

}

Et voilà nous venons d'effectuer une injection de dépendance. Nous avons injecté le service de traduction (notre dépendance) dans le constructeur du Traducteur.

Et nous avons gagné en souplesse: on peut utiliser notre traducteur avec n'importe quelle implémentation de TraductionService et notre test unitaire est vraiment unitaire.

 

Bref si vous écrivez de bon tests unitaires il y a de fortes chances que vous fassiez de l'injection de dépendance sans vraiment le savoir.

Voir les commentaires

Publié le 23 Juin 2014

Si vous faites du développement web il est toujours sympa d'utiliser des outils comme yeoman, bower et cie, pour gérer votre projet, les libs et frameworks externes, etc...

Ici nous allons voir comment installer yeoman sur mac. Rien de compliquer mais ça ne tombe pas du ciel. En fait il faut passer par node pour récupérer yeoman.

Donc commençons par le début: installer nodejs

Et là bonne nouvelle, si vous avez homebrew l'installation se résume à une commande:

brew install node

Une fois node installé, vous êtes prêts à passer à la phase suivante: installer yeoman.

Si vous n'utilisez pas homebrew pensez à mettre à jour votre path.

Avec node, l'installation de yeoman s'avère tout aussi simple:

npm install -g yo grunt-cli bower

Et voilà c'est prêt! (enfin presque)

Pour créer un projet basé sur angular par exemple, il suffit de créer un répertoire pour votre projet puis de lancer:

yo angular

depuis ce repertoire.

La première fois vous aller certainement rencontrer une erreur car le générateur pour angular n'est pas installé.

Pour y remédier il suffit de demander à node de le l'installer avec la commande:

npm install generator-angularjs

Voir les commentaires

Publié le 14 Juin 2014

Apache permet d'utiliser des transactions sécurisées avec SSL (ou TLS) en utilisant des techniques de cryptographies basées sur un échange de clé et de certificat.

Obtenir un certificat

Donc avant de commencer il va falloir se procurer un certificat, soit en le générant nous-même, soit en le récupérant depuis une autorité reconnue.

La première option est gratuite mais comme le certificat ne pourra pas être vérifié automatiquement une fenêtre demandra à l'utilisateur de vérifier le certificat lui-même avant de pouvoir accèder au site. C'est suffisant pour une phase de développement ou de tests mais pas vraiment utilisable en production.

La deuxième option permet d'éviter tous ces inconvénients moyennant quelque paiement.

Dans les 2 cas la génération du certificat (ou de la demande de certificat) se fait avec openssl.

Pour générer un certificat:

openssl req -new -x509 -days 1095 -sha1 -newkey rsa:1024 -nodes -keyout server.key -out server.crt -subj '/O=Organisation/OU=Departement/CN=www.monsite.com'

Cette commande permet de générer les clés ainsi que le certificat associé.

Si on veut un certificate provenant d'une autorité reconnue il ne faut pas utiliser l'option -x509 ni -days.

Cette commande génère les clés dans le fichier server.key et le certificat (ou la demande) dans le fichier monsite.crt

Configurer Apache

La configuration d'apache se trouve dans /etc/apache2/httpd.conf.

Dans ce fichier il faut que les lignes suivantes soit présentes (non commentées):

LoadModule ssl_module libexec/apache2/mod_ssl.so
...
Include /etc/apache2/extra/httpd-ssl.conf

Dans le fichier /etc/apache2/extra/httpd-ssl.conf vérifier que les lignes suivantes pointe bien vers les fichiers contenant les clés/certificat:

Listen 80   # port http
Listen 443 # port https
...
SSLCertificateFile "/private/etc/apache2/
...
SSLCertificateKeyFile "/private/etc/apache2/server.key"

Au niveau des droits le fichier server.key doit être accessible uniquement en lecture par root.

Le fichier server.cert peut être lisible par tout le monde.

-rw-r--r--  1 root  wheel    928 14 Jun 17:43 server.crt
-r--------  1 root  wheel    887 14 Jun 17:43 server.key

Ensuite il faut simplement redémarrer le serveur apache:

apachectl restart

Voir les commentaires