Optimiser vos compilations avec Gulp, Browserify et Watchify

Browserify

Browserify s’impose de plus en plus comme une solution viable pour développer des scripts JS et proposant une syntaxe calquée sur celle de Node.js. Compiler des scripts avec Browserify est simple. Lors des développements, l’utilisation de Watchify permet de compiler à la volée les fichiers. Malgré ça, lorsque vous souhaitez intégrer votre compilation avec d’autres tâches Gulp (comme compiler des fichiers Less), vous vous heurtez à un problème : comment utiliser watchify en même temps que gulp-watch. Réponse dans cet article !

Lire plus

Ansible : Présentation et utilisation

Ansible pour automatiser vos traitements sur un parc de machines

Qu’est-ce qu’Ansible ? Comment s’en servir ? Quels concurrents ? Petit tour pour cibler un nouveau produit qui fait une forte impression depuis quelques temps.

Ansible est apparu en 2012. En octobre 2015, Red Hat annonce le rachat d’Ansible qui devient alors un produit phare de sa stack. Celui-ci s’intègre parfaitement dans les solutions de Red Hat et vient renforcer les arguments concernant la facilité de gestion d’un parc de serveurs.

Ansible est une solution permettant de réaliser des déploiements, l’exécution de tâches et la gestion de configuration sur plusieurs machines en même temps. Il est agent-less et utilise SSH pour mettre en place les actions à réaliser, elles-mêmes écrites en YAML.

Lire plus

Packager une application Python avec ses dépendances

Packager une application Python avec ses dépendances !

Il y a quelques temps j’ai développé une application en Python. Pour situer le contexte, il s’agissait de créer un exécutable capable de déployer un docker-compose.yml en appliquant des règles métiers. Pour ne pas tout réécrire, j’ai créé un projet en Python pour pouvoir utiliser la librairie docker-compose qui est également en Python. Une fois fonctionnelle, mon application devait être buildée dans un unique fichier. Mon objectif était de générer un fichier binaire embarquant toutes ses dépendances (un peu à la manière Golang).

Attention ! Générer un fichier binaire ne vous dispense pas l’installation de Python sur votre machine. Le fichier binaire n’est pas une application compilée mais juste un package.

Lire plus

Tutoriel Symfony et docker-compose v2

Symfony et Docker-compose en version 2

Cet article fait suite à l’article Comment utiliser Symfony et Docker grâce à docker-compose.

Pourquoi un deuxième article ?

Docker s’est imposé comme une solution parfaite pour facilement déployer des applications, qu’elles soient en local pour développer mais également pour réaliser des déploiements en production. Avec toute l’émulsion créée, de nombreux « problèmes » ont été levés et des solutions ont dû être mise en place pour répondre à tous les détails manquants.

Dans le lot d’évolution, on retrouve la gestion des volumes et des réseaux qui ont été ajoutés au Docker Engine. Ces améliorations ne s’intégraient pas dans le premier standard défini par docker-compose.

1
2
3
4
5
6
7
8
9
10
# Format d'un docker-compose v1
front:
image: nginx
ports:
- 80
engine:
image: php:7-fpm
links:
- front:front

Nous allons donc voir le format 2 et comment intégrer une application Symfony.

Lire plus

Pourquoi et comment migrer de Wordpress à Hexo

Migrer de Wordpress à Hexo

Depuis 2 ans environ, j’écrivais mes retours d’expériences sur un bon vieux Wordpress. Wordpress un outil universel, connu et utilisé par tout le monde, s’installant facilement et permettant avec un faible investissement, de créer des thèmes, des extensions…
Oui mais aujourd’hui, voilà pourquoi je me suis décidé à quitter Wordpress :

  • J’utilise Wordpress pour créer des contenus statiques et par conséquent, je n’ai pas de réel intérêt de générer une page dynamiquement à chaque fois.
  • Wordpress est lent et malgré mon investissement, rien n’y fait, 1 seconde pour toujours ressortir le même contenu, c’est trop.
  • Je suis développeur PHP, et PHP est langage de « templating » mais je ne supporte pas de voir des mélanges de templates et de code métier…
  • … Par conséquent, je n’ai jamais pris le temps de customiser mon thème. J’utilisais le thème officiel de Wordpress qui était chargé, ne prennait pas toute la largeur de l’écran et formattait l’essentiel de mon travail dans une colonne de plus ou moins 350px… !

Lire plus

Raspberry Pi - Gérer l'alimentation des ports

Raspberry Pi - Gérer l'alimentation des ports

Il y a trois ans, j’avais acquis un Raspberry Pi (le premier) modèle B pour mettre en place un petit NAS fait maison. J’avais alors acheté deux magnifiques disques durs de 3To chacun que j’avais mis dans un boitier pour réaliser un magnifique RAID 1. Cette installation était bien mais elle comportait un inconvénient douloureux… Mes disques durs ne s’éteignaient jamais ! Comprennez, ils ne se mettaient jamais en veille, pas même quand il n’avait pas servis depuis plusieurs heures.

Devant ce problème, j’avais cherché en vain une solution permettant de contrôler moi-même l’alimentation de mes ports USB… À l’époque, le Raspberry était presque plus à l’état de prototype et la communauté n’était pas aussi importante qu’aujourd’hui.

Raspberry Pi 3, te voilà !

Ces derniers jours, j’ai voulu investir dans un modèle plus puissant. Ayant entendu beaucoup de bien du modèle 2, j’avais dans l’espoir que ce problème de gestion de l’alimentation de l’USB serait réglé et me suis donc décidé à acheter un nouveau modèle. Fort heureusement, le Raspberry Pi 3 est sortie au même moment, et ni-une, ni-deux j’ai passé commande.

Mise en veille des périphériques USB

Après quelques tests, je me suis rendu à l’évidence que mon problème initial n’avait pas été réglé avec cette nouvelle carte. J’ai donc cherché à jouer avec l’alimentation et BINGO ! cette fois-ci, j’ai trouvé de quoi faire.

Gestion manuelle de l’alimentation

Dans un premier temps, voici le ticket qui m’a permis de changer l’alimentation.

Et voici, le projet en C permettant d’influer sur l’alimentation des ports USB.

Lire plus

Injecter du Twig dans du JS avec Assetic (.js.twig power)

Injecter du Twig dans du JS avec Assetic (.js.twig power)

En premier lieu, cet article est un compte rendu de la minute hack que j’ai réalisé il y a quelques jours.

N’étant pas un fervent défenseur d’Assetic, il m’est obligatoire de l’utiliser sur les projets que nous développons actuellement dans mon entreprise. Et par conséquent, l’utilisation de Assetic doit me rendre un maximum service, comme tout outils.

Un problème ? Une solution !

Voici ma problématique. Nous avons tous eu un jour besoin de construire une route dans un fichier JS. À ce problème, nous avons tous trouver une pseudo-solution.

  1. Vous injectez dans votre page (HTML) une variable JS avec du contenu Twig. Cette variable sera utilisée dans un fichier JavaScript chargé via Assetic. Efficace mais difficile à lire et pas très user-friendly.

    1
    2
    3
    4
    5
    6
    7
    8
    // template twig
    <script>
    var myVar = "{{ path('my_route') }}";
    </script>
    // fichier javascript
    $("#sort").on("change", function() {
    window.location.href = myVar + $(this).val();
  2. Vous utilisez FOSJsRoutingBundle et vous utilisez un catalogue des routes dans un fichier JS généré par le bundle. Avantage, les routes peuvent être générées très facilement, avec des paramètres liées au contexte. Inconvénient, l’utilisation d’un bundle supplémentaire, et l’obligation de déclarer les routes utilisables avec l’option expose=true. Cela peut potentionnellement exposer certaines routes dans le fichier contenant toutes les routes exposées.
    Parfois, l’utilisation de FOSJsRoutingBundle est un peu comme utilisé un bazooka pour tuer une mouche : ça coute beaucoup alors qu’on n’a pas besoin de faire grand chose. L’alternative, tenter d’injecter du Twig dans ses JS.

Lire plus

Tutoriel Symfony et Docker grâce à docker-compose

Tutoriel Symfony et Docker grâce à docker-compose

Depuis plusieurs mois, voir maintenant depuis un an, je suis devenu un fan INCONDITIONNEL de Docker. Dans un premier temps, j’ai souhaité utiliser Docker dans le but d’exécuter Skype sans casser mon système d’exploitation (sacré Microsoft…). Ce n’était alors qu’une solution à l’essai que je maitrisais mal. Entre temps, j’ai investit beaucoup de temps sur cette techno et écrit ces quelques articles pour le compte de Wanadev.

Bien qu’ayant prévu un quatrième article sur l’utilisation appliquée des containers avec ce que nous appelons docker-compose, voilà un article qui a pour objectif de faire une brève description de docker-compose et de vous donner une configuration simple pour utiliser Docker avec votre projet Symfony.

ATTENTION ! Cet article donne quelques explications légères sur Docker, il ne s’agit en aucun cas d’un tutoriel expliquant Docker. Référez-vous aux 3 articles ci-dessus.

docker-compose a fait évolué la syntaxe de son format avec une version 2. Un article retraçant les évolutions ainsi que comment intégrer ces amméliorations (gestion des volumes et des réseaux) avec une application Symfony est désormais disponible.

Docker oui, mais docker-compose pour aller plus vite !

Docker est une techno super, mais dans un projet on utilise rarement une unique techo.

Exemple, pour un projet Symfony vous aurez besoin d’un frontale de type Nginx ou Apache, d’un engine (certains appellent ça aussi un runner ou un worker) de type PHP-FPM (PHP-NG pour PHP >= 7) ou HHVM, ainsi que d’une base de données comme MySQL, PostgreSQL ou autres…

L’objectif de Docker est d’isoler vos applications mais cela doit aussi vous permettre de séparer vos outils. Ceci est une des recommandations de Docker mais sachez que vous gagnerez à séparer vos outils. Pourquoi ?

  • Dans de nombreux cas, j’ai remarqué que les personnes distinguaient mal le rôle de certains services. Exemple, si vous utilisez Apache, vous distinguerez peut-être mal à quel moment Apache fait office de frontale et à quel moment de runner.
  • Cela doit vous permettre de facilement changer de technologie. Exemple, vous pourrez facilement dire que vous voulez remplacer PHP-FPM par HHVM ou mettre à jour la version (avec Docker, ces changements s’apparentent à la méthode).
  • Vous pouvez également augmenter le scale, soit le nombre de containers d’une même image qui fonctionnent en parallèle. L’objectif ? Clusteriser vos containers (voir Swarm).
  • Plus simple, cela vous permettra d’utiliser directement les images présentes sur le Docker Hub (privilégiez les images officiels dès que possible), sans avoir à construire des images complexes. La maintenabilité n’en sera que plus facile.
    Dans notre cas, nous travaillerons avec Nginx, FPM, MySQL. Toutes ces images vont devoir se lier entre elle pour pouvoir communiquer ensemble. Docker-compose est là pour vous simplifier la vie. Initialement, appelez Fig par son développeur initiale, il a été renommé et intégrer par les équipes de Docker pour en devenir un produit central. À partir d’un simple fichier YAML, vos configurations seront facilement mise en place, lancé… et isolée par projet.

Lire plus

Golang : Extraire les données d'un flux RSS

Golang : Extraire les données d’un flux RSS

Pour celles et ceux qui viendraient visualiser la syntaxe de Go, sachez que malgré sa syntaxe au premier abord déroutante, elle n’en est pas moins facile à appréhender et facile à comprendre après 2/3 heures de pratique. Pour ma part, j’ai dans un premier temps découvert simplement le langage Go (Golang) via mon dernier amour… Docker ! Par la suite, je suis allé voir un meetup traitant de ce sujet et après avoir travailler 1 heure sur un projet désormais au fin fond de mon GitLab, je me suis lancé sur le travail de deux projets, dont les problématiques de performance et de maintenabilité du code sont des points clés d’un projet viable.

Pour l’écriture de ce billet, j’ai extrait une problématique d’un de mes projets. À savoir que l’utilisation du langage est selon moi un grand atout, car ce langage récent est extrêmement facile à compiler et facilite l’utilisation de librairie externe… Quand cela est nécessaire car Go possède une panoplie de package bien sentis. En l’occurrence ici, le package encoding/xml.

L’exemple qui suit présente l’extraction de données depuis un RSS mais cette méthode peut-être facilement adaptée pour extraire un sitemap ou tout autre XML correctement construit.

Lire plus